@anemona/aif-tailwind 0.0.2 → 0.0.4

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 +1 @@
1
- import*as i0 from"@angular/core";import{Pipe,signal,computed,Injectable,input,effect,Component,output,viewChild,HostListener,inject,DestroyRef,afterRenderEffect,ViewContainerRef,Injector,ChangeDetectionStrategy,ViewEncapsulation,ChangeDetectorRef,ViewChild,untracked,viewChildren,NO_ERRORS_SCHEMA}from"@angular/core";import*as i1 from"@angular/platform-browser";import{DomSanitizer}from"@angular/platform-browser";import{local_set,local_get,cookies_state,lang_subscribe,cookies_state_subscribe,unsubscribe,cookies_accept_set,cookies_reject_set,lang,rq_get,wHttp,str_replace_vars,env,loading_subscribe,obj_compact,field_evaluate,lang_set,navigate,obj_empty,format_title_html,format_zero,AifSafeUrlPipe,rq_req,str_to_normalize,str_replace_field,loading,date_compare,date_local,storage,obj_val_text_cat,date_now,date_time,lang_load,fx_resolve,wGet,loading_close,obj_fields_join,rq_sanitize_method,json_hierarchy_val,section}from"@anemona/aif-core";import*as i1$1 from"@angular/router";import{RouterLink,RouterModule,Router,NavigationEnd}from"@angular/router";import{NgClass,NgStyle,NgTemplateOutlet,CommonModule,DatePipe,CurrencyPipe,DecimalPipe}from"@angular/common";import*as i1$2 from"@angular/forms";import{FormsModule,ReactiveFormsModule,Validators,FormControl,FormBuilder}from"@angular/forms";import{filter}from"rxjs/operators";import{tns}from"tiny-slider";import{register}from"swiper/element/bundle";import Swiper from"swiper";import*as i2 from"@ng-select/ng-select";import{NgSelectModule}from"@ng-select/ng-select";import{msg}from"@anemona/aif-message";class AifSafeHtmlPipe{sanitizer;constructor(e){this.sanitizer=e}transform(e){return this.sanitizer.bypassSecurityTrustHtml(e)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSafeHtmlPipe,deps:[{token:i1.DomSanitizer}],target:i0.ɵɵFactoryTarget.Pipe});static"ɵpipe"=i0.ɵɵngDeclarePipe({minVersion:"14.0.0",version:"21.1.1",ngImport:i0,type:AifSafeHtmlPipe,isStandalone:!0,name:"aifSafeHtml"})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSafeHtmlPipe,decorators:[{type:Pipe,args:[{name:"aifSafeHtml"}]}],ctorParameters:()=>[{type:i1.DomSanitizer}]});class AifSideBarService{isExpanded=signal(!0,...ngDevMode?[{debugName:"isExpanded"}]:[]);isMobileOpen=signal(!1,...ngDevMode?[{debugName:"isMobileOpen"}]:[]);isHovered=signal(!1,...ngDevMode?[{debugName:"isHovered"}]:[]);isWide=computed(()=>this.isExpanded()||this.isHovered(),...ngDevMode?[{debugName:"isWide"}]:[]);setExpanded(e){this.isExpanded.set(e)}toggleExpanded(){this.isExpanded.update(e=>!e)}setMobileOpen(e=!1){this.isMobileOpen.set(e)}toggleMobileOpen(){this.isMobileOpen.update(e=>!e)}setHovered(e=!1){this.isHovered.set(e)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSideBarService,deps:[],target:i0.ɵɵFactoryTarget.Injectable});static"ɵprov"=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSideBarService,providedIn:"root"})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSideBarService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}]});const AIF_THEME="aif-theme",AIF_THEME_DARK="dark",AIF_THEME_LIGHT="light";class AifThemeService{theme=signal(this.getInitialTheme(),...ngDevMode?[{debugName:"theme"}]:[]);isDark=computed(()=>"dark"===this.theme(),...ngDevMode?[{debugName:"isDark"}]:[]);isLight=computed(()=>"light"===this.theme(),...ngDevMode?[{debugName:"isLight"}]:[]);constructor(){this.init()}init(){this.apply(this.getInitialTheme())}toggle(){this.set("light"===this.theme()?"dark":"light")}set(e){this.theme.set(e),local_set(AIF_THEME,e),this.apply(e)}apply(e){const t="dark"===e;document.documentElement.classList.toggle("dark",t),document.body.classList.toggle("dark:bg-gray-900",t)}getInitialTheme(){const e=local_get(AIF_THEME);return"dark"===e||"light"===e?e:"light"}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeService,deps:[],target:i0.ɵɵFactoryTarget.Injectable});static"ɵprov"=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeService,providedIn:"root"})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}],ctorParameters:()=>[]});class AifCookies{config=input({},...ngDevMode?[{debugName:"config"}]:[]);active=signal(cookies_state(),...ngDevMode?[{debugName:"active"}]:[]);cfg=signal(void 0,...ngDevMode?[{debugName:"cfg"}]:[]);title=computed(()=>this.cfg()?.title||"",...ngDevMode?[{debugName:"title"}]:[]);description=computed(()=>this.cfg()?.description||"",...ngDevMode?[{debugName:"description"}]:[]);policy=computed(()=>this.cfg()?.policy||{label:"",link:""},...ngDevMode?[{debugName:"policy"}]:[]);accept=computed(()=>this.cfg()?.accept||"",...ngDevMode?[{debugName:"accept"}]:[]);reject=computed(()=>this.cfg()?.reject||"",...ngDevMode?[{debugName:"reject"}]:[]);_sub_ang;_sub_cookie;constructor(){effect(()=>{const e=this.config();this.cfg.set(AifCookies.config(e||{}))})}ngOnInit(){this._sub_ang=lang_subscribe("change",()=>{this.cfg.set(AifCookies.config(this.config()||{}))}),this._sub_cookie=cookies_state_subscribe(e=>{this.active.set(e)})}ngOnDestroy(){unsubscribe(this._sub_ang),unsubscribe(this._sub_cookie)}acceptCookies(){this.active.set(cookies_accept_set())}rejectCookies(){this.active.set(cookies_reject_set())}build(e){const t=AifCookies.config(e);this.cfg.set(t)}static config(e){return{title:lang("cookies-title"),description:lang("cookies-description"),policy:{label:lang("cookies-policy"),link:"/cookies"},accept:lang("cookies-accept"),reject:lang("cookies-reject"),...e}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifCookies,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifCookies,isStandalone:!0,selector:"aif-cookies",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (active()===0 && cfg()) {\n<div\n class="cookie-popup fixed max-w-lg bottom-3 end-3 start-3 sm:start-0 mx-auto bg-white dark:bg-slate-900 shadow-sm dark:shadow-gray-800 rounded-md py-5 px-6 z-50">\n <p class="text-slate-400">{{ description()}} <a [routerLink]="policy().link" target="_blank"\n class="text-emerald-600 dark:text-emerald-500 font-semibold">{{ policy().label }}</a></p>\n <div class="cookie-popup-actions text-end mt-3 flex gap-3 justify-end">\n\n <button (click)="rejectCookies()"\n class="px-4 py-2 text-sm font-semibold text-slate-600 dark:text-slate-300 border border-slate-300 dark:border-slate-600 rounded-md hover:bg-slate-300 dark:hover:bg-slate-800 transition-colors">\n {{ reject() }}\n </button>\n\n <button (click)="acceptCookies()"\n class="px-4 py-2 text-sm font-semibold text-white bg-emerald-600 rounded-md hover:bg-emerald-700 transition-colors shadow-sm">\n {{ accept() }}\n </button>\n </div>\n</div>\n}',styles:[""],dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifCookies,decorators:[{type:Component,args:[{selector:"aif-cookies",standalone:!0,imports:[RouterLink],template:'@if (active()===0 && cfg()) {\n<div\n class="cookie-popup fixed max-w-lg bottom-3 end-3 start-3 sm:start-0 mx-auto bg-white dark:bg-slate-900 shadow-sm dark:shadow-gray-800 rounded-md py-5 px-6 z-50">\n <p class="text-slate-400">{{ description()}} <a [routerLink]="policy().link" target="_blank"\n class="text-emerald-600 dark:text-emerald-500 font-semibold">{{ policy().label }}</a></p>\n <div class="cookie-popup-actions text-end mt-3 flex gap-3 justify-end">\n\n <button (click)="rejectCookies()"\n class="px-4 py-2 text-sm font-semibold text-slate-600 dark:text-slate-300 border border-slate-300 dark:border-slate-600 rounded-md hover:bg-slate-300 dark:hover:bg-slate-800 transition-colors">\n {{ reject() }}\n </button>\n\n <button (click)="acceptCookies()"\n class="px-4 py-2 text-sm font-semibold text-white bg-emerald-600 rounded-md hover:bg-emerald-700 transition-colors shadow-sm">\n {{ accept() }}\n </button>\n </div>\n</div>\n}'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifDropDown{isOpen=input(!1,...ngDevMode?[{debugName:"isOpen"}]:[]);className=input("",...ngDevMode?[{debugName:"className"}]:[]);close=output();dropdownRef=viewChild("dropdownRef",...ngDevMode?[{debugName:"dropdownRef"}]:[]);isVisible=computed(()=>this.isOpen(),...ngDevMode?[{debugName:"isVisible"}]:[]);panelClass=computed(()=>["absolute z-40 right-0 mt-2 rounded-xl border border-gray-200 bg-white shadow-theme-lg dark:border-gray-800 dark:bg-gray-dark",this.className()].filter(Boolean).join(" "),...ngDevMode?[{debugName:"panelClass"}]:[]);onDocumentMouseDown(e){if(!this.isVisible())return;const t=this.dropdownRef()?.nativeElement,n=e.target;t&&n&&(t.contains(n)||n.closest(".dropdown-toggle")||this.close.emit())}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifDropDown,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifDropDown,isStandalone:!0,selector:"aif-dropdown",inputs:{isOpen:{classPropertyName:"isOpen",publicName:"isOpen",isSignal:!0,isRequired:!1,transformFunction:null},className:{classPropertyName:"className",publicName:"className",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{close:"close"},host:{listeners:{"document:mousedown":"onDocumentMouseDown($event)"}},viewQueries:[{propertyName:"dropdownRef",first:!0,predicate:["dropdownRef"],descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (isVisible()) {\n<div #dropdownRef\n [class]="panelClass()">\n <ng-content></ng-content>\n</div>\n}\n',styles:[""]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifDropDown,decorators:[{type:Component,args:[{selector:"aif-dropdown",standalone:!0,template:'@if (isVisible()) {\n<div #dropdownRef\n [class]="panelClass()">\n <ng-content></ng-content>\n</div>\n}\n'}]}],propDecorators:{isOpen:[{type:i0.Input,args:[{isSignal:!0,alias:"isOpen",required:!1}]}],className:[{type:i0.Input,args:[{isSignal:!0,alias:"className",required:!1}]}],close:[{type:i0.Output,args:["close"]}],dropdownRef:[{type:i0.ViewChild,args:["dropdownRef",{isSignal:!0}]}],onDocumentMouseDown:[{type:HostListener,args:["document:mousedown",["$event"]]}]}});class AifDropDownItem{to=input("",...ngDevMode?[{debugName:"to"}]:[]);baseClassName=input("block w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900",...ngDevMode?[{debugName:"baseClassName"}]:[]);className=input("",...ngDevMode?[{debugName:"className"}]:[]);itemClick=output();click=output();combinedClasses=computed(()=>[this.baseClassName(),this.className()].filter(Boolean).join(" ").trim(),...ngDevMode?[{debugName:"combinedClasses"}]:[]);handleClick(){this.click.emit(),this.itemClick.emit()}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifDropDownItem,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifDropDownItem,isStandalone:!0,selector:"aif-dropdown-item",inputs:{to:{classPropertyName:"to",publicName:"to",isSignal:!0,isRequired:!1,transformFunction:null},baseClassName:{classPropertyName:"baseClassName",publicName:"baseClassName",isSignal:!0,isRequired:!1,transformFunction:null},className:{classPropertyName:"className",publicName:"className",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{itemClick:"itemClick",click:"click"},ngImport:i0,template:'\n <a [routerLink]="to()" [class]="combinedClasses()" (click)="handleClick()">\n <ng-content></ng-content>\n </a>\n ',isInline:!0,dependencies:[{kind:"ngmodule",type:RouterModule},{kind:"directive",type:i1$1.RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifDropDownItem,decorators:[{type:Component,args:[{selector:"aif-dropdown-item",standalone:!0,imports:[RouterModule],template:'\n <a [routerLink]="to()" [class]="combinedClasses()" (click)="handleClick()">\n <ng-content></ng-content>\n </a>\n '}]}],propDecorators:{to:[{type:i0.Input,args:[{isSignal:!0,alias:"to",required:!1}]}],baseClassName:[{type:i0.Input,args:[{isSignal:!0,alias:"baseClassName",required:!1}]}],className:[{type:i0.Input,args:[{isSignal:!0,alias:"className",required:!1}]}],itemClick:[{type:i0.Output,args:["itemClick"]}],click:[{type:i0.Output,args:["click"]}]}});class AifFrontFooter{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);date=signal((new Date).getFullYear(),...ngDevMode?[{debugName:"date"}]:[]);text=signal(null,...ngDevMode?[{debugName:"text"}]:[]);social=signal([],...ngDevMode?[{debugName:"social"}]:[]);cfg=signal(null,...ngDevMode?[{debugName:"cfg"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);isLoading=signal(!1,...ngDevMode?[{debugName:"isLoading"}]:[]);isLoaded=signal(!1,...ngDevMode?[{debugName:"isLoaded"}]:[]);_subscribe;pendingBuildPromise=null;resolveBuildPromise=null;rejectBuildPromise=null;state=computed(()=>{const e=this.cfg(),t=this.config();return e?{...t??{},...e}:t??{}},...ngDevMode?[{debugName:"state"}]:[]);currentLang=computed(()=>this.state().lang||lang(),...ngDevMode?[{debugName:"currentLang"}]:[]);wrapperClass=computed(()=>this.state().class??"",...ngDevMode?[{debugName:"wrapperClass"}]:[]);logo=computed(()=>({src:this.state().logo?.src||"assets/images/logo/logo-light.png",alt:this.state().logo?.alt||"Logo",route:this.state().logo?.route||"/"}),...ngDevMode?[{debugName:"logo"}]:[]);constructor(){effect(()=>{const e=this.config();e&&0!==Object.keys(e).length&&(this.isBuilt()||this.build(e).catch(()=>null))})}ngOnInit(){this._subscribe=lang_subscribe("change",()=>{(this.state().watchLang||void 0===this.state().watchLang)&&this.isBuilt()&&this.reBuild(this.state()).catch(()=>null)})}ngOnDestroy(){this._subscribe?.unsubscribe?.()}build(e=null){return this.isBuilt()||(this.isBuilt.set(!0),this.cfg.set(e),this.createBuildPromise(),this.loadData()),this.whenLoaded()}reBuild(e=null){return this.reset(),this.build(e)}reset(){this.isBuilt.set(!1),this.isLoading.set(!1),this.isLoaded.set(!1),this.cfg.set(null),this.text.set(null),this.social.set([]),this.pendingBuildPromise=null,this.resolveBuildPromise=null,this.rejectBuildPromise=null}whenLoaded(){return this.isLoaded()?Promise.resolve(this.makeLoadedEvent()):(this.pendingBuildPromise||this.createBuildPromise(),this.pendingBuildPromise)}loadData(){const e=this.state(),t=this.currentLang(),n=this.resolveResource(e.resource,t),i=this.resolveResource(e.socialResource,t),a=n.includes(".json")||n.startsWith("assets/")||n.startsWith("./")||n.startsWith("../")||n.startsWith("http");if(this.isLoading.set(!0),this.isLoaded.set(!1),e.data||e.social)return this.text.set(e.data||null),this.social.set(Array.isArray(e.social)?e.social:[]),this.isLoading.set(!1),this.isLoaded.set(!0),void this.completeBuild();if(n&&!a)return void rq_get(n).then(e=>{const t=e?.data||e||{};this.text.set(t.footer||null),this.social.set(Array.isArray(t.social)?t.social:[]),this.isLoading.set(!1),this.isLoaded.set(!0),this.completeBuild()}).catch(e=>{this.handleLoadError(e)});const s=n?wHttp(n):Promise.resolve(null),o=i?wHttp(i):Promise.resolve([]);Promise.all([s,o]).then(([e,t])=>{this.text.set(e||null),this.social.set(Array.isArray(t)?t:[]),this.isLoading.set(!1),this.isLoaded.set(!0),this.completeBuild()}).catch(e=>{this.handleLoadError(e)})}resolveResource(e,t){return e?str_replace_vars(e,{lang:t}):""}createBuildPromise(){this.pendingBuildPromise=new Promise((e,t)=>{this.resolveBuildPromise=e,this.rejectBuildPromise=t})}completeBuild(){const e=this.makeLoadedEvent();this.resolveBuildPromise&&(this.resolveBuildPromise(e),this.resolveBuildPromise=null,this.rejectBuildPromise=null,this.pendingBuildPromise=Promise.resolve(e))}handleLoadError(e){this.isLoading.set(!1),this.isLoaded.set(!1),this.text.set(null),this.social.set([]),this.rejectBuildPromise&&(this.rejectBuildPromise(e),this.pendingBuildPromise=null,this.resolveBuildPromise=null,this.rejectBuildPromise=null)}makeLoadedEvent(){return{lang:this.currentLang(),resource:this.resolveResource(this.state().resource,this.currentLang())||void 0,socialResource:this.resolveResource(this.state().socialResource,this.currentLang())||void 0}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFrontFooter,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFrontFooter,isStandalone:!0,selector:"aif-front-footer",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (text(); as footer) {\n<footer class="relative bg-slate-900 text-gray-200 dark:bg-slate-800 dark:text-gray-200" [class]="wrapperClass()">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n <div class="grid grid-cols-12">\n <div class="col-span-12">\n <div class="py-[60px] px-0">\n <div class="grid md:grid-cols-12 grid-cols-1 gap-[30px]">\n\n \x3c!-- COL 1: Logo + descripción --\x3e\n <div class="lg:col-span-4 md:col-span-12">\n <a [routerLink]="logo().route || \'/\'" class="text-[22px] focus:outline-none">\n <img [src]="logo().src" [alt]="logo().alt || \'Logo\'">\n </a>\n\n <p class="mt-6 text-gray-300">\n {{footer.description}}\n </p>\n\n <ul class="list-none mt-6">\n @for (item of social(); track $index) {\n <li class="inline mx-0.5">\n <a href="{{item.url}}" target="_blank"\n class="size-8 inline-flex items-center justify-center border border-gray-800 text-gray-400 hover:text-white hover:border-primary hover:bg-primary rounded-md duration-500">\n <i class="{{item.icon}}"></i>\n </a>\n </li>\n }\n </ul>\n </div>\n \x3c!-- END COL 1 --\x3e\n\n\n \x3c!-- COL 2 FUSIONADA: NAVEGACIÓN --\x3e\n <div class="lg:col-span-4 md:col-span-6">\n <h5 class="tracking-[1px] text-gray-100 font-semibold">{{footer.navigation_title}}</h5>\n\n <ul class="list-none footer-list mt-6">\n @for (item of footer.navigation || []; track $index) {\n <li>\n <a routerLink="{{item.url}}" class="text-gray-300 hover:text-gray-400 duration-500">\n <i class="aif aif-arrow-right-ico align-middle"></i> {{item.title}}\n </a>\n </li>\n }\n </ul>\n </div>\n \x3c!-- END COL 2 --\x3e\n\n\n \x3c!-- COL 3: NEWSLETTER --\x3e\n <div class="lg:col-span-4 md:col-span-6">\n <h5 class="tracking-[1px] text-gray-100 font-semibold">{{footer.newsletter_title}}</h5>\n\n <p class="mt-6">\n {{footer.newsletter_desc}}\n </p>\n\n <form>\n <div class="grid grid-cols-1">\n\n <div class="my-3">\n \x3c!-- <label class="form-label">\n {{text().email_label}} <span class="text-red-600">*</span>\n </label> --\x3e\n\n <div class="form-icon relative mt-2">\n <i class="aif aif-mail-ico size-4 absolute top-4 start-4"></i>\n\n <input type="email"\n class="form-input ps-12 rounded w-full py-2 px-3 h-10 bg-gray-800 dark:bg-gray-700 border-0 text-gray-100 focus:shadow-none focus:ring-0 placeholder:text-gray-200"\n placeholder="{{footer.email_placeholder}}" name="email" required>\n </div>\n </div>\n\n <button type="submit"\n class="py-2 px-5 inline-block font-semibold tracking-wide border text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-md duration-500">\n {{footer.subscribe_btn}}\n </button>\n\n </div>\n </form>\n </div>\n \x3c!-- END COL 3 --\x3e\n\n </div>\x3c!-- end grid --\x3e\n </div>\n </div>\n </div>\n </div>\n\n \x3c!-- BARRA INFERIOR --\x3e\n <div class="py-[30px] px-0 border-t border-slate-800 dark:border-slate-700">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8 text-center">\n <div class="grid md:grid-cols-2 items-center">\n\n <div class="md:text-start text-center">\n <p class="mb-0">\n © {{date()}} {{footer.rights}}\n </p>\n </div>\n\n <ul class="list-none md:text-end text-center mt-6 md:mt-0">\n @for (item of footer.links || []; track $index) {\n <li class="inline mx-2">\n <a routerLink="{{item.url}}" class="text-gray-300 hover:text-gray-400 duration-500">\n {{item.title}}\n </a>\n </li>\n }\n </ul>\n\n </div>\n </div>\n </div>\n</footer>\n}\n',styles:[""],dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFrontFooter,decorators:[{type:Component,args:[{selector:"aif-front-footer",standalone:!0,imports:[RouterLink],template:'@if (text(); as footer) {\n<footer class="relative bg-slate-900 text-gray-200 dark:bg-slate-800 dark:text-gray-200" [class]="wrapperClass()">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n <div class="grid grid-cols-12">\n <div class="col-span-12">\n <div class="py-[60px] px-0">\n <div class="grid md:grid-cols-12 grid-cols-1 gap-[30px]">\n\n \x3c!-- COL 1: Logo + descripción --\x3e\n <div class="lg:col-span-4 md:col-span-12">\n <a [routerLink]="logo().route || \'/\'" class="text-[22px] focus:outline-none">\n <img [src]="logo().src" [alt]="logo().alt || \'Logo\'">\n </a>\n\n <p class="mt-6 text-gray-300">\n {{footer.description}}\n </p>\n\n <ul class="list-none mt-6">\n @for (item of social(); track $index) {\n <li class="inline mx-0.5">\n <a href="{{item.url}}" target="_blank"\n class="size-8 inline-flex items-center justify-center border border-gray-800 text-gray-400 hover:text-white hover:border-primary hover:bg-primary rounded-md duration-500">\n <i class="{{item.icon}}"></i>\n </a>\n </li>\n }\n </ul>\n </div>\n \x3c!-- END COL 1 --\x3e\n\n\n \x3c!-- COL 2 FUSIONADA: NAVEGACIÓN --\x3e\n <div class="lg:col-span-4 md:col-span-6">\n <h5 class="tracking-[1px] text-gray-100 font-semibold">{{footer.navigation_title}}</h5>\n\n <ul class="list-none footer-list mt-6">\n @for (item of footer.navigation || []; track $index) {\n <li>\n <a routerLink="{{item.url}}" class="text-gray-300 hover:text-gray-400 duration-500">\n <i class="aif aif-arrow-right-ico align-middle"></i> {{item.title}}\n </a>\n </li>\n }\n </ul>\n </div>\n \x3c!-- END COL 2 --\x3e\n\n\n \x3c!-- COL 3: NEWSLETTER --\x3e\n <div class="lg:col-span-4 md:col-span-6">\n <h5 class="tracking-[1px] text-gray-100 font-semibold">{{footer.newsletter_title}}</h5>\n\n <p class="mt-6">\n {{footer.newsletter_desc}}\n </p>\n\n <form>\n <div class="grid grid-cols-1">\n\n <div class="my-3">\n \x3c!-- <label class="form-label">\n {{text().email_label}} <span class="text-red-600">*</span>\n </label> --\x3e\n\n <div class="form-icon relative mt-2">\n <i class="aif aif-mail-ico size-4 absolute top-4 start-4"></i>\n\n <input type="email"\n class="form-input ps-12 rounded w-full py-2 px-3 h-10 bg-gray-800 dark:bg-gray-700 border-0 text-gray-100 focus:shadow-none focus:ring-0 placeholder:text-gray-200"\n placeholder="{{footer.email_placeholder}}" name="email" required>\n </div>\n </div>\n\n <button type="submit"\n class="py-2 px-5 inline-block font-semibold tracking-wide border text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-md duration-500">\n {{footer.subscribe_btn}}\n </button>\n\n </div>\n </form>\n </div>\n \x3c!-- END COL 3 --\x3e\n\n </div>\x3c!-- end grid --\x3e\n </div>\n </div>\n </div>\n </div>\n\n \x3c!-- BARRA INFERIOR --\x3e\n <div class="py-[30px] px-0 border-t border-slate-800 dark:border-slate-700">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8 text-center">\n <div class="grid md:grid-cols-2 items-center">\n\n <div class="md:text-start text-center">\n <p class="mb-0">\n © {{date()}} {{footer.rights}}\n </p>\n </div>\n\n <ul class="list-none md:text-end text-center mt-6 md:mt-0">\n @for (item of footer.links || []; track $index) {\n <li class="inline mx-2">\n <a routerLink="{{item.url}}" class="text-gray-300 hover:text-gray-400 duration-500">\n {{item.title}}\n </a>\n </li>\n }\n </ul>\n\n </div>\n </div>\n </div>\n</footer>\n}\n'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifBackFooter{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);year=computed(()=>(new Date).getFullYear(),...ngDevMode?[{debugName:"year"}]:[]);credits=computed(()=>this.config()?.credits||"Anemona AIF. Backend workspace.",...ngDevMode?[{debugName:"credits"}]:[]);wrapperClass=computed(()=>this.config()?.class||"",...ngDevMode?[{debugName:"wrapperClass"}]:[]);static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifBackFooter,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifBackFooter,isStandalone:!0,selector:"aif-back-footer",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<footer class="border-t border-slate-200 bg-white px-4 py-3 text-xs text-slate-500 dark:border-slate-800 dark:bg-slate-900 dark:text-slate-400"\n [class]="wrapperClass()">\n <div class="mx-auto flex w-full max-w-7xl flex-col gap-1 sm:flex-row sm:items-center sm:justify-between">\n <p class="m-0">{{ credits() }}</p>\n <p class="m-0">© {{ year() }}</p>\n </div>\n</footer>\n',styles:[":host{display:block}\n"]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifBackFooter,decorators:[{type:Component,args:[{selector:"aif-back-footer",standalone:!0,template:'<footer class="border-t border-slate-200 bg-white px-4 py-3 text-xs text-slate-500 dark:border-slate-800 dark:bg-slate-900 dark:text-slate-400"\n [class]="wrapperClass()">\n <div class="mx-auto flex w-full max-w-7xl flex-col gap-1 sm:flex-row sm:items-center sm:justify-between">\n <p class="m-0">{{ credits() }}</p>\n <p class="m-0">© {{ year() }}</p>\n </div>\n</footer>\n',styles:[":host{display:block}\n"]}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});const DEFAULT_ITEM$1={title:"Page Title",breadcrumbs:[]},DEFAULT_CFG$2={overlay:"bg-gradient-to-b from-slate-900/60 via-slate-900/80 to-slate-900",height:"py-32 lg:py-40"};class AifPageHero{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);item=input(DEFAULT_ITEM$1,...ngDevMode?[{debugName:"item"}]:[]);cfg=input(DEFAULT_CFG$2,...ngDevMode?[{debugName:"cfg"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);isLoading=signal(!1,...ngDevMode?[{debugName:"isLoading"}]:[]);isLoaded=signal(!1,...ngDevMode?[{debugName:"isLoaded"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);loadedData=signal(null,...ngDevMode?[{debugName:"loadedData"}]:[]);_subscribe;state=computed(()=>{const e=this.config(),t=this.builtConfig(),n=t??e,i=this.toItem(this.loadedData()),a=this.toItem(n?.data??null),s={...DEFAULT_ITEM$1,...this.item()??{},...i??{},...a??{},...e?.item??{},...t?.item??{}};return{item:{...s,breadcrumbs:this.normalizeBreadcrumbs(s.breadcrumbs??[],n?.currentRoute)},cfg:{...DEFAULT_CFG$2,...this.cfg()??{},...e?.cfg??{},...t?.cfg??{}},class:n?.class??"",resource:n?.resource??""}},...ngDevMode?[{debugName:"state"}]:[]);ngOnInit(){this._subscribe=lang_subscribe("change",()=>{this.state().resource&&this.isBuilt()&&this.shouldWatchLang()&&this.reBuild(this.builtConfig()??this.config()).catch(()=>null)})}ngOnDestroy(){unsubscribe(this._subscribe)}build(e=null){return this.isBuilt()?Promise.resolve(this.state().item):(this.isBuilt.set(!0),this.builtConfig.set(e),this.loadData().then(()=>this.state().item))}reBuild(e=null){return this.reset(),this.build(e)}reset(){this.isBuilt.set(!1),this.isLoading.set(!1),this.isLoaded.set(!1),this.builtConfig.set(null),this.loadedData.set(null)}loadData(){const e=this.builtConfig()??this.config(),t=e?.data??null,n=this.resolveResource(e?.resource,this.currentLang());if(t)return this.loadedData.set(t),this.isLoading.set(!1),this.isLoaded.set(!0),Promise.resolve();if(!n)return this.isLoaded.set(!0),Promise.resolve();const i=n.includes(".json")||n.startsWith("assets/")||n.startsWith("./")||n.startsWith("../")||n.startsWith("http");this.isLoading.set(!0),this.isLoaded.set(!1);return(i?wHttp(n):rq_get(n)).then(e=>{const t=i?e:e?.data||e||{};this.loadedData.set(t||null),this.isLoading.set(!1),this.isLoaded.set(!0)}).catch(()=>{this.loadedData.set(null),this.isLoading.set(!1),this.isLoaded.set(!1)})}shouldWatchLang(){const e=this.builtConfig()??this.config();return e?.watchLang??!0}currentLang(){const e=this.builtConfig()??this.config();return e?.lang||lang()}resolveResource(e,t){return e?str_replace_vars(e,{lang:t}):""}toItem(e){return e?e.header&&"object"==typeof e.header?e.header:{title:e.title,subtitle:e.subtitle,text:e.text,background:e.background,breadcrumbs:e.breadcrumbs}:null}normalizeBreadcrumbs(e=[],t){if(!Array.isArray(e)||0===e.length)return[];let n=!1;const i=e.map((e,i)=>{const a=!!t&&!!e.route&&e.route===t,s=e.active??a;return n=n||s,{...e,active:s}});return n?i:i.map((e,t)=>({...e,active:t===i.length-1}))}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPageHero,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifPageHero,isStandalone:!0,selector:"aif-page-hero, aif-front-header",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},item:{classPropertyName:"item",publicName:"item",isSignal:!0,isRequired:!1,transformFunction:null},cfg:{classPropertyName:"cfg",publicName:"cfg",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (state(); as vm) {\n<section class="relative table w-full bg-no-repeat bg-center bg-cover" [ngClass]="[vm.cfg.height, vm.class]"\n [style.background-image]="vm.item.background ? \'url(\' + vm.item.background + \')\' : null">\n \x3c!-- Overlay --\x3e\n <div class="absolute inset-0" [ngClass]="vm.cfg.overlay"></div>\n\n \x3c!-- Content --\x3e\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n <div class="grid grid-cols-1 pb-8 pt-10 text-center">\n <div class="mx-auto w-full max-w-4xl">\n\n \x3c!-- Page Title --\x3e\n <h3 class="mb-3 text-3xl leading-normal font-medium text-white md:text-4xl">\n {{ vm.item.title }}\n </h3>\n\n \x3c!-- Author + Date --\x3e\n @if ( vm.item.subtitle || vm.item.text) {\n <ul class="list-none text-white/70 font-semibold">\n @if ( vm.item.subtitle) {\n <li class="inline me-2">\n <span class="text-white">{{ vm.item.subtitle }}</span>\n </li>\n }\n @if ( vm.item.text) {\n <li class="inline">\n <span class="text-white"></span> {{ vm.item.text }}\n </li>\n }\n </ul>\n }\n </div>\n\n </div>\n </div>\n\n \x3c!-- Breadcrumbs --\x3e\n @if (vm.item.breadcrumbs.length) {\n <div class="absolute text-center z-10 bottom-5 start-0 end-0 mx-3">\n <ul class="tracking-[0.5px] mb-0 inline-block">\n\n @for (bc of vm.item.breadcrumbs; track bc.label) {\n\n <li class="inline-block uppercase text-menu font-bold duration-500 ease-in-out"\n [ngClass]="bc.active ? \'text-white\' : \'text-white/50 hover:text-white\'">\n @if (!bc.active && bc.route) {\n <a [routerLink]="bc.route">{{ bc.label }}</a>\n }\n @else {\n {{ bc.label }}\n }\n </li>\n\n @if (!$last) {\n <li class="inline-block text-base text-white/50 mx-0.5 ltr:rotate-0 rtl:rotate-180">\n <i class="aif aif-chevron-right-ico align-middle text-lg"></i>\n </li>\n }\n\n }\n </ul>\n </div>\n }\n</section>\n\n\n}\n',styles:[""],dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPageHero,decorators:[{type:Component,args:[{selector:"aif-page-hero, aif-front-header",standalone:!0,imports:[NgClass,RouterLink],template:'@if (state(); as vm) {\n<section class="relative table w-full bg-no-repeat bg-center bg-cover" [ngClass]="[vm.cfg.height, vm.class]"\n [style.background-image]="vm.item.background ? \'url(\' + vm.item.background + \')\' : null">\n \x3c!-- Overlay --\x3e\n <div class="absolute inset-0" [ngClass]="vm.cfg.overlay"></div>\n\n \x3c!-- Content --\x3e\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n <div class="grid grid-cols-1 pb-8 pt-10 text-center">\n <div class="mx-auto w-full max-w-4xl">\n\n \x3c!-- Page Title --\x3e\n <h3 class="mb-3 text-3xl leading-normal font-medium text-white md:text-4xl">\n {{ vm.item.title }}\n </h3>\n\n \x3c!-- Author + Date --\x3e\n @if ( vm.item.subtitle || vm.item.text) {\n <ul class="list-none text-white/70 font-semibold">\n @if ( vm.item.subtitle) {\n <li class="inline me-2">\n <span class="text-white">{{ vm.item.subtitle }}</span>\n </li>\n }\n @if ( vm.item.text) {\n <li class="inline">\n <span class="text-white"></span> {{ vm.item.text }}\n </li>\n }\n </ul>\n }\n </div>\n\n </div>\n </div>\n\n \x3c!-- Breadcrumbs --\x3e\n @if (vm.item.breadcrumbs.length) {\n <div class="absolute text-center z-10 bottom-5 start-0 end-0 mx-3">\n <ul class="tracking-[0.5px] mb-0 inline-block">\n\n @for (bc of vm.item.breadcrumbs; track bc.label) {\n\n <li class="inline-block uppercase text-menu font-bold duration-500 ease-in-out"\n [ngClass]="bc.active ? \'text-white\' : \'text-white/50 hover:text-white\'">\n @if (!bc.active && bc.route) {\n <a [routerLink]="bc.route">{{ bc.label }}</a>\n }\n @else {\n {{ bc.label }}\n }\n </li>\n\n @if (!$last) {\n <li class="inline-block text-base text-white/50 mx-0.5 ltr:rotate-0 rtl:rotate-180">\n <i class="aif aif-chevron-right-ico align-middle text-lg"></i>\n </li>\n }\n\n }\n </ul>\n </div>\n }\n</section>\n\n\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],item:[{type:i0.Input,args:[{isSignal:!0,alias:"item",required:!1}]}],cfg:[{type:i0.Input,args:[{isSignal:!0,alias:"cfg",required:!1}]}]}});const DEFAULT_ITEM={title:"Certificate Validation",label:"Verify",placeholder:"Enter Folio Number..."},DEFAULT_CFG$1={overlay:"bg-gradient-to-b from-slate-900/60 via-slate-900/80 to-slate-900",height:"py-12 lg:py-20"};class AifPageHeroSearch{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);item=input(DEFAULT_ITEM,...ngDevMode?[{debugName:"item"}]:[]);cfg=input(DEFAULT_CFG$1,...ngDevMode?[{debugName:"cfg"}]:[]);search=output();verify=output();loaded=output();textSearch=signal("",...ngDevMode?[{debugName:"textSearch"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);isLoading=signal(!1,...ngDevMode?[{debugName:"isLoading"}]:[]);isLoaded=signal(!1,...ngDevMode?[{debugName:"isLoaded"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);loadedData=signal(null,...ngDevMode?[{debugName:"loadedData"}]:[]);_subscribe;pendingBuildPromise=null;resolveBuildPromise=null;rejectBuildPromise=null;state=computed(()=>{const e=this.config(),t=this.builtConfig(),n=t??e,i=this.loadedData(),a=n?.data??null,s=i?this.toItem(i):null,o=a?this.toItem(a):null;return{item:{...DEFAULT_ITEM,...this.item()??{},...s??{},...o??{},...e?.item??{},...t?.item??{}},cfg:{...DEFAULT_CFG$1,...this.cfg()??{},...e?.cfg??{},...t?.cfg??{}},disabled:n?.disabled??!1,loading:n?.loading??this.isLoading(),class:n?.class??"",resource:n?.resource??""}},...ngDevMode?[{debugName:"state"}]:[]);ngOnInit(){this._subscribe=lang_subscribe("change",()=>{this.state().resource&&this.isBuilt()&&this.shouldWatchLang()&&this.reBuild(this.builtConfig()??this.config()).catch(()=>null)})}ngOnDestroy(){unsubscribe(this._subscribe)}build(e=null){return this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e),this.createBuildPromise(),"string"==typeof e?.textSearch?this.textSearch.set(e.textSearch):"string"==typeof e?.folio&&this.textSearch.set(e.folio),this.loadData()),this.whenLoaded()}reBuild(e=null){return this.reset(),this.build(e)}reset(){this.isBuilt.set(!1),this.isLoading.set(!1),this.isLoaded.set(!1),this.builtConfig.set(null),this.loadedData.set(null),this.textSearch.set(""),this.pendingBuildPromise=null,this.resolveBuildPromise=null,this.rejectBuildPromise=null}setTextSearch(e){this.textSearch.set(e)}onSearchClick(){if(this.state().disabled||this.state().loading)return;const e=this.textSearch().trim(),t=this.builtConfig()??this.config();t?.onSearch?.(e),this.search.emit(e),this.verify.emit(e)}whenLoaded(){return this.isLoaded()?Promise.resolve(this.makeLoadedEvent()):(this.pendingBuildPromise||this.createBuildPromise(),this.pendingBuildPromise)}loadData(){const e=this.builtConfig()??this.config(),t=e?.data??null,n=this.resolveResource(e?.resource,this.currentLang());if(t)return this.loadedData.set(t),this.isLoading.set(!1),this.isLoaded.set(!0),void this.completeBuild();if(!n)return this.isLoaded.set(!0),void this.completeBuild();const i=n.includes(".json")||n.startsWith("assets/")||n.startsWith("./")||n.startsWith("../")||n.startsWith("http");this.isLoading.set(!0),this.isLoaded.set(!1);(i?wHttp(n):rq_get(n)).then(e=>{const t=i?e:e?.data||e||{};this.loadedData.set(t||null),this.isLoading.set(!1),this.isLoaded.set(!0),this.completeBuild()}).catch(e=>{this.handleLoadError(e)})}shouldWatchLang(){const e=this.builtConfig()??this.config();return e?.watchLang??!0}currentLang(){const e=this.builtConfig()??this.config();return e?.lang||lang()}resolveResource(e,t){return e?str_replace_vars(e,{lang:t}):""}toItem(e){return{background:e.background,title:e.title,subtitle:e.subtitle,label:e.label,placeholder:e.placeholder}}createBuildPromise(){this.pendingBuildPromise=new Promise((e,t)=>{this.resolveBuildPromise=e,this.rejectBuildPromise=t})}completeBuild(){const e=this.makeLoadedEvent();this.loaded.emit(e),this.resolveBuildPromise&&(this.resolveBuildPromise(e),this.resolveBuildPromise=null,this.rejectBuildPromise=null,this.pendingBuildPromise=Promise.resolve(e))}handleLoadError(e){this.isLoading.set(!1),this.isLoaded.set(!1),this.loadedData.set(null),this.rejectBuildPromise&&(this.rejectBuildPromise(e),this.pendingBuildPromise=null,this.resolveBuildPromise=null,this.rejectBuildPromise=null)}makeLoadedEvent(){return{lang:this.currentLang(),resource:this.resolveResource(this.state().resource,this.currentLang())||void 0,data:this.loadedData(),item:this.state().item}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPageHeroSearch,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifPageHeroSearch,isStandalone:!0,selector:"aif-page-hero-search, aif-front-header-search",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},item:{classPropertyName:"item",publicName:"item",isSignal:!0,isRequired:!1,transformFunction:null},cfg:{classPropertyName:"cfg",publicName:"cfg",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{search:"search",verify:"verify",loaded:"loaded"},ngImport:i0,template:'@if (state(); as vm) {\n<section class="relative table w-full bg-no-repeat bg-center bg-cover" [ngClass]="[vm.cfg.height, vm.class]"\n [style.background-image]="vm.item.background ? \'url(\' + vm.item.background + \')\' : null">\n \x3c!-- Overlay --\x3e\n <div class="absolute inset-0" [ngClass]="vm.cfg.overlay"></div>\n\n \x3c!-- Content --\x3e\n <div class="container relative">\n <div class="grid grid-cols-1 pb-8 text-center mt-10">\n\n \x3c!-- Page Title --\x3e\n @if(vm.item.title) {\n <h3 class="mb-3 text-3xl leading-normal font-medium text-white">\n {{ vm.item.title }}\n </h3>\n }\n\n @if(vm.item.subtitle) {\n <p class="text-white/60 font-semibold mb-6">{{ vm.item.subtitle }}</p>\n }\n\n \x3c!-- Search Input --\x3e\n <div class="max-w-xl mx-auto w-full">\n <div class="relative">\n <input type="text" [ngModel]="textSearch()" (ngModelChange)="setTextSearch($event)" (keyup.enter)="onSearchClick()"\n [disabled]="vm.disabled || vm.loading"\n class="w-full py-4 pl-6 pr-32 h-[60px] bg-white dark:bg-slate-900 rounded-full shadow dark:shadow-gray-800 outline-none border-0"\n [placeholder]="vm.item.placeholder">\n <button type="button" (click)="onSearchClick()" [disabled]="vm.disabled || vm.loading"\n class="absolute top-[5px] right-[5px] h-[50px] px-6 bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-full duration-500 disabled:cursor-not-allowed disabled:opacity-70">\n {{ vm.loading ? \'...\' : vm.item.label }}\n </button>\n </div>\n </div>\n\n </div>\n </div>\n</section>\n\n<div class="relative">\n <div\n class="shape absolute sm:-bottom-px -bottom-[2px] start-0 end-0 overflow-hidden z-1 text-white dark:text-slate-900">\n <svg class="w-full h-auto scale-[2.0] origin-top" viewBox="0 0 2880 48" fill="none"\n xmlns="http://www.w3.org/2000/svg">\n <path d="M0 48H1437.5H2880V0H2160C1442.5 52 720 0 720 0H0V48Z" fill="currentColor"></path>\n </svg>\n </div>\n</div>\n}\n',styles:[""],dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"ngmodule",type:FormsModule},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPageHeroSearch,decorators:[{type:Component,args:[{selector:"aif-page-hero-search, aif-front-header-search",standalone:!0,imports:[NgClass,FormsModule],template:'@if (state(); as vm) {\n<section class="relative table w-full bg-no-repeat bg-center bg-cover" [ngClass]="[vm.cfg.height, vm.class]"\n [style.background-image]="vm.item.background ? \'url(\' + vm.item.background + \')\' : null">\n \x3c!-- Overlay --\x3e\n <div class="absolute inset-0" [ngClass]="vm.cfg.overlay"></div>\n\n \x3c!-- Content --\x3e\n <div class="container relative">\n <div class="grid grid-cols-1 pb-8 text-center mt-10">\n\n \x3c!-- Page Title --\x3e\n @if(vm.item.title) {\n <h3 class="mb-3 text-3xl leading-normal font-medium text-white">\n {{ vm.item.title }}\n </h3>\n }\n\n @if(vm.item.subtitle) {\n <p class="text-white/60 font-semibold mb-6">{{ vm.item.subtitle }}</p>\n }\n\n \x3c!-- Search Input --\x3e\n <div class="max-w-xl mx-auto w-full">\n <div class="relative">\n <input type="text" [ngModel]="textSearch()" (ngModelChange)="setTextSearch($event)" (keyup.enter)="onSearchClick()"\n [disabled]="vm.disabled || vm.loading"\n class="w-full py-4 pl-6 pr-32 h-[60px] bg-white dark:bg-slate-900 rounded-full shadow dark:shadow-gray-800 outline-none border-0"\n [placeholder]="vm.item.placeholder">\n <button type="button" (click)="onSearchClick()" [disabled]="vm.disabled || vm.loading"\n class="absolute top-[5px] right-[5px] h-[50px] px-6 bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-full duration-500 disabled:cursor-not-allowed disabled:opacity-70">\n {{ vm.loading ? \'...\' : vm.item.label }}\n </button>\n </div>\n </div>\n\n </div>\n </div>\n</section>\n\n<div class="relative">\n <div\n class="shape absolute sm:-bottom-px -bottom-[2px] start-0 end-0 overflow-hidden z-1 text-white dark:text-slate-900">\n <svg class="w-full h-auto scale-[2.0] origin-top" viewBox="0 0 2880 48" fill="none"\n xmlns="http://www.w3.org/2000/svg">\n <path d="M0 48H1437.5H2880V0H2160C1442.5 52 720 0 720 0H0V48Z" fill="currentColor"></path>\n </svg>\n </div>\n</div>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],item:[{type:i0.Input,args:[{isSignal:!0,alias:"item",required:!1}]}],cfg:[{type:i0.Input,args:[{isSignal:!0,alias:"cfg",required:!1}]}],search:[{type:i0.Output,args:["search"]}],verify:[{type:i0.Output,args:["verify"]}],loaded:[{type:i0.Output,args:["loaded"]}]}});class AifGoBack{static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGoBack,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"21.1.1",type:AifGoBack,isStandalone:!0,selector:"aif-go-back",ngImport:i0,template:'<div class="fixed bottom-3 end-3">\n <a routerLink="/"\n class="back-button size-9 inline-flex items-center justify-center tracking-wide border align-middle duration-500 text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-full"><i\n class="aif aif-arrow-left-ico size-5"></i></a>\n</div>',styles:[""],dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGoBack,decorators:[{type:Component,args:[{selector:"aif-go-back",standalone:!0,imports:[RouterLink],template:'<div class="fixed bottom-3 end-3">\n <a routerLink="/"\n class="back-button size-9 inline-flex items-center justify-center tracking-wide border align-middle duration-500 text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-full"><i\n class="aif aif-arrow-left-ico size-5"></i></a>\n</div>'}]}]});class AifGoUp{destroyRef=inject(DestroyRef);rafId=null;offsetFromTop=100;isVisible=signal(!1,...ngDevMode?[{debugName:"isVisible"}]:[]);ngAfterViewInit(){const e=()=>{null===this.rafId&&(this.rafId=requestAnimationFrame(()=>{this.rafId=null,this.isVisible.set(this.getScrollTop()>this.offsetFromTop)}))};e(),window.addEventListener("scroll",e,{passive:!0}),this.destroyRef.onDestroy(()=>{window.removeEventListener("scroll",e),null!==this.rafId&&cancelAnimationFrame(this.rafId)})}scrollToTop(){window.scrollTo({top:0,behavior:"smooth"})}getScrollTop(){return window.scrollY||document.documentElement.scrollTop||document.body.scrollTop||0}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGoUp,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"21.1.1",type:AifGoUp,isStandalone:!0,selector:"aif-go-up",ngImport:i0,template:'<a (click)="scrollToTop()" id="back-to-top"\n class="back-to-top fixed text-lg rounded-full z-10 bottom-5 end-5 size-9 text-center bg-primary text-white leading-9 cursor-pointer"\n [class.hidden]="!isVisible()" [class.block]="isVisible()"><i\n class="aif aif-arrow-up-ico leading-10"></i></a>\n',styles:[""]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGoUp,decorators:[{type:Component,args:[{selector:"aif-go-up",standalone:!0,imports:[],template:'<a (click)="scrollToTop()" id="back-to-top"\n class="back-to-top fixed text-lg rounded-full z-10 bottom-5 end-5 size-9 text-center bg-primary text-white leading-9 cursor-pointer"\n [class.hidden]="!isVisible()" [class.block]="isVisible()"><i\n class="aif aif-arrow-up-ico leading-10"></i></a>\n'}]}]});class AifLoading{defaultBgColor=env("app.loading.bg_color");isLoading=signal(!0,...ngDevMode?[{debugName:"isLoading"}]:[]);bg_color=signal(this.defaultBgColor,...ngDevMode?[{debugName:"bg_color"}]:[]);_sb;ngOnInit(){this._sb=loading_subscribe(e=>{"boolean"!=typeof e?e&&"object"==typeof e&&(this.bg_color.set(e.bg_color||this.defaultBgColor),this.isLoading.set(!!e.show)):this.isLoading.set(e)})}ngOnDestroy(){unsubscribe(this._sb)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifLoading,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifLoading,isStandalone:!0,selector:"aif-loading",ngImport:i0,template:'@if(isLoading()) {\n<div class="aif-loading loading-overlay" [ngStyle]="{\'background-color\': bg_color()}">\n <div class="spinner"></div>\n</div>\n}',styles:['@charset "UTF-8";.loading-overlay{position:fixed;display:flex;top:0;left:0;background-color:#fff;z-index:105000;justify-content:center;align-items:center;height:100vh;width:100vw}.swal2-container{z-index:1050000!important}.spinner{width:40px;height:40px;background-color:#6b1832;margin:100px auto;-webkit-animation:sk-rotateplane 1.2s infinite ease-in-out;animation:sk-rotateplane 1.2s infinite ease-in-out}@-webkit-keyframes sk-rotateplane{0%{-webkit-transform:perspective(120px)}50%{-webkit-transform:perspective(120px) rotateY(180deg)}to{-webkit-transform:perspective(120px) rotateY(180deg) rotateX(180deg)}}@keyframes sk-rotateplane{0%{transform:perspective(120px) rotateX(0) rotateY(0);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{transform:perspective(120px) rotateX(-180.1deg) rotateY(0);-webkit-transform:perspective(120px) rotateX(-180.1deg) rotateY(0deg)}to{transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg);-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg)}}\n'],dependencies:[{kind:"directive",type:NgStyle,selector:"[ngStyle]",inputs:["ngStyle"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifLoading,decorators:[{type:Component,args:[{selector:"aif-loading",imports:[NgStyle],template:'@if(isLoading()) {\n<div class="aif-loading loading-overlay" [ngStyle]="{\'background-color\': bg_color()}">\n <div class="spinner"></div>\n</div>\n}',styles:['@charset "UTF-8";.loading-overlay{position:fixed;display:flex;top:0;left:0;background-color:#fff;z-index:105000;justify-content:center;align-items:center;height:100vh;width:100vw}.swal2-container{z-index:1050000!important}.spinner{width:40px;height:40px;background-color:#6b1832;margin:100px auto;-webkit-animation:sk-rotateplane 1.2s infinite ease-in-out;animation:sk-rotateplane 1.2s infinite ease-in-out}@-webkit-keyframes sk-rotateplane{0%{-webkit-transform:perspective(120px)}50%{-webkit-transform:perspective(120px) rotateY(180deg)}to{-webkit-transform:perspective(120px) rotateY(180deg) rotateX(180deg)}}@keyframes sk-rotateplane{0%{transform:perspective(120px) rotateX(0) rotateY(0);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{transform:perspective(120px) rotateX(-180.1deg) rotateY(0);-webkit-transform:perspective(120px) rotateX(-180.1deg) rotateY(0deg)}to{transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg);-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg)}}\n']}]}]});let next_menu_id=0;class AifMenu{onInit=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);fields=input({},...ngDevMode?[{debugName:"fields"}]:[]);index=input(0,...ngDevMode?[{debugName:"index"}]:[]);total=input(0,...ngDevMode?[{debugName:"total"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);root=viewChild.required("root");menuId="aif-menu-"+next_menu_id++;open=signal(!1,...ngDevMode?[{debugName:"open"}]:[]);state=computed(()=>({...this.config(),...obj_compact(this.cfg())}),...ngDevMode?[{debugName:"state"}]:[]);hasFields=computed(()=>Object.keys(this.fields()??{}).length>0,...ngDevMode?[{debugName:"hasFields"}]:[]);options=computed(()=>this.state().options??[],...ngDevMode?[{debugName:"options"}]:[]);processedOptions=computed(()=>{const e=this.fields();return this.options().map(t=>this.to_processed_option(t,e))},...ngDevMode?[{debugName:"processedOptions"}]:[]);iconClass=computed(()=>this.state().icon??"aif aif-dots-horizontal-ico",...ngDevMode?[{debugName:"iconClass"}]:[]);placement=computed(()=>this.state().placement??"start",...ngDevMode?[{debugName:"placement"}]:[]);horizontalPositionClass=computed(()=>"start"===this.placement()?"left-0":"right-0",...ngDevMode?[{debugName:"horizontalPositionClass"}]:[]);isSingleRow=computed(()=>this.total()<=1,...ngDevMode?[{debugName:"isSingleRow"}]:[]);vplacement=computed(()=>{const e=this.state().vplacement??"auto";if("auto"===e){if(this.isSingleRow())return"bottom";const e=this.index(),t=this.total();return t>1&&e>0&&e>=t-2?"top":"bottom"}return e},...ngDevMode?[{debugName:"vplacement"}]:[]);panelPositionClass=computed(()=>this.isSingleRow()?"end"===this.placement()?"-top-14 right-full mr-2":"-top-14 left-full ml-2":"top"===this.vplacement()?"bottom-full mb-2":"top-full mt-2",...ngDevMode?[{debugName:"panelPositionClass"}]:[]);panelClass=computed(()=>this.isSingleRow()?this.panelPositionClass():`${this.horizontalPositionClass()} ${this.panelPositionClass()}`.trim(),...ngDevMode?[{debugName:"panelClass"}]:[]);wrapperClass=computed(()=>this.state().class??"",...ngDevMode?[{debugName:"wrapperClass"}]:[]);buttonClass=computed(()=>this.state().buttonClass??"inline-flex items-center justify-center rounded-md p-2 text-slate-500 hover:bg-slate-100 hover:text-slate-700 dark:text-slate-400 dark:hover:bg-slate-700 dark:hover:text-slate-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-500",...ngDevMode?[{debugName:"buttonClass"}]:[]);menuClass=computed(()=>this.state().menuClass??"min-w-48 rounded-lg border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 p-1 shadow-2xl",...ngDevMode?[{debugName:"menuClass"}]:[]);ngAfterViewInit(){this.onInit.emit()}build(e={}){this.cfg.set(obj_compact(e))}resetToInput(){this.cfg.set({})}reBuild(e={}){this.build(e)}toggle(){this.open.update(e=>!e)}close(){this.open.set(!1)}btnClick(e){e._isReadonly||(e.click?.(e,this.fields()),this.close())}onDocClick(e){if(!this.open())return;const t=this.root()?.nativeElement;t&&(t.contains(e.target)||this.close())}onEsc(){this.open()&&this.close()}to_processed_option(e,t){return"-"===e?{_isDivider:!0,_canShow:!0,_isReadonly:!1}:e.divider?{...e,_isDivider:!0,_canShow:!0,_isReadonly:!1}:{...e,_isDivider:!1,_canShow:this.can_show(e,t),_isReadonly:this.is_readonly(e,t)}}is_readonly(e,t){return!0===e.readonly||this.evaluate_condition(e.readonly,t)}can_show(e,t){return e.show?this.evaluate_condition(e.show,t):!e.hide||!this.evaluate_condition(e.hide,t)}evaluate_condition(e,t){return!(!e||!this.hasFields())&&(Array.isArray(e)?field_evaluate(e[0],t,!0):field_evaluate(e,t))}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifMenu,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifMenu,isStandalone:!0,selector:"aif-menu",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},fields:{classPropertyName:"fields",publicName:"fields",isSignal:!0,isRequired:!1,transformFunction:null},index:{classPropertyName:"index",publicName:"index",isSignal:!0,isRequired:!1,transformFunction:null},total:{classPropertyName:"total",publicName:"total",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},host:{listeners:{"document:click":"onDocClick($event)","document:keydown.escape":"onEsc()"}},viewQueries:[{propertyName:"root",first:!0,predicate:["root"],descendants:!0,isSignal:!0}],ngImport:i0,template:'<div #root class="relative inline-block" [class]="wrapperClass()" [class.z-[100]]="open()">\n \x3c!-- Botón --\x3e\n <button\n type="button"\n [class]="buttonClass()"\n (click)="toggle()"\n aria-haspopup="menu"\n [attr.aria-expanded]="open()"\n [attr.aria-controls]="menuId">\n <i [class]="iconClass()"></i>\n </button>\n\n \x3c!-- Menú --\x3e\n @if (open()) {\n <div\n class="absolute z-50"\n [class]="panelClass()"\n [attr.id]="menuId"\n role="menu">\n <ul [class]="menuClass()" class="max-h-80 overflow-y-auto scrollbar-thin scrollbar-thumb-slate-200 dark:scrollbar-thumb-slate-700">\n @for (menu of processedOptions(); track $index) {\n @if (menu._isDivider) {\n <li class="my-1 border-t border-slate-100 dark:border-slate-700"></li>\n } @else if (menu._canShow) {\n <li>\n <button type="button" role="menuitem" (click)="btnClick(menu)"\n class="flex w-full items-center gap-2 rounded-md px-3 py-2 text-left text-sm text-slate-700 dark:text-slate-200 hover:bg-slate-100 dark:hover:bg-slate-700/50 transition-colors"\n [class.opacity-50]="menu._isReadonly" [class.pointer-events-none]="menu._isReadonly">\n @if (menu.icon) {\n <i [class]="menu.icon"></i>\n }\n <span>{{ menu.title }}</span>\n </button>\n </li>\n }\n }\n </ul>\n </div>\n }\n</div>\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifMenu,decorators:[{type:Component,args:[{selector:"aif-menu",standalone:!0,template:'<div #root class="relative inline-block" [class]="wrapperClass()" [class.z-[100]]="open()">\n \x3c!-- Botón --\x3e\n <button\n type="button"\n [class]="buttonClass()"\n (click)="toggle()"\n aria-haspopup="menu"\n [attr.aria-expanded]="open()"\n [attr.aria-controls]="menuId">\n <i [class]="iconClass()"></i>\n </button>\n\n \x3c!-- Menú --\x3e\n @if (open()) {\n <div\n class="absolute z-50"\n [class]="panelClass()"\n [attr.id]="menuId"\n role="menu">\n <ul [class]="menuClass()" class="max-h-80 overflow-y-auto scrollbar-thin scrollbar-thumb-slate-200 dark:scrollbar-thumb-slate-700">\n @for (menu of processedOptions(); track $index) {\n @if (menu._isDivider) {\n <li class="my-1 border-t border-slate-100 dark:border-slate-700"></li>\n } @else if (menu._canShow) {\n <li>\n <button type="button" role="menuitem" (click)="btnClick(menu)"\n class="flex w-full items-center gap-2 rounded-md px-3 py-2 text-left text-sm text-slate-700 dark:text-slate-200 hover:bg-slate-100 dark:hover:bg-slate-700/50 transition-colors"\n [class.opacity-50]="menu._isReadonly" [class.pointer-events-none]="menu._isReadonly">\n @if (menu.icon) {\n <i [class]="menu.icon"></i>\n }\n <span>{{ menu.title }}</span>\n </button>\n </li>\n }\n }\n </ul>\n </div>\n }\n</div>\n'}]}],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],fields:[{type:i0.Input,args:[{isSignal:!0,alias:"fields",required:!1}]}],index:[{type:i0.Input,args:[{isSignal:!0,alias:"index",required:!1}]}],total:[{type:i0.Input,args:[{isSignal:!0,alias:"total",required:!1}]}],root:[{type:i0.ViewChild,args:["root",{isSignal:!0}]}],onDocClick:[{type:HostListener,args:["document:click",["$event"]]}],onEsc:[{type:HostListener,args:["document:keydown.escape"]}]}});class AifNavActionButton{route=input(null,...ngDevMode?[{debugName:"route"}]:[]);title=input("",...ngDevMode?[{debugName:"title"}]:[]);ariaLabel=input("",...ngDevMode?[{debugName:"ariaLabel"}]:[]);variant=input("front-circle",...ngDevMode?[{debugName:"variant"}]:[]);active=input(!1,...ngDevMode?[{debugName:"active"}]:[]);extraClass=input("",...ngDevMode?[{debugName:"extraClass"}]:[]);clicked=output();className=computed(()=>[this.baseClass(),this.variantClass(),this.activeClass(),this.extraClass()].filter(Boolean).join(" "),...ngDevMode?[{debugName:"className"}]:[]);onClick(e){this.clicked.emit(e)}baseClass(){return"inline-flex items-center justify-center align-middle transition-colors duration-300 focus:outline-none"}variantClass(){switch(this.variant()){case"back-square":return"h-10 w-10 rounded-lg text-gray-500 dark:text-gray-400 lg:h-11 lg:w-11";case"back-circle":return"h-11 w-full rounded-full border border-gray-200 bg-white text-gray-500 hover:bg-gray-100 hover:text-gray-700 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-white lg:w-11";default:return"size-9 rounded-full border border-primary bg-primary text-base text-center text-white hover:border-primary-700 hover:bg-primary-700"}}activeClass(){return this.active()&&"back-square"===this.variant()?"bg-gray-100 dark:bg-white/[0.03]":""}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavActionButton,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavActionButton,isStandalone:!0,selector:"aif-nav-action-button",inputs:{route:{classPropertyName:"route",publicName:"route",isSignal:!0,isRequired:!1,transformFunction:null},title:{classPropertyName:"title",publicName:"title",isSignal:!0,isRequired:!1,transformFunction:null},ariaLabel:{classPropertyName:"ariaLabel",publicName:"ariaLabel",isSignal:!0,isRequired:!1,transformFunction:null},variant:{classPropertyName:"variant",publicName:"variant",isSignal:!0,isRequired:!1,transformFunction:null},active:{classPropertyName:"active",publicName:"active",isSignal:!0,isRequired:!1,transformFunction:null},extraClass:{classPropertyName:"extraClass",publicName:"extraClass",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{clicked:"clicked"},ngImport:i0,template:'@if (route()) {\n<a [routerLink]="route()!" [class]="className()" [title]="title()" [attr.aria-label]="ariaLabel() || title()">\n <ng-content></ng-content>\n</a>\n} @else {\n<button type="button" [class]="className()" [title]="title()" [attr.aria-label]="ariaLabel() || title()"\n (click)="onClick($event)">\n <ng-content></ng-content>\n</button>\n}\n',dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavActionButton,decorators:[{type:Component,args:[{selector:"aif-nav-action-button",standalone:!0,imports:[RouterLink],template:'@if (route()) {\n<a [routerLink]="route()!" [class]="className()" [title]="title()" [attr.aria-label]="ariaLabel() || title()">\n <ng-content></ng-content>\n</a>\n} @else {\n<button type="button" [class]="className()" [title]="title()" [attr.aria-label]="ariaLabel() || title()"\n (click)="onClick($event)">\n <ng-content></ng-content>\n</button>\n}\n'}]}],propDecorators:{route:[{type:i0.Input,args:[{isSignal:!0,alias:"route",required:!1}]}],title:[{type:i0.Input,args:[{isSignal:!0,alias:"title",required:!1}]}],ariaLabel:[{type:i0.Input,args:[{isSignal:!0,alias:"ariaLabel",required:!1}]}],variant:[{type:i0.Input,args:[{isSignal:!0,alias:"variant",required:!1}]}],active:[{type:i0.Input,args:[{isSignal:!0,alias:"active",required:!1}]}],extraClass:[{type:i0.Input,args:[{isSignal:!0,alias:"extraClass",required:!1}]}],clicked:[{type:i0.Output,args:["clicked"]}]}});class AifNavLogo{cfg=input(void 0,...ngDevMode?[{debugName:"cfg"}]:[]);surface=input("theme",...ngDevMode?[{debugName:"surface"}]:[]);dark=computed(()=>this.cfg()?.dark||"assets/images/logo/logo-light.png",...ngDevMode?[{debugName:"dark"}]:[]);light=computed(()=>this.cfg()?.light||"assets/images/logo/logo-dark.png",...ngDevMode?[{debugName:"light"}]:[]);alt=computed(()=>this.cfg()?.alt||"Logo",...ngDevMode?[{debugName:"alt"}]:[]);route=computed(()=>this.cfg()?.route||"/",...ngDevMode?[{debugName:"route"}]:[]);isThemeSurface=computed(()=>"theme"===this.surface(),...ngDevMode?[{debugName:"isThemeSurface"}]:[]);isLightSurface=computed(()=>"light"===this.surface(),...ngDevMode?[{debugName:"isLightSurface"}]:[]);isDarkSurface=computed(()=>"dark"===this.surface(),...ngDevMode?[{debugName:"isDarkSurface"}]:[]);isFrontNavSurface=computed(()=>"front-nav"===this.surface(),...ngDevMode?[{debugName:"isFrontNavSurface"}]:[]);anchorClass=computed(()=>this.isFrontNavSurface()?"logo inline-flex h-[74px] max-w-full min-w-0 items-center align-middle":"inline-flex h-10 max-w-full min-w-0 items-center align-middle",...ngDevMode?[{debugName:"anchorClass"}]:[]);imageClass=computed(()=>this.isFrontNavSurface()?"block h-8 w-auto max-w-full object-contain align-middle":"block h-6 w-auto max-w-full object-contain",...ngDevMode?[{debugName:"imageClass"}]:[]);static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavLogo,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavLogo,isStandalone:!0,selector:"aif-nav-logo",inputs:{cfg:{classPropertyName:"cfg",publicName:"cfg",isSignal:!0,isRequired:!1,transformFunction:null},surface:{classPropertyName:"surface",publicName:"surface",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (cfg()) {\n<a [class]="anchorClass()" [routerLink]="route() || \'/\'">\n @if (isFrontNavSurface()) {\n <img [src]="light()" class="l-dark" [class]="imageClass()" [alt]="alt()">\n <img [src]="dark()" class="l-light" [class]="imageClass()" [alt]="alt()">\n } @else if (isThemeSurface()) {\n <img [src]="light()" class="dark:hidden" [class]="imageClass()" [alt]="alt()">\n <img [src]="dark()" class="hidden dark:block" [class]="imageClass()" [alt]="alt()">\n } @else if (isDarkSurface()) {\n <img [src]="dark()" [class]="imageClass()" [alt]="alt()">\n } @else {\n <img [src]="light()" [class]="imageClass()" [alt]="alt()">\n }\n</a>\n}\n',styles:[""],dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavLogo,decorators:[{type:Component,args:[{selector:"aif-nav-logo",imports:[RouterLink],template:'@if (cfg()) {\n<a [class]="anchorClass()" [routerLink]="route() || \'/\'">\n @if (isFrontNavSurface()) {\n <img [src]="light()" class="l-dark" [class]="imageClass()" [alt]="alt()">\n <img [src]="dark()" class="l-light" [class]="imageClass()" [alt]="alt()">\n } @else if (isThemeSurface()) {\n <img [src]="light()" class="dark:hidden" [class]="imageClass()" [alt]="alt()">\n <img [src]="dark()" class="hidden dark:block" [class]="imageClass()" [alt]="alt()">\n } @else if (isDarkSurface()) {\n <img [src]="dark()" [class]="imageClass()" [alt]="alt()">\n } @else {\n <img [src]="light()" [class]="imageClass()" [alt]="alt()">\n }\n</a>\n}\n'}]}],propDecorators:{cfg:[{type:i0.Input,args:[{isSignal:!0,alias:"cfg",required:!1}]}],surface:[{type:i0.Input,args:[{isSignal:!0,alias:"surface",required:!1}]}]}});class AifNavDropdownService{activeId=signal(null,...ngDevMode?[{debugName:"activeId"}]:[]);current(){return this.activeId()}isActive(e){return this.activeId()===e}toggle(e){const t=this.activeId()===e?null:e;return this.activeId.set(t),t===e}open(e){this.activeId.set(e)}close(e){e&&this.activeId()!==e||this.activeId.set(null)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavDropdownService,deps:[],target:i0.ɵɵFactoryTarget.Injectable});static"ɵprov"=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavDropdownService,providedIn:"root"})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavDropdownService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}]});class AifNavLangDropDown{static nextId=0;dropdowns=inject(AifNavDropdownService);dropdownId="aif-nav-lang-dropdown-"+ ++AifNavLangDropDown.nextId;config=input(null,...ngDevMode?[{debugName:"config"}]:[]);variant=input("back",...ngDevMode?[{debugName:"variant"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);cfg=computed(()=>this.builtConfig()??this.config(),...ngDevMode?[{debugName:"cfg"}]:[]);currentLang=signal(lang(),...ngDevMode?[{debugName:"currentLang"}]:[]);isOpen=computed(()=>this.dropdowns.isActive(this.dropdownId),...ngDevMode?[{debugName:"isOpen"}]:[]);isFront=computed(()=>"front"===this.variant(),...ngDevMode?[{debugName:"isFront"}]:[]);triggerClass=computed(()=>this.isFront()?"dropdown-toggle cursor-pointer inline-flex size-9 items-center justify-center rounded-full border border-gray-200 bg-white text-xs font-semibold text-center align-middle duration-500 hover:bg-gray-100 dark:border-gray-800 dark:bg-slate-900 dark:hover:bg-gray-700":"dropdown-toggle relative flex h-11 w-full items-center justify-center rounded-full border border-gray-200 bg-white text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-white lg:w-11",...ngDevMode?[{debugName:"triggerClass"}]:[]);panelClass=computed(()=>this.isFront()?"absolute end-0 m-0 mt-3 z-10 w-32 rounded-md overflow-hidden bg-white text-[13px] shadow-sm dark:bg-slate-900 dark:shadow-gray-800":"-left-[20px] absolute mt-[17px] flex w-[260px] flex-col rounded-2xl border border-gray-200 bg-white p-3 shadow-theme-lg dark:border-gray-800 dark:bg-gray-dark",...ngDevMode?[{debugName:"panelClass"}]:[]);reBuild(e){this.resetToInput(),this.build(e)}build(e){this.builtConfig.set(e)}resetToInput(){this.builtConfig.set(null)}toggleDropdown(){this.dropdowns.toggle(this.dropdownId)}closeDropdown(){this.dropdowns.close(this.dropdownId)}langs_setLang(e){this.currentLang.set(e),lang_set(e)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavLangDropDown,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavLangDropDown,isStandalone:!0,selector:"aif-nav-lang-dropdown",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},variant:{classPropertyName:"variant",publicName:"variant",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (cfg()) {\n<div class="relative">\n <button (click)="toggleDropdown()" [class]="triggerClass()" type="button">\n <span class="uppercase">{{ (currentLang()) }}</span>\n </button>\n\n <aif-dropdown [isOpen]="isOpen()" (close)="closeDropdown()"\n [className]="panelClass()">\n @if (isFront()) {\n @for(lang of cfg(); track lang.code) {\n <button type="button" class="block w-full text-left py-2 px-4 hover:bg-gray-100 dark:hover:bg-slate-800"\n [ngClass]="{\'text-primary font-semibold\': lang.code === currentLang()}"\n (click)="langs_setLang(lang.code); closeDropdown()">\n {{ lang.label }}\n </button>\n }\n } @else {\n <ul class="flex flex-col gap-1 pt-4 pb-3 border-b border-gray-200 dark:border-gray-800">\n @if(cfg()?.length) {\n @for(lang of cfg(); track lang.code) {\n <li>\n <button type="button" class="block w-full text-left py-2 px-4 hover:bg-gray-100 dark:hover:bg-slate-800"\n [ngClass]="{\'text-primary font-semibold\': lang.code === currentLang()}"\n (click)="langs_setLang(lang.code); closeDropdown()">\n {{ lang.label }}\n </button>\n </li>\n }\n }\n </ul>\n }\n </aif-dropdown>\n</div>\n}\n',styles:[""],dependencies:[{kind:"component",type:AifDropDown,selector:"aif-dropdown",inputs:["isOpen","className"],outputs:["close"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavLangDropDown,decorators:[{type:Component,args:[{selector:"aif-nav-lang-dropdown",imports:[AifDropDown,NgClass],template:'@if (cfg()) {\n<div class="relative">\n <button (click)="toggleDropdown()" [class]="triggerClass()" type="button">\n <span class="uppercase">{{ (currentLang()) }}</span>\n </button>\n\n <aif-dropdown [isOpen]="isOpen()" (close)="closeDropdown()"\n [className]="panelClass()">\n @if (isFront()) {\n @for(lang of cfg(); track lang.code) {\n <button type="button" class="block w-full text-left py-2 px-4 hover:bg-gray-100 dark:hover:bg-slate-800"\n [ngClass]="{\'text-primary font-semibold\': lang.code === currentLang()}"\n (click)="langs_setLang(lang.code); closeDropdown()">\n {{ lang.label }}\n </button>\n }\n } @else {\n <ul class="flex flex-col gap-1 pt-4 pb-3 border-b border-gray-200 dark:border-gray-800">\n @if(cfg()?.length) {\n @for(lang of cfg(); track lang.code) {\n <li>\n <button type="button" class="block w-full text-left py-2 px-4 hover:bg-gray-100 dark:hover:bg-slate-800"\n [ngClass]="{\'text-primary font-semibold\': lang.code === currentLang()}"\n (click)="langs_setLang(lang.code); closeDropdown()">\n {{ lang.label }}\n </button>\n </li>\n }\n }\n </ul>\n }\n </aif-dropdown>\n</div>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],variant:[{type:i0.Input,args:[{isSignal:!0,alias:"variant",required:!1}]}]}});class AifNavUserDropDown{static nextId=0;built=!1;dropdowns=inject(AifNavDropdownService);dropdownId="aif-nav-user-dropdown-"+ ++AifNavUserDropDown.nextId;config=input(null,...ngDevMode?[{debugName:"config"}]:[]);variant=input("back",...ngDevMode?[{debugName:"variant"}]:[]);cfg=signal(null,...ngDevMode?[{debugName:"cfg"}]:[]);avatar=computed(()=>this.cfg()?.avatar||"",...ngDevMode?[{debugName:"avatar"}]:[]);name=computed(()=>this.cfg()?.name||"",...ngDevMode?[{debugName:"name"}]:[]);email=computed(()=>this.cfg()?.email||"",...ngDevMode?[{debugName:"email"}]:[]);dropdown=computed(()=>this.cfg()?.dropdown||[],...ngDevMode?[{debugName:"dropdown"}]:[]);isOpen=computed(()=>this.dropdowns.isActive(this.dropdownId),...ngDevMode?[{debugName:"isOpen"}]:[]);isFront=computed(()=>"front"===this.variant(),...ngDevMode?[{debugName:"isFront"}]:[]);buttonClass=computed(()=>this.isFront()?"dropdown-toggle relative inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-full align-middle leading-none transition-transform duration-300 hover:scale-[1.03] focus:outline-none":"dropdown-toggle flex items-center text-gray-700 dark:text-gray-400",...ngDevMode?[{debugName:"buttonClass"}]:[]);avatarWrapperClass=computed(()=>this.isFront()?"block size-10 overflow-hidden rounded-full border-2 border-white/80 shadow-sm dark:border-slate-700/80":"mr-3 h-11 w-11 overflow-hidden rounded-full",...ngDevMode?[{debugName:"avatarWrapperClass"}]:[]);avatarImageClass=computed(()=>(this.isFront(),"block size-full object-cover"),...ngDevMode?[{debugName:"avatarImageClass"}]:[]);arrowClass=computed(()=>this.isFront()?"stroke-white transition-transform duration-200":"stroke-gray-500 dark:stroke-gray-400 transition-transform duration-200",...ngDevMode?[{debugName:"arrowClass"}]:[]);panelClass=computed(()=>this.isFront()?"absolute end-1 m-0 mt-3 z-10 w-48 rounded-2xl overflow-hidden bg-white dark:bg-slate-900 shadow-sm dark:shadow-gray-800":"absolute right-0 mt-[17px] flex w-[260px] flex-col rounded-2xl border border-gray-200 bg-white p-3 shadow-theme-lg dark:border-gray-800 dark:bg-gray-dark",...ngDevMode?[{debugName:"panelClass"}]:[]);ngOnInit(){this.config()&&this.build(this.config())}reBuild(e){this.built=!1,this.build(e)}build(e){this.built||(this.cfg.set(e),this.built=!0)}toggleDropdown(){this.dropdowns.toggle(this.dropdownId)}closeDropdown(){this.dropdowns.close(this.dropdownId)}onItemClick(e){e?.click?.(),this.closeDropdown()}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavUserDropDown,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavUserDropDown,isStandalone:!0,selector:"aif-nav-user-dropdown",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},variant:{classPropertyName:"variant",publicName:"variant",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (cfg()) {\n<div class="relative">\n <button type="button" (click)="toggleDropdown()" [class]="buttonClass()">\n <span [class]="avatarWrapperClass()">\n <img [src]="avatar()" [class]="avatarImageClass()" alt="User" />\n </span>\n @if (!isFront()) {\n <span class="mr-1 block font-medium text-theme-sm">{{ name() }}</span>\n }\n @if (!isFront()) {\n <svg [class]="arrowClass()" [class.rotate-180]="isOpen()" width="18" height="20" viewBox="0 0 18 20"\n fill="none" xmlns="http://www.w3.org/2000/svg">\n <path d="M4.3125 8.65625L9 13.3437L13.6875 8.65625" stroke="currentColor" stroke-width="1.5"\n stroke-linecap="round" stroke-linejoin="round" />\n </svg>\n }\n </button>\n\n <aif-dropdown [isOpen]="isOpen()" (close)="closeDropdown()" [className]="panelClass()">\n @if (isFront()) {\n <div class="relative">\n <div class="bg-gradient-to-tr from-primary to-red-600 py-8"></div>\n <div class="absolute start-0 -bottom-7 px-4">\n <div class="flex items-end">\n <img [src]="avatar()" class="size-10 rounded-full shadow-sm dark:shadow-gray-700" alt="User">\n <span class="ms-1 text-[15px] font-semibold">{{ name() }}</span>\n </div>\n </div>\n </div>\n\n <div class="mt-10 px-4">\n @if (email()) {\n <span class="block text-xs text-gray-500 dark:text-gray-400">{{ email() }}</span>\n }\n </div>\n\n <ul class="py-2 text-start">\n @if(dropdown().length) {\n @for (item of dropdown(); track $index) {\n @if (item.route) {\n <li>\n <a [routerLink]="item?.route" (click)="closeDropdown()"\n class="block px-4 py-1.5 text-[14px] font-semibold hover:text-primary">\n <i class="{{ item.icon ? item.icon : \'\' }} me-1 align-middle text-[16px]"></i>\n {{ item.label }}\n </a>\n </li>\n } @else if (typeof item.click === \'function\') {\n <li>\n <a (click)="onItemClick(item)"\n class="block cursor-pointer px-4 py-1.5 text-[14px] font-semibold hover:text-primary">\n <i class="{{ item.icon ? item.icon : \'\' }} me-1 align-middle text-[16px]"></i>\n {{ item.label }}\n </a>\n </li>\n } @else if(item.type ==\'divider\') {\n <li class="my-2 border-t border-gray-100 dark:border-gray-800"> </li>\n }\n }\n }\n </ul>\n } @else {\n <div>\n <span class="block font-medium text-gray-700 text-theme-sm dark:text-gray-400">\n {{ name() }}\n </span>\n <span class="mt-0.5 block text-theme-xs text-gray-500 dark:text-gray-400">\n {{ email() }}\n </span>\n </div>\n\n <ul class="flex flex-col gap-1 pt-4 pb-3 border-b border-gray-200 dark:border-gray-800">\n @if(dropdown().length) {\n @for (item of dropdown(); track $index) {\n @if (item.route) {\n <li>\n <a (click)="closeDropdown()" [routerLink]="item?.route"\n class="flex items-center gap-3 px-3 py-2 font-medium rounded-lg group text-[14px] font-semibold hover:text-primary cursor-pointer">\n <i class="{{ item.icon? item.icon : \'\' }} align-middle me-1"></i>\n {{ item.label }}\n </a>\n </li>\n } @else if (typeof item.click === \'function\') {\n <li>\n <a (click)="onItemClick(item)"\n class="flex items-center gap-3 px-3 py-2 font-medium rounded-lg group text-[14px] font-semibold hover:text-primary cursor-pointer">\n <i class="{{ item.icon? item.icon : \'\' }} align-middle me-1"></i> {{ item.label }}\n </a>\n </li>\n } @else if(item.type ==\'divider\') {\n <li class="border-t border-gray-200 dark:border-gray-600 my-2"> </li>\n }\n }\n }\n </ul>\n }\n </aif-dropdown>\n</div>\n}\n',styles:[""],dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]},{kind:"component",type:AifDropDown,selector:"aif-dropdown",inputs:["isOpen","className"],outputs:["close"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavUserDropDown,decorators:[{type:Component,args:[{selector:"aif-nav-user-dropdown",imports:[RouterLink,AifDropDown],template:'@if (cfg()) {\n<div class="relative">\n <button type="button" (click)="toggleDropdown()" [class]="buttonClass()">\n <span [class]="avatarWrapperClass()">\n <img [src]="avatar()" [class]="avatarImageClass()" alt="User" />\n </span>\n @if (!isFront()) {\n <span class="mr-1 block font-medium text-theme-sm">{{ name() }}</span>\n }\n @if (!isFront()) {\n <svg [class]="arrowClass()" [class.rotate-180]="isOpen()" width="18" height="20" viewBox="0 0 18 20"\n fill="none" xmlns="http://www.w3.org/2000/svg">\n <path d="M4.3125 8.65625L9 13.3437L13.6875 8.65625" stroke="currentColor" stroke-width="1.5"\n stroke-linecap="round" stroke-linejoin="round" />\n </svg>\n }\n </button>\n\n <aif-dropdown [isOpen]="isOpen()" (close)="closeDropdown()" [className]="panelClass()">\n @if (isFront()) {\n <div class="relative">\n <div class="bg-gradient-to-tr from-primary to-red-600 py-8"></div>\n <div class="absolute start-0 -bottom-7 px-4">\n <div class="flex items-end">\n <img [src]="avatar()" class="size-10 rounded-full shadow-sm dark:shadow-gray-700" alt="User">\n <span class="ms-1 text-[15px] font-semibold">{{ name() }}</span>\n </div>\n </div>\n </div>\n\n <div class="mt-10 px-4">\n @if (email()) {\n <span class="block text-xs text-gray-500 dark:text-gray-400">{{ email() }}</span>\n }\n </div>\n\n <ul class="py-2 text-start">\n @if(dropdown().length) {\n @for (item of dropdown(); track $index) {\n @if (item.route) {\n <li>\n <a [routerLink]="item?.route" (click)="closeDropdown()"\n class="block px-4 py-1.5 text-[14px] font-semibold hover:text-primary">\n <i class="{{ item.icon ? item.icon : \'\' }} me-1 align-middle text-[16px]"></i>\n {{ item.label }}\n </a>\n </li>\n } @else if (typeof item.click === \'function\') {\n <li>\n <a (click)="onItemClick(item)"\n class="block cursor-pointer px-4 py-1.5 text-[14px] font-semibold hover:text-primary">\n <i class="{{ item.icon ? item.icon : \'\' }} me-1 align-middle text-[16px]"></i>\n {{ item.label }}\n </a>\n </li>\n } @else if(item.type ==\'divider\') {\n <li class="my-2 border-t border-gray-100 dark:border-gray-800"> </li>\n }\n }\n }\n </ul>\n } @else {\n <div>\n <span class="block font-medium text-gray-700 text-theme-sm dark:text-gray-400">\n {{ name() }}\n </span>\n <span class="mt-0.5 block text-theme-xs text-gray-500 dark:text-gray-400">\n {{ email() }}\n </span>\n </div>\n\n <ul class="flex flex-col gap-1 pt-4 pb-3 border-b border-gray-200 dark:border-gray-800">\n @if(dropdown().length) {\n @for (item of dropdown(); track $index) {\n @if (item.route) {\n <li>\n <a (click)="closeDropdown()" [routerLink]="item?.route"\n class="flex items-center gap-3 px-3 py-2 font-medium rounded-lg group text-[14px] font-semibold hover:text-primary cursor-pointer">\n <i class="{{ item.icon? item.icon : \'\' }} align-middle me-1"></i>\n {{ item.label }}\n </a>\n </li>\n } @else if (typeof item.click === \'function\') {\n <li>\n <a (click)="onItemClick(item)"\n class="flex items-center gap-3 px-3 py-2 font-medium rounded-lg group text-[14px] font-semibold hover:text-primary cursor-pointer">\n <i class="{{ item.icon? item.icon : \'\' }} align-middle me-1"></i> {{ item.label }}\n </a>\n </li>\n } @else if(item.type ==\'divider\') {\n <li class="border-t border-gray-200 dark:border-gray-600 my-2"> </li>\n }\n }\n }\n </ul>\n }\n </aif-dropdown>\n</div>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],variant:[{type:i0.Input,args:[{isSignal:!0,alias:"variant",required:!1}]}]}});class AifNavSearch{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);variant=input("back",...ngDevMode?[{debugName:"variant"}]:[]);submitted=output();builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);term=signal("",...ngDevMode?[{debugName:"term"}]:[]);state=computed(()=>{const e=AifNavSearch.config(this.variant()),t=this.config(),n=this.builtConfig(),i=n??t;return{...e,...t??{},...n??{},value:i?.value??""}},...ngDevMode?[{debugName:"state"}]:[]);ngOnInit(){this.term.set(this.state().value||"")}build(e){this.builtConfig.set(e),this.term.set(e?.value||"")}reBuild(e){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.term.set(this.config()?.value||"")}onInput(e){this.term.set(e.target.value)}submit(e){e?.preventDefault();const t=this.term();this.state().submit?.(t,e),this.submitted.emit(t)}static config(e="back"){return{placeholder:"front"===e?"Buscar...":"Search or type command…",icon:"aif aif-search-alt-ico",id:"front"===e?"front-nav-search":"back-nav-search",value:"",shortcut:"back"===e?"⌘ K":""}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavSearch,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavSearch,isStandalone:!0,selector:"aif-nav-search",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},variant:{classPropertyName:"variant",publicName:"variant",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{submitted:"submitted"},ngImport:i0,template:'@if (state(); as vm) {\n@if (variant() === \'front\') {\n<div class="form-icon relative">\n <i [class]="vm.icon" class="absolute top-1/2 -translate-y-1/2 start-3"></i>\n <input type="text" [value]="term()" (input)="onInput($event)" (keyup.enter)="submit($event)"\n class="form-input sm:w-44 w-28 ps-10 py-2 px-3 h-10 dark:bg-slate-900 dark:text-slate-200 rounded-3xl outline-none border border-gray-200 focus:border-primary dark:border-gray-800 dark:focus:border-primary focus:ring-0 bg-white"\n [name]="vm.id || \'front-nav-search\'" [id]="vm.id || \'front-nav-search\'" [placeholder]="vm.placeholder || \'\'">\n</div>\n} @else {\n<form (submit)="submit($event)">\n <div class="relative">\n <i [class]="vm.icon"\n class="pointer-events-none absolute left-4 top-1/2 -translate-y-1/2 text-gray-400 dark:text-gray-500"></i>\n <input type="text" [value]="term()" (input)="onInput($event)" [placeholder]="vm.placeholder || \'\'"\n [name]="vm.id || \'back-nav-search\'" [id]="vm.id || \'back-nav-search\'" class="dark:bg-dark-900 h-11 w-full rounded-lg border border-gray-200\n bg-transparent py-2.5 pl-12 pr-14 text-sm text-gray-800\n shadow-theme-xs placeholder:text-gray-400\n focus:border-brand-300 focus:outline-hidden focus:ring-3\n focus:ring-brand-500/10 dark:border-gray-800 dark:bg-gray-900\n dark:bg-white/[0.03] dark:text-white/90\n dark:placeholder:text-white/30 dark:focus:border-brand-800\n xl:w-[430px]" />\n @if (vm.shortcut) {\n <button type="submit" class="absolute right-2.5 top-1/2 inline-flex -translate-y-1/2\n items-center gap-0.5 rounded-lg border border-gray-200\n bg-gray-50 px-[7px] py-[4.5px] text-xs -tracking-[0.2px]\n text-gray-500 dark:border-gray-800 dark:bg-white/[0.03]\n dark:text-gray-400">\n {{ vm.shortcut }}\n </button>\n } @else {\n <button type="submit"\n class="absolute right-2.5 top-1/2 inline-flex -translate-y-1/2 rounded-lg px-2 py-1 text-xs text-gray-500 dark:text-gray-400">\n Ir\n </button>\n }\n </div>\n</form>\n}\n}\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavSearch,decorators:[{type:Component,args:[{selector:"aif-nav-search",standalone:!0,template:'@if (state(); as vm) {\n@if (variant() === \'front\') {\n<div class="form-icon relative">\n <i [class]="vm.icon" class="absolute top-1/2 -translate-y-1/2 start-3"></i>\n <input type="text" [value]="term()" (input)="onInput($event)" (keyup.enter)="submit($event)"\n class="form-input sm:w-44 w-28 ps-10 py-2 px-3 h-10 dark:bg-slate-900 dark:text-slate-200 rounded-3xl outline-none border border-gray-200 focus:border-primary dark:border-gray-800 dark:focus:border-primary focus:ring-0 bg-white"\n [name]="vm.id || \'front-nav-search\'" [id]="vm.id || \'front-nav-search\'" [placeholder]="vm.placeholder || \'\'">\n</div>\n} @else {\n<form (submit)="submit($event)">\n <div class="relative">\n <i [class]="vm.icon"\n class="pointer-events-none absolute left-4 top-1/2 -translate-y-1/2 text-gray-400 dark:text-gray-500"></i>\n <input type="text" [value]="term()" (input)="onInput($event)" [placeholder]="vm.placeholder || \'\'"\n [name]="vm.id || \'back-nav-search\'" [id]="vm.id || \'back-nav-search\'" class="dark:bg-dark-900 h-11 w-full rounded-lg border border-gray-200\n bg-transparent py-2.5 pl-12 pr-14 text-sm text-gray-800\n shadow-theme-xs placeholder:text-gray-400\n focus:border-brand-300 focus:outline-hidden focus:ring-3\n focus:ring-brand-500/10 dark:border-gray-800 dark:bg-gray-900\n dark:bg-white/[0.03] dark:text-white/90\n dark:placeholder:text-white/30 dark:focus:border-brand-800\n xl:w-[430px]" />\n @if (vm.shortcut) {\n <button type="submit" class="absolute right-2.5 top-1/2 inline-flex -translate-y-1/2\n items-center gap-0.5 rounded-lg border border-gray-200\n bg-gray-50 px-[7px] py-[4.5px] text-xs -tracking-[0.2px]\n text-gray-500 dark:border-gray-800 dark:bg-white/[0.03]\n dark:text-gray-400">\n {{ vm.shortcut }}\n </button>\n } @else {\n <button type="submit"\n class="absolute right-2.5 top-1/2 inline-flex -translate-y-1/2 rounded-lg px-2 py-1 text-xs text-gray-500 dark:text-gray-400">\n Ir\n </button>\n }\n </div>\n</form>\n}\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],variant:[{type:i0.Input,args:[{isSignal:!0,alias:"variant",required:!1}]}],submitted:[{type:i0.Output,args:["submitted"]}]}});class AifFrontNavHeader{router=inject(Router);_sb1;_sb2;removeScrollListener;scrollFrame=0;built=!1;config=input(null,...ngDevMode?[{debugName:"config"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);state=computed(()=>{const e=AifFrontNavHeader.config(),t=this.config(),n=this.builtConfig(),i=n??t;return{...e,...t??{},...n??{},data:i?.data??e.data,logo:i?.logo??e.logo,btns:i?.btns??e.btns,search:i?.search??e.search,surface:i?.surface??e.surface}},...ngDevMode?[{debugName:"state"}]:[]);logo=computed(()=>this.state().logo,...ngDevMode?[{debugName:"logo"}]:[]);btns=computed(()=>this.state().btns,...ngDevMode?[{debugName:"btns"}]:[]);search=computed(()=>this.state().search,...ngDevMode?[{debugName:"search"}]:[]);isSolidSurface=computed(()=>"transparent"!==this.state().surface,...ngDevMode?[{debugName:"isSolidSurface"}]:[]);nav_items=signal([],...ngDevMode?[{debugName:"nav_items"}]:[]);nav_lang=signal([],...ngDevMode?[{debugName:"nav_lang"}]:[]);nav_user=signal(null,...ngDevMode?[{debugName:"nav_user"}]:[]);activeItemMap=signal({},...ngDevMode?[{debugName:"activeItemMap"}]:[]);expandedItemMap=signal({},...ngDevMode?[{debugName:"expandedItemMap"}]:[]);status=signal(!1,...ngDevMode?[{debugName:"status"}]:[]);isSticky=signal(!1,...ngDevMode?[{debugName:"isSticky"}]:[]);ngOnInit(){this.calculateActiveState(this.router.url,this.nav_items()),this.bindScrollState(),this.updateStickyState(),this._sb1=this.router.events.subscribe(e=>{e instanceof NavigationEnd&&(this.calculateActiveState(e.urlAfterRedirects||e.url,this.nav_items()),this.closeMenu())}),window.scrollTo(0,0),this._sb2=lang_subscribe("change",()=>{this.loadNavItems()});const e=this.config();e&&this.reBuild(e)}ngOnDestroy(){this._sb1?.unsubscribe(),this._sb2?.unsubscribe(),this.scrollFrame&&cancelAnimationFrame(this.scrollFrame),this.removeScrollListener?.()}calculateActiveState(e,t){const n={},i=(e,t)=>{let a=!1;for(const s of t){let t=!1;t=(s.matchRoutes??(s.route?[s.route]:[])).some(t=>{if(!t)return!1;const n=e.split("?")[0].split("#")[0];return n===t||n.startsWith(t+"/")});let o=!1;if(s.children&&s.children.length>0&&i(e,s.children)&&(o=!0),s.categories)for(const t of s.categories)t.items&&i(e,t.items)&&(o=!0);(t||o)&&(n[s.id]=!0,a=!0)}return a};return i(e,t),this.activeItemMap.set(n),Object.keys(n).length>0}toggleItem(e){this.expandedItemMap.update(t=>({...t,[e]:!t[e]}))}closeMenu(e){e&&e.stopPropagation(),this.status.set(!1),this.expandedItemMap.set({})}reBuild(e){return this.resetToInput(),this.build(e)}build(e=null){return this.built?Promise.resolve(!0):(this.built=!0,e&&this.builtConfig.set(this.normalizeConfig(e)),new Promise(e=>{this.loadNavItems(t=>{e(t)})}))}resetToInput(){this.built=!1,this.builtConfig.set(null)}setUser(e){this.nav_user.set(e)}loadNavItems(e){const t="function"==typeof e,n=this.state();if(!n)return void(t&&e(!1));if(n.data)return this.nav_items.set(n.data.nav||[]),this.nav_lang.set(n.data.lang||[]),this.calculateActiveState(this.router.url,n.data.nav||[]),void(t&&e(!0));const i=n?.resource;if(!i)return void(t&&e(!1));const a=str_replace_vars(i||"",{lang:lang()}),s=a.includes(".json")||a.startsWith("assets/")||a.startsWith("./")||a.startsWith("../")||a.startsWith("http");(s?wHttp(a):rq_get(a)).then(t=>{const n=s?t:t?.data||t||{};this.nav_items.set(n.nav||[]),this.nav_lang.set(n.lang||[]),this.calculateActiveState(this.router.url,n.nav||[]),"function"==typeof e&&e(!0)}).catch(()=>{this.nav_items.set([]),this.nav_lang.set([]),"function"==typeof e&&e(!1)})}nav_toggle(){this.status.update(e=>!e)}bindScrollState(){const e=()=>{this.scrollFrame||(this.scrollFrame=requestAnimationFrame(()=>{this.updateStickyState(),this.scrollFrame=0}))};window.addEventListener("scroll",e,{passive:!0}),this.removeScrollListener=()=>window.removeEventListener("scroll",e)}updateStickyState(){const e=window.scrollY||document.documentElement.scrollTop||document.body.scrollTop||0;this.isSticky.set(e>=50)}normalizeConfig(e){return{...e,showUser:"boolean"!=typeof e.showUser||e.showUser}}static config(e={}){return{showUser:!0,surface:"transparent",...e}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFrontNavHeader,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFrontNavHeader,isStandalone:!0,selector:"aif-front-nav-header",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (state(); as vm) {\n<nav id="topnav" class="defaultscroll is-sticky" [class.nav-sticky]="isSolidSurface() || isSticky()">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n \x3c!-- Logo --\x3e\n @if (vm.logo) {\n <aif-nav-logo [cfg]="vm.logo" surface="front-nav"></aif-nav-logo>\n }\n \x3c!-- End Logo --\x3e\n\n \x3c!-- Mobile menu toggle--\x3e\n @if (nav_items().length > 0) {\n <div class="menu-extras">\n <div class="menu-item">\n <a class="navbar-toggle" id="isToggle" [ngClass]="{\'open\': status()}" (click)="nav_toggle()">\n <div class="lines">\n <span></span>\n <span></span>\n <span></span>\n </div>\n </a>\n </div>\n </div>\n }\n \x3c!-- End Mobile menu toggle--\x3e\n\n\n <ul class="buy-button list-none mb-0">\n \x3c!-- Search --\x3e\n @if (vm.search) {\n <li class="inline-block mb-0">\n <aif-nav-search [config]="vm.search" variant="front" />\n </li>\n }\n \x3c!-- End Search --\x3e\n\n \x3c!-- Buy Button --\x3e\n @if (vm.btns) {\n @for (btn of vm.btns; track $index) {\n @switch (btn.type) {\n @case (\'divider\') {\n <li class="inline-block ps-1 mb-0">\n <div class="divider h-px my-4 bg-gray-200 dark:bg-gray-700"></div>\n </li>\n }\n @default {\n <li class="inline-block ps-1 mb-0">\n <aif-nav-action-button [route]="btn.route || \'/\'" [title]="btn.title || \'\'" variant="front-circle">\n <i class="{{ btn.icon }}"></i>\n </aif-nav-action-button>\n </li>\n }\n }\n }\n }\n \x3c!-- End Buy Button --\x3e\n\n \x3c!-- Language --\x3e\n @if (nav_lang() ) {\n <li class="dropdown inline-block relative ps-1">\n <aif-nav-lang-dropdown [config]="nav_lang()" variant="front" />\n </li>\n }\n \x3c!-- End Language --\x3e\n\n \x3c!-- User Menu --\x3e\n @if(vm.showUser) {\n @if(nav_user()) {\n <li class="dropdown inline-block relative ps-1">\n <aif-nav-user-dropdown [config]="nav_user()" variant="front" />\n </li>\n } @else {\n <li class="dropdown inline-block relative ps-1">\n <aif-nav-action-button route="/auth-login" title="Login" variant="front-circle">\n <i class="aif aif-user-ico align-middle text-lg"></i>\n </aif-nav-action-button>\n </li>\n }\n }\n </ul>\n \x3c!--Login button End--\x3e\n\n\n \x3c!--Navigation Menu--\x3e\n @if(nav_items().length > 0) {\n <div id="navigation" [style]="status() ? \'display: block;\' : \'display: none;\'">\n <ul class="navigation-menu nav-light">\n @for (item of nav_items(); track item.id) {\n <ng-container *ngTemplateOutlet="menuNode; context:{ item: item, level: 0 }"></ng-container>\n }\n </ul>\n </div>\x3c!--end navigation--\x3e\n }\n </div>\n\n</nav>\n}\n\n\x3c!-- Recursive Menu Template --\x3e\n<ng-template #menuNode let-item="item" let-level="level">\n\n \x3c!-- LINK SIMPLE --\x3e\n @if (item.type === \'link\') {\n <li [class.active]="!!activeItemMap()[item.id]">\n <a [routerLink]="item.route" class="sub-menu-item" (click)="closeMenu($event)">\n {{ item.label }}\n </a>\n </li>\n }\n\n @else if (item.type === \'megamenu\') {\n <li class="has-submenu parent-parent-menu-item" [class.active]="!!activeItemMap()[item.id]"\n [class.open]="!!expandedItemMap()[item.id]">\n\n <a href="javascript:void(0)" (click)="toggleItem(item.id)">{{ item.label }}</a>\n <span class="menu-arrow"></span>\n\n <div class="submenu megamenu ..." [class.open]="!!expandedItemMap()[item.id]">\n ...\n </div>\n </li>\n }\n\n @else if (item.type === \'submenu\') {\n <li class="has-submenu" [class.active]="!!activeItemMap()[item.id]" [class.open]="!!expandedItemMap()[item.id]"\n [ngClass]="{\'parent-menu-item\': level > 0, \'parent-parent-menu-item\': level === 0}">\n\n <a href="javascript:void(0)" (click)="toggleItem(item.id)">\n {{ item.label }}\n </a>\n\n <span class="" [ngClass]="{\'menu-arrow\': level === 0, \'submenu-arrow\': level > 0}"></span>\n\n <ul class="submenu" [class.open]="!!expandedItemMap()[item.id]">\n @for (child of item.children ?? []; track child.id) {\n <ng-container *ngTemplateOutlet="menuNode; context:{ item: child, level: level + 1 }"></ng-container>\n }\n </ul>\n </li>\n }\n\n \x3c!-- FALLBACK to simple link if type is missing but has route --\x3e\n @else if (item.route) {\n <li [class.active]="!!activeItemMap()[item.id]">\n <a [routerLink]="item.route" class="sub-menu-item" (click)="closeMenu($event)">\n {{ item.label }}\n </a>\n </li>\n }\n</ng-template>\n',styles:['.has-submenu>.submenu,.has-submenu>.megamenu{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .2s ease}.has-submenu.open>.submenu,.has-submenu.open>.megamenu{opacity:1;visibility:visible;pointer-events:auto}@media(min-width:992px){.has-submenu:hover>.submenu,.has-submenu:hover>.megamenu{opacity:1;visibility:visible;pointer-events:auto}.has-submenu{position:relative}.has-submenu:after{content:"";position:absolute;top:0;left:100%;width:18px;height:100%;pointer-events:auto}.has-submenu>.submenu{position:absolute;top:0;left:calc(100% - 2px)}}.has-submenu>a{position:relative}.submenu-arrow{position:absolute;left:calc(100% - 14px);top:50%;width:6px;height:6px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;pointer-events:none;transition:transform .18s ease,opacity .18s ease}@media(min-width:992px){li.has-submenu:hover>a+.submenu-arrow{opacity:1;transform:rotate(180deg)}}\n'],dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:NgTemplateOutlet,selector:"[ngTemplateOutlet]",inputs:["ngTemplateOutletContext","ngTemplateOutlet","ngTemplateOutletInjector"]},{kind:"component",type:AifNavActionButton,selector:"aif-nav-action-button",inputs:["route","title","ariaLabel","variant","active","extraClass"],outputs:["clicked"]},{kind:"component",type:AifNavLogo,selector:"aif-nav-logo",inputs:["cfg","surface"]},{kind:"component",type:AifNavLangDropDown,selector:"aif-nav-lang-dropdown",inputs:["config","variant"]},{kind:"component",type:AifNavUserDropDown,selector:"aif-nav-user-dropdown",inputs:["config","variant"]},{kind:"component",type:AifNavSearch,selector:"aif-nav-search",inputs:["config","variant"],outputs:["submitted"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFrontNavHeader,decorators:[{type:Component,args:[{selector:"aif-front-nav-header",standalone:!0,imports:[RouterLink,NgClass,NgTemplateOutlet,AifNavActionButton,AifNavLogo,AifNavLangDropDown,AifNavUserDropDown,AifNavSearch],template:'@if (state(); as vm) {\n<nav id="topnav" class="defaultscroll is-sticky" [class.nav-sticky]="isSolidSurface() || isSticky()">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n \x3c!-- Logo --\x3e\n @if (vm.logo) {\n <aif-nav-logo [cfg]="vm.logo" surface="front-nav"></aif-nav-logo>\n }\n \x3c!-- End Logo --\x3e\n\n \x3c!-- Mobile menu toggle--\x3e\n @if (nav_items().length > 0) {\n <div class="menu-extras">\n <div class="menu-item">\n <a class="navbar-toggle" id="isToggle" [ngClass]="{\'open\': status()}" (click)="nav_toggle()">\n <div class="lines">\n <span></span>\n <span></span>\n <span></span>\n </div>\n </a>\n </div>\n </div>\n }\n \x3c!-- End Mobile menu toggle--\x3e\n\n\n <ul class="buy-button list-none mb-0">\n \x3c!-- Search --\x3e\n @if (vm.search) {\n <li class="inline-block mb-0">\n <aif-nav-search [config]="vm.search" variant="front" />\n </li>\n }\n \x3c!-- End Search --\x3e\n\n \x3c!-- Buy Button --\x3e\n @if (vm.btns) {\n @for (btn of vm.btns; track $index) {\n @switch (btn.type) {\n @case (\'divider\') {\n <li class="inline-block ps-1 mb-0">\n <div class="divider h-px my-4 bg-gray-200 dark:bg-gray-700"></div>\n </li>\n }\n @default {\n <li class="inline-block ps-1 mb-0">\n <aif-nav-action-button [route]="btn.route || \'/\'" [title]="btn.title || \'\'" variant="front-circle">\n <i class="{{ btn.icon }}"></i>\n </aif-nav-action-button>\n </li>\n }\n }\n }\n }\n \x3c!-- End Buy Button --\x3e\n\n \x3c!-- Language --\x3e\n @if (nav_lang() ) {\n <li class="dropdown inline-block relative ps-1">\n <aif-nav-lang-dropdown [config]="nav_lang()" variant="front" />\n </li>\n }\n \x3c!-- End Language --\x3e\n\n \x3c!-- User Menu --\x3e\n @if(vm.showUser) {\n @if(nav_user()) {\n <li class="dropdown inline-block relative ps-1">\n <aif-nav-user-dropdown [config]="nav_user()" variant="front" />\n </li>\n } @else {\n <li class="dropdown inline-block relative ps-1">\n <aif-nav-action-button route="/auth-login" title="Login" variant="front-circle">\n <i class="aif aif-user-ico align-middle text-lg"></i>\n </aif-nav-action-button>\n </li>\n }\n }\n </ul>\n \x3c!--Login button End--\x3e\n\n\n \x3c!--Navigation Menu--\x3e\n @if(nav_items().length > 0) {\n <div id="navigation" [style]="status() ? \'display: block;\' : \'display: none;\'">\n <ul class="navigation-menu nav-light">\n @for (item of nav_items(); track item.id) {\n <ng-container *ngTemplateOutlet="menuNode; context:{ item: item, level: 0 }"></ng-container>\n }\n </ul>\n </div>\x3c!--end navigation--\x3e\n }\n </div>\n\n</nav>\n}\n\n\x3c!-- Recursive Menu Template --\x3e\n<ng-template #menuNode let-item="item" let-level="level">\n\n \x3c!-- LINK SIMPLE --\x3e\n @if (item.type === \'link\') {\n <li [class.active]="!!activeItemMap()[item.id]">\n <a [routerLink]="item.route" class="sub-menu-item" (click)="closeMenu($event)">\n {{ item.label }}\n </a>\n </li>\n }\n\n @else if (item.type === \'megamenu\') {\n <li class="has-submenu parent-parent-menu-item" [class.active]="!!activeItemMap()[item.id]"\n [class.open]="!!expandedItemMap()[item.id]">\n\n <a href="javascript:void(0)" (click)="toggleItem(item.id)">{{ item.label }}</a>\n <span class="menu-arrow"></span>\n\n <div class="submenu megamenu ..." [class.open]="!!expandedItemMap()[item.id]">\n ...\n </div>\n </li>\n }\n\n @else if (item.type === \'submenu\') {\n <li class="has-submenu" [class.active]="!!activeItemMap()[item.id]" [class.open]="!!expandedItemMap()[item.id]"\n [ngClass]="{\'parent-menu-item\': level > 0, \'parent-parent-menu-item\': level === 0}">\n\n <a href="javascript:void(0)" (click)="toggleItem(item.id)">\n {{ item.label }}\n </a>\n\n <span class="" [ngClass]="{\'menu-arrow\': level === 0, \'submenu-arrow\': level > 0}"></span>\n\n <ul class="submenu" [class.open]="!!expandedItemMap()[item.id]">\n @for (child of item.children ?? []; track child.id) {\n <ng-container *ngTemplateOutlet="menuNode; context:{ item: child, level: level + 1 }"></ng-container>\n }\n </ul>\n </li>\n }\n\n \x3c!-- FALLBACK to simple link if type is missing but has route --\x3e\n @else if (item.route) {\n <li [class.active]="!!activeItemMap()[item.id]">\n <a [routerLink]="item.route" class="sub-menu-item" (click)="closeMenu($event)">\n {{ item.label }}\n </a>\n </li>\n }\n</ng-template>\n',styles:['.has-submenu>.submenu,.has-submenu>.megamenu{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .2s ease}.has-submenu.open>.submenu,.has-submenu.open>.megamenu{opacity:1;visibility:visible;pointer-events:auto}@media(min-width:992px){.has-submenu:hover>.submenu,.has-submenu:hover>.megamenu{opacity:1;visibility:visible;pointer-events:auto}.has-submenu{position:relative}.has-submenu:after{content:"";position:absolute;top:0;left:100%;width:18px;height:100%;pointer-events:auto}.has-submenu>.submenu{position:absolute;top:0;left:calc(100% - 2px)}}.has-submenu>a{position:relative}.submenu-arrow{position:absolute;left:calc(100% - 14px);top:50%;width:6px;height:6px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;pointer-events:none;transition:transform .18s ease,opacity .18s ease}@media(min-width:992px){li.has-submenu:hover>a+.submenu-arrow{opacity:1;transform:rotate(180deg)}}\n']}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifThemeToggle{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);theme=inject(AifThemeService);state=computed(()=>{const e=this.builtConfig()??this.config()??{};return{variant:e.variant??"soft",size:e.size??"md",class:e.class??"",ariaLabelLight:e.ariaLabelLight??"Activar tema oscuro",ariaLabelDark:e.ariaLabelDark??"Activar tema claro"}},...ngDevMode?[{debugName:"state"}]:[]);sizeClass=computed(()=>{const e=this.state().size;return"sm"===e?"h-9 w-9":"lg"===e?"h-12 w-12":"h-11 w-11"},...ngDevMode?[{debugName:"sizeClass"}]:[]);buttonClass=computed(()=>{const e=this.state(),t="solid"===e.variant?"bg-slate-900 text-white border-slate-900 hover:bg-slate-800 dark:bg-white dark:text-slate-900 dark:border-white dark:hover:bg-slate-100":"bg-white text-gray-500 border-gray-200 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-900 dark:text-gray-400 dark:border-gray-800 dark:hover:bg-gray-800 dark:hover:text-white";return`relative flex items-center justify-center rounded-full border transition-colors ${this.sizeClass()} ${t} ${e.class}`.trim()},...ngDevMode?[{debugName:"buttonClass"}]:[]);ariaLabel=computed(()=>this.theme.isDark()?this.state().ariaLabelDark:this.state().ariaLabelLight,...ngDevMode?[{debugName:"ariaLabel"}]:[]);toggleTheme(){this.theme.toggle()}build(e){return this.builtConfig.set(e??null),this}reBuild(e){return this.builtConfig.set(null),this.build(e)}resetToInput(){return this.builtConfig.set(null),this}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeToggle,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifThemeToggle,isStandalone:!0,selector:"aif-theme-toggle",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<button type="button" (click)="toggleTheme()" [class]="buttonClass()" [attr.aria-label]="ariaLabel()">\n \x3c!-- Dark icon (moon) --\x3e\n @if (theme.isDark()) {\n <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M9.99998 1.5415C10.4142 1.5415 10.75 1.87729 10.75 2.2915V3.5415C10.75 3.95572 10.4142 4.2915 9.99998 4.2915C9.58577 4.2915 9.24998 3.95572 9.24998 3.5415V2.2915C9.24998 1.87729 9.58577 1.5415 9.99998 1.5415ZM10.0009 6.79327C8.22978 6.79327 6.79402 8.22904 6.79402 10.0001C6.79402 11.7712 8.22978 13.207 10.0009 13.207C11.772 13.207 13.2078 11.7712 13.2078 10.0001C13.2078 8.22904 11.772 6.79327 10.0009 6.79327ZM5.29402 10.0001C5.29402 7.40061 7.40135 5.29327 10.0009 5.29327C12.6004 5.29327 14.7078 7.40061 14.7078 10.0001C14.7078 12.5997 12.6004 14.707 10.0009 14.707C7.40135 14.707 5.29402 12.5997 5.29402 10.0001ZM15.9813 5.08035C16.2742 4.78746 16.2742 4.31258 15.9813 4.01969C15.6884 3.7268 15.2135 3.7268 14.9207 4.01969L14.0368 4.90357C13.7439 5.19647 13.7439 5.67134 14.0368 5.96423C14.3297 6.25713 14.8045 6.25713 15.0974 5.96423L15.9813 5.08035ZM18.4577 10.0001C18.4577 10.4143 18.1219 10.7501 17.7077 10.7501H16.4577C16.0435 10.7501 15.7077 10.4143 15.7077 10.0001C15.7077 9.58592 16.0435 9.25013 16.4577 9.25013H17.7077C18.1219 9.25013 18.4577 9.58592 18.4577 10.0001ZM14.9207 15.9806C15.2135 16.2735 15.6884 16.2735 15.9813 15.9806C16.2742 15.6877 16.2742 15.2128 15.9813 14.9199L15.0974 14.036C14.8045 13.7431 14.3297 13.7431 14.0368 14.036C13.7439 14.3289 13.7439 14.8038 14.0368 15.0967L14.9207 15.9806ZM9.99998 15.7088C10.4142 15.7088 10.75 16.0445 10.75 16.4588V17.7088C10.75 18.123 10.4142 18.4588 9.99998 18.4588C9.58577 18.4588 9.24998 18.123 9.24998 17.7088V16.4588C9.24998 16.0445 9.58577 15.7088 9.99998 15.7088ZM5.96356 15.0972C6.25646 14.8043 6.25646 14.3295 5.96356 14.0366C5.67067 13.7437 5.1958 13.7437 4.9029 14.0366L4.01902 14.9204C3.72613 15.2133 3.72613 15.6882 4.01902 15.9811C4.31191 16.274 4.78679 16.274 5.07968 15.9811L5.96356 15.0972ZM4.29224 10.0001C4.29224 10.4143 3.95645 10.7501 3.54224 10.7501H2.29224C1.87802 10.7501 1.54224 10.4143 1.54224 10.0001C1.54224 9.58592 1.87802 9.25013 2.29224 9.25013H3.54224C3.95645 9.25013 4.29224 9.58592 4.29224 10.0001ZM4.9029 5.9637C5.1958 6.25659 5.67067 6.25659 5.96356 5.9637C6.25646 5.6708 6.25646 5.19593 5.96356 4.90303L5.07968 4.01915C4.78679 3.72626 4.31191 3.72626 4.01902 4.01915C3.72613 4.31204 3.72613 4.78692 4.01902 5.07981L4.9029 5.9637Z"\n fill="currentColor" />\n </svg>\n } @else {\n <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path\n d="M17.4547 11.97L18.1799 12.1611C18.265 11.8383 18.1265 11.4982 17.8401 11.3266C17.5538 11.1551 17.1885 11.1934 16.944 11.4207L17.4547 11.97ZM8.0306 2.5459L8.57989 3.05657C8.80718 2.81209 8.84554 2.44682 8.67398 2.16046C8.50243 1.8741 8.16227 1.73559 7.83948 1.82066L8.0306 2.5459ZM12.9154 13.0035C9.64678 13.0035 6.99707 10.3538 6.99707 7.08524H5.49707C5.49707 11.1823 8.81835 14.5035 12.9154 14.5035V13.0035ZM16.944 11.4207C15.8869 12.4035 14.4721 13.0035 12.9154 13.0035V14.5035C14.8657 14.5035 16.6418 13.7499 17.9654 12.5193L16.944 11.4207ZM16.7295 11.7789C15.9437 14.7607 13.2277 16.9586 10.0003 16.9586V18.4586C13.9257 18.4586 17.2249 15.7853 18.1799 12.1611L16.7295 11.7789ZM10.0003 16.9586C6.15734 16.9586 3.04199 13.8433 3.04199 10.0003H1.54199C1.54199 14.6717 5.32892 18.4586 10.0003 18.4586V16.9586ZM3.04199 10.0003C3.04199 6.77289 5.23988 4.05695 8.22173 3.27114L7.83948 1.82066C4.21532 2.77574 1.54199 6.07486 1.54199 10.0003H3.04199ZM6.99707 7.08524C6.99707 5.52854 7.5971 4.11366 8.57989 3.05657L7.48132 2.03522C6.25073 3.35885 5.49707 5.13487 5.49707 7.08524H6.99707Z"\n fill="currentColor" />\n </svg>\n }\n</button>\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeToggle,decorators:[{type:Component,args:[{selector:"aif-theme-toggle",standalone:!0,imports:[],template:'<button type="button" (click)="toggleTheme()" [class]="buttonClass()" [attr.aria-label]="ariaLabel()">\n \x3c!-- Dark icon (moon) --\x3e\n @if (theme.isDark()) {\n <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M9.99998 1.5415C10.4142 1.5415 10.75 1.87729 10.75 2.2915V3.5415C10.75 3.95572 10.4142 4.2915 9.99998 4.2915C9.58577 4.2915 9.24998 3.95572 9.24998 3.5415V2.2915C9.24998 1.87729 9.58577 1.5415 9.99998 1.5415ZM10.0009 6.79327C8.22978 6.79327 6.79402 8.22904 6.79402 10.0001C6.79402 11.7712 8.22978 13.207 10.0009 13.207C11.772 13.207 13.2078 11.7712 13.2078 10.0001C13.2078 8.22904 11.772 6.79327 10.0009 6.79327ZM5.29402 10.0001C5.29402 7.40061 7.40135 5.29327 10.0009 5.29327C12.6004 5.29327 14.7078 7.40061 14.7078 10.0001C14.7078 12.5997 12.6004 14.707 10.0009 14.707C7.40135 14.707 5.29402 12.5997 5.29402 10.0001ZM15.9813 5.08035C16.2742 4.78746 16.2742 4.31258 15.9813 4.01969C15.6884 3.7268 15.2135 3.7268 14.9207 4.01969L14.0368 4.90357C13.7439 5.19647 13.7439 5.67134 14.0368 5.96423C14.3297 6.25713 14.8045 6.25713 15.0974 5.96423L15.9813 5.08035ZM18.4577 10.0001C18.4577 10.4143 18.1219 10.7501 17.7077 10.7501H16.4577C16.0435 10.7501 15.7077 10.4143 15.7077 10.0001C15.7077 9.58592 16.0435 9.25013 16.4577 9.25013H17.7077C18.1219 9.25013 18.4577 9.58592 18.4577 10.0001ZM14.9207 15.9806C15.2135 16.2735 15.6884 16.2735 15.9813 15.9806C16.2742 15.6877 16.2742 15.2128 15.9813 14.9199L15.0974 14.036C14.8045 13.7431 14.3297 13.7431 14.0368 14.036C13.7439 14.3289 13.7439 14.8038 14.0368 15.0967L14.9207 15.9806ZM9.99998 15.7088C10.4142 15.7088 10.75 16.0445 10.75 16.4588V17.7088C10.75 18.123 10.4142 18.4588 9.99998 18.4588C9.58577 18.4588 9.24998 18.123 9.24998 17.7088V16.4588C9.24998 16.0445 9.58577 15.7088 9.99998 15.7088ZM5.96356 15.0972C6.25646 14.8043 6.25646 14.3295 5.96356 14.0366C5.67067 13.7437 5.1958 13.7437 4.9029 14.0366L4.01902 14.9204C3.72613 15.2133 3.72613 15.6882 4.01902 15.9811C4.31191 16.274 4.78679 16.274 5.07968 15.9811L5.96356 15.0972ZM4.29224 10.0001C4.29224 10.4143 3.95645 10.7501 3.54224 10.7501H2.29224C1.87802 10.7501 1.54224 10.4143 1.54224 10.0001C1.54224 9.58592 1.87802 9.25013 2.29224 9.25013H3.54224C3.95645 9.25013 4.29224 9.58592 4.29224 10.0001ZM4.9029 5.9637C5.1958 6.25659 5.67067 6.25659 5.96356 5.9637C6.25646 5.6708 6.25646 5.19593 5.96356 4.90303L5.07968 4.01915C4.78679 3.72626 4.31191 3.72626 4.01902 4.01915C3.72613 4.31204 3.72613 4.78692 4.01902 5.07981L4.9029 5.9637Z"\n fill="currentColor" />\n </svg>\n } @else {\n <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path\n d="M17.4547 11.97L18.1799 12.1611C18.265 11.8383 18.1265 11.4982 17.8401 11.3266C17.5538 11.1551 17.1885 11.1934 16.944 11.4207L17.4547 11.97ZM8.0306 2.5459L8.57989 3.05657C8.80718 2.81209 8.84554 2.44682 8.67398 2.16046C8.50243 1.8741 8.16227 1.73559 7.83948 1.82066L8.0306 2.5459ZM12.9154 13.0035C9.64678 13.0035 6.99707 10.3538 6.99707 7.08524H5.49707C5.49707 11.1823 8.81835 14.5035 12.9154 14.5035V13.0035ZM16.944 11.4207C15.8869 12.4035 14.4721 13.0035 12.9154 13.0035V14.5035C14.8657 14.5035 16.6418 13.7499 17.9654 12.5193L16.944 11.4207ZM16.7295 11.7789C15.9437 14.7607 13.2277 16.9586 10.0003 16.9586V18.4586C13.9257 18.4586 17.2249 15.7853 18.1799 12.1611L16.7295 11.7789ZM10.0003 16.9586C6.15734 16.9586 3.04199 13.8433 3.04199 10.0003H1.54199C1.54199 14.6717 5.32892 18.4586 10.0003 18.4586V16.9586ZM3.04199 10.0003C3.04199 6.77289 5.23988 4.05695 8.22173 3.27114L7.83948 1.82066C4.21532 2.77574 1.54199 6.07486 1.54199 10.0003H3.04199ZM6.99707 7.08524C6.99707 5.52854 7.5971 4.11366 8.57989 3.05657L7.48132 2.03522C6.25073 3.35885 5.49707 5.13487 5.49707 7.08524H6.99707Z"\n fill="currentColor" />\n </svg>\n }\n</button>\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifNavNotificationDropdown{static nextId=0;dropdowns=inject(AifNavDropdownService);dropdownId="aif-nav-notification-dropdown-"+ ++AifNavNotificationDropdown.nextId;config=input(null,...ngDevMode?[{debugName:"config"}]:[]);notifying=signal(!1,...ngDevMode?[{debugName:"notifying"}]:[]);cfg=signal(null,...ngDevMode?[{debugName:"cfg"}]:[]);data=signal([],...ngDevMode?[{debugName:"data"}]:[]);isOpen=computed(()=>this.dropdowns.isActive(this.dropdownId),...ngDevMode?[{debugName:"isOpen"}]:[]);url=computed(()=>this.cfg()?.url||"",...ngDevMode?[{debugName:"url"}]:[]);route=computed(()=>this.cfg()?.route||"",...ngDevMode?[{debugName:"route"}]:[]);built=!1;timer;position_left=computed(()=>"-left-[20px]",...ngDevMode?[{debugName:"position_left"}]:[]);ngOnInit(){this.config()&&this.build(this.config())}build(e){this.built||(this.cfg.set(e),e&&(this.built=!0,e.data&&(this.data.set(e.data),this.checkNotifying()),e.url&&(this.fetchNotifications(),e.check_time&&(this.timer=setInterval(()=>this.fetchNotifications(),1e3*e.check_time)))))}reBuild(e){this.built=!1,this.timer&&clearInterval(this.timer),this.build(e)}fetchNotifications(){const e=this.cfg()?.url;e&&rq_get(e).then(e=>{const t=e.data||e;Array.isArray(t)&&(this.data.set(t),this.checkNotifying())})}checkNotifying(){const e=this.data().some(e=>!e.isRead);this.notifying.set(e)}toggleDropdown(){this.dropdowns.toggle(this.dropdownId)&&this.notifying.set(!1)}closeDropdown(){this.dropdowns.close(this.dropdownId)}ngOnDestroy(){this.timer&&clearInterval(this.timer)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavNotificationDropdown,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavNotificationDropdown,isStandalone:!0,selector:"aif-nav-notification-dropdown",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (cfg()) {\n<div class="relative w-full lg:w-auto">\n <aif-nav-action-button variant="back-circle" extraClass="dropdown-toggle relative" ariaLabel="Notificaciones"\n (clicked)="toggleDropdown()">\n @if (notifying()) {\n <span class="absolute right-0 top-0.5 z-10 h-2 w-2 rounded-full bg-orange-400">\n <span class="absolute inline-flex w-full h-full bg-orange-400 rounded-full opacity-75 animate-ping"></span>\n </span>\n }\n <svg class="fill-current" width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M10.75 2.29248C10.75 1.87827 10.4143 1.54248 10 1.54248C9.58583 1.54248 9.25004 1.87827 9.25004 2.29248V2.83613C6.08266 3.20733 3.62504 5.9004 3.62504 9.16748V14.4591H3.33337C2.91916 14.4591 2.58337 14.7949 2.58337 15.2091C2.58337 15.6234 2.91916 15.9591 3.33337 15.9591H4.37504H15.625H16.6667C17.0809 15.9591 17.4167 15.6234 17.4167 15.2091C17.4167 14.7949 17.0809 14.4591 16.6667 14.4591H16.375V9.16748C16.375 5.9004 13.9174 3.20733 10.75 2.83613V2.29248ZM14.875 14.4591V9.16748C14.875 6.47509 12.6924 4.29248 10 4.29248C7.30765 4.29248 5.12504 6.47509 5.12504 9.16748V14.4591H14.875ZM8.00004 17.7085C8.00004 18.1228 8.33583 18.4585 8.75004 18.4585H11.25C11.6643 18.4585 12 18.1228 12 17.7085C12 17.2943 11.6643 16.9585 11.25 16.9585H8.75004C8.33583 16.9585 8.00004 17.2943 8.00004 17.7085Z"\n fill="currentColor" />\n </svg>\n </aif-nav-action-button>\n <aif-dropdown [isOpen]="isOpen()" (close)="closeDropdown()" [className]="position_left() + \' absolute \n xl:-left-[320px] \n mt-[17px] \n flex h-[480px] w-[350px] flex-col rounded-2xl border border-gray-200 bg-white p-3\n shadow-theme-lg dark:border-gray-800 dark:bg-gray-dark sm:w-[361px]\'">\n <div class="flex items-center justify-between pb-3 mb-3 border-b border-gray-100 dark:border-gray-700">\n <h5 class="text-lg font-semibold text-gray-800 dark:text-gray-200">\n Notificaciones\n </h5>\n <button (click)="toggleDropdown()"\n class="text-gray-500 transition dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200">\n <svg class="fill-current" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M6.21967 7.28131C5.92678 6.98841 5.92678 6.51354 6.21967 6.22065C6.51256 5.92775 6.98744 5.92775 7.28033 6.22065L11.999 10.9393L16.7176 6.22078C17.0105 5.92789 17.4854 5.92788 17.7782 6.22078C18.0711 6.51367 18.0711 6.98855 17.7782 7.28144L13.0597 12L17.7782 16.7186C18.0711 17.0115 18.0711 17.4863 17.7782 17.7792C17.4854 18.0721 17.0105 18.0721 16.7176 17.7792L11.999 13.0607L7.28033 17.7794C6.98744 18.0722 6.51256 18.0722 6.21967 17.7794C5.92678 17.4865 5.92678 17.0116 6.21967 16.7187L10.9384 12L6.21967 7.28131Z"\n fill="currentColor" />\n </svg>\n </button>\n </div>\n <ul class="flex flex-col h-auto overflow-y-auto custom-scrollbar">\n @for (item of data(); track item.id) {\n <li>\n <aif-dropdown-item (itemClick)="closeDropdown()"\n [className]="\'w-full text-left text-sm text-gray-700 hover:text-gray-900 flex gap-3 rounded-lg border-b border-gray-100 p-3 px-4.5 py-3 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-white/5\'"\n [to]="item.route || \'\'">\n <span class="relative block w-full h-10 rounded-full z-1 max-w-10">\n <img width="40" height="40" [src]="item.image || \'/assets/images/users/avatar-placeholder.png\'"\n alt="User" class="w-full overflow-hidden rounded-full" />\n @if (!item.isRead) {\n <span\n class="absolute bottom-0 right-0 z-10 h-2.5 w-full max-w-2.5 rounded-full border-[1.5px] border-white bg-success-500 dark:border-gray-900"></span>\n }\n </span>\n <span class="block">\n <span class="mb-1.5 block text-theme-sm text-gray-500 dark:text-gray-400 space-x-1">\n <span class="font-medium text-gray-800 dark:text-white/90">\n {{item.title}}\n </span>\n <span>{{item.description}}</span>\n </span>\n <span class="flex items-center gap-2 text-gray-500 text-theme-xs dark:text-gray-400">\n <span>{{item.tag}}</span>\n <span class="w-1 h-1 bg-gray-400 rounded-full"></span>\n <span>{{item.date}}</span>\n </span>\n </span>\n </aif-dropdown-item>\n </li>\n } @empty {\n <li class="p-4 text-center text-gray-500 dark:text-gray-400">\n No hay notificaciones nuevas.\n </li>\n }\n </ul>\n @if (route()) {\n <a [routerLink]="route()"\n class="block px-4 py-2 mt-3 text-sm font-medium text-center text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-100 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700">\n Ver todas las notificaciones\n </a>\n }\n </aif-dropdown>\n</div>\n}\n\n\x3c!-- block w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900 flex gap-3 rounded-lg border-b border-gray-100 p-3 px-4.5 py-3 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-white/5 --\x3e\n',dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"ngmodule",type:RouterModule},{kind:"directive",type:i1$1.RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]},{kind:"component",type:AifNavActionButton,selector:"aif-nav-action-button",inputs:["route","title","ariaLabel","variant","active","extraClass"],outputs:["clicked"]},{kind:"component",type:AifDropDown,selector:"aif-dropdown",inputs:["isOpen","className"],outputs:["close"]},{kind:"component",type:AifDropDownItem,selector:"aif-dropdown-item",inputs:["to","baseClassName","className"],outputs:["itemClick","click"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavNotificationDropdown,decorators:[{type:Component,args:[{selector:"aif-nav-notification-dropdown",imports:[CommonModule,RouterModule,AifNavActionButton,AifDropDown,AifDropDownItem],template:'@if (cfg()) {\n<div class="relative w-full lg:w-auto">\n <aif-nav-action-button variant="back-circle" extraClass="dropdown-toggle relative" ariaLabel="Notificaciones"\n (clicked)="toggleDropdown()">\n @if (notifying()) {\n <span class="absolute right-0 top-0.5 z-10 h-2 w-2 rounded-full bg-orange-400">\n <span class="absolute inline-flex w-full h-full bg-orange-400 rounded-full opacity-75 animate-ping"></span>\n </span>\n }\n <svg class="fill-current" width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M10.75 2.29248C10.75 1.87827 10.4143 1.54248 10 1.54248C9.58583 1.54248 9.25004 1.87827 9.25004 2.29248V2.83613C6.08266 3.20733 3.62504 5.9004 3.62504 9.16748V14.4591H3.33337C2.91916 14.4591 2.58337 14.7949 2.58337 15.2091C2.58337 15.6234 2.91916 15.9591 3.33337 15.9591H4.37504H15.625H16.6667C17.0809 15.9591 17.4167 15.6234 17.4167 15.2091C17.4167 14.7949 17.0809 14.4591 16.6667 14.4591H16.375V9.16748C16.375 5.9004 13.9174 3.20733 10.75 2.83613V2.29248ZM14.875 14.4591V9.16748C14.875 6.47509 12.6924 4.29248 10 4.29248C7.30765 4.29248 5.12504 6.47509 5.12504 9.16748V14.4591H14.875ZM8.00004 17.7085C8.00004 18.1228 8.33583 18.4585 8.75004 18.4585H11.25C11.6643 18.4585 12 18.1228 12 17.7085C12 17.2943 11.6643 16.9585 11.25 16.9585H8.75004C8.33583 16.9585 8.00004 17.2943 8.00004 17.7085Z"\n fill="currentColor" />\n </svg>\n </aif-nav-action-button>\n <aif-dropdown [isOpen]="isOpen()" (close)="closeDropdown()" [className]="position_left() + \' absolute \n xl:-left-[320px] \n mt-[17px] \n flex h-[480px] w-[350px] flex-col rounded-2xl border border-gray-200 bg-white p-3\n shadow-theme-lg dark:border-gray-800 dark:bg-gray-dark sm:w-[361px]\'">\n <div class="flex items-center justify-between pb-3 mb-3 border-b border-gray-100 dark:border-gray-700">\n <h5 class="text-lg font-semibold text-gray-800 dark:text-gray-200">\n Notificaciones\n </h5>\n <button (click)="toggleDropdown()"\n class="text-gray-500 transition dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200">\n <svg class="fill-current" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M6.21967 7.28131C5.92678 6.98841 5.92678 6.51354 6.21967 6.22065C6.51256 5.92775 6.98744 5.92775 7.28033 6.22065L11.999 10.9393L16.7176 6.22078C17.0105 5.92789 17.4854 5.92788 17.7782 6.22078C18.0711 6.51367 18.0711 6.98855 17.7782 7.28144L13.0597 12L17.7782 16.7186C18.0711 17.0115 18.0711 17.4863 17.7782 17.7792C17.4854 18.0721 17.0105 18.0721 16.7176 17.7792L11.999 13.0607L7.28033 17.7794C6.98744 18.0722 6.51256 18.0722 6.21967 17.7794C5.92678 17.4865 5.92678 17.0116 6.21967 16.7187L10.9384 12L6.21967 7.28131Z"\n fill="currentColor" />\n </svg>\n </button>\n </div>\n <ul class="flex flex-col h-auto overflow-y-auto custom-scrollbar">\n @for (item of data(); track item.id) {\n <li>\n <aif-dropdown-item (itemClick)="closeDropdown()"\n [className]="\'w-full text-left text-sm text-gray-700 hover:text-gray-900 flex gap-3 rounded-lg border-b border-gray-100 p-3 px-4.5 py-3 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-white/5\'"\n [to]="item.route || \'\'">\n <span class="relative block w-full h-10 rounded-full z-1 max-w-10">\n <img width="40" height="40" [src]="item.image || \'/assets/images/users/avatar-placeholder.png\'"\n alt="User" class="w-full overflow-hidden rounded-full" />\n @if (!item.isRead) {\n <span\n class="absolute bottom-0 right-0 z-10 h-2.5 w-full max-w-2.5 rounded-full border-[1.5px] border-white bg-success-500 dark:border-gray-900"></span>\n }\n </span>\n <span class="block">\n <span class="mb-1.5 block text-theme-sm text-gray-500 dark:text-gray-400 space-x-1">\n <span class="font-medium text-gray-800 dark:text-white/90">\n {{item.title}}\n </span>\n <span>{{item.description}}</span>\n </span>\n <span class="flex items-center gap-2 text-gray-500 text-theme-xs dark:text-gray-400">\n <span>{{item.tag}}</span>\n <span class="w-1 h-1 bg-gray-400 rounded-full"></span>\n <span>{{item.date}}</span>\n </span>\n </span>\n </aif-dropdown-item>\n </li>\n } @empty {\n <li class="p-4 text-center text-gray-500 dark:text-gray-400">\n No hay notificaciones nuevas.\n </li>\n }\n </ul>\n @if (route()) {\n <a [routerLink]="route()"\n class="block px-4 py-2 mt-3 text-sm font-medium text-center text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-100 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700">\n Ver todas las notificaciones\n </a>\n }\n </aif-dropdown>\n</div>\n}\n\n\x3c!-- block w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900 flex gap-3 rounded-lg border-b border-gray-100 p-3 px-4.5 py-3 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-white/5 --\x3e\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifBackNavHeader{sidebar=inject(AifSideBarService);config=input(null,...ngDevMode?[{debugName:"config"}]:[]);isApplicationMenuOpen=signal(!1,...ngDevMode?[{debugName:"isApplicationMenuOpen"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);userConfig=signal(null,...ngDevMode?[{debugName:"userConfig"}]:[]);notificationConfig=signal(null,...ngDevMode?[{debugName:"notificationConfig"}]:[]);langConfig=signal(null,...ngDevMode?[{debugName:"langConfig"}]:[]);userDropDown=viewChild(AifNavUserDropDown,...ngDevMode?[{debugName:"userDropDown"}]:[]);notificationDropDown=viewChild(AifNavNotificationDropdown,...ngDevMode?[{debugName:"notificationDropDown"}]:[]);langDropDown=viewChild(AifNavLangDropDown,...ngDevMode?[{debugName:"langDropDown"}]:[]);state=computed(()=>{const e=AifBackNavHeader.config(),t=this.config(),n=this.builtConfig(),i=n??t;return{...e,...t??{},...n??{},logo:i?.logo??e.logo,actions:{...e.actions,...i?.actions??{}},searchPlaceholder:i?.searchPlaceholder??e.searchPlaceholder,customClass:i?.customClass??""}},...ngDevMode?[{debugName:"state"}]:[]);hasLogo=computed(()=>!!this.state().logo,...ngDevMode?[{debugName:"hasLogo"}]:[]);hasSearch=computed(()=>!!this.state().showSearch,...ngDevMode?[{debugName:"hasSearch"}]:[]);hasThemeToggle=computed(()=>!!this.state().showThemeToggle,...ngDevMode?[{debugName:"hasThemeToggle"}]:[]);hasNotifications=computed(()=>!!this.state().showNotifications,...ngDevMode?[{debugName:"hasNotifications"}]:[]);hasLangDropdown=computed(()=>!!this.state().showLangDropdown&&(this.langConfig()?.length??0)>0,...ngDevMode?[{debugName:"hasLangDropdown"}]:[]);hasUserDropdown=computed(()=>!!this.state().showUserDropdown,...ngDevMode?[{debugName:"hasUserDropdown"}]:[]);logoConfig=computed(()=>this.state().logo,...ngDevMode?[{debugName:"logoConfig"}]:[]);searchConfig=computed(()=>this.hasSearch()?{placeholder:this.state().searchPlaceholder,id:"back-nav-search",icon:"aif aif-search-alt-ico",shortcut:"⌘ K",submit:e=>{const t=e.trim();t&&this.state().actions?.onSearch?.(t)}}:null,...ngDevMode?[{debugName:"searchConfig"}]:[]);userDropdownConfig=computed(()=>this.userConfig(),...ngDevMode?[{debugName:"userDropdownConfig"}]:[]);notificationDropdownConfig=computed(()=>this.notificationConfig(),...ngDevMode?[{debugName:"notificationDropdownConfig"}]:[]);langDropdownConfig=computed(()=>this.langConfig(),...ngDevMode?[{debugName:"langDropdownConfig"}]:[]);applicationMenuClass=computed(()=>this.isApplicationMenuOpen()?"flex":"hidden",...ngDevMode?[{debugName:"applicationMenuClass"}]:[]);build(e,t){const n="function"==typeof e?e():e;this.builtConfig.set(n),t?.()}reBuild(e,t){this.resetToInput(),this.build(e,t)}resetToInput(){this.builtConfig.set(null)}setUser(e){this.userConfig.set(e),this.userDropDown()?.reBuild(e)}setNotifications(e){this.notificationConfig.set(e),this.notificationDropDown()?.reBuild(e)}setLangs(e){this.langConfig.set(e),this.langDropDown()?.reBuild(e)}handleToggle(){window.innerWidth>=1140?this.sidebar.toggleExpanded():this.sidebar.toggleMobileOpen(),this.state().actions?.onMenuToggle?.()}toggleApplicationMenu(){this.isApplicationMenuOpen.update(e=>!e)}handleLogoClick(){this.state().actions?.onLogoClick?.()}static config(e){return{showSearch:!0,searchPlaceholder:"Search or type command…",showThemeToggle:!0,showNotifications:!0,showLangDropdown:!0,showUserDropdown:!0,logo:{light:"/assets/images/logo/logo-dark.svg",dark:"/assets/images/logo/logo-light.svg"},actions:{onLogoClick:()=>{},onSearch:e=>{}},customClass:"",...e}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifBackNavHeader,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifBackNavHeader,isStandalone:!0,selector:"aif-back-nav-header, aif-back-header, aif-nav-header",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"userDropDown",first:!0,predicate:AifNavUserDropDown,descendants:!0,isSignal:!0},{propertyName:"notificationDropDown",first:!0,predicate:AifNavNotificationDropdown,descendants:!0,isSignal:!0},{propertyName:"langDropDown",first:!0,predicate:AifNavLangDropDown,descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (state(); as vm) {\n<header class="sticky top-0 z-99999 flex w-full border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900 xl:border-b"\n [class]="vm.customClass">\n\n <div class="grow xl:px-6">\n <div class="flex flex-col items-center justify-between xl:flex-row">\n <div class="flex w-full items-center justify-between gap-2 border-b border-gray-200 px-3 py-3 dark:border-gray-800 sm:gap-4 xl:justify-normal xl:border-b-0 xl:px-0 lg:py-4">\n <aif-nav-action-button variant="back-square" [active]="sidebar.isMobileOpen()" ariaLabel="Toggle Sidebar"\n extraClass="z-99999 xl:border border-gray-200 dark:border-gray-800" (clicked)="handleToggle()">\n @if (sidebar.isMobileOpen()) {\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M6.21967 7.28131C5.92678 6.98841 5.92678 6.51354 6.21967 6.22065C6.51256 5.92775 6.98744 5.92775 7.28033 6.22065L11.999 10.9393L16.7176 6.22078C17.0105 5.92789 17.4854 5.92788 17.7782 6.22078C18.0711 6.51367 18.0711 6.98855 17.7782 7.28144L13.0597 12L17.7782 16.7186C18.0711 17.0115 18.0711 17.4863 17.7782 17.7792C17.4854 18.0721 17.0105 18.0721 16.7176 17.7792L11.999 13.0607L7.28033 17.7794C6.98744 18.0722 6.51256 18.0722 6.21967 17.7794C5.92678 17.4865 5.92678 17.0116 6.21967 16.7187L10.9384 12L6.21967 7.28131Z"\n fill="currentColor" />\n </svg>\n } @else {\n <svg width="16" height="12" viewBox="0 0 16 12" fill="none">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M0.583252 1C0.583252 0.585788 0.919038 0.25 1.33325 0.25H14.6666C15.0808 0.25 15.4166 0.585786 15.4166 1C15.4166 1.41421 15.0808 1.75 14.6666 1.75L1.33325 1.75C0.919038 1.75 0.583252 1.41422 0.583252 1ZM0.583252 11C0.583252 10.5858 0.919038 10.25 1.33325 10.25L14.6666 10.25C15.0808 10.25 15.4166 10.5858 15.4166 11C15.4166 11.4142 15.0808 11.75 14.6666 11.75L1.33325 11.75C0.919038 11.75 0.583252 11.4142 0.583252 11ZM1.33325 5.25C0.919038 5.25 0.583252 5.58579 0.583252 6C0.583252 6.41421 0.919038 6.75 1.33325 6.75L7.99992 6.75C8.41413 6.75 8.74992 6.41421 8.74992 6C8.74992 5.58579 8.41413 5.25 7.99992 5.25L1.33325 5.25Z"\n fill="currentColor" />\n </svg>\n }\n </aif-nav-action-button>\n\n @if (hasLogo()) {\n <div class="xl:hidden" (click)="handleLogoClick()">\n <aif-nav-logo [cfg]="logoConfig()" />\n </div>\n }\n\n <aif-nav-action-button variant="back-square" ariaLabel="Toggle Header Actions"\n extraClass="z-99999 text-gray-700 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-800 xl:hidden"\n (clicked)="toggleApplicationMenu()">\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M5.99902 10.4951C6.82745 10.4951 7.49902 11.1667 7.49902 11.9951V12.0051C7.49902 12.8335 6.82745 13.5051 5.99902 13.5051C5.1706 13.5051 4.49902 12.8335 4.49902 12.0051V11.9951C4.49902 11.1667 5.1706 10.4951 5.99902 10.4951ZM17.999 10.4951C18.8275 10.4951 19.499 11.1667 19.499 11.9951V12.0051C19.499 12.8335 18.8275 13.5051 17.999 13.5051C17.1706 13.5051 16.499 12.8335 16.499 12.0051V11.9951C16.499 11.1667 17.1706 10.4951 17.999 10.4951ZM13.499 11.9951C13.499 11.1667 12.8275 10.4951 11.999 10.4951C11.1706 10.4951 10.499 11.1667 10.499 11.9951V12.0051C10.499 12.8335 11.1706 13.5051 11.999 13.5051C12.8275 13.5051 13.499 12.8335 13.499 12.0051V11.9951Z"\n fill="currentColor" />\n </svg>\n </aif-nav-action-button>\n\n @if (hasSearch()) {\n <div class="hidden xl:block">\n <aif-nav-search [config]="searchConfig()" variant="back" />\n </div>\n }\n </div>\n\n <div [class]="applicationMenuClass()" class="w-full items-center justify-between gap-4 px-5 py-4 shadow-theme-md xl:flex xl:justify-end xl:px-0 xl:shadow-none">\n <div class="flex items-center gap-2 2xsm:gap-3">\n @if (hasThemeToggle()) {\n <aif-theme-toggle />\n }\n\n @if (hasLangDropdown()) {\n <aif-nav-lang-dropdown [config]="langDropdownConfig()" />\n }\n\n @if (hasNotifications()) {\n <aif-nav-notification-dropdown [config]="notificationDropdownConfig()" />\n }\n </div>\n\n @if (hasUserDropdown()) {\n <aif-nav-user-dropdown [config]="userDropdownConfig()" variant="front" />\n }\n </div>\n </div>\n </div>\n</header>\n}\n',styles:[""],dependencies:[{kind:"component",type:AifNavActionButton,selector:"aif-nav-action-button",inputs:["route","title","ariaLabel","variant","active","extraClass"],outputs:["clicked"]},{kind:"component",type:AifNavLogo,selector:"aif-nav-logo",inputs:["cfg","surface"]},{kind:"component",type:AifThemeToggle,selector:"aif-theme-toggle",inputs:["config"]},{kind:"component",type:AifNavNotificationDropdown,selector:"aif-nav-notification-dropdown",inputs:["config"]},{kind:"component",type:AifNavUserDropDown,selector:"aif-nav-user-dropdown",inputs:["config","variant"]},{kind:"component",type:AifNavLangDropDown,selector:"aif-nav-lang-dropdown",inputs:["config","variant"]},{kind:"component",type:AifNavSearch,selector:"aif-nav-search",inputs:["config","variant"],outputs:["submitted"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifBackNavHeader,decorators:[{type:Component,args:[{selector:"aif-back-nav-header, aif-back-header, aif-nav-header",standalone:!0,imports:[AifNavActionButton,AifNavLogo,AifThemeToggle,AifNavNotificationDropdown,AifNavUserDropDown,AifNavLangDropDown,AifNavSearch],template:'@if (state(); as vm) {\n<header class="sticky top-0 z-99999 flex w-full border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900 xl:border-b"\n [class]="vm.customClass">\n\n <div class="grow xl:px-6">\n <div class="flex flex-col items-center justify-between xl:flex-row">\n <div class="flex w-full items-center justify-between gap-2 border-b border-gray-200 px-3 py-3 dark:border-gray-800 sm:gap-4 xl:justify-normal xl:border-b-0 xl:px-0 lg:py-4">\n <aif-nav-action-button variant="back-square" [active]="sidebar.isMobileOpen()" ariaLabel="Toggle Sidebar"\n extraClass="z-99999 xl:border border-gray-200 dark:border-gray-800" (clicked)="handleToggle()">\n @if (sidebar.isMobileOpen()) {\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M6.21967 7.28131C5.92678 6.98841 5.92678 6.51354 6.21967 6.22065C6.51256 5.92775 6.98744 5.92775 7.28033 6.22065L11.999 10.9393L16.7176 6.22078C17.0105 5.92789 17.4854 5.92788 17.7782 6.22078C18.0711 6.51367 18.0711 6.98855 17.7782 7.28144L13.0597 12L17.7782 16.7186C18.0711 17.0115 18.0711 17.4863 17.7782 17.7792C17.4854 18.0721 17.0105 18.0721 16.7176 17.7792L11.999 13.0607L7.28033 17.7794C6.98744 18.0722 6.51256 18.0722 6.21967 17.7794C5.92678 17.4865 5.92678 17.0116 6.21967 16.7187L10.9384 12L6.21967 7.28131Z"\n fill="currentColor" />\n </svg>\n } @else {\n <svg width="16" height="12" viewBox="0 0 16 12" fill="none">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M0.583252 1C0.583252 0.585788 0.919038 0.25 1.33325 0.25H14.6666C15.0808 0.25 15.4166 0.585786 15.4166 1C15.4166 1.41421 15.0808 1.75 14.6666 1.75L1.33325 1.75C0.919038 1.75 0.583252 1.41422 0.583252 1ZM0.583252 11C0.583252 10.5858 0.919038 10.25 1.33325 10.25L14.6666 10.25C15.0808 10.25 15.4166 10.5858 15.4166 11C15.4166 11.4142 15.0808 11.75 14.6666 11.75L1.33325 11.75C0.919038 11.75 0.583252 11.4142 0.583252 11ZM1.33325 5.25C0.919038 5.25 0.583252 5.58579 0.583252 6C0.583252 6.41421 0.919038 6.75 1.33325 6.75L7.99992 6.75C8.41413 6.75 8.74992 6.41421 8.74992 6C8.74992 5.58579 8.41413 5.25 7.99992 5.25L1.33325 5.25Z"\n fill="currentColor" />\n </svg>\n }\n </aif-nav-action-button>\n\n @if (hasLogo()) {\n <div class="xl:hidden" (click)="handleLogoClick()">\n <aif-nav-logo [cfg]="logoConfig()" />\n </div>\n }\n\n <aif-nav-action-button variant="back-square" ariaLabel="Toggle Header Actions"\n extraClass="z-99999 text-gray-700 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-800 xl:hidden"\n (clicked)="toggleApplicationMenu()">\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M5.99902 10.4951C6.82745 10.4951 7.49902 11.1667 7.49902 11.9951V12.0051C7.49902 12.8335 6.82745 13.5051 5.99902 13.5051C5.1706 13.5051 4.49902 12.8335 4.49902 12.0051V11.9951C4.49902 11.1667 5.1706 10.4951 5.99902 10.4951ZM17.999 10.4951C18.8275 10.4951 19.499 11.1667 19.499 11.9951V12.0051C19.499 12.8335 18.8275 13.5051 17.999 13.5051C17.1706 13.5051 16.499 12.8335 16.499 12.0051V11.9951C16.499 11.1667 17.1706 10.4951 17.999 10.4951ZM13.499 11.9951C13.499 11.1667 12.8275 10.4951 11.999 10.4951C11.1706 10.4951 10.499 11.1667 10.499 11.9951V12.0051C10.499 12.8335 11.1706 13.5051 11.999 13.5051C12.8275 13.5051 13.499 12.8335 13.499 12.0051V11.9951Z"\n fill="currentColor" />\n </svg>\n </aif-nav-action-button>\n\n @if (hasSearch()) {\n <div class="hidden xl:block">\n <aif-nav-search [config]="searchConfig()" variant="back" />\n </div>\n }\n </div>\n\n <div [class]="applicationMenuClass()" class="w-full items-center justify-between gap-4 px-5 py-4 shadow-theme-md xl:flex xl:justify-end xl:px-0 xl:shadow-none">\n <div class="flex items-center gap-2 2xsm:gap-3">\n @if (hasThemeToggle()) {\n <aif-theme-toggle />\n }\n\n @if (hasLangDropdown()) {\n <aif-nav-lang-dropdown [config]="langDropdownConfig()" />\n }\n\n @if (hasNotifications()) {\n <aif-nav-notification-dropdown [config]="notificationDropdownConfig()" />\n }\n </div>\n\n @if (hasUserDropdown()) {\n <aif-nav-user-dropdown [config]="userDropdownConfig()" variant="front" />\n }\n </div>\n </div>\n </div>\n</header>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],userDropDown:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifNavUserDropDown),{isSignal:!0}]}],notificationDropDown:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifNavNotificationDropdown),{isSignal:!0}]}],langDropDown:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifNavLangDropDown),{isSignal:!0}]}]}});class AifPageHeader{onInit=output();onRef=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);title=signal("",...ngDevMode?[{debugName:"title"}]:[]);subtitle=signal("",...ngDevMode?[{debugName:"subtitle"}]:[]);built=signal(!1,...ngDevMode?[{debugName:"built"}]:[]);show=signal(!1,...ngDevMode?[{debugName:"show"}]:[]);breadcrumbItems=signal([],...ngDevMode?[{debugName:"breadcrumbItems"}]:[]);onClick=signal(()=>{},...ngDevMode?[{debugName:"onClick"}]:[]);isShow=computed(()=>this.show()?"show":"hide",...ngDevMode?[{debugName:"isShow"}]:[]);isLine=computed(()=>!!this.cfg().line,...ngDevMode?[{debugName:"isLine"}]:[]);backTitle=computed(()=>this.cfg().back_title||"Back",...ngDevMode?[{debugName:"backTitle"}]:[]);ngOnInit(){const e=this.config();e&&(e.breadcrumb||e.title)&&this.build(e)}ngAfterViewInit(){this.onInit.emit()}reBuild(e){this.built.set(!1),this.build(e)}build(e={}){if(!this.built()){if(this.built.set(!0),e.click&&this.onClick.set(e.click),e.breadcrumb){const t=[];let n=!1;const i=e.breadcrumb||[];for(let e=0;e<i.length;e++){const a=i[e],s={index:e,link:null,label:a,active:!n&&e===i.length-1};Array.isArray(a)&&(s.label=a[0],a[1]&&(s.link=a[1]),a[2]&&(s.active=!0,n=!0)),t.push(s)}this.breadcrumbItems.set(t)}e.title&&this.title.set(e.title||""),e.subtitle&&this.subtitle.set(e.subtitle||""),this.cfg.set({...e,line:e.line||!1}),this.show.set(!0)}}handleBack(e){e.preventDefault();const t={action:"back"};this.onRef.emit(t),this.onClick()(t)}handleSelect(e){this.onRef.emit(e),this.onClick()(e),e.link&&navigate(e.link)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPageHeader,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifPageHeader,isStandalone:!0,selector:"aif-page-header, aif-nav-head",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit",onRef:"onRef"},ngImport:i0,template:'@if (isShow() === \'show\') {\n <div class="flex flex-col w-full py-4 mb-2 sm:flex-row sm:items-center sm:justify-between">\n <div class="flex items-center gap-3">\n @if (!title() && breadcrumbItems().length > 1) {\n <a href="#" (click)="handleBack($event)" class="inline-flex items-center text-sm font-medium text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-white">\n <i class="mr-1 aif aif-arrow-left-ico"></i>\n <span>{{ backTitle() }}</span>\n </a>\n }\n \n @if (title()) {\n <div [ngClass]="{\'hidden md:block\': breadcrumbItems().length > 1}">\n <h4 class="text-xl font-semibold text-gray-900 dark:text-white">\n {{ title() }}\n </h4>\n @if (subtitle()) {\n <p class="mt-1 text-sm text-gray-500 dark:text-gray-400">\n {{ subtitle() }}\n </p>\n }\n </div>\n }\n </div>\n\n <div class="mt-2 sm:mt-0">\n <ol class="flex items-center list-none">\n @for (item of breadcrumbItems(); track item.index) {\n <li class="flex items-center">\n @if (item.index > 0) {\n <span class="mx-2 text-gray-400 dark:text-gray-600">/</span>\n }\n <button \n type="button"\n (click)="handleSelect(item)" \n [disabled]="item.active"\n class="text-sm font-medium transition-colors"\n [ngClass]="item.active ? \'text-gray-900 dark:text-white cursor-default\' : \'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-white cursor-pointer\'">\n {{ item.label }}\n </button>\n </li>\n }\n </ol>\n </div>\n </div>\n \n @if (isLine()) {\n <hr class="border-gray-200 dark:border-gray-800" />\n }\n}\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPageHeader,decorators:[{type:Component,args:[{selector:"aif-page-header, aif-nav-head",standalone:!0,imports:[NgClass],template:'@if (isShow() === \'show\') {\n <div class="flex flex-col w-full py-4 mb-2 sm:flex-row sm:items-center sm:justify-between">\n <div class="flex items-center gap-3">\n @if (!title() && breadcrumbItems().length > 1) {\n <a href="#" (click)="handleBack($event)" class="inline-flex items-center text-sm font-medium text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-white">\n <i class="mr-1 aif aif-arrow-left-ico"></i>\n <span>{{ backTitle() }}</span>\n </a>\n }\n \n @if (title()) {\n <div [ngClass]="{\'hidden md:block\': breadcrumbItems().length > 1}">\n <h4 class="text-xl font-semibold text-gray-900 dark:text-white">\n {{ title() }}\n </h4>\n @if (subtitle()) {\n <p class="mt-1 text-sm text-gray-500 dark:text-gray-400">\n {{ subtitle() }}\n </p>\n }\n </div>\n }\n </div>\n\n <div class="mt-2 sm:mt-0">\n <ol class="flex items-center list-none">\n @for (item of breadcrumbItems(); track item.index) {\n <li class="flex items-center">\n @if (item.index > 0) {\n <span class="mx-2 text-gray-400 dark:text-gray-600">/</span>\n }\n <button \n type="button"\n (click)="handleSelect(item)" \n [disabled]="item.active"\n class="text-sm font-medium transition-colors"\n [ngClass]="item.active ? \'text-gray-900 dark:text-white cursor-default\' : \'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-white cursor-pointer\'">\n {{ item.label }}\n </button>\n </li>\n }\n </ol>\n </div>\n </div>\n \n @if (isLine()) {\n <hr class="border-gray-200 dark:border-gray-800" />\n }\n}\n'}]}],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],onRef:[{type:i0.Output,args:["onRef"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifSection{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);currentLang=signal(lang(),...ngDevMode?[{debugName:"currentLang"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);_sb;state=computed(()=>{const e=this.config(),t=this.builtConfig()??e,n=t?.item??{},i={...AifSection.config(this.currentLang()),...t?.cfg??{}};return{item:n,cfg:i,labels:{...AifSection.defaultLabels(this.currentLang()),...i.labels||{}}}},...ngDevMode?[{debugName:"state"}]:[]);hasImage=computed(()=>!!this.state().item.imageUrl,...ngDevMode?[{debugName:"hasImage"}]:[]);hasMeta=computed(()=>!(!this.state().item.author&&!this.state().item.date),...ngDevMode?[{debugName:"hasMeta"}]:[]);hasLink=computed(()=>!!this.state().item.linkUrl,...ngDevMode?[{debugName:"hasLink"}]:[]);sectionAlignClass=computed(()=>"center"===this.state().cfg.align?"text-center":"text-left",...ngDevMode?[{debugName:"sectionAlignClass"}]:[]);metaAlignClass=computed(()=>"center"===this.state().cfg.align?"justify-center":"justify-start",...ngDevMode?[{debugName:"metaAlignClass"}]:[]);linkLabel=computed(()=>this.state().item.linkLabel||this.state().labels.defaultLinkLabel,...ngDevMode?[{debugName:"linkLabel"}]:[]);descriptionHtml=computed(()=>this.renderText(this.state().item.description),...ngDevMode?[{debugName:"descriptionHtml"}]:[]);ngOnInit(){const e=this.config();e&&(e.item||e.cfg)&&this.build(e),this._sb=lang_subscribe("change",e=>this.currentLang.set(e))}ngOnDestroy(){this._sb?.unsubscribe?.()}build(e=null){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e))}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1)}renderText(e){if(!e)return"";if("string"!=typeof e)return String(e);const t=e.split(/\r?\n/);let n="",i=!1,a=!1;const s=()=>{i&&(n+="</ul>",i=!1)},o=()=>{a&&(n+="</blockquote>",a=!1)};for(const e of t){const t=e.trim();if(t)if(/^---+$/.test(t))s(),o(),n+='<hr class="my-4 border-slate-300/40">';else{if(/^###\s+/.test(t)){s(),o();const e=this.inlineFormat(t.replace(/^###\s+/,""));n+=`<h3 class="text-lg font-semibold mt-4 mb-2">${e}</h3>`;continue}if(/^##\s+/.test(t)){s(),o();const e=this.inlineFormat(t.replace(/^##\s+/,""));n+=`<h2 class="text-xl font-semibold mt-5 mb-3">${e}</h2>`;continue}if(/^#\s+/.test(t)){s(),o();const e=this.inlineFormat(t.replace(/^#\s+/,""));n+=`<h1 class="text-2xl font-semibold mt-6 mb-4">${e}</h1>`;continue}if(/^[*•-]\s+/.test(t)){i||(o(),n+='<ul class="list-disc ms-6 my-3">',i=!0);const e=this.inlineFormat(t.replace(/^[*•-]\s+/,""));n+=`<li>${e}</li>`;continue}if(/^>\s+/.test(t)){s(),a||(n+='<blockquote class="border-l-4 ps-4 my-3 italic text-slate-600">',a=!0);const e=this.inlineFormat(t.replace(/^>\s+/,""));n+=e+"<br>";continue}s(),o(),n+=`<p class="mt-2">${this.inlineFormat(t)}</p>`}else s(),n+="<br>"}return s(),o(),n}inlineFormat(e){return e.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>").replace(/\*(.+?)\*/g,"<em>$1</em>")}static config(e=lang()){return{imagePosition:"after-title",linkPosition:"bottom",metaPosition:"after-title",align:"left",labels:AifSection.defaultLabels(e)}}static defaultLabels(e=lang()){return(e||"").toLowerCase().startsWith("en")?{authorPrefix:"By",defaultLinkLabel:"Read more"}:{authorPrefix:"Por",defaultLinkLabel:"Leer mas"}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSection,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSection,isStandalone:!0,selector:"aif-section",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (state(); as vm) {\n<section class="w-full" [ngClass]="sectionAlignClass()">\n <div class="space-y-3">\n\n \x3c!-- Imagen TOP --\x3e\n @if (hasImage() && vm.cfg.imagePosition === \'top\') {\n <ng-container *ngTemplateOutlet="imageTpl"></ng-container>\n }\n\n \x3c!-- Meta TOP (fecha/autor) --\x3e\n @if (hasMeta() && vm.cfg.metaPosition === \'top\') {\n <ng-container *ngTemplateOutlet="metaTpl"></ng-container>\n }\n\n \x3c!-- Link TOP --\x3e\n @if (hasLink() && vm.cfg.linkPosition === \'top\') {\n <ng-container *ngTemplateOutlet="linkTpl"></ng-container>\n }\n\n \x3c!-- Título --\x3e\n @if (vm.item.title) {\n <h3 class="text-2xl md:text-3xl font-semibold text-slate-900 mb-1">\n {{ vm.item.title }}\n </h3>\n }\n\n \x3c!-- Subtítulo --\x3e\n @if (vm.item.subtitle) {\n <h5 class="text-2xl text-slate-500">\n {{ vm.item.subtitle }}\n </h5>\n }\n\n \x3c!-- Imagen AFTER-TITLE --\x3e\n @if (hasImage() && vm.cfg.imagePosition === \'after-title\') {\n <ng-container *ngTemplateOutlet="imageTpl"></ng-container>\n }\n\n \x3c!-- Meta AFTER-TITLE --\x3e\n @if (hasMeta() && vm.cfg.metaPosition === \'after-title\') {\n <ng-container *ngTemplateOutlet="metaTpl"></ng-container>\n }\n\n \x3c!-- Link AFTER-TITLE --\x3e\n @if (hasLink() && vm.cfg.linkPosition === \'after-title\') {\n <ng-container *ngTemplateOutlet="linkTpl"></ng-container>\n }\n\n \x3c!-- Descripción --\x3e\n @if (vm.item.description) {\n <div class="text-slate-500 leading-relaxed text-justify" [innerHTML]="descriptionHtml()"></div>\n }\n\n \x3c!-- Imagen BOTTOM --\x3e\n @if (hasImage() && vm.cfg.imagePosition === \'bottom\') {\n <ng-container *ngTemplateOutlet="imageTpl"></ng-container>\n }\n\n \x3c!-- Meta BOTTOM --\x3e\n @if (hasMeta() && vm.cfg.metaPosition === \'bottom\') {\n <ng-container *ngTemplateOutlet="metaTpl"></ng-container>\n }\n\n \x3c!-- Link BOTTOM --\x3e\n @if (hasLink() && vm.cfg.linkPosition === \'bottom\') {\n <ng-container *ngTemplateOutlet="linkTpl"></ng-container>\n }\n\n </div>\n\n \x3c!-- TEMPLATES REUTILIZABLES --\x3e\n\n <ng-template #imageTpl>\n <div class="mt-3">\n <img [src]="vm.item.imageUrl!" [alt]="vm.item.imageAlt || vm.item.title || \'\'" class="rounded-md max-w-full" />\n </div>\n </ng-template>\n\n <ng-template #metaTpl>\n <div class="mt-1 text-sm text-slate-400 flex gap-2"\n [ngClass]="metaAlignClass()">\n @if (vm.item.date) {\n <span>{{ vm.item.date }}</span>\n }\n @if (vm.item.date && vm.item.author) {\n <span>•</span>\n }\n @if (vm.item.author) {\n <span>{{ vm.labels.authorPrefix }} {{ vm.item.author }}</span>\n }\n </div>\n </ng-template>\n\n <ng-template #linkTpl>\n <div class="mt-2">\n <a [routerLink]="vm.item.linkUrl!" class="inline-flex items-center text-primary font-semibold text-sm cursor-pointer\n hover:text-primary-700 transition-colors duration-200">\n {{ linkLabel() }}\n <i class="aif aif-chevron-right-ico align-middle text-lg mt-1.5"></i>\n </a>\n </div>\n </ng-template>\n</section>\n}\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:NgTemplateOutlet,selector:"[ngTemplateOutlet]",inputs:["ngTemplateOutletContext","ngTemplateOutlet","ngTemplateOutletInjector"]},{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSection,decorators:[{type:Component,args:[{selector:"aif-section",standalone:!0,imports:[NgClass,NgTemplateOutlet,RouterLink],template:'@if (state(); as vm) {\n<section class="w-full" [ngClass]="sectionAlignClass()">\n <div class="space-y-3">\n\n \x3c!-- Imagen TOP --\x3e\n @if (hasImage() && vm.cfg.imagePosition === \'top\') {\n <ng-container *ngTemplateOutlet="imageTpl"></ng-container>\n }\n\n \x3c!-- Meta TOP (fecha/autor) --\x3e\n @if (hasMeta() && vm.cfg.metaPosition === \'top\') {\n <ng-container *ngTemplateOutlet="metaTpl"></ng-container>\n }\n\n \x3c!-- Link TOP --\x3e\n @if (hasLink() && vm.cfg.linkPosition === \'top\') {\n <ng-container *ngTemplateOutlet="linkTpl"></ng-container>\n }\n\n \x3c!-- Título --\x3e\n @if (vm.item.title) {\n <h3 class="text-2xl md:text-3xl font-semibold text-slate-900 mb-1">\n {{ vm.item.title }}\n </h3>\n }\n\n \x3c!-- Subtítulo --\x3e\n @if (vm.item.subtitle) {\n <h5 class="text-2xl text-slate-500">\n {{ vm.item.subtitle }}\n </h5>\n }\n\n \x3c!-- Imagen AFTER-TITLE --\x3e\n @if (hasImage() && vm.cfg.imagePosition === \'after-title\') {\n <ng-container *ngTemplateOutlet="imageTpl"></ng-container>\n }\n\n \x3c!-- Meta AFTER-TITLE --\x3e\n @if (hasMeta() && vm.cfg.metaPosition === \'after-title\') {\n <ng-container *ngTemplateOutlet="metaTpl"></ng-container>\n }\n\n \x3c!-- Link AFTER-TITLE --\x3e\n @if (hasLink() && vm.cfg.linkPosition === \'after-title\') {\n <ng-container *ngTemplateOutlet="linkTpl"></ng-container>\n }\n\n \x3c!-- Descripción --\x3e\n @if (vm.item.description) {\n <div class="text-slate-500 leading-relaxed text-justify" [innerHTML]="descriptionHtml()"></div>\n }\n\n \x3c!-- Imagen BOTTOM --\x3e\n @if (hasImage() && vm.cfg.imagePosition === \'bottom\') {\n <ng-container *ngTemplateOutlet="imageTpl"></ng-container>\n }\n\n \x3c!-- Meta BOTTOM --\x3e\n @if (hasMeta() && vm.cfg.metaPosition === \'bottom\') {\n <ng-container *ngTemplateOutlet="metaTpl"></ng-container>\n }\n\n \x3c!-- Link BOTTOM --\x3e\n @if (hasLink() && vm.cfg.linkPosition === \'bottom\') {\n <ng-container *ngTemplateOutlet="linkTpl"></ng-container>\n }\n\n </div>\n\n \x3c!-- TEMPLATES REUTILIZABLES --\x3e\n\n <ng-template #imageTpl>\n <div class="mt-3">\n <img [src]="vm.item.imageUrl!" [alt]="vm.item.imageAlt || vm.item.title || \'\'" class="rounded-md max-w-full" />\n </div>\n </ng-template>\n\n <ng-template #metaTpl>\n <div class="mt-1 text-sm text-slate-400 flex gap-2"\n [ngClass]="metaAlignClass()">\n @if (vm.item.date) {\n <span>{{ vm.item.date }}</span>\n }\n @if (vm.item.date && vm.item.author) {\n <span>•</span>\n }\n @if (vm.item.author) {\n <span>{{ vm.labels.authorPrefix }} {{ vm.item.author }}</span>\n }\n </div>\n </ng-template>\n\n <ng-template #linkTpl>\n <div class="mt-2">\n <a [routerLink]="vm.item.linkUrl!" class="inline-flex items-center text-primary font-semibold text-sm cursor-pointer\n hover:text-primary-700 transition-colors duration-200">\n {{ linkLabel() }}\n <i class="aif aif-chevron-right-ico align-middle text-lg mt-1.5"></i>\n </a>\n </div>\n </ng-template>\n</section>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifSectionNav{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);items=input([],...ngDevMode?[{debugName:"items"}]:[]);cfg=input({offset:80,orientation:"horizontal"},...ngDevMode?[{debugName:"cfg"}]:[]);opts=input({},...ngDevMode?[{debugName:"opts"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);activeId=signal(null,...ngDevMode?[{debugName:"activeId"}]:[]);state=computed(()=>{const e=this.config(),t=this.builtConfig()??e,n={offset:80,orientation:"horizontal",...t?.cfg??this.cfg()},i={spy:!0,smooth:!0,trigger_offset:40,...t?.opts??this.opts()};return{items:t?.items??this.items(),cfg:n,opts:i}},...ngDevMode?[{debugName:"state"}]:[]);orientation=computed(()=>this.state().cfg.orientation,...ngDevMode?[{debugName:"orientation"}]:[]);currentActiveId=computed(()=>{const e=this.activeId(),t=this.state().items;return e&&t.some(t=>t.id===e)?e:t[0]?.id??null},...ngDevMode?[{debugName:"currentActiveId"}]:[]);navClass=computed(()=>{const{cfg:e,opts:t}=this.state();return t.class_nav||("vertical"===e.orientation?"w-full flex flex-col space-y-4":"w-full flex flex-wrap items-center justify-center gap-4")},...ngDevMode?[{debugName:"navClass"}]:[]);baseButtonClass=computed(()=>this.state().opts.class_button||"font-medium cursor-pointer block py-0 my-0 text-start transition-colors duration-200",...ngDevMode?[{debugName:"baseButtonClass"}]:[]);inactiveButtonClass=computed(()=>this.state().opts.class_button_inactive||"text-slate-600 hover:text-primary dark:text-slate-300 dark:hover:text-primary",...ngDevMode?[{debugName:"inactiveButtonClass"}]:[]);activeButtonClass=computed(()=>this.state().opts.class_button_active||"text-primary dark:text-primary font-semibold",...ngDevMode?[{debugName:"activeButtonClass"}]:[]);build(e=null){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e))}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1)}scrollTo(e){this.activeId.set(e);const t=document.getElementById(e);if(!t)return;const n=t.getBoundingClientRect(),i=this.state().cfg.offset??0,a=window.scrollY+n.top-i;window.scrollTo({top:a,behavior:!1===this.state().opts.smooth?"auto":"smooth"})}onWindowScroll(){if(!1===this.state().opts.spy)return;const e=this.state().items;if(!e||!e.length)return;const t=(this.state().cfg.offset??0)+(this.state().opts.trigger_offset??40);let n=null,i=Number.POSITIVE_INFINITY;for(const a of e){const e=document.getElementById(a.id);if(!e)continue;const s=e.getBoundingClientRect(),o=Math.abs(s.top-t);o<i&&(i=o,n=a.id)}n&&n!==this.currentActiveId()&&this.activeId.set(n)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSectionNav,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSectionNav,isStandalone:!0,selector:"aif-section-nav",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},items:{classPropertyName:"items",publicName:"items",isSignal:!0,isRequired:!1,transformFunction:null},cfg:{classPropertyName:"cfg",publicName:"cfg",isSignal:!0,isRequired:!1,transformFunction:null},opts:{classPropertyName:"opts",publicName:"opts",isSignal:!0,isRequired:!1,transformFunction:null}},host:{listeners:{"window:scroll":"onWindowScroll()"}},ngImport:i0,template:'@if (state().items.length) {\n<nav [class]="navClass()" [attr.aria-orientation]="orientation()">\n @for (item of state().items; track item.id) {\n <button type="button" (click)="scrollTo(item.id)" [class]="baseButtonClass()"\n [ngClass]="item.id === currentActiveId() ? activeButtonClass() : inactiveButtonClass()"\n [attr.aria-current]="item.id === currentActiveId() ? \'true\' : null">\n {{ item.title }}\n </button>\n }\n</nav>\n}\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSectionNav,decorators:[{type:Component,args:[{selector:"aif-section-nav",standalone:!0,imports:[NgClass],template:'@if (state().items.length) {\n<nav [class]="navClass()" [attr.aria-orientation]="orientation()">\n @for (item of state().items; track item.id) {\n <button type="button" (click)="scrollTo(item.id)" [class]="baseButtonClass()"\n [ngClass]="item.id === currentActiveId() ? activeButtonClass() : inactiveButtonClass()"\n [attr.aria-current]="item.id === currentActiveId() ? \'true\' : null">\n {{ item.title }}\n </button>\n }\n</nav>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],items:[{type:i0.Input,args:[{isSignal:!0,alias:"items",required:!1}]}],cfg:[{type:i0.Input,args:[{isSignal:!0,alias:"cfg",required:!1}]}],opts:[{type:i0.Input,args:[{isSignal:!0,alias:"opts",required:!1}]}],onWindowScroll:[{type:HostListener,args:["window:scroll",[]]}]}});class AifSectionSummary{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);currentLang=signal(lang(),...ngDevMode?[{debugName:"currentLang"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);_sb;state=computed(()=>{const e=this.config(),t=this.builtConfig()??e;return{item:{image:"assets/images/business/about01.jpg",title:"Titulo por defecto",description:"Descripcion por defecto",route:"#",buttonLabel:"",imageAlt:"",...t?.item??{}},cfg:{layout:"image-left",...t?.cfg??{}},labels:{...AifSectionSummary.defaultLabels(this.currentLang()),...t?.labels??{}}}},...ngDevMode?[{debugName:"state"}]:[]);isImageRight=computed(()=>"image-right"===this.state().cfg.layout,...ngDevMode?[{debugName:"isImageRight"}]:[]);imageAlt=computed(()=>this.state().item.imageAlt||this.state().item.title,...ngDevMode?[{debugName:"imageAlt"}]:[]);buttonLabel=computed(()=>this.state().item.buttonLabel||this.state().labels.defaultButtonLabel,...ngDevMode?[{debugName:"buttonLabel"}]:[]);route=computed(()=>this.state().item.route||"#",...ngDevMode?[{debugName:"route"}]:[]);ngOnInit(){const e=this.config();e&&this.build(e),this._sb=lang_subscribe("change",e=>this.currentLang.set(e))}ngOnDestroy(){this._sb?.unsubscribe?.()}build(e=null){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e))}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1)}static defaultLabels(e=lang()){return(e||"").toLowerCase().startsWith("en")?{defaultButtonLabel:"Read more"}:{defaultButtonLabel:"Leer mas"}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSectionSummary,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSectionSummary,isStandalone:!0,selector:"aif-section-summary",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (state(); as vm) {\n<section class="relative md:py-16 py-16">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n <div class="grid md:grid-cols-12 grid-cols-1 items-center gap-[30px]">\n\n @if (isImageRight()) {\n <div class="md:col-span-7 order-1">\n <div class="lg:me-4">\n <h4 class="mb-6 md:text-3xl text-2xl lg:leading-normal leading-normal font-medium">\n {{ vm.item.title }}\n </h4>\n\n <p class="text-slate-400 max-w-xl">\n {{ vm.item.description }}\n </p>\n\n <a [routerLink]="route()"\n class="py-2 px-5 inline-block font-semibold tracking-wide border align-middle duration-500 text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-md mt-3">\n {{ buttonLabel() }}\n <i class="aif aif-chevron-right-ico align-middle text-lg mt-1.5"></i>\n </a>\n </div>\n </div>\n\n <div class="md:col-span-5 order-2">\n <img [src]="vm.item.image" [alt]="imageAlt()" class="rounded-md" />\n </div>\n } @else {\n <div class="md:col-span-5 order-1">\n <img [src]="vm.item.image" [alt]="imageAlt()" class="rounded-md" />\n </div>\n\n <div class="md:col-span-7 order-2">\n <div class="lg:ms-4">\n <h4 class="mb-6 md:text-3xl text-2xl lg:leading-normal leading-normal font-medium">\n {{ vm.item.title }}\n </h4>\n\n <p class="text-slate-400 max-w-xl">\n {{ vm.item.description }}\n </p>\n\n <a [routerLink]="route()"\n class="py-2 px-5 inline-block font-semibold tracking-wide border align-middle duration-500 text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-md mt-3">\n {{ buttonLabel() }}\n <i class="aif aif-chevron-right-ico align-middle text-lg mt-1.5"></i>\n </a>\n </div>\n </div>\n }\n\n </div>\n </div>\n</section>\n}\n',dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSectionSummary,decorators:[{type:Component,args:[{selector:"aif-section-summary",standalone:!0,imports:[RouterLink],template:'@if (state(); as vm) {\n<section class="relative md:py-16 py-16">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n <div class="grid md:grid-cols-12 grid-cols-1 items-center gap-[30px]">\n\n @if (isImageRight()) {\n <div class="md:col-span-7 order-1">\n <div class="lg:me-4">\n <h4 class="mb-6 md:text-3xl text-2xl lg:leading-normal leading-normal font-medium">\n {{ vm.item.title }}\n </h4>\n\n <p class="text-slate-400 max-w-xl">\n {{ vm.item.description }}\n </p>\n\n <a [routerLink]="route()"\n class="py-2 px-5 inline-block font-semibold tracking-wide border align-middle duration-500 text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-md mt-3">\n {{ buttonLabel() }}\n <i class="aif aif-chevron-right-ico align-middle text-lg mt-1.5"></i>\n </a>\n </div>\n </div>\n\n <div class="md:col-span-5 order-2">\n <img [src]="vm.item.image" [alt]="imageAlt()" class="rounded-md" />\n </div>\n } @else {\n <div class="md:col-span-5 order-1">\n <img [src]="vm.item.image" [alt]="imageAlt()" class="rounded-md" />\n </div>\n\n <div class="md:col-span-7 order-2">\n <div class="lg:ms-4">\n <h4 class="mb-6 md:text-3xl text-2xl lg:leading-normal leading-normal font-medium">\n {{ vm.item.title }}\n </h4>\n\n <p class="text-slate-400 max-w-xl">\n {{ vm.item.description }}\n </p>\n\n <a [routerLink]="route()"\n class="py-2 px-5 inline-block font-semibold tracking-wide border align-middle duration-500 text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-md mt-3">\n {{ buttonLabel() }}\n <i class="aif aif-chevron-right-ico align-middle text-lg mt-1.5"></i>\n </a>\n </div>\n </div>\n }\n\n </div>\n </div>\n</section>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});const DEFAULT_MODAL_CONFIG={title:"",size:"lg",close:!0,blur:!1,backdrop:!0,backdrop_class:"bg-slate-950/80",header:!0,border:!0,body_padding:!0,panel_class:"",body_class:"",close_class:"",close_overlay:!1};class AifModal{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);modalDialog=viewChild.required("modalDialog");doneCallback=null;isOpen=signal(!1,...ngDevMode?[{debugName:"isOpen"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);state=computed(()=>({...DEFAULT_MODAL_CONFIG,...this.config()??{},...obj_compact(this.cfg())}),...ngDevMode?[{debugName:"state"}]:[]);title=computed(()=>this.state().title??"",...ngDevMode?[{debugName:"title"}]:[]);size=computed(()=>this.state().size??DEFAULT_MODAL_CONFIG.size,...ngDevMode?[{debugName:"size"}]:[]);canClose=computed(()=>!1!==this.state().close,...ngDevMode?[{debugName:"canClose"}]:[]);showHeader=computed(()=>!1!==this.state().header,...ngDevMode?[{debugName:"showHeader"}]:[]);showBorder=computed(()=>!1!==this.state().border,...ngDevMode?[{debugName:"showBorder"}]:[]);bodyPadding=computed(()=>!1!==this.state().body_padding,...ngDevMode?[{debugName:"bodyPadding"}]:[]);blur=computed(()=>!0===this.state().blur,...ngDevMode?[{debugName:"blur"}]:[]);backdropClass=computed(()=>this.state().backdrop_class??DEFAULT_MODAL_CONFIG.backdrop_class,...ngDevMode?[{debugName:"backdropClass"}]:[]);dialogClass=computed(()=>{const e=[`backdrop:${this.backdropClass()}`];return this.blur()&&e.push("backdrop:backdrop-blur-sm"),e.join(" ")},...ngDevMode?[{debugName:"dialogClass"}]:[]);closeOnBackdrop=computed(()=>!1!==this.state().backdrop,...ngDevMode?[{debugName:"closeOnBackdrop"}]:[]);bodyPaddingClass=computed(()=>"full"!==this.size()&&this.bodyPadding()?"p-4 sm:p-6":"p-0",...ngDevMode?[{debugName:"bodyPaddingClass"}]:[]);panelClass=computed(()=>["bg-white dark:bg-slate-900 shadow-2xl flex flex-col overflow-hidden transition-all transform max-h-full relative",this.modalMaxWidth(),this.showBorder()?"border border-slate-200 dark:border-slate-700/50":"border-0",this.state().panel_class??""].filter(Boolean).join(" "),...ngDevMode?[{debugName:"panelClass"}]:[]);headerClass=computed(()=>["flex items-center justify-between px-6 py-4 shrink-0",this.showBorder()?"border-b border-slate-200 dark:border-slate-800/80":"border-b-0","bg-slate-50 dark:bg-slate-950/40"].join(" "),...ngDevMode?[{debugName:"headerClass"}]:[]);bodyClass=computed(()=>["overflow-y-auto flex-1 text-slate-700 dark:text-slate-300",this.bodyPadding()?"p-6":"p-0",this.state().body_class??""].join(" "),...ngDevMode?[{debugName:"bodyClass"}]:[]);closeButtonClass=computed(()=>["rounded-lg transition-all focus:outline-none",this.state().close_overlay?"absolute top-4 right-4 z-10 bg-white/90 text-slate-500 shadow-sm size-10 inline-flex items-center justify-center":"p-2 -mr-2 text-slate-400 hover:text-slate-600 hover:bg-slate-200/50 dark:hover:text-slate-200 dark:hover:bg-slate-800/50",this.state().close_class??""].join(" "),...ngDevMode?[{debugName:"closeButtonClass"}]:[]);modalMaxWidth=computed(()=>{const e=this.size();return"full"===e?"w-full h-full max-w-none !rounded-none":"sm"===e?"max-w-sm rounded-2xl w-full":"md"===e?"max-w-2xl rounded-2xl w-full":"lg"===e?"max-w-4xl rounded-2xl w-full":"xl"===e?"max-w-6xl rounded-2xl w-full":["xs","xl","2xl","3xl","4xl","5xl","6xl","7xl"].includes(e)?`max-w-${e} rounded-2xl w-full`:"max-w-4xl rounded-2xl w-full"},...ngDevMode?[{debugName:"modalMaxWidth"}]:[]);build(e={}){this.cfg.set(obj_compact(e)),this.isBuilt.set(!0)}reBuild(e={}){this.resetToInput(),this.build(e)}resetToInput(){this.cfg.set({}),this.isBuilt.set(!1)}setConfig(e={}){this.build(e)}setTitle(e){this.cfg.update(t=>({...t,title:e})),this.isBuilt.set(!0)}setSize(e){this.cfg.update(t=>({...t,size:e})),this.isBuilt.set(!0)}open(e=null){let t=null;"function"==typeof e?t=e:"string"==typeof e?this.setTitle(e):e&&"object"==typeof e&&!Array.isArray(e)&&(this.build(e),t="function"==typeof e.done?e.done:null),this.doneCallback=t,this.isOpen.set(!0),queueMicrotask(()=>{const e=this.modalDialog().nativeElement;e.open||e.showModal()})}_close(e="close"){this.finalizeClose(e)}close(){const e=this.state().confirm_closed;("function"!=typeof e||e())&&this.finalizeClose("close")}onBackdropClick(){this.closeOnBackdrop()&&this.close()}finalizeClose(e="close"){const t=this.modalDialog().nativeElement;t.open&&t.close(),this.isOpen.set(!1),this.doneCallback?.(e),this.doneCallback=null}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifModal,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifModal,isStandalone:!0,selector:"aif-modal",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"modalDialog",first:!0,predicate:["modalDialog"],descendants:!0,isSignal:!0}],ngImport:i0,template:'<dialog\n #modalDialog\n class="bg-transparent focus:outline-none w-full h-full max-w-none max-h-none m-0 p-0 pointer-events-none"\n [ngClass]="dialogClass()">\n @if (isOpen()) {\n <div class="fixed inset-0 w-full h-full flex items-center justify-center pointer-events-auto" \n [ngClass]="bodyPaddingClass()"\n (click)="onBackdropClick()">\n <div\n [class]="panelClass()"\n (click)="$event.stopPropagation()">\n @if (canClose() && state().close_overlay) {\n <button type="button" [class]="closeButtonClass()" (click)="close()">\n <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M6 18L18 6M6 6l12 12"></path>\n </svg>\n </button>\n }\n\n @if (showHeader()) {\n <div [class]="headerClass()">\n <h3 class="text-lg font-bold text-slate-800 dark:text-slate-100 tracking-tight">{{ title() }}</h3>\n \n @if (canClose() && !state().close_overlay) {\n <button type="button" [class]="closeButtonClass()" (click)="close()">\n <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M6 18L18 6M6 6l12 12"></path>\n </svg>\n </button>\n }\n </div>\n }\n\n <div [class]="bodyClass()">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n }\n</dialog>\n',styles:["dialog::backdrop{background-color:#020617cc!important}\n"],dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifModal,decorators:[{type:Component,args:[{selector:"aif-modal",standalone:!0,imports:[NgClass],template:'<dialog\n #modalDialog\n class="bg-transparent focus:outline-none w-full h-full max-w-none max-h-none m-0 p-0 pointer-events-none"\n [ngClass]="dialogClass()">\n @if (isOpen()) {\n <div class="fixed inset-0 w-full h-full flex items-center justify-center pointer-events-auto" \n [ngClass]="bodyPaddingClass()"\n (click)="onBackdropClick()">\n <div\n [class]="panelClass()"\n (click)="$event.stopPropagation()">\n @if (canClose() && state().close_overlay) {\n <button type="button" [class]="closeButtonClass()" (click)="close()">\n <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M6 18L18 6M6 6l12 12"></path>\n </svg>\n </button>\n }\n\n @if (showHeader()) {\n <div [class]="headerClass()">\n <h3 class="text-lg font-bold text-slate-800 dark:text-slate-100 tracking-tight">{{ title() }}</h3>\n \n @if (canClose() && !state().close_overlay) {\n <button type="button" [class]="closeButtonClass()" (click)="close()">\n <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M6 18L18 6M6 6l12 12"></path>\n </svg>\n </button>\n }\n </div>\n }\n\n <div [class]="bodyClass()">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n }\n</dialog>\n',styles:["dialog::backdrop{background-color:#020617cc!important}\n"]}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],modalDialog:[{type:i0.ViewChild,args:["modalDialog",{isSignal:!0}]}]}});const DEFAULT_CFG={overlay:"bg-slate-900/70",buttonClass:"size-20 rounded-full shadow-lg inline-flex items-center justify-center bg-white text-primary mx-auto mt-10",iconClass:"aif aif-play-filled-ico",modalSize:"xl",modal:{}};class AifSectionVideo{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);sanitizer=inject(DomSanitizer);modal=viewChild(AifModal,...ngDevMode?[{debugName:"modal"}]:[]);isActive=signal(!1,...ngDevMode?[{debugName:"isActive"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);state=computed(()=>{const e=this.config(),t=this.builtConfig()??e;return{item:t?.item??{},cfg:{...DEFAULT_CFG,...t?.cfg??{}}}},...ngDevMode?[{debugName:"state"}]:[]);modalConfig=computed(()=>({title:"",size:this.state().cfg.modalSize,close:!0,blur:!0,backdrop:!0,backdrop_class:"bg-slate-950/90",header:!1,border:!1,body_padding:!1,close_overlay:!0,panel_class:"full"===this.state().cfg.modalSize?"bg-black":"bg-black rounded-2xl overflow-hidden aspect-video w-full",body_class:"bg-black",close_class:"hover:bg-white text-slate-600",...this.state().cfg.modal??{}}),...ngDevMode?[{debugName:"modalConfig"}]:[]);videoContainerClass=computed(()=>"full"===this.state().cfg.modalSize?"relative h-full min-h-[60vh] bg-black":"relative aspect-video w-full bg-black",...ngDevMode?[{debugName:"videoContainerClass"}]:[]);safeVideoUrl=computed(()=>this.sanitizer.bypassSecurityTrustResourceUrl(this.state().item.videoUrl),...ngDevMode?[{debugName:"safeVideoUrl"}]:[]);build(e=null){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e))}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1)}openModal(){this.isActive.set(!0),this.modal()?.open({...this.modalConfig(),done:()=>this.onModalClosed()})}closeModal(){this.modal()?.close()}onModalClosed(){this.isActive.set(!1)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSectionVideo,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSectionVideo,isStandalone:!0,selector:"aif-section-video",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"modal",first:!0,predicate:AifModal,descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (state(); as vm) {\n<section class="py-20 w-full table relative bg-center bg-no-repeat bg-cover"\n [style.background-image]="\'url(\' + vm.item.background + \')\'">\n <div class="absolute inset-0" [ngClass]="vm.cfg.overlay"></div>\n\n <div class="container relative">\n <div class="grid grid-cols-1 text-center">\n <h3 class="mb-4 md:text-3xl text-2xl text-white font-medium">\n {{ vm.item.title }}\n </h3>\n\n <p class="text-white/80 max-w-xl mx-auto">\n {{ vm.item.description }}\n </p>\n\n <button type="button" (click)="openModal()" [ngClass]="vm.cfg.buttonClass">\n <i [class]="vm.cfg.iconClass + \' text-2xl align-middle mt-2\'"></i>\n </button>\n </div>\n </div>\n</section>\n\n<aif-modal [config]="modalConfig()">\n @if (isActive()) {\n <div [class]="videoContainerClass()">\n <iframe width="100%" height="100%" [src]="safeVideoUrl()" allowfullscreen>\n </iframe>\n\n <button type="button" (click)="closeModal()"\n class="absolute top-4 right-4 bg-white/90 text-gray-500 size-9 rounded-full shadow-sm">\n <span class="aif aif-cross-alt-ico align-middle"></span>\n </button>\n </div>\n }\n</aif-modal>\n}\n',styles:[""],dependencies:[{kind:"component",type:AifModal,selector:"aif-modal",inputs:["config"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSectionVideo,decorators:[{type:Component,args:[{selector:"aif-section-video",standalone:!0,imports:[AifModal,NgClass],template:'@if (state(); as vm) {\n<section class="py-20 w-full table relative bg-center bg-no-repeat bg-cover"\n [style.background-image]="\'url(\' + vm.item.background + \')\'">\n <div class="absolute inset-0" [ngClass]="vm.cfg.overlay"></div>\n\n <div class="container relative">\n <div class="grid grid-cols-1 text-center">\n <h3 class="mb-4 md:text-3xl text-2xl text-white font-medium">\n {{ vm.item.title }}\n </h3>\n\n <p class="text-white/80 max-w-xl mx-auto">\n {{ vm.item.description }}\n </p>\n\n <button type="button" (click)="openModal()" [ngClass]="vm.cfg.buttonClass">\n <i [class]="vm.cfg.iconClass + \' text-2xl align-middle mt-2\'"></i>\n </button>\n </div>\n </div>\n</section>\n\n<aif-modal [config]="modalConfig()">\n @if (isActive()) {\n <div [class]="videoContainerClass()">\n <iframe width="100%" height="100%" [src]="safeVideoUrl()" allowfullscreen>\n </iframe>\n\n <button type="button" (click)="closeModal()"\n class="absolute top-4 right-4 bg-white/90 text-gray-500 size-9 rounded-full shadow-sm">\n <span class="aif aif-cross-alt-ico align-middle"></span>\n </button>\n </div>\n }\n</aif-modal>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],modal:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifModal),{isSignal:!0}]}]}});class AifSideBar{sidebar=inject(AifSideBarService);router=inject(Router);config=input(null,...ngDevMode?[{debugName:"config"}]:[]);currentUrl=signal(this.router.url,...ngDevMode?[{debugName:"currentUrl"}]:[]);openSubmenu=signal(null,...ngDevMode?[{debugName:"openSubmenu"}]:[]);subMenuHeights=signal({},...ngDevMode?[{debugName:"subMenuHeights"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);isWide=computed(()=>this.sidebar.isExpanded()||this.sidebar.isMobileOpen()||this.sidebar.isHovered(),...ngDevMode?[{debugName:"isWide"}]:[]);isMobileOpen=computed(()=>this.sidebar.isMobileOpen(),...ngDevMode?[{debugName:"isMobileOpen"}]:[]);_routerSb;state=computed(()=>{const e=this.config(),t=this.builtConfig()??e;return{logo:t?.logo??null,logoIcon:t?.logoIcon??null,menu:t?.menu??[]}},...ngDevMode?[{debugName:"state"}]:[]);menu=computed(()=>this.state().menu,...ngDevMode?[{debugName:"menu"}]:[]);logoConfig=computed(()=>this.state().logo,...ngDevMode?[{debugName:"logoConfig"}]:[]);logoIcon=computed(()=>this.state().logoIcon,...ngDevMode?[{debugName:"logoIcon"}]:[]);showExpandedSidebar=computed(()=>this.sidebar.isExpanded()||this.sidebar.isHovered()||this.sidebar.isMobileOpen(),...ngDevMode?[{debugName:"showExpandedSidebar"}]:[]);showExpandedLogo=computed(()=>!!this.logoConfig()&&this.showExpandedSidebar(),...ngDevMode?[{debugName:"showExpandedLogo"}]:[]);showCollapsedLogo=computed(()=>!!this.logoIcon()&&!this.showExpandedSidebar(),...ngDevMode?[{debugName:"showCollapsedLogo"}]:[]);ngOnInit(){this._routerSb=this.router.events.pipe(filter(e=>e instanceof NavigationEnd)).subscribe(e=>this.setActiveMenuFromRoute(e.urlAfterRedirects||e.url)),this.setActiveMenuFromRoute(this.router.url)}ngOnDestroy(){this._routerSb?.unsubscribe?.()}isActive(e){return this.router.url===e}toggleSubmenu(e,t){const n=`${e}-${t}`;if(this.openSubmenu()===n)return this.openSubmenu.set(null),void this.subMenuHeights.update(e=>({...e,[n]:0}));this.openSubmenu.set(n),setTimeout(()=>{const e=document.getElementById(n);e&&this.subMenuHeights.update(t=>({...t,[n]:e.scrollHeight}))},0)}onSidebarMouseEnter(){this.sidebar.isExpanded()||this.sidebar.setHovered(!0)}onSubmenuClick(){this.sidebar.isMobileOpen()&&this.sidebar.setMobileOpen(!1)}build(e=null){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e),this.syncActiveMenu())}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1),this.openSubmenu.set(null),this.subMenuHeights.set({}),this.syncActiveMenu()}setMenu(e=[]){const t=this.builtConfig()??this.config()??{};this.reBuild({...t,menu:e})}setLogo(e,t){const n=this.builtConfig()??this.config()??{};this.reBuild({...n,logo:e,logoIcon:void 0===t?n.logoIcon??null:t})}setActiveMenuFromRoute(e){this.currentUrl.set(e),this.syncActiveMenu()}icon_span(e=""){return`<span class="${e}"></span>`}syncActiveMenu(){const e=this.menu();if(e.length>0)for(const t of e)(t.items||[]).forEach((e,n)=>{if(e.subItems)for(const i of e.subItems)if(this.currentUrl()===i.path){const e=`${t.prefix}-${n}`;this.openSubmenu.set(e),setTimeout(()=>{const t=document.getElementById(e);t&&this.subMenuHeights.update(n=>({...n,[e]:t.scrollHeight}))},0)}})}closeSidebar(){this.sidebar.setMobileOpen(!1)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSideBar,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSideBar,isStandalone:!0,selector:"aif-side-bar",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<aside\n class="fixed top-0 left-0 z-50 flex h-screen flex-col border-r border-gray-200 bg-white px-5 text-gray-900 transition-all duration-300 ease-in-out dark:border-gray-800 dark:bg-gray-900"\n [ngClass]="{\n \'w-[290px]\': isWide(),\n \'w-[90px]\': !isWide(),\n \'translate-x-0\': isMobileOpen(),\n \'-translate-x-full\': !isMobileOpen(),\n \'xl:translate-x-0\': true\n }"\n (mouseenter)="onSidebarMouseEnter()"\n (mouseleave)="sidebar.setHovered(false)">\n <div\n class="flex h-[74px] items-center border-b border-gray-200 dark:border-gray-800"\n [ngClass]="{\n \'xl:justify-center\': !showExpandedSidebar(),\n \'justify-start\': showExpandedSidebar()\n }">\n @if (showExpandedLogo() && logoConfig(); as logo) {\n <aif-nav-logo [cfg]="logo" />\n } @else if (showCollapsedLogo()) {\n <a routerLink="/" class="inline-flex h-10 w-10 items-center justify-center">\n <img [src]="logoIcon()" [alt]="logoConfig()?.alt || \'Logo\'" width="32" height="32" />\n </a>\n }\n </div>\n\n <div class="no-scrollbar flex flex-col overflow-y-auto duration-300 ease-linear">\n <nav class="mb-6">\n <div class="flex flex-col gap-4">\n @if (menu().length) {\n @for (menuItems of menu(); track $index; let i = $index) {\n <div>\n <h2\n class="mb-4 flex text-xs leading-[20px] uppercase text-gray-400"\n [ngClass]="{\n \'xl:justify-center\': !showExpandedSidebar(),\n \'justify-start\': showExpandedSidebar()\n }">\n @if (showExpandedSidebar()) {\n {{ menuItems.name }}\n } @else {\n @if(menuItems.icon){\n <span class="menu-item-icon-size" [innerHTML]="icon_span(menuItems.icon) | aifSafeHtml"></span>\n } @else {\n <svg\n width="1em"\n height="1em"\n viewBox="0 0 24 24"\n fill="none"\n xmlns="http://www.w3.org/2000/svg"\n class="size-6">\n <path\n fill-rule="evenodd"\n clip-rule="evenodd"\n d="M5.99915 10.2451C6.96564 10.2451 7.74915 11.0286 7.74915 11.9951V12.0051C7.74915 12.9716 6.96564 13.7551 5.99915 13.7551C5.03265 13.7551 4.24915 12.9716 4.24915 12.0051V11.9951C4.24915 11.0286 5.03265 10.2451 5.99915 10.2451ZM17.9991 10.2451C18.9656 10.2451 19.7491 11.0286 19.7491 11.9951V12.0051C19.7491 12.9716 18.9656 13.7551 17.9991 13.7551C17.0326 13.7551 16.2491 12.9716 16.2491 12.0051V11.9951C16.2491 11.0286 17.0326 10.2451 17.9991 10.2451ZM13.7491 11.9951C13.7491 11.0286 12.9656 10.2451 11.9991 10.2451C11.0326 10.2451 10.2491 11.0286 10.2491 11.9951V12.0051C10.2491 12.9716 11.0326 13.7551 11.9991 13.7551C12.9656 13.7551 13.7491 12.9716 13.7491 12.0051V11.9951Z"\n fill="currentColor"></path>\n </svg>\n }\n }\n </h2>\n\n @if (menuItems.items) {\n <ul class="flex flex-col gap-1">\n @for (nav of menuItems.items; track $index; let i = $index) {\n <li>\n @if (nav.subItems) {\n <button\n type="button"\n (click)="toggleSubmenu(menuItems.prefix||\'main\', i)"\n class="menu-item group cursor-pointer"\n [class.menu-item-active]="openSubmenu() === menuItems.prefix + \'-\' + i"\n [class.menu-item-inactive]="openSubmenu() !== menuItems.prefix + \'-\' + i"\n [ngClass]="{\n \'xl:justify-center\': !showExpandedSidebar(),\n \'xl:justify-start\': showExpandedSidebar()\n }">\n <span\n class="menu-item-icon-size"\n [class.menu-item-icon-active]="openSubmenu() === menuItems.prefix + \'-\' + i"\n [class.menu-item-icon-inactive]="openSubmenu() !== menuItems.prefix + \'-\' + i"\n [innerHTML]="nav.svg ? nav.svg : icon_span(nav.icon) | aifSafeHtml"></span>\n\n @if (showExpandedSidebar()) {\n <span class="menu-item-text">{{ nav.name }}</span>\n }\n\n @if (nav.new && showExpandedSidebar()) {\n <span\n class="menu-dropdown-badge absolute right-10 ml-auto"\n [ngClass]="{\n \'menu-dropdown-badge-active\': openSubmenu() === menuItems.prefix + \'-\' + i,\n \'menu-dropdown-badge-inactive\': openSubmenu() !== menuItems.prefix + \'-\' + i\n }">\n new\n </span>\n }\n\n @if (showExpandedSidebar()) {\n <svg\n [ngClass]="{ \'rotate-180 text-brand-500\': openSubmenu() === menuItems.prefix + \'-\' + i }"\n width="1em"\n height="1em"\n viewBox="0 0 20 20"\n fill="none"\n xmlns="http://www.w3.org/2000/svg"\n class="ml-auto h-5 w-5 transition-transform duration-200">\n <path\n d="M4.79175 7.396L10.0001 12.6043L15.2084 7.396"\n stroke="currentColor"\n stroke-width="1.5"\n stroke-linecap="round"\n stroke-linejoin="round"></path>\n </svg>\n }\n </button>\n\n <div\n class="overflow-hidden transition-all duration-300"\n [id]="menuItems.prefix + \'-\' + i"\n [style.display]="isWide() ? \'block\' : \'none\'"\n [ngStyle]="{\n height:\n openSubmenu() === menuItems.prefix + \'-\' + i\n ? ((subMenuHeights()[menuItems.prefix + \'-\' + i] || 0) + \'px\')\n : \'0px\'\n }">\n <ul class="mt-2 ml-9 space-y-1">\n @for (subItem of nav.subItems; track $index) {\n <li>\n <a\n [routerLink]="subItem.path"\n routerLinkActive=""\n (click)="onSubmenuClick()"\n class="menu-dropdown-item"\n [ngClass]="{\n \'menu-dropdown-item-inactive\': !isActive(subItem.path),\n \'menu-dropdown-item-active\': isActive(subItem.path)\n }">\n {{ subItem.name }}\n\n <span class="ml-auto flex items-center gap-1">\n @if (subItem.new) {\n <span\n class="menu-dropdown-badge"\n [ngClass]="{\n \'menu-dropdown-badge-active\': isActive(subItem.path),\n \'menu-dropdown-badge-inactive\': !isActive(subItem.path)\n }">\n new\n </span>\n }\n @if (subItem.pro) {\n <span\n class="menu-dropdown-badge-pro ml-auto"\n [ngClass]="{\n \'menu-dropdown-badge-pro-active\': isActive(subItem.path),\n \'menu-dropdown-badge-pro-inactive\': !isActive(subItem.path)\n }">\n pro\n </span>\n }\n </span>\n </a>\n </li>\n }\n </ul>\n </div>\n } @else {\n @if (nav.path) {\n <a\n [routerLink]="nav.path"\n routerLinkActive="menu-item-active"\n class="menu-item group"\n [ngClass]="{\n \'menu-item-inactive\': !isActive(nav.path),\n \'xl:justify-center\': !showExpandedSidebar(),\n \'xl:justify-start\': showExpandedSidebar()\n }">\n <span\n class="menu-item-icon-size"\n [ngClass]="{\n \'menu-item-icon-active\': isActive(nav.path),\n \'menu-item-icon-inactive\': !isActive(nav.path)\n }"\n [innerHTML]="nav.svg ? nav.svg : icon_span(nav.icon) | aifSafeHtml"></span>\n\n @if (showExpandedSidebar()) {\n <span class="menu-item-text">\n {{ nav.name }}\n </span>\n }\n </a>\n }\n }\n </li>\n }\n </ul>\n }\n </div>\n }\n }\n </div>\n </nav>\n </div>\n</aside>\n\n@if (isMobileOpen()) {\n<div class="fixed inset-0 z-40 bg-gray-900/50 lg:hidden" (click)="closeSidebar()"></div>\n}\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:NgStyle,selector:"[ngStyle]",inputs:["ngStyle"]},{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]},{kind:"component",type:AifNavLogo,selector:"aif-nav-logo",inputs:["cfg","surface"]},{kind:"pipe",type:AifSafeHtmlPipe,name:"aifSafeHtml"}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSideBar,decorators:[{type:Component,args:[{selector:"aif-side-bar",standalone:!0,imports:[NgClass,NgStyle,RouterLink,AifSafeHtmlPipe,AifNavLogo],template:'<aside\n class="fixed top-0 left-0 z-50 flex h-screen flex-col border-r border-gray-200 bg-white px-5 text-gray-900 transition-all duration-300 ease-in-out dark:border-gray-800 dark:bg-gray-900"\n [ngClass]="{\n \'w-[290px]\': isWide(),\n \'w-[90px]\': !isWide(),\n \'translate-x-0\': isMobileOpen(),\n \'-translate-x-full\': !isMobileOpen(),\n \'xl:translate-x-0\': true\n }"\n (mouseenter)="onSidebarMouseEnter()"\n (mouseleave)="sidebar.setHovered(false)">\n <div\n class="flex h-[74px] items-center border-b border-gray-200 dark:border-gray-800"\n [ngClass]="{\n \'xl:justify-center\': !showExpandedSidebar(),\n \'justify-start\': showExpandedSidebar()\n }">\n @if (showExpandedLogo() && logoConfig(); as logo) {\n <aif-nav-logo [cfg]="logo" />\n } @else if (showCollapsedLogo()) {\n <a routerLink="/" class="inline-flex h-10 w-10 items-center justify-center">\n <img [src]="logoIcon()" [alt]="logoConfig()?.alt || \'Logo\'" width="32" height="32" />\n </a>\n }\n </div>\n\n <div class="no-scrollbar flex flex-col overflow-y-auto duration-300 ease-linear">\n <nav class="mb-6">\n <div class="flex flex-col gap-4">\n @if (menu().length) {\n @for (menuItems of menu(); track $index; let i = $index) {\n <div>\n <h2\n class="mb-4 flex text-xs leading-[20px] uppercase text-gray-400"\n [ngClass]="{\n \'xl:justify-center\': !showExpandedSidebar(),\n \'justify-start\': showExpandedSidebar()\n }">\n @if (showExpandedSidebar()) {\n {{ menuItems.name }}\n } @else {\n @if(menuItems.icon){\n <span class="menu-item-icon-size" [innerHTML]="icon_span(menuItems.icon) | aifSafeHtml"></span>\n } @else {\n <svg\n width="1em"\n height="1em"\n viewBox="0 0 24 24"\n fill="none"\n xmlns="http://www.w3.org/2000/svg"\n class="size-6">\n <path\n fill-rule="evenodd"\n clip-rule="evenodd"\n d="M5.99915 10.2451C6.96564 10.2451 7.74915 11.0286 7.74915 11.9951V12.0051C7.74915 12.9716 6.96564 13.7551 5.99915 13.7551C5.03265 13.7551 4.24915 12.9716 4.24915 12.0051V11.9951C4.24915 11.0286 5.03265 10.2451 5.99915 10.2451ZM17.9991 10.2451C18.9656 10.2451 19.7491 11.0286 19.7491 11.9951V12.0051C19.7491 12.9716 18.9656 13.7551 17.9991 13.7551C17.0326 13.7551 16.2491 12.9716 16.2491 12.0051V11.9951C16.2491 11.0286 17.0326 10.2451 17.9991 10.2451ZM13.7491 11.9951C13.7491 11.0286 12.9656 10.2451 11.9991 10.2451C11.0326 10.2451 10.2491 11.0286 10.2491 11.9951V12.0051C10.2491 12.9716 11.0326 13.7551 11.9991 13.7551C12.9656 13.7551 13.7491 12.9716 13.7491 12.0051V11.9951Z"\n fill="currentColor"></path>\n </svg>\n }\n }\n </h2>\n\n @if (menuItems.items) {\n <ul class="flex flex-col gap-1">\n @for (nav of menuItems.items; track $index; let i = $index) {\n <li>\n @if (nav.subItems) {\n <button\n type="button"\n (click)="toggleSubmenu(menuItems.prefix||\'main\', i)"\n class="menu-item group cursor-pointer"\n [class.menu-item-active]="openSubmenu() === menuItems.prefix + \'-\' + i"\n [class.menu-item-inactive]="openSubmenu() !== menuItems.prefix + \'-\' + i"\n [ngClass]="{\n \'xl:justify-center\': !showExpandedSidebar(),\n \'xl:justify-start\': showExpandedSidebar()\n }">\n <span\n class="menu-item-icon-size"\n [class.menu-item-icon-active]="openSubmenu() === menuItems.prefix + \'-\' + i"\n [class.menu-item-icon-inactive]="openSubmenu() !== menuItems.prefix + \'-\' + i"\n [innerHTML]="nav.svg ? nav.svg : icon_span(nav.icon) | aifSafeHtml"></span>\n\n @if (showExpandedSidebar()) {\n <span class="menu-item-text">{{ nav.name }}</span>\n }\n\n @if (nav.new && showExpandedSidebar()) {\n <span\n class="menu-dropdown-badge absolute right-10 ml-auto"\n [ngClass]="{\n \'menu-dropdown-badge-active\': openSubmenu() === menuItems.prefix + \'-\' + i,\n \'menu-dropdown-badge-inactive\': openSubmenu() !== menuItems.prefix + \'-\' + i\n }">\n new\n </span>\n }\n\n @if (showExpandedSidebar()) {\n <svg\n [ngClass]="{ \'rotate-180 text-brand-500\': openSubmenu() === menuItems.prefix + \'-\' + i }"\n width="1em"\n height="1em"\n viewBox="0 0 20 20"\n fill="none"\n xmlns="http://www.w3.org/2000/svg"\n class="ml-auto h-5 w-5 transition-transform duration-200">\n <path\n d="M4.79175 7.396L10.0001 12.6043L15.2084 7.396"\n stroke="currentColor"\n stroke-width="1.5"\n stroke-linecap="round"\n stroke-linejoin="round"></path>\n </svg>\n }\n </button>\n\n <div\n class="overflow-hidden transition-all duration-300"\n [id]="menuItems.prefix + \'-\' + i"\n [style.display]="isWide() ? \'block\' : \'none\'"\n [ngStyle]="{\n height:\n openSubmenu() === menuItems.prefix + \'-\' + i\n ? ((subMenuHeights()[menuItems.prefix + \'-\' + i] || 0) + \'px\')\n : \'0px\'\n }">\n <ul class="mt-2 ml-9 space-y-1">\n @for (subItem of nav.subItems; track $index) {\n <li>\n <a\n [routerLink]="subItem.path"\n routerLinkActive=""\n (click)="onSubmenuClick()"\n class="menu-dropdown-item"\n [ngClass]="{\n \'menu-dropdown-item-inactive\': !isActive(subItem.path),\n \'menu-dropdown-item-active\': isActive(subItem.path)\n }">\n {{ subItem.name }}\n\n <span class="ml-auto flex items-center gap-1">\n @if (subItem.new) {\n <span\n class="menu-dropdown-badge"\n [ngClass]="{\n \'menu-dropdown-badge-active\': isActive(subItem.path),\n \'menu-dropdown-badge-inactive\': !isActive(subItem.path)\n }">\n new\n </span>\n }\n @if (subItem.pro) {\n <span\n class="menu-dropdown-badge-pro ml-auto"\n [ngClass]="{\n \'menu-dropdown-badge-pro-active\': isActive(subItem.path),\n \'menu-dropdown-badge-pro-inactive\': !isActive(subItem.path)\n }">\n pro\n </span>\n }\n </span>\n </a>\n </li>\n }\n </ul>\n </div>\n } @else {\n @if (nav.path) {\n <a\n [routerLink]="nav.path"\n routerLinkActive="menu-item-active"\n class="menu-item group"\n [ngClass]="{\n \'menu-item-inactive\': !isActive(nav.path),\n \'xl:justify-center\': !showExpandedSidebar(),\n \'xl:justify-start\': showExpandedSidebar()\n }">\n <span\n class="menu-item-icon-size"\n [ngClass]="{\n \'menu-item-icon-active\': isActive(nav.path),\n \'menu-item-icon-inactive\': !isActive(nav.path)\n }"\n [innerHTML]="nav.svg ? nav.svg : icon_span(nav.icon) | aifSafeHtml"></span>\n\n @if (showExpandedSidebar()) {\n <span class="menu-item-text">\n {{ nav.name }}\n </span>\n }\n </a>\n }\n }\n </li>\n }\n </ul>\n }\n </div>\n }\n }\n </div>\n </nav>\n </div>\n</aside>\n\n@if (isMobileOpen()) {\n<div class="fixed inset-0 z-40 bg-gray-900/50 lg:hidden" (click)="closeSidebar()"></div>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifSliderBar{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);sliderContainer=viewChild("sliderContainer",...ngDevMode?[{debugName:"sliderContainer"}]:[]);state=computed(()=>{const e=this.builtConfig()??this.config();return{items:e?.items??[],cfg:{controls:!0,mouseDrag:!0,loop:!0,rewind:!0,autoplay:!0,autoplayTimeout:3e3,nav:!1,speed:400,gutter:0,responsive:{1025:{items:12},992:{items:8},767:{items:6},320:{items:2}},controlsText:['<i class="aif aif-chevron-left-ico "></i>','<i class="aif aif-chevron-right-ico"></i>'],...e?.cfg??{}}}},...ngDevMode?[{debugName:"state"}]:[]);slider;currentSignature="";constructor(){afterRenderEffect(()=>{const e=this.sliderContainer(),t=this.state(),n=JSON.stringify({items:t.items,cfg:t.cfg});n!==this.currentSignature&&(this.currentSignature=n,e&&t.items.length>0?this.initSlider(e.nativeElement,t.cfg):this.destroySlider())})}build(e=null){e&&this.builtConfig.set(e),this.currentSignature=""}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.currentSignature=""}initSlider(e,t){this.destroySlider(),this.slider=tns({container:e,controls:t.controls,mouseDrag:t.mouseDrag,loop:t.loop,rewind:t.rewind,autoplay:t.autoplay,autoplayButtonOutput:!1,autoplayTimeout:t.autoplayTimeout,navPosition:"bottom",controlsText:t.controlsText,nav:t.nav,speed:t.speed,gutter:t.gutter,responsive:t.responsive})}destroySlider(){this.slider&&(this.slider.destroy(),this.slider=null)}ngOnDestroy(){this.destroySlider()}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSliderBar,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSliderBar,isStandalone:!0,selector:"aif-slider-bar",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"sliderContainer",first:!0,predicate:["sliderContainer"],descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (state(); as vm) {\n<section class="container-fluid relative bg-slate-900 dark:bg-slate-800">\n <div class="grid grid-cols-1 relative">\n <div class="tiny-twelve-item" #sliderContainer>\n @for (item of vm.items; track item.image + \'-\' + item.route) {\n <div class="tiny-slide p-2">\n <div class="card border-0 rounded-0">\n <div class="card-body p-0">\n <a [href]="item.route" target="_blank" class="d-inline-block" [title]="item.title || \'\'">\n <img [src]="item.image" class="opacity-50 hover:opacity-100 transition duration-300"\n alt="Insta Post" />\n <div class="overlay bg-dark"></div>\n </a>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\x3c!--end grid--\x3e\n</section>\n}\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSliderBar,decorators:[{type:Component,args:[{selector:"aif-slider-bar",standalone:!0,imports:[],template:'@if (state(); as vm) {\n<section class="container-fluid relative bg-slate-900 dark:bg-slate-800">\n <div class="grid grid-cols-1 relative">\n <div class="tiny-twelve-item" #sliderContainer>\n @for (item of vm.items; track item.image + \'-\' + item.route) {\n <div class="tiny-slide p-2">\n <div class="card border-0 rounded-0">\n <div class="card-body p-0">\n <a [href]="item.route" target="_blank" class="d-inline-block" [title]="item.title || \'\'">\n <img [src]="item.image" class="opacity-50 hover:opacity-100 transition duration-300"\n alt="Insta Post" />\n <div class="overlay bg-dark"></div>\n </a>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\x3c!--end grid--\x3e\n</section>\n}\n'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],sliderContainer:[{type:i0.ViewChild,args:["sliderContainer",{isSignal:!0}]}]}});class AifSliderFull{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);state=computed(()=>{const e=this.builtConfig()??this.config();return{items:e?.items??[],cfg:e?.cfg??{},opts:e?.opts??{}}},...ngDevMode?[{debugName:"state"}]:[]);options=computed(()=>{const e=this.state().opts;return{class_container:e.class_container||"carouselThree swiper-slider-hero relative overflow-x-hidden h-screen",class_wrapper:e.class_wrapper||"relative h-screen inset-0",buttons:void 0===e.buttons||e.buttons,pagination:void 0===e.pagination||e.pagination}},...ngDevMode?[{debugName:"options"}]:[]);swiperContainer=viewChild("swiperContainer",...ngDevMode?[{debugName:"swiperContainer"}]:[]);swiper;currentSignature="";constructor(){register(),afterRenderEffect(()=>{const e=this.swiperContainer(),t=this.state(),n=JSON.stringify({items:t.items,cfg:t.cfg,opts:t.opts});n!==this.currentSignature&&(this.currentSignature=n,e&&0!==t.items.length?this.mountSwiper():this.destroySwiper())})}build(e=null){e&&this.builtConfig.set(e),this.currentSignature=""}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.currentSignature=""}mountSwiper(){const e=this.swiperContainer(),t=this.state().items;if(!e||!t||0===t.length)return;this.destroySwiper();const n={slidesPerView:1,spaceBetween:0,autoplay:!0,speed:3e3,loop:!0,navigation:{nextEl:".swiper-button-next",prevEl:".swiper-button-prev"},pagination:{el:".swiper-pagination",clickable:!0},...this.state().cfg};this.swiper=new Swiper(e.nativeElement,n)}destroySwiper(){this.swiper?.destroy(!0,!0),this.swiper=void 0}ngOnDestroy(){this.destroySwiper()}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSliderFull,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSliderFull,isStandalone:!0,selector:"aif-slider-full",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"swiperContainer",first:!0,predicate:["swiperContainer"],descendants:!0,isSignal:!0}],ngImport:i0,template:"@if (state(); as vm) {\n<div class=\"swiper\" [class]=\"options().class_container\" #swiperContainer>\n <div class=\"swiper-wrapper\" [class]=\"options().class_wrapper\">\n\n @for (slide of vm.items; track $index) {\n <div class=\"swiper-slide flex items-center justify-center duration-700 ease-in-out overflow-hidden\">\n\n \x3c!-- Imagen con efecto extendido tipo Techwind --\x3e\n <div class=\"image-wrap absolute inset-0\n -top-[350px] -bottom-[350px]\n -start-[100px] -end-[100px]\n min-w-full w-auto min-h-full h-auto\n overflow-hidden m-auto z-1\n bg-top bg-no-repeat bg-cover\" [ngStyle]=\"{\n 'background-image': 'url(' + slide.image + ')'\n }\">\n </div>\n\n \x3c!-- Overlay dinámico --\x3e\n <div class=\"absolute inset-0 z-2 bg-slate-900/70\" [ngClass]=\"{\n 'ltr:md:bg-gradient-to-r rtl:md:bg-gradient-to-l md:from-slate-900 md:via-slate-900/80 md:bg-slate-900/20':\n slide.gradient_direction === 'right',\n 'md:bg-gradient-to-b md:from-transparent md:to-slate-900 md:bg-slate-900/20':\n slide.gradient_direction === 'bottom',\n 'ltr:md:bg-gradient-to-l rtl:md:bg-gradient-to-r md:from-slate-900 md:via-slate-900/80 md:bg-slate-900/20':\n slide.gradient_direction === 'left'\n }\"></div>\n\n \x3c!-- Contenido --\x3e\n <div class=\"relative z-3 mx-auto h-full w-full max-w-7xl px-6 lg:px-8 flex items-center\" [ngClass]=\"{\n 'justify-center': slide.align === 'center',\n 'justify-start': slide.align === 'start',\n 'justify-end': slide.align === 'end'\n }\">\n\n <div class=\"grid grid-cols-1 mt-10 w-full\">\n <div [ngClass]=\"{\n 'text-center': slide.align === 'center',\n 'md:text-start text-center': slide.align === 'start',\n 'md:text-end text-center': slide.align === 'end'\n }\"\n class=\"w-full max-w-4xl\">\n <h1 class=\"font-bold text-white lg:leading-normal leading-normal text-4xl lg:text-5xl mb-6\">\n {{ slide.title }}\n </h1>\n\n <p class=\"text-white/70 text-lg max-w-xl\" [ngClass]=\"{\n 'mx-auto': slide.align === 'center',\n 'md:ms-auto': slide.align === 'end'\n }\">\n {{ slide.description }}\n </p>\n\n <div class=\"mt-8\">\n <a [routerLink]=\"slide.route\" class=\"py-2 px-5 inline-block font-semibold tracking-wide border align-middle duration-500\n text-base text-center bg-primary hover:bg-primary-700\n border-primary hover:border-primary-700 text-white rounded-md\">\n {{ slide.label }}\n </a>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n\n \x3c!-- 🔹 Botones de navegación --\x3e\n @if(options().buttons === true) {\n <div class=\"swiper-button-prev\">\n <span class=\"aif aif-chevron-left-ico text-6xl\"></span>\n </div>\n <div class=\"swiper-button-next\">\n <span class=\"aif aif-chevron-right-ico text-6xl\"></span>\n </div>\n }\n\n\n @if(options().pagination === true) {\n <div class=\"swiper-pagination\"></div>\n }\n\n</div>\n}\n",styles:[":host .swiper-pagination{position:absolute;left:50%;bottom:1.35rem;z-index:20;display:inline-flex;width:auto;transform:translate(-50%);align-items:center;gap:.38rem;padding:0;background:transparent;box-shadow:none;border:0;-webkit-backdrop-filter:none;backdrop-filter:none}:host .swiper-pagination-bullet{margin:0;width:.42rem;height:.42rem;border-radius:999px;background:#38bdf859;opacity:1;transition:background-color .18s ease,transform .18s ease}:host .swiper-pagination-bullet-active{background:#38bdf8f2;transform:scale(1.05)}@media(max-width:768px){:host .swiper-pagination{bottom:.95rem;gap:.34rem}}\n"],dependencies:[{kind:"directive",type:NgStyle,selector:"[ngStyle]",inputs:["ngStyle"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSliderFull,decorators:[{type:Component,args:[{selector:"aif-slider-full",standalone:!0,imports:[NgStyle,NgClass,RouterLink],template:"@if (state(); as vm) {\n<div class=\"swiper\" [class]=\"options().class_container\" #swiperContainer>\n <div class=\"swiper-wrapper\" [class]=\"options().class_wrapper\">\n\n @for (slide of vm.items; track $index) {\n <div class=\"swiper-slide flex items-center justify-center duration-700 ease-in-out overflow-hidden\">\n\n \x3c!-- Imagen con efecto extendido tipo Techwind --\x3e\n <div class=\"image-wrap absolute inset-0\n -top-[350px] -bottom-[350px]\n -start-[100px] -end-[100px]\n min-w-full w-auto min-h-full h-auto\n overflow-hidden m-auto z-1\n bg-top bg-no-repeat bg-cover\" [ngStyle]=\"{\n 'background-image': 'url(' + slide.image + ')'\n }\">\n </div>\n\n \x3c!-- Overlay dinámico --\x3e\n <div class=\"absolute inset-0 z-2 bg-slate-900/70\" [ngClass]=\"{\n 'ltr:md:bg-gradient-to-r rtl:md:bg-gradient-to-l md:from-slate-900 md:via-slate-900/80 md:bg-slate-900/20':\n slide.gradient_direction === 'right',\n 'md:bg-gradient-to-b md:from-transparent md:to-slate-900 md:bg-slate-900/20':\n slide.gradient_direction === 'bottom',\n 'ltr:md:bg-gradient-to-l rtl:md:bg-gradient-to-r md:from-slate-900 md:via-slate-900/80 md:bg-slate-900/20':\n slide.gradient_direction === 'left'\n }\"></div>\n\n \x3c!-- Contenido --\x3e\n <div class=\"relative z-3 mx-auto h-full w-full max-w-7xl px-6 lg:px-8 flex items-center\" [ngClass]=\"{\n 'justify-center': slide.align === 'center',\n 'justify-start': slide.align === 'start',\n 'justify-end': slide.align === 'end'\n }\">\n\n <div class=\"grid grid-cols-1 mt-10 w-full\">\n <div [ngClass]=\"{\n 'text-center': slide.align === 'center',\n 'md:text-start text-center': slide.align === 'start',\n 'md:text-end text-center': slide.align === 'end'\n }\"\n class=\"w-full max-w-4xl\">\n <h1 class=\"font-bold text-white lg:leading-normal leading-normal text-4xl lg:text-5xl mb-6\">\n {{ slide.title }}\n </h1>\n\n <p class=\"text-white/70 text-lg max-w-xl\" [ngClass]=\"{\n 'mx-auto': slide.align === 'center',\n 'md:ms-auto': slide.align === 'end'\n }\">\n {{ slide.description }}\n </p>\n\n <div class=\"mt-8\">\n <a [routerLink]=\"slide.route\" class=\"py-2 px-5 inline-block font-semibold tracking-wide border align-middle duration-500\n text-base text-center bg-primary hover:bg-primary-700\n border-primary hover:border-primary-700 text-white rounded-md\">\n {{ slide.label }}\n </a>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n\n \x3c!-- 🔹 Botones de navegación --\x3e\n @if(options().buttons === true) {\n <div class=\"swiper-button-prev\">\n <span class=\"aif aif-chevron-left-ico text-6xl\"></span>\n </div>\n <div class=\"swiper-button-next\">\n <span class=\"aif aif-chevron-right-ico text-6xl\"></span>\n </div>\n }\n\n\n @if(options().pagination === true) {\n <div class=\"swiper-pagination\"></div>\n }\n\n</div>\n}\n",styles:[":host .swiper-pagination{position:absolute;left:50%;bottom:1.35rem;z-index:20;display:inline-flex;width:auto;transform:translate(-50%);align-items:center;gap:.38rem;padding:0;background:transparent;box-shadow:none;border:0;-webkit-backdrop-filter:none;backdrop-filter:none}:host .swiper-pagination-bullet{margin:0;width:.42rem;height:.42rem;border-radius:999px;background:#38bdf859;opacity:1;transition:background-color .18s ease,transform .18s ease}:host .swiper-pagination-bullet-active{background:#38bdf8f2;transform:scale(1.05)}@media(max-width:768px){:host .swiper-pagination{bottom:.95rem;gap:.34rem}}\n"]}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],swiperContainer:[{type:i0.ViewChild,args:["swiperContainer",{isSignal:!0}]}]}});class AifThemeSwitcher{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);themeService=inject(AifThemeService);state=computed(()=>{const e=this.builtConfig()??this.config()??{};return{position:e.position??"right-center",class:e.class??"",trackClass:e.trackClass??"",thumbClass:e.thumbClass??"",ariaLabelLight:e.ariaLabelLight??"Activar tema oscuro",ariaLabelDark:e.ariaLabelDark??"Activar tema claro"}},...ngDevMode?[{debugName:"state"}]:[]);wrapperClass=computed(()=>`${{"right-center":"fixed top-[30%] right-2 z-50","left-center":"fixed top-[30%] left-2 z-50","right-bottom":"fixed bottom-6 right-4 z-50","left-bottom":"fixed bottom-6 left-4 z-50"}[this.state().position]} ${this.state().class}`.trim(),...ngDevMode?[{debugName:"wrapperClass"}]:[]);trackClass=computed(()=>`relative flex h-11 w-6 items-center justify-center rounded-full border border-white/20 bg-slate-900 shadow-lg shadow-slate-950/25 transition-colors dark:border-slate-700 dark:bg-white ${this.state().trackClass}`.trim(),...ngDevMode?[{debugName:"trackClass"}]:[]);thumbClass=computed(()=>`pointer-events-none absolute left-1/2 top-1/2 flex size-4 -translate-x-1/2 items-center justify-center rounded-full bg-white text-[10px] text-slate-900 shadow-sm transition-transform dark:bg-slate-900 dark:text-yellow-400 ${this.themeService.isLight()?"translate-y-[0.7rem]":"-translate-y-[0.7rem]"} ${this.state().thumbClass}`.trim(),...ngDevMode?[{debugName:"thumbClass"}]:[]);ariaLabel=computed(()=>this.themeService.isDark()?this.state().ariaLabelDark:this.state().ariaLabelLight,...ngDevMode?[{debugName:"ariaLabel"}]:[]);changeTheme(){this.themeService.toggle()}build(e){return this.builtConfig.set(e??null),this}reBuild(e){return this.builtConfig.set(null),this.build(e)}resetToInput(){return this.builtConfig.set(null),this}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeSwitcher,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifThemeSwitcher,isStandalone:!0,selector:"aif-theme-switcher",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div [class]="wrapperClass()">\n <button type="button" role="switch" [attr.aria-checked]="themeService.isLight()" [attr.aria-label]="ariaLabel()"\n [class]="trackClass()" (click)="changeTheme()">\n <i\n class="aif aif-moon-ico absolute top-1.5 left-1/2 -translate-x-1/2 text-[12px] text-yellow-400 transition-opacity dark:text-slate-700"\n [class.opacity-100]="themeService.isDark()" [class.opacity-45]="themeService.isLight()"></i>\n <i\n class="aif aif-sun-ico absolute bottom-1.5 left-1/2 -translate-x-1/2 text-[12px] text-yellow-400 transition-opacity dark:text-slate-700"\n [class.opacity-100]="themeService.isLight()" [class.opacity-45]="themeService.isDark()"></i>\n <span [class]="thumbClass()"></span>\n </button>\n</div>\n',styles:[""]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeSwitcher,decorators:[{type:Component,args:[{selector:"aif-theme-switcher",standalone:!0,imports:[],template:'<div [class]="wrapperClass()">\n <button type="button" role="switch" [attr.aria-checked]="themeService.isLight()" [attr.aria-label]="ariaLabel()"\n [class]="trackClass()" (click)="changeTheme()">\n <i\n class="aif aif-moon-ico absolute top-1.5 left-1/2 -translate-x-1/2 text-[12px] text-yellow-400 transition-opacity dark:text-slate-700"\n [class.opacity-100]="themeService.isDark()" [class.opacity-45]="themeService.isLight()"></i>\n <i\n class="aif aif-sun-ico absolute bottom-1.5 left-1/2 -translate-x-1/2 text-[12px] text-yellow-400 transition-opacity dark:text-slate-700"\n [class.opacity-100]="themeService.isLight()" [class.opacity-45]="themeService.isDark()"></i>\n <span [class]="thumbClass()"></span>\n </button>\n</div>\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifGoTop{destroyRef=inject(DestroyRef);circleRef=viewChild.required("progressCircle");strokeLength=signal(0,...ngDevMode?[{debugName:"strokeLength"}]:[]);rafId=null;offsetFromTop=450;isVisible=signal(!1,...ngDevMode?[{debugName:"isVisible"}]:[]);dashOffset=signal(0,...ngDevMode?[{debugName:"dashOffset"}]:[]);ngAfterViewInit(){const e=this.circleRef().nativeElement.getTotalLength();this.strokeLength.set(e),this.dashOffset.set(e);const t=()=>{null===this.rafId&&(this.rafId=requestAnimationFrame(()=>{this.rafId=null;const e=document.documentElement,t=e.scrollTop||document.body.scrollTop||0,n=e.scrollHeight-e.clientHeight||1,i=Math.max(0,Math.min(1,t/n)),a=this.strokeLength(),s=a-a*i;this.dashOffset.set(s),this.isVisible.set((window.scrollY||t)>this.offsetFromTop)}))};t(),window.addEventListener("scroll",t,{passive:!0}),this.destroyRef.onDestroy(()=>{window.removeEventListener("scroll",t),null!==this.rafId&&cancelAnimationFrame(this.rafId)})}scrollToTop(){window.scrollTo({top:0,behavior:"smooth"})}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGoTop,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.2.0",version:"21.1.1",type:AifGoTop,isStandalone:!0,selector:"aif-go-top",viewQueries:[{propertyName:"circleRef",first:!0,predicate:["progressCircle"],descendants:!0,isSignal:!0}],ngImport:i0,template:'<button type="button" aria-label="Scroll back to top" (click)="scrollToTop()" class="fixed bottom-6 right-6 z-50 h-12 w-12 rounded-full border border-slate-200/80 bg-white/85 text-slate-900 shadow-[0_10px_30px_rgba(15,23,42,0.18)] backdrop-blur-md\n transition-all duration-300 ease-out hover:-translate-y-0.5 hover:bg-white hover:shadow-[0_16px_40px_rgba(15,23,42,0.24)]\n dark:border-slate-700/80 dark:bg-slate-900/85 dark:text-slate-100 dark:shadow-[0_12px_30px_rgba(2,6,23,0.45)] dark:hover:bg-slate-900\n opacity-0 pointer-events-none translate-y-2"\n [class.opacity-100]="isVisible()"\n [class.pointer-events-auto]="isVisible()"\n [class.translate-y-0]="isVisible()"\n [class.opacity-0]="!isVisible()"\n [class.pointer-events-none]="!isVisible()"\n [class.translate-y-2]="!isVisible()">\n <span\n class="absolute inset-[3px] rounded-full bg-gradient-to-br from-sky-100 via-white to-cyan-50 dark:from-slate-800 dark:via-slate-900 dark:to-slate-800"></span>\n\n <svg class="absolute inset-0 h-full w-full -rotate-90" viewBox="0 0 40 40" fill="none">\n <circle cx="20" cy="20" r="19" stroke="currentColor" stroke-width="1.5"\n class="text-slate-300/80 dark:text-slate-700/90"></circle>\n <circle #progressCircle cx="20" cy="20" r="19" stroke="currentColor" stroke-width="2.25" stroke-linecap="round"\n class="text-sky-500 dark:text-cyan-400"\n [style.stroke-dasharray]="strokeLength()"\n [style.stroke-dashoffset]="dashOffset()"\n style="transition: stroke-dashoffset 80ms linear"></circle>\n </svg>\n\n <span class="relative flex h-full w-full items-center justify-center">\n <i class="aif aif-arrow-up-ico text-[15px]"></i>\n </span>\n</button>\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGoTop,decorators:[{type:Component,args:[{selector:"aif-go-top",template:'<button type="button" aria-label="Scroll back to top" (click)="scrollToTop()" class="fixed bottom-6 right-6 z-50 h-12 w-12 rounded-full border border-slate-200/80 bg-white/85 text-slate-900 shadow-[0_10px_30px_rgba(15,23,42,0.18)] backdrop-blur-md\n transition-all duration-300 ease-out hover:-translate-y-0.5 hover:bg-white hover:shadow-[0_16px_40px_rgba(15,23,42,0.24)]\n dark:border-slate-700/80 dark:bg-slate-900/85 dark:text-slate-100 dark:shadow-[0_12px_30px_rgba(2,6,23,0.45)] dark:hover:bg-slate-900\n opacity-0 pointer-events-none translate-y-2"\n [class.opacity-100]="isVisible()"\n [class.pointer-events-auto]="isVisible()"\n [class.translate-y-0]="isVisible()"\n [class.opacity-0]="!isVisible()"\n [class.pointer-events-none]="!isVisible()"\n [class.translate-y-2]="!isVisible()">\n <span\n class="absolute inset-[3px] rounded-full bg-gradient-to-br from-sky-100 via-white to-cyan-50 dark:from-slate-800 dark:via-slate-900 dark:to-slate-800"></span>\n\n <svg class="absolute inset-0 h-full w-full -rotate-90" viewBox="0 0 40 40" fill="none">\n <circle cx="20" cy="20" r="19" stroke="currentColor" stroke-width="1.5"\n class="text-slate-300/80 dark:text-slate-700/90"></circle>\n <circle #progressCircle cx="20" cy="20" r="19" stroke="currentColor" stroke-width="2.25" stroke-linecap="round"\n class="text-sky-500 dark:text-cyan-400"\n [style.stroke-dasharray]="strokeLength()"\n [style.stroke-dashoffset]="dashOffset()"\n style="transition: stroke-dashoffset 80ms linear"></circle>\n </svg>\n\n <span class="relative flex h-full w-full items-center justify-center">\n <i class="aif aif-arrow-up-ico text-[15px]"></i>\n </span>\n</button>\n'}]}],propDecorators:{circleRef:[{type:i0.ViewChild,args:["progressCircle",{isSignal:!0}]}]}});class AifAccordionBody{config=input({},...ngDevMode?[{debugName:"config"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);content=computed(()=>this.cfg()._content??this.config()?._content??"",...ngDevMode?[{debugName:"content"}]:[]);build(e={}){this.cfg.set(e||{})}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAccordionBody,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifAccordionBody,isStandalone:!0,selector:"aif-accordion-body",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'\n <div\n class="prose prose-sm max-w-none text-slate-700"\n [innerHTML]="content() | aifSafeHtml"\n ></div>\n ',isInline:!0,dependencies:[{kind:"pipe",type:AifSafeHtmlPipe,name:"aifSafeHtml"}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAccordionBody,decorators:[{type:Component,args:[{selector:"aif-accordion-body",standalone:!0,imports:[AifSafeHtmlPipe],template:'\n <div\n class="prose prose-sm max-w-none text-slate-700"\n [innerHTML]="content() | aifSafeHtml"\n ></div>\n '}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifAccordionDynamic{config=input({},...ngDevMode?[{debugName:"config"}]:[]);container=viewChild("container",{...ngDevMode?{debugName:"container"}:{},read:ViewContainerRef});state=signal({},...ngDevMode?[{debugName:"state"}]:[]);ready=signal(!1,...ngDevMode?[{debugName:"ready"}]:[]);injector=inject(Injector);renderId=0;currentComponentType=null;instance=null;constructor(){effect(()=>{this.state.set(this.config()??{}),this.render()})}ngAfterViewInit(){this.ready.set(!0),this.render()}async render(){if(!this.ready())return;const e=this.container();if(!e)return;const t=this.state(),n=t?.component;if(!n)return e.clear(),this.currentComponentType=null,void(this.instance=null);const i=++this.renderId;if(n===this.currentComponentType&&this.instance){if("function"==typeof this.instance.load&&(await this.instance.load(t),i!==this.renderId))return;return void this.instance.build?.(t)}e.clear();const a=e.createComponent(n,{injector:this.injector});this.instance=a.instance,this.currentComponentType=n,"function"==typeof this.instance.load&&(await this.instance.load(t),i!==this.renderId)||this.instance.build?.(t)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAccordionDynamic,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.2.0",version:"21.1.1",type:AifAccordionDynamic,isStandalone:!0,selector:"aif-accordion-dynamic",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"container",first:!0,predicate:["container"],descendants:!0,read:ViewContainerRef,isSignal:!0}],ngImport:i0,template:"<ng-template #container></ng-template>",isInline:!0})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAccordionDynamic,decorators:[{type:Component,args:[{selector:"aif-accordion-dynamic",standalone:!0,template:"<ng-template #container></ng-template>"}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],container:[{type:i0.ViewChild,args:["container",{read:ViewContainerRef,isSignal:!0}]}]}});let accordionInstanceId=0;class AifAccordion{onInit=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);title=signal("",...ngDevMode?[{debugName:"title"}]:[]);id=signal("",...ngDevMode?[{debugName:"id"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);current=-1;sts={};openIndexes=signal(new Set,...ngDevMode?[{debugName:"openIndexes"}]:[]);uid="aif-accordion-"+ ++accordionInstanceId;state=computed(()=>{const e=this.cfg();return e&&Object.keys(e).length>0?e:this.config()??{}},...ngDevMode?[{debugName:"state"}]:[]);closeOthers=computed(()=>!!this.state().close_others,...ngDevMode?[{debugName:"closeOthers"}]:[]);wrapperClass=computed(()=>this.state().class??"overflow-hidden rounded-xl border border-slate-200 dark:border-slate-700/60 bg-white shadow-sm dark:bg-transparent divide-y divide-slate-200 dark:divide-slate-700/80",...ngDevMode?[{debugName:"wrapperClass"}]:[]);items=computed(()=>{const e=this.state().items??[],t=this.openIndexes(),n=this.state().component??AifAccordionBody;return e.map((e,i)=>{const a=e.id||e.name||`${this.uid}-item-${i+1}`,s={...e.config??{},id:e.config?.id??e.id??e.name??a,_content:e.content??""};return{...e,index:i,trackId:`${a}-${i}`,itemId:a,buttonId:`${this.uid}-button-${i}`,panelId:`${this.uid}-panel-${i}`,isOpen:t.has(i),resolvedTitle:e.title||e.name||"",resolvedHtml:e.html||"",resolvedStatus:e.status||"",resolvedStatusHtml:e.status_html||"",dynamicConfig:{...s,component:e.component??n},itemClass:e.class??"relative overflow-hidden bg-white dark:bg-slate-900/40 transition-all duration-200",headerButtonClass:e.headerClass??"group flex w-full items-center gap-4 px-6 py-4.5 text-left transition-all hover:bg-slate-50 dark:hover:bg-slate-800/40 focus:outline-none focus:relative z-10",bodyWrapperClass:e.bodyClass??"border-t border-slate-100 dark:border-slate-800/60 bg-slate-50/30 dark:bg-slate-900/20 px-6 py-6 transition-all duration-300"}})},...ngDevMode?[{debugName:"items"}]:[]);constructor(){effect(()=>{const e=this.config();this.createFunctions(e),e&&0!==Object.keys(e).length&&(this.isBuilt()||this.build(e))})}ngAfterViewInit(){queueMicrotask(()=>this.onInit.emit())}reBuild(e={},t=null){this.isBuilt.set(!1),this.current=-1,this.sts={},this.openIndexes.set(new Set),this.title.set(""),this.id.set(""),this.cfg.set({}),this.build(e,t)}build(e={},t=null){if(this.isBuilt())return;const n=e||{};this.isBuilt.set(!0),this.cfg.set(n),this.createFunctions(n),this.applyInitialSelection(n,t)}selItem(e=0){this.openItem(e)}make_item(e,t=0){return{...e,config:{...e?.config??{},_content:e?.content??"",_index:t}}}itemCollapse(e,t=0){return!this.openIndexes().has(t)}onCollapse(e,t=0){e&&this.toggleItem(t)}loadBuild(e,t={}){e?.build?.(t)}loadComponent(e,t={},n=0){const i=this.state(),a=[...i.items??[]],s=a[n];s&&(a[n]={...s,component:e,config:{...s.config??{},...t??{}}},this.reBuild({...i,items:a},n))}makeItems(e={}){const t=[];if(e.modules&&e.cfg){const n=e.cfg,i=e.modules,a=e.request||{},s=e.component||null,o=e.prefix||"";for(let e=0;e<i.length;e++){const r=i[e];let l=r[2];a&&(n.request=!0,n.url=a[n.id]),l&&!obj_empty(l)&&(void 0!==l.url&&(n.url=l.url),void 0!==l.request&&(n.request=l.request),l=void 0!==l.component?l.component:s),t.push({html:format_title_html(r[1],format_zero(e+1,2)),name:r[1],component:l,config:{...n,id:o+r[0]}})}}return t}toggleItem(e){const t=this.items()[e];t&&!t.disabled&&(t.isOpen?this.closeItem(e):this.openItem(e))}createFunctions(e=this.config()){e&&(e.build=(e={},t=null)=>this.build(e,t),e.reBuild=(e={},t=null)=>this.reBuild(e,t),e.selItem=(e=0)=>this.selItem(e),e.makeItems=(e={})=>this.makeItems(e))}applyInitialSelection(e,t){const n=e?.items??[];if(!n.length)return void this.openIndexes.set(new Set);if(null!==t&&n[t])return void this.openItem(t);const i=n.map((e,t)=>({item:e,index:t})).filter(e=>!!e.item?.active||!!e.item?.open).map(e=>e.index);if(i.length>0)if(this.closeOthers())this.openItem(i[0]);else{const e=new Set(i);this.openIndexes.set(e),this.syncStatusFromOpenIndexes(),this.setCurrentFromOpenIndexes(i[i.length-1])}else this.openItem(0)}openItem(e){if(!(this.state().items??[])[e])return;const t=this.closeOthers()?new Set([e]):new Set(this.openIndexes());t.add(e),this.openIndexes.set(t),this.syncStatusFromOpenIndexes(),this.setCurrent(e)}closeItem(e){const t=new Set(this.openIndexes());if(t.delete(e),this.openIndexes.set(t),this.syncStatusFromOpenIndexes(),this.current!==e)return;const n=Array.from(t),i=n.length>0?n[n.length-1]:-1;i>=0?this.setCurrent(i):(this.current=-1,this.title.set(""),this.id.set(""))}syncStatusFromOpenIndexes(){const e={};for(const t of this.openIndexes())e[t]=!0;this.sts=e}setCurrent(e){const t=(this.state().items??[])[e];t&&(this.current=e,this.title.set(t.title||t.name||""),this.id.set(t.id||t.name||""))}setCurrentFromOpenIndexes(e){this.setCurrent(e)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAccordion,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifAccordion,isStandalone:!0,selector:"aif-accordion",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},ngImport:i0,template:'<div [class]="wrapperClass()">\n @for (item of items(); track item.trackId) {\n <section [class]="item.itemClass" [class.opacity-60]="item.disabled" \n [class.z-20]="item.isOpen"\n [class.bg-slate-50/80]="item.isOpen"\n [class.dark:bg-slate-800/40]="item.isOpen"\n class="[&:nth-child(even)]:bg-slate-50/30 dark:[&:nth-child(even)]:bg-white/[0.02] transition-colors duration-200">\n \n \x3c!-- Active Indicator --\x3e\n @if (item.isOpen) {\n <div class="absolute left-0 top-0 bottom-0 w-1 bg-primary-500 z-20"></div>\n }\n\n <h3 class="group/header">\n <button\n type="button"\n [class]="item.headerButtonClass"\n [attr.id]="item.buttonId"\n [attr.aria-controls]="item.panelId"\n [attr.aria-expanded]="item.isOpen"\n [disabled]="item.disabled"\n (click)="toggleItem(item.index)"\n >\n <div class="min-w-0 flex-1 flex items-center justify-between gap-4">\n \n \x3c!-- Title Content --\x3e\n <div class="min-w-0 flex-1 text-[15px] font-medium text-slate-700 dark:text-slate-200 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">\n @if (item.resolvedHtml) {\n <div [innerHTML]="item.resolvedHtml | aifSafeHtml"></div>\n } @else {\n <span>{{ item.resolvedTitle }}</span>\n }\n </div>\n\n \x3c!-- Status & Chevron Area --\x3e\n <div class="flex items-center gap-4 shrink-0">\n @if (item.resolvedStatus || item.resolvedStatusHtml) {\n <div class="text-xs">\n @if (item.resolvedStatusHtml) {\n <div [innerHTML]="item.resolvedStatusHtml | aifSafeHtml"></div>\n } @else {\n <span class="inline-flex items-center rounded-full bg-slate-100 px-2 py-0.5 font-medium text-slate-600 dark:bg-slate-800 dark:text-slate-400">\n {{ item.resolvedStatus }}\n </span>\n }\n </div>\n }\n\n \x3c!-- Simple Chevron --\x3e\n <div\n class="text-slate-400 group-hover:text-slate-600 dark:group-hover:text-slate-200 transition-all duration-300"\n [class.rotate-180]="item.isOpen"\n [class.text-primary-500]="item.isOpen"\n >\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd" d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z" clip-rule="evenodd" />\n </svg>\n </div>\n </div>\n </div>\n </button>\n </h3>\n\n @if (item.isOpen) {\n <div\n [attr.id]="item.panelId"\n [attr.aria-labelledby]="item.buttonId"\n role="region"\n [class]="item.bodyWrapperClass"\n >\n <aif-accordion-dynamic [config]="item.dynamicConfig"></aif-accordion-dynamic>\n </div>\n }\n </section>\n }\n</div>\n',styles:[".rotate-180{transform:rotate(180deg)}\n"],dependencies:[{kind:"component",type:AifAccordionDynamic,selector:"aif-accordion-dynamic",inputs:["config"]},{kind:"pipe",type:AifSafeHtmlPipe,name:"aifSafeHtml"}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAccordion,decorators:[{type:Component,args:[{selector:"aif-accordion",standalone:!0,imports:[AifSafeHtmlPipe,AifAccordionDynamic],template:'<div [class]="wrapperClass()">\n @for (item of items(); track item.trackId) {\n <section [class]="item.itemClass" [class.opacity-60]="item.disabled" \n [class.z-20]="item.isOpen"\n [class.bg-slate-50/80]="item.isOpen"\n [class.dark:bg-slate-800/40]="item.isOpen"\n class="[&:nth-child(even)]:bg-slate-50/30 dark:[&:nth-child(even)]:bg-white/[0.02] transition-colors duration-200">\n \n \x3c!-- Active Indicator --\x3e\n @if (item.isOpen) {\n <div class="absolute left-0 top-0 bottom-0 w-1 bg-primary-500 z-20"></div>\n }\n\n <h3 class="group/header">\n <button\n type="button"\n [class]="item.headerButtonClass"\n [attr.id]="item.buttonId"\n [attr.aria-controls]="item.panelId"\n [attr.aria-expanded]="item.isOpen"\n [disabled]="item.disabled"\n (click)="toggleItem(item.index)"\n >\n <div class="min-w-0 flex-1 flex items-center justify-between gap-4">\n \n \x3c!-- Title Content --\x3e\n <div class="min-w-0 flex-1 text-[15px] font-medium text-slate-700 dark:text-slate-200 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">\n @if (item.resolvedHtml) {\n <div [innerHTML]="item.resolvedHtml | aifSafeHtml"></div>\n } @else {\n <span>{{ item.resolvedTitle }}</span>\n }\n </div>\n\n \x3c!-- Status & Chevron Area --\x3e\n <div class="flex items-center gap-4 shrink-0">\n @if (item.resolvedStatus || item.resolvedStatusHtml) {\n <div class="text-xs">\n @if (item.resolvedStatusHtml) {\n <div [innerHTML]="item.resolvedStatusHtml | aifSafeHtml"></div>\n } @else {\n <span class="inline-flex items-center rounded-full bg-slate-100 px-2 py-0.5 font-medium text-slate-600 dark:bg-slate-800 dark:text-slate-400">\n {{ item.resolvedStatus }}\n </span>\n }\n </div>\n }\n\n \x3c!-- Simple Chevron --\x3e\n <div\n class="text-slate-400 group-hover:text-slate-600 dark:group-hover:text-slate-200 transition-all duration-300"\n [class.rotate-180]="item.isOpen"\n [class.text-primary-500]="item.isOpen"\n >\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd" d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z" clip-rule="evenodd" />\n </svg>\n </div>\n </div>\n </div>\n </button>\n </h3>\n\n @if (item.isOpen) {\n <div\n [attr.id]="item.panelId"\n [attr.aria-labelledby]="item.buttonId"\n role="region"\n [class]="item.bodyWrapperClass"\n >\n <aif-accordion-dynamic [config]="item.dynamicConfig"></aif-accordion-dynamic>\n </div>\n }\n </section>\n }\n</div>\n',styles:[".rotate-180{transform:rotate(180deg)}\n"]}]}],ctorParameters:()=>[],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifCreate{onInit=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);container=viewChild("container",{...ngDevMode?{debugName:"container"}:{},read:ViewContainerRef});cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);type=computed(()=>this.cfg().component,...ngDevMode?[{debugName:"type"}]:[]);viewReady=!1;injector=inject(Injector);constructor(){effect(()=>this.syncConfig(this.config()))}ngAfterViewInit(){this.viewReady=!0,this.onInit.emit(),this.hasConfig(this.cfg())&&this.load()}reBuild(e){this.syncConfig({...e,rebuilt:!0})}build(e){this.syncConfig(e)}load(){const e=this.container();if(!e)return;const t=this.type();if(e.clear(),!t)return;const n=e.createComponent(t,{injector:this.injector}).instance;n.build?.(this.cfg())}syncConfig(e){this.hasConfig(e)&&(this.cfg.set(e),this.viewReady&&this.load())}hasConfig(e){return!!e&&Object.keys(e).length>0}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifCreate,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.2.0",version:"21.1.1",type:AifCreate,isStandalone:!0,selector:"aif-create",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},viewQueries:[{propertyName:"container",first:!0,predicate:["container"],descendants:!0,read:ViewContainerRef,isSignal:!0}],ngImport:i0,template:"<ng-template #container></ng-template>",isInline:!0})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifCreate,decorators:[{type:Component,args:[{selector:"aif-create",standalone:!0,template:"<ng-template #container></ng-template>"}]}],ctorParameters:()=>[],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],container:[{type:i0.ViewChild,args:["container",{read:ViewContainerRef,isSignal:!0}]}]}});class AifEmbed{config=input({},...ngDevMode?[{debugName:"config"}]:[]);loaded=output();failed=output();cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);iframeRef=viewChild("embedFrame",...ngDevMode?[{debugName:"iframeRef"}]:[]);isLoading=signal(!1,...ngDevMode?[{debugName:"isLoading"}]:[]);isLoaded=signal(!1,...ngDevMode?[{debugName:"isLoaded"}]:[]);hasError=signal(!1,...ngDevMode?[{debugName:"hasError"}]:[]);pendingBuildPromise=null;resolveBuildPromise=null;rejectBuildPromise=null;lastLoadKey="";state=computed(()=>{const e=this.cfg();return Object.keys(e).length?e:this.config()},...ngDevMode?[{debugName:"state"}]:[]);url=computed(()=>this.state().url??"",...ngDevMode?[{debugName:"url"}]:[]);html=computed(()=>this.state().html??"",...ngDevMode?[{debugName:"html"}]:[]);width=computed(()=>this.state().width??"100%",...ngDevMode?[{debugName:"width"}]:[]);height=computed(()=>this.state().height??600,...ngDevMode?[{debugName:"height"}]:[]);title=computed(()=>this.state().title??"Embedded content",...ngDevMode?[{debugName:"title"}]:[]);allow=computed(()=>this.state().allow??"",...ngDevMode?[{debugName:"allow"}]:[]);sandbox=computed(()=>this.state().sandbox??"",...ngDevMode?[{debugName:"sandbox"}]:[]);scrolling=computed(()=>this.state().scrolling??"no",...ngDevMode?[{debugName:"scrolling"}]:[]);showToolbar=computed(()=>this.state().showToolbar??!0,...ngDevMode?[{debugName:"showToolbar"}]:[]);showOpen=computed(()=>this.state().showOpen??!0,...ngDevMode?[{debugName:"showOpen"}]:[]);showDownload=computed(()=>this.state().showDownload??!0,...ngDevMode?[{debugName:"showDownload"}]:[]);textOpen=computed(()=>this.state().textOpen??"Abrir",...ngDevMode?[{debugName:"textOpen"}]:[]);textDownload=computed(()=>this.state().textDownload??"Descargar",...ngDevMode?[{debugName:"textDownload"}]:[]);textEmpty=computed(()=>this.state().textEmpty??"Sin contenido para mostrar.",...ngDevMode?[{debugName:"textEmpty"}]:[]);downloadName=computed(()=>this.state().downloadName??"documento.pdf",...ngDevMode?[{debugName:"downloadName"}]:[]);wrapperClass=computed(()=>this.state().class??"",...ngDevMode?[{debugName:"wrapperClass"}]:[]);type=computed(()=>{const e=this.state().type;return e||(this.html()?"html":"iframe")},...ngDevMode?[{debugName:"type"}]:[]);source=computed(()=>Object.keys(this.cfg()).length?"build":"input",...ngDevMode?[{debugName:"source"}]:[]);constructor(){effect(()=>{const e=this.iframeRef()?.nativeElement,t=this.allow();e&&(t?e.setAttribute("allow",t):e.removeAttribute("allow"))}),effect(()=>{const e=JSON.stringify({type:this.type(),url:this.url(),html:this.html(),source:this.source()});e!==this.lastLoadKey&&(this.lastLoadKey=e,this.trackLoadCycle())})}build(e={},t=null){return this.isBuilt()||(this.isBuilt.set(!0),this.createBuildPromise(),this.cfg.set(e),t&&t.open(()=>this.reset())),this.whenLoaded()}reBuild(e={},t=null){return this.reset(),this.build(e,t)}reset(){this.isBuilt.set(!1),this.cfg.set({}),this.isLoading.set(!1),this.isLoaded.set(!1),this.hasError.set(!1),this.lastLoadKey="",this.pendingBuildPromise=null,this.resolveBuildPromise=null,this.rejectBuildPromise=null}whenLoaded(){return this.isLoaded()?Promise.resolve(this.makeLoadedEvent()):(this.pendingBuildPromise||this.createBuildPromise(),this.pendingBuildPromise)}openNewTab(){const e=this.url();e&&window.open(e,"_blank","noopener,noreferrer")}download(){const e=this.url();if(!e)return;const t=document.createElement("a");t.href=e,t.download=this.downloadName(),t.rel="noopener",document.body.appendChild(t),t.click(),t.remove()}onFrameLoad(){this.completeLoad()}onFrameError(e){this.failLoad(e)}createBuildPromise(){this.pendingBuildPromise=new Promise((e,t)=>{this.resolveBuildPromise=e,this.rejectBuildPromise=t})}trackLoadCycle(){const e=this.url(),t=this.html();if(this.hasError.set(!1),!e&&!t)return this.isLoading.set(!1),void this.isLoaded.set(!1);this.isLoading.set(!0),this.isLoaded.set(!1),"html"===this.type()&&t&&queueMicrotask(()=>this.completeLoad())}completeLoad(){const e=this.makeLoadedEvent();this.isLoading.set(!1),this.isLoaded.set(!0),this.hasError.set(!1),this.loaded.emit(e),this.resolveBuildPromise&&(this.resolveBuildPromise(e),this.resolveBuildPromise=null,this.rejectBuildPromise=null,this.pendingBuildPromise=Promise.resolve(e))}failLoad(e){const t={...this.makeLoadedEvent(),error:e};this.isLoading.set(!1),this.isLoaded.set(!1),this.hasError.set(!0),this.failed.emit(t),this.rejectBuildPromise&&(this.rejectBuildPromise(t),this.resolveBuildPromise=null,this.rejectBuildPromise=null,this.pendingBuildPromise=null)}makeLoadedEvent(){return{type:this.type(),source:this.source(),url:this.url()||void 0,html:this.html()||void 0}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifEmbed,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifEmbed,isStandalone:!0,selector:"aif-embed",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{loaded:"loaded",failed:"failed"},viewQueries:[{propertyName:"iframeRef",first:!0,predicate:["embedFrame"],descendants:!0,isSignal:!0}],ngImport:i0,template:'<div class="w-full" [class]="wrapperClass()">\n @if (showToolbar() && url()) {\n <div class="mb-2 flex items-center justify-end gap-2">\n @if (showOpen()) {\n <button type="button" (click)="openNewTab()" class="inline-flex items-center rounded-md border border-black/10 bg-white px-3 py-1.5 text-sm text-slate-700\n hover:bg-black/5 focus:outline-none focus-visible:ring-2 focus-visible:ring-black/20 dark:border-white/10 dark:bg-slate-900 dark:text-slate-100 dark:hover:bg-slate-800">\n {{ textOpen() }}\n </button>\n }\n\n @if (showDownload()) {\n <button type="button" (click)="download()" class="inline-flex items-center rounded-md border border-black/10 bg-white px-3 py-1.5 text-sm text-slate-700\n hover:bg-black/5 focus:outline-none focus-visible:ring-2 focus-visible:ring-black/20 dark:border-white/10 dark:bg-slate-900 dark:text-slate-100 dark:hover:bg-slate-800">\n {{ textDownload() }}\n </button>\n }\n </div>\n }\n\n @if (url() && (type() === \'iframe\' || type() === \'pdf\')) {\n <div class="w-full overflow-hidden rounded-lg border border-black/10 bg-white">\n <iframe #embedFrame [src]="url() | safeUrl" [attr.title]="title()" [attr.width]="width()" [attr.height]="height()"\n [attr.sandbox]="sandbox() || null" [attr.scrolling]="scrolling()"\n frameborder="0" class="block w-full" (load)="onFrameLoad()" (error)="onFrameError($event)"></iframe>\n </div>\n }\n\n @if (html()) {\n <div class="prose max-w-none">\n <div [innerHTML]="html()"></div>\n </div>\n }\n\n @if (!url() && !html()) {\n <div class="rounded-lg border border-dashed border-black/15 p-6 text-sm text-black/60">\n {{ textEmpty() }}\n </div>\n }\n</div>\n',dependencies:[{kind:"pipe",type:AifSafeUrlPipe,name:"safeUrl"}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifEmbed,decorators:[{type:Component,args:[{selector:"aif-embed",standalone:!0,imports:[AifSafeUrlPipe],template:'<div class="w-full" [class]="wrapperClass()">\n @if (showToolbar() && url()) {\n <div class="mb-2 flex items-center justify-end gap-2">\n @if (showOpen()) {\n <button type="button" (click)="openNewTab()" class="inline-flex items-center rounded-md border border-black/10 bg-white px-3 py-1.5 text-sm text-slate-700\n hover:bg-black/5 focus:outline-none focus-visible:ring-2 focus-visible:ring-black/20 dark:border-white/10 dark:bg-slate-900 dark:text-slate-100 dark:hover:bg-slate-800">\n {{ textOpen() }}\n </button>\n }\n\n @if (showDownload()) {\n <button type="button" (click)="download()" class="inline-flex items-center rounded-md border border-black/10 bg-white px-3 py-1.5 text-sm text-slate-700\n hover:bg-black/5 focus:outline-none focus-visible:ring-2 focus-visible:ring-black/20 dark:border-white/10 dark:bg-slate-900 dark:text-slate-100 dark:hover:bg-slate-800">\n {{ textDownload() }}\n </button>\n }\n </div>\n }\n\n @if (url() && (type() === \'iframe\' || type() === \'pdf\')) {\n <div class="w-full overflow-hidden rounded-lg border border-black/10 bg-white">\n <iframe #embedFrame [src]="url() | safeUrl" [attr.title]="title()" [attr.width]="width()" [attr.height]="height()"\n [attr.sandbox]="sandbox() || null" [attr.scrolling]="scrolling()"\n frameborder="0" class="block w-full" (load)="onFrameLoad()" (error)="onFrameError($event)"></iframe>\n </div>\n }\n\n @if (html()) {\n <div class="prose max-w-none">\n <div [innerHTML]="html()"></div>\n </div>\n }\n\n @if (!url() && !html()) {\n <div class="rounded-lg border border-dashed border-black/15 p-6 text-sm text-black/60">\n {{ textEmpty() }}\n </div>\n }\n</div>\n'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],loaded:[{type:i0.Output,args:["loaded"]}],failed:[{type:i0.Output,args:["failed"]}],iframeRef:[{type:i0.ViewChild,args:["embedFrame",{isSignal:!0}]}]}});class AifTableBase{config=input({},...ngDevMode?[{debugName:"config"}]:[]);header=computed(()=>this.config()?.header||{},...ngDevMode?[{debugName:"header"}]:[]);columns=computed(()=>this.config()?.columns||[],...ngDevMode?[{debugName:"columns"}]:[]);fields=computed(()=>this.config()?.fields||[],...ngDevMode?[{debugName:"fields"}]:[]);data=computed(()=>this.config()?.data||[],...ngDevMode?[{debugName:"data"}]:[]);footer=computed(()=>this.config()?.footer||{},...ngDevMode?[{debugName:"footer"}]:[]);readonly=computed(()=>!!this.config()?.readonly,...ngDevMode?[{debugName:"readonly"}]:[]);disabled=computed(()=>!!this.config()?.disabled,...ngDevMode?[{debugName:"disabled"}]:[]);showSelection=computed(()=>!!this.config()?.showSelection,...ngDevMode?[{debugName:"showSelection"}]:[]);selectionType=computed(()=>this.config()?.selectionType||"checkbox",...ngDevMode?[{debugName:"selectionType"}]:[]);showActions=computed(()=>!!this.config()?.showActions&&!this.readonly(),...ngDevMode?[{debugName:"showActions"}]:[]);noResultsLabel=computed(()=>this.config()?.noResultsLabel||"Sin resultados",...ngDevMode?[{debugName:"noResultsLabel"}]:[]);selectedRows=computed(()=>this.config()?.selectedRows||new Set,...ngDevMode?[{debugName:"selectedRows"}]:[]);onRowClickHandler=computed(()=>this.config()?.onRowClick,...ngDevMode?[{debugName:"onRowClickHandler"}]:[]);onCellClickHandler=computed(()=>this.config()?.onCellClick,...ngDevMode?[{debugName:"onCellClickHandler"}]:[]);onToggleSelectionHandler=computed(()=>this.config()?.onToggleSelection,...ngDevMode?[{debugName:"onToggleSelectionHandler"}]:[]);onActionHandler=computed(()=>this.config()?.onAction,...ngDevMode?[{debugName:"onActionHandler"}]:[]);getRowIdHandler=computed(()=>this.config()?.getRowId,...ngDevMode?[{debugName:"getRowIdHandler"}]:[]);getCellValueHandler=computed(()=>this.config()?.getCellValue,...ngDevMode?[{debugName:"getCellValueHandler"}]:[]);interactive=computed(()=>!this.readonly()&&!this.disabled(),...ngDevMode?[{debugName:"interactive"}]:[]);colspan=computed(()=>{let e=0;return this.showSelection()&&e++,this.showActions()&&e++,this.columns().length+e},...ngDevMode?[{debugName:"colspan"}]:[]);isRadio=computed(()=>"radio"===this.selectionType(),...ngDevMode?[{debugName:"isRadio"}]:[]);viewRows=computed(()=>{const e=this.data()||[],t=this.fields()||[],n=this.selectedRows(),i=this.getRowIdHandler(),a=this.getCellValueHandler(),s=this.interactive(),o=!!this.onRowClickHandler(),r=!!this.onCellClickHandler();return e.map((e,l)=>{const d="function"==typeof i?i(e):e?.id,c=`${null==d||""===d?"row":`${d}`}-${l}`,g=n.has(d),m=t.map((t,n)=>{const i=!!t&&"object"==typeof t&&["edit","delete","action"].includes(t.type),o="function"==typeof a?a(t,e,n):"";let l="text-slate-500 hover:text-slate-700 dark:text-slate-300 dark:hover:text-slate-100";return t?.class?l=t.class:"red"===t?.color?l="text-rose-500 hover:text-rose-600 dark:text-rose-400 dark:hover:text-rose-300":"blue"===t?.color&&(l="text-sky-500 hover:text-sky-600 dark:text-sky-400 dark:hover:text-sky-300"),{field:t,cellIndex:n,isAction:i,value:o,isHtml:!!o&&"object"==typeof o&&"string"==typeof o.html,actionTitle:t?.title||t?.label||"",actionClass:l,interactiveCell:s&&r&&!i}});return{row:e,rowIndex:l,rowId:d,trackId:c,isSelected:g,interactiveRow:s&&(this.showSelection()||o),cells:m}})},...ngDevMode?[{debugName:"viewRows"}]:[]);onRowClick(e,t,n){if(!this.interactive())return;const i=this.onRowClickHandler();"function"==typeof i&&i(e,t,n)}onCellClick(e,t,n,i){if(!this.interactive())return;const a=this.onCellClickHandler();"function"==typeof a&&a(e,t,n,i)}onToggleSelection(e,t){if(!this.interactive())return;const n=this.onToggleSelectionHandler();"function"==typeof n&&n(e,t)}onAction(e,t,n){if(!this.interactive())return;const i=this.onActionHandler();"function"==typeof i&&i(e,t,n)}onFieldAction(e,t,n,i){i?.stopPropagation(),this.onAction(e?.type||"action",t,n)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifTableBase,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifTableBase,isStandalone:!0,selector:"aif-table-base",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (header()?.table_title) {\n <div class="mb-4">\n <h5 class="text-base font-semibold text-slate-800 dark:text-slate-100">\n {{ header().table_title }}\n </h5>\n </div>\n}\n\n<div\n class="overflow-hidden rounded-lg border border-slate-200 dark:border-slate-700/60 bg-white dark:bg-slate-900"\n [class.opacity-70]="!interactive()"\n>\n <div class="overflow-x-auto">\n <table class="min-w-full divide-y divide-slate-200 dark:divide-slate-700/60">\n <thead class="bg-slate-100/80 dark:bg-slate-800 text-slate-900 dark:text-white">\n <tr>\n @if (showSelection()) {\n <th class="w-10 px-4 py-3 text-left text-xs font-semibold uppercase tracking-wider"></th>\n }\n @for (column of columns(); track \'col-\' + $index) {\n <th class="px-4 py-3 text-left text-xs font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-300">\n {{ column }}\n </th>\n }\n @if (showActions()) {\n <th class="w-12 px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-300">\n <i class="fas fa-ellipsis-h"></i>\n </th>\n }\n </tr>\n </thead>\n <tbody class="divide-y divide-slate-200 dark:divide-slate-700/50 bg-white dark:bg-slate-900">\n @for (item of viewRows(); track \'row-\' + $index) {\n <tr\n class="transition-colors duration-150"\n [class.cursor-pointer]="item.interactiveRow"\n [class.bg-primary-50]="item.isSelected"\n [class.dark:bg-primary-900/10]="item.isSelected"\n [class.hover:bg-slate-50]="interactive() && !item.isSelected"\n [class.dark:hover:bg-slate-800/50]="interactive() && !item.isSelected"\n [class.bg-slate-50/70]="!item.isSelected && item.rowIndex % 2 !== 0"\n [class.dark:bg-slate-800/20]="!item.isSelected && item.rowIndex % 2 !== 0"\n (click)="onRowClick(item.row, item.rowIndex, $event)"\n >\n @if (showSelection()) {\n <td class="w-10 px-4 py-3 text-right">\n @if (isRadio()) {\n <input\n type="radio"\n class="h-4 w-4 border-slate-300 text-indigo-600 focus:ring-indigo-500 dark:border-slate-600 dark:bg-slate-700"\n [checked]="item.isSelected"\n [value]="item.rowId"\n [disabled]="!interactive()"\n (click)="onToggleSelection(item.row, $event); $event.stopPropagation()"\n />\n } @else {\n <input\n type="checkbox"\n class="h-4 w-4 rounded border-slate-300 text-indigo-600 focus:ring-indigo-500 dark:border-slate-600 dark:bg-slate-700"\n [checked]="item.isSelected"\n [value]="item.rowId"\n [disabled]="!interactive()"\n (click)="onToggleSelection(item.row, $event); $event.stopPropagation()"\n />\n }\n </td>\n }\n @for (cell of item.cells; track \'cell-\' + $index) {\n <td\n class="px-4 py-3 text-sm text-slate-700 dark:text-slate-300"\n [class.cursor-pointer]="cell.interactiveCell"\n [class.w-12]="cell.isAction"\n [class.text-center]="cell.isAction"\n (click)="cell.isAction ? null : onCellClick(cell.field, item.row, item.rowIndex, cell.cellIndex)"\n >\n @if (cell.isAction) {\n <button\n type="button"\n class="inline-flex items-center justify-center"\n [class]="cell.actionClass"\n [title]="cell.actionTitle"\n [disabled]="!interactive()"\n (click)="onFieldAction(cell.field, item.row, item.rowIndex, $event)"\n >\n @if (cell.field.icon) {\n <i [class]="cell.field.icon"></i>\n } @else {\n {{ cell.field.label || cell.field.type }}\n }\n </button>\n } @else {\n @if (cell.isHtml) {\n <div [innerHTML]="cell.value.html"></div>\n } @else {\n {{ cell.value }}\n }\n }\n </td>\n }\n @if (showActions()) {\n <td class="px-4 py-3 text-right text-sm">\n <button\n type="button"\n class="inline-flex items-center text-rose-500 hover:text-rose-600 dark:text-rose-400 dark:hover:text-rose-300"\n title="Quitar"\n [disabled]="!interactive()"\n (click)="onAction(\'del\', item.row, item.rowIndex); $event.stopPropagation()"\n >\n <svg\n class="w-5 h-5"\n fill="none"\n stroke="currentColor"\n viewBox="0 0 24 24"\n xmlns="http://www.w3.org/2000/svg"\n >\n <path\n stroke-linecap="round"\n stroke-linejoin="round"\n stroke-width="2"\n d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"\n ></path>\n </svg>\n </button>\n </td>\n }\n </tr>\n }\n\n @if (data().length === 0) {\n <tr>\n <td [attr.colspan]="colspan()" class="px-4 py-4 text-center text-sm text-slate-500 dark:text-slate-400">\n {{ noResultsLabel() }}\n </td>\n </tr>\n }\n\n @if (footer().tbody && data().length > 0) {\n <tr>\n <td [attr.colspan]="colspan()" class="px-4 py-4 text-sm text-slate-700 dark:text-slate-300" [style]="footer().tbody?.style">\n {{ footer().tbody?.content || \'\' }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n</div>\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifTableBase,decorators:[{type:Component,args:[{selector:"aif-table-base",standalone:!0,imports:[],template:'@if (header()?.table_title) {\n <div class="mb-4">\n <h5 class="text-base font-semibold text-slate-800 dark:text-slate-100">\n {{ header().table_title }}\n </h5>\n </div>\n}\n\n<div\n class="overflow-hidden rounded-lg border border-slate-200 dark:border-slate-700/60 bg-white dark:bg-slate-900"\n [class.opacity-70]="!interactive()"\n>\n <div class="overflow-x-auto">\n <table class="min-w-full divide-y divide-slate-200 dark:divide-slate-700/60">\n <thead class="bg-slate-100/80 dark:bg-slate-800 text-slate-900 dark:text-white">\n <tr>\n @if (showSelection()) {\n <th class="w-10 px-4 py-3 text-left text-xs font-semibold uppercase tracking-wider"></th>\n }\n @for (column of columns(); track \'col-\' + $index) {\n <th class="px-4 py-3 text-left text-xs font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-300">\n {{ column }}\n </th>\n }\n @if (showActions()) {\n <th class="w-12 px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-300">\n <i class="fas fa-ellipsis-h"></i>\n </th>\n }\n </tr>\n </thead>\n <tbody class="divide-y divide-slate-200 dark:divide-slate-700/50 bg-white dark:bg-slate-900">\n @for (item of viewRows(); track \'row-\' + $index) {\n <tr\n class="transition-colors duration-150"\n [class.cursor-pointer]="item.interactiveRow"\n [class.bg-primary-50]="item.isSelected"\n [class.dark:bg-primary-900/10]="item.isSelected"\n [class.hover:bg-slate-50]="interactive() && !item.isSelected"\n [class.dark:hover:bg-slate-800/50]="interactive() && !item.isSelected"\n [class.bg-slate-50/70]="!item.isSelected && item.rowIndex % 2 !== 0"\n [class.dark:bg-slate-800/20]="!item.isSelected && item.rowIndex % 2 !== 0"\n (click)="onRowClick(item.row, item.rowIndex, $event)"\n >\n @if (showSelection()) {\n <td class="w-10 px-4 py-3 text-right">\n @if (isRadio()) {\n <input\n type="radio"\n class="h-4 w-4 border-slate-300 text-indigo-600 focus:ring-indigo-500 dark:border-slate-600 dark:bg-slate-700"\n [checked]="item.isSelected"\n [value]="item.rowId"\n [disabled]="!interactive()"\n (click)="onToggleSelection(item.row, $event); $event.stopPropagation()"\n />\n } @else {\n <input\n type="checkbox"\n class="h-4 w-4 rounded border-slate-300 text-indigo-600 focus:ring-indigo-500 dark:border-slate-600 dark:bg-slate-700"\n [checked]="item.isSelected"\n [value]="item.rowId"\n [disabled]="!interactive()"\n (click)="onToggleSelection(item.row, $event); $event.stopPropagation()"\n />\n }\n </td>\n }\n @for (cell of item.cells; track \'cell-\' + $index) {\n <td\n class="px-4 py-3 text-sm text-slate-700 dark:text-slate-300"\n [class.cursor-pointer]="cell.interactiveCell"\n [class.w-12]="cell.isAction"\n [class.text-center]="cell.isAction"\n (click)="cell.isAction ? null : onCellClick(cell.field, item.row, item.rowIndex, cell.cellIndex)"\n >\n @if (cell.isAction) {\n <button\n type="button"\n class="inline-flex items-center justify-center"\n [class]="cell.actionClass"\n [title]="cell.actionTitle"\n [disabled]="!interactive()"\n (click)="onFieldAction(cell.field, item.row, item.rowIndex, $event)"\n >\n @if (cell.field.icon) {\n <i [class]="cell.field.icon"></i>\n } @else {\n {{ cell.field.label || cell.field.type }}\n }\n </button>\n } @else {\n @if (cell.isHtml) {\n <div [innerHTML]="cell.value.html"></div>\n } @else {\n {{ cell.value }}\n }\n }\n </td>\n }\n @if (showActions()) {\n <td class="px-4 py-3 text-right text-sm">\n <button\n type="button"\n class="inline-flex items-center text-rose-500 hover:text-rose-600 dark:text-rose-400 dark:hover:text-rose-300"\n title="Quitar"\n [disabled]="!interactive()"\n (click)="onAction(\'del\', item.row, item.rowIndex); $event.stopPropagation()"\n >\n <svg\n class="w-5 h-5"\n fill="none"\n stroke="currentColor"\n viewBox="0 0 24 24"\n xmlns="http://www.w3.org/2000/svg"\n >\n <path\n stroke-linecap="round"\n stroke-linejoin="round"\n stroke-width="2"\n d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"\n ></path>\n </svg>\n </button>\n </td>\n }\n </tr>\n }\n\n @if (data().length === 0) {\n <tr>\n <td [attr.colspan]="colspan()" class="px-4 py-4 text-center text-sm text-slate-500 dark:text-slate-400">\n {{ noResultsLabel() }}\n </td>\n </tr>\n }\n\n @if (footer().tbody && data().length > 0) {\n <tr>\n <td [attr.colspan]="colspan()" class="px-4 py-4 text-sm text-slate-700 dark:text-slate-300" [style]="footer().tbody?.style">\n {{ footer().tbody?.content || \'\' }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n</div>\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifFormDataTable{config=input({},...ngDevMode?[{debugName:"config"}]:[]);header=signal({},...ngDevMode?[{debugName:"header"}]:[]);footer=signal({},...ngDevMode?[{debugName:"footer"}]:[]);data=signal([],...ngDevMode?[{debugName:"data"}]:[]);columns=signal([],...ngDevMode?[{debugName:"columns"}]:[]);fields=signal([],...ngDevMode?[{debugName:"fields"}]:[]);filasSeleccionadas=signal(new Set,...ngDevMode?[{debugName:"filasSeleccionadas"}]:[]);noResultsLabel=signal(lang(["form","table.no_results"])||"Sin resultados",...ngDevMode?[{debugName:"noResultsLabel"}]:[]);tableBaseConfig=computed(()=>({header:this.header(),columns:this.columns(),fields:this.fields(),data:this.data(),readonly:this.config()?.readonly,disabled:this.config()?.disabled,showSelection:!0,selectionType:this.selectionMode(),selectedRows:this.filasSeleccionadas(),noResultsLabel:this.noResultsLabel(),getCellValue:(e,t,n)=>this.getField(e,t,n),getRowId:e=>this.getSelectionValue(e),onRowClick:e=>this.toggleSeleccionFila(this.getSelectionValue(e),e),onToggleSelection:(e,t)=>this.onSelectionChange(this.getSelectionValue(e),e,{target:t.target})}),...ngDevMode?[{debugName:"tableBaseConfig"}]:[]);selectionField=signal("id",...ngDevMode?[{debugName:"selectionField"}]:[]);selectionMode=signal("checkbox",...ngDevMode?[{debugName:"selectionMode"}]:[]);constructor(){effect(()=>{const e=this.config();this.build(e)})}ngOnInit(){}build(e={}){"function"==typeof e.onComponent&&e.onComponent(this),this.createFunctions(e),e.columns&&this.prepareTable(e)}createFunctions(e){e&&(e.getData=e=>this.data()||[],e.onLoadData=e.onLoadData||function(){},e.build=(e={})=>this.build(e),e.getContext=()=>this,e.onSetData=e.onSetData||function(){})}normalizeRow(e={}){if(!e||"object"!=typeof e||Array.isArray(e))return e;const t={...e};return t.id=t.id??t.value,t.value=t.value??t.id,t.text=t.text??t.description??t.descripcion,t.description=t.description??t.descripcion??t.text,t}getSelectionValue(e={}){return this.resolveFieldValue(this.selectionField(),e)}resolveFieldValue(e,t={}){if(!t||"object"!=typeof t)return"";if(void 0!==t[e]&&null!==t[e])return t[e];switch(e){case"id":return t.id??t.value??"";case"value":return t.value??t.id??"";case"text":return t.text??t.description??t.descripcion??"";case"description":case"descripcion":return t.description??t.descripcion??t.text??"";default:return""}}checkToCat(e){return(e||[]).map(e=>this.normalizeRow(e))}prepareTable(e={}){const t=[],n=[];let i="id",a="checkbox";if(this.header.set(e.header||{}),"string"==typeof e.data){const t=e.data+"";this.data.set([]),rq_req().get(t).then(t=>{const n=this.checkToCat(t||[]);this.data.set(n),e.value&&this.addCheckData(e.value)})}else{const t=this.checkToCat(e.data||[]);this.data.set(t),e.value&&this.addCheckData(e.value)}for(let s of e.columns)if("string"==typeof s)t.push(s),n.push(s.toLowerCase().replace(/ /g,"_"));else{if("checkbox"===s.type||"radio"===s.type){a=s.type,i=s.field||"id";continue}t.push(s.name),s.image?n.push(s):s.field&&!s.click?n.push(s.field):s.action?n.push(s.action):n.push(s)}this.selectionField.set(i),this.selectionMode.set(a),this.columns.set(t),this.fields.set(n)}json_hierarchy_val(e,t){let n=e;for(const e of t){if(!n[e])return"";n=n[e]}return n}getField(e,t={},n){if("string"==typeof e)return this.resolveFieldValue(e,t);if(e instanceof Array)return this.json_hierarchy_val(t,e);if("object"==typeof e){if(e.image&&e.field)return this.resolveFieldValue(e.field,t);if(e.action)return e.action;if(e.click)return this.resolveFieldValue(e.field,t);if(e.field)return this.resolveFieldValue(e.field,t)}return"otro"}toggleSeleccionFila(e,t={},n){const i=new Set(this.filasSeleccionadas());if("radio"===this.selectionMode())return i.clear(),null!=e&&""!==e&&i.add(e),void this.onSetValue(t,"set",i);i.has(e)?(i.delete(e),this.onSetValue(t,"del",i)):(i.add(e),this.onSetValue(t,"add",i))}onSelectionChange(e,t={},n){const i=n.target.checked,a=new Set(this.filasSeleccionadas());if("radio"===this.selectionMode())return a.clear(),i&&null!=e&&""!==e&&a.add(e),void this.onSetValue(t,"set",a);i?(a.add(e),this.onSetValue(t,"add",a)):(a.delete(e),this.onSetValue(t,"del",a))}onSetValue(e,t,n){this.filasSeleccionadas.set(n);const i=[...n],a=this.config();a.onSetData&&a.onSetData("radio"===this.selectionMode()?i.length>0?i[0]:null:i.length>0?i:null)}addCheckData(e={}){const t=new Set(this.filasSeleccionadas());let n=!1;e instanceof Array?e.forEach(e=>{t.has(e)||(t.add(e),n=!0)}):null!=e&&""!==e&&(t.clear(),t.add(e),n=!0),n&&this.filasSeleccionadas.set(t)}clear(){this.filasSeleccionadas.set(new Set)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormDataTable,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifFormDataTable,isStandalone:!0,selector:"aif-form-data-table",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<aif-table-base [config]="tableBaseConfig()"></aif-table-base>\n',dependencies:[{kind:"component",type:AifTableBase,selector:"aif-table-base",inputs:["config"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormDataTable,decorators:[{type:Component,args:[{selector:"aif-form-data-table",standalone:!0,imports:[AifTableBase],template:'<aif-table-base [config]="tableBaseConfig()"></aif-table-base>\n'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifFormSub{config=input({},...ngDevMode?[{debugName:"config"}]:[]);ngOnInit(){}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormSub,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifFormSub,isStandalone:!0,selector:"aif-form-sub",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="rounded-xl border border-slate-200/80 bg-slate-50/60 shadow-sm dark:border-slate-700/60 dark:bg-slate-900/45">\n <div class="p-5 md:p-6">\n <div class="flex items-start">\n <div class="flex-grow overflow-hidden">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n</div>\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormSub,decorators:[{type:Component,args:[{selector:"aif-form-sub",standalone:!0,template:'<div class="rounded-xl border border-slate-200/80 bg-slate-50/60 shadow-sm dark:border-slate-700/60 dark:bg-slate-900/45">\n <div class="p-5 md:p-6">\n <div class="flex items-start">\n <div class="flex-grow overflow-hidden">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n</div>\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifFormTag{item=input([],...ngDevMode?[{debugName:"item"}]:[]);ngOnInit(){}onTagClick(e){e._click&&e._click()}getItem(e){return"object"==typeof e?"":e}getAlertClass(e="primary"){switch(e){case"primary":case"info":default:return"text-blue-800 bg-blue-50 dark:bg-gray-800 dark:text-blue-400";case"secondary":case"light":return"text-gray-800 bg-gray-50 dark:bg-gray-800 dark:text-gray-300";case"success":return"text-green-800 bg-green-50 dark:bg-gray-800 dark:text-green-400";case"danger":return"text-red-800 bg-red-50 dark:bg-gray-800 dark:text-red-400";case"warning":return"text-yellow-800 bg-yellow-50 dark:bg-gray-800 dark:text-yellow-300";case"dark":return"text-gray-50 bg-gray-800 dark:bg-gray-900 dark:text-gray-300"}}getButtonClass(e="primary"){const t="px-4 py-2 rounded-md text-white focus:outline-none focus:ring-2 focus:ring-offset-2";switch(e){case"primary":default:return`${t} bg-indigo-600 hover:bg-indigo-700 focus:ring-indigo-500`;case"secondary":return`${t} bg-gray-600 hover:bg-gray-700 focus:ring-gray-500`;case"success":return`${t} bg-green-600 hover:bg-green-700 focus:ring-green-500`;case"danger":return`${t} bg-red-600 hover:bg-red-700 focus:ring-red-500`;case"warning":return`${t} bg-yellow-500 hover:bg-yellow-600 focus:ring-yellow-500`;case"info":return`${t} bg-blue-500 hover:bg-blue-600 focus:ring-blue-500`;case"light":return"px-4 py-2 rounded-md text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 shadow-sm";case"dark":return`${t} bg-gray-800 hover:bg-gray-900 focus:ring-gray-500`}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormTag,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormTag,isStandalone:!0,selector:"aif-form-tag",inputs:{item:{classPropertyName:"item",publicName:"item",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (item()[0] == \'control\') {\n <div class="relative mb-5">\n <div\n class="block w-full rounded-md border-0 py-1.5 text-gray-900 dark:text-white shadow-sm ring-1 ring-inset ring-gray-300 dark:ring-gray-600 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"\n >\n <div class="px-2">{{ getItem(item()[2]) }}</div>\n </div>\n <label\n class="absolute -top-2 left-2 inline-block px-1 text-xs font-medium text-gray-900 dark:text-gray-300"\n >{{ item()[1] }}</label\n >\n </div>\n} @else if (item()[0] == \'html\') {\n <div [innerHTML]="item()[1]"></div>\n} @else if (item()[0] == \'img\') {\n <img\n [src]="item()[1]"\n [class]="item()[2]?.class"\n [alt]="item()[2].alt"\n [style]="item()[2].style"\n />\n} @else if (item()[0] == \'div\') {\n <div [class]="item()[2]?.class" [style]="item()[2]?.style">\n {{ item()[1] }}\n </div>\n} @else if (item()[0] == \'a\') {\n <a\n [href]="item()[2]?.href"\n [class]="item()[2]?.class"\n [target]="item()[2]?.target"\n [title]="item()[2]?.title"\n >\n {{ item()[1] }}\n </a>\n} @else if (item()[0] == \'p\') {\n <p [class]="item()[2]?.class" [style]="item()[2]?.style">\n {{ item()[1] }}\n </p>\n} @else if (item()[0] == \'alert\') {\n <div\n class="p-4 mb-4 text-sm rounded-lg"\n [ngClass]="getAlertClass(item()[2]?.type)"\n role="alert"\n >\n @if (item()[2]?.title) {\n <div class="font-medium">{{ item()[2]?.title }}</div>\n }\n {{ item()[1] }}\n </div>\n} @else if (item()[0] == \'button\') {\n <div class="flex justify-center mx-auto" [class]="item()[2].col">\n <button\n (click)="onTagClick(item()[2])"\n [ngClass]="getButtonClass(item()[2]?.type)"\n class="btn"\n type="button"\n >\n {{ item()[1] }}\n </button>\n </div>\n} @else if (item()[0] == \'card\') {\n <div\n class="bg-white border rounded-lg shadow-sm"\n [class]="item()[2]?.class"\n [style]="item()[2]?.style"\n >\n <div class="px-6 py-4 border-b border-gray-200 font-bold">\n {{ item()[2]?.title }}\n </div>\n <div class="p-6">\n {{ item()[1] }}\n </div>\n </div>\n}\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormTag,decorators:[{type:Component,args:[{selector:"aif-form-tag",imports:[NgClass],template:'@if (item()[0] == \'control\') {\n <div class="relative mb-5">\n <div\n class="block w-full rounded-md border-0 py-1.5 text-gray-900 dark:text-white shadow-sm ring-1 ring-inset ring-gray-300 dark:ring-gray-600 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"\n >\n <div class="px-2">{{ getItem(item()[2]) }}</div>\n </div>\n <label\n class="absolute -top-2 left-2 inline-block px-1 text-xs font-medium text-gray-900 dark:text-gray-300"\n >{{ item()[1] }}</label\n >\n </div>\n} @else if (item()[0] == \'html\') {\n <div [innerHTML]="item()[1]"></div>\n} @else if (item()[0] == \'img\') {\n <img\n [src]="item()[1]"\n [class]="item()[2]?.class"\n [alt]="item()[2].alt"\n [style]="item()[2].style"\n />\n} @else if (item()[0] == \'div\') {\n <div [class]="item()[2]?.class" [style]="item()[2]?.style">\n {{ item()[1] }}\n </div>\n} @else if (item()[0] == \'a\') {\n <a\n [href]="item()[2]?.href"\n [class]="item()[2]?.class"\n [target]="item()[2]?.target"\n [title]="item()[2]?.title"\n >\n {{ item()[1] }}\n </a>\n} @else if (item()[0] == \'p\') {\n <p [class]="item()[2]?.class" [style]="item()[2]?.style">\n {{ item()[1] }}\n </p>\n} @else if (item()[0] == \'alert\') {\n <div\n class="p-4 mb-4 text-sm rounded-lg"\n [ngClass]="getAlertClass(item()[2]?.type)"\n role="alert"\n >\n @if (item()[2]?.title) {\n <div class="font-medium">{{ item()[2]?.title }}</div>\n }\n {{ item()[1] }}\n </div>\n} @else if (item()[0] == \'button\') {\n <div class="flex justify-center mx-auto" [class]="item()[2].col">\n <button\n (click)="onTagClick(item()[2])"\n [ngClass]="getButtonClass(item()[2]?.type)"\n class="btn"\n type="button"\n >\n {{ item()[1] }}\n </button>\n </div>\n} @else if (item()[0] == \'card\') {\n <div\n class="bg-white border rounded-lg shadow-sm"\n [class]="item()[2]?.class"\n [style]="item()[2]?.style"\n >\n <div class="px-6 py-4 border-b border-gray-200 font-bold">\n {{ item()[2]?.title }}\n </div>\n <div class="p-6">\n {{ item()[1] }}\n </div>\n </div>\n}\n'}]}],propDecorators:{item:[{type:i0.Input,args:[{isSignal:!0,alias:"item",required:!1}]}]}});class AifNavBar{onInit=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);side=input("top",...ngDevMode?[{debugName:"side"}]:[]);destroyRef=inject(DestroyRef);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);effectiveConfig=computed(()=>{const e=this.builtConfig(),t=this.config();return(this.isBuilt()?e:t)||{}},...ngDevMode?[{debugName:"effectiveConfig"}]:[]);left_nav=computed(()=>this.effectiveConfig().left||[],...ngDevMode?[{debugName:"left_nav"}]:[]);center_nav=computed(()=>this.effectiveConfig().center||[],...ngDevMode?[{debugName:"center_nav"}]:[]);right_nav=computed(()=>this.effectiveConfig().right||[],...ngDevMode?[{debugName:"right_nav"}]:[]);parent=computed(()=>this.effectiveConfig().parent||null,...ngDevMode?[{debugName:"parent"}]:[]);showLine=computed(()=>!!this.effectiveConfig().line,...ngDevMode?[{debugName:"showLine"}]:[]);hasItems=computed(()=>this.left_nav().length>0||this.center_nav().length>0||this.right_nav().length>0,...ngDevMode?[{debugName:"hasItems"}]:[]);ngAfterViewInit(){this.destroyRef.destroyed||this.onInit.emit()}reBuild(e){this.isBuilt.set(!1),this.build(e)}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1)}build(e={}){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e||{}))}btnClick(e){e.click&&e.click(e,{},this.parent(),this)}searchTimeout;ngOnDestroy(){this.searchTimeout&&(clearTimeout(this.searchTimeout),this.searchTimeout=null)}submitInput(e,t={}){this.clearSearchTimeout(),this.executeChange(this.getInputValue(e),t)}onInputChange(e,t={}){if(!t.live)return;const n=this.getInputValue(e);if(t.delay)return this.clearSearchTimeout(),void(this.searchTimeout=setTimeout(()=>{this.executeChange(n,t)},t.delay));this.executeChange(n,t)}getInputValue(e){return"object"==typeof e?e.value:e}clearSearchTimeout(){this.searchTimeout&&(clearTimeout(this.searchTimeout),this.searchTimeout=null)}executeChange(e,t){"function"==typeof t.change&&t.change(e),"function"==typeof t.onSearch&&t.onSearch(e)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavBar,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavBar,isStandalone:!0,selector:"aif-nav-bar",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},side:{classPropertyName:"side",publicName:"side",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},ngImport:i0,template:'@if (hasItems()) {\n <div class="aif-nav-bar flex flex-col w-full">\n <div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4 w-full">\n \n @if (left_nav().length > 0){\n <div class="flex flex-wrap items-center gap-2 justify-start w-full md:w-auto">\n <ng-container *ngTemplateOutlet="blockNavOptions; context: {items: left_nav()}"></ng-container>\n </div>\n }\n\n @if (center_nav().length > 0) {\n <div class="flex flex-wrap items-center gap-2 justify-center w-full md:w-auto flex-1">\n <ng-container *ngTemplateOutlet="blockNavOptions; context: {items: center_nav()}"></ng-container>\n </div>\n }\n\n @if (right_nav().length > 0) {\n <div class="flex flex-wrap items-center gap-2 justify-end w-full md:w-auto ml-auto">\n <ng-container *ngTemplateOutlet="blockNavOptions; context: {items: right_nav()}"></ng-container>\n </div>\n }\n </div>\n\n @if(showLine()) {\n <hr class="w-full border-t border-slate-200 dark:border-slate-700 my-4" />\n }\n </div>\n}\n\n<ng-template #blockNavOptions let-items="items">\n @for (item of items; track $index) {\n @switch (item.type || \'button\') {\n \n @case (\'input\') {\n <ng-container *ngTemplateOutlet="blockInput; context: {item: item}"></ng-container>\n }\n @case (\'search\') {\n <ng-container *ngTemplateOutlet="blockInput; context: {item: item}"></ng-container>\n }\n\n @case (\'button\') {\n <button type="button" (click)="btnClick(item)" [title]="item.tooltip || \'\'" \n class="cursor-pointer inline-flex items-center justify-center transition-colors h-[38px]"\n [ngClass]="item.class ? item.class : \'px-3 py-1.5 bg-slate-100 hover:bg-slate-200 text-slate-700 font-medium text-sm rounded-md dark:bg-slate-800 dark:hover:bg-slate-700 dark:text-slate-200 border border-slate-200 dark:border-slate-700\'">\n @if(item.icon) { <i class="{{item.icon}}" [class.mr-1]="item.title || item.label"></i> }\n {{item.title || item.label}}\n </button>\n }\n\n @case (\'text\') {\n <span [ngClass]="item.class || \'text-slate-700 dark:text-slate-300 font-medium\'">\n @if(item.icon) { <i class="{{item.icon}}" [class.mr-1]="item.title || item.label"></i> }\n {{item.title || item.label}}\n </span>\n }\n\n @case (\'menu\') {\n <aif-menu [config]="item" />\n }\n }\n }\n</ng-template>\n\n<ng-template #blockInput let-item="item">\n <div class="relative flex items-center shadow-sm w-full sm:w-64 max-w-xs">\n <input #search_input \n (keydown.enter)="submitInput(search_input, item)"\n (input)="onInputChange(search_input, item)"\n class="flex-1 block w-full bg-slate-50 dark:bg-slate-800 text-slate-700 dark:text-slate-200 border border-slate-300 dark:border-slate-600 focus:ring-primary-500 focus:border-primary-500 sm:text-sm pl-3 pr-10 py-1.5 transition-colors rounded-md h-[38px]"\n placeholder="{{item.placeholder||\'\'}}" type="text" />\n \n @if(item.button || item.icon) {\n <button type="button" (click)="submitInput(search_input, item)" \n class="absolute inset-y-0 right-0 flex items-center pr-3 cursor-pointer text-slate-400 hover:text-primary-500 transition-colors">\n @if(item.icon){<i class="{{item.icon}}"></i>}\n @if(item.button && item.button !== true && item.button !== \' \'){<span class="ml-1 text-sm font-medium">{{item.button}}</span>}\n </button>\n }\n </div>\n</ng-template>\n',styles:[""],dependencies:[{kind:"directive",type:NgTemplateOutlet,selector:"[ngTemplateOutlet]",inputs:["ngTemplateOutletContext","ngTemplateOutlet","ngTemplateOutletInjector"]},{kind:"component",type:AifMenu,selector:"aif-menu",inputs:["config","fields","index","total"],outputs:["onInit"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavBar,decorators:[{type:Component,args:[{selector:"aif-nav-bar",imports:[NgTemplateOutlet,AifMenu,NgClass],template:'@if (hasItems()) {\n <div class="aif-nav-bar flex flex-col w-full">\n <div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4 w-full">\n \n @if (left_nav().length > 0){\n <div class="flex flex-wrap items-center gap-2 justify-start w-full md:w-auto">\n <ng-container *ngTemplateOutlet="blockNavOptions; context: {items: left_nav()}"></ng-container>\n </div>\n }\n\n @if (center_nav().length > 0) {\n <div class="flex flex-wrap items-center gap-2 justify-center w-full md:w-auto flex-1">\n <ng-container *ngTemplateOutlet="blockNavOptions; context: {items: center_nav()}"></ng-container>\n </div>\n }\n\n @if (right_nav().length > 0) {\n <div class="flex flex-wrap items-center gap-2 justify-end w-full md:w-auto ml-auto">\n <ng-container *ngTemplateOutlet="blockNavOptions; context: {items: right_nav()}"></ng-container>\n </div>\n }\n </div>\n\n @if(showLine()) {\n <hr class="w-full border-t border-slate-200 dark:border-slate-700 my-4" />\n }\n </div>\n}\n\n<ng-template #blockNavOptions let-items="items">\n @for (item of items; track $index) {\n @switch (item.type || \'button\') {\n \n @case (\'input\') {\n <ng-container *ngTemplateOutlet="blockInput; context: {item: item}"></ng-container>\n }\n @case (\'search\') {\n <ng-container *ngTemplateOutlet="blockInput; context: {item: item}"></ng-container>\n }\n\n @case (\'button\') {\n <button type="button" (click)="btnClick(item)" [title]="item.tooltip || \'\'" \n class="cursor-pointer inline-flex items-center justify-center transition-colors h-[38px]"\n [ngClass]="item.class ? item.class : \'px-3 py-1.5 bg-slate-100 hover:bg-slate-200 text-slate-700 font-medium text-sm rounded-md dark:bg-slate-800 dark:hover:bg-slate-700 dark:text-slate-200 border border-slate-200 dark:border-slate-700\'">\n @if(item.icon) { <i class="{{item.icon}}" [class.mr-1]="item.title || item.label"></i> }\n {{item.title || item.label}}\n </button>\n }\n\n @case (\'text\') {\n <span [ngClass]="item.class || \'text-slate-700 dark:text-slate-300 font-medium\'">\n @if(item.icon) { <i class="{{item.icon}}" [class.mr-1]="item.title || item.label"></i> }\n {{item.title || item.label}}\n </span>\n }\n\n @case (\'menu\') {\n <aif-menu [config]="item" />\n }\n }\n }\n</ng-template>\n\n<ng-template #blockInput let-item="item">\n <div class="relative flex items-center shadow-sm w-full sm:w-64 max-w-xs">\n <input #search_input \n (keydown.enter)="submitInput(search_input, item)"\n (input)="onInputChange(search_input, item)"\n class="flex-1 block w-full bg-slate-50 dark:bg-slate-800 text-slate-700 dark:text-slate-200 border border-slate-300 dark:border-slate-600 focus:ring-primary-500 focus:border-primary-500 sm:text-sm pl-3 pr-10 py-1.5 transition-colors rounded-md h-[38px]"\n placeholder="{{item.placeholder||\'\'}}" type="text" />\n \n @if(item.button || item.icon) {\n <button type="button" (click)="submitInput(search_input, item)" \n class="absolute inset-y-0 right-0 flex items-center pr-3 cursor-pointer text-slate-400 hover:text-primary-500 transition-colors">\n @if(item.icon){<i class="{{item.icon}}"></i>}\n @if(item.button && item.button !== true && item.button !== \' \'){<span class="ml-1 text-sm font-medium">{{item.button}}</span>}\n </button>\n }\n </div>\n</ng-template>\n'}]}],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],side:[{type:i0.Input,args:[{isSignal:!0,alias:"side",required:!1}]}]}});class AifFormTable{config=input({},...ngDevMode?[{debugName:"config"}]:[]);header=signal({},...ngDevMode?[{debugName:"header"}]:[]);footer=signal({},...ngDevMode?[{debugName:"footer"}]:[]);data=signal([],...ngDevMode?[{debugName:"data"}]:[]);columns=signal([],...ngDevMode?[{debugName:"columns"}]:[]);fields=signal([],...ngDevMode?[{debugName:"fields"}]:[]);selectedRows=signal(new Set,...ngDevMode?[{debugName:"selectedRows"}]:[]);showSelection=signal(!1,...ngDevMode?[{debugName:"showSelection"}]:[]);selectionType=signal("checkbox",...ngDevMode?[{debugName:"selectionType"}]:[]);selectionTrackBy=signal("id",...ngDevMode?[{debugName:"selectionTrackBy"}]:[]);selectionBind=signal("",...ngDevMode?[{debugName:"selectionBind"}]:[]);selectionTrueValue=signal(!0,...ngDevMode?[{debugName:"selectionTrueValue"}]:[]);selectionFalseValue=signal(!1,...ngDevMode?[{debugName:"selectionFalseValue"}]:[]);count_data=signal(0,...ngDevMode?[{debugName:"count_data"}]:[]);noResultsLabel=signal(lang(["form","table.no_results"])||"Sin resultados",...ngDevMode?[{debugName:"noResultsLabel"}]:[]);navbar=signal({},...ngDevMode?[{debugName:"navbar"}]:[]);tableBaseConfig=computed(()=>({header:this.header(),footer:this.footer(),columns:this.columns(),fields:this.fields(),data:this.data(),readonly:this.config()?.readonly,disabled:this.config()?.disabled,showSelection:this.showSelection(),selectionType:this.selectionType(),selectedRows:this.selectedRows(),showActions:!1,noResultsLabel:this.config()?.emptyMessage?this.config()?.emptyMessage:this.noResultsLabel(),getCellValue:(e,t,n)=>this.getField(e,t,n),onCellClick:(e,t,n)=>this.onClick(e,n,this.fields()),getRowId:e=>this.getSelectionValue(e),onRowClick:e=>this.showSelection()?this.toggleSelection(this.getSelectionValue(e),e):null,onToggleSelection:(e,t)=>this.onSelectionChange(this.getSelectionValue(e),e,{target:t.target}),onAction:(e,t,n)=>this.onOption(e,t,n)}),...ngDevMode?[{debugName:"tableBaseConfig"}]:[]);constructor(){effect(()=>{this.build(this.config())})}ngOnInit(){}createFunctions(e){e&&(e.getData=e=>this.data()||[],e.onLoadData=e.onLoadData||(()=>{}),e.onContext=e.onContext||(()=>{}),e.build=(e={})=>this.build(e),e.getContext=()=>this,e.onValidUnique=(e={},t=[])=>this.validUnique(e,t),e.onAction=e.onAction||(()=>{}),e.onContext(this))}build(e={}){this.createFunctions(e),e.columns&&this.prepareTable(e)}prepareTable(e={}){const t=[],n=[],i=e.selection||null;this.showSelection.set(!!i),this.selectionType.set("radio"===i?.type?"radio":"checkbox"),this.selectionTrackBy.set(i?.trackBy||"id"),this.selectionBind.set(i?.bind||""),this.selectionTrueValue.set(i?.trueValue??!0),this.selectionFalseValue.set(i?.falseValue??!1);for(let i of e.columns)"string"==typeof i?(t.push(i),n.push(i.toLowerCase().replace(/ /g,"_"))):(t.push(i.name),i.image?n.push(i):i.field&&!i.click?n.push(i.field):i.action?n.push(i.action):n.push(i));this.columns.set(t),this.fields.set(n),this.navbar.set(e.navbar||{});const a=e.data||[];this.data.set(a),this.header.set(e.header||{}),this.syncSelectedRows(a),e.onLoadData&&e.onLoadData(a,this)}getSelectionValue(e={}){return e&&"object"==typeof e?e[this.selectionTrackBy()]??e.id??e.hash??e.name??"":""}syncSelectedRows(e=[]){if(!this.showSelection()||!this.selectionBind())return void this.selectedRows.set(new Set);const t=new Set;e.forEach(e=>{e?.[this.selectionBind()]===this.selectionTrueValue()&&t.add(this.getSelectionValue(e))}),this.selectedRows.set(t)}toggleSelection(e,t={},n){n?.stopPropagation(),this.onSelectionChange(e,t,{target:{checked:!this.selectedRows().has(e)}})}onSelectionChange(e,t={},n){if(!this.showSelection())return;const i=!!n?.target?.checked,a=this.selectionBind(),s=[...this.data()].map(t=>{const n=this.getSelectionValue(t)===e;return a?"radio"===this.selectionType()?{...t,[a]:n&&i?this.selectionTrueValue():this.selectionFalseValue()}:n?{...t,[a]:i?this.selectionTrueValue():this.selectionFalseValue()}:t:t});this.data.set(s),this.syncSelectedRows(s),this.config()?.onSetData?.(s,t,e)}setFooterTbody(e){this.footer.update(t=>({...t,tbody:e||{}}))}json_hierarchy_val(e,t){let n=e;for(const e of t){if(!n[e])return"";if(n[e]&&"string"==typeof n[e])return n[e];n=n[e]}return n}validUnique(e={},t=[]){const n=this.data();for(const i of n){let n=0;for(const a in t){const s=t[a];str_to_normalize(i[s])==str_to_normalize(e[s])&&n++}if(n&&n>=t.length)return e.success=!1,e.message="El registro ya existe",e}return""}getField(e,t={},n){if("string"==typeof e)return t[e];if(e instanceof Array)return this.json_hierarchy_val(t,e);if("object"==typeof e){if("function"==typeof e.custom)return e.custom(t,n);if(e.image&&e.field)return t[e.field];if(e.action)return e.action;if(e.click)return t[e.field]}return"otro"}onOption(e,t={},n=0){if("del"==e||"delete"==e){const e=[...this.data()];e.splice(n,1),this.data.set(e);const t=this.config();t.data=e,t.onDelete&&t.onDelete(n)}else"edit"==e?this.config()?.onAction?.("edit",t,n):"add"==e?this.config()?.onAction?.("add",t,n):this.config()?.onAction?.(e,t,n)}onClick(e,t,n){return e&&e.click&&e.click(this.data()[t],t,n),null}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormTable,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormTable,isStandalone:!0,selector:"aif-form-table",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (navbar()?.left?.length || navbar()?.center?.length || navbar()?.right?.length) {\n <div class="mb-4">\n <aif-nav-bar [config]="navbar()"></aif-nav-bar>\n </div>\n}\n<aif-table-base [config]="tableBaseConfig()"></aif-table-base>\n',dependencies:[{kind:"component",type:AifTableBase,selector:"aif-table-base",inputs:["config"]},{kind:"component",type:AifNavBar,selector:"aif-nav-bar",inputs:["config","side"],outputs:["onInit"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormTable,decorators:[{type:Component,args:[{selector:"aif-form-table",standalone:!0,imports:[AifTableBase,AifNavBar],template:'@if (navbar()?.left?.length || navbar()?.center?.length || navbar()?.right?.length) {\n <div class="mb-4">\n <aif-nav-bar [config]="navbar()"></aif-nav-bar>\n </div>\n}\n<aif-table-base [config]="tableBaseConfig()"></aif-table-base>\n'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifAlert{config=input({},...ngDevMode?[{debugName:"config"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);state=computed(()=>({...this.config(),...this.cfg()}),...ngDevMode?[{debugName:"state"}]:[]);type=computed(()=>this.state().type??"primary",...ngDevMode?[{debugName:"type"}]:[]);message=computed(()=>this.state().message??"",...ngDevMode?[{debugName:"message"}]:[]);center=computed(()=>this.state().center??!1,...ngDevMode?[{debugName:"center"}]:[]);closable=computed(()=>this.state().closable??!0,...ngDevMode?[{debugName:"closable"}]:[]);wrapperClass=computed(()=>this.state().class??"",...ngDevMode?[{debugName:"wrapperClass"}]:[]);show=computed(()=>{if(!this.message())return!1;return this.state().show??!0},...ngDevMode?[{debugName:"show"}]:[]);alertClasses=computed(()=>{const e={primary:"border border-blue-200 bg-blue-100/80 text-blue-900 dark:border-blue-500/25 dark:bg-blue-500/10 dark:text-blue-300",secondary:"border border-slate-200 bg-slate-100/85 text-slate-800 dark:border-slate-500/25 dark:bg-slate-400/10 dark:text-slate-200",success:"border border-green-200 bg-green-100/75 text-green-900 dark:border-green-500/25 dark:bg-green-500/10 dark:text-green-300",danger:"border border-red-200 bg-red-100/75 text-red-900 dark:border-red-500/25 dark:bg-red-500/10 dark:text-red-300",warning:"border border-amber-200 bg-amber-100/80 text-amber-900 dark:border-amber-400/25 dark:bg-amber-400/10 dark:text-amber-200",info:"border border-cyan-200 bg-cyan-100/80 text-cyan-900 dark:border-cyan-400/25 dark:bg-cyan-400/10 dark:text-cyan-200",light:"border border-gray-200 bg-gray-50 text-gray-800 dark:border-gray-500/25 dark:bg-gray-100/10 dark:text-gray-100",dark:"border border-slate-700/80 bg-slate-900/95 text-slate-50 dark:border-slate-600/80 dark:bg-slate-900 dark:text-slate-100"};return e[this.type()]??e.primary},...ngDevMode?[{debugName:"alertClasses"}]:[]);closeButtonClasses=computed(()=>{const e={primary:"text-blue-500 hover:bg-blue-500/10 hover:text-blue-700 dark:text-blue-300 dark:hover:bg-blue-400/10 dark:hover:text-blue-200",secondary:"text-slate-500 hover:bg-slate-500/10 hover:text-slate-700 dark:text-slate-300 dark:hover:bg-slate-400/10 dark:hover:text-slate-100",success:"text-green-500 hover:bg-green-500/10 hover:text-green-700 dark:text-green-300 dark:hover:bg-green-400/10 dark:hover:text-green-200",danger:"text-red-500 hover:bg-red-500/10 hover:text-red-700 dark:text-red-300 dark:hover:bg-red-400/10 dark:hover:text-red-200",warning:"text-amber-500 hover:bg-amber-500/10 hover:text-amber-700 dark:text-amber-200 dark:hover:bg-amber-400/10 dark:hover:text-amber-100",info:"text-cyan-500 hover:bg-cyan-500/10 hover:text-cyan-700 dark:text-cyan-200 dark:hover:bg-cyan-400/10 dark:hover:text-cyan-100",light:"text-gray-500 hover:bg-gray-500/10 hover:text-gray-700 dark:text-gray-200 dark:hover:bg-gray-400/10 dark:hover:text-white",dark:"text-slate-300 hover:bg-white/10 hover:text-white dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white"};return e[this.type()]??e.primary},...ngDevMode?[{debugName:"closeButtonClasses"}]:[]);constructor(){effect(()=>{this.attachApi(this.config())})}build(e={}){this.cfg.update(t=>({...t,...e})),this.attachApi(this.config())}reBuild(e={}){this.cfg.set({...e}),this.attachApi(this.config())}resetToInput(){this.cfg.set({}),this.attachApi(this.config())}close(){this.cfg.update(e=>({...e,show:!1}))}closeAlert(){this.close()}open(e,t){this.cfg.update(n=>({...n,message:e,type:t??n.type??this.type(),show:!0}))}attachApi(e){e&&(e.build=(e={})=>this.build(e),e.reBuild=(e={})=>this.reBuild(e),e.open=(e,t)=>this.open(e,t),e.close=()=>this.close())}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAlert,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifAlert,isStandalone:!0,selector:"aif-alert",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (show()) {\n <div\n class="aif-alert mb-4 flex items-start gap-3 rounded-lg p-4 text-sm"\n [ngClass]="[alertClasses(), wrapperClass()]"\n role="alert"\n >\n <div [class.text-center]="center()" class="min-w-0 flex-1">\n {{ message() }}\n </div>\n\n @if (closable()) {\n <button\n type="button"\n class="ml-auto -mx-1.5 -my-1.5 inline-flex h-8 w-8 rounded-lg bg-transparent p-1.5 focus:ring-2"\n [ngClass]="closeButtonClasses()"\n aria-label="Close"\n (click)="close()"\n >\n <span class="sr-only">Close</span>\n <svg\n class="h-3 w-3"\n aria-hidden="true"\n xmlns="http://www.w3.org/2000/svg"\n fill="none"\n viewBox="0 0 14 14"\n >\n <path\n stroke="currentColor"\n stroke-linecap="round"\n stroke-linejoin="round"\n stroke-width="2"\n d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"\n />\n </svg>\n </button>\n }\n </div>\n}\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAlert,decorators:[{type:Component,args:[{selector:"aif-alert",standalone:!0,imports:[NgClass],template:'@if (show()) {\n <div\n class="aif-alert mb-4 flex items-start gap-3 rounded-lg p-4 text-sm"\n [ngClass]="[alertClasses(), wrapperClass()]"\n role="alert"\n >\n <div [class.text-center]="center()" class="min-w-0 flex-1">\n {{ message() }}\n </div>\n\n @if (closable()) {\n <button\n type="button"\n class="ml-auto -mx-1.5 -my-1.5 inline-flex h-8 w-8 rounded-lg bg-transparent p-1.5 focus:ring-2"\n [ngClass]="closeButtonClasses()"\n aria-label="Close"\n (click)="close()"\n >\n <span class="sr-only">Close</span>\n <svg\n class="h-3 w-3"\n aria-hidden="true"\n xmlns="http://www.w3.org/2000/svg"\n fill="none"\n viewBox="0 0 14 14"\n >\n <path\n stroke="currentColor"\n stroke-linecap="round"\n stroke-linejoin="round"\n stroke-width="2"\n d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"\n />\n </svg>\n </button>\n }\n </div>\n}\n'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifFormHiddenText{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormHiddenText,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifFormHiddenText,isStandalone:!0,selector:"aif-form-hidden-text",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="relative mb-0" [formGroup]="aifForm().form">\n <div\n class="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 sm:text-sm sm:leading-6 bg-gray-50">\n <input type="hidden" [name]="fd().name" [formControlName]="fd().name">\n <div [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled" class="px-2">{{ aifForm().field[fd().name].text }}</div>\n </div>\n <label class="absolute -top-2 left-2 inline-block px-1 text-xs font-medium text-gray-900 dark:text-slate-300">{{\n fd().label }}</label>\n</div>\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormHiddenText,decorators:[{type:Component,args:[{selector:"aif-form-hidden-text",standalone:!0,imports:[ReactiveFormsModule],template:'<div class="relative mb-0" [formGroup]="aifForm().form">\n <div\n class="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 sm:text-sm sm:leading-6 bg-gray-50">\n <input type="hidden" [name]="fd().name" [formControlName]="fd().name">\n <div [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled" class="px-2">{{ aifForm().field[fd().name].text }}</div>\n </div>\n <label class="absolute -top-2 left-2 inline-block px-1 text-xs font-medium text-gray-900 dark:text-slate-300">{{\n fd().label }}</label>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormInput{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);field=computed(()=>this.fd(),...ngDevMode?[{debugName:"field"}]:[]);formCtx=computed(()=>this.aifForm(),...ngDevMode?[{debugName:"formCtx"}]:[]);isRequired=computed(()=>{const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.isFieldRequired(e)},...ngDevMode?[{debugName:"isRequired"}]:[]);isReadonly=computed(()=>!(!this.field()?.attr?.readonly&&!this.field()?.attr?.disabled),...ngDevMode?[{debugName:"isReadonly"}]:[]);nativeType=computed(()=>{const e=this.field();if(!e)return"text";const t="object"==typeof e.type?e.type.type:e.type;return"datetime"===t?"datetime-local":t},...ngDevMode?[{debugName:"nativeType"}]:[]);getNativeType(){return this.nativeType()}hasFieldError(){const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.hasError(e)}currentFieldClass(){const e=this.field(),t=this.formCtx();return e&&t?t.fieldClass(e):{}}validateInput(e){const t=this.fd();if(!t?.attr?.readonly&&!t?.attr?.disabled&&t?.attr){let n=e.key;if(t.attr.uppercase){const i=e.target;n=n.toUpperCase(),i.value=i.value.toUpperCase(),this.aifForm().field[t.name].value=i.value,this.aifForm().form.get(t.name)?.setValue(i.value)}if(t.attr.pattern){let i=t.attr.pattern;new RegExp(i).test(n)||"Backspace"===n||"Tab"===n||e.preventDefault()}}}validateField(e){const t=this.fd();if(!t?.attr?.readonly&&!t?.attr?.disabled&&t?.attr){let n=e.target;const i=n.selectionStart||0;if(t.attr.uppercase&&(n.value=n.value.toUpperCase(),this.aifForm().field[t.name].value=n.value,this.aifForm().form.get(t.name)?.setValue(n.value)),t.attr.pattern){let e=t.attr.pattern,i=new RegExp(e);if(n.value&&!i.test(n.value)){const e=n.value.split("").filter(e=>i.test(e)).join("");n.value=e.trim()}}"number"!==t.type&&n.setSelectionRange(i,i)}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormInput,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormInput,isStandalone:!0,selector:"aif-form-input",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <input [type]="nativeType()" [maxlength]="field()?.attr?.maxlength" [class.bg-gray-100]="isReadonly()"\n [class.dark:bg-gray-700]="isReadonly()" [style]="field()?.attr?.style"\n [readonly]="field()?.attr?.readonly"\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 px-3 text-gray-900 dark:text-white bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset sm:text-sm sm:leading-6 placeholder:text-gray-400 appearance-none transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [id]="field()?.name" [formControlName]="field()?.name" placeholder=" "\n (keypress)="validateInput($event)" (input)="validateField($event)"\n >\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">\n {{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }\n </label>\n</div>\n@if(field()?.attr?.reload) {\n<span (click)="formCtx().fieldReload(field())"\n class="absolute right-0 top-0 mt-2 mr-2 cursor-pointer text-gray-400 hover:text-gray-600">\n <i class="fas fa-sync-alt"></i> \x3c!-- Replace icon --\x3e\n</span>\n}\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.MaxLengthValidator,selector:"[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",inputs:["maxlength"]},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormInput,decorators:[{type:Component,args:[{selector:"aif-form-input",standalone:!0,imports:[ReactiveFormsModule],template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <input [type]="nativeType()" [maxlength]="field()?.attr?.maxlength" [class.bg-gray-100]="isReadonly()"\n [class.dark:bg-gray-700]="isReadonly()" [style]="field()?.attr?.style"\n [readonly]="field()?.attr?.readonly"\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 px-3 text-gray-900 dark:text-white bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset sm:text-sm sm:leading-6 placeholder:text-gray-400 appearance-none transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [id]="field()?.name" [formControlName]="field()?.name" placeholder=" "\n (keypress)="validateInput($event)" (input)="validateField($event)"\n >\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">\n {{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }\n </label>\n</div>\n@if(field()?.attr?.reload) {\n<span (click)="formCtx().fieldReload(field())"\n class="absolute right-0 top-0 mt-2 mr-2 cursor-pointer text-gray-400 hover:text-gray-600">\n <i class="fas fa-sync-alt"></i> \x3c!-- Replace icon --\x3e\n</span>\n}\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormSelect{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);field=computed(()=>this.fd(),...ngDevMode?[{debugName:"field"}]:[]);formCtx=computed(()=>this.aifForm(),...ngDevMode?[{debugName:"formCtx"}]:[]);isRequired=computed(()=>{const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.isFieldRequired(e)},...ngDevMode?[{debugName:"isRequired"}]:[]);isReadonly=computed(()=>!(!this.field()?.attr?.readonly&&!this.field()?.attr?.disabled),...ngDevMode?[{debugName:"isReadonly"}]:[]);hasFieldError(){const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.hasError(e)}currentFieldClass(){const e=this.field(),t=this.formCtx();return e&&t?t.fieldClass(e):{}}items=computed(()=>{const e=this.formCtx(),t=this.field();return e&&t?.name?e.catOptions(t.name):[]},...ngDevMode?[{debugName:"items"}]:[]);selectionOptionLabel=signal(lang(["form","select.selection_one_option"])||"— Selecciona una opción —",...ngDevMode?[{debugName:"selectionOptionLabel"}]:[]);static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormSelect,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormSelect,isStandalone:!0,selector:"aif-form-select",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <select\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 pl-3 pr-10 text-gray-900 dark:text-gray-100 bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset sm:text-sm sm:leading-6 appearance-none transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [class.bg-gray-100]="isReadonly()" [class.dark:bg-gray-800]="isReadonly()" [class.pointer-events-none]="field()?.attr?.readonly" [id]="field()?.name"\n [style]="field()?.attr?.style" [attr.tabindex]="field()?.attr?.readonly ? -1 : null" [formControlName]="field()?.name">\n <option value="" disabled hidden class="text-gray-400 dark:text-slate-500 italic">{{ selectionOptionLabel() }}</option>\n @if(items().length > 0) {\n @for (option of items(); track $index) {\n <option [value]="option.value" class="text-gray-900 dark:text-gray-100 dark:bg-gray-800">\n {{option?.description}}\n </option>\n }\n }\n </select>\n <div\n class="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-gray-500 group-hover:text-indigo-600 group-focus-within:text-indigo-600 dark:group-hover:text-indigo-400 dark:group-focus-within:text-indigo-400 transition-colors">\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd"\n d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"\n clip-rule="evenodd" />\n </svg>\n </div>\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">{{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }</label>\n</div>\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.NgSelectOption,selector:"option",inputs:["ngValue","value"]},{kind:"directive",type:i1$2.ɵNgSelectMultipleOption,selector:"option",inputs:["ngValue","value"]},{kind:"directive",type:i1$2.SelectControlValueAccessor,selector:"select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]",inputs:["compareWith"]},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}],changeDetection:i0.ChangeDetectionStrategy.OnPush})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormSelect,decorators:[{type:Component,args:[{selector:"aif-form-select",standalone:!0,imports:[ReactiveFormsModule],changeDetection:ChangeDetectionStrategy.OnPush,template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <select\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 pl-3 pr-10 text-gray-900 dark:text-gray-100 bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset sm:text-sm sm:leading-6 appearance-none transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [class.bg-gray-100]="isReadonly()" [class.dark:bg-gray-800]="isReadonly()" [class.pointer-events-none]="field()?.attr?.readonly" [id]="field()?.name"\n [style]="field()?.attr?.style" [attr.tabindex]="field()?.attr?.readonly ? -1 : null" [formControlName]="field()?.name">\n <option value="" disabled hidden class="text-gray-400 dark:text-slate-500 italic">{{ selectionOptionLabel() }}</option>\n @if(items().length > 0) {\n @for (option of items(); track $index) {\n <option [value]="option.value" class="text-gray-900 dark:text-gray-100 dark:bg-gray-800">\n {{option?.description}}\n </option>\n }\n }\n </select>\n <div\n class="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-gray-500 group-hover:text-indigo-600 group-focus-within:text-indigo-600 dark:group-hover:text-indigo-400 dark:group-focus-within:text-indigo-400 transition-colors">\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd"\n d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"\n clip-rule="evenodd" />\n </svg>\n </div>\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">{{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }</label>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormNgSelect{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);field=computed(()=>this.fd(),...ngDevMode?[{debugName:"field"}]:[]);formCtx=computed(()=>this.aifForm(),...ngDevMode?[{debugName:"formCtx"}]:[]);isRequired=computed(()=>{const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.isFieldRequired(e)},...ngDevMode?[{debugName:"isRequired"}]:[]);isReadonly=computed(()=>!(!this.field()?.attr?.readonly&&!this.field()?.attr?.disabled),...ngDevMode?[{debugName:"isReadonly"}]:[]);items=computed(()=>{const e=this.formCtx(),t=this.field();return e&&t?.name?e.catOptions(t.name):[]},...ngDevMode?[{debugName:"items"}]:[]);onSearch(e){this.aifForm()?.onSearch?.(e,this.fd())}onClear(){this.aifForm()?.onClear?.(this.fd()?.name)}hasFieldError(){const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.hasError(e)}currentFieldClass(){const e=this.field(),t=this.formCtx();return e&&t?t.fieldClass(e):{}}isClearable(){const e=this.field(),t=this.formCtx();if(!e||!t||this.isReadonly())return!1;const n=t.form?.get(e.name)?.value;return Array.isArray(n)?n.length>0:null!=n&&""!==n}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormNgSelect,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormNgSelect,isStandalone:!0,selector:"aif-form-ng-select",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <ng-select\n class="custom-ng-select block w-full text-sm text-gray-900 dark:text-white bg-transparent appearance-none focus:outline-none focus:ring-0 peer"\n [class.has-error]="hasFieldError()"\n [class.readonly]="isReadonly()" (search)="onSearch($event)"\n [items]="items()" bindLabel="description" bindValue="value" notFoundText=""\n [readonly]="field()?.attr?.readonly" [searchable]="!isReadonly()" [clearable]="isClearable()"\n [tabIndex]="field()?.attr?.readonly ? -1 : 0" [formControlName]="field()?.name"\n [ngClass]="currentFieldClass()"\n (clear)="onClear()" appendTo="body">\n </ng-select>\n <label\n class="ng-select-floating-label absolute -top-2 left-2 inline-block rounded px-1 text-xs z-20 transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">\n {{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }\n </label>\n</div>\n',styles:['.custom-ng-select .ng-select-container{border:none!important;border-radius:.375rem!important;min-height:2.625rem;box-shadow:inset 0 0 0 1px #e2e8f0!important;background-color:#f8fafc80!important;transition:box-shadow .15s ease,background-color .15s ease,color .15s ease!important}.custom-ng-select:hover .ng-select-container{box-shadow:inset 0 0 0 1px #4f46e54d!important}.custom-ng-select .ng-value-container{padding:0 .75rem!important;align-items:center!important}.ng-select-floating-label{box-shadow:0 0 0 4px #fff}.custom-ng-select .ng-value-container .ng-placeholder{color:#9ca3af!important}.custom-ng-select .ng-value-container .ng-value{display:flex!important;align-items:center!important;margin-top:0!important;margin-bottom:0!important}.custom-ng-select .ng-clear-wrapper{opacity:1!important;color:#94a3b8;width:1.5rem;min-width:1.5rem;height:1.5rem;justify-content:center;padding-right:.5rem!important;transition:opacity .15s ease,color .15s ease!important}.custom-ng-select .ng-clear-wrapper,.custom-ng-select .ng-arrow-wrapper{display:flex;align-items:center}.custom-ng-select .ng-clear-wrapper:hover,.custom-ng-select .ng-clear-wrapper:focus{color:#e2e8f0}.custom-ng-select .ng-clear-wrapper:before{content:"\\d7";display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;color:inherit;font-size:1.125rem;line-height:1;font-weight:500}.custom-ng-select .ng-clear-wrapper .ng-clear,.custom-ng-select.readonly .ng-clear-wrapper,.custom-ng-select.ng-select-disabled .ng-clear-wrapper{display:none!important}.custom-ng-select .ng-input{top:50%!important;left:.75rem!important;right:2.5rem!important;width:auto!important;transform:translateY(-50%)!important}.dark .custom-ng-select .ng-select-container{box-shadow:inset 0 0 0 1px #33415580!important;background-color:#1e293b80!important}.dark .custom-ng-select:hover .ng-select-container{box-shadow:inset 0 0 0 1px #818cf859!important}.dark .ng-select-floating-label{box-shadow:0 0 0 4px #111827}.custom-ng-select.ng-select-focused .ng-select-container{box-shadow:inset 0 0 0 2px #6366f1f2,0 0 0 1px #6366f124!important}.dark .custom-ng-select.ng-select-focused .ng-select-container{box-shadow:inset 0 0 0 2px #818cf8f2,0 0 0 1px #818cf833!important}.custom-ng-select.has-error .ng-select-container{box-shadow:inset 0 0 0 1px #f43f5e!important}.custom-ng-select.has-error.ng-select-focused .ng-select-container{box-shadow:inset 0 0 0 1px #f43f5e,0 0 0 1px #f43f5e24!important}.custom-ng-select.readonly .ng-select-container{background-color:#f3f4f6!important}.dark .custom-ng-select.readonly .ng-select-container{background-color:#374151!important}.custom-ng-select.readonly .ng-value-container,.custom-ng-select.readonly .ng-arrow-wrapper,.custom-ng-select.readonly .ng-clear-wrapper{color:#94a3b8!important}.ng-dropdown-panel{background-color:#fff;z-index:9999!important;border:1px solid #e5e7eb;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;border-radius:.375rem}.ng-dropdown-panel .ng-option{padding:.5rem 1rem;cursor:pointer;color:#111827;background-color:#fff}.ng-dropdown-panel .ng-option:hover,.ng-dropdown-panel .ng-option.ng-option-marked{background-color:#f3f4f6}.dark .ng-dropdown-panel{background-color:#1f2937!important;border-color:#374151}.dark .ng-dropdown-panel .ng-option{background-color:#1f2937;color:#f9fafb}.dark .ng-dropdown-panel .ng-option:hover,.dark .ng-dropdown-panel .ng-option.ng-option-marked{background-color:#374151}\n'],dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"ngmodule",type:NgSelectModule},{kind:"component",type:i2.NgSelectComponent,selector:"ng-select",inputs:["ariaLabelDropdown","ariaLabel","markFirst","placeholder","fixedPlaceholder","notFoundText","typeToSearchText","preventToggleOnRightClick","addTagText","loadingText","clearAllText","dropdownPosition","appendTo","outsideClickEvent","loading","closeOnSelect","hideSelected","selectOnTab","openOnEnter","maxSelectedItems","groupBy","groupValue","bufferAmount","virtualScroll","selectableGroup","tabFocusOnClearButton","selectableGroupAsModel","searchFn","trackByFn","clearOnBackspace","labelForId","inputAttrs","tabIndex","readonly","searchWhileComposing","minTermLength","editableSearchTerm","ngClass","typeahead","multiple","addTag","searchable","clearable","clearKeepsDisabledOptions","deselectOnClick","clearSearchOnAdd","compareWith","keyDownFn","bindLabel","bindValue","appearance","isOpen","items"],outputs:["bindLabelChange","bindValueChange","appearanceChange","isOpenChange","itemsChange","blur","focus","change","open","close","search","clear","add","remove","scroll","scrollToEnd"],exportAs:["ngSelect"]}],changeDetection:i0.ChangeDetectionStrategy.OnPush,encapsulation:i0.ViewEncapsulation.None})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormNgSelect,decorators:[{type:Component,args:[{selector:"aif-form-ng-select",standalone:!0,imports:[NgClass,ReactiveFormsModule,NgSelectModule],encapsulation:ViewEncapsulation.None,changeDetection:ChangeDetectionStrategy.OnPush,template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <ng-select\n class="custom-ng-select block w-full text-sm text-gray-900 dark:text-white bg-transparent appearance-none focus:outline-none focus:ring-0 peer"\n [class.has-error]="hasFieldError()"\n [class.readonly]="isReadonly()" (search)="onSearch($event)"\n [items]="items()" bindLabel="description" bindValue="value" notFoundText=""\n [readonly]="field()?.attr?.readonly" [searchable]="!isReadonly()" [clearable]="isClearable()"\n [tabIndex]="field()?.attr?.readonly ? -1 : 0" [formControlName]="field()?.name"\n [ngClass]="currentFieldClass()"\n (clear)="onClear()" appendTo="body">\n </ng-select>\n <label\n class="ng-select-floating-label absolute -top-2 left-2 inline-block rounded px-1 text-xs z-20 transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">\n {{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }\n </label>\n</div>\n',styles:['.custom-ng-select .ng-select-container{border:none!important;border-radius:.375rem!important;min-height:2.625rem;box-shadow:inset 0 0 0 1px #e2e8f0!important;background-color:#f8fafc80!important;transition:box-shadow .15s ease,background-color .15s ease,color .15s ease!important}.custom-ng-select:hover .ng-select-container{box-shadow:inset 0 0 0 1px #4f46e54d!important}.custom-ng-select .ng-value-container{padding:0 .75rem!important;align-items:center!important}.ng-select-floating-label{box-shadow:0 0 0 4px #fff}.custom-ng-select .ng-value-container .ng-placeholder{color:#9ca3af!important}.custom-ng-select .ng-value-container .ng-value{display:flex!important;align-items:center!important;margin-top:0!important;margin-bottom:0!important}.custom-ng-select .ng-clear-wrapper{opacity:1!important;color:#94a3b8;width:1.5rem;min-width:1.5rem;height:1.5rem;justify-content:center;padding-right:.5rem!important;transition:opacity .15s ease,color .15s ease!important}.custom-ng-select .ng-clear-wrapper,.custom-ng-select .ng-arrow-wrapper{display:flex;align-items:center}.custom-ng-select .ng-clear-wrapper:hover,.custom-ng-select .ng-clear-wrapper:focus{color:#e2e8f0}.custom-ng-select .ng-clear-wrapper:before{content:"\\d7";display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;color:inherit;font-size:1.125rem;line-height:1;font-weight:500}.custom-ng-select .ng-clear-wrapper .ng-clear,.custom-ng-select.readonly .ng-clear-wrapper,.custom-ng-select.ng-select-disabled .ng-clear-wrapper{display:none!important}.custom-ng-select .ng-input{top:50%!important;left:.75rem!important;right:2.5rem!important;width:auto!important;transform:translateY(-50%)!important}.dark .custom-ng-select .ng-select-container{box-shadow:inset 0 0 0 1px #33415580!important;background-color:#1e293b80!important}.dark .custom-ng-select:hover .ng-select-container{box-shadow:inset 0 0 0 1px #818cf859!important}.dark .ng-select-floating-label{box-shadow:0 0 0 4px #111827}.custom-ng-select.ng-select-focused .ng-select-container{box-shadow:inset 0 0 0 2px #6366f1f2,0 0 0 1px #6366f124!important}.dark .custom-ng-select.ng-select-focused .ng-select-container{box-shadow:inset 0 0 0 2px #818cf8f2,0 0 0 1px #818cf833!important}.custom-ng-select.has-error .ng-select-container{box-shadow:inset 0 0 0 1px #f43f5e!important}.custom-ng-select.has-error.ng-select-focused .ng-select-container{box-shadow:inset 0 0 0 1px #f43f5e,0 0 0 1px #f43f5e24!important}.custom-ng-select.readonly .ng-select-container{background-color:#f3f4f6!important}.dark .custom-ng-select.readonly .ng-select-container{background-color:#374151!important}.custom-ng-select.readonly .ng-value-container,.custom-ng-select.readonly .ng-arrow-wrapper,.custom-ng-select.readonly .ng-clear-wrapper{color:#94a3b8!important}.ng-dropdown-panel{background-color:#fff;z-index:9999!important;border:1px solid #e5e7eb;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;border-radius:.375rem}.ng-dropdown-panel .ng-option{padding:.5rem 1rem;cursor:pointer;color:#111827;background-color:#fff}.ng-dropdown-panel .ng-option:hover,.ng-dropdown-panel .ng-option.ng-option-marked{background-color:#f3f4f6}.dark .ng-dropdown-panel{background-color:#1f2937!important;border-color:#374151}.dark .ng-dropdown-panel .ng-option{background-color:#1f2937;color:#f9fafb}.dark .ng-dropdown-panel .ng-option:hover,.dark .ng-dropdown-panel .ng-option.ng-option-marked{background-color:#374151}\n']}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormTextarea{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);field=computed(()=>this.fd(),...ngDevMode?[{debugName:"field"}]:[]);formCtx=computed(()=>this.aifForm(),...ngDevMode?[{debugName:"formCtx"}]:[]);isRequired=computed(()=>{const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.isFieldRequired(e)},...ngDevMode?[{debugName:"isRequired"}]:[]);isReadonly=computed(()=>!(!this.field()?.attr?.readonly&&!this.field()?.attr?.disabled),...ngDevMode?[{debugName:"isReadonly"}]:[]);hasFieldError(){const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.hasError(e)}currentFieldClass(){const e=this.field(),t=this.formCtx();return e&&t?t.fieldClass(e):{}}validateInput(e){const t=this.fd();if(!t?.attr?.readonly&&!t?.attr?.disabled&&t?.attr){let n=e.key;if(t.attr.uppercase){const i=e.target;n=n.toUpperCase(),i.value=i.value.toUpperCase(),this.aifForm().field[t.name].value=i.value,this.aifForm().form.get(t.name)?.setValue(i.value)}if(t.attr.pattern){let i=t.attr.pattern;new RegExp(i).test(n)||"Backspace"===n||"Tab"===n||"Enter"===n||e.preventDefault()}}}validateField(e){const t=this.fd();if(!t?.attr?.readonly&&!t?.attr?.disabled&&t?.attr){let n=e.target;const i=n.selectionStart||0;if(t.attr.uppercase&&(n.value=n.value.toUpperCase(),this.aifForm().field[t.name].value=n.value,this.aifForm().form.get(t.name)?.setValue(n.value)),t.attr.pattern){let e=t.attr.pattern,i=new RegExp(e);if(n.value&&!i.test(n.value)){const e=n.value.split("").filter(e=>i.test(e)).join("");n.value=e.trim()}}n.setSelectionRange(i,i)}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormTextarea,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormTextarea,isStandalone:!0,selector:"aif-form-textarea",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <textarea\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 px-3 text-gray-900 dark:text-white bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset sm:text-sm sm:leading-6 placeholder:text-gray-400 appearance-none transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [maxlength]="field()?.attr?.maxlength" [class.bg-gray-100]="isReadonly()"\n [class.dark:bg-gray-700]="isReadonly()" [readonly]="field()?.attr?.readonly" [style]="field()?.attr?.style" [id]="field()?.name"\n [rows]="field()?.attr?.rows || 3" [formControlName]="field()?.name" placeholder=" "\n (keypress)="validateInput($event)" (input)="validateField($event)"></textarea>\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">{{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }</label>\n</div>\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.MaxLengthValidator,selector:"[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",inputs:["maxlength"]},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormTextarea,decorators:[{type:Component,args:[{selector:"aif-form-textarea",standalone:!0,imports:[ReactiveFormsModule],template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <textarea\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 px-3 text-gray-900 dark:text-white bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset sm:text-sm sm:leading-6 placeholder:text-gray-400 appearance-none transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [maxlength]="field()?.attr?.maxlength" [class.bg-gray-100]="isReadonly()"\n [class.dark:bg-gray-700]="isReadonly()" [readonly]="field()?.attr?.readonly" [style]="field()?.attr?.style" [id]="field()?.name"\n [rows]="field()?.attr?.rows || 3" [formControlName]="field()?.name" placeholder=" "\n (keypress)="validateInput($event)" (input)="validateField($event)"></textarea>\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">{{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }</label>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormDate{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);field=computed(()=>this.fd(),...ngDevMode?[{debugName:"field"}]:[]);formCtx=computed(()=>this.aifForm(),...ngDevMode?[{debugName:"formCtx"}]:[]);isRequired=computed(()=>{const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.isFieldRequired(e)},...ngDevMode?[{debugName:"isRequired"}]:[]);isReadonly=computed(()=>!(!this.field()?.attr?.readonly&&!this.field()?.attr?.disabled),...ngDevMode?[{debugName:"isReadonly"}]:[]);nativeType=computed(()=>{const e=this.field();if(!e)return"text";const t="object"==typeof e.type?e.type.type:e.type;return"datetime"===t?"datetime-local":t},...ngDevMode?[{debugName:"nativeType"}]:[]);timeType=computed(()=>{const e=this.field();if(!e)return!1;return"time"===("object"==typeof e.type?e.type.type:e.type)},...ngDevMode?[{debugName:"timeType"}]:[]);getNativeType(){return this.nativeType()}isTimeType(){return this.timeType()}hasFieldError(){const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.hasError(e)}currentFieldClass(){const e=this.field(),t=this.formCtx();return e&&t?t.fieldClass(e):{}}openCalendar(e){if(!this.fd()?.attr?.readonly&&!this.fd()?.attr?.disabled)try{"function"==typeof e.showPicker&&e.showPicker()}catch(t){e.focus()}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormDate,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormDate,isStandalone:!0,selector:"aif-form-date",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="relative z-0 w-full mb-5 group cursor-pointer" [class.cursor-not-allowed]="field()?.attr?.disabled" [formGroup]="formCtx().form"\n (click)="openCalendar(dateInput)">\n <input #dateInput [type]="nativeType()" [style]="field()?.attr?.style" [class.bg-gray-100]="isReadonly()"\n [class.dark:bg-gray-700]="isReadonly()"\n [readonly]="field()?.attr?.readonly"\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 pl-3 pr-10 text-gray-900 dark:text-white bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset placeholder:text-gray-400 sm:text-sm sm:leading-6 cursor-pointer [&::-webkit-calendar-picker-indicator]:opacity-0 [&::-webkit-calendar-picker-indicator]:absolute [&::-webkit-calendar-picker-indicator]:right-0 [&::-webkit-calendar-picker-indicator]:w-full [&::-webkit-calendar-picker-indicator]:h-full [&::-webkit-calendar-picker-indicator]:cursor-pointer transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [id]="field()?.name" [formControlName]="field()?.name" [placeholder]="field()?.label"\n >\n\n \x3c!-- Custom Icon overlay --\x3e\n <div\n class="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-gray-500 group-hover:text-indigo-600 group-focus-within:text-indigo-600 dark:group-hover:text-indigo-400 dark:group-focus-within:text-indigo-400 transition-colors">\n @if (isTimeType()) {\n \x3c!-- Clock Icon --\x3e\n <svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />\n </svg>\n } @else {\n \x3c!-- Calendar Icon --\x3e\n <svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />\n </svg>\n }\n </div>\n\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">\n {{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }</label>\n</div>\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormDate,decorators:[{type:Component,args:[{selector:"aif-form-date",standalone:!0,imports:[ReactiveFormsModule],template:'<div class="relative z-0 w-full mb-5 group cursor-pointer" [class.cursor-not-allowed]="field()?.attr?.disabled" [formGroup]="formCtx().form"\n (click)="openCalendar(dateInput)">\n <input #dateInput [type]="nativeType()" [style]="field()?.attr?.style" [class.bg-gray-100]="isReadonly()"\n [class.dark:bg-gray-700]="isReadonly()"\n [readonly]="field()?.attr?.readonly"\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 pl-3 pr-10 text-gray-900 dark:text-white bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset placeholder:text-gray-400 sm:text-sm sm:leading-6 cursor-pointer [&::-webkit-calendar-picker-indicator]:opacity-0 [&::-webkit-calendar-picker-indicator]:absolute [&::-webkit-calendar-picker-indicator]:right-0 [&::-webkit-calendar-picker-indicator]:w-full [&::-webkit-calendar-picker-indicator]:h-full [&::-webkit-calendar-picker-indicator]:cursor-pointer transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [id]="field()?.name" [formControlName]="field()?.name" [placeholder]="field()?.label"\n >\n\n \x3c!-- Custom Icon overlay --\x3e\n <div\n class="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-gray-500 group-hover:text-indigo-600 group-focus-within:text-indigo-600 dark:group-hover:text-indigo-400 dark:group-focus-within:text-indigo-400 transition-colors">\n @if (isTimeType()) {\n \x3c!-- Clock Icon --\x3e\n <svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />\n </svg>\n } @else {\n \x3c!-- Calendar Icon --\x3e\n <svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />\n </svg>\n }\n </div>\n\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">\n {{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }</label>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormOptions{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);items=computed(()=>{const e=this.aifForm(),t=this.fd();return e&&t?.name?e.catOptions(t.name):[]},...ngDevMode?[{debugName:"items"}]:[]);static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormOptions,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormOptions,isStandalone:!0,selector:"aif-form-options",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="group flex w-full flex-wrap items-start gap-x-4 gap-y-2 rounded-md border-0 px-3 pt-3 pb-2 text-gray-900 bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset ring-slate-200 hover:ring-indigo-600/30 group-focus-within:ring-2 group-focus-within:ring-inset group-focus-within:ring-indigo-500 dark:ring-slate-700/50 dark:hover:ring-indigo-400/35 dark:group-focus-within:ring-indigo-400 sm:text-sm sm:leading-6 min-h-[2.625rem] relative mb-5 transition-all"\n [class.opacity-70]="fd()?.attr?.disabled"\n [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n [class.dark:bg-gray-800]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n [class.pointer-events-none]="fd()?.attr?.readonly"\n [ngClass]="aifForm().fieldClass(fd())" [formGroup]="aifForm().form">\n @if(items().length > 0) {\n @for (option of items(); track $index; let i = $index) {\n <div class="inline-flex min-w-0 max-w-full items-center sm:w-auto">\n <input class="h-4 w-4 border-gray-300 text-indigo-600 focus:ring-indigo-600" type="radio"\n [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled" [formControlName]="fd().name" [value]="option.value"\n [attr.tabindex]="fd()?.attr?.readonly ? -1 : null" [name]="fd().name" [id]="fd().name+i" (change)="aifForm().actionChange(fd())">\n <label class="ml-2 block break-words text-sm text-gray-900 dark:text-gray-300 mt-0"\n [style.color]="fd()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [class.text-gray-500]="fd()?.attr?.disabled" [for]="fd().name+i">{{option.description}}</label>\n </div>\n }\n }\n <label\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="aifForm().hasError(fd())"\n [class.dark:text-rose-400]="aifForm().hasError(fd())"\n [class.text-gray-400]="!aifForm().hasError(fd())"\n [class.dark:text-slate-400]="!aifForm().hasError(fd())"\n [class.group-hover:text-indigo-600]="!aifForm().hasError(fd())"\n [class.group-focus-within:text-indigo-600]="!aifForm().hasError(fd())"\n [class.dark:group-hover:text-indigo-400]="!aifForm().hasError(fd())"\n [class.dark:group-focus-within:text-indigo-400]="!aifForm().hasError(fd())">{{ fd().label }}</label>\n</div>\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.RadioControlValueAccessor,selector:"input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]",inputs:["name","formControlName","value"]},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}],changeDetection:i0.ChangeDetectionStrategy.OnPush})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormOptions,decorators:[{type:Component,args:[{selector:"aif-form-options",standalone:!0,imports:[NgClass,ReactiveFormsModule],changeDetection:ChangeDetectionStrategy.OnPush,template:'<div class="group flex w-full flex-wrap items-start gap-x-4 gap-y-2 rounded-md border-0 px-3 pt-3 pb-2 text-gray-900 bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset ring-slate-200 hover:ring-indigo-600/30 group-focus-within:ring-2 group-focus-within:ring-inset group-focus-within:ring-indigo-500 dark:ring-slate-700/50 dark:hover:ring-indigo-400/35 dark:group-focus-within:ring-indigo-400 sm:text-sm sm:leading-6 min-h-[2.625rem] relative mb-5 transition-all"\n [class.opacity-70]="fd()?.attr?.disabled"\n [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n [class.dark:bg-gray-800]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n [class.pointer-events-none]="fd()?.attr?.readonly"\n [ngClass]="aifForm().fieldClass(fd())" [formGroup]="aifForm().form">\n @if(items().length > 0) {\n @for (option of items(); track $index; let i = $index) {\n <div class="inline-flex min-w-0 max-w-full items-center sm:w-auto">\n <input class="h-4 w-4 border-gray-300 text-indigo-600 focus:ring-indigo-600" type="radio"\n [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled" [formControlName]="fd().name" [value]="option.value"\n [attr.tabindex]="fd()?.attr?.readonly ? -1 : null" [name]="fd().name" [id]="fd().name+i" (change)="aifForm().actionChange(fd())">\n <label class="ml-2 block break-words text-sm text-gray-900 dark:text-gray-300 mt-0"\n [style.color]="fd()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [class.text-gray-500]="fd()?.attr?.disabled" [for]="fd().name+i">{{option.description}}</label>\n </div>\n }\n }\n <label\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="aifForm().hasError(fd())"\n [class.dark:text-rose-400]="aifForm().hasError(fd())"\n [class.text-gray-400]="!aifForm().hasError(fd())"\n [class.dark:text-slate-400]="!aifForm().hasError(fd())"\n [class.group-hover:text-indigo-600]="!aifForm().hasError(fd())"\n [class.group-focus-within:text-indigo-600]="!aifForm().hasError(fd())"\n [class.dark:group-hover:text-indigo-400]="!aifForm().hasError(fd())"\n [class.dark:group-focus-within:text-indigo-400]="!aifForm().hasError(fd())">{{ fd().label }}</label>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormSwitch{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);checked=signal(!1,...ngDevMode?[{debugName:"checked"}]:[]);control=computed(()=>{const e=this.fd()?.name,t=this.aifForm()?.form;return e&&t?t.get(e):null},...ngDevMode?[{debugName:"control"}]:[]);isDisabled=computed(()=>!(!this.fd()?.attr?.disabled&&!this.fd()?.attr?.readonly),...ngDevMode?[{debugName:"isDisabled"}]:[]);constructor(){effect(e=>{const t=this.control();if(!t)return void this.checked.set(!1);this.checked.set(!!t.value);const n=t.valueChanges.subscribe(e=>this.checked.set(!!e));e(()=>n.unsubscribe())})}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormSwitch,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifFormSwitch,isStandalone:!0,selector:"aif-form-switch",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="mb-5 flex items-center" [formGroup]="aifForm().form">\n <div class="relative mr-3 inline-flex items-center">\n <input\n class="peer sr-only"\n type="checkbox"\n role="switch"\n [id]="fd().name"\n [formControlName]="fd().name"\n >\n <label\n [for]="fd().name"\n class="relative block h-7 w-12 rounded-full transition-colors duration-200 cursor-pointer"\n [class.bg-slate-300]="!checked()"\n [class.dark:bg-slate-600]="!checked()"\n [class.bg-indigo-600]="checked()"\n [class.dark:bg-indigo-500]="checked()"\n [class.opacity-60]="isDisabled()"\n [class.cursor-not-allowed]="isDisabled()"\n >\n <span\n class="absolute top-0.5 left-0.5 h-6 w-6 rounded-full bg-white shadow-sm ring-1 ring-slate-200 transition-transform duration-200"\n [ngClass]="checked() ? \'translate-x-5\' : \'translate-x-0\'"\n ></span>\n </label>\n </div>\n <label class="text-sm font-medium text-gray-900 dark:text-gray-300" [for]="fd().name">{{ fd().label }}</label>\n</div>\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.CheckboxControlValueAccessor,selector:"input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormSwitch,decorators:[{type:Component,args:[{selector:"aif-form-switch",standalone:!0,imports:[ReactiveFormsModule,NgClass],template:'<div class="mb-5 flex items-center" [formGroup]="aifForm().form">\n <div class="relative mr-3 inline-flex items-center">\n <input\n class="peer sr-only"\n type="checkbox"\n role="switch"\n [id]="fd().name"\n [formControlName]="fd().name"\n >\n <label\n [for]="fd().name"\n class="relative block h-7 w-12 rounded-full transition-colors duration-200 cursor-pointer"\n [class.bg-slate-300]="!checked()"\n [class.dark:bg-slate-600]="!checked()"\n [class.bg-indigo-600]="checked()"\n [class.dark:bg-indigo-500]="checked()"\n [class.opacity-60]="isDisabled()"\n [class.cursor-not-allowed]="isDisabled()"\n >\n <span\n class="absolute top-0.5 left-0.5 h-6 w-6 rounded-full bg-white shadow-sm ring-1 ring-slate-200 transition-transform duration-200"\n [ngClass]="checked() ? \'translate-x-5\' : \'translate-x-0\'"\n ></span>\n </label>\n </div>\n <label class="text-sm font-medium text-gray-900 dark:text-gray-300" [for]="fd().name">{{ fd().label }}</label>\n</div>\n'}]}],ctorParameters:()=>[],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormCheckbox{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormCheckbox,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifFormCheckbox,isStandalone:!0,selector:"aif-form-checkbox",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="mb-5 flex items-center" [formGroup]="aifForm().form">\n <input class="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600" type="checkbox"\n [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled" [attr.tabindex]="fd()?.attr?.readonly ? -1 : null" [formControlName]="fd().name" [id]="fd().name">\n <label class="ml-2 block text-sm text-gray-900 dark:text-gray-300" [style.color]="fd()?.attr?.readonly ? \'rgb(148 163 184)\' : null" [class.text-gray-500]="fd()?.attr?.disabled"\n [for]="fd().name">\n {{ fd().label }}\n </label>\n</div>\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.CheckboxControlValueAccessor,selector:"input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormCheckbox,decorators:[{type:Component,args:[{selector:"aif-form-checkbox",standalone:!0,imports:[ReactiveFormsModule],template:'<div class="mb-5 flex items-center" [formGroup]="aifForm().form">\n <input class="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600" type="checkbox"\n [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled" [attr.tabindex]="fd()?.attr?.readonly ? -1 : null" [formControlName]="fd().name" [id]="fd().name">\n <label class="ml-2 block text-sm text-gray-900 dark:text-gray-300" [style.color]="fd()?.attr?.readonly ? \'rgb(148 163 184)\' : null" [class.text-gray-500]="fd()?.attr?.disabled"\n [for]="fd().name">\n {{ fd().label }}\n </label>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormFile{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);uploadLabel=signal(lang(["form","file.upload"])||"Subir archivo",...ngDevMode?[{debugName:"uploadLabel"}]:[]);fileInputDoc;cdr=inject(ChangeDetectorRef);formatBytes(e,t=2){if(0===e)return"0 Bytes";const n=t<0?0:t,i=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,i)).toFixed(n))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][i]}getIconForExtension(e){const t=e?.toLowerCase()||"";return["pdf","doc","docx","xls","xlsx","ppt","pptx","zip","rar","csv","txt","xml","json"].includes(t)?`aif-${t}-ico`:"aif-file-ico"}getFileIcon(){const e=this.fd();if(e?.attr?.icon)return e.attr.icon;const t=this.aifForm().field[e.name];return t?._file?.extension?"aif text-6xl text-indigo-500 "+this.getIconForExtension(t._file.extension):"aif aif-file-ico text-6xl text-slate-400 group-hover:text-indigo-500 transition-colors"}onFileSelect(e){const t=e.target,n=t.files?.[0]||null,i=this.fd().name,a=this.aifForm().form,s=this.aifForm().field;if(n){s[i]||(s[i]={}),s[i].file=n,s[i].description=n.name;const e=a.get(i);if(e?.setValue(n,{emitEvent:!1}),s[i]._was_required&&e&&(e.removeValidators(Validators.required),e.updateValueAndValidity()),n.type&&n.type.startsWith("image/")){const e=new FileReader;e.onload=e=>{const t=e.target.result;s[i].image=t,s[i]._exists=!0;const o=new Image;o.onload=()=>{const e={name:n.name,size:n.size,size_label:this.formatBytes(n.size),type:n.type,width:o.naturalWidth,height:o.naturalHeight,resolution:`${o.naturalWidth}x${o.naturalHeight}`};s[i].details=e;const t=`_${i}_detail`;a.contains(t)||a.addControl(t,new FormControl("")),a.get(t)?.setValue(JSON.stringify(e)),this.cdr.markForCheck()},o.src=t,this.cdr.markForCheck()},e.readAsDataURL(n)}else{let e=n.name?n.name.split(".").pop()?.toLowerCase():"file";s[i].details={name:n.name,size:n.size,size_label:this.formatBytes(n.size),type:n.type,extension:e},s[i]._file={extension:e,description:n.name},s[i]._exists=!0,this.cdr.markForCheck()}}}onFileRemove(){const e=this.fd().name,t=this.aifForm().form,n=this.aifForm().field,i=t.get(e);i&&i.setValue(null,{emitEvent:!1});const a=`_${e}_detail`;t.contains(a)&&t.get(a)?.setValue(null,{emitEvent:!1}),n[e]&&(n[e].image=null,n[e].file=null,n[e].description=null,n[e].details=null,n[e]._exists=!1,n[e]._file=null,n[e]._was_required&&i&&(i.addValidators(Validators.required),i.updateValueAndValidity())),this.cdr.markForCheck()}onPdfPreview(){const e=this.fd();if(e){let t="";const n=this.aifForm().field[e.name];n?.file?t=URL.createObjectURL(n.file):n?._value&&(t=n._value,t.startsWith("http")||(t=n._value.replace("//","/"),t=env("storage")+t)),t&&window.open(t,"_blank")}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormFile,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormFile,isStandalone:!0,selector:"aif-form-file",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"fileInputDoc",first:!0,predicate:["fileInputDoc"],descendants:!0}],ngImport:i0,template:'<div class="p-4 mb-4 text-sm text-gray-800 rounded-lg bg-gray-50 dark:bg-gray-800 dark:text-gray-300" role="alert"\n [ngClass]="aifForm().fieldClass(fd())" [formGroup]="aifForm().form">\n <div class="flex items-center justify-between">\n <a href="javascript:void(0);" (click)="onPdfPreview()"\n class="text-indigo-600 hover:text-indigo-900">\n Preview\n </a>\n @if (aifForm().field[fd().name]?.image && aifForm().field[fd().name]?.description !=\n aifForm().field[fd().name]?._file?.description) {\n <button type="button"\n class="ml-auto -mx-1.5 -my-1.5 bg-gray-50 text-gray-500 rounded-lg focus:ring-2 focus:ring-gray-400 p-1.5 hover:bg-gray-200 inline-flex"\n aria-label="Close" (click)="onFileRemove()">\n <span class="sr-only">Remove</span>\n <svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">\n <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6" />\n </svg>\n </button>\n }\n </div>\n <div (click)="!fd()?.attr?.readonly && !fd()?.attr?.disabled && fileInputDoc.click()" [class.opacity-50]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n class="flex justify-center items-center mt-2 cursor-pointer border-2 border-dashed border-gray-300 dark:border-gray-600 rounded-md p-4 hover:border-indigo-500 dark:hover:border-indigo-400 group">\n <div class="text-center">\n <input type="file" (change)="onFileSelect($event)" style="display: none" #fileInputDoc\n [disabled]="fd()?.attr?.disabled"\n [id]="fd().name" />\n\n @if (aifForm().field[fd().name]?.image || fd()?.attr?.image) {\n <img class="mx-auto h-12 w-auto object-contain mb-2"\n [src]="aifForm().field[fd().name]?.image || fd()?.attr?.image"\n [alt]="fd().name" />\n } @else {\n <i [class]="getFileIcon() + \' mb-2 block\'"></i>\n }\n\n <p class="mt-1 text-sm text-gray-600">{{aifForm().field[fd().name]?.image ?\n aifForm().field[fd().name]?.description: (fd().label || uploadLabel())}}\n </p>\n </div>\n </div>\n</div>\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormFile,decorators:[{type:Component,args:[{selector:"aif-form-file",standalone:!0,imports:[NgClass,ReactiveFormsModule],template:'<div class="p-4 mb-4 text-sm text-gray-800 rounded-lg bg-gray-50 dark:bg-gray-800 dark:text-gray-300" role="alert"\n [ngClass]="aifForm().fieldClass(fd())" [formGroup]="aifForm().form">\n <div class="flex items-center justify-between">\n <a href="javascript:void(0);" (click)="onPdfPreview()"\n class="text-indigo-600 hover:text-indigo-900">\n Preview\n </a>\n @if (aifForm().field[fd().name]?.image && aifForm().field[fd().name]?.description !=\n aifForm().field[fd().name]?._file?.description) {\n <button type="button"\n class="ml-auto -mx-1.5 -my-1.5 bg-gray-50 text-gray-500 rounded-lg focus:ring-2 focus:ring-gray-400 p-1.5 hover:bg-gray-200 inline-flex"\n aria-label="Close" (click)="onFileRemove()">\n <span class="sr-only">Remove</span>\n <svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">\n <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6" />\n </svg>\n </button>\n }\n </div>\n <div (click)="!fd()?.attr?.readonly && !fd()?.attr?.disabled && fileInputDoc.click()" [class.opacity-50]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n class="flex justify-center items-center mt-2 cursor-pointer border-2 border-dashed border-gray-300 dark:border-gray-600 rounded-md p-4 hover:border-indigo-500 dark:hover:border-indigo-400 group">\n <div class="text-center">\n <input type="file" (change)="onFileSelect($event)" style="display: none" #fileInputDoc\n [disabled]="fd()?.attr?.disabled"\n [id]="fd().name" />\n\n @if (aifForm().field[fd().name]?.image || fd()?.attr?.image) {\n <img class="mx-auto h-12 w-auto object-contain mb-2"\n [src]="aifForm().field[fd().name]?.image || fd()?.attr?.image"\n [alt]="fd().name" />\n } @else {\n <i [class]="getFileIcon() + \' mb-2 block\'"></i>\n }\n\n <p class="mt-1 text-sm text-gray-600">{{aifForm().field[fd().name]?.image ?\n aifForm().field[fd().name]?.description: (fd().label || uploadLabel())}}\n </p>\n </div>\n </div>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}],fileInputDoc:[{type:ViewChild,args:["fileInputDoc"]}]}});class AifFormImage{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);cdr=inject(ChangeDetectorRef);formatBytes(e,t=2){if(0===e)return"0 Bytes";const n=t<0?0:t,i=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,i)).toFixed(n))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][i]}onFileSelect(e){const t=e.target,n=t.files?.[0]||null,i=this.fd().name,a=this.aifForm().form,s=this.aifForm().field;if(n){s[i]||(s[i]={}),s[i].file=n,s[i].description=n.name;const e=a.get(i);if(e?.setValue(n,{emitEvent:!1}),s[i]._was_required&&e&&(e.removeValidators(Validators.required),e.updateValueAndValidity()),"image"===s[i].control_type||n.type&&n.type.startsWith("image/")){const e=new FileReader;e.onload=e=>{const t=e.target.result;s[i].image=t,s[i]._exists=!0;const o=new Image;o.onload=()=>{const e={name:n.name,size:n.size,size_label:this.formatBytes(n.size),type:n.type,width:o.naturalWidth,height:o.naturalHeight,resolution:`${o.naturalWidth}x${o.naturalHeight}`};s[i].details=e;const t=`_${i}_detail`;a.contains(t)||a.addControl(t,new FormControl("")),a.get(t)?.setValue(JSON.stringify(e)),this.cdr.markForCheck()},o.src=t,this.cdr.markForCheck()},e.readAsDataURL(n)}}}onFileRemove(){const e=this.fd().name,t=this.aifForm().form,n=this.aifForm().field,i=t.get(e);i&&i.setValue(null,{emitEvent:!1});const a=`_${e}_detail`;t.contains(a)&&t.get(a)?.setValue(null,{emitEvent:!1}),n[e]&&(n[e].image=null,n[e].file=null,n[e].description=null,n[e].details=null,n[e]._exists=!1,n[e]._file=null,n[e]._was_required&&i&&(i.addValidators(Validators.required),i.updateValueAndValidity())),this.cdr.markForCheck()}onPreviewImage(){const e=this.fd();if(!e?.name)return;const t=this.aifForm().field[e.name];let n="";if(t?.file instanceof File){n=URL.createObjectURL(t.file);const e=window.open(n,"_blank");return void(e?e.addEventListener("beforeunload",()=>URL.revokeObjectURL(n),{once:!0}):URL.revokeObjectURL(n))}"string"==typeof t?.image&&t.image?n=t.image:"string"==typeof t?._value&&t._value&&(n=t._value),n&&window.open(n,"_blank")}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormImage,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormImage,isStandalone:!0,selector:"aif-form-image",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="p-4 mb-4 text-sm rounded-lg bg-slate-50 dark:bg-slate-800/50 border border-slate-200 dark:border-slate-700/50"\n [ngClass]="aifForm().fieldClass(fd())" [formGroup]="aifForm().form">\n \n <input accept="image/*" type="file" (change)="onFileSelect($event)"\n style="display: none" #fileInput [id]="fd().name" />\n\n @if (aifForm().field[fd().name]?.image) {\n <div class="flex items-center gap-4">\n \x3c!-- Thumbnail --\x3e\n <div class="flex-shrink-0">\n <img [src]="aifForm().field[fd().name]?.image" \n class="h-16 w-16 object-cover rounded-lg shadow-sm border border-slate-200 dark:border-slate-700" \n [alt]="fd().name" />\n </div>\n\n \x3c!-- Info --\x3e\n <div class="flex-grow min-w-0">\n <h4 class="text-sm font-semibold text-slate-800 dark:text-slate-100 truncate">\n {{ aifForm().field[fd().name]?.description }}\n </h4>\n <div class="flex flex-wrap gap-x-3 gap-y-1 mt-1 text-xs text-slate-500 dark:text-slate-400">\n <span>{{ aifForm().field[fd().name]?.details?.size_label }}</span>\n <span class="opacity-30">|</span>\n <span>{{ aifForm().field[fd().name]?.details?.type }}</span>\n @if (aifForm().field[fd().name]?.details?.resolution) {\n <span class="opacity-30">|</span>\n <span class="font-mono bg-slate-200/50 dark:bg-slate-700/50 px-1.5 rounded">\n [{{ aifForm().field[fd().name]?.details?.resolution }}]\n </span>\n }\n </div>\n </div>\n\n \x3c!-- Actions --\x3e\n <div class="flex flex-col gap-2">\n @if (!fd()?.attr?.readonly && !fd()?.attr?.disabled) {\n <button type="button" (click)="onFileRemove()"\n class="p-2 text-slate-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-full transition-colors"\n title="Quitar imagen">\n <i class="aif aif-trash-ico text-lg"></i>\n </button>\n }\n <button type="button" (click)="onPreviewImage()"\n class="p-2 text-slate-400 hover:text-indigo-500 hover:bg-indigo-50 dark:hover:bg-indigo-900/20 rounded-full transition-colors"\n title="Ver previsualización"\n aria-label="Ver previsualización">\n <i class="aif aif-zoom-in-ico text-lg"></i>\n </button>\n </div>\n </div>\n } @else {\n \x3c!-- Empty State --\x3e\n <div (click)="!fd()?.attr?.readonly && !fd()?.attr?.disabled && fileInput.click()" [class.opacity-50]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n class="group flex flex-col justify-center items-center py-8 cursor-pointer border-2 border-dashed border-slate-300 dark:border-slate-600 rounded-xl hover:border-indigo-500 dark:hover:border-indigo-400 hover:bg-indigo-50/30 dark:hover:bg-indigo-900/10 transition-all">\n @if (fd()?.attr?.image) {\n <img [src]="fd()?.attr?.image" [alt]="fd().name"\n class="h-16 w-auto object-contain opacity-40 group-hover:opacity-100 transition-opacity" />\n } @else {\n <i [class]="fd()?.attr?.icon || \'aif aif-image-ico text-6xl\'" \n class="text-slate-400 group-hover:text-indigo-500 transition-colors"></i>\n }\n <p class="mt-3 text-xs font-semibold text-slate-500 dark:text-slate-400 uppercase tracking-widest group-hover:text-indigo-600 transition-colors">\n {{ fd().label || fd()?.attr?.placeholder || \'Subir archivo\' }}\n </p>\n </div>\n }\n</div>\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormImage,decorators:[{type:Component,args:[{selector:"aif-form-image",standalone:!0,imports:[NgClass,ReactiveFormsModule],template:'<div class="p-4 mb-4 text-sm rounded-lg bg-slate-50 dark:bg-slate-800/50 border border-slate-200 dark:border-slate-700/50"\n [ngClass]="aifForm().fieldClass(fd())" [formGroup]="aifForm().form">\n \n <input accept="image/*" type="file" (change)="onFileSelect($event)"\n style="display: none" #fileInput [id]="fd().name" />\n\n @if (aifForm().field[fd().name]?.image) {\n <div class="flex items-center gap-4">\n \x3c!-- Thumbnail --\x3e\n <div class="flex-shrink-0">\n <img [src]="aifForm().field[fd().name]?.image" \n class="h-16 w-16 object-cover rounded-lg shadow-sm border border-slate-200 dark:border-slate-700" \n [alt]="fd().name" />\n </div>\n\n \x3c!-- Info --\x3e\n <div class="flex-grow min-w-0">\n <h4 class="text-sm font-semibold text-slate-800 dark:text-slate-100 truncate">\n {{ aifForm().field[fd().name]?.description }}\n </h4>\n <div class="flex flex-wrap gap-x-3 gap-y-1 mt-1 text-xs text-slate-500 dark:text-slate-400">\n <span>{{ aifForm().field[fd().name]?.details?.size_label }}</span>\n <span class="opacity-30">|</span>\n <span>{{ aifForm().field[fd().name]?.details?.type }}</span>\n @if (aifForm().field[fd().name]?.details?.resolution) {\n <span class="opacity-30">|</span>\n <span class="font-mono bg-slate-200/50 dark:bg-slate-700/50 px-1.5 rounded">\n [{{ aifForm().field[fd().name]?.details?.resolution }}]\n </span>\n }\n </div>\n </div>\n\n \x3c!-- Actions --\x3e\n <div class="flex flex-col gap-2">\n @if (!fd()?.attr?.readonly && !fd()?.attr?.disabled) {\n <button type="button" (click)="onFileRemove()"\n class="p-2 text-slate-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-full transition-colors"\n title="Quitar imagen">\n <i class="aif aif-trash-ico text-lg"></i>\n </button>\n }\n <button type="button" (click)="onPreviewImage()"\n class="p-2 text-slate-400 hover:text-indigo-500 hover:bg-indigo-50 dark:hover:bg-indigo-900/20 rounded-full transition-colors"\n title="Ver previsualización"\n aria-label="Ver previsualización">\n <i class="aif aif-zoom-in-ico text-lg"></i>\n </button>\n </div>\n </div>\n } @else {\n \x3c!-- Empty State --\x3e\n <div (click)="!fd()?.attr?.readonly && !fd()?.attr?.disabled && fileInput.click()" [class.opacity-50]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n class="group flex flex-col justify-center items-center py-8 cursor-pointer border-2 border-dashed border-slate-300 dark:border-slate-600 rounded-xl hover:border-indigo-500 dark:hover:border-indigo-400 hover:bg-indigo-50/30 dark:hover:bg-indigo-900/10 transition-all">\n @if (fd()?.attr?.image) {\n <img [src]="fd()?.attr?.image" [alt]="fd().name"\n class="h-16 w-auto object-contain opacity-40 group-hover:opacity-100 transition-opacity" />\n } @else {\n <i [class]="fd()?.attr?.icon || \'aif aif-image-ico text-6xl\'" \n class="text-slate-400 group-hover:text-indigo-500 transition-colors"></i>\n }\n <p class="mt-3 text-xs font-semibold text-slate-500 dark:text-slate-400 uppercase tracking-widest group-hover:text-indigo-600 transition-colors">\n {{ fd().label || fd()?.attr?.placeholder || \'Subir archivo\' }}\n </p>\n </div>\n }\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormSubformEngine{host;constructor(e){this.host=e}subFormDynamicTable(e){const t=this.host.form_data[e.name];return t&&t.tableConfig||{}}subFormDynamicForm(e){const t=this.host.form_data[e.name];return t&&t.showForm&&t.config||{}}buildSubFormFields(e=[],t={}){return(e||[]).map(e=>{const n={};for(const i in e){const a=e[i];Array.isArray(a)?n[i]=a.map((e,n)=>2===n&&Object.prototype.hasOwnProperty.call(t,i)?t[i]:Array.isArray(e)?[...e]:e&&"object"==typeof e?{...e}:e):n[i]=a}return n})}rebuildSubFormTableConfig(e){const t=this.host.form_data[e];if(!t)return;const n=t.table||{},i=(n.navbar||[]).map(t=>({...t,type:"add"===t.type?"button":t.type,click:"function"==typeof t.click?t.click:"add"===t.type?()=>this.openSubForm(e):t.click}));t.tableConfig={header:n.header||{},navbar:i.length>0?{left:i,parent:this.host}:{},columns:n.columns||[],data:t.data||[],emptyMessage:n.emptyMessage||lang(["form","table.no_results"])||"Sin resultados",readonly:t.readonly,disabled:t.disabled,selection:n.selection||null,onSetData:n=>{t.data=n||[],this.host.setValueField(e,t.data),this.host.refreshSubFormView()},onAction:(t,n,i)=>this.onSubFormTableAction(e,t,n,i),onDelete:t=>this.removeSubFormRow(e,t)}}openSubForm(e,t=null,n=null){const i=this.host.form_data[e];if(!i||i.readonly||i.disabled)return;const a=i.table?.valid?.max_columns||i.attr?.max_columns;null===n&&a?.max&&(i.data||[]).length>=a.max||(i.editIndex="number"==typeof n?n:null,i.currentData=t?{...t}:null,i.showForm=!0,this.rebuildSubFormTableConfig(e),this.rebuildSubFormConfig(e),this.host.refreshSubFormView(),this.host.focusSubForm(e))}closeSubForm(e){const t=this.host.form_data[e];t&&(t.editIndex=null,t.currentData=null,t.showForm=!1,t.config={},this.rebuildSubFormTableConfig(e),this.host.refreshSubFormView())}rebuildSubFormConfig(e){const t=this.host.form_data[e];if(!t||!t.showForm)return;const n=null===t.editIndex?"Agregar":"Actualizar",i=t.buttons||{},a=i?.cancel?.action;t.config={fields:this.buildSubFormFields(t.fields||[],t.currentData||{}),readonly:t.readonly,disabled:t.disabled,embedded:!0,btn:{inner:!0,text:i?.save?.label||n},buttons:{...i,save:{...i?.save,label:i?.save?.label||n},cancel:{...i?.cancel,label:i?.cancel?.label||"Cancelar",action:(...t)=>{"function"==typeof a&&a(...t),this.closeSubForm(e)}}},onSubmit:(t,n)=>this.saveSubFormRow(e,t,n)}}onSubFormTableAction(e,t,n,i){"edit"!==t?"delete"!==t?"add"===t&&this.openSubForm(e):this.removeSubFormRow(e,i):this.openSubForm(e,n,i)}removeSubFormRow(e,t){const n=this.host.form_data[e];if(!n)return;const i=[...n.data||[]];i.splice(t,1),n.data=i,this.rebuildSubFormTableConfig(e),this.host.setValueField(e,i),this.host.refreshSubFormView()}loadSubFormData(e,t=[],n={}){const i=this.host.form_data[e];if(!i)return[];const a=Array.isArray(t)?t:[],s=a.map((e,t)=>"function"==typeof i.transformRow?i.transformRow(e,t,a):e).filter(e=>null!=e),o=n.append?[...i.data||[],...s]:s;return i.data=o,i.editIndex=null,i.currentData=null,i.showForm=!1,i.config={},this.rebuildSubFormTableConfig(e),this.host.setValueField(e,o),"function"==typeof i.onLoadData&&i.onLoadData(o,this.host,e),this.host.refreshSubFormView(),o}validateSubFormRow(e,t){const n=this.host.form_data[e];if(!n)return null;const i=(n.data||[]).filter((e,t)=>t!==n.editIndex),a=n.table?.valid?.duplicate||n.attr?.duplicate;if(a?.matches?.length){if(i.some(e=>a.matches.every(n=>{const i=`${e?.[n]??""}`.trim().toLowerCase(),a=`${t?.[n]??""}`.trim().toLowerCase();return i&&a&&i===a})))return a}return"function"==typeof n.validateRow?n.validateRow(t,i,n.editIndex):null}saveSubFormRow(e,t,n){const i=this.host.form_data[e];if(!i)return void n(!1,"No se pudo procesar el registro");const a=this.validateSubFormRow(e,t);if(a)return msg.error(a.title||"Registro duplicado",a.message||"El registro ya existe.",a.close||a.confirm||{text:"Cerrar"}),void n(!1,a.message||"El registro ya existe.");const s=[...i.data||[]],o=null!==i.editIndex&&i.editIndex>=0?i.editIndex:s.length,r="function"==typeof i.transformRow?i.transformRow(t,o,s):t;null!==i.editIndex&&i.editIndex>=0?s[i.editIndex]=r:s.push(r),i.data=s,this.rebuildSubFormTableConfig(e),this.host.setValueField(e,s),this.closeSubForm(e),this.host.refreshSubFormView(),n(!0,"")}}class AifFormActionsEngine{host;constructor(e){this.host=e}actionShowHide(e,t){const n=this.host.getFieldVisibility();if(n[t]!==e&&this.host.setFieldVisibility({...n,[t]:e}),e)return this.host.addControl(t),void(this.host.field[t]&&(this.host.field[t].attr=this.host.field[t].attr||{},this.host.field[t].attr.hidden=!1));this.host.delControl(t),this.host.field[t]&&(this.host.field[t].attr=this.host.field[t].attr||{},this.host.field[t].attr.hidden=!0)}actionReadonly(e,t){this.host.field[t]&&(this.host.field[t].attr=this.host.field[t].attr||{},this.host.field[t].attr.readonly=e)}actionDisabled(e,t){this.host.field[t]&&(this.host.field[t].attr=this.host.field[t].attr||{},this.host.field[t].attr.disabled=e),this.host.form&&this.host.form.contains(t)&&(e?this.host.form.get(t)?.disable({emitEvent:!1}):this.host.form.get(t)?.enable({emitEvent:!1}))}actionRequired(e,t){const n=this.host.form?.get(t);n&&(e?n.addValidators(Validators.required):n.removeValidators(Validators.required),n.updateValueAndValidity({emitEvent:!1}))}assignActions(e){this.host.change_data[e]&&this.setActionChange(e)}setActionChange(e){this.host.form.get(e)?.valueChanges.subscribe(t=>{this.changeRequest(this.host.change_data[e],t)})}changeRequest(e,t){if(null!=t&&""!==t)if("click"===e.type&&e.fn)e.fn(t,this.host);else if("cat"===e.type){const n=e.name,i=e.get,a=e.min;if(a&&"string"==typeof t&&t.length<a)return;let s=i;s=str_replace_field(s?.replace("{id}",t),this.host.field,this.host.form),loading(),rq_req().get(s).then(e=>{loading(!1),this.host.setCatalogEntry(n,e||[])}).catch(e=>{loading(!1),console.error(e)})}}preActions(){this.host.form.valueChanges.subscribe(e=>{this.applyDynamicActions(e)}),setTimeout(()=>this.applyDynamicActions(this.host.form.value));for(const e in this.host.change_data)this.setActionChange(e)}applyDynamicActions(e){for(const t in this.host.actions){const n=this.host.actions[t];if(n.show){const i=this.evalRule(n.show,e);this.actionShowHide(i,t)}if(n.hide){const i=this.evalRule(n.hide,e);this.actionShowHide(!i,t)}if(n.readonly){const i=this.evalRule(n.readonly,e);this.actionReadonly(i,t)}if(n.disabled){const i=this.evalRule(n.disabled,e);this.actionDisabled(i,t)}if(n.required){const i=this.evalRule(n.required,e);this.actionRequired(i,t)}}}evalRule(e,t){return!(!e||"object"!=typeof e)&&Object.keys(e).some(n=>{const i=e[n],a=t[n];return this.host.cmpValues(a,i,n)})}}class AifFormTableEngine{host;constructor(e){this.host=e}setTableData(e={},t=!1,n=!1){e.type=e.type||{},e.type.readonly=!(!e.attr?.readonly&&!t),e.type.disabled=!(!e.attr?.disabled&&!n),e.type.onSetData=t=>this.host.setValueField(e.name,t),this.host.table_data[e.name]={...e.type,data:e.type.data||e.value||[],value:e.value||null}}getTableData(e){return this.host.table_data[e.name]||{}}}class AifFormCatalogEngine{host;constructor(e){this.host=e}reset(){this.host.clearCatalogCache(),this.host.setCatalogState({...this.host._config?.cat||{}})}upCatalog(e={}){const t={...this.host.getCatalogState()||{}};for(const n in e)this.host._config.cat&&(this.host._config.cat[n]=e[n]),t[n]=e[n]||[];this.host.setCatalogState(t)}setCatalogEntry(e,t=[]){this.host._config.cat||(this.host._config.cat={}),this.host._config.cat[e]=t,this.host.updateCatalogState(n=>({...n,[e]:t}))}normalizeCatalogOption(e){if(null==e)return{value:e,description:""};if("object"!=typeof e||Array.isArray(e))return{value:e,description:`${e??""}`};const t=e.value??e.id??e.text??e.description??"",n=e.description??e.text??`${t??""}`;return{...e,value:t,description:n}}catOptions(e){const t=this.host.getCatalogState()?.[e],n=this.host.getCatalogCache();if(!t||0===t.length)return n.has(e)||n.set(e,[]),n.get(e);const i=t.map(e=>this.normalizeCatalogOption(e));return n.set(e,i),i}}function valid_SelectRequired(){return e=>{const t=e.value;return""===t||0===t||"0"===t?{select_required:!0}:null}}function valid_ValuesAllowed(e=[],t,n){return i=>{const a=i.value;if(t){const i="function"==typeof n?n(t):null;if(i&&i.file){const t=i.file?i.file.name:i._value;if(!t)return null;const n=t.split(".").pop().toLowerCase();if(-1===e.indexOf(n)&&-1===e.indexOf("."+n))return{allowed:!0}}}else if(-1===e.indexOf(a))return{allowed:!0};return null}}function valid_MaxSizeFile(e=1,t,n){return i=>{const a="function"==typeof n?n(t):null;if(a&&a.file&&a.file.size){const t=1024*e*1024;if(a.file.size>t)return{max_size:!0}}return null}}function valid_CheckedValidator(e){return!0!==e.value?{check_required:!0}:null}function valid_MinAgeValidator(e){return t=>{const n=new Date,i=new Date(t.value);let a=n.getFullYear()-i.getFullYear();const s=n.getMonth()-i.getMonth();return(s<0||0===s&&n.getDate()<i.getDate())&&a--,a>=e?null:{min_age:{value:t.value}}}}function valid_DistinctValidator(e){return t=>e!==t.value?null:{distinct:{value:t.value}}}function valid_interpretDate(e){const t=new Date;if("now"===e)return t;const n=e.match(/^(-?\d+)([dmy])$/);if(n){const e=parseInt(n[1],10);switch(n[2]){case"d":t.setDate(t.getDate()+e);break;case"m":t.setMonth(t.getMonth()+e);break;case"y":t.setFullYear(t.getFullYear()+e)}return t}return new Date(e)}function valid_DateRangeValidator(e={},t={}){return n=>{const i=new Date(n.value);if(e.min){let a=e.min;if("object"==typeof a&&a.field&&(a=t.getValueField(a.field)),"string"==typeof a){if(i<valid_interpretDate(a))return{date:{value:n.value}}}}if(e.max){let a=e.max;if("object"==typeof a&&a.field&&(a=t.getValueField(a.field)),"string"==typeof a){if(i>valid_interpretDate(a))return{date:{value:n.value}}}}return null}}function valid_interpretTime(e){const t=new Date;if("time"===e)return t;const n=e.match(/^(-?\d+)([hm])$/);if(n){const e=parseInt(n[1],10);switch(n[2]){case"h":t.setHours(t.getHours()+e);break;case"m":t.setMinutes(t.getMinutes()+e)}return t}const i=e.split(":");if(2===i.length)return t.setHours(parseInt(i[0],10),parseInt(i[1],10)),t;throw new Error("Formato de hora inválido")}function valid_createTimeFromDate(e){const t=new Date,n=e.split(":");if(n.length>=2){const e=parseInt(n[0],10),i=parseInt(n[1],10);return t.setHours(e,i,0,0),t}return null}function valid_TimeRangeValidator(e={},t={}){return n=>{if(!n.value)return null;const i=valid_createTimeFromDate(n.value);if(!i)return null;let a=!1;if(e.date){let s=e.date;if("object"==typeof s&&s.field&&s.value){const o=t.getValueField(s.field);if(o){const r=valid_interpretDate(s.value);if(a=0===date_compare(date_local(o),r),a){if(e.date.time&&"object"==typeof e.date.time){let a=e.date.time.min;if("object"==typeof a&&a.field&&(a=t.getValueField(a.field)),"string"==typeof a&&a){if(i<valid_interpretTime(a))return{time_date:{value:n.value}}}}if(e.date.time&&"object"==typeof e.date.time){let a=e.date.time.max;if("object"==typeof a&&a.field&&(a=t.getValueField(a.field)),"string"==typeof a&&a){if(i>valid_interpretTime(a))return{time_date:{value:n.value}}}}}}}}if(e.min){let a=e.min;if("object"==typeof a&&a.field&&(a=t.getValueField(a.field)),"string"==typeof a&&a){if(i<valid_interpretTime(a))return{time:{value:n.value}}}}if(e.max){let a=e.max;if("object"==typeof a&&a.field&&(a=t.getValueField(a.field)),"string"==typeof a&&a){if(i>valid_interpretTime(a))return{time:{value:n.value}}}}return null}}function valid_builds(e={},t,n=null){let i=[];if(e)for(let a in e)if(Object.prototype.hasOwnProperty.call(e,a))switch(a=a.toLowerCase(),a){case"select_required":e[a]&&(i.push(Validators.required),i.push(valid_SelectRequired()));break;case"check_required":i.push(valid_CheckedValidator);break;case"required":e[a]&&i.push(Validators.required);break;case"pattern":i.push(Validators.pattern(e[a]));break;case"email":i.push(Validators.email);break;case"min":i.push(Validators.min(e[a]));break;case"max":i.push(Validators.max(e[a]));break;case"min_length":case"minlength":i.push(Validators.minLength(e[a]));break;case"max_length":case"maxlength":i.push(Validators.maxLength(e[a]));break;case"required_true":i.push(Validators.requiredTrue);break;case"allowed":i.push(valid_ValuesAllowed(e[a],t,n));break;case"max_size":i.push(valid_MaxSizeFile(e[a],t,n));break;case"min_age":i.push(valid_MinAgeValidator(e[a]));break;case"distinct":i.push(valid_DistinctValidator(e[a]));break;case"date":i.push(valid_DateRangeValidator(e[a],n));break;case"time":i.push(valid_TimeRangeValidator(e[a],n))}return i}function valid_messages(e={},t={}){return e.hasError("required")?t.required||lang(["form.valid","input.required"]):e.hasError("select_required")?t.select_required||lang(["form.valid","select.required"]):e.hasError("check_required")?t.check_required||lang(["form.valid","check.required"]):e.hasError("pattern")?t.pattern||lang(["form.valid","input.pattern"]):e.hasError("email")?t.email||lang(["form.valid","input.email"]):e.hasError("min")?t.min||lang(["form.valid","input.min"],{min:e.errors?.min.min}):e.hasError("max")?t.max||lang(["form.valid","input.max"],{max:e.errors?.max.max}):e.hasError("maxlength")?t.maxlength||t.max_length||lang(["form.valid","input.max-length"],{max:e.errors?.maxlength.requiredLength}):e.hasError("minlength")?t.minlength||t.min_length||lang(["form.valid","input.min-length"],{min:e.errors?.minlength.requiredLength}):e.hasError("requiredTrue")?t.required_true||lang(["form.valid","input.required"]):e.hasError("allowed")?t.allowed||lang(["form.valid","input.allowed"]):e.hasError("max_size")?t.max_size||lang(["form.valid","input.max-size"]):e.hasError("min_age")?t.min_age||lang(["form.valid","input.min-age"]):e.hasError("distinct")?t.distinct||lang(["form.valid","input.distinct"]):e.hasError("date")?t.date||lang(["form.valid","input.date"]):e.hasError("time")?t.time||lang(["form.valid","input.time"]):e.hasError("time_date")?t.time_date||lang(["form.valid","input.time-date"]):t.default||lang(["form.valid","input.invalid"])}class AifFormViewEngine{host;constructor(e){this.host=e}hasError(e){const t=this.host.form.get(e.name)?.errors||this.host.field[e.name]?.custom_error;return!(!this.host.submitted()||!t)}fieldClass(e){const t=this.hasError(e);return{"ring-rose-500 dark:ring-rose-500 hover:ring-rose-500 focus:outline-none focus-visible:outline-none focus:ring-2 focus:ring-inset focus:ring-rose-500":t,"ring-slate-200 dark:ring-slate-700/50 hover:ring-indigo-600/30 dark:hover:ring-indigo-400/35 focus:outline-none focus-visible:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500":!t}}isRequired(e){const t=this.host.field[e];if(!t)return!1;const n=t.validations||{};return!!(n.required||n.select_required||n.check_required)}isFieldRequired(e){return this.isRequired(e?.name)}isShow(e){return!1!==this.host.getFieldVisibility()[e]}onClassConfirm(e){return this.host.submitted()&&this.host.form.get(e)?.invalid?"bg-red-50 dark:bg-red-900/20 border border-red-300 dark:border-red-500/50 ring-1 ring-red-400 dark:ring-red-500/50":""}getTagData(e){return e._data}getErrorMessage(e){return this.host.field[e]?.custom_error?.message?this.host.field[e].custom_error.message:valid_messages(this.host.form?.controls?.[e],this.host.field[e]?.validations?.messages)}}class AifFormBuildEngine{host;constructor(e){this.host=e}normalizeSchema(e){if(!e)return[];if(!this.isV2Schema(e))return e;const t=e||{},n=Math.max(1,Number(t?.layout?.columns||1)),i=Array.from({length:n},()=>[]);return(Array.isArray(t?.fieldsets)?t.fieldsets:[]).forEach(e=>{const t=Math.min(n-1,Math.max(0,Number(e?.column||e?.layout?.column||1)-1));i[t].push({label:e?.title||e?.label||"",fields:[this.mapV2Fields(e?.fields||[])]})}),i}isV2Schema(e){return!(!e||Array.isArray(e)||2!==e.schemaVersion&&!Array.isArray(e.fieldsets))}mapV2Fields(e=[]){const t={};return e.forEach(e=>{e?.key&&(t[e.key]=this.mapV2Field(e))}),t}mapV2GroupFields(e=[]){return(e||[]).map(e=>{const t=Array.isArray(e)?e:[e];return[this.mapV2Fields(t)]})}mapV2Field(e){if("tag"===e?.type)return["tag",e?.tagType||"div",e?.defaultValue??"",e?.ui||{}];const t={type:e?.type||"text"},n={...e?.props||{},...e?.attr||{}};Object.keys(n).length>0&&(t.attr=n),e?.dataSource?.get&&(t.get=e.dataSource.get),e?.dataSource?.options&&(t.cat=e.dataSource.options),"group"===e?.type&&(t.fields=this.mapV2GroupFields(e?.fields||[])),"form"===e?.type&&(t.table=e?.table||{},t.buttons=e?.buttons||{},t.fields=e?.fields||[],t.transformRow=e?.transformRow||e?.hooks?.transformRow||null,t.onLoadData=e?.onLoadData||e?.hooks?.onLoadData||null,t.validateRow=e?.validateRow||e?.hooks?.validateRow||null),"table"===e?.type&&(t.data=e?.data,t.columns=e?.columns||[]),e?.hooks?.onChange&&(t.change=[this.getDefaultChangeEvent(e),e.hooks.onChange]);const i=e?.validators||{},a={};return e?.rules?.visibleWhen&&(a.show=e.rules.visibleWhen),e?.rules?.hiddenWhen&&(a.hide=e.rules.hiddenWhen),e?.rules?.requiredWhen&&(a.required=e.rules.requiredWhen),e?.rules?.disabledWhen&&(a.disabled=e.rules.disabledWhen),e?.rules?.readonlyWhen&&(a.readonly=e.rules.readonlyWhen),[1===Object.keys(t).length?t.type:t,e?.label||"",e?.defaultValue??null,i,Object.keys(a).length>0?a:void 0]}getDefaultChangeEvent(e){return["options","switch","checkbox","radio"].includes(e?.type||"text")?"click":"change"}newFieldFile(e){const t=e.value,n=t?t.split("/").pop():"";if(e._exists=!0,e._value=t,"image"==e.control_type)e.image=storage(t),e._image=t;else if("file"==e.control_type){const i=t?t.split(".")?.pop()?.toLowerCase():"";e._file={extension:i,description:n},e.file_url=storage(t)}return e.validations?.required&&(e._was_required=!0,delete e.validations.required),e.description=n,e.value=null,e}newTag(e={}){return[e.label,e.value,e.validations]}newField(e,t){const n="object"==typeof e[0]?e[0]?.type:e[0]||"text",i=void 0!==e[2]?e[2]:null,a=i instanceof Array&&"hidden-text"==n?i[0]:i,s=i instanceof Array&&"hidden-text"==n?i[1]:"";return"object"==typeof e[0]&&e[0].cat&&this.host.setCatalogEntry(t,obj_val_text_cat(e[0].cat)),{name:t,attr:"object"==typeof e[0]?e[0]?.attr:{},control_type:n,type:e[0]||"text",label:e[1]||"",text:s,value:a,validations:e[3]||{}}}isCorrectFormatForm(e){return e instanceof Array&&e.length>0&&e[0]instanceof Array&&e[0].length>0}convertFormat(e){return e=this.normalizeSchema(e),this.isCorrectFormatForm(e)?e:e.map(e=>[{fields:[e]}])}resolveRenderType(e){const t=("object"==typeof e?e?.type:e)||"text";if(["text","password","email","number","search","tel","url","hidden"].indexOf(t)>=0)return"input";return["date","datetime-local","datetime","month","week","time"].indexOf(t)>=0?"date":"options"==t||"radio"==t?"options":"select"==t||"select-multiple"==t?"select":"check"==t||"checkbox"==t?"checkbox":t}resolveGroupFieldset(e){const t=("object"==typeof e.type?e.type:{}).fields??e.attr?.fields??e.value??[];return Array.isArray(t)?t:[]}createProcessedField(e,t,n,i){let a=[],s=this.newField(e,t);if(s.render_type=this.resolveRenderType(s.type),"tag"==s.type)return s._data=this.newTag(s),this.host.field[t]=s,s;if(e[4]&&(e[4]?.cat&&(this.host.setCatalogEntry(t,obj_val_text_cat(e[4].cat)),delete e[4].cat),this.host.actions[t]=e[4]),"group"===s.render_type)return s.group_fields=this.buildFieldLayout(this.resolveGroupFieldset(s),n,i),this.host.field[t]=s,s;"object"==typeof s.type&&(s.type.get&&this.host.getData(s),s.type.change?this.host.setChangeData(s):"form"==s.control_type?this.host.setFormData(s,n.readonly,n.disabled):"table"==s.control_type&&this.host.setTableData(s,n.readonly,n.disabled)),s.attr?.default&&("now"==s.attr.default&&(s.value=s.value||date_now()),"time"==s.attr.default?s.value=s.value||date_time():s.value=s.value||s.attr.default);let o=s.value;return["date","time"].indexOf(s.control_type)>=0?a=valid_builds(s.validations,s.control_type,this.host):["file","image"].indexOf(s.control_type)>=0?(s=o?this.newFieldFile(s):s,o=s.value,a=valid_builds(s.validations,t,this.host.onGetFileByName.bind(this.host))):a=valid_builds(s.validations,s.control_type),["switch","checkbox","options"].indexOf(s.control_type)>=0&&(o=o||null),"select"!==s.control_type||null!=o&&0!==o||(o=""),s.build_validations=a,this.host.field[t]=s,(s.attr?.readonly||n.readonly)&&(s.attr=s.attr||{},s.attr.readonly=!0),(s.attr?.disabled||n.disabled)&&(s.attr=s.attr||{},s.attr.disabled=!0),this.host.field[t]=s,i[this.host.field[t].name]=new FormControl({value:o,disabled:!!s.attr?.disabled},a),s}buildFieldLayout(e,t,n){const i=this.convertFormat(e||[]),a=[];return i.forEach((e,i)=>{a[i]=[],e.forEach((e,s)=>{const o=e&&Array.isArray(e.fields)?e:{label:e?.label||"",fields:[e]};a[i][s]={},o.label&&(a[i][s].label=o.label||""),a[i][s].fields=[],o.fields.forEach((e,o)=>{a[i][s].fields[o]=[];for(const r in e){const l=e[r];if("__config__"==r)continue;const d=this.createProcessedField(l,r,t,n);a[i][s].fields[o].push(d)}})})}),a}newCreateForm(){const e={},t=this.host._config;if(t.fields=this.normalizeSchema(t.fields),!t.fields||!t.fields.length)return this.host.getFormBuilder().group(e);if(t.readonly&&(t.confirm=null),this.host.fieldset=this.convertFormat(t.fields),this.host.col=Math.floor(12/this.host.fieldset.length),this.host.col_span_class=`xl:col-span-${this.host.col} sm:col-span-${this.host.col}`,console.log("xxx: col:",this.host.col),this.host.fields=this.buildFieldLayout(this.host.fieldset,t,e),t.confirm){t.confirm=t.confirm||{},t.confirm.name=t.confirm?.name||"dynamic_confirm";const n=t.confirm.name;this.host.field[n]=this.newField(["switch","",!!t.confirm?.value],n),this.host.form_confirm=new FormControl(this.host.field[n].value,[Validators.requiredTrue]),e[this.host.field[n].name]=this.host.form_confirm}return this.host.getFormBuilder().group(e)}createForm(){const e=this.host._config;if(e.title,e.card&&(this.host.card.card_body_class=e.card_body_class||"p-4"),e.onEmpty=e.onEmpty||function(){return!1},e.onSubmit=e.onSubmit||function(){return!1},e.cat=e.cat||{},this.host.reset={},e.btn&&this.host.btn.update(t=>({...t,...e.btn})),e.reset)for(const t in e.reset)this.host.reset[t]=e.reset[t];return e.num_required&&(this.host.num_required=e.num_required||0),this.newCreateForm()}}class AifFormInteractionEngine{host;constructor(e){this.host=e}getTypeField(e,t){if("object"==typeof e)return this.specialField(t),this.getTypeField(e.type,t);if(["text","password","email","number","search","tel","url","hidden"].indexOf(e)>=0)return"input";return["date","datetime-local","datetime","month","week","time"].indexOf(e)>=0?"date":"options"==e||"radio"==e?"options":"select"==e||"select-multiple"==e?"select":"check"==e||"checkbox"==e?"checkbox":e}specialField(e=""){e.type.get&&this.getData(e),e.type.change&&this.host.setChangeData(e)}getData(e,t=""){if(!this.host.get_data[e.name]){this.host.get_data[e.name]=!0;let n=t||e.type.get;n=str_replace_field(n?.replace("{id}",e.value),this.host.field,this.host.form),loading(),rq_req().get(n).then(t=>{loading(!1),this.host.setCatalogEntry(e.name,t||[])}).catch(e=>{loading(!1),console.error(e)})}}onClear(e){e&&this.host.form?.contains(e)&&(this.host.form.get(e)?.setValue(null),this.host.form.get(e)?.markAsDirty(),this.host.form.get(e)?.markAsTouched())}addControl(e){if(this.host.form&&!this.host.form.contains(e)&&this.host.field[e]){this.host.field[e].deleted=!1;const t=this.host.field[e].build_validations;this.host.form.addControl(e,new FormControl(this.host.field[e].value,t)),this.host.assignActions(e)}}delControl(e,t=!1){this.host.form&&this.host.form.contains(e)&&(this.host.field[e].deleted=t,this.host.form.removeControl(e))}cmpValues(e,t,n=null){return t instanceof Array?t.some(t=>t==e):"object"==typeof t&&(t.text||t.text_chr)?t.text?this.compareSelectText(t.text,e,n):this.compareSelectTextChr(t.text_chr,e,n):e==t}compareSelectText(e,t,n){const i=this.getCatalogLabel(n,t);return!!i&&this.matchCatalogText(i,e,"equals")}compareSelectTextChr(e,t,n){const i=this.getCatalogLabel(n,t);return!!i&&this.matchCatalogText(i,e,"startsWith")}getCatalogLabel(e,t){if(!e)return"string"==typeof t?t:`${t??""}`;const n=this.host.catOptions(e).find(e=>`${e?.value}`==`${t}`);return n?n.description||n.text||`${n.value??""}`:"string"==typeof t?t:`${t??""}`}matchCatalogText(e,t,n){const i=`${e||""}`.trim().toLowerCase();return(Array.isArray(t)?t:[t]).some(e=>{const t=`${e||""}`.trim().toLowerCase();return!!t&&("startsWith"===n?i.startsWith(t):i===t)})}}class AifFormSubmitEngine{host;constructor(e){this.host=e}onSubmit(){if(this.host.submitted.set(!0),this.host.form.invalid)return this.host.form.markAllAsTouched(),!1;const e=()=>{this.host.alert_config.set({show:!1,message:"",type:"warning"}),this.host.sending.set(!0);const e=this.getDataForm();this.postValidSubmit(e).then(e=>{!1!==e?this.sendSubmit(e):this.host.sending.set(!1)})};if(this.host._config.confirm&&this.host._config.confirm.alert){const t={...this.host._config.confirm.alert,message:this.host._config.confirm.alert.message||this.host._config.confirm.message};msg.confirm_message(t).then(t=>{t?e():(this.host.sending.set(!1),this.host.alert_config.set({show:!1,message:"",type:"warning"}))})}else e();return!1}getDataForm(){return this.host.form.value}postValidSubmit(e){return Promise.resolve(e)}sendSubmit(e=null){this.host._config.onSubmit(e,this.host.feedback.bind(this.host),this.host)}onReset(){this.host.submitted.set(!1),this.host.build(this.host._config)}runButtonConfirm(e={},t){e?.message&&(e?.confirm||e?.cancel)?msg.confirm_message({message:e.message,confirm:e.confirm||{text:"Aceptar"},cancel:e.cancel||{text:"Cancelar"}}).then(e=>{e&&t()}):t()}closeForm(){this.host._config?.buttons?.close?.action&&"function"==typeof this.host._config.buttons.close.action&&this.host._config.buttons.close.action(this.host),this.host.closeParentModal("close")||this.host.modal&&"function"==typeof this.host.modal.close&&this.host.modal.close("close")}cancelForm(){const e=this.host._config?.buttons?.cancel||{};this.runButtonConfirm(e,()=>{e.action&&"function"==typeof e.action&&e.action(this.host),this.host._config?.embedded||this.host.closeParentModal("cancel")||this.host.modal&&"function"==typeof this.host.modal.close&&this.host.modal.close("cancel")})}clearForm(){const e=this.host._config?.buttons?.clear||{};this.runButtonConfirm(e,()=>{this.host.submitted.set(!1);const e={};for(const t in this.host.field){const n=this.host.field[t];"hidden"===n.control_type?e[t]=n.value:"select"===n.control_type?e[t]="":"switch"===n.control_type?e[t]=!1:e[t]=null}this.host.form.reset(e)})}}class AifForm{gridSpanClassMap={1:"aif-responsive-span-1",2:"aif-responsive-span-2",3:"aif-responsive-span-3",4:"aif-responsive-span-4",6:"aif-responsive-span-6",12:"aif-responsive-span-12"};config=input({},...ngDevMode?[{debugName:"config"}]:[]);formContainerRef=viewChild("container_form",...ngDevMode?[{debugName:"formContainerRef"}]:[]);fb=inject(FormBuilder);parentModal=inject(AifModal,{optional:!0});cdr=inject(ChangeDetectorRef);gtm_label=signal(lang(["form","gtm.label"],"gtm"),...ngDevMode?[{debugName:"gtm_label"}]:[]);show_form=signal(!1,...ngDevMode?[{debugName:"show_form"}]:[]);submitted=signal(!1,...ngDevMode?[{debugName:"submitted"}]:[]);sending=signal(!1,...ngDevMode?[{debugName:"sending"}]:[]);is_alert=signal(!1,...ngDevMode?[{debugName:"is_alert"}]:[]);field_visibility=signal({},...ngDevMode?[{debugName:"field_visibility"}]:[]);form;fields=[];field={};btn=signal({text:lang(["form","btn.ok"]),class:"btn-primary"},...ngDevMode?[{debugName:"btn"}]:[]);reset={};alert_config=signal({message:"",show:!1,type:"warning"},...ngDevMode?[{debugName:"alert_config"}]:[]);col=1;col_span_class="xl:col-span-12 sm:col-span-12";card={card_body_class:"p-4"};fieldset=[];actions={};get_data={};change_data={};actions_data={};form_data={};table_data={};css_style="";modal=null;num_required=0;form_confirm=null;_value={};_config={};catalogs=signal({},...ngDevMode?[{debugName:"catalogs"}]:[]);_catCache=new Map;catalogEngine=new AifFormCatalogEngine(this);actionsEngine=new AifFormActionsEngine(this);subformEngine=new AifFormSubformEngine(this);tableEngine=new AifFormTableEngine(this);viewEngine=new AifFormViewEngine(this);buildEngine=new AifFormBuildEngine(this);interactionEngine=new AifFormInteractionEngine(this);submitEngine=new AifFormSubmitEngine(this);constructor(){effect(()=>{const e=this.config();if(e&&(0==this.fields.length||e!==this._config)){if("form-slim"==e)return;this.build(e)}})}get f(){return this.form?this.form.controls:{}}ngOnInit(){this.createFunctions()}getFormBuilder(){return this.fb}closeParentModal(e){return!!this.parentModal&&(this.parentModal._close(e),!0)}getCatalogState(){return this.catalogs()}setCatalogState(e){this.catalogs.set(e)}updateCatalogState(e){this.catalogs.update(e)}getCatalogCache(){return this._catCache}clearCatalogCache(){this._catCache.clear()}upCatalog=(e={})=>{console.log("xx: AifForm: upCatalog: cat",e),this.catalogEngine.upCatalog(e)};update(e,t){if("cat"===e)this.upCatalog(t)}setCatalogEntry(e,t=[]){this.catalogEngine.setCatalogEntry(e,t)}getFieldVisibility(){return this.field_visibility()}setFieldVisibility(e){this.field_visibility.set(e)}hide(){this.show_form.set(!1)}build(e={},t=null){console.log("xx: AifForm: build: cfg",e),this.show_form.set(!1),this._config=e||{},this._config.fields=this.buildEngine.normalizeSchema(this._config.fields),this.catalogEngine.reset(),this.actions={},this.get_data={},this.change_data={},this.actions_data={},this.form_data={},this.table_data={},this.actions_data={},this.css_style=this._config.style||"",this._config.fields_hidden=this._config.fields_hidden||!1,this._config.confirm=this._config.confirm||null,this.btn.set({text:lang(["form","btn.ok"]),class:"btn-primary"}),this.submitted.set(!1),this.alert_config.set({show:!1,message:"",type:"warning"}),this.sending.set(!1),this.field_visibility.set({}),this.form=this.createForm(),this.show_form.set(!!(this._config.fields&&this._config.fields instanceof Array&&this._config.fields.length>0&&this.form)),this.preActions(),this.createFunctions(),this._config.post_build&&"function"==typeof this._config.post_build&&setTimeout(()=>this._config.post_build(this),300),t&&(this.modal=t,this.modal.open())}feedback(e,t){if(console.log("xx: AifForm: feedback: resolve",e),this.is_alert.set(!1),e){if(this.sending.set(!1),this._config?.embedded)return;this.closeForm()}else this.sending.set(!1),this.is_alert.set(!0),t&&this.alert_config.set({show:!0,type:"warning",message:t})}createFunctions(){const e=this._config;e&&(e.onContext=e.onContext||(()=>{}),e.build=(e={})=>this.build(e),e.update=(e,t)=>this.update(e,t),e.feedback=(e,t)=>this.feedback(e,t),e.runReset=()=>this.onReset(),e.runSubmit=()=>this.onSubmit(),e.getContext=()=>this,e.onContext(this))}setChangeData(e){Array.isArray(e.type.change)?this.change_data[e.name]={type:e.type.change[0],name:"string"==typeof e.type.change[1]?e.type.change[1]:"",fn:"function"==typeof e.type.change[1]?e.type.change[1]:null,get:e.type.change[2]||0,min:e.type.change[3]||0}:this.change_data[e.name]=e.type.change}setFormData(e={},t=!1,n=!1){e.type=e.type||{},e.type.readonly=!(!e.attr?.readonly&&!t),e.type.disabled=!(!e.attr?.disabled&&!n),this.form_data[e.name]={...e.type,data:[...e.value||e.type.table?.data||[]],editIndex:null,currentData:null,showForm:!(e.value&&e.value.length>0),config:{},tableConfig:{}},this.subformEngine.rebuildSubFormTableConfig(e.name)}setTableData(e={},t=!1,n=!1){this.tableEngine.setTableData(e,t,n)}newCreateForm(){return this.buildEngine.newCreateForm()}createForm(){return this.buildEngine.createForm()}fieldReload(e){"function"==typeof e.attr.reload&&e.attr.reload(e,this)}hasError(e){return this.viewEngine.hasError(e)}fieldClass(e){return this.viewEngine.fieldClass(e)}getOuterColumnClass(){return this.gridSpanClassMap[this.col]||"aif-responsive-span-12"}getInnerColumnClass(e){const t=e>0?Math.floor(12/e):12;return this.gridSpanClassMap[t]||"aif-responsive-span-12"}getTypeField(e,t){return this.interactionEngine.getTypeField(e,t)}specialField(e=""){this.interactionEngine.specialField(e)}setValueField(e,t){this.form&&this.form.contains(e)&&(this.form.get(e)?.setValue(t),this.field[e]&&(this.field[e].value=t))}getValueField(e){return this.form&&this.form.contains(e)?this.form.get(e)?.value:null}showFields(...e){e.forEach(e=>this.actionShowHide(!0,e))}hideFields(...e){e.forEach(e=>this.actionShowHide(!1,e))}setCat(e,t){this.setCatalogEntry(e,t||[])}getRequest(e){return rq_req().get(e)}updValidity(e){this.form.get(e)?.updateValueAndValidity()}setErrorField(e,t){const n=this.form.get(e);this.field[e]&&(this.field[e].custom_error={message:t}),n?.setErrors({custom:!0}),n?.markAsTouched()}getData(e,t=""){this.interactionEngine.getData(e,t)}onGetFileByName(e){return""}addControl(e){this.interactionEngine.addControl(e)}delControl(e,t=!1){this.interactionEngine.delControl(e,t)}cmpValues(e,t,n=null){return this.interactionEngine.cmpValues(e,t,n)}actionShowHide(e,t){this.actionsEngine.actionShowHide(e,t)}actionReadonly(e,t){this.actionsEngine.actionReadonly(e,t)}actionDisabled(e,t){this.actionsEngine.actionDisabled(e,t)}actionRequired(e,t){this.actionsEngine.actionRequired(e,t)}assignActions(e){this.actionsEngine.assignActions(e)}setActionChange(e){this.actionsEngine.setActionChange(e)}changeRequest(e,t){this.actionsEngine.changeRequest(e,t)}preActions(){this.actionsEngine.preActions()}applyDynamicActions(e){this.actionsEngine.applyDynamicActions(e)}evalRule(e,t){return this.actionsEngine.evalRule(e,t)}actionChange(e){}onSearch(e,t){}onClear(e){this.interactionEngine.onClear(e)}onSubmit(){return this.submitEngine.onSubmit()}getDataForm(){return this.form.value}postValidSubmit(e){return Promise.resolve(e)}onReset(){this.submitEngine.onReset()}runButtonConfirm(e={},t){this.submitEngine.runButtonConfirm(e,t)}closeForm(){this.submitEngine.closeForm()}cancelForm(){this.submitEngine.cancelForm()}clearForm(){this.submitEngine.clearForm()}isCatOptions(e){const t=this.catalogs();return!!t&&!!t[e]}catOptions(e){return this.catalogEngine.catOptions(e)}isRequired(e){return this.viewEngine.isRequired(e)}isFieldRequired(e){return this.viewEngine.isFieldRequired(e)}isShow(e){return this.viewEngine.isShow(e)}isShowButton(){return!1}onClassConfirm(e){return this.viewEngine.onClassConfirm(e)}getTagData(e){return this.viewEngine.getTagData(e)}getSubFormData(e){return this.form_data[e.name]?.config||{}}getSubFormTableData(e){return this.form_data[e.name]?.tableConfig||{}}getTableData(e){return this.tableEngine.getTableData(e)}refreshSubFormView(){this.cdr.markForCheck(),this.cdr.detectChanges()}focusSubForm(e){setTimeout(()=>{const t=this.formContainerRef()?.nativeElement;if(!t)return;const n=t.querySelector(`[data-subform-name="${e}"]`);if(!(n instanceof HTMLElement))return;n.scrollIntoView({behavior:"smooth",block:"center"});const i=n.querySelector('input:not([type="hidden"]):not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])');i instanceof HTMLElement&&i.focus()},80)}openSubForm(e,t=null,n=null){this.subformEngine.openSubForm(e,t,n)}closeSubForm(e){this.subformEngine.closeSubForm(e)}rebuildSubFormConfig(e){this.subformEngine.rebuildSubFormConfig(e)}rebuildSubFormTable(e){this.subformEngine.rebuildSubFormTableConfig(e)}loadSubFormData(e,t=[],n={}){return this.subformEngine.loadSubFormData(e,t,n)}onSubFormTableAction(e,t,n,i){this.subformEngine.onSubFormTableAction(e,t,n,i)}removeSubFormRow(e,t){this.subformEngine.removeSubFormRow(e,t)}validateSubFormRow(e,t){return this.subformEngine.validateSubFormRow(e,t)}saveSubFormRow(e,t,n){this.subformEngine.saveSubFormRow(e,t,n)}getErrorMessage(e,t){return this.viewEngine.getErrorMessage(e)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifForm,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifForm,isStandalone:!0,selector:"aif-form",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"formContainerRef",first:!0,predicate:["container_form"],descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (show_form() && form) {\n<div [formGroup]="form">\n@if (_config?.embedded) {\n<div class="aif-form" #container_form [class]="css_style" [style]="_config?.style || \'\'">\n <ng-container *ngTemplateOutlet="formContent"></ng-container>\n</div>\n} @else {\n<form class="aif-form" #container_form [class]="css_style" [style]="_config?.style || \'\'"\n (ngSubmit)="onSubmit()">\n <ng-container *ngTemplateOutlet="formContent"></ng-container>\n</form>\n}\n<ng-template #formContent>\n <div class="grid grid-cols-12 gap-4">\n <div class="col-span-12">\n <aif-alert [config]="alert_config()"></aif-alert>\n </div>\n @for (cols of fields; track $index) {\n <div class="col-span-12" [ngClass]="getOuterColumnClass()" [class.hidden]="_config?.fields_hidden || false"\n [class.block]="_config?.fields_hidden ? false : true">\n @for (fds of cols; track $index; let ix = $index) {\n <div class="border-0 shadow-none bg-transparent" [class]="css_style">\n <div class="p-0">\n <div class="flex items-start">\n <div class="flex-grow">\n @if (fds.label) {\n <div class="mediaFieldset">\n <fieldset class="rounded-lg border border-slate-200/80 bg-white/30 p-3 dark:border-slate-700/60 dark:bg-slate-900/10">\n <legend class="float-none w-auto px-2 text-sm font-medium text-slate-700 dark:text-slate-300">{{fds.label}}\n </legend>\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: fds.fields, showInnerButtons: true }"></ng-container>\n </fieldset>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: fds.fields, showInnerButtons: true }"></ng-container>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n <ng-template #blockFields let-fdd="fdd" let-showInnerButtons="showInnerButtons">\n <div class="grid grid-cols-12 gap-4">\n @for (dd of fdd; track $index; let cc = $index) {\n <div class="col-span-12" [ngClass]="getInnerColumnClass(fdd.length)">\n @for (fd of dd; track fd.name || $index) {\n @if (fd.control_type == \'hidden\') {\n <input type="hidden" [name]="fd.name" [formControlName]="fd.name">\n } @else if (isShow(fd.name)) {\n <div class="relative mb-4 rounded-lg transition-all"\n [class.pl-2]="hasError(fd)"\n [class.border-l-2]="hasError(fd)"\n [class.border-rose-500]="hasError(fd)">\n\n @switch (fd.render_type || getTypeField(fd.type, fd)) {\n @case (\'hidden-text\') {\n <aif-form-hidden-text [fd]="fd" [aifForm]="this"></aif-form-hidden-text>\n }\n @case (\'input\') {\n <aif-form-input [fd]="fd" [aifForm]="this"></aif-form-input>\n }\n @case (\'select\') {\n <aif-form-select [fd]="fd" [aifForm]="this"></aif-form-select>\n }\n @case (\'ng-select\') {\n <aif-form-ng-select [fd]="fd" [aifForm]="this"></aif-form-ng-select>\n }\n @case (\'textarea\') {\n <aif-form-textarea [fd]="fd" [aifForm]="this"></aif-form-textarea>\n }\n @case (\'date\') {\n <aif-form-date [fd]="fd" [aifForm]="this"></aif-form-date>\n }\n @case (\'options\') {\n <aif-form-options [fd]="fd" [aifForm]="this"></aif-form-options>\n }\n @case (\'switch\') {\n <aif-form-switch [fd]="fd" [aifForm]="this"></aif-form-switch>\n }\n @case (\'checkbox\') {\n <aif-form-checkbox [fd]="fd" [aifForm]="this"></aif-form-checkbox>\n }\n @case (\'file\') {\n <aif-form-file [fd]="fd" [aifForm]="this"></aif-form-file>\n }\n @case (\'image\') {\n <aif-form-image [fd]="fd" [aifForm]="this"></aif-form-image>\n }\n @case (\'group\') {\n <div class="mb-4 rounded-xl border border-slate-200/80 bg-slate-50/60 p-4 shadow-sm dark:border-slate-700/60 dark:bg-slate-900/20">\n @if (fd.label) {\n <div class="mb-3 text-sm font-semibold text-slate-700 dark:text-slate-200">\n {{ fd.label }}\n </div>\n }\n @if (fd.group_fields?.length) {\n <ng-container *ngTemplateOutlet="blockGroups; context: { gdd: fd.group_fields }"></ng-container>\n }\n </div>\n }\n @case (\'tag\') {\n <aif-form-tag [item]="getTagData(fd)"></aif-form-tag>\n }\n @case (\'form\') {\n <div [class.opacity-50]="fd?.attr?.readonly || fd?.attr?.disabled" class="mb-4" [ngClass]="fieldClass(fd)">\n @if (getSubFormData(fd); as subFormCfg) {\n <aif-form-sub [config]="subFormCfg" [attr.data-subform-name]="fd.name">\n <aif-form-table [config]="getSubFormTableData(fd)"></aif-form-table>\n @if (subFormCfg?.fields?.length) {\n <div class="mt-4 rounded-xl border border-slate-200/80 bg-white/80 p-4 shadow-sm dark:border-slate-700/60 dark:bg-slate-950/35">\n <aif-form [config]="subFormCfg"></aif-form>\n </div>\n }\n </aif-form-sub>\n }\n </div>\n @if (isRequired(fd.name)) {\n <div class="absolute top-0 right-0">\n <i class="text-red-500">*</i>\n </div>\n }\n }\n @case (\'table\') {\n <div [class.opacity-50]="fd?.attr?.readonly || fd?.attr?.disabled" class="mb-4" [ngClass]="fieldClass(fd)">\n <aif-form-data-table [config]="getTableData(fd)"></aif-form-data-table>\n </div>\n }\n }\n\n @if (hasError(fd)) {\n <div class="flex items-center gap-1.5 mt-1 px-1 text-xs text-rose-400 dark:text-rose-400/90">\n <svg class="w-3 h-3 shrink-0" viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.345 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>\n </svg>\n <span>{{ getErrorMessage(fd.name, fd.label) }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n }\n @if (showInnerButtons && btn().inner) {\n <div class="col-span-12 flex gap-2 justify-center">\n <aif-alert [config]="alert_config()"></aif-alert>\n @if (!sending() && (_config?.buttons?.cancel)) {\n <button type="button"\n class="btn bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-md shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="cancelForm()">{{\n _config.buttons.cancel.label || \'Cancelar\'}}</button>\n }\n @if (!sending() && (_config?.buttons?.clear)) {\n <button type="button"\n class="btn bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-md shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="clearForm()">{{\n _config.buttons.clear.label || \'Limpiar\'}}</button>\n }\n @if (!sending()) {\n <button type="button"\n (click)="onSubmit()"\n class="btn bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-md shadow-sm">\n @if (btn().icon) { <i class="{{btn().icon}} mr-2"></i> }\n {{ btn().text}}\n </button>\n }\n @if (sending()) {\n \x3c!-- Spinner --\x3e\n <div class="animate-spin rounded-full h-5 w-5 border-b-2 border-indigo-600"></div>\n }\n </div>\n }\n </div>\n </ng-template>\n\n <ng-template #blockGroups let-gdd="gdd">\n <div class="grid grid-cols-12 gap-4">\n @for (groupCols of gdd; track $index) {\n <div class="col-span-12" [ngClass]="getInnerColumnClass(gdd.length)">\n @for (groupFieldset of groupCols; track $index) {\n @if (groupFieldset.label) {\n <fieldset class="mb-4 rounded-lg border border-slate-200/80 p-3 dark:border-slate-700/60">\n <legend class="px-1 text-sm font-medium text-slate-700 dark:text-slate-200">\n {{ groupFieldset.label }}\n </legend>\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: groupFieldset.fields, showInnerButtons: false }"></ng-container>\n </fieldset>\n } @else {\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: groupFieldset.fields, showInnerButtons: false }"></ng-container>\n }\n }\n </div>\n }\n </div>\n </ng-template>\n\n @if (form_confirm && _config?.confirm) {\n <div class="col-span-12 text-center mt-4">\n <div class="p-4 rounded-md" [ngClass]="onClassConfirm(_config.confirm.name)">\n <div class="flex items-center justify-center">\n <input class="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600 mr-2"\n [formControlName]="_config.confirm.name" type="checkbox" role="switch" [id]="_config.confirm.name">\n <label class="text-sm font-medium text-gray-900 dark:text-gray-300 cursor-pointer" [for]="_config.confirm.name">\n {{ _config.confirm.message }}\n </label>\n </div>\n </div>\n </div>\n }\n\n @if (!btn().hide && !btn().inner && !_config?.readonly) {\n <div class="col-span-12 border-t border-slate-200 dark:border-slate-800/80 mt-8 pt-6 text-center">\n <div class="flex justify-center gap-2">\n @if (reset?.btn && !sending()) {\n <button type="button" class="px-4 py-2 rounded-md text-sm font-medium {{reset?.btn?.class}}"\n (click)="onReset()">\n @if (btn().icon) { <i class="{{btn().icon}} mr-2"></i> }\n {{ reset?.btn?.text}}\n </button>\n }\n @if (!sending() && (_config?.buttons?.cancel)) {\n <button type="button"\n class="px-4 py-2 rounded-md text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="cancelForm()">{{\n _config.buttons.cancel.label || \'Cancelar\'}}</button>\n }\n @if (!sending() && (_config?.buttons && _config?.buttons?.clear)) {\n <button type="button"\n class="px-4 py-2 rounded-md text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="clearForm()">{{\n _config.buttons.clear.label || \'Limpiar\'}}</button>\n }\n @if (!sending()) {\n <button type="button"\n (click)="onSubmit()"\n class="px-4 py-2 rounded-md text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 shadow-sm transition-all {{btn().class}}">\n @if (btn().icon) { <i class="{{btn().icon}} mr-2"></i> }\n {{ _config?.buttons?.save?.label || btn().text}}\n </button>\n }\n @if (sending()) {\n <div class="animate-spin rounded-full h-5 w-5 border-b-2 border-indigo-600"></div>\n }\n </div>\n </div>\n }\n @if (isShowButton()) {\n <div class="col-span-12 border-t border-slate-200 dark:border-slate-800/80 mt-8 pt-6 text-center">\n <button type="button"\n class="px-4 py-2 rounded-md text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="closeForm()">{{\n _config.buttons?.close?.label || \'Cerrar vista\'}}</button>\n </div>\n }\n </div>\n</ng-template>\n</div>\n}\n',styles:[".aif-responsive-span-12{grid-column:span 12 / span 12}@media(min-width:640px){.aif-responsive-span-6{grid-column:span 6 / span 6}.aif-responsive-span-4{grid-column:span 4 / span 4}.aif-responsive-span-3{grid-column:span 3 / span 3}.aif-responsive-span-2{grid-column:span 2 / span 2}.aif-responsive-span-1{grid-column:span 1 / span 1}}\n"],dependencies:[{kind:"component",type:AifForm,selector:"aif-form",inputs:["config"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.ɵNgNoValidate,selector:"form:not([ngNoForm]):not([ngNativeValidate])"},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.CheckboxControlValueAccessor,selector:"input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:NgTemplateOutlet,selector:"[ngTemplateOutlet]",inputs:["ngTemplateOutletContext","ngTemplateOutlet","ngTemplateOutletInjector"]},{kind:"ngmodule",type:NgSelectModule},{kind:"component",type:AifFormTag,selector:"aif-form-tag",inputs:["item"]},{kind:"component",type:AifFormSub,selector:"aif-form-sub",inputs:["config"]},{kind:"component",type:AifFormDataTable,selector:"aif-form-data-table",inputs:["config"]},{kind:"component",type:AifFormTable,selector:"aif-form-table",inputs:["config"]},{kind:"component",type:AifAlert,selector:"aif-alert",inputs:["config"]},{kind:"component",type:AifFormHiddenText,selector:"aif-form-hidden-text",inputs:["fd","aifForm"]},{kind:"component",type:AifFormInput,selector:"aif-form-input",inputs:["fd","aifForm"]},{kind:"component",type:AifFormSelect,selector:"aif-form-select",inputs:["fd","aifForm"]},{kind:"component",type:AifFormNgSelect,selector:"aif-form-ng-select",inputs:["fd","aifForm"]},{kind:"component",type:AifFormTextarea,selector:"aif-form-textarea",inputs:["fd","aifForm"]},{kind:"component",type:AifFormDate,selector:"aif-form-date",inputs:["fd","aifForm"]},{kind:"component",type:AifFormOptions,selector:"aif-form-options",inputs:["fd","aifForm"]},{kind:"component",type:AifFormSwitch,selector:"aif-form-switch",inputs:["fd","aifForm"]},{kind:"component",type:AifFormCheckbox,selector:"aif-form-checkbox",inputs:["fd","aifForm"]},{kind:"component",type:AifFormFile,selector:"aif-form-file",inputs:["fd","aifForm"]},{kind:"component",type:AifFormImage,selector:"aif-form-image",inputs:["fd","aifForm"]}]})}function form_prebuild(e,t={},n=null){return new Promise(async(i,a)=>{e.cfg={...e.cfg,...t.form||t||{}},e.cfg.type=e.cfg.type||"add";let s={...e.model,...e.cfg},o=e.cat||{};o={...o,...t.cat||{}},console.log("xx: cat",o),e.cfg.lang&&await lang_load(e.cfg.lang);const r=t.onSubmit||e.onSubmit,l=t.validate||e.validate,d=t.preData||e.preData,c=t.postBuild||e.postBuild,g=t.postData||e.postData,m=t.onFailed||e.onFailed,u=t.send_url||e.urls.send,p=t.data_url||e.urls.data,f=t.valid_url||e.urls.valid,h=t.cat_url||e.urls.cat,b=t.setButtons||e.setButtons,v=t.setMessages||e.setMessages,x=t.setConfirm||e.setConfirm;t.fields||e.fields;let y=t.fields||e.cfg.fields||e.fields;y="string"==typeof y?e[y]:y;const k=await fx_resolve(d,[],e);if(k&&(s={...s,...k}),p)try{const t=await wGet(str_replace_vars(p,s));if(!t||!t.data)return msg.warning(lang("error"),lang("error.data.url",{url:p}));{const n=await fx_resolve(d,[t.data],e)||t.data;s={...s,...n}}}catch(e){return msg.warning(lang("error"),lang("error.get.url",{url:p}))}if(f)try{const t=await wGet(str_replace_vars(f,s));if(t._error_message)return msg.warning(e.modal?.title||lang("warnnig"),t._error_message)}catch(e){return msg.warning(lang("error"),lang("error.get.url",{url:f}))}if(h)try{const e=await wGet(str_replace_vars(h,s));o={...o,...e.data||e||{}}}catch(e){return msg.warning(lang("error"),lang("error.get.url",{url:h}))}if(!u)return msg.warning(lang("error"),lang("error.form.url"));const w=str_replace_vars(u,{...s,action:e.cfg.action||"save"}),C=await fx_resolve(y,[t],e),D=await fx_resolve(v,[e.cfg],e)||{};i({step:e.cfg.step||!1,size:e.modal.size,title:str_replace_vars(e.modal.title,s),config:{rebuild:e.cfg.rebuild||!1,cat:o,result_type:e.cfg.result_type||t.result_type||"none",post_build:c,buttons:await fx_resolve(b,[e.cfg],e),confirm:await fx_resolve(x,[e.cfg],e),messages:{...D},readonly:!!e.cfg.readonly,step:e.cfg.step,listen:e.cfg.listen||!0,onSubmit:r||(async(t,i,a=null)=>{const s=t.files||{};let o=t.fields||t;if(l){const t=await fx_resolve(l,[o,a],e);if(!0!==t)return void i(!1,t)}loading(),g&&(o=await fx_resolve(g,[o,a],e));const r=D.error||{};D.error={title:r.title||lang(["alert","submit.fail.title"]),message:r.message||lang(["alert","submit.fail.message"],{err:t.message||""}),confirm:{text:r.confirm?.text||lang(["form","btn.ok"]),color:r.confirm?.color||"red"}},rq_req().post(w,o,s).then(async t=>{!0===t.success?(loading_close(i,!!t.success),await fx_resolve(n,[t,i])):(msg.error(D.error.title,D.error.message,D.error.confirm),await fx_resolve(m,[t,a,i],e),await fx_resolve(n,[null,i]),loading_close(i))}).catch(e=>{msg.error(D.error.title,D.error.message,D.error.confirm),loading_close(i)})}),fields:C}})})}function menu_option(e,t,n){return{title:e,icon:t,click:n}}function menu_divider(){return{divider:!0}}function menu_edit(e,t){return menu_option(e,"aif aif-edit-ico",(e,n)=>t("edit",n))}function menu_delete(e,t){return menu_option(e,"aif aif-trash-ico",(e,n)=>t("delete",n))}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifForm,decorators:[{type:Component,args:[{selector:"aif-form",standalone:!0,imports:[ReactiveFormsModule,NgClass,NgTemplateOutlet,NgSelectModule,AifFormTag,AifFormSub,AifFormDataTable,AifFormTable,AifAlert,AifFormHiddenText,AifFormInput,AifFormSelect,AifFormNgSelect,AifFormTextarea,AifFormDate,AifFormOptions,AifFormSwitch,AifFormCheckbox,AifFormFile,AifFormImage],template:'@if (show_form() && form) {\n<div [formGroup]="form">\n@if (_config?.embedded) {\n<div class="aif-form" #container_form [class]="css_style" [style]="_config?.style || \'\'">\n <ng-container *ngTemplateOutlet="formContent"></ng-container>\n</div>\n} @else {\n<form class="aif-form" #container_form [class]="css_style" [style]="_config?.style || \'\'"\n (ngSubmit)="onSubmit()">\n <ng-container *ngTemplateOutlet="formContent"></ng-container>\n</form>\n}\n<ng-template #formContent>\n <div class="grid grid-cols-12 gap-4">\n <div class="col-span-12">\n <aif-alert [config]="alert_config()"></aif-alert>\n </div>\n @for (cols of fields; track $index) {\n <div class="col-span-12" [ngClass]="getOuterColumnClass()" [class.hidden]="_config?.fields_hidden || false"\n [class.block]="_config?.fields_hidden ? false : true">\n @for (fds of cols; track $index; let ix = $index) {\n <div class="border-0 shadow-none bg-transparent" [class]="css_style">\n <div class="p-0">\n <div class="flex items-start">\n <div class="flex-grow">\n @if (fds.label) {\n <div class="mediaFieldset">\n <fieldset class="rounded-lg border border-slate-200/80 bg-white/30 p-3 dark:border-slate-700/60 dark:bg-slate-900/10">\n <legend class="float-none w-auto px-2 text-sm font-medium text-slate-700 dark:text-slate-300">{{fds.label}}\n </legend>\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: fds.fields, showInnerButtons: true }"></ng-container>\n </fieldset>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: fds.fields, showInnerButtons: true }"></ng-container>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n <ng-template #blockFields let-fdd="fdd" let-showInnerButtons="showInnerButtons">\n <div class="grid grid-cols-12 gap-4">\n @for (dd of fdd; track $index; let cc = $index) {\n <div class="col-span-12" [ngClass]="getInnerColumnClass(fdd.length)">\n @for (fd of dd; track fd.name || $index) {\n @if (fd.control_type == \'hidden\') {\n <input type="hidden" [name]="fd.name" [formControlName]="fd.name">\n } @else if (isShow(fd.name)) {\n <div class="relative mb-4 rounded-lg transition-all"\n [class.pl-2]="hasError(fd)"\n [class.border-l-2]="hasError(fd)"\n [class.border-rose-500]="hasError(fd)">\n\n @switch (fd.render_type || getTypeField(fd.type, fd)) {\n @case (\'hidden-text\') {\n <aif-form-hidden-text [fd]="fd" [aifForm]="this"></aif-form-hidden-text>\n }\n @case (\'input\') {\n <aif-form-input [fd]="fd" [aifForm]="this"></aif-form-input>\n }\n @case (\'select\') {\n <aif-form-select [fd]="fd" [aifForm]="this"></aif-form-select>\n }\n @case (\'ng-select\') {\n <aif-form-ng-select [fd]="fd" [aifForm]="this"></aif-form-ng-select>\n }\n @case (\'textarea\') {\n <aif-form-textarea [fd]="fd" [aifForm]="this"></aif-form-textarea>\n }\n @case (\'date\') {\n <aif-form-date [fd]="fd" [aifForm]="this"></aif-form-date>\n }\n @case (\'options\') {\n <aif-form-options [fd]="fd" [aifForm]="this"></aif-form-options>\n }\n @case (\'switch\') {\n <aif-form-switch [fd]="fd" [aifForm]="this"></aif-form-switch>\n }\n @case (\'checkbox\') {\n <aif-form-checkbox [fd]="fd" [aifForm]="this"></aif-form-checkbox>\n }\n @case (\'file\') {\n <aif-form-file [fd]="fd" [aifForm]="this"></aif-form-file>\n }\n @case (\'image\') {\n <aif-form-image [fd]="fd" [aifForm]="this"></aif-form-image>\n }\n @case (\'group\') {\n <div class="mb-4 rounded-xl border border-slate-200/80 bg-slate-50/60 p-4 shadow-sm dark:border-slate-700/60 dark:bg-slate-900/20">\n @if (fd.label) {\n <div class="mb-3 text-sm font-semibold text-slate-700 dark:text-slate-200">\n {{ fd.label }}\n </div>\n }\n @if (fd.group_fields?.length) {\n <ng-container *ngTemplateOutlet="blockGroups; context: { gdd: fd.group_fields }"></ng-container>\n }\n </div>\n }\n @case (\'tag\') {\n <aif-form-tag [item]="getTagData(fd)"></aif-form-tag>\n }\n @case (\'form\') {\n <div [class.opacity-50]="fd?.attr?.readonly || fd?.attr?.disabled" class="mb-4" [ngClass]="fieldClass(fd)">\n @if (getSubFormData(fd); as subFormCfg) {\n <aif-form-sub [config]="subFormCfg" [attr.data-subform-name]="fd.name">\n <aif-form-table [config]="getSubFormTableData(fd)"></aif-form-table>\n @if (subFormCfg?.fields?.length) {\n <div class="mt-4 rounded-xl border border-slate-200/80 bg-white/80 p-4 shadow-sm dark:border-slate-700/60 dark:bg-slate-950/35">\n <aif-form [config]="subFormCfg"></aif-form>\n </div>\n }\n </aif-form-sub>\n }\n </div>\n @if (isRequired(fd.name)) {\n <div class="absolute top-0 right-0">\n <i class="text-red-500">*</i>\n </div>\n }\n }\n @case (\'table\') {\n <div [class.opacity-50]="fd?.attr?.readonly || fd?.attr?.disabled" class="mb-4" [ngClass]="fieldClass(fd)">\n <aif-form-data-table [config]="getTableData(fd)"></aif-form-data-table>\n </div>\n }\n }\n\n @if (hasError(fd)) {\n <div class="flex items-center gap-1.5 mt-1 px-1 text-xs text-rose-400 dark:text-rose-400/90">\n <svg class="w-3 h-3 shrink-0" viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.345 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>\n </svg>\n <span>{{ getErrorMessage(fd.name, fd.label) }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n }\n @if (showInnerButtons && btn().inner) {\n <div class="col-span-12 flex gap-2 justify-center">\n <aif-alert [config]="alert_config()"></aif-alert>\n @if (!sending() && (_config?.buttons?.cancel)) {\n <button type="button"\n class="btn bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-md shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="cancelForm()">{{\n _config.buttons.cancel.label || \'Cancelar\'}}</button>\n }\n @if (!sending() && (_config?.buttons?.clear)) {\n <button type="button"\n class="btn bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-md shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="clearForm()">{{\n _config.buttons.clear.label || \'Limpiar\'}}</button>\n }\n @if (!sending()) {\n <button type="button"\n (click)="onSubmit()"\n class="btn bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-md shadow-sm">\n @if (btn().icon) { <i class="{{btn().icon}} mr-2"></i> }\n {{ btn().text}}\n </button>\n }\n @if (sending()) {\n \x3c!-- Spinner --\x3e\n <div class="animate-spin rounded-full h-5 w-5 border-b-2 border-indigo-600"></div>\n }\n </div>\n }\n </div>\n </ng-template>\n\n <ng-template #blockGroups let-gdd="gdd">\n <div class="grid grid-cols-12 gap-4">\n @for (groupCols of gdd; track $index) {\n <div class="col-span-12" [ngClass]="getInnerColumnClass(gdd.length)">\n @for (groupFieldset of groupCols; track $index) {\n @if (groupFieldset.label) {\n <fieldset class="mb-4 rounded-lg border border-slate-200/80 p-3 dark:border-slate-700/60">\n <legend class="px-1 text-sm font-medium text-slate-700 dark:text-slate-200">\n {{ groupFieldset.label }}\n </legend>\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: groupFieldset.fields, showInnerButtons: false }"></ng-container>\n </fieldset>\n } @else {\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: groupFieldset.fields, showInnerButtons: false }"></ng-container>\n }\n }\n </div>\n }\n </div>\n </ng-template>\n\n @if (form_confirm && _config?.confirm) {\n <div class="col-span-12 text-center mt-4">\n <div class="p-4 rounded-md" [ngClass]="onClassConfirm(_config.confirm.name)">\n <div class="flex items-center justify-center">\n <input class="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600 mr-2"\n [formControlName]="_config.confirm.name" type="checkbox" role="switch" [id]="_config.confirm.name">\n <label class="text-sm font-medium text-gray-900 dark:text-gray-300 cursor-pointer" [for]="_config.confirm.name">\n {{ _config.confirm.message }}\n </label>\n </div>\n </div>\n </div>\n }\n\n @if (!btn().hide && !btn().inner && !_config?.readonly) {\n <div class="col-span-12 border-t border-slate-200 dark:border-slate-800/80 mt-8 pt-6 text-center">\n <div class="flex justify-center gap-2">\n @if (reset?.btn && !sending()) {\n <button type="button" class="px-4 py-2 rounded-md text-sm font-medium {{reset?.btn?.class}}"\n (click)="onReset()">\n @if (btn().icon) { <i class="{{btn().icon}} mr-2"></i> }\n {{ reset?.btn?.text}}\n </button>\n }\n @if (!sending() && (_config?.buttons?.cancel)) {\n <button type="button"\n class="px-4 py-2 rounded-md text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="cancelForm()">{{\n _config.buttons.cancel.label || \'Cancelar\'}}</button>\n }\n @if (!sending() && (_config?.buttons && _config?.buttons?.clear)) {\n <button type="button"\n class="px-4 py-2 rounded-md text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="clearForm()">{{\n _config.buttons.clear.label || \'Limpiar\'}}</button>\n }\n @if (!sending()) {\n <button type="button"\n (click)="onSubmit()"\n class="px-4 py-2 rounded-md text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 shadow-sm transition-all {{btn().class}}">\n @if (btn().icon) { <i class="{{btn().icon}} mr-2"></i> }\n {{ _config?.buttons?.save?.label || btn().text}}\n </button>\n }\n @if (sending()) {\n <div class="animate-spin rounded-full h-5 w-5 border-b-2 border-indigo-600"></div>\n }\n </div>\n </div>\n }\n @if (isShowButton()) {\n <div class="col-span-12 border-t border-slate-200 dark:border-slate-800/80 mt-8 pt-6 text-center">\n <button type="button"\n class="px-4 py-2 rounded-md text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="closeForm()">{{\n _config.buttons?.close?.label || \'Cerrar vista\'}}</button>\n </div>\n }\n </div>\n</ng-template>\n</div>\n}\n',styles:[".aif-responsive-span-12{grid-column:span 12 / span 12}@media(min-width:640px){.aif-responsive-span-6{grid-column:span 6 / span 6}.aif-responsive-span-4{grid-column:span 4 / span 4}.aif-responsive-span-3{grid-column:span 3 / span 3}.aif-responsive-span-2{grid-column:span 2 / span 2}.aif-responsive-span-1{grid-column:span 1 / span 1}}\n"]}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],formContainerRef:[{type:i0.ViewChild,args:["container_form",{isSignal:!0}]}]}});class AifPagination{onInit=output();config=input(null,...ngDevMode?[{debugName:"config"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);page=signal(AifPagination.config(),...ngDevMode?[{debugName:"page"}]:[]);currentLang=signal(lang(),...ngDevMode?[{debugName:"currentLang"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);_sb;state=computed(()=>{const e=this.config(),t=this.builtConfig();return AifPagination.config(t??e??{})},...ngDevMode?[{debugName:"state"}]:[]);total=computed(()=>this.page().total||0,...ngDevMode?[{debugName:"total"}]:[]);per_page=computed(()=>this.page().per_page||10,...ngDevMode?[{debugName:"per_page"}]:[]);current_page=computed(()=>this.page().current_page||1,...ngDevMode?[{debugName:"current_page"}]:[]);max_size=computed(()=>this.page().max_size||5,...ngDevMode?[{debugName:"max_size"}]:[]);labels=computed(()=>({...AifPagination.defaultLabels(this.currentLang()),...this.page().labels||{}}),...ngDevMode?[{debugName:"labels"}]:[]);totalPages=computed(()=>Math.max(1,Math.ceil(this.total()/(this.per_page()||1))),...ngDevMode?[{debugName:"totalPages"}]:[]);startIndex=computed(()=>0===this.total()?0:Math.min(this.total(),(this.current_page()-1)*this.per_page()+1),...ngDevMode?[{debugName:"startIndex"}]:[]);endIndex=computed(()=>0===this.total()?0:Math.min(this.total(),this.current_page()*this.per_page()),...ngDevMode?[{debugName:"endIndex"}]:[]);pages=computed(()=>{let e=Math.max(1,this.current_page()-Math.floor(this.max_size()/2)),t=Math.min(this.totalPages(),e+this.max_size()-1);t-e+1<this.max_size()&&(e=Math.max(1,t-this.max_size()+1));const n=[];for(let i=e;i<=t;i++)n.push(i);return n},...ngDevMode?[{debugName:"pages"}]:[]);constructor(){effect(()=>{const e=this.config();e&&Object.keys(e).length>0&&untracked(()=>this.reBuild(e))})}ngAfterViewInit(){setTimeout(()=>this.onInit.emit())}ngOnInit(){const e=this.state();e&&Object.keys(e).length>0&&this.build(e),this._sb=lang_subscribe("change",e=>this.currentLang.set(e))}ngOnDestroy(){this._sb?.unsubscribe?.()}reBuild(e){this.resetToInput(),this.build(e)}build(e=null){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e),this.update(e))}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1)}update(e=null){this.page.set(AifPagination.config(e||{}))}onPageChange(e){const t={...this.page()};t.current_page!=e&&e>=1&&e<=this.totalPages()&&(t.current_page=e,t.onPageChange?.(t),this.page.set(t))}previous(){this.current_page()>1&&this.onPageChange(this.current_page()-1)}next(){this.current_page()<this.totalPages()&&this.onPageChange(this.current_page()+1)}selectPage(e){this.onPageChange(e)}static config(e={}){return{total:e.total||0,per_page:e.per_page||0,last_page:e.last_page||0,current_page:e.current_page||1,max_size:e.max_size||5,labels:e.labels||{},onPageChange:e.onPageChange||(()=>{})}}static defaultLabels(e){return(e||"").toLowerCase().startsWith("en")?{previous:"Previous",next:"Next",previous_aria:"Previous",next_aria:"Next"}:{previous:"Anterior",next:"Siguiente",previous_aria:"Anterior",next_aria:"Siguiente"}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPagination,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifPagination,isStandalone:!0,selector:"aif-pagination",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},ngImport:i0,template:'@if (isBuilt() && totalPages() > 0 && total() > 0) {\n<nav class="flex items-center justify-between bg-transparent sm:px-0 w-full">\n \n \x3c!-- Mobile Pagination View (Visible only on small screens) --\x3e\n <div class="flex flex-1 justify-between sm:hidden w-full gap-2">\n <button (click)="previous()" [disabled]="current_page() === 1" \n class="relative inline-flex items-center justify-center rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-slate-800 dark:border-slate-700 dark:text-slate-200 dark:hover:bg-slate-700 w-full transition-colors">\n {{ labels().previous }}\n </button>\n <button (click)="next()" [disabled]="current_page() === totalPages()" \n class="relative inline-flex items-center justify-center rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-slate-800 dark:border-slate-700 dark:text-slate-200 dark:hover:bg-slate-700 w-full transition-colors">\n {{ labels().next }}\n </button>\n </div>\n \n \x3c!-- Desktop Pagination View (Hidden on mobile) --\x3e\n <div class="hidden sm:flex sm:flex-1 sm:items-center sm:justify-end w-full">\n \n \x3c!-- Right Pager Toolbar --\x3e\n <div>\n <ul class="inline-flex -space-x-px rounded-md shadow-sm">\n \n \x3c!-- Previous Page Anchor --\x3e\n <li>\n <button (click)="previous()" [disabled]="current_page() === 1" \n class="relative inline-flex items-center rounded-l-md px-2.5 py-2 hover:z-10 text-slate-400 ring-1 ring-inset ring-slate-300 hover:bg-slate-50 focus:z-20 disabled:opacity-40 disabled:cursor-not-allowed dark:ring-slate-700 dark:hover:bg-slate-800 dark:text-slate-300 transition-colors">\n <span class="sr-only">{{ labels().previous_aria }}</span>\n \x3c!-- Custom back chevron icon SVG --\x3e\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd" d="M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z" clip-rule="evenodd" />\n </svg>\n </button>\n </li>\n \n \x3c!-- Rotatory Pages Map --\x3e\n @for (p of pages(); track p) {\n <li>\n <button (click)="selectPage(p)" \n [class.bg-primary-600]="p === current_page()"\n [class.dark:bg-primary-600]="p === current_page()"\n [class.text-white]="p === current_page()"\n [class.z-10]="p === current_page()"\n [class.text-slate-900]="p !== current_page()"\n [class.dark:text-slate-200]="p !== current_page()"\n [class.hover:bg-slate-50]="p !== current_page()"\n [class.dark:hover:bg-slate-800]="p !== current_page()"\n class="relative inline-flex items-center px-4 py-2 text-sm font-semibold ring-1 ring-inset ring-slate-300 dark:ring-slate-700 focus:z-20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 transition-colors">\n {{ p }}\n </button>\n </li>\n }\n \n \x3c!-- Next Page Anchor --\x3e\n <li>\n <button (click)="next()" [disabled]="current_page() === totalPages()" \n class="relative inline-flex items-center rounded-r-md px-2.5 py-2 hover:z-10 text-slate-400 ring-1 ring-inset ring-slate-300 hover:bg-slate-50 focus:z-20 disabled:opacity-40 disabled:cursor-not-allowed dark:ring-slate-700 dark:hover:bg-slate-800 dark:text-slate-300 transition-colors">\n <span class="sr-only">{{ labels().next_aria }}</span>\n \x3c!-- Custom next chevron icon SVG --\x3e\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd" d="M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z" clip-rule="evenodd" />\n </svg>\n </button>\n </li>\n \n </ul>\n </div>\n </div>\n</nav>\n}\n',styles:[""]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPagination,decorators:[{type:Component,args:[{selector:"aif-pagination",imports:[],template:'@if (isBuilt() && totalPages() > 0 && total() > 0) {\n<nav class="flex items-center justify-between bg-transparent sm:px-0 w-full">\n \n \x3c!-- Mobile Pagination View (Visible only on small screens) --\x3e\n <div class="flex flex-1 justify-between sm:hidden w-full gap-2">\n <button (click)="previous()" [disabled]="current_page() === 1" \n class="relative inline-flex items-center justify-center rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-slate-800 dark:border-slate-700 dark:text-slate-200 dark:hover:bg-slate-700 w-full transition-colors">\n {{ labels().previous }}\n </button>\n <button (click)="next()" [disabled]="current_page() === totalPages()" \n class="relative inline-flex items-center justify-center rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-slate-800 dark:border-slate-700 dark:text-slate-200 dark:hover:bg-slate-700 w-full transition-colors">\n {{ labels().next }}\n </button>\n </div>\n \n \x3c!-- Desktop Pagination View (Hidden on mobile) --\x3e\n <div class="hidden sm:flex sm:flex-1 sm:items-center sm:justify-end w-full">\n \n \x3c!-- Right Pager Toolbar --\x3e\n <div>\n <ul class="inline-flex -space-x-px rounded-md shadow-sm">\n \n \x3c!-- Previous Page Anchor --\x3e\n <li>\n <button (click)="previous()" [disabled]="current_page() === 1" \n class="relative inline-flex items-center rounded-l-md px-2.5 py-2 hover:z-10 text-slate-400 ring-1 ring-inset ring-slate-300 hover:bg-slate-50 focus:z-20 disabled:opacity-40 disabled:cursor-not-allowed dark:ring-slate-700 dark:hover:bg-slate-800 dark:text-slate-300 transition-colors">\n <span class="sr-only">{{ labels().previous_aria }}</span>\n \x3c!-- Custom back chevron icon SVG --\x3e\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd" d="M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z" clip-rule="evenodd" />\n </svg>\n </button>\n </li>\n \n \x3c!-- Rotatory Pages Map --\x3e\n @for (p of pages(); track p) {\n <li>\n <button (click)="selectPage(p)" \n [class.bg-primary-600]="p === current_page()"\n [class.dark:bg-primary-600]="p === current_page()"\n [class.text-white]="p === current_page()"\n [class.z-10]="p === current_page()"\n [class.text-slate-900]="p !== current_page()"\n [class.dark:text-slate-200]="p !== current_page()"\n [class.hover:bg-slate-50]="p !== current_page()"\n [class.dark:hover:bg-slate-800]="p !== current_page()"\n class="relative inline-flex items-center px-4 py-2 text-sm font-semibold ring-1 ring-inset ring-slate-300 dark:ring-slate-700 focus:z-20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 transition-colors">\n {{ p }}\n </button>\n </li>\n }\n \n \x3c!-- Next Page Anchor --\x3e\n <li>\n <button (click)="next()" [disabled]="current_page() === totalPages()" \n class="relative inline-flex items-center rounded-r-md px-2.5 py-2 hover:z-10 text-slate-400 ring-1 ring-inset ring-slate-300 hover:bg-slate-50 focus:z-20 disabled:opacity-40 disabled:cursor-not-allowed dark:ring-slate-700 dark:hover:bg-slate-800 dark:text-slate-300 transition-colors">\n <span class="sr-only">{{ labels().next_aria }}</span>\n \x3c!-- Custom next chevron icon SVG --\x3e\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd" d="M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z" clip-rule="evenodd" />\n </svg>\n </button>\n </li>\n \n </ul>\n </div>\n </div>\n</nav>\n}\n'}]}],ctorParameters:()=>[],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifFormStep{formComponents=viewChildren("dynamicFormComponents",...ngDevMode?[{debugName:"formComponents"}]:[]);config=input({},...ngDevMode?[{debugName:"config"}]:[]);fb=inject(FormBuilder);currentStep=signal(0,...ngDevMode?[{debugName:"currentStep"}]:[]);steps=signal([],...ngDevMode?[{debugName:"steps"}]:[]);values=signal({},...ngDevMode?[{debugName:"values"}]:[]);values_fields=signal({},...ngDevMode?[{debugName:"values_fields"}]:[]);sending=signal(!1,...ngDevMode?[{debugName:"sending"}]:[]);alert_config=signal({message:"",show:!1,type:"warning",build:()=>{}},...ngDevMode?[{debugName:"alert_config"}]:[]);show=signal(!1,...ngDevMode?[{debugName:"show"}]:[]);modal=null;submit=()=>{};result="none";form_confirm=null;form;cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);constructor(){effect(()=>{const e=this.config();e&&Object.keys(e).length>0&&setTimeout(()=>this.build(e))})}ngOnInit(){const e=this.config()||{};e.build=e=>this.build(e),Object.keys(e).length>0&&this.build(e)}newField(e,t){return{name:t,attr:"object"==typeof e[0]?e[0]?.attr:{},control_type:"object"==typeof e[0]?e[0]?.type:e[0]||"text",type:e[0]||"text",label:e[1]||"",value:void 0!==e[2]?e[2]:null,validations:e[3]||{}}}build(e,t=null){if(this.reset(),(e=e||{}).build=e=>this.build(e,t||this.modal),this.cfg.set(e),e.fields instanceof Array&&e.fields.length>0&&e.fields[0]instanceof Array&&e.fields[0].length>0){this.show.set(!0),this.alert_config().build&&this.alert_config().build({show:!1}),this.submit=e.onSubmit||(()=>{}),this.result=e.result_type||"none";const t=[];for(let n of e.fields)for(let i of n){const n=i.fields||[];t.push({title:i.label,completed:!1,onStep:()=>(e,t)=>{e&&"function"==typeof e&&e(this.values_fields(),t,this)},config:{cat:e.cat||[],readonly:e.readonly||!1,onSubmit:e=>{this.values_fields.update(t=>({...t,...e}));const t=this.values();t[this.currentStep()]=e,this.values.set(t)},fields:n,btn:{hide:!0}}})}this.steps.set(t);let n=this.cfg();if(n.validate=n.validate||(()=>!0),n.confirm){let e={};n.confirm=n.confirm||{},n.confirm.name=n.confirm?.name||"dynamic_confirm";const t=n.confirm.name,i=this.newField(["switch","",!!n.confirm?.value],t);this.form_confirm=new FormControl(i.value),e[i.name]=this.form_confirm,this.form=this.fb.group(e)}this.cfg.set(n)}t&&(this.modal=t,this.modal.open())}reset(){this.steps.set([]),this.values.set({}),this.values_fields.set({}),this.sending.set(!1),this.alert_config.set({message:"",show:!1,type:"warning",build:()=>{}}),this.currentStep.set(0),this.show.set(!1),this.form_confirm=null}goToStep(e){}prevStep(){if(this.currentStep()>0){const e=this.steps();e[this.currentStep()].completed=!0,this.steps.set(e),this.currentStep.update(e=>e-1)}}nextStep(){this.isValidStep().then(()=>{const e=this.steps();e[this.currentStep()].completed=!0,this.steps.set(e),this.currentStep.update(e=>e+1),this.sendNotification(this.currentStep())}).catch(e=>{console.log("error en el formulario step",e)})}clearStep(){const e=this.formComponents()[this.currentStep()];msg.clear_message({message:this.cfg().buttons?.clear?.message}).then(t=>{t&&e&&(e.form.reset(),e.submitted.set(!1))})}cancelStep(){msg.cancel_message({message:this.cfg().buttons?.cancel?.message||this.cfg().buttons?.cancel}).then(e=>{e&&this.modal&&this.modal?.close()})}isValid(){const e=this.formComponents()[this.currentStep()];return e&&e.onSubmit()}sendNotification(e){const t=this.formComponents()[e];if(t&&t.config&&"function"==typeof t.config){const e=t.config();e?.onStep&&"function"==typeof e.onStep&&e.onStep(this.values_fields(),t,this)}else t&&t._config&&t._config?.onStep&&"function"==typeof t._config.onStep&&t._config.onStep(this.values_fields(),t,this)}isValidStep(){return new Promise((e,t)=>{const n=this.formComponents()[this.currentStep()];if(n)if(n.submitted.set(!0),n.form.invalid)n.form.markAllAsTouched(),t();else{const t=n._config,i=n.getDataForm();t&&"function"==typeof t.onSubmit&&t.onSubmit(i,n.feedback.bind(n),n),e()}else t()})}confirm_save(e=null){const t=this.steps();t[this.currentStep()].completed=!0,this.steps.set(t);let n=Object.values(this.values());"join"==this.result&&(n=obj_fields_join(n)),e&&(n={...n,[this.cfg().confirm.name]:!0}),this.submit(n,this.feedback.bind(this)),this.sending.set(!0)}save(){this.isValidStep().then(()=>{this.cfg().confirm&&1==this.form.get(this.cfg().confirm.name)?.value?msg.confirm_message(this.cfg().confirm).then(e=>{e?this.confirm_save(!0):this.feedback(!1,"")}):this.confirm_save()}).catch(e=>{console.log("error en el formulario step",e)})}close(){this.modal&&this.modal?.close()}feedback(e,t){if(e)this.modal&&this.modal?.close();else{this.sending.set(!1);const e=this.alert_config();e.build&&e.build({show:!0,type:"warning",message:t})}}onClassConfirm(e){const t=this.form.get(e)?.value,n={"text-amber-700 bg-amber-50 ring-amber-600/20":!t,"text-green-700 bg-green-50 ring-green-600/20":t};return this.cfg().confirm?.class&&(this.cfg().confirm.class.enable&&(n[this.cfg().confirm.class.enable]=t),this.cfg().confirm.class.disable&&(n[this.cfg().confirm.class.disable]=!t)),n}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormStep,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormStep,isStandalone:!0,selector:"aif-form-step",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"formComponents",predicate:["dynamicFormComponents"],descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (show()) {\n<div class="bg-white dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-800 p-6 shadow-sm flex flex-col w-full h-full">\n \n \x3c!-- Tailwind UI Wizard Header (Stepper) --\x3e\n <nav aria-label="Progress" class="mb-8 overflow-x-auto pb-4 -mx-2 px-2 [scrollbar-width:none] [-ms-overflow-style:none]">\n <div class="flex justify-center md:block">\n <ol role="list" class="flex items-center justify-center gap-x-2 pr-2 sm:gap-x-3 md:min-w-max md:justify-start">\n @for (step of steps(); track step; let i = $index) {\n \n \x3c!-- Render line connecting steps EXCEPT for the first one --\x3e\n @if (i !== 0) {\n <li class="relative hidden sm:block sm:w-8 md:w-14 shrink-0">\n <div class="absolute inset-0 flex items-center" aria-hidden="true">\n <div class="h-0.5 w-full bg-slate-200 dark:bg-slate-700"\n [ngClass]="{\'bg-primary-600 dark:bg-primary-500\': step.completed || currentStep() > i}"></div>\n </div>\n </li>\n }\n\n <li class="relative shrink-0">\n \x3c!-- Step State Machine: Completed, Current, or Upcoming --\x3e\n \n \x3c!-- COMPLETED OR PASSED STEP --\x3e\n @if (step.completed || currentStep() > i) {\n <a class="group flex items-center cursor-pointer" (click)="sending() ? null : goToStep(i)">\n <span class="flex h-10 w-10 items-center justify-center rounded-full bg-primary-600 hover:bg-primary-700 group-hover:bg-primary-800 transition-colors">\n <svg class="h-6 w-6 text-white" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd" d="M19.916 4.626a.75.75 0 01.208 1.04l-9 13.5a.75.75 0 01-1.154.114l-6-6a.75.75 0 011.06-1.06l5.353 5.353 8.493-12.739a.75.75 0 011.04-.208z" clip-rule="evenodd" />\n </svg>\n </span>\n <span class="ml-2 hidden max-w-[7.5rem] truncate text-sm font-medium leading-tight text-slate-900 dark:text-slate-200 md:inline">{{ step.title }}</span>\n </a>\n }\n\n \x3c!-- CURRENT ACTIVE STEP --\x3e\n @if (!step.completed && currentStep() === i) {\n <a class="flex items-center" aria-current="step">\n <span class="flex h-10 w-10 items-center justify-center rounded-full border-2 border-primary-600 bg-white dark:bg-slate-900" aria-hidden="true">\n <span class="h-2.5 w-2.5 rounded-full bg-primary-600"></span>\n </span>\n <span class="ml-2 hidden max-w-[7.5rem] truncate text-sm font-bold leading-tight text-primary-600 dark:text-primary-500 md:inline">{{ step.title }}</span>\n </a>\n }\n\n \x3c!-- UPCOMING INACTIVE STEP --\x3e\n @if (!step.completed && currentStep() < i) {\n <a class="group flex items-center">\n <span class="flex h-10 w-10 items-center justify-center rounded-full border-2 border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-900 transition-colors" aria-hidden="true">\n <span class="text-slate-500 dark:text-slate-400 font-medium">{{ i + 1 }}</span>\n </span>\n <span class="ml-2 hidden max-w-[7.5rem] truncate text-sm font-medium leading-tight text-slate-500 dark:text-slate-400 md:inline">{{ step.title }}</span>\n </a>\n }\n </li>\n }\n </ol>\n </div>\n <div class="mt-3 flex w-full justify-center text-center md:hidden">\n @if (steps()[currentStep()]; as activeStep) {\n <span class="inline-block max-w-[80vw] truncate text-sm font-semibold text-primary-600 dark:text-primary-500">\n {{ activeStep.title }}\n </span>\n }\n </div>\n </nav>\n\n \x3c!-- Wizard Forms Loop --\x3e\n @for (step of steps(); track step; let i = $index) {\n \x3c!-- Conditionally display using hidden instead of @if to preserve instance states in the DOM --\x3e\n <aif-form [config]="step.config" [hidden]="currentStep() !== i" #dynamicFormComponents></aif-form>\n }\n \n \x3c!-- Dynamic Form Confirm Checkbox --\x3e\n @if (form_confirm && cfg()?.confirm) {\n <form #container_form [formGroup]="form" class="mt-6 flex justify-center">\n <div class="px-6 py-4 rounded-xl ring-1 ring-inset" [ngClass]="onClassConfirm(cfg().confirm.name)">\n <div class="flex items-center justify-center gap-x-3">\n <input \n class="h-5 w-5 rounded border-slate-300 text-primary-600 focus:ring-primary-600 dark:border-slate-600 dark:bg-slate-700 dark:ring-offset-slate-900 transition-colors cursor-pointer" \n [formControlName]="cfg().confirm.name" \n type="checkbox" \n [id]="cfg().confirm.name">\n <label class="text-sm font-medium leading-none cursor-pointer" [for]="cfg().confirm.name">\n {{ cfg().confirm.message }}\n </label>\n </div>\n </div>\n </form>\n }\n\n \x3c!-- Error / Warning Alert Component --\x3e\n <aif-alert class="mt-4" [config]="alert_config()"></aif-alert>\n\n \x3c!-- Navigation Grid Footer --\x3e\n <div class="mt-8 pt-5 border-t border-slate-200 dark:border-slate-800 flex items-center justify-between">\n \n @if (!sending()) {\n <div class="flex-none">\n @if (currentStep() > 0) {\n <button type="button" class="rounded-md bg-white dark:bg-slate-800 px-3.5 py-2.5 text-sm font-semibold text-slate-900 dark:text-slate-200 shadow-sm ring-1 ring-inset ring-slate-300 dark:ring-slate-700 hover:bg-slate-50 dark:hover:bg-slate-700" (click)="prevStep()">\n Anterior\n </button>\n }\n </div>\n \n <div class="flex flex-1 justify-end gap-x-3">\n @if (!cfg()?.readonly && cfg().buttons?.cancel) {\n <button type="button" class="rounded-md px-3.5 py-2.5 text-sm font-semibold text-slate-500 hover:text-slate-700 dark:text-slate-400 dark:hover:text-slate-300" (click)="cancelStep()">\n {{ cfg().buttons.cancel.label || \'Cancelar\' }}\n </button>\n }\n \n @if (!cfg()?.readonly && cfg().buttons?.clear) {\n <button type="button" class="rounded-md bg-white dark:bg-slate-800 px-3.5 py-2.5 text-sm font-semibold text-slate-900 dark:text-slate-200 shadow-sm ring-1 ring-inset ring-slate-300 dark:ring-slate-700 hover:bg-slate-50 dark:hover:bg-slate-700" (click)="clearStep()">\n {{ cfg().buttons.clear.label || \'Limpiar\' }}\n </button>\n }\n \n @if (currentStep() < steps().length - 1) { \n <button type="button" class="rounded-md bg-primary-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600" (click)="nextStep()">\n Siguiente\n </button>\n }\n \n @if (!cfg()?.readonly && currentStep() === steps().length - 1) {\n <button type="button" class="rounded-md bg-primary-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600" (click)="save()">\n {{ cfg().buttons?.save?.label || \'Guardar\' }}\n </button>\n }\n \n @if (cfg()?.readonly && currentStep() === steps().length - 1) {\n <button type="button" class="rounded-md bg-slate-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-slate-500" (click)="close()">\n Cerrar vista\n </button>\n }\n </div>\n } @else {\n \x3c!-- Spinning Loader --\x3e\n <div class="w-full flex justify-center py-2">\n <svg class="animate-spin h-8 w-8 text-primary-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">\n <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>\n <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>\n </svg>\n </div>\n }\n </div>\n</div>\n}\n',styles:[""],dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.ɵNgNoValidate,selector:"form:not([ngNoForm]):not([ngNativeValidate])"},{kind:"directive",type:i1$2.CheckboxControlValueAccessor,selector:"input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:AifForm,selector:"aif-form",inputs:["config"]},{kind:"component",type:AifAlert,selector:"aif-alert",inputs:["config"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormStep,decorators:[{type:Component,args:[{selector:"aif-form-step",imports:[NgClass,ReactiveFormsModule,AifForm,AifAlert],template:'@if (show()) {\n<div class="bg-white dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-800 p-6 shadow-sm flex flex-col w-full h-full">\n \n \x3c!-- Tailwind UI Wizard Header (Stepper) --\x3e\n <nav aria-label="Progress" class="mb-8 overflow-x-auto pb-4 -mx-2 px-2 [scrollbar-width:none] [-ms-overflow-style:none]">\n <div class="flex justify-center md:block">\n <ol role="list" class="flex items-center justify-center gap-x-2 pr-2 sm:gap-x-3 md:min-w-max md:justify-start">\n @for (step of steps(); track step; let i = $index) {\n \n \x3c!-- Render line connecting steps EXCEPT for the first one --\x3e\n @if (i !== 0) {\n <li class="relative hidden sm:block sm:w-8 md:w-14 shrink-0">\n <div class="absolute inset-0 flex items-center" aria-hidden="true">\n <div class="h-0.5 w-full bg-slate-200 dark:bg-slate-700"\n [ngClass]="{\'bg-primary-600 dark:bg-primary-500\': step.completed || currentStep() > i}"></div>\n </div>\n </li>\n }\n\n <li class="relative shrink-0">\n \x3c!-- Step State Machine: Completed, Current, or Upcoming --\x3e\n \n \x3c!-- COMPLETED OR PASSED STEP --\x3e\n @if (step.completed || currentStep() > i) {\n <a class="group flex items-center cursor-pointer" (click)="sending() ? null : goToStep(i)">\n <span class="flex h-10 w-10 items-center justify-center rounded-full bg-primary-600 hover:bg-primary-700 group-hover:bg-primary-800 transition-colors">\n <svg class="h-6 w-6 text-white" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd" d="M19.916 4.626a.75.75 0 01.208 1.04l-9 13.5a.75.75 0 01-1.154.114l-6-6a.75.75 0 011.06-1.06l5.353 5.353 8.493-12.739a.75.75 0 011.04-.208z" clip-rule="evenodd" />\n </svg>\n </span>\n <span class="ml-2 hidden max-w-[7.5rem] truncate text-sm font-medium leading-tight text-slate-900 dark:text-slate-200 md:inline">{{ step.title }}</span>\n </a>\n }\n\n \x3c!-- CURRENT ACTIVE STEP --\x3e\n @if (!step.completed && currentStep() === i) {\n <a class="flex items-center" aria-current="step">\n <span class="flex h-10 w-10 items-center justify-center rounded-full border-2 border-primary-600 bg-white dark:bg-slate-900" aria-hidden="true">\n <span class="h-2.5 w-2.5 rounded-full bg-primary-600"></span>\n </span>\n <span class="ml-2 hidden max-w-[7.5rem] truncate text-sm font-bold leading-tight text-primary-600 dark:text-primary-500 md:inline">{{ step.title }}</span>\n </a>\n }\n\n \x3c!-- UPCOMING INACTIVE STEP --\x3e\n @if (!step.completed && currentStep() < i) {\n <a class="group flex items-center">\n <span class="flex h-10 w-10 items-center justify-center rounded-full border-2 border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-900 transition-colors" aria-hidden="true">\n <span class="text-slate-500 dark:text-slate-400 font-medium">{{ i + 1 }}</span>\n </span>\n <span class="ml-2 hidden max-w-[7.5rem] truncate text-sm font-medium leading-tight text-slate-500 dark:text-slate-400 md:inline">{{ step.title }}</span>\n </a>\n }\n </li>\n }\n </ol>\n </div>\n <div class="mt-3 flex w-full justify-center text-center md:hidden">\n @if (steps()[currentStep()]; as activeStep) {\n <span class="inline-block max-w-[80vw] truncate text-sm font-semibold text-primary-600 dark:text-primary-500">\n {{ activeStep.title }}\n </span>\n }\n </div>\n </nav>\n\n \x3c!-- Wizard Forms Loop --\x3e\n @for (step of steps(); track step; let i = $index) {\n \x3c!-- Conditionally display using hidden instead of @if to preserve instance states in the DOM --\x3e\n <aif-form [config]="step.config" [hidden]="currentStep() !== i" #dynamicFormComponents></aif-form>\n }\n \n \x3c!-- Dynamic Form Confirm Checkbox --\x3e\n @if (form_confirm && cfg()?.confirm) {\n <form #container_form [formGroup]="form" class="mt-6 flex justify-center">\n <div class="px-6 py-4 rounded-xl ring-1 ring-inset" [ngClass]="onClassConfirm(cfg().confirm.name)">\n <div class="flex items-center justify-center gap-x-3">\n <input \n class="h-5 w-5 rounded border-slate-300 text-primary-600 focus:ring-primary-600 dark:border-slate-600 dark:bg-slate-700 dark:ring-offset-slate-900 transition-colors cursor-pointer" \n [formControlName]="cfg().confirm.name" \n type="checkbox" \n [id]="cfg().confirm.name">\n <label class="text-sm font-medium leading-none cursor-pointer" [for]="cfg().confirm.name">\n {{ cfg().confirm.message }}\n </label>\n </div>\n </div>\n </form>\n }\n\n \x3c!-- Error / Warning Alert Component --\x3e\n <aif-alert class="mt-4" [config]="alert_config()"></aif-alert>\n\n \x3c!-- Navigation Grid Footer --\x3e\n <div class="mt-8 pt-5 border-t border-slate-200 dark:border-slate-800 flex items-center justify-between">\n \n @if (!sending()) {\n <div class="flex-none">\n @if (currentStep() > 0) {\n <button type="button" class="rounded-md bg-white dark:bg-slate-800 px-3.5 py-2.5 text-sm font-semibold text-slate-900 dark:text-slate-200 shadow-sm ring-1 ring-inset ring-slate-300 dark:ring-slate-700 hover:bg-slate-50 dark:hover:bg-slate-700" (click)="prevStep()">\n Anterior\n </button>\n }\n </div>\n \n <div class="flex flex-1 justify-end gap-x-3">\n @if (!cfg()?.readonly && cfg().buttons?.cancel) {\n <button type="button" class="rounded-md px-3.5 py-2.5 text-sm font-semibold text-slate-500 hover:text-slate-700 dark:text-slate-400 dark:hover:text-slate-300" (click)="cancelStep()">\n {{ cfg().buttons.cancel.label || \'Cancelar\' }}\n </button>\n }\n \n @if (!cfg()?.readonly && cfg().buttons?.clear) {\n <button type="button" class="rounded-md bg-white dark:bg-slate-800 px-3.5 py-2.5 text-sm font-semibold text-slate-900 dark:text-slate-200 shadow-sm ring-1 ring-inset ring-slate-300 dark:ring-slate-700 hover:bg-slate-50 dark:hover:bg-slate-700" (click)="clearStep()">\n {{ cfg().buttons.clear.label || \'Limpiar\' }}\n </button>\n }\n \n @if (currentStep() < steps().length - 1) { \n <button type="button" class="rounded-md bg-primary-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600" (click)="nextStep()">\n Siguiente\n </button>\n }\n \n @if (!cfg()?.readonly && currentStep() === steps().length - 1) {\n <button type="button" class="rounded-md bg-primary-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600" (click)="save()">\n {{ cfg().buttons?.save?.label || \'Guardar\' }}\n </button>\n }\n \n @if (cfg()?.readonly && currentStep() === steps().length - 1) {\n <button type="button" class="rounded-md bg-slate-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-slate-500" (click)="close()">\n Cerrar vista\n </button>\n }\n </div>\n } @else {\n \x3c!-- Spinning Loader --\x3e\n <div class="w-full flex justify-center py-2">\n <svg class="animate-spin h-8 w-8 text-primary-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">\n <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>\n <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>\n </svg>\n </div>\n }\n </div>\n</div>\n}\n'}]}],ctorParameters:()=>[],propDecorators:{formComponents:[{type:i0.ViewChildren,args:["dynamicFormComponents",{isSignal:!0}]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifTableColumnEngine{host;constructor(e){this.host=e}buildProcessedColumns(e=[]){const t=[],n=[];this.host.resetCheckCount();for(const i of e){if("string"==typeof i){const e=i,a=i.toLowerCase().replace(/ /g,"_");t.push({name:e,type:"text",class:"",style:{}}),n.push({name:e,type:"text",field:a});continue}const e=this.columnType(i),a={name:"string"==typeof i.name?i.name:i.name?.name??"",type:e,class:"",style:i.style||{}},s={...i,type:e};if(i.hide){const e=this.getHideClass(i.hide);a.class=e,s.class=s.class?`${s.class} ${e}`:e}t.push(a),n.push(s)}return{columns:t,fields:n}}columnType(e){if("string"==typeof e||e instanceof Array)return"text";if("object"==typeof e){if("string"==typeof e.type&&e.type.trim())return e.type;if(e.image)return"image";if(e.form)return"form";if(e.menu)return"menu";if(e.check||"check"===e.type)return this.host.incrementCheckCount(),"check";if(e.click)return"click";if(e.expand)return"expand";if(e.custom)return"custom"}return"text"}getHideClass(e){switch(e){case"sm":return"hidden sm:table-cell";case"md":return"hidden md:table-cell";case"lg":return"hidden lg:table-cell";case"xl":return"hidden xl:table-cell";default:return""}}}class AifTableBuildEngine{host;constructor(e){this.host=e}mergeConfig(e=null,t=null,n=null){return{...e||{},...t?{data:t}:{},...n?{columns:n}:{}}}build(e){!this.host.isBuilt()&&e&&(this.host.isBuiltSignal.set(!0),this.host.resetSelection(),this.host.header.set(e.header||{}),this.host.footer.set(e.footer||{}),this.host.th_hide.set(e.th_hide||!1),this.host.filter.set(e.filter||{}),this.host.navbar.set(e.navbar||{}),this.host.navbar_bottom.set(e.navbar_bottom||{}),this.host.empty.set(e.empty||{}),e.values&&this.host.addInitialValues(e.values),this.host.cfg.set(e),e.filter&&e.filter.url?this.host.loadData(e.filter.url,e.filter.fields||{}):this.host.data.set(e.data||[]),e.page?this.host.page.set({...e.page,onPageChange:e=>this.host.loadPageData(e.current_page)}):this.host.page.set({current_page:1,onPageChange:e=>this.host.loadPageData(e.current_page)}))}}class AifTableDataEngine{host;constructor(e){this.host=e}loadDataByUrl(e,t={},n=null){loading(!0);const i=rq_sanitize_method(this.host.filter().method,"post");rq_req().send(i,e,t).then(e=>{if(this.host.destroyRef.destroyed)return;loading(!1);const t=e.data||e||[];this.host.data.set(t),e.total>0&&e.total>(e.per_page||0)&&this.host.page.update(t=>({...t,...e,current_page:e.current_page||1})),e.general&&this.host.general.set(e.general),this.host.onLoad.emit({total:e.total,data:t}),"function"==typeof n&&n(!0,e.total)}).catch(e=>{this.host.destroyRef.destroyed||(loading(!1),"function"==typeof n&&n(!1,e))})}loadPageData(e){this.host.page.update(t=>({...t,current_page:e}));const t=this.host.filter()||{};this.loadDataByUrl(t.url+"?page="+e,t.fields||{})}applyFilter(e,t=null){if(!e)return;const n=this.host.filter()||{};n.fields={...n.fields||{},...e},this.host.filter.set(n),this.loadPageData(1),"function"==typeof t&&t()}refreshFilter(e=null){const t=this.host.filter()||{};t.fields=t.fields||{},this.loadPageData(this.host.page().current_page||1),"function"==typeof e&&e()}reload(e=null){this.refreshFilter(e)}}class AifTableExpandEngine{host;constructor(e){this.host=e}toggleExpand(e,t){this.host.expanded().id!==e.id?this.host.expandedSignal.set({id:e.id,data:e,...t.expand}):this.host.expandedSignal.set({})}}class AifTableModalEngine{host;constructor(e){this.host=e}openModal(e,t,n){n(e.form,t)}openForm(e,t={},n=null){const i=this.host.forms()[e]||e;if("function"!=typeof i)return;const a=i(e,t,n);a instanceof Promise?a.then(e=>e?this.openModalForm(e):null):a&&this.openModalForm(a)}openModalForm(e={}){const t=this.host.aifModal();void 0===e.backdrop&&(e.backdrop=!1),t.build(e),e.step||e.config?.step?this.host.aifFormStep().build(e.config,t):this.host.aifForm().build(e.config,t)}openClick(e,t){"function"==typeof e.click&&e.click(t,e)}}class AifTableRowEngine{host;constructor(e){this.host=e}buildRows(e=[],t=[]){return e.map((e,n)=>{const i=t.map((t,n)=>this.showField(t,e)?{...t,canShow:!0,value:this.getFieldValue(t,e,t.type),matchValue:"match"===t.type?this.getFieldMatch(t,e):null,isCheck:"check"===t.type&&this.host.isChecked(e,n),customVal:"custom"===t.type?this.customField(t,e,n):null,expandVal:"expand"===t.type?this.expandedField(t,e):null,imageSrc:"image"===t.type&&t.image?this.getFieldValue(t.image,e,"image"):null}:{...t,canShow:!1,alt:this.altField(t,e)});return{id:e.id,raw:e,index:n,mappedFields:i,isExpanded:this.host.expanded().id===e.id,isSelected:this.host.isRowChecked(e)}})}getFieldValue(e,t={},n="text"){if("string"==typeof e)return"image"===n?storage(t[e]||e):t[e];if(e instanceof Array)return json_hierarchy_val(t,e);if("object"==typeof e&&null!==e){if(e.field){if(e.field instanceof Array)return json_hierarchy_val(t,e.field);if("string"==typeof e.field)return/\{[^}]+\}/.test(e.field)?this.getFieldMatch(e,t):t[e.field]}if(e.action)return e.action}return""}getFieldMatch(e,t={}){return str_replace_vars(e.field,t,e.prefix,e.suffix)}customField(e,t,n){return"function"==typeof e.custom?e.custom(t,n):e.custom||{}}expandedField(e,t){return"function"==typeof e.expand?.field?e.expand.field(t,e):e.expand?.field||{}}showField(e,t){const n={...t,...this.host.general()||{}};if(e&&(e.show||e.hide)&&Object.keys(n).length>0){if(e.show)return e.show instanceof Array?field_evaluate(e.show[0],n,!0):field_evaluate(e.show,n);if(e.hide)return e.hide instanceof Array?!field_evaluate(e.hide[0],n,!0):!field_evaluate(e.hide,n)}return!0}altField(e,t){if("check"===e.type&&this.host.not_check().add(t.id),e.alt?.field&&"object"==typeof e.alt.field)for(const n in e.alt.field)if(void 0!==t[n]&&"object"==typeof e.alt.field[n])for(const i in e.alt.field[n])if(t[n]==i)return e.alt.field[n][i];return null}}class AifTableSelectionEngine{host;check_data={};check_num=0;constructor(e){this.host=e}reset(){this.check_num=0,this.check_data={}}resetCheckCount(){this.check_num=0}incrementCheckCount(){this.check_num++}isRowChecked(e){if(this.check_num>1){for(const t in this.check_data)if(this.check_data[t].has(e.id))return!0;return!1}const t="column_"+this.check_num;return!!this.check_data[t]?.has(e.id)}isChecked(e){return this.isRowChecked(e)}addCheckData(e={}){if(Array.isArray(e))if(this.check_num>1)for(const t in e){const n="column_"+t;this.check_data[n]=new Set(e[t])}else{const t="column_"+this.check_num;this.check_data[t]=new Set(e)}else if("object"==typeof e)for(const t in e)this.check_data[t]=new Set(e[t])}onCheckChange(e,t,n){const i=n.target,a=t?.id||"column_"+this.check_num;this.check_data[a]=this.check_data[a]||new Set,i.checked?this.check_data[a].add(e.id):this.check_data[a].delete(e.id),"function"==typeof t?.click&&t.click(e,t,0,i.checked),this.emitCheckedData()}onCheckChangeAll(e,t){const n=e.target,i=t?.id||"column_"+this.check_num;this.check_data[i]=new Set,n.checked&&this.host.data().forEach(e=>{this.host.not_check().has(e.id)||this.check_data[i].add(e.id)}),this.emitCheckedData()}emitCheckedData(){this.host.selectionTrigger.update(e=>e+1);const e=this.getCheckData();this.host.onChecked.emit(e),"function"==typeof this.host.cfg()?.onChecked&&this.host.cfg().onChecked(e)}getCheckData(){if(this.check_num>1)return this.getCheckDataMulti();const e="column_"+this.check_num;return[...this.check_data[e]||new Set]}getCheckDataMulti(){const e={};for(const t in this.check_data)e[t]=[...this.check_data[t]];return e}}class AifTableViewEngine{host;constructor(e){this.host=e}titleHeader(){const e=this.host.header();return e.title_empty&&0===this.host.data().length?e.title_empty:e.table_title||e.title||""}seeHeader(){return 0!==this.host.data().length&&!(!this.host.header().title&&!this.host.header().table_title)}seePage(){return this.host.page().total>this.host.page().per_page}seeFooter(){return!!this.host.footer().title&&this.seePage()}titleFooter(){let e=this.host.footer().table_title||this.host.footer().title||"";if(e&&Object.keys(this.host.page()).length>0){const t=this.host.page(),n={};for(const e in t)n[e]=`<span class="font-bold text-slate-900 dark:text-slate-100">${t[e]}</span>`;return str_replace_vars(e,n)}return e}totalPages(){return this.host.page().last_page||Math.ceil((this.host.page().total||0)/(this.host.page().per_page||1))}}class AifTable{onInitEvent=output();onChecked=output();onLoad=output();config=input(null,...ngDevMode?[{debugName:"config"}]:[]);dataInput=input(null,{...ngDevMode?{debugName:"dataInput"}:{},alias:"data"});columnsInput=input(null,{...ngDevMode?{debugName:"columnsInput"}:{},alias:"columns"});cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);header=signal({},...ngDevMode?[{debugName:"header"}]:[]);footer=signal({},...ngDevMode?[{debugName:"footer"}]:[]);filter=signal({},...ngDevMode?[{debugName:"filter"}]:[]);data=signal([],...ngDevMode?[{debugName:"data"}]:[]);page=signal({},...ngDevMode?[{debugName:"page"}]:[]);navbar=signal({},...ngDevMode?[{debugName:"navbar"}]:[]);navbar_bottom=signal({},...ngDevMode?[{debugName:"navbar_bottom"}]:[]);general=signal({},...ngDevMode?[{debugName:"general"}]:[]);th_hide=signal(!1,...ngDevMode?[{debugName:"th_hide"}]:[]);expanded=signal({},...ngDevMode?[{debugName:"expanded"}]:[]);not_check=signal(new Set,...ngDevMode?[{debugName:"not_check"}]:[]);empty=signal({},...ngDevMode?[{debugName:"empty"}]:[]);selectionTrigger=signal(0,...ngDevMode?[{debugName:"selectionTrigger"}]:[]);aifModal=viewChild.required(AifModal);aifForm=viewChild.required(AifForm);aifFormStep=viewChild.required(AifFormStep);destroyRef=inject(DestroyRef);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);buildEngine=new AifTableBuildEngine(this);columnEngine=new AifTableColumnEngine(this);dataEngine=new AifTableDataEngine(this);expandEngine=new AifTableExpandEngine(this);modalEngine=new AifTableModalEngine(this);rowEngine=new AifTableRowEngine(this);selectionEngine=new AifTableSelectionEngine(this);viewEngine=new AifTableViewEngine(this);forms=computed(()=>this.cfg().forms||{},...ngDevMode?[{debugName:"forms"}]:[]);style=computed(()=>{const e=this.cfg().style||{};return{...e,table:e.table??"bg-white dark:bg-slate-900 rounded-lg shadow-sm border border-slate-200 dark:border-slate-800",padding:e.padding??"p-4 md:p-6"}},...ngDevMode?[{debugName:"style"}]:[]);processedColumns=computed(()=>{const e=this.cfg().columns||this.columnsInput()||[];return this.columnEngine.buildProcessedColumns(e)},...ngDevMode?[{debugName:"processedColumns"}]:[]);rows=computed(()=>{this.selectionTrigger();const e=this.data(),t=this.processedColumns().fields;return this.rowEngine.buildRows(e,t)},...ngDevMode?[{debugName:"rows"}]:[]);titleHeader=computed(()=>this.viewEngine.titleHeader(),...ngDevMode?[{debugName:"titleHeader"}]:[]);seeHeader=computed(()=>this.viewEngine.seeHeader(),...ngDevMode?[{debugName:"seeHeader"}]:[]);seePage=computed(()=>this.viewEngine.seePage(),...ngDevMode?[{debugName:"seePage"}]:[]);seeFooter=computed(()=>this.viewEngine.seeFooter(),...ngDevMode?[{debugName:"seeFooter"}]:[]);titleFooter=computed(()=>this.viewEngine.titleFooter(),...ngDevMode?[{debugName:"titleFooter"}]:[]);totalPages=computed(()=>this.viewEngine.totalPages(),...ngDevMode?[{debugName:"totalPages"}]:[]);constructor(){effect(()=>{const e=this.getMergedConfig();Object.keys(e).length>0&&untracked(()=>this.reBuild(e))})}ngOnInit(){(this.config()||this.dataInput()||this.columnsInput())&&this.build(this.getMergedConfig()),setTimeout(()=>{this.destroyRef.destroyed||this.onInitEvent.emit()},0)}reBuild(e){this.isBuilt.set(!1),this.build(e)}build(e){this.buildEngine.build(e)}get isBuiltSignal(){return this.isBuilt}resetSelection(){this.selectionEngine.reset()}addInitialValues(e={}){this.addCheckData(e)}loadData(e,t={}){this.dataEngine.loadDataByUrl(e,t)}incrementCheckCount(){this.selectionEngine.incrementCheckCount()}resetCheckCount(){this.selectionEngine.resetCheckCount()}loadDataByUrl(e,t={},n=null){this.dataEngine.loadDataByUrl(e,t,n)}loadPageData(e){this.dataEngine.loadPageData(e)}isRowChecked(e){return this.selectionEngine.isRowChecked(e)}isChecked(e,t){return this.selectionEngine.isChecked(e)}addCheckData(e={}){this.selectionEngine.addCheckData(e)}onCheckChange(e,t,n){this.selectionEngine.onCheckChange(e,t,n)}onCheckChangeAll(e,t){this.selectionEngine.onCheckChangeAll(e,t)}getCheckData(){return this.selectionEngine.getCheckData()}getCheckDataMulti(){return this.selectionEngine.getCheckDataMulti()}setNavBar(e,t="top"){"bottom"===t?this.navbar_bottom.set(e):this.navbar.set(e)}applyFilter(e,t=null){this.dataEngine.applyFilter(e,t)}refreshFilter(e=null){this.dataEngine.refreshFilter(e)}reload(e=null){this.dataEngine.reload(e)}openModal(e,t){this.modalEngine.openModal(e,t,this.openForm.bind(this))}openForm(e,t={}){this.modalEngine.openForm(e,t,this)}openModalForm(e={}){this.modalEngine.openModalForm(e)}openClick(e,t){this.modalEngine.openClick(e,t)}toggleExpand(e,t){this.expandEngine.toggleExpand(e,t)}get expandedSignal(){return this.expanded}getMergedConfig(){return this.buildEngine.mergeConfig(this.config(),this.dataInput(),this.columnsInput())}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifTable,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifTable,isStandalone:!0,selector:"aif-table",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},dataInput:{classPropertyName:"dataInput",publicName:"data",isSignal:!0,isRequired:!1,transformFunction:null},columnsInput:{classPropertyName:"columnsInput",publicName:"columns",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInitEvent:"onInitEvent",onChecked:"onChecked",onLoad:"onLoad"},viewQueries:[{propertyName:"aifModal",first:!0,predicate:AifModal,descendants:!0,isSignal:!0},{propertyName:"aifForm",first:!0,predicate:AifForm,descendants:!0,isSignal:!0},{propertyName:"aifFormStep",first:!0,predicate:AifFormStep,descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (config() || dataInput() || columnsInput() || isBuilt()) {\n<div class="aif-table" [ngClass]="style().table">\n <div [ngClass]="style().padding">\n\n\n @if (navbar() && (navbar().left?.length || navbar().right?.length || navbar().center?.length)) {\n <div class="mb-4">\n <aif-nav-bar [config]="navbar()"></aif-nav-bar>\n </div>\n }\n\n @if (seeHeader()) {\n <div class="flex flex-row mb-4">\n <div class="w-full">\n <h5 class="text-lg font-semibold text-slate-800 dark:text-slate-100" [ngClass]="header().class"\n [style]="header().style">\n {{ titleHeader() }}\n </h5>\n </div>\n </div>\n }\n\n @if (data().length > 0) {\n <div class="relative w-full overflow-visible rounded" [ngClass]="style().table.includes(\'border-none\') ? \'\' : \'border border-slate-200 dark:border-slate-700\'">\n <div class="overflow-x-auto overflow-y-visible">\n <table class="w-full text-left text-sm text-slate-600 dark:text-slate-300">\n @if (!th_hide()) {\n <thead\n class="bg-slate-100/80 dark:bg-slate-800 text-slate-900 dark:text-white text-xs font-bold"\n [class.uppercase]="!!style().th_uppercase"\n [class.normal-case]="!style().th_uppercase">\n <tr>\n @for (col of processedColumns().columns; track col.name || $index; let hix = $index) {\n <th class="py-3 border-b border-slate-200 dark:border-slate-700 font-bold text-left"\n [ngClass]="col?.class" [style]="col?.style"\n [class.px-4]="![\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(col?.type)"\n [class.px-2]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(col?.type)"\n [class.whitespace-nowrap]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(col?.type)"\n [class.w-px]="[\'check\'].includes(col?.type)"\n [class.w-12]="[\'form\', \'icon\', \'menu\', \'expand\'].includes(col?.type)"\n [class.text-right]="[\'form\', \'icon\', \'menu\', \'expand\'].includes(col?.type)">\n @if (col?.type === \'icon\') {\n <i [class]="col.icon"></i>\n } @else if (col?.type === \'check\') {\n <input type="checkbox"\n class="rounded border-slate-300 text-primary-600 focus:ring-primary-500 focus:ring-2 bg-white dark:bg-slate-700 dark:border-slate-600 cursor-pointer"\n (click)="onCheckChangeAll($event, col); $event.stopPropagation()">\n } @else {\n {{ col?.name || \'\' }}\n }\n </th>\n }\n </tr>\n </thead>\n }\n\n <tbody class="divide-y divide-slate-200 dark:divide-slate-700/50 bg-white dark:bg-slate-900">\n @for (row of rows(); track row.id) {\n <tr class="hover:bg-slate-100/50 dark:hover:bg-slate-800/50 transition-colors" [ngClass]="[\n row.isSelected ? \'bg-primary-50 dark:bg-primary-900/10\' : \'\',\n row.isExpanded ? \'bg-slate-100/40 dark:bg-slate-800\' : \'\',\n row.index % 2 !== 0 ? \'bg-slate-50 dark:bg-slate-800/20\' : \'\',\n style().tr || \'\'\n ]">\n\n @for (field of row.mappedFields; track field.name || $index; let idx = $index) {\n <td class="py-2 align-middle" [ngClass]="field.class" [style]="field.style"\n [class.px-4]="![\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)"\n [class.px-2]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)"\n [class.whitespace-nowrap]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)"\n [class.w-px]="[\'check\'].includes(field?.type)"\n [class.w-12]="[\'form\', \'icon\', \'menu\', \'expand\'].includes(field?.type)"\n [class.text-right]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)">\n @if (field.canShow) {\n @switch (field.type) {\n\n @case (\'text\') {\n <span class="text-slate-700 dark:text-slate-300">{{ field.value }}</span>\n }\n\n @case (\'date\') {\n <span class="text-slate-600 dark:text-slate-400">{{ field.value | date: \'dd/MM/yyyy HH:mm\' }}</span>\n }\n\n @case (\'datetime\') {\n <span class="text-slate-600 dark:text-slate-400">{{ field.value | date: \'dd/MM/yyyy HH:mm\' }}</span>\n }\n\n @case (\'match\') {\n <span class="text-slate-700 dark:text-slate-300">{{ field.matchValue }}</span>\n }\n\n @case (\'image\') {\n @if (field.click) {\n <a (click)="openClick(field, row.raw)"\n class="inline-flex items-center text-primary-600 hover:text-primary-700 cursor-pointer"\n [ngClass]="field.class" [style]="field.style">\n <img [src]="field.imageSrc" class="w-8 h-8 rounded-full mr-2 object-cover" />\n {{ field.value }}\n </a>\n } @else {\n <span class="inline-flex items-center text-slate-700 dark:text-slate-300" [ngClass]="field.class"\n [style]="field.style">\n <img [src]="field.imageSrc" class="w-8 h-8 rounded-full mr-2 object-cover" />\n {{ field.value }}\n </span>\n }\n }\n\n @case (\'click\') {\n <a (click)="openClick(field, row.raw)"\n class="text-primary-600 hover:text-primary-700 dark:text-primary-500 dark:hover:text-primary-400 cursor-pointer underline hover:no-underline transition-all"\n [ngClass]="field.class" [style]="field.style">\n {{ field.value }}\n </a>\n }\n\n @case (\'form\') {\n <a (click)="openModal(field, row.raw)"\n class="inline-flex items-center justify-center w-8 h-8 transition-colors hover:text-primary-600 dark:hover:text-primary-400 cursor-pointer"\n [title]="field.title || \'\'" [ngClass]="field.class" [style]="field.style">\n <i [class]="field.icon"></i>\n </a>\n }\n\n @case (\'menu\') {\n <aif-menu [config]="field.menu" [fields]="row.raw" [index]="row.index" [total]="rows().length"></aif-menu>\n }\n\n @case (\'check\') {\n <input type="checkbox" [checked]="field.isCheck"\n (click)="onCheckChange(row.raw, field, $event); $event.stopPropagation()" [value]="row.id"\n class="rounded border-slate-300 text-primary-600 focus:ring-primary-500 bg-white dark:bg-slate-700 dark:border-slate-600 cursor-pointer">\n }\n\n @case (\'expand\') {\n <button (click)="toggleExpand(row.raw, field)"\n class="inline-flex items-center justify-center w-8 h-8 transition-colors hover:text-primary-600 dark:hover:text-primary-400 ml-auto">\n <svg class="w-4 h-4 transition-transform duration-200" [ngClass]="{\'rotate-90\': row.isExpanded}"\n fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />\n </svg>\n </button>\n }\n\n @case (\'component\') {\n <aif-create [config]="field"></aif-create>\n }\n\n @case (\'custom\') {\n @if (field.customVal) {\n @switch (field.customVal.type) {\n @case (\'button\') {\n <button (click)="field.customVal?.click(row.raw)"\n class="px-3 py-1.5 text-sm font-medium rounded-md transition-colors"\n [ngClass]="field.customVal?.class || \'bg-primary-50 text-primary-700 hover:bg-primary-100 dark:bg-primary-900/30 dark:text-primary-400 dark:hover:bg-primary-900/50\'">\n @if (field.customVal.icon) { <i [class]="field.customVal.icon"></i> }\n {{ field.customVal?.text }}\n </button>\n }\n @case (\'text\') {\n <span [ngClass]="field.customVal.class">{{ field.customVal?.text }}</span>\n }\n @case (\'html\') {\n <span [ngClass]="field.customVal?.class" [class.cursor-pointer]="!!field.customVal?.click"\n [innerHTML]="field.customVal?.html" (click)="field.customVal?.click?.(row.raw)"></span>\n }\n @default {\n @if (field.customVal.html) {\n <div [ngClass]="field.customVal?.class" [class.cursor-pointer]="!!field.customVal?.click"\n [innerHTML]="field.customVal?.html" (click)="field.customVal?.click?.(row.raw)"></div>\n }\n }\n }\n }\n }\n }\n } @else {\n @if (field.alt) {\n <span [style]="field.alt?.style" [title]="field.alt?.title" [ngClass]="field.alt?.class"\n [innerHTML]="field.alt?.html" (click)="field.alt?.click?.(row.raw)"></span>\n }\n }\n </td>\n }\n </tr>\n\n @if (row.isExpanded) {\n <tr class="bg-slate-50/80 dark:bg-slate-900/80 border-b border-slate-100 dark:border-slate-800">\n <td [colSpan]="processedColumns().fields.length" class="p-0">\n <div class="px-6 py-4 overflow-hidden shadow-inner">\n <aif-create [config]="expanded()"></aif-create>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n </div>\n\n \x3c!-- Pagination Footer --\x3e\n @if (seePage() || seeFooter()) {\n <div\n class="flex flex-col sm:flex-row justify-between items-center mt-4 text-sm text-slate-600 dark:text-slate-400 gap-4">\n @if (seeFooter()) {\n <div class="w-full sm:w-auto text-left" [innerHTML]="titleFooter()">\n </div>\n }\n\n @if (seePage()) {\n <div class="w-full sm:w-auto flex flex-row items-center gap-2 justify-end">\n <aif-pagination [config]="page()"></aif-pagination>\n </div>\n }\n </div>\n }\n\n @if (navbar_bottom() && (navbar_bottom().left?.length || navbar_bottom().right?.length ||\n navbar_bottom().center?.length)) {\n <div class="mt-4">\n <aif-nav-bar [config]="navbar_bottom()"></aif-nav-bar>\n </div>\n }\n } @else {\n \x3c!-- Empty State --\x3e\n <div class="py-12 flex flex-col items-center justify-center text-slate-400 dark:text-slate-500">\n @if (empty().icon) {\n <i [class]="empty().icon" class="text-6xl mb-4 text-slate-300 dark:text-slate-600"></i>\n } @else {\n <svg class="w-12 h-12 mb-4 text-slate-300 dark:text-slate-600" fill="none" stroke="currentColor"\n viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"\n d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 002-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10">\n </path>\n </svg>\n }\n <p class="text-sm font-medium">{{ empty().title || \'No data available to display\' }}</p>\n </div>\n }\n\n </div>\n</div>\n}\n\n<aif-modal>\n <aif-form></aif-form>\n <aif-form-step></aif-form-step>\n</aif-modal>\n',styles:[":host{display:block}.tr-expand-content{animation:expandDown .2s ease-out}@keyframes expandDown{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"],dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"component",type:AifCreate,selector:"aif-create",inputs:["config"],outputs:["onInit"]},{kind:"component",type:AifMenu,selector:"aif-menu",inputs:["config","fields","index","total"],outputs:["onInit"]},{kind:"component",type:AifNavBar,selector:"aif-nav-bar",inputs:["config","side"],outputs:["onInit"]},{kind:"component",type:AifPagination,selector:"aif-pagination",inputs:["config"],outputs:["onInit"]},{kind:"component",type:AifModal,selector:"aif-modal",inputs:["config"]},{kind:"component",type:AifForm,selector:"aif-form",inputs:["config"]},{kind:"component",type:AifFormStep,selector:"aif-form-step",inputs:["config"]},{kind:"pipe",type:DatePipe,name:"date"}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifTable,decorators:[{type:Component,args:[{selector:"aif-table",imports:[DatePipe,NgClass,AifCreate,AifMenu,AifNavBar,AifPagination,AifModal,AifForm,AifFormStep],template:'@if (config() || dataInput() || columnsInput() || isBuilt()) {\n<div class="aif-table" [ngClass]="style().table">\n <div [ngClass]="style().padding">\n\n\n @if (navbar() && (navbar().left?.length || navbar().right?.length || navbar().center?.length)) {\n <div class="mb-4">\n <aif-nav-bar [config]="navbar()"></aif-nav-bar>\n </div>\n }\n\n @if (seeHeader()) {\n <div class="flex flex-row mb-4">\n <div class="w-full">\n <h5 class="text-lg font-semibold text-slate-800 dark:text-slate-100" [ngClass]="header().class"\n [style]="header().style">\n {{ titleHeader() }}\n </h5>\n </div>\n </div>\n }\n\n @if (data().length > 0) {\n <div class="relative w-full overflow-visible rounded" [ngClass]="style().table.includes(\'border-none\') ? \'\' : \'border border-slate-200 dark:border-slate-700\'">\n <div class="overflow-x-auto overflow-y-visible">\n <table class="w-full text-left text-sm text-slate-600 dark:text-slate-300">\n @if (!th_hide()) {\n <thead\n class="bg-slate-100/80 dark:bg-slate-800 text-slate-900 dark:text-white text-xs font-bold"\n [class.uppercase]="!!style().th_uppercase"\n [class.normal-case]="!style().th_uppercase">\n <tr>\n @for (col of processedColumns().columns; track col.name || $index; let hix = $index) {\n <th class="py-3 border-b border-slate-200 dark:border-slate-700 font-bold text-left"\n [ngClass]="col?.class" [style]="col?.style"\n [class.px-4]="![\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(col?.type)"\n [class.px-2]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(col?.type)"\n [class.whitespace-nowrap]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(col?.type)"\n [class.w-px]="[\'check\'].includes(col?.type)"\n [class.w-12]="[\'form\', \'icon\', \'menu\', \'expand\'].includes(col?.type)"\n [class.text-right]="[\'form\', \'icon\', \'menu\', \'expand\'].includes(col?.type)">\n @if (col?.type === \'icon\') {\n <i [class]="col.icon"></i>\n } @else if (col?.type === \'check\') {\n <input type="checkbox"\n class="rounded border-slate-300 text-primary-600 focus:ring-primary-500 focus:ring-2 bg-white dark:bg-slate-700 dark:border-slate-600 cursor-pointer"\n (click)="onCheckChangeAll($event, col); $event.stopPropagation()">\n } @else {\n {{ col?.name || \'\' }}\n }\n </th>\n }\n </tr>\n </thead>\n }\n\n <tbody class="divide-y divide-slate-200 dark:divide-slate-700/50 bg-white dark:bg-slate-900">\n @for (row of rows(); track row.id) {\n <tr class="hover:bg-slate-100/50 dark:hover:bg-slate-800/50 transition-colors" [ngClass]="[\n row.isSelected ? \'bg-primary-50 dark:bg-primary-900/10\' : \'\',\n row.isExpanded ? \'bg-slate-100/40 dark:bg-slate-800\' : \'\',\n row.index % 2 !== 0 ? \'bg-slate-50 dark:bg-slate-800/20\' : \'\',\n style().tr || \'\'\n ]">\n\n @for (field of row.mappedFields; track field.name || $index; let idx = $index) {\n <td class="py-2 align-middle" [ngClass]="field.class" [style]="field.style"\n [class.px-4]="![\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)"\n [class.px-2]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)"\n [class.whitespace-nowrap]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)"\n [class.w-px]="[\'check\'].includes(field?.type)"\n [class.w-12]="[\'form\', \'icon\', \'menu\', \'expand\'].includes(field?.type)"\n [class.text-right]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)">\n @if (field.canShow) {\n @switch (field.type) {\n\n @case (\'text\') {\n <span class="text-slate-700 dark:text-slate-300">{{ field.value }}</span>\n }\n\n @case (\'date\') {\n <span class="text-slate-600 dark:text-slate-400">{{ field.value | date: \'dd/MM/yyyy HH:mm\' }}</span>\n }\n\n @case (\'datetime\') {\n <span class="text-slate-600 dark:text-slate-400">{{ field.value | date: \'dd/MM/yyyy HH:mm\' }}</span>\n }\n\n @case (\'match\') {\n <span class="text-slate-700 dark:text-slate-300">{{ field.matchValue }}</span>\n }\n\n @case (\'image\') {\n @if (field.click) {\n <a (click)="openClick(field, row.raw)"\n class="inline-flex items-center text-primary-600 hover:text-primary-700 cursor-pointer"\n [ngClass]="field.class" [style]="field.style">\n <img [src]="field.imageSrc" class="w-8 h-8 rounded-full mr-2 object-cover" />\n {{ field.value }}\n </a>\n } @else {\n <span class="inline-flex items-center text-slate-700 dark:text-slate-300" [ngClass]="field.class"\n [style]="field.style">\n <img [src]="field.imageSrc" class="w-8 h-8 rounded-full mr-2 object-cover" />\n {{ field.value }}\n </span>\n }\n }\n\n @case (\'click\') {\n <a (click)="openClick(field, row.raw)"\n class="text-primary-600 hover:text-primary-700 dark:text-primary-500 dark:hover:text-primary-400 cursor-pointer underline hover:no-underline transition-all"\n [ngClass]="field.class" [style]="field.style">\n {{ field.value }}\n </a>\n }\n\n @case (\'form\') {\n <a (click)="openModal(field, row.raw)"\n class="inline-flex items-center justify-center w-8 h-8 transition-colors hover:text-primary-600 dark:hover:text-primary-400 cursor-pointer"\n [title]="field.title || \'\'" [ngClass]="field.class" [style]="field.style">\n <i [class]="field.icon"></i>\n </a>\n }\n\n @case (\'menu\') {\n <aif-menu [config]="field.menu" [fields]="row.raw" [index]="row.index" [total]="rows().length"></aif-menu>\n }\n\n @case (\'check\') {\n <input type="checkbox" [checked]="field.isCheck"\n (click)="onCheckChange(row.raw, field, $event); $event.stopPropagation()" [value]="row.id"\n class="rounded border-slate-300 text-primary-600 focus:ring-primary-500 bg-white dark:bg-slate-700 dark:border-slate-600 cursor-pointer">\n }\n\n @case (\'expand\') {\n <button (click)="toggleExpand(row.raw, field)"\n class="inline-flex items-center justify-center w-8 h-8 transition-colors hover:text-primary-600 dark:hover:text-primary-400 ml-auto">\n <svg class="w-4 h-4 transition-transform duration-200" [ngClass]="{\'rotate-90\': row.isExpanded}"\n fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />\n </svg>\n </button>\n }\n\n @case (\'component\') {\n <aif-create [config]="field"></aif-create>\n }\n\n @case (\'custom\') {\n @if (field.customVal) {\n @switch (field.customVal.type) {\n @case (\'button\') {\n <button (click)="field.customVal?.click(row.raw)"\n class="px-3 py-1.5 text-sm font-medium rounded-md transition-colors"\n [ngClass]="field.customVal?.class || \'bg-primary-50 text-primary-700 hover:bg-primary-100 dark:bg-primary-900/30 dark:text-primary-400 dark:hover:bg-primary-900/50\'">\n @if (field.customVal.icon) { <i [class]="field.customVal.icon"></i> }\n {{ field.customVal?.text }}\n </button>\n }\n @case (\'text\') {\n <span [ngClass]="field.customVal.class">{{ field.customVal?.text }}</span>\n }\n @case (\'html\') {\n <span [ngClass]="field.customVal?.class" [class.cursor-pointer]="!!field.customVal?.click"\n [innerHTML]="field.customVal?.html" (click)="field.customVal?.click?.(row.raw)"></span>\n }\n @default {\n @if (field.customVal.html) {\n <div [ngClass]="field.customVal?.class" [class.cursor-pointer]="!!field.customVal?.click"\n [innerHTML]="field.customVal?.html" (click)="field.customVal?.click?.(row.raw)"></div>\n }\n }\n }\n }\n }\n }\n } @else {\n @if (field.alt) {\n <span [style]="field.alt?.style" [title]="field.alt?.title" [ngClass]="field.alt?.class"\n [innerHTML]="field.alt?.html" (click)="field.alt?.click?.(row.raw)"></span>\n }\n }\n </td>\n }\n </tr>\n\n @if (row.isExpanded) {\n <tr class="bg-slate-50/80 dark:bg-slate-900/80 border-b border-slate-100 dark:border-slate-800">\n <td [colSpan]="processedColumns().fields.length" class="p-0">\n <div class="px-6 py-4 overflow-hidden shadow-inner">\n <aif-create [config]="expanded()"></aif-create>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n </div>\n\n \x3c!-- Pagination Footer --\x3e\n @if (seePage() || seeFooter()) {\n <div\n class="flex flex-col sm:flex-row justify-between items-center mt-4 text-sm text-slate-600 dark:text-slate-400 gap-4">\n @if (seeFooter()) {\n <div class="w-full sm:w-auto text-left" [innerHTML]="titleFooter()">\n </div>\n }\n\n @if (seePage()) {\n <div class="w-full sm:w-auto flex flex-row items-center gap-2 justify-end">\n <aif-pagination [config]="page()"></aif-pagination>\n </div>\n }\n </div>\n }\n\n @if (navbar_bottom() && (navbar_bottom().left?.length || navbar_bottom().right?.length ||\n navbar_bottom().center?.length)) {\n <div class="mt-4">\n <aif-nav-bar [config]="navbar_bottom()"></aif-nav-bar>\n </div>\n }\n } @else {\n \x3c!-- Empty State --\x3e\n <div class="py-12 flex flex-col items-center justify-center text-slate-400 dark:text-slate-500">\n @if (empty().icon) {\n <i [class]="empty().icon" class="text-6xl mb-4 text-slate-300 dark:text-slate-600"></i>\n } @else {\n <svg class="w-12 h-12 mb-4 text-slate-300 dark:text-slate-600" fill="none" stroke="currentColor"\n viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"\n d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 002-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10">\n </path>\n </svg>\n }\n <p class="text-sm font-medium">{{ empty().title || \'No data available to display\' }}</p>\n </div>\n }\n\n </div>\n</div>\n}\n\n<aif-modal>\n <aif-form></aif-form>\n <aif-form-step></aif-form-step>\n</aif-modal>\n',styles:[":host{display:block}.tr-expand-content{animation:expandDown .2s ease-out}@keyframes expandDown{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"]}]}],ctorParameters:()=>[],propDecorators:{onInitEvent:[{type:i0.Output,args:["onInitEvent"]}],onChecked:[{type:i0.Output,args:["onChecked"]}],onLoad:[{type:i0.Output,args:["onLoad"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],dataInput:[{type:i0.Input,args:[{isSignal:!0,alias:"data",required:!1}]}],columnsInput:[{type:i0.Input,args:[{isSignal:!0,alias:"columns",required:!1}]}],aifModal:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifModal),{isSignal:!0}]}],aifForm:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifForm),{isSignal:!0}]}],aifFormStep:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifFormStep),{isSignal:!0}]}]}});class AifGrid{onInit=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);datePipe=inject(DatePipe);currencyPipe=inject(CurrencyPipe);decimalPipe=inject(DecimalPipe);see=section("content","page","footer","header","message");cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);data=signal([],...ngDevMode?[{debugName:"data"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);header=signal({},...ngDevMode?[{debugName:"header"}]:[]);footer=signal({},...ngDevMode?[{debugName:"footer"}]:[]);page=signal({},...ngDevMode?[{debugName:"page"}]:[]);general=signal({},...ngDevMode?[{debugName:"general"}]:[]);style=signal({},...ngDevMode?[{debugName:"style"}]:[]);navbar=signal({},...ngDevMode?[{debugName:"navbar"}]:[]);navbar_bottom=signal({},...ngDevMode?[{debugName:"navbar_bottom"}]:[]);fields=signal({},...ngDevMode?[{debugName:"fields"}]:[]);format=signal({},...ngDevMode?[{debugName:"format"}]:[]);buttons=signal({},...ngDevMode?[{debugName:"buttons"}]:[]);loadingMore=signal(!1,...ngDevMode?[{debugName:"loadingMore"}]:[]);sentinel=viewChild("sentinel",...ngDevMode?[{debugName:"sentinel"}]:[]);observer=null;aifModal=viewChild.required(AifModal);aifForm=viewChild.required(AifForm);aifFormStep=viewChild.required(AifFormStep);forms=computed(()=>this.cfg().forms||{},...ngDevMode?[{debugName:"forms"}]:[]);items=computed(()=>{const e=this.data(),t=this.fields(),n=this.format(),i=this.buttons();return e.map((e,a)=>{const s={id:this.getFieldValue(t.id||"id",e),title:this.getFieldValue(t.title||"name",e),description:t.description?this.getFieldValue(t.description,e):null,image:t.image?this.getFieldValue(t.image,e,"image"):null,tag:t.tag?this.getFieldValue(t.tag,e):null,status:t.status?this.getFieldValue(t.status,e):null};if(n)for(const e in n)void 0!==s[e]&&(s[e]=this.applyFormat(s[e],n[e]));return{...e,_grid:{...s,resolvedImage:s.image?storage(s.image):null,buttons:{top_left:(i.top_left||[]).map(t=>this.resolveButton(t,e)),top_right:(i.top_right||[]).map(t=>this.resolveButton(t,e)),bottom_left:(i.bottom_left||[]).map(t=>this.resolveButton(t,e)),bottom_right:(i.bottom_right||[]).map(t=>this.resolveButton(t,e)),center:(i.center||[]).map(t=>this.resolveButton(t,e))}}}})},...ngDevMode?[{debugName:"items"}]:[]);hasHeader=computed(()=>!!this.header().table_title||this.header().title_empty&&0===this.page().total,...ngDevMode?[{debugName:"hasHeader"}]:[]);hasFooter=computed(()=>!!this.footer().table_title,...ngDevMode?[{debugName:"hasFooter"}]:[]);showPagination=computed(()=>this.page().total>this.page().per_page,...ngDevMode?[{debugName:"showPagination"}]:[]);fxEvent={};filter={};ngOnInit(){const e=this.config();e&&(e.filter?.url||e.data&&e.data.length>0)&&this.build(e)}ngAfterViewInit(){this.initInfiniteScroll(),setTimeout(()=>this.onInit.emit())}ngOnDestroy(){this.observer&&this.observer.disconnect()}initInfiniteScroll(){const e=this.sentinel();e&&(this.observer=new IntersectionObserver(e=>{e[0].isIntersecting&&!this.loadingMore()&&this.page().current_page<this.page().last_page&&this.loadPageData(this.page().current_page+1)},{threshold:.1}),this.observer.observe(e.nativeElement))}reBuild(e){this.isBuilt.set(!1),this.build(e)}build(e={}){!e||this.isBuilt()&&this.cfg()===e||(this.isBuilt.set(!0),this.buildFunctions(e),this.buildConfig(e),this.buildData(e),this.buildPage(e.page),this.cfg.set(e))}buildFunctions(e={}){this.fxEvent={getContext:()=>this,onLoad:e.onLoad||(()=>{}),onChecked:e.onChecked||(()=>{}),onLoadChecked:e.onLoadChecked||(()=>{}),beforeOnData:e.beforeOnData||(()=>{}),onClick:e.click||(()=>{})}}buildConfig(e={}){this.header.set(e.header||{}),this.footer.set(e.footer||{}),this.filter=e.filter||{},this.style.set(e.style||{}),this.navbar.set(e.navbar||{}),this.navbar_bottom.set(e.navbar_bottom||{}),this.fields.set(e.fields||{}),this.format.set(e.format||{}),this.buttons.set(e.buttons||{})}buildData(e={}){if(e.filter?.url)this.loadDataByUrl(e.filter.url,e.filter.fields||{});else{const t=e.data||[];t.length>0&&this.see.show("content"),this.data.set(t)}}loadDataByUrl(e,t={},n=null){if(this.loadingMore())return;this.loadingMore.set(!0);const i=e.includes("page=")&&!e.includes("page=1");i||(this.see.hide("content","page","footer","header"),loading(!0));const a=rq_sanitize_method(this.filter.method,"post");rq_req().send(a,e,t).then(e=>{const t=e.data||e||[];e.total>0&&(this.see.show("content"),this.buildPage(e),this.setVarsFooter(e)),e.general&&this.general.set(e.general),this.setVarsHeader(e),i?this.data.update(e=>[...e,...t]):(this.data.set(t),loading(!1)),this.loadingMore.set(!1),"function"==typeof n&&n(!0,e.total),this.fxEvent.onLoad(e.total,t)}).catch(e=>{loading(!1),this.loadingMore.set(!1),"function"==typeof n&&n(!1,e)})}buildPage(e={}){const t=e||{};t.onPageChange=e=>{this.loadPageData(e.current_page||1)},this.page.set(t)}loadPageData(e,t=null){this.page.update(t=>({...t,current_page:e})),this.fxEvent.beforeOnData();const n=this.filter||{},i=n.url+(n.url.includes("?")?"&":"?")+"page="+e;this.loadDataByUrl(i,n.fields||{},t)}setVarsHeader(e){const t=this.general()||{},n={...e,...t},i={...this.header()};i.line=i.line||!1,i.title?(i.table_title=str_replace_vars(i.title,n),this.see.show("header")):i.title_empty&&0===e.total?this.see.show("header"):this.see.hide("header"),this.header.set(i)}setVarsFooter(e){const t={...e,...this.general()||{}},n={...this.footer()};n.line=n.line||!1,n.title&&(n.table_title=str_replace_vars(n.title,t),this.see.show("footer")),this.footer.set(n)}resolveButton(e,t){const n={...e};return"function"==typeof e.label?n.resolvedLabel=e.label(t):"string"==typeof e.label?n.resolvedLabel=str_replace_vars(e.label,t):n.resolvedLabel=e.label||"","function"==typeof e.class?n.resolvedClass=e.class(t):n.resolvedClass=e.class||"","function"==typeof e.icon?n.resolvedIcon=e.icon(t):n.resolvedIcon=e.icon||"",n}getFieldValue(e,t={},n="text"){if("string"==typeof e)return"image"===n?t[e]||e:t[e];if(e instanceof Array)return json_hierarchy_val(t,e);if("object"==typeof e&&null!==e&&e.field){if(e.field instanceof Array)return json_hierarchy_val(t,e.field);if("string"==typeof e.field)return/\{[^}]+\}/.test(e.field)?str_replace_vars(e.field,t,e.prefix,e.suffix):t[e.field]}return""}applyFormat(e,t){if(null==e)return"";switch(t){case"date":return this.datePipe.transform(e,"dd/MM/yyyy");case"datetime":return this.datePipe.transform(e,"dd/MM/yyyy HH:mm");case"currency":return this.currencyPipe.transform(e,"USD","symbol","1.2-2");case"decimal":return this.decimalPipe.transform(e,"1.2-2");default:return e}}handleButtonClick(e,t){if("form"===e.type)this.openForm(e.form,t);else if("link"===e.type){const n="function"==typeof e.link?e.link(t):e.link;navigate(n)}else"function"==typeof e.click&&e.click(t,e)}handleItemClick(e,t){e.preventDefault(),this.fxEvent.onClick(t)}setNavBar(e,t="top"){"bottom"===t?this.navbar_bottom.set(e):this.navbar.set(e)}applyFilter(e,t=null){if(!e)return;const n=this.filter||{};n.fields={...n.fields||{},...e},this.filter=n,this.data.set([]),this.loadPageData(1,t)}reload(e=null){this.data.set([]),this.loadPageData(1,e)}refreshFilter(e=null){this.reload(e)}openModal(e,t){this.openForm(e.form,t)}openForm(e,t={}){const n=this.forms()[e]||e;if("function"==typeof n){const i=n(e,t,this);i instanceof Promise?i.then(e=>e?this.openModalForm(e):null):i&&this.openModalForm(i)}}openModalForm(e={}){const t=this.aifModal();t.build(e),e.step?this.aifFormStep().build(e.config,t):this.aifForm().build(e.config,t)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGrid,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifGrid,isStandalone:!0,selector:"aif-grid",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},providers:[DatePipe,CurrencyPipe,DecimalPipe],viewQueries:[{propertyName:"sentinel",first:!0,predicate:["sentinel"],descendants:!0,isSignal:!0},{propertyName:"aifModal",first:!0,predicate:AifModal,descendants:!0,isSignal:!0},{propertyName:"aifForm",first:!0,predicate:AifForm,descendants:!0,isSignal:!0},{propertyName:"aifFormStep",first:!0,predicate:AifFormStep,descendants:!0,isSignal:!0}],ngImport:i0,template:'<div class="aif-grid w-full">\n \n @if (hasHeader()) {\n <header class="mb-6 text-center">\n <h3 class="text-2xl font-bold text-slate-900 dark:text-white">\n {{ header().table_title || header().title }}\n </h3>\n @if (header().line) {\n <hr class="mt-4 border-slate-200 dark:border-slate-800" />\n }\n </header>\n }\n\n @if (navbar() && (navbar().left?.length || navbar().right?.length || navbar().center?.length)) {\n <div class="mb-6">\n <aif-nav-bar [config]="navbar()"></aif-nav-bar>\n </div>\n }\n\n <div class="grid gap-3 sm:gap-6 px-0" style="grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));">\n @for (item of items(); track $index) {\n <article class="group relative flex flex-col overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm transition-all hover:shadow-md dark:border-slate-800 dark:bg-slate-900/50">\n \n \x3c!-- Image Area --\x3e\n <div class="aspect-video overflow-hidden bg-slate-100 dark:bg-slate-800 relative">\n @if (item._grid.resolvedImage) {\n <img [src]="item._grid.resolvedImage" \n class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-110" \n [alt]="item._grid.title" />\n } @else {\n <div class="flex h-full w-full items-center justify-center text-slate-400 dark:text-slate-600">\n <i class="aif aif-image-ico text-4xl"></i>\n </div>\n }\n\n \x3c!-- Overlay Buttons (Center) --\x3e\n @if (item._grid.buttons.center?.length) {\n <div class="absolute inset-0 flex items-center justify-center bg-slate-900/40 opacity-0 transition-opacity duration-300 group-hover:opacity-100 backdrop-blur-[2px]">\n @for (btn of item._grid.buttons.center; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [class]="btn.resolvedClass || \'bg-white text-slate-900 hover:bg-slate-50 dark:bg-slate-800 dark:text-white dark:hover:bg-slate-700\'"\n class="rounded-lg px-4 py-2 text-sm font-bold shadow-xl transition-all active:scale-95">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon" class="mr-2"></i> }\n {{ btn.resolvedLabel || \'Abrir\' }}\n </button>\n }\n </div>\n }\n\n \x3c!-- Top Left Buttons --\x3e\n <div class="absolute left-2 top-2 flex flex-col gap-2">\n @for (btn of item._grid.buttons.top_left; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [title]="btn.resolvedLabel || \'\'"\n [class]="btn.resolvedClass || \'bg-white/90 text-slate-700 dark:bg-slate-900/80 dark:text-slate-300\'"\n class="flex h-8 min-w-[32px] items-center justify-center rounded-lg shadow-sm backdrop-blur-sm transition-all hover:bg-white hover:text-primary-600 dark:hover:text-primary-400">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon"></i> }\n @else { <span class="px-1 text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n </div>\n\n \x3c!-- Top Right Buttons --\x3e\n <div class="absolute right-2 top-2 flex flex-col gap-2">\n @for (btn of item._grid.buttons.top_right; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [title]="btn.resolvedLabel || \'\'"\n [class]="btn.resolvedClass || \'bg-white/90 text-slate-700 dark:bg-slate-900/80 dark:text-slate-300\'"\n class="flex h-8 min-w-[32px] items-center justify-center rounded-lg shadow-sm backdrop-blur-sm transition-all hover:bg-white hover:text-danger-600 dark:hover:text-danger-400">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon"></i> }\n @else { <span class="px-1 text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n </div>\n </div>\n\n \x3c!-- Content Area --\x3e\n <div class="flex flex-1 flex-col p-4">\n @if (item._grid.title) {\n <h3 class="text-base font-bold text-slate-900 dark:text-white group-hover:text-primary-600 dark:group-hover:text-primary-400 transition-colors line-clamp-1">\n <a href="#" (click)="handleItemClick($event, item)">{{ item._grid.title }}</a>\n </h3>\n }\n \n @if (item._grid.description) {\n <p class="mt-2 line-clamp-2 text-xs text-slate-500 dark:text-slate-400 leading-relaxed overflow-hidden">\n {{ item._grid.description }}\n </p>\n }\n\n \x3c!-- Bottom Meta & Positioning Buttons --\x3e\n <div class="mt-auto pt-4 flex items-center justify-between pointer-events-none">\n \n \x3c!-- Left Side: Tag & Bottom Left Button --\x3e\n <div class="flex items-center gap-2 pointer-events-auto">\n @for (btn of item._grid.buttons.bottom_left; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [class]="btn.resolvedClass || \'text-slate-400 hover:text-primary-600\'"\n class="transition-colors">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon" class="text-sm"></i> }\n @else { <span class="text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n @if (item._grid.tag) {\n <span class="inline-flex items-center rounded-md bg-primary-50 px-2 py-1 text-[10px] font-bold text-primary-700 ring-1 ring-inset ring-primary-700/10 dark:bg-primary-900/20 dark:text-primary-400 dark:ring-primary-400/20">\n {{ item._grid.tag }}\n </span>\n }\n </div>\n\n \x3c!-- Right Side: Status & Bottom Right Button --\x3e\n <div class="flex items-center gap-2 pointer-events-auto">\n @if (item._grid.status) {\n <span class="text-[10px] font-semibold text-slate-400 dark:text-slate-500 italic">\n {{ item._grid.status }}\n </span>\n }\n @for (btn of item._grid.buttons.bottom_right; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [class]="btn.resolvedClass || \'text-slate-400 hover:text-primary-600\'"\n class="transition-colors">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon" class="text-sm"></i> }\n @else { <span class="text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n </div>\n </div>\n\n </div>\n </article>\n }\n </div>\n\n \x3c!-- Sentinel for Infinite Scroll --\x3e\n <div #sentinel class="h-10 w-full flex items-center justify-center mt-4">\n @if (loadingMore()) {\n <div class="flex items-center gap-2 text-slate-400">\n <svg class="animate-spin h-5 w-5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">\n <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>\n <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>\n </svg>\n <span class="text-xs font-medium">Cargando más resultados...</span>\n </div>\n }\n </div>\n\n @if (hasFooter()) {\n <footer class="mt-12 text-center text-slate-500 dark:text-slate-400 pb-8">\n <p class="text-sm">\n {{ footer().table_title || footer().title }}\n </p>\n @if (footer().line) {\n <hr class="mt-4 border-slate-200 dark:border-slate-800" />\n }\n </footer>\n }\n\n @if (navbar_bottom() && (navbar_bottom().left?.length || navbar_bottom().right?.length || navbar_bottom().center?.length)) {\n <div class="mt-6">\n <aif-nav-bar [config]="navbar_bottom()"></aif-nav-bar>\n </div>\n }\n</div>\n\n<aif-modal>\n <aif-form></aif-form>\n <aif-form-step></aif-form-step>\n</aif-modal>\n',dependencies:[{kind:"component",type:AifNavBar,selector:"aif-nav-bar",inputs:["config","side"],outputs:["onInit"]},{kind:"component",type:AifModal,selector:"aif-modal",inputs:["config"]},{kind:"component",type:AifForm,selector:"aif-form",inputs:["config"]},{kind:"component",type:AifFormStep,selector:"aif-form-step",inputs:["config"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGrid,decorators:[{type:Component,args:[{selector:"aif-grid",standalone:!0,imports:[AifNavBar,AifModal,AifForm,AifFormStep],providers:[DatePipe,CurrencyPipe,DecimalPipe],schemas:[NO_ERRORS_SCHEMA],template:'<div class="aif-grid w-full">\n \n @if (hasHeader()) {\n <header class="mb-6 text-center">\n <h3 class="text-2xl font-bold text-slate-900 dark:text-white">\n {{ header().table_title || header().title }}\n </h3>\n @if (header().line) {\n <hr class="mt-4 border-slate-200 dark:border-slate-800" />\n }\n </header>\n }\n\n @if (navbar() && (navbar().left?.length || navbar().right?.length || navbar().center?.length)) {\n <div class="mb-6">\n <aif-nav-bar [config]="navbar()"></aif-nav-bar>\n </div>\n }\n\n <div class="grid gap-3 sm:gap-6 px-0" style="grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));">\n @for (item of items(); track $index) {\n <article class="group relative flex flex-col overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm transition-all hover:shadow-md dark:border-slate-800 dark:bg-slate-900/50">\n \n \x3c!-- Image Area --\x3e\n <div class="aspect-video overflow-hidden bg-slate-100 dark:bg-slate-800 relative">\n @if (item._grid.resolvedImage) {\n <img [src]="item._grid.resolvedImage" \n class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-110" \n [alt]="item._grid.title" />\n } @else {\n <div class="flex h-full w-full items-center justify-center text-slate-400 dark:text-slate-600">\n <i class="aif aif-image-ico text-4xl"></i>\n </div>\n }\n\n \x3c!-- Overlay Buttons (Center) --\x3e\n @if (item._grid.buttons.center?.length) {\n <div class="absolute inset-0 flex items-center justify-center bg-slate-900/40 opacity-0 transition-opacity duration-300 group-hover:opacity-100 backdrop-blur-[2px]">\n @for (btn of item._grid.buttons.center; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [class]="btn.resolvedClass || \'bg-white text-slate-900 hover:bg-slate-50 dark:bg-slate-800 dark:text-white dark:hover:bg-slate-700\'"\n class="rounded-lg px-4 py-2 text-sm font-bold shadow-xl transition-all active:scale-95">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon" class="mr-2"></i> }\n {{ btn.resolvedLabel || \'Abrir\' }}\n </button>\n }\n </div>\n }\n\n \x3c!-- Top Left Buttons --\x3e\n <div class="absolute left-2 top-2 flex flex-col gap-2">\n @for (btn of item._grid.buttons.top_left; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [title]="btn.resolvedLabel || \'\'"\n [class]="btn.resolvedClass || \'bg-white/90 text-slate-700 dark:bg-slate-900/80 dark:text-slate-300\'"\n class="flex h-8 min-w-[32px] items-center justify-center rounded-lg shadow-sm backdrop-blur-sm transition-all hover:bg-white hover:text-primary-600 dark:hover:text-primary-400">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon"></i> }\n @else { <span class="px-1 text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n </div>\n\n \x3c!-- Top Right Buttons --\x3e\n <div class="absolute right-2 top-2 flex flex-col gap-2">\n @for (btn of item._grid.buttons.top_right; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [title]="btn.resolvedLabel || \'\'"\n [class]="btn.resolvedClass || \'bg-white/90 text-slate-700 dark:bg-slate-900/80 dark:text-slate-300\'"\n class="flex h-8 min-w-[32px] items-center justify-center rounded-lg shadow-sm backdrop-blur-sm transition-all hover:bg-white hover:text-danger-600 dark:hover:text-danger-400">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon"></i> }\n @else { <span class="px-1 text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n </div>\n </div>\n\n \x3c!-- Content Area --\x3e\n <div class="flex flex-1 flex-col p-4">\n @if (item._grid.title) {\n <h3 class="text-base font-bold text-slate-900 dark:text-white group-hover:text-primary-600 dark:group-hover:text-primary-400 transition-colors line-clamp-1">\n <a href="#" (click)="handleItemClick($event, item)">{{ item._grid.title }}</a>\n </h3>\n }\n \n @if (item._grid.description) {\n <p class="mt-2 line-clamp-2 text-xs text-slate-500 dark:text-slate-400 leading-relaxed overflow-hidden">\n {{ item._grid.description }}\n </p>\n }\n\n \x3c!-- Bottom Meta & Positioning Buttons --\x3e\n <div class="mt-auto pt-4 flex items-center justify-between pointer-events-none">\n \n \x3c!-- Left Side: Tag & Bottom Left Button --\x3e\n <div class="flex items-center gap-2 pointer-events-auto">\n @for (btn of item._grid.buttons.bottom_left; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [class]="btn.resolvedClass || \'text-slate-400 hover:text-primary-600\'"\n class="transition-colors">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon" class="text-sm"></i> }\n @else { <span class="text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n @if (item._grid.tag) {\n <span class="inline-flex items-center rounded-md bg-primary-50 px-2 py-1 text-[10px] font-bold text-primary-700 ring-1 ring-inset ring-primary-700/10 dark:bg-primary-900/20 dark:text-primary-400 dark:ring-primary-400/20">\n {{ item._grid.tag }}\n </span>\n }\n </div>\n\n \x3c!-- Right Side: Status & Bottom Right Button --\x3e\n <div class="flex items-center gap-2 pointer-events-auto">\n @if (item._grid.status) {\n <span class="text-[10px] font-semibold text-slate-400 dark:text-slate-500 italic">\n {{ item._grid.status }}\n </span>\n }\n @for (btn of item._grid.buttons.bottom_right; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [class]="btn.resolvedClass || \'text-slate-400 hover:text-primary-600\'"\n class="transition-colors">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon" class="text-sm"></i> }\n @else { <span class="text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n </div>\n </div>\n\n </div>\n </article>\n }\n </div>\n\n \x3c!-- Sentinel for Infinite Scroll --\x3e\n <div #sentinel class="h-10 w-full flex items-center justify-center mt-4">\n @if (loadingMore()) {\n <div class="flex items-center gap-2 text-slate-400">\n <svg class="animate-spin h-5 w-5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">\n <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>\n <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>\n </svg>\n <span class="text-xs font-medium">Cargando más resultados...</span>\n </div>\n }\n </div>\n\n @if (hasFooter()) {\n <footer class="mt-12 text-center text-slate-500 dark:text-slate-400 pb-8">\n <p class="text-sm">\n {{ footer().table_title || footer().title }}\n </p>\n @if (footer().line) {\n <hr class="mt-4 border-slate-200 dark:border-slate-800" />\n }\n </footer>\n }\n\n @if (navbar_bottom() && (navbar_bottom().left?.length || navbar_bottom().right?.length || navbar_bottom().center?.length)) {\n <div class="mt-6">\n <aif-nav-bar [config]="navbar_bottom()"></aif-nav-bar>\n </div>\n }\n</div>\n\n<aif-modal>\n <aif-form></aif-form>\n <aif-form-step></aif-form-step>\n</aif-modal>\n'}]}],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],sentinel:[{type:i0.ViewChild,args:["sentinel",{isSignal:!0}]}],aifModal:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifModal),{isSignal:!0}]}],aifForm:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifForm),{isSignal:!0}]}],aifFormStep:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifFormStep),{isSignal:!0}]}]}});class AifNavTab{onInit=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);title=signal("",...ngDevMode?[{debugName:"title"}]:[]);id=signal("",...ngDevMode?[{debugName:"id"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);tabList=viewChild("tabList",...ngDevMode?[{debugName:"tabList"}]:[]);canScrollLeft=signal(!1,...ngDevMode?[{debugName:"canScrollLeft"}]:[]);canScrollRight=signal(!1,...ngDevMode?[{debugName:"canScrollRight"}]:[]);selectedIndex=signal(0,...ngDevMode?[{debugName:"selectedIndex"}]:[]);currentComponent=signal(null,...ngDevMode?[{debugName:"currentComponent"}]:[]);currentConfig=signal({},...ngDevMode?[{debugName:"currentConfig"}]:[]);state=computed(()=>{const e=this.cfg(),t=this.config()??{};return e&&Object.keys(e).length>0?{...t,...e}:t},...ngDevMode?[{debugName:"state"}]:[]);wrapperClass=computed(()=>this.state().class??"",...ngDevMode?[{debugName:"wrapperClass"}]:[]);headerClass=computed(()=>this.state().headerClass??"flex flex-col gap-4 px-2 pt-4 md:px-6 md:flex-row md:items-end mb-0",...ngDevMode?[{debugName:"headerClass"}]:[]);bodyClass=computed(()=>this.state().bodyClass??"rounded-lg border border-slate-200 bg-slate-100 px-0 py-4 sm:px-6 sm:py-6 dark:border-slate-700/50 dark:bg-slate-900/50",...ngDevMode?[{debugName:"bodyClass"}]:[]);titleClass=computed(()=>this.state().titleClass??"hidden max-w-[300px] truncate pb-4 text-base font-semibold text-slate-900 dark:text-white md:block",...ngDevMode?[{debugName:"titleClass"}]:[]);tabListClass=computed(()=>this.state().tabListClass??"flex overflow-x-auto scrollbar-hide flex-nowrap gap-0 -mb-px",...ngDevMode?[{debugName:"tabListClass"}]:[]);tabClass=computed(()=>this.state().tabClass??"inline-flex items-center gap-2 border border-transparent px-3 py-2 sm:px-5 sm:py-2.5 text-sm font-semibold transition-colors focus:outline-none rounded-t-md",...ngDevMode?[{debugName:"tabClass"}]:[]);tabActiveClass=computed(()=>this.state().tabActiveClass??"border-slate-200 border-b-transparent bg-slate-100 text-primary-600 dark:border-slate-700/50 dark:border-b-transparent dark:bg-slate-900/50 dark:text-primary-400",...ngDevMode?[{debugName:"tabActiveClass"}]:[]);tabInactiveClass=computed(()=>this.state().tabInactiveClass??"text-slate-500 hover:text-slate-700 dark:text-slate-400 dark:hover:text-slate-200",...ngDevMode?[{debugName:"tabInactiveClass"}]:[]);tabs=computed(()=>{const e=this.state().tabs??[],t=this.selectedIndex();return e.map((e,n)=>{const i=e.id||n.toString(),a=e.id||`tab-${n}`;return{...e,index:n,tabId:a,buttonId:`aif-tab-btn-${i}`,panelId:`aif-tab-panel-${i}`,trackId:`aif-tab-track-${i}`,isActive:t===n,resolvedName:e.name||e.title||"",resolvedTitle:e.title||e.name||""}})},...ngDevMode?[{debugName:"tabs"}]:[]);activeTab=computed(()=>this.tabs()[this.selectedIndex()]??null,...ngDevMode?[{debugName:"activeTab"}]:[]);activeDynamicConfig=computed(()=>({...this.currentConfig()??{},component:this.currentComponent()}),...ngDevMode?[{debugName:"activeDynamicConfig"}]:[]);constructor(){effect(()=>{const e=this.config();this.createFunctions(e),e&&0!==Object.keys(e).length&&(this.isBuilt()?this.cfg.set(e):this.build(e))})}ngAfterViewInit(){queueMicrotask(()=>this.onInit.emit()),setTimeout(()=>this.checkScrollState(),100)}onResize(){this.checkScrollState()}checkScrollState(){const e=this.tabList()?.nativeElement;if(!e)return;const{scrollLeft:t,scrollWidth:n,clientWidth:i}=e;this.canScrollLeft.set(t>10),this.canScrollRight.set(t+i<n-10)}scrollTabs(e){const t=this.tabList()?.nativeElement;if(!t)return;const n=.8*t.clientWidth;t.scrollBy({left:"left"===e?-n:n,behavior:"smooth"})}selTab(e=0){this.selectTab(e)}reBuild(e={},t=null){this.isBuilt.set(!1),this.cfg.set({}),this.title.set(""),this.id.set(""),this.currentComponent.set(null),this.currentConfig.set({}),this.selectedIndex.set(0),this.build(e,t)}build(e={},t=null){if(!e||this.isBuilt()&&this.cfg()===e)return;const n=e||{};this.isBuilt.set(!0),this.cfg.set(n),this.createFunctions(n);const i=this.tab_selected(t,n);null!==i&&this.selTab(i)}tab_selected(e,t){if(null!=e)return e;if(null!=t?.active_tab)return t.active_tab;const n=t?.tabs??[];for(let e=0;e<n.length;e++)if(n[e]?.active)return e;return 0}onTab(e){if(!e)return;this.title.set(e.title||""),this.id.set(e.id||e.name||"");const t={...e.config??{},id:e.config?.id??e.id??e.name??""};this.loadComponent(e.component||this.state().component||null,t)}loadBuild(e,t={}){e?.build?.(t)}loadComponent(e,t={}){this.currentComponent()===e&&JSON.stringify(this.currentConfig())===JSON.stringify(t)||(this.currentComponent.set(e),this.currentConfig.set(t||{}))}selectTab(e){const t=this.tabs();if(0===t.length)return;const n=t[e];n&&!n.disabled&&(this.selectedIndex.set(e),this.onTab(n))}createFunctions(e=this.config()){e&&(e.build=(e={},t=null)=>this.build(e,t),e.reBuild=(e={},t=null)=>this.reBuild(e,t),e.selTab=(e=0)=>this.selTab(e),e.onTab=e=>this.onTab(e))}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavTab,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavTab,isStandalone:!0,selector:"aif-nav-tab, aif-nav-tabs",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},host:{listeners:{"window:resize":"onResize()"}},viewQueries:[{propertyName:"tabList",first:!0,predicate:["tabList"],descendants:!0,isSignal:!0}],ngImport:i0,template:'<div [class]="wrapperClass()">\n <div [class]="headerClass()">\n @if (title()) {\n <h5 [class]="titleClass()">\n {{ title() }}\n </h5>\n }\n\n <div class="group relative flex w-full items-center md:ml-auto md:w-auto">\n @if (canScrollLeft()) {\n <button\n type="button"\n (click)="scrollTabs(\'left\')"\n class="scroll-btn left-0 h-full bg-gradient-to-r from-slate-100 to-transparent dark:from-slate-900"\n aria-label="Scroll left"\n >\n <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />\n </svg>\n </button>\n }\n\n <div\n #tabList\n [class]="tabListClass()"\n role="tablist"\n aria-orientation="horizontal"\n (scroll)="checkScrollState()"\n >\n @for (tab of tabs(); track tab.trackId) {\n <button\n type="button"\n role="tab"\n [class]="tabClass() + \' \' + (tab.isActive ? tabActiveClass() : tabInactiveClass()) + \' \' + (tab.class || \'\')"\n [class.opacity-50]="tab.disabled"\n [class.cursor-not-allowed]="tab.disabled"\n [attr.id]="tab.buttonId"\n [attr.aria-controls]="tab.panelId"\n [attr.aria-selected]="tab.isActive"\n [disabled]="tab.disabled"\n (click)="selectTab(tab.index)"\n >\n @if (tab.icon) {\n <i [class]="tab.icon"></i>\n }\n <span>{{ tab.resolvedName }}</span>\n\n @if (tab.badge !== undefined && tab.badge !== null && tab.badge !== \'\') {\n <span\n class="inline-flex min-w-6 items-center justify-center rounded-full px-2 py-0.5 text-xs font-semibold"\n [class.bg-white/20]="tab.isActive"\n [class.text-white]="tab.isActive"\n [class.bg-slate-100]="!tab.isActive"\n [class.text-slate-700]="!tab.isActive"\n >\n {{ tab.badge }}\n </span>\n }\n </button>\n }\n </div>\n\n @if (canScrollRight()) {\n <button\n type="button"\n (click)="scrollTabs(\'right\')"\n class="scroll-btn right-0 h-full bg-gradient-to-l from-slate-100 to-transparent dark:from-slate-900"\n aria-label="Scroll right"\n >\n <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />\n </svg>\n </button>\n }\n </div>\n </div>\n\n <div\n [class]="bodyClass()"\n [attr.id]="activeTab()?.panelId || null"\n [attr.aria-labelledby]="activeTab()?.buttonId || null"\n role="tabpanel"\n >\n <aif-accordion-dynamic [config]="activeDynamicConfig()"></aif-accordion-dynamic>\n </div>\n</div>\n',styles:[":host{display:block}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none;scroll-behavior:smooth}.scroll-btn{position:absolute;z-index:20;display:flex;width:2.5rem;align-items:center;justify-content:center;color:#64748b;transition:all .3s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;top:0;bottom:0}.scroll-btn:hover{color:var(--primary-600, #2563eb);transform:scale(1.1)}:host-context(.dark) .scroll-btn{color:#94a3b8}:host-context(.dark) .scroll-btn:hover{color:var(--primary-400, #60a5fa)}.scroll-btn svg{filter:drop-shadow(0 0 2px rgba(0,0,0,.1))}button[role=tab] i{font-size:1.1em;line-height:1;margin-right:.5rem;margin-left:-.25rem}\n"],dependencies:[{kind:"component",type:AifAccordionDynamic,selector:"aif-accordion-dynamic",inputs:["config"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavTab,decorators:[{type:Component,args:[{selector:"aif-nav-tab, aif-nav-tabs",standalone:!0,imports:[AifAccordionDynamic],template:'<div [class]="wrapperClass()">\n <div [class]="headerClass()">\n @if (title()) {\n <h5 [class]="titleClass()">\n {{ title() }}\n </h5>\n }\n\n <div class="group relative flex w-full items-center md:ml-auto md:w-auto">\n @if (canScrollLeft()) {\n <button\n type="button"\n (click)="scrollTabs(\'left\')"\n class="scroll-btn left-0 h-full bg-gradient-to-r from-slate-100 to-transparent dark:from-slate-900"\n aria-label="Scroll left"\n >\n <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />\n </svg>\n </button>\n }\n\n <div\n #tabList\n [class]="tabListClass()"\n role="tablist"\n aria-orientation="horizontal"\n (scroll)="checkScrollState()"\n >\n @for (tab of tabs(); track tab.trackId) {\n <button\n type="button"\n role="tab"\n [class]="tabClass() + \' \' + (tab.isActive ? tabActiveClass() : tabInactiveClass()) + \' \' + (tab.class || \'\')"\n [class.opacity-50]="tab.disabled"\n [class.cursor-not-allowed]="tab.disabled"\n [attr.id]="tab.buttonId"\n [attr.aria-controls]="tab.panelId"\n [attr.aria-selected]="tab.isActive"\n [disabled]="tab.disabled"\n (click)="selectTab(tab.index)"\n >\n @if (tab.icon) {\n <i [class]="tab.icon"></i>\n }\n <span>{{ tab.resolvedName }}</span>\n\n @if (tab.badge !== undefined && tab.badge !== null && tab.badge !== \'\') {\n <span\n class="inline-flex min-w-6 items-center justify-center rounded-full px-2 py-0.5 text-xs font-semibold"\n [class.bg-white/20]="tab.isActive"\n [class.text-white]="tab.isActive"\n [class.bg-slate-100]="!tab.isActive"\n [class.text-slate-700]="!tab.isActive"\n >\n {{ tab.badge }}\n </span>\n }\n </button>\n }\n </div>\n\n @if (canScrollRight()) {\n <button\n type="button"\n (click)="scrollTabs(\'right\')"\n class="scroll-btn right-0 h-full bg-gradient-to-l from-slate-100 to-transparent dark:from-slate-900"\n aria-label="Scroll right"\n >\n <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />\n </svg>\n </button>\n }\n </div>\n </div>\n\n <div\n [class]="bodyClass()"\n [attr.id]="activeTab()?.panelId || null"\n [attr.aria-labelledby]="activeTab()?.buttonId || null"\n role="tabpanel"\n >\n <aif-accordion-dynamic [config]="activeDynamicConfig()"></aif-accordion-dynamic>\n </div>\n</div>\n',styles:[":host{display:block}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none;scroll-behavior:smooth}.scroll-btn{position:absolute;z-index:20;display:flex;width:2.5rem;align-items:center;justify-content:center;color:#64748b;transition:all .3s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;top:0;bottom:0}.scroll-btn:hover{color:var(--primary-600, #2563eb);transform:scale(1.1)}:host-context(.dark) .scroll-btn{color:#94a3b8}:host-context(.dark) .scroll-btn:hover{color:var(--primary-400, #60a5fa)}.scroll-btn svg{filter:drop-shadow(0 0 2px rgba(0,0,0,.1))}button[role=tab] i{font-size:1.1em;line-height:1;margin-right:.5rem;margin-left:-.25rem}\n"]}]}],ctorParameters:()=>[],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],tabList:[{type:i0.ViewChild,args:["tabList",{isSignal:!0}]}],onResize:[{type:HostListener,args:["window:resize"]}]}});export{AIF_THEME,AIF_THEME_DARK,AIF_THEME_LIGHT,AifAccordion,AifAlert,AifBackFooter,AifBackNavHeader as AifBackHeader,AifBackNavHeader,AifCookies,AifCreate,AifDropDown,AifDropDownItem,AifEmbed,AifForm,AifFormStep,AifFrontFooter,AifPageHero as AifFrontHeader,AifPageHeroSearch as AifFrontHeaderSearch,AifFrontNavHeader,AifGoBack,AifGoTop,AifGoUp,AifGrid,AifLoading,AifMenu,AifModal,AifNavActionButton,AifNavBar,AifPageHeader as AifNavHead,AifBackNavHeader as AifNavHeader,AifNavLangDropDown,AifNavLogo,AifNavNotificationDropdown,AifNavSearch,AifNavTab,AifNavUserDropDown,AifPageHeader,AifPageHero,AifPageHeroSearch,AifPagination,AifSafeHtmlPipe,AifSection,AifSectionNav,AifSectionSummary,AifSectionVideo,AifSideBar,AifSideBarService,AifSliderBar,AifSliderFull,AifTable,AifThemeService,AifThemeSwitcher,AifThemeToggle,form_prebuild,menu_delete,menu_divider,menu_edit,menu_option,valid_builds,valid_messages};
1
+ import*as i0 from"@angular/core";import{Pipe,signal,computed,Injectable,input,effect,Component,output,viewChild,HostListener,inject,DestroyRef,PLATFORM_ID,Inject,afterRenderEffect,ViewContainerRef,Injector,ChangeDetectionStrategy,ViewEncapsulation,ChangeDetectorRef,ViewChild,untracked,viewChildren,NO_ERRORS_SCHEMA}from"@angular/core";import*as i1 from"@angular/platform-browser";import{DomSanitizer}from"@angular/platform-browser";import{local_set,local_get,cookies_state,lang_subscribe,cookies_state_subscribe,unsubscribe,cookies_accept_set,cookies_reject_set,lang,rq_get,wHttp,str_replace_vars,env,loading_subscribe,obj_compact,field_evaluate,lang_set,storage,session,navigate,obj_empty,format_title_html,format_zero,AifSafeUrlPipe,rq_req,str_to_normalize,str_replace_field,loading,date_compare,date_local,obj_val_text_cat,date_now,date_time,lang_load,fx_resolve,wGet,loading_close,obj_fields_join,rq_sanitize_method,json_hierarchy_val,section}from"@anemona/aif-core";import*as i1$1 from"@angular/router";import{RouterLink,RouterModule,Router,NavigationEnd}from"@angular/router";import{NgClass,NgStyle,NgTemplateOutlet,CommonModule,isPlatformBrowser,DatePipe,CurrencyPipe,DecimalPipe}from"@angular/common";import*as i1$2 from"@angular/forms";import{FormsModule,ReactiveFormsModule,Validators,FormControl,FormBuilder}from"@angular/forms";import{filter}from"rxjs/operators";import{register}from"swiper/element/bundle";import Swiper from"swiper";import*as i2 from"@ng-select/ng-select";import{NgSelectModule}from"@ng-select/ng-select";import{msg}from"@anemona/aif-message";class AifSafeHtmlPipe{sanitizer;constructor(e){this.sanitizer=e}transform(e){return this.sanitizer.bypassSecurityTrustHtml(e)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSafeHtmlPipe,deps:[{token:i1.DomSanitizer}],target:i0.ɵɵFactoryTarget.Pipe});static"ɵpipe"=i0.ɵɵngDeclarePipe({minVersion:"14.0.0",version:"21.1.1",ngImport:i0,type:AifSafeHtmlPipe,isStandalone:!0,name:"aifSafeHtml"})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSafeHtmlPipe,decorators:[{type:Pipe,args:[{name:"aifSafeHtml"}]}],ctorParameters:()=>[{type:i1.DomSanitizer}]});class AifSideBarService{isExpanded=signal(!0,...ngDevMode?[{debugName:"isExpanded"}]:[]);isMobileOpen=signal(!1,...ngDevMode?[{debugName:"isMobileOpen"}]:[]);isHovered=signal(!1,...ngDevMode?[{debugName:"isHovered"}]:[]);isWide=computed(()=>this.isExpanded()||this.isHovered(),...ngDevMode?[{debugName:"isWide"}]:[]);setExpanded(e){this.isExpanded.set(e)}toggleExpanded(){this.isExpanded.update(e=>!e)}setMobileOpen(e=!1){this.isMobileOpen.set(e)}toggleMobileOpen(){this.isMobileOpen.update(e=>!e)}setHovered(e=!1){this.isHovered.set(e)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSideBarService,deps:[],target:i0.ɵɵFactoryTarget.Injectable});static"ɵprov"=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSideBarService,providedIn:"root"})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSideBarService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}]});const AIF_THEME="aif-theme",AIF_THEME_DARK="dark",AIF_THEME_LIGHT="light";class AifThemeService{theme=signal(this.getInitialTheme(),...ngDevMode?[{debugName:"theme"}]:[]);isDark=computed(()=>"dark"===this.theme(),...ngDevMode?[{debugName:"isDark"}]:[]);isLight=computed(()=>"light"===this.theme(),...ngDevMode?[{debugName:"isLight"}]:[]);constructor(){this.init()}init(){this.apply(this.getInitialTheme())}toggle(){this.set("light"===this.theme()?"dark":"light")}set(e){this.theme.set(e),local_set(AIF_THEME,e),this.apply(e)}apply(e){const t="dark"===e;document.documentElement.classList.toggle("dark",t),document.body.classList.toggle("dark:bg-gray-900",t)}getInitialTheme(){const e=local_get(AIF_THEME);return"dark"===e||"light"===e?e:"light"}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeService,deps:[],target:i0.ɵɵFactoryTarget.Injectable});static"ɵprov"=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeService,providedIn:"root"})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}],ctorParameters:()=>[]});class AifCookies{config=input({},...ngDevMode?[{debugName:"config"}]:[]);active=signal(cookies_state(),...ngDevMode?[{debugName:"active"}]:[]);cfg=signal(void 0,...ngDevMode?[{debugName:"cfg"}]:[]);title=computed(()=>this.cfg()?.title||"",...ngDevMode?[{debugName:"title"}]:[]);description=computed(()=>this.cfg()?.description||"",...ngDevMode?[{debugName:"description"}]:[]);policy=computed(()=>this.cfg()?.policy||{label:"",link:""},...ngDevMode?[{debugName:"policy"}]:[]);accept=computed(()=>this.cfg()?.accept||"",...ngDevMode?[{debugName:"accept"}]:[]);reject=computed(()=>this.cfg()?.reject||"",...ngDevMode?[{debugName:"reject"}]:[]);_sub_ang;_sub_cookie;constructor(){effect(()=>{const e=this.config();this.cfg.set(AifCookies.config(e||{}))})}ngOnInit(){this._sub_ang=lang_subscribe("change",()=>{this.cfg.set(AifCookies.config(this.config()||{}))}),this._sub_cookie=cookies_state_subscribe(e=>{this.active.set(e)})}ngOnDestroy(){unsubscribe(this._sub_ang),unsubscribe(this._sub_cookie)}acceptCookies(){this.active.set(cookies_accept_set())}rejectCookies(){this.active.set(cookies_reject_set())}build(e){const t=AifCookies.config(e);this.cfg.set(t)}static config(e){return{title:lang("cookies-title"),description:lang("cookies-description"),policy:{label:lang("cookies-policy"),link:"/cookies"},accept:lang("cookies-accept"),reject:lang("cookies-reject"),...e}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifCookies,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifCookies,isStandalone:!0,selector:"aif-cookies",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (active()===0 && cfg()) {\n<div\n class="cookie-popup fixed max-w-lg bottom-3 end-3 start-3 sm:start-0 mx-auto bg-white dark:bg-slate-900 shadow-sm dark:shadow-gray-800 rounded-md py-5 px-6 z-50">\n <p class="text-slate-400">{{ description()}} <a [routerLink]="policy().link" target="_blank"\n class="text-emerald-600 dark:text-emerald-500 font-semibold">{{ policy().label }}</a></p>\n <div class="cookie-popup-actions text-end mt-3 flex gap-3 justify-end">\n\n <button (click)="rejectCookies()"\n class="px-4 py-2 text-sm font-semibold text-slate-600 dark:text-slate-300 border border-slate-300 dark:border-slate-600 rounded-md hover:bg-slate-300 dark:hover:bg-slate-800 transition-colors">\n {{ reject() }}\n </button>\n\n <button (click)="acceptCookies()"\n class="px-4 py-2 text-sm font-semibold text-white bg-emerald-600 rounded-md hover:bg-emerald-700 transition-colors shadow-sm">\n {{ accept() }}\n </button>\n </div>\n</div>\n}',styles:[""],dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifCookies,decorators:[{type:Component,args:[{selector:"aif-cookies",standalone:!0,imports:[RouterLink],template:'@if (active()===0 && cfg()) {\n<div\n class="cookie-popup fixed max-w-lg bottom-3 end-3 start-3 sm:start-0 mx-auto bg-white dark:bg-slate-900 shadow-sm dark:shadow-gray-800 rounded-md py-5 px-6 z-50">\n <p class="text-slate-400">{{ description()}} <a [routerLink]="policy().link" target="_blank"\n class="text-emerald-600 dark:text-emerald-500 font-semibold">{{ policy().label }}</a></p>\n <div class="cookie-popup-actions text-end mt-3 flex gap-3 justify-end">\n\n <button (click)="rejectCookies()"\n class="px-4 py-2 text-sm font-semibold text-slate-600 dark:text-slate-300 border border-slate-300 dark:border-slate-600 rounded-md hover:bg-slate-300 dark:hover:bg-slate-800 transition-colors">\n {{ reject() }}\n </button>\n\n <button (click)="acceptCookies()"\n class="px-4 py-2 text-sm font-semibold text-white bg-emerald-600 rounded-md hover:bg-emerald-700 transition-colors shadow-sm">\n {{ accept() }}\n </button>\n </div>\n</div>\n}'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifDropDown{isOpen=input(!1,...ngDevMode?[{debugName:"isOpen"}]:[]);className=input("",...ngDevMode?[{debugName:"className"}]:[]);close=output();dropdownRef=viewChild("dropdownRef",...ngDevMode?[{debugName:"dropdownRef"}]:[]);isVisible=computed(()=>this.isOpen(),...ngDevMode?[{debugName:"isVisible"}]:[]);panelClass=computed(()=>["absolute z-40 right-0 mt-2 rounded-xl border border-gray-200 bg-white shadow-theme-lg dark:border-gray-800 dark:bg-gray-dark",this.className()].filter(Boolean).join(" "),...ngDevMode?[{debugName:"panelClass"}]:[]);onDocumentMouseDown(e){if(!this.isVisible())return;const t=this.dropdownRef()?.nativeElement,n=e.target;t&&n&&(t.contains(n)||n.closest(".dropdown-toggle")||this.close.emit())}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifDropDown,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifDropDown,isStandalone:!0,selector:"aif-dropdown",inputs:{isOpen:{classPropertyName:"isOpen",publicName:"isOpen",isSignal:!0,isRequired:!1,transformFunction:null},className:{classPropertyName:"className",publicName:"className",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{close:"close"},host:{listeners:{"document:mousedown":"onDocumentMouseDown($event)"}},viewQueries:[{propertyName:"dropdownRef",first:!0,predicate:["dropdownRef"],descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (isVisible()) {\n<div #dropdownRef\n [class]="panelClass()">\n <ng-content></ng-content>\n</div>\n}\n',styles:[""]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifDropDown,decorators:[{type:Component,args:[{selector:"aif-dropdown",standalone:!0,template:'@if (isVisible()) {\n<div #dropdownRef\n [class]="panelClass()">\n <ng-content></ng-content>\n</div>\n}\n'}]}],propDecorators:{isOpen:[{type:i0.Input,args:[{isSignal:!0,alias:"isOpen",required:!1}]}],className:[{type:i0.Input,args:[{isSignal:!0,alias:"className",required:!1}]}],close:[{type:i0.Output,args:["close"]}],dropdownRef:[{type:i0.ViewChild,args:["dropdownRef",{isSignal:!0}]}],onDocumentMouseDown:[{type:HostListener,args:["document:mousedown",["$event"]]}]}});class AifDropDownItem{to=input("",...ngDevMode?[{debugName:"to"}]:[]);baseClassName=input("block w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900",...ngDevMode?[{debugName:"baseClassName"}]:[]);className=input("",...ngDevMode?[{debugName:"className"}]:[]);itemClick=output();click=output();combinedClasses=computed(()=>[this.baseClassName(),this.className()].filter(Boolean).join(" ").trim(),...ngDevMode?[{debugName:"combinedClasses"}]:[]);handleClick(){this.click.emit(),this.itemClick.emit()}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifDropDownItem,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifDropDownItem,isStandalone:!0,selector:"aif-dropdown-item",inputs:{to:{classPropertyName:"to",publicName:"to",isSignal:!0,isRequired:!1,transformFunction:null},baseClassName:{classPropertyName:"baseClassName",publicName:"baseClassName",isSignal:!0,isRequired:!1,transformFunction:null},className:{classPropertyName:"className",publicName:"className",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{itemClick:"itemClick",click:"click"},ngImport:i0,template:'\n <a [routerLink]="to()" [class]="combinedClasses()" (click)="handleClick()">\n <ng-content></ng-content>\n </a>\n ',isInline:!0,dependencies:[{kind:"ngmodule",type:RouterModule},{kind:"directive",type:i1$1.RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifDropDownItem,decorators:[{type:Component,args:[{selector:"aif-dropdown-item",standalone:!0,imports:[RouterModule],template:'\n <a [routerLink]="to()" [class]="combinedClasses()" (click)="handleClick()">\n <ng-content></ng-content>\n </a>\n '}]}],propDecorators:{to:[{type:i0.Input,args:[{isSignal:!0,alias:"to",required:!1}]}],baseClassName:[{type:i0.Input,args:[{isSignal:!0,alias:"baseClassName",required:!1}]}],className:[{type:i0.Input,args:[{isSignal:!0,alias:"className",required:!1}]}],itemClick:[{type:i0.Output,args:["itemClick"]}],click:[{type:i0.Output,args:["click"]}]}});class AifFrontFooter{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);date=signal((new Date).getFullYear(),...ngDevMode?[{debugName:"date"}]:[]);text=signal(null,...ngDevMode?[{debugName:"text"}]:[]);social=signal([],...ngDevMode?[{debugName:"social"}]:[]);cfg=signal(null,...ngDevMode?[{debugName:"cfg"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);isLoading=signal(!1,...ngDevMode?[{debugName:"isLoading"}]:[]);isLoaded=signal(!1,...ngDevMode?[{debugName:"isLoaded"}]:[]);_subscribe;pendingBuildPromise=null;resolveBuildPromise=null;rejectBuildPromise=null;state=computed(()=>{const e=this.cfg(),t=this.config();return e?{...t??{},...e}:t??{}},...ngDevMode?[{debugName:"state"}]:[]);currentLang=computed(()=>this.state().lang||lang(),...ngDevMode?[{debugName:"currentLang"}]:[]);wrapperClass=computed(()=>this.state().class??"",...ngDevMode?[{debugName:"wrapperClass"}]:[]);logo=computed(()=>({src:this.state().logo?.src||"assets/images/logo/logo-light.png",alt:this.state().logo?.alt||"Logo",route:this.state().logo?.route||"/"}),...ngDevMode?[{debugName:"logo"}]:[]);constructor(){effect(()=>{const e=this.config();e&&0!==Object.keys(e).length&&(this.isBuilt()||this.build(e).catch(()=>null))})}ngOnInit(){this._subscribe=lang_subscribe("change",()=>{(this.state().watchLang||void 0===this.state().watchLang)&&this.isBuilt()&&this.reBuild(this.state()).catch(()=>null)})}ngOnDestroy(){this._subscribe?.unsubscribe?.()}build(e=null){return this.isBuilt()||(this.isBuilt.set(!0),this.cfg.set(e),this.createBuildPromise(),this.loadData()),this.whenLoaded()}reBuild(e=null){return this.reset(),this.build(e)}reset(){this.isBuilt.set(!1),this.isLoading.set(!1),this.isLoaded.set(!1),this.cfg.set(null),this.text.set(null),this.social.set([]),this.pendingBuildPromise=null,this.resolveBuildPromise=null,this.rejectBuildPromise=null}whenLoaded(){return this.isLoaded()?Promise.resolve(this.makeLoadedEvent()):(this.pendingBuildPromise||this.createBuildPromise(),this.pendingBuildPromise)}loadData(){const e=this.state(),t=this.currentLang(),n=this.resolveResource(e.resource,t),i=this.resolveResource(e.socialResource,t),a=n.includes(".json")||n.startsWith("assets/")||n.startsWith("./")||n.startsWith("../")||n.startsWith("http");if(this.isLoading.set(!0),this.isLoaded.set(!1),e.data||e.social)return this.text.set(e.data||null),this.social.set(Array.isArray(e.social)?e.social:[]),this.isLoading.set(!1),this.isLoaded.set(!0),void this.completeBuild();if(n&&!a)return void rq_get(n).then(e=>{const t=e?.data||e||{};this.text.set(t.footer||null),this.social.set(Array.isArray(t.social)?t.social:[]),this.isLoading.set(!1),this.isLoaded.set(!0),this.completeBuild()}).catch(e=>{this.handleLoadError(e)});const s=n?wHttp(n):Promise.resolve(null),o=i?wHttp(i):Promise.resolve([]);Promise.all([s,o]).then(([e,t])=>{this.text.set(e||null),this.social.set(Array.isArray(t)?t:[]),this.isLoading.set(!1),this.isLoaded.set(!0),this.completeBuild()}).catch(e=>{this.handleLoadError(e)})}resolveResource(e,t){return e?str_replace_vars(e,{lang:t}):""}createBuildPromise(){this.pendingBuildPromise=new Promise((e,t)=>{this.resolveBuildPromise=e,this.rejectBuildPromise=t})}completeBuild(){const e=this.makeLoadedEvent();this.resolveBuildPromise&&(this.resolveBuildPromise(e),this.resolveBuildPromise=null,this.rejectBuildPromise=null,this.pendingBuildPromise=Promise.resolve(e))}handleLoadError(e){this.isLoading.set(!1),this.isLoaded.set(!1),this.text.set(null),this.social.set([]),this.rejectBuildPromise&&(this.rejectBuildPromise(e),this.pendingBuildPromise=null,this.resolveBuildPromise=null,this.rejectBuildPromise=null)}makeLoadedEvent(){return{lang:this.currentLang(),resource:this.resolveResource(this.state().resource,this.currentLang())||void 0,socialResource:this.resolveResource(this.state().socialResource,this.currentLang())||void 0}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFrontFooter,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFrontFooter,isStandalone:!0,selector:"aif-front-footer",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (text(); as footer) {\n<footer class="relative bg-slate-900 text-gray-200 dark:bg-slate-800 dark:text-gray-200" [class]="wrapperClass()">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n <div class="grid grid-cols-12">\n <div class="col-span-12">\n <div class="py-[60px] px-0">\n <div class="grid md:grid-cols-12 grid-cols-1 gap-[30px]">\n\n \x3c!-- COL 1: Logo + descripción --\x3e\n <div class="lg:col-span-4 md:col-span-12">\n <a [routerLink]="logo().route || \'/\'" class="text-[22px] focus:outline-none">\n <img [src]="logo().src" [alt]="logo().alt || \'Logo\'">\n </a>\n\n <p class="mt-6 text-gray-300">\n {{footer.description}}\n </p>\n\n <ul class="list-none mt-6">\n @for (item of social(); track $index) {\n <li class="inline mx-0.5">\n <a href="{{item.url}}" target="_blank"\n class="size-8 inline-flex items-center justify-center border border-gray-800 text-gray-400 hover:text-white hover:border-primary hover:bg-primary rounded-md duration-500">\n <i class="{{item.icon}}"></i>\n </a>\n </li>\n }\n </ul>\n </div>\n \x3c!-- END COL 1 --\x3e\n\n\n \x3c!-- COL 2 FUSIONADA: NAVEGACIÓN --\x3e\n <div class="lg:col-span-4 md:col-span-6">\n <h5 class="tracking-[1px] text-gray-100 font-semibold">{{footer.navigation_title}}</h5>\n\n <ul class="list-none footer-list mt-6">\n @for (item of footer.navigation || []; track $index) {\n <li>\n <a routerLink="{{item.url}}" class="text-gray-300 hover:text-gray-400 duration-500">\n <i class="aif aif-arrow-right-ico align-middle"></i> {{item.title}}\n </a>\n </li>\n }\n </ul>\n </div>\n \x3c!-- END COL 2 --\x3e\n\n\n \x3c!-- COL 3: NEWSLETTER --\x3e\n <div class="lg:col-span-4 md:col-span-6">\n <h5 class="tracking-[1px] text-gray-100 font-semibold">{{footer.newsletter_title}}</h5>\n\n <p class="mt-6">\n {{footer.newsletter_desc}}\n </p>\n\n <form>\n <div class="grid grid-cols-1">\n\n <div class="my-3">\n \x3c!-- <label class="form-label">\n {{text().email_label}} <span class="text-red-600">*</span>\n </label> --\x3e\n\n <div class="form-icon relative mt-2">\n <i class="aif aif-mail-ico size-4 absolute top-4 start-4"></i>\n\n <input type="email"\n class="form-input ps-12 rounded w-full py-2 px-3 h-10 bg-gray-800 dark:bg-gray-700 border-0 text-gray-100 focus:shadow-none focus:ring-0 placeholder:text-gray-200"\n placeholder="{{footer.email_placeholder}}" name="email" required>\n </div>\n </div>\n\n <button type="submit"\n class="py-2 px-5 inline-block font-semibold tracking-wide border text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-md duration-500">\n {{footer.subscribe_btn}}\n </button>\n\n </div>\n </form>\n </div>\n \x3c!-- END COL 3 --\x3e\n\n </div>\x3c!-- end grid --\x3e\n </div>\n </div>\n </div>\n </div>\n\n \x3c!-- BARRA INFERIOR --\x3e\n <div class="py-[30px] px-0 border-t border-slate-800 dark:border-slate-700">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8 text-center">\n <div class="grid md:grid-cols-2 items-center">\n\n <div class="md:text-start text-center">\n <p class="mb-0">\n © {{date()}} {{footer.rights}}\n </p>\n </div>\n\n <ul class="list-none md:text-end text-center mt-6 md:mt-0">\n @for (item of footer.links || []; track $index) {\n <li class="inline mx-2">\n <a routerLink="{{item.url}}" class="text-gray-300 hover:text-gray-400 duration-500">\n {{item.title}}\n </a>\n </li>\n }\n </ul>\n\n </div>\n </div>\n </div>\n</footer>\n}\n',styles:[""],dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFrontFooter,decorators:[{type:Component,args:[{selector:"aif-front-footer",standalone:!0,imports:[RouterLink],template:'@if (text(); as footer) {\n<footer class="relative bg-slate-900 text-gray-200 dark:bg-slate-800 dark:text-gray-200" [class]="wrapperClass()">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n <div class="grid grid-cols-12">\n <div class="col-span-12">\n <div class="py-[60px] px-0">\n <div class="grid md:grid-cols-12 grid-cols-1 gap-[30px]">\n\n \x3c!-- COL 1: Logo + descripción --\x3e\n <div class="lg:col-span-4 md:col-span-12">\n <a [routerLink]="logo().route || \'/\'" class="text-[22px] focus:outline-none">\n <img [src]="logo().src" [alt]="logo().alt || \'Logo\'">\n </a>\n\n <p class="mt-6 text-gray-300">\n {{footer.description}}\n </p>\n\n <ul class="list-none mt-6">\n @for (item of social(); track $index) {\n <li class="inline mx-0.5">\n <a href="{{item.url}}" target="_blank"\n class="size-8 inline-flex items-center justify-center border border-gray-800 text-gray-400 hover:text-white hover:border-primary hover:bg-primary rounded-md duration-500">\n <i class="{{item.icon}}"></i>\n </a>\n </li>\n }\n </ul>\n </div>\n \x3c!-- END COL 1 --\x3e\n\n\n \x3c!-- COL 2 FUSIONADA: NAVEGACIÓN --\x3e\n <div class="lg:col-span-4 md:col-span-6">\n <h5 class="tracking-[1px] text-gray-100 font-semibold">{{footer.navigation_title}}</h5>\n\n <ul class="list-none footer-list mt-6">\n @for (item of footer.navigation || []; track $index) {\n <li>\n <a routerLink="{{item.url}}" class="text-gray-300 hover:text-gray-400 duration-500">\n <i class="aif aif-arrow-right-ico align-middle"></i> {{item.title}}\n </a>\n </li>\n }\n </ul>\n </div>\n \x3c!-- END COL 2 --\x3e\n\n\n \x3c!-- COL 3: NEWSLETTER --\x3e\n <div class="lg:col-span-4 md:col-span-6">\n <h5 class="tracking-[1px] text-gray-100 font-semibold">{{footer.newsletter_title}}</h5>\n\n <p class="mt-6">\n {{footer.newsletter_desc}}\n </p>\n\n <form>\n <div class="grid grid-cols-1">\n\n <div class="my-3">\n \x3c!-- <label class="form-label">\n {{text().email_label}} <span class="text-red-600">*</span>\n </label> --\x3e\n\n <div class="form-icon relative mt-2">\n <i class="aif aif-mail-ico size-4 absolute top-4 start-4"></i>\n\n <input type="email"\n class="form-input ps-12 rounded w-full py-2 px-3 h-10 bg-gray-800 dark:bg-gray-700 border-0 text-gray-100 focus:shadow-none focus:ring-0 placeholder:text-gray-200"\n placeholder="{{footer.email_placeholder}}" name="email" required>\n </div>\n </div>\n\n <button type="submit"\n class="py-2 px-5 inline-block font-semibold tracking-wide border text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-md duration-500">\n {{footer.subscribe_btn}}\n </button>\n\n </div>\n </form>\n </div>\n \x3c!-- END COL 3 --\x3e\n\n </div>\x3c!-- end grid --\x3e\n </div>\n </div>\n </div>\n </div>\n\n \x3c!-- BARRA INFERIOR --\x3e\n <div class="py-[30px] px-0 border-t border-slate-800 dark:border-slate-700">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8 text-center">\n <div class="grid md:grid-cols-2 items-center">\n\n <div class="md:text-start text-center">\n <p class="mb-0">\n © {{date()}} {{footer.rights}}\n </p>\n </div>\n\n <ul class="list-none md:text-end text-center mt-6 md:mt-0">\n @for (item of footer.links || []; track $index) {\n <li class="inline mx-2">\n <a routerLink="{{item.url}}" class="text-gray-300 hover:text-gray-400 duration-500">\n {{item.title}}\n </a>\n </li>\n }\n </ul>\n\n </div>\n </div>\n </div>\n</footer>\n}\n'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifBackFooter{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);year=computed(()=>(new Date).getFullYear(),...ngDevMode?[{debugName:"year"}]:[]);credits=computed(()=>this.config()?.credits||"Anemona AIF. Backend workspace.",...ngDevMode?[{debugName:"credits"}]:[]);wrapperClass=computed(()=>this.config()?.class||"",...ngDevMode?[{debugName:"wrapperClass"}]:[]);static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifBackFooter,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifBackFooter,isStandalone:!0,selector:"aif-back-footer",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<footer class="border-t border-slate-200 bg-white px-4 py-3 text-xs text-slate-500 dark:border-slate-800 dark:bg-slate-900 dark:text-slate-400"\n [class]="wrapperClass()">\n <div class="mx-auto flex w-full max-w-7xl flex-col gap-1 sm:flex-row sm:items-center sm:justify-between">\n <p class="m-0">{{ credits() }}</p>\n <p class="m-0">© {{ year() }}</p>\n </div>\n</footer>\n',styles:[":host{display:block}\n"]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifBackFooter,decorators:[{type:Component,args:[{selector:"aif-back-footer",standalone:!0,template:'<footer class="border-t border-slate-200 bg-white px-4 py-3 text-xs text-slate-500 dark:border-slate-800 dark:bg-slate-900 dark:text-slate-400"\n [class]="wrapperClass()">\n <div class="mx-auto flex w-full max-w-7xl flex-col gap-1 sm:flex-row sm:items-center sm:justify-between">\n <p class="m-0">{{ credits() }}</p>\n <p class="m-0">© {{ year() }}</p>\n </div>\n</footer>\n',styles:[":host{display:block}\n"]}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});const DEFAULT_ITEM$1={title:"",breadcrumbs:[]},DEFAULT_CFG$2={overlay:"bg-gradient-to-b from-slate-900/60 via-slate-900/80 to-slate-900",height:"py-32 lg:py-40"};class AifPageHero{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);item=input(DEFAULT_ITEM$1,...ngDevMode?[{debugName:"item"}]:[]);cfg=input(DEFAULT_CFG$2,...ngDevMode?[{debugName:"cfg"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);isLoading=signal(!1,...ngDevMode?[{debugName:"isLoading"}]:[]);isLoaded=signal(!1,...ngDevMode?[{debugName:"isLoaded"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);loadedData=signal(null,...ngDevMode?[{debugName:"loadedData"}]:[]);_subscribe;state=computed(()=>{const e=this.config(),t=this.builtConfig(),n=t??e,i=this.toItem(this.loadedData()),a=this.toItem(n?.data??null),s={...DEFAULT_ITEM$1,...this.item()??{},...i??{},...a??{},...e?.item??{},...t?.item??{}};return{item:{...s,breadcrumbs:this.normalizeBreadcrumbs(s.breadcrumbs??[],n?.currentRoute)},cfg:{...DEFAULT_CFG$2,...this.cfg()??{},...e?.cfg??{},...t?.cfg??{}},class:n?.class??"",resource:n?.resource??""}},...ngDevMode?[{debugName:"state"}]:[]);ngOnInit(){this._subscribe=lang_subscribe("change",()=>{this.state().resource&&this.isBuilt()&&this.shouldWatchLang()&&this.reBuild(this.builtConfig()??this.config()).catch(()=>null)})}ngOnDestroy(){unsubscribe(this._subscribe)}build(e=null){return this.isBuilt()?Promise.resolve(this.state().item):(this.isBuilt.set(!0),this.builtConfig.set(e),this.loadData().then(()=>this.state().item))}reBuild(e=null){return this.reset(),this.build(e)}reset(){this.isBuilt.set(!1),this.isLoading.set(!1),this.isLoaded.set(!1),this.builtConfig.set(null),this.loadedData.set(null)}loadData(){const e=this.builtConfig()??this.config(),t=e?.data??null,n=this.resolveResource(e?.resource,this.currentLang());if(t)return this.loadedData.set(t),this.isLoading.set(!1),this.isLoaded.set(!0),Promise.resolve();if(!n)return this.isLoaded.set(!0),Promise.resolve();const i=n.includes(".json")||n.startsWith("assets/")||n.startsWith("./")||n.startsWith("../")||n.startsWith("http");this.isLoading.set(!0),this.isLoaded.set(!1);return(i?wHttp(n):rq_get(n)).then(e=>{const t=i?e:e?.data||e||{};this.loadedData.set(t||null),this.isLoading.set(!1),this.isLoaded.set(!0)}).catch(()=>{this.loadedData.set(null),this.isLoading.set(!1),this.isLoaded.set(!1)})}shouldWatchLang(){const e=this.builtConfig()??this.config();return e?.watchLang??!0}currentLang(){const e=this.builtConfig()??this.config();return e?.lang||lang()}resolveResource(e,t){return e?str_replace_vars(e,{lang:t}):""}toItem(e){return e?e.header&&"object"==typeof e.header?e.header:{title:e.title,subtitle:e.subtitle,text:e.text,background:e.background,breadcrumbs:e.breadcrumbs}:null}normalizeBreadcrumbs(e=[],t){if(!Array.isArray(e)||0===e.length)return[];let n=!1;const i=e.map((e,i)=>{const a=!!t&&!!e.route&&e.route===t,s=e.active??a;return n=n||s,{...e,active:s}});return n?i:i.map((e,t)=>({...e,active:t===i.length-1}))}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPageHero,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifPageHero,isStandalone:!0,selector:"aif-page-hero, aif-front-header",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},item:{classPropertyName:"item",publicName:"item",isSignal:!0,isRequired:!1,transformFunction:null},cfg:{classPropertyName:"cfg",publicName:"cfg",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (state(); as vm) {\n<section class="relative table w-full bg-no-repeat bg-center bg-cover" [ngClass]="[vm.cfg.height, vm.class]"\n [style.background-image]="vm.item.background ? \'url(\' + vm.item.background + \')\' : null">\n \x3c!-- Overlay --\x3e\n <div class="absolute inset-0" [ngClass]="vm.cfg.overlay"></div>\n\n \x3c!-- Content --\x3e\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n <div class="grid grid-cols-1 pb-8 pt-10 text-center">\n <div class="mx-auto w-full max-w-4xl">\n\n \x3c!-- Page Title --\x3e\n <h3 class="mb-3 text-3xl leading-normal font-medium text-white md:text-4xl">\n {{ vm.item.title }}\n </h3>\n\n \x3c!-- Author + Date --\x3e\n @if ( vm.item.subtitle || vm.item.text) {\n <ul class="list-none text-white/70 font-semibold">\n @if ( vm.item.subtitle) {\n <li class="inline me-2">\n <span class="text-white">{{ vm.item.subtitle }}</span>\n </li>\n }\n @if ( vm.item.text) {\n <li class="inline">\n <span class="text-white"></span> {{ vm.item.text }}\n </li>\n }\n </ul>\n }\n </div>\n\n </div>\n </div>\n\n \x3c!-- Breadcrumbs --\x3e\n @if (vm.item.breadcrumbs.length) {\n <div class="absolute text-center z-10 bottom-5 start-0 end-0 mx-3">\n <ul class="tracking-[0.5px] mb-0 inline-block">\n\n @for (bc of vm.item.breadcrumbs; track bc.label) {\n\n <li class="inline-block uppercase text-menu font-bold duration-500 ease-in-out"\n [ngClass]="bc.active ? \'text-white\' : \'text-white/50 hover:text-white\'">\n @if (!bc.active && bc.route) {\n <a [routerLink]="bc.route">{{ bc.label }}</a>\n }\n @else {\n {{ bc.label }}\n }\n </li>\n\n @if (!$last) {\n <li class="inline-block text-base text-white/50 mx-0.5 ltr:rotate-0 rtl:rotate-180">\n <i class="aif aif-chevron-right-ico align-middle text-lg"></i>\n </li>\n }\n\n }\n </ul>\n </div>\n }\n</section>\n\n\n}\n',styles:[""],dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPageHero,decorators:[{type:Component,args:[{selector:"aif-page-hero, aif-front-header",standalone:!0,imports:[NgClass,RouterLink],template:'@if (state(); as vm) {\n<section class="relative table w-full bg-no-repeat bg-center bg-cover" [ngClass]="[vm.cfg.height, vm.class]"\n [style.background-image]="vm.item.background ? \'url(\' + vm.item.background + \')\' : null">\n \x3c!-- Overlay --\x3e\n <div class="absolute inset-0" [ngClass]="vm.cfg.overlay"></div>\n\n \x3c!-- Content --\x3e\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n <div class="grid grid-cols-1 pb-8 pt-10 text-center">\n <div class="mx-auto w-full max-w-4xl">\n\n \x3c!-- Page Title --\x3e\n <h3 class="mb-3 text-3xl leading-normal font-medium text-white md:text-4xl">\n {{ vm.item.title }}\n </h3>\n\n \x3c!-- Author + Date --\x3e\n @if ( vm.item.subtitle || vm.item.text) {\n <ul class="list-none text-white/70 font-semibold">\n @if ( vm.item.subtitle) {\n <li class="inline me-2">\n <span class="text-white">{{ vm.item.subtitle }}</span>\n </li>\n }\n @if ( vm.item.text) {\n <li class="inline">\n <span class="text-white"></span> {{ vm.item.text }}\n </li>\n }\n </ul>\n }\n </div>\n\n </div>\n </div>\n\n \x3c!-- Breadcrumbs --\x3e\n @if (vm.item.breadcrumbs.length) {\n <div class="absolute text-center z-10 bottom-5 start-0 end-0 mx-3">\n <ul class="tracking-[0.5px] mb-0 inline-block">\n\n @for (bc of vm.item.breadcrumbs; track bc.label) {\n\n <li class="inline-block uppercase text-menu font-bold duration-500 ease-in-out"\n [ngClass]="bc.active ? \'text-white\' : \'text-white/50 hover:text-white\'">\n @if (!bc.active && bc.route) {\n <a [routerLink]="bc.route">{{ bc.label }}</a>\n }\n @else {\n {{ bc.label }}\n }\n </li>\n\n @if (!$last) {\n <li class="inline-block text-base text-white/50 mx-0.5 ltr:rotate-0 rtl:rotate-180">\n <i class="aif aif-chevron-right-ico align-middle text-lg"></i>\n </li>\n }\n\n }\n </ul>\n </div>\n }\n</section>\n\n\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],item:[{type:i0.Input,args:[{isSignal:!0,alias:"item",required:!1}]}],cfg:[{type:i0.Input,args:[{isSignal:!0,alias:"cfg",required:!1}]}]}});const DEFAULT_ITEM={title:"Certificate Validation",label:"Verify",placeholder:"Enter Folio Number..."},DEFAULT_CFG$1={overlay:"bg-gradient-to-b from-slate-900/60 via-slate-900/80 to-slate-900",height:"py-12 lg:py-20"};class AifPageHeroSearch{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);item=input(DEFAULT_ITEM,...ngDevMode?[{debugName:"item"}]:[]);cfg=input(DEFAULT_CFG$1,...ngDevMode?[{debugName:"cfg"}]:[]);search=output();verify=output();loaded=output();textSearch=signal("",...ngDevMode?[{debugName:"textSearch"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);isLoading=signal(!1,...ngDevMode?[{debugName:"isLoading"}]:[]);isLoaded=signal(!1,...ngDevMode?[{debugName:"isLoaded"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);loadedData=signal(null,...ngDevMode?[{debugName:"loadedData"}]:[]);_subscribe;pendingBuildPromise=null;resolveBuildPromise=null;rejectBuildPromise=null;state=computed(()=>{const e=this.config(),t=this.builtConfig(),n=t??e,i=this.loadedData(),a=n?.data??null,s=i?this.toItem(i):null,o=a?this.toItem(a):null;return{item:{...DEFAULT_ITEM,...this.item()??{},...s??{},...o??{},...e?.item??{},...t?.item??{}},cfg:{...DEFAULT_CFG$1,...this.cfg()??{},...e?.cfg??{},...t?.cfg??{}},disabled:n?.disabled??!1,loading:n?.loading??this.isLoading(),class:n?.class??"",resource:n?.resource??""}},...ngDevMode?[{debugName:"state"}]:[]);ngOnInit(){this._subscribe=lang_subscribe("change",()=>{this.state().resource&&this.isBuilt()&&this.shouldWatchLang()&&this.reBuild(this.builtConfig()??this.config()).catch(()=>null)})}ngOnDestroy(){unsubscribe(this._subscribe)}build(e=null){return this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e),this.createBuildPromise(),"string"==typeof e?.textSearch?this.textSearch.set(e.textSearch):"string"==typeof e?.folio&&this.textSearch.set(e.folio),this.loadData()),this.whenLoaded()}reBuild(e=null){return this.reset(),this.build(e)}reset(){this.isBuilt.set(!1),this.isLoading.set(!1),this.isLoaded.set(!1),this.builtConfig.set(null),this.loadedData.set(null),this.textSearch.set(""),this.pendingBuildPromise=null,this.resolveBuildPromise=null,this.rejectBuildPromise=null}setTextSearch(e){this.textSearch.set(e)}onSearchClick(){if(this.state().disabled||this.state().loading)return;const e=this.textSearch().trim(),t=this.builtConfig()??this.config();t?.onSearch?.(e),this.search.emit(e),this.verify.emit(e)}whenLoaded(){return this.isLoaded()?Promise.resolve(this.makeLoadedEvent()):(this.pendingBuildPromise||this.createBuildPromise(),this.pendingBuildPromise)}loadData(){const e=this.builtConfig()??this.config(),t=e?.data??null,n=this.resolveResource(e?.resource,this.currentLang());if(t)return this.loadedData.set(t),this.isLoading.set(!1),this.isLoaded.set(!0),void this.completeBuild();if(!n)return this.isLoaded.set(!0),void this.completeBuild();const i=n.includes(".json")||n.startsWith("assets/")||n.startsWith("./")||n.startsWith("../")||n.startsWith("http");this.isLoading.set(!0),this.isLoaded.set(!1);(i?wHttp(n):rq_get(n)).then(e=>{const t=i?e:e?.data||e||{};this.loadedData.set(t||null),this.isLoading.set(!1),this.isLoaded.set(!0),this.completeBuild()}).catch(e=>{this.handleLoadError(e)})}shouldWatchLang(){const e=this.builtConfig()??this.config();return e?.watchLang??!0}currentLang(){const e=this.builtConfig()??this.config();return e?.lang||lang()}resolveResource(e,t){return e?str_replace_vars(e,{lang:t}):""}toItem(e){return{background:e.background,title:e.title,subtitle:e.subtitle,label:e.label,placeholder:e.placeholder}}createBuildPromise(){this.pendingBuildPromise=new Promise((e,t)=>{this.resolveBuildPromise=e,this.rejectBuildPromise=t})}completeBuild(){const e=this.makeLoadedEvent();this.loaded.emit(e),this.resolveBuildPromise&&(this.resolveBuildPromise(e),this.resolveBuildPromise=null,this.rejectBuildPromise=null,this.pendingBuildPromise=Promise.resolve(e))}handleLoadError(e){this.isLoading.set(!1),this.isLoaded.set(!1),this.loadedData.set(null),this.rejectBuildPromise&&(this.rejectBuildPromise(e),this.pendingBuildPromise=null,this.resolveBuildPromise=null,this.rejectBuildPromise=null)}makeLoadedEvent(){return{lang:this.currentLang(),resource:this.resolveResource(this.state().resource,this.currentLang())||void 0,data:this.loadedData(),item:this.state().item}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPageHeroSearch,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifPageHeroSearch,isStandalone:!0,selector:"aif-page-hero-search, aif-front-header-search",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},item:{classPropertyName:"item",publicName:"item",isSignal:!0,isRequired:!1,transformFunction:null},cfg:{classPropertyName:"cfg",publicName:"cfg",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{search:"search",verify:"verify",loaded:"loaded"},ngImport:i0,template:'@if (state(); as vm) {\n<section class="relative table w-full bg-no-repeat bg-center bg-cover" [ngClass]="[vm.cfg.height, vm.class]"\n [style.background-image]="vm.item.background ? \'url(\' + vm.item.background + \')\' : null">\n \x3c!-- Overlay --\x3e\n <div class="absolute inset-0" [ngClass]="vm.cfg.overlay"></div>\n\n \x3c!-- Content --\x3e\n <div class="container relative">\n <div class="grid grid-cols-1 pb-8 text-center mt-10">\n\n \x3c!-- Page Title --\x3e\n @if(vm.item.title) {\n <h3 class="mb-3 text-3xl leading-normal font-medium text-white">\n {{ vm.item.title }}\n </h3>\n }\n\n @if(vm.item.subtitle) {\n <p class="text-white/60 font-semibold mb-6">{{ vm.item.subtitle }}</p>\n }\n\n \x3c!-- Search Input --\x3e\n <div class="max-w-xl mx-auto w-full">\n <div class="relative">\n <input type="text" [ngModel]="textSearch()" (ngModelChange)="setTextSearch($event)" (keyup.enter)="onSearchClick()"\n [disabled]="vm.disabled || vm.loading"\n class="w-full py-4 pl-6 pr-32 h-[60px] bg-white dark:bg-slate-900 rounded-full shadow dark:shadow-gray-800 outline-none border-0"\n [placeholder]="vm.item.placeholder">\n <button type="button" (click)="onSearchClick()" [disabled]="vm.disabled || vm.loading"\n class="absolute top-[5px] right-[5px] h-[50px] px-6 bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-full duration-500 disabled:cursor-not-allowed disabled:opacity-70">\n {{ vm.loading ? \'...\' : vm.item.label }}\n </button>\n </div>\n </div>\n\n </div>\n </div>\n</section>\n\n<div class="relative">\n <div\n class="shape absolute sm:-bottom-px -bottom-[2px] start-0 end-0 overflow-hidden z-1 text-white dark:text-slate-900">\n <svg class="w-full h-auto scale-[2.0] origin-top" viewBox="0 0 2880 48" fill="none"\n xmlns="http://www.w3.org/2000/svg">\n <path d="M0 48H1437.5H2880V0H2160C1442.5 52 720 0 720 0H0V48Z" fill="currentColor"></path>\n </svg>\n </div>\n</div>\n}\n',styles:[""],dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"ngmodule",type:FormsModule},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPageHeroSearch,decorators:[{type:Component,args:[{selector:"aif-page-hero-search, aif-front-header-search",standalone:!0,imports:[NgClass,FormsModule],template:'@if (state(); as vm) {\n<section class="relative table w-full bg-no-repeat bg-center bg-cover" [ngClass]="[vm.cfg.height, vm.class]"\n [style.background-image]="vm.item.background ? \'url(\' + vm.item.background + \')\' : null">\n \x3c!-- Overlay --\x3e\n <div class="absolute inset-0" [ngClass]="vm.cfg.overlay"></div>\n\n \x3c!-- Content --\x3e\n <div class="container relative">\n <div class="grid grid-cols-1 pb-8 text-center mt-10">\n\n \x3c!-- Page Title --\x3e\n @if(vm.item.title) {\n <h3 class="mb-3 text-3xl leading-normal font-medium text-white">\n {{ vm.item.title }}\n </h3>\n }\n\n @if(vm.item.subtitle) {\n <p class="text-white/60 font-semibold mb-6">{{ vm.item.subtitle }}</p>\n }\n\n \x3c!-- Search Input --\x3e\n <div class="max-w-xl mx-auto w-full">\n <div class="relative">\n <input type="text" [ngModel]="textSearch()" (ngModelChange)="setTextSearch($event)" (keyup.enter)="onSearchClick()"\n [disabled]="vm.disabled || vm.loading"\n class="w-full py-4 pl-6 pr-32 h-[60px] bg-white dark:bg-slate-900 rounded-full shadow dark:shadow-gray-800 outline-none border-0"\n [placeholder]="vm.item.placeholder">\n <button type="button" (click)="onSearchClick()" [disabled]="vm.disabled || vm.loading"\n class="absolute top-[5px] right-[5px] h-[50px] px-6 bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-full duration-500 disabled:cursor-not-allowed disabled:opacity-70">\n {{ vm.loading ? \'...\' : vm.item.label }}\n </button>\n </div>\n </div>\n\n </div>\n </div>\n</section>\n\n<div class="relative">\n <div\n class="shape absolute sm:-bottom-px -bottom-[2px] start-0 end-0 overflow-hidden z-1 text-white dark:text-slate-900">\n <svg class="w-full h-auto scale-[2.0] origin-top" viewBox="0 0 2880 48" fill="none"\n xmlns="http://www.w3.org/2000/svg">\n <path d="M0 48H1437.5H2880V0H2160C1442.5 52 720 0 720 0H0V48Z" fill="currentColor"></path>\n </svg>\n </div>\n</div>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],item:[{type:i0.Input,args:[{isSignal:!0,alias:"item",required:!1}]}],cfg:[{type:i0.Input,args:[{isSignal:!0,alias:"cfg",required:!1}]}],search:[{type:i0.Output,args:["search"]}],verify:[{type:i0.Output,args:["verify"]}],loaded:[{type:i0.Output,args:["loaded"]}]}});class AifGoBack{static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGoBack,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"21.1.1",type:AifGoBack,isStandalone:!0,selector:"aif-go-back",ngImport:i0,template:'<div class="fixed bottom-3 end-3">\n <a routerLink="/"\n class="back-button size-9 inline-flex items-center justify-center tracking-wide border align-middle duration-500 text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-full"><i\n class="aif aif-arrow-left-ico size-5"></i></a>\n</div>',styles:[""],dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGoBack,decorators:[{type:Component,args:[{selector:"aif-go-back",standalone:!0,imports:[RouterLink],template:'<div class="fixed bottom-3 end-3">\n <a routerLink="/"\n class="back-button size-9 inline-flex items-center justify-center tracking-wide border align-middle duration-500 text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-full"><i\n class="aif aif-arrow-left-ico size-5"></i></a>\n</div>'}]}]});class AifGoUp{destroyRef=inject(DestroyRef);rafId=null;offsetFromTop=100;isVisible=signal(!1,...ngDevMode?[{debugName:"isVisible"}]:[]);ngAfterViewInit(){const e=()=>{null===this.rafId&&(this.rafId=requestAnimationFrame(()=>{this.rafId=null,this.isVisible.set(this.getScrollTop()>this.offsetFromTop)}))};e(),window.addEventListener("scroll",e,{passive:!0}),this.destroyRef.onDestroy(()=>{window.removeEventListener("scroll",e),null!==this.rafId&&cancelAnimationFrame(this.rafId)})}scrollToTop(){window.scrollTo({top:0,behavior:"smooth"})}getScrollTop(){return window.scrollY||document.documentElement.scrollTop||document.body.scrollTop||0}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGoUp,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"21.1.1",type:AifGoUp,isStandalone:!0,selector:"aif-go-up",ngImport:i0,template:'<a (click)="scrollToTop()" id="back-to-top"\n class="back-to-top fixed text-lg rounded-full z-10 bottom-5 end-5 size-9 text-center bg-primary text-white leading-9 cursor-pointer"\n [class.hidden]="!isVisible()" [class.block]="isVisible()"><i\n class="aif aif-arrow-up-ico leading-10"></i></a>\n',styles:[""]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGoUp,decorators:[{type:Component,args:[{selector:"aif-go-up",standalone:!0,imports:[],template:'<a (click)="scrollToTop()" id="back-to-top"\n class="back-to-top fixed text-lg rounded-full z-10 bottom-5 end-5 size-9 text-center bg-primary text-white leading-9 cursor-pointer"\n [class.hidden]="!isVisible()" [class.block]="isVisible()"><i\n class="aif aif-arrow-up-ico leading-10"></i></a>\n'}]}]});class AifLoading{defaultBgColor=env("app.loading.bg_color");isLoading=signal(!0,...ngDevMode?[{debugName:"isLoading"}]:[]);bg_color=signal(this.defaultBgColor,...ngDevMode?[{debugName:"bg_color"}]:[]);_sb;ngOnInit(){this._sb=loading_subscribe(e=>{"boolean"!=typeof e?e&&"object"==typeof e&&(this.bg_color.set(e.bg_color||this.defaultBgColor),this.isLoading.set(!!e.show)):this.isLoading.set(e)})}ngOnDestroy(){unsubscribe(this._sb)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifLoading,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifLoading,isStandalone:!0,selector:"aif-loading",ngImport:i0,template:'@if(isLoading()) {\n<div class="aif-loading loading-overlay" [ngStyle]="{\'background-color\': bg_color()}">\n <div class="spinner"></div>\n</div>\n}',styles:['@charset "UTF-8";.loading-overlay{position:fixed;display:flex;top:0;left:0;background-color:#fff;z-index:105000;justify-content:center;align-items:center;height:100vh;width:100vw}.swal2-container{z-index:1050000!important}.spinner{width:40px;height:40px;background-color:#6b1832;margin:100px auto;-webkit-animation:sk-rotateplane 1.2s infinite ease-in-out;animation:sk-rotateplane 1.2s infinite ease-in-out}@-webkit-keyframes sk-rotateplane{0%{-webkit-transform:perspective(120px)}50%{-webkit-transform:perspective(120px) rotateY(180deg)}to{-webkit-transform:perspective(120px) rotateY(180deg) rotateX(180deg)}}@keyframes sk-rotateplane{0%{transform:perspective(120px) rotateX(0) rotateY(0);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{transform:perspective(120px) rotateX(-180.1deg) rotateY(0);-webkit-transform:perspective(120px) rotateX(-180.1deg) rotateY(0deg)}to{transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg);-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg)}}\n'],dependencies:[{kind:"directive",type:NgStyle,selector:"[ngStyle]",inputs:["ngStyle"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifLoading,decorators:[{type:Component,args:[{selector:"aif-loading",imports:[NgStyle],template:'@if(isLoading()) {\n<div class="aif-loading loading-overlay" [ngStyle]="{\'background-color\': bg_color()}">\n <div class="spinner"></div>\n</div>\n}',styles:['@charset "UTF-8";.loading-overlay{position:fixed;display:flex;top:0;left:0;background-color:#fff;z-index:105000;justify-content:center;align-items:center;height:100vh;width:100vw}.swal2-container{z-index:1050000!important}.spinner{width:40px;height:40px;background-color:#6b1832;margin:100px auto;-webkit-animation:sk-rotateplane 1.2s infinite ease-in-out;animation:sk-rotateplane 1.2s infinite ease-in-out}@-webkit-keyframes sk-rotateplane{0%{-webkit-transform:perspective(120px)}50%{-webkit-transform:perspective(120px) rotateY(180deg)}to{-webkit-transform:perspective(120px) rotateY(180deg) rotateX(180deg)}}@keyframes sk-rotateplane{0%{transform:perspective(120px) rotateX(0) rotateY(0);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{transform:perspective(120px) rotateX(-180.1deg) rotateY(0);-webkit-transform:perspective(120px) rotateX(-180.1deg) rotateY(0deg)}to{transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg);-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg)}}\n']}]}]});let next_menu_id=0;class AifMenu{onInit=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);fields=input({},...ngDevMode?[{debugName:"fields"}]:[]);index=input(0,...ngDevMode?[{debugName:"index"}]:[]);total=input(0,...ngDevMode?[{debugName:"total"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);root=viewChild.required("root");menuId="aif-menu-"+next_menu_id++;open=signal(!1,...ngDevMode?[{debugName:"open"}]:[]);state=computed(()=>({...this.config(),...obj_compact(this.cfg())}),...ngDevMode?[{debugName:"state"}]:[]);hasFields=computed(()=>Object.keys(this.fields()??{}).length>0,...ngDevMode?[{debugName:"hasFields"}]:[]);options=computed(()=>this.state().options??[],...ngDevMode?[{debugName:"options"}]:[]);processedOptions=computed(()=>{const e=this.fields();return this.options().map(t=>this.to_processed_option(t,e))},...ngDevMode?[{debugName:"processedOptions"}]:[]);iconClass=computed(()=>this.state().icon??"aif aif-dots-horizontal-ico",...ngDevMode?[{debugName:"iconClass"}]:[]);placement=computed(()=>this.state().placement??"start",...ngDevMode?[{debugName:"placement"}]:[]);horizontalPositionClass=computed(()=>"start"===this.placement()?"left-0":"right-0",...ngDevMode?[{debugName:"horizontalPositionClass"}]:[]);isSingleRow=computed(()=>this.total()<=1,...ngDevMode?[{debugName:"isSingleRow"}]:[]);vplacement=computed(()=>{const e=this.state().vplacement??"auto";if("auto"===e){if(this.isSingleRow())return"bottom";const e=this.index(),t=this.total();return t>1&&e>0&&e>=t-2?"top":"bottom"}return e},...ngDevMode?[{debugName:"vplacement"}]:[]);panelPositionClass=computed(()=>this.isSingleRow()?"end"===this.placement()?"-top-14 right-full mr-2":"-top-14 left-full ml-2":"top"===this.vplacement()?"bottom-full mb-2":"top-full mt-2",...ngDevMode?[{debugName:"panelPositionClass"}]:[]);panelClass=computed(()=>this.isSingleRow()?this.panelPositionClass():`${this.horizontalPositionClass()} ${this.panelPositionClass()}`.trim(),...ngDevMode?[{debugName:"panelClass"}]:[]);wrapperClass=computed(()=>this.state().class??"",...ngDevMode?[{debugName:"wrapperClass"}]:[]);buttonClass=computed(()=>this.state().buttonClass??"inline-flex items-center justify-center rounded-md p-2 text-slate-500 hover:bg-slate-100 hover:text-slate-700 dark:text-slate-400 dark:hover:bg-slate-700 dark:hover:text-slate-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-500",...ngDevMode?[{debugName:"buttonClass"}]:[]);menuClass=computed(()=>this.state().menuClass??"min-w-48 rounded-lg border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 p-1 shadow-2xl",...ngDevMode?[{debugName:"menuClass"}]:[]);ngAfterViewInit(){this.onInit.emit()}build(e={}){this.cfg.set(obj_compact(e))}resetToInput(){this.cfg.set({})}reBuild(e={}){this.build(e)}toggle(){this.open.update(e=>!e)}close(){this.open.set(!1)}btnClick(e){e._isReadonly||(e.click?.(e,this.fields()),this.close())}onDocClick(e){if(!this.open())return;const t=this.root()?.nativeElement;t&&(t.contains(e.target)||this.close())}onEsc(){this.open()&&this.close()}to_processed_option(e,t){return"-"===e?{_isDivider:!0,_canShow:!0,_isReadonly:!1}:e.divider?{...e,_isDivider:!0,_canShow:!0,_isReadonly:!1}:{...e,_isDivider:!1,_canShow:this.can_show(e,t),_isReadonly:this.is_readonly(e,t)}}is_readonly(e,t){return!0===e.readonly||this.evaluate_condition(e.readonly,t)}can_show(e,t){return e.show?this.evaluate_condition(e.show,t):!e.hide||!this.evaluate_condition(e.hide,t)}evaluate_condition(e,t){return!(!e||!this.hasFields())&&(Array.isArray(e)?field_evaluate(e[0],t,!0):field_evaluate(e,t))}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifMenu,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifMenu,isStandalone:!0,selector:"aif-menu",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},fields:{classPropertyName:"fields",publicName:"fields",isSignal:!0,isRequired:!1,transformFunction:null},index:{classPropertyName:"index",publicName:"index",isSignal:!0,isRequired:!1,transformFunction:null},total:{classPropertyName:"total",publicName:"total",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},host:{listeners:{"document:click":"onDocClick($event)","document:keydown.escape":"onEsc()"}},viewQueries:[{propertyName:"root",first:!0,predicate:["root"],descendants:!0,isSignal:!0}],ngImport:i0,template:'<div #root class="relative inline-block" [class]="wrapperClass()" [class.z-[100]]="open()">\n \x3c!-- Botón --\x3e\n <button\n type="button"\n [class]="buttonClass()"\n (click)="toggle()"\n aria-haspopup="menu"\n [attr.aria-expanded]="open()"\n [attr.aria-controls]="menuId">\n <i [class]="iconClass()"></i>\n </button>\n\n \x3c!-- Menú --\x3e\n @if (open()) {\n <div\n class="absolute z-50"\n [class]="panelClass()"\n [attr.id]="menuId"\n role="menu">\n <ul [class]="menuClass()" class="max-h-80 overflow-y-auto scrollbar-thin scrollbar-thumb-slate-200 dark:scrollbar-thumb-slate-700">\n @for (menu of processedOptions(); track $index) {\n @if (menu._isDivider) {\n <li class="my-1 border-t border-slate-100 dark:border-slate-700"></li>\n } @else if (menu._canShow) {\n <li>\n <button type="button" role="menuitem" (click)="btnClick(menu)"\n class="flex w-full items-center gap-2 rounded-md px-3 py-2 text-left text-sm text-slate-700 dark:text-slate-200 hover:bg-slate-100 dark:hover:bg-slate-700/50 transition-colors"\n [class.opacity-50]="menu._isReadonly" [class.pointer-events-none]="menu._isReadonly">\n @if (menu.icon) {\n <i [class]="menu.icon"></i>\n }\n <span>{{ menu.title }}</span>\n </button>\n </li>\n }\n }\n </ul>\n </div>\n }\n</div>\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifMenu,decorators:[{type:Component,args:[{selector:"aif-menu",standalone:!0,template:'<div #root class="relative inline-block" [class]="wrapperClass()" [class.z-[100]]="open()">\n \x3c!-- Botón --\x3e\n <button\n type="button"\n [class]="buttonClass()"\n (click)="toggle()"\n aria-haspopup="menu"\n [attr.aria-expanded]="open()"\n [attr.aria-controls]="menuId">\n <i [class]="iconClass()"></i>\n </button>\n\n \x3c!-- Menú --\x3e\n @if (open()) {\n <div\n class="absolute z-50"\n [class]="panelClass()"\n [attr.id]="menuId"\n role="menu">\n <ul [class]="menuClass()" class="max-h-80 overflow-y-auto scrollbar-thin scrollbar-thumb-slate-200 dark:scrollbar-thumb-slate-700">\n @for (menu of processedOptions(); track $index) {\n @if (menu._isDivider) {\n <li class="my-1 border-t border-slate-100 dark:border-slate-700"></li>\n } @else if (menu._canShow) {\n <li>\n <button type="button" role="menuitem" (click)="btnClick(menu)"\n class="flex w-full items-center gap-2 rounded-md px-3 py-2 text-left text-sm text-slate-700 dark:text-slate-200 hover:bg-slate-100 dark:hover:bg-slate-700/50 transition-colors"\n [class.opacity-50]="menu._isReadonly" [class.pointer-events-none]="menu._isReadonly">\n @if (menu.icon) {\n <i [class]="menu.icon"></i>\n }\n <span>{{ menu.title }}</span>\n </button>\n </li>\n }\n }\n </ul>\n </div>\n }\n</div>\n'}]}],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],fields:[{type:i0.Input,args:[{isSignal:!0,alias:"fields",required:!1}]}],index:[{type:i0.Input,args:[{isSignal:!0,alias:"index",required:!1}]}],total:[{type:i0.Input,args:[{isSignal:!0,alias:"total",required:!1}]}],root:[{type:i0.ViewChild,args:["root",{isSignal:!0}]}],onDocClick:[{type:HostListener,args:["document:click",["$event"]]}],onEsc:[{type:HostListener,args:["document:keydown.escape"]}]}});class AifNavActionButton{route=input(null,...ngDevMode?[{debugName:"route"}]:[]);title=input("",...ngDevMode?[{debugName:"title"}]:[]);ariaLabel=input("",...ngDevMode?[{debugName:"ariaLabel"}]:[]);variant=input("front-circle",...ngDevMode?[{debugName:"variant"}]:[]);active=input(!1,...ngDevMode?[{debugName:"active"}]:[]);extraClass=input("",...ngDevMode?[{debugName:"extraClass"}]:[]);clicked=output();className=computed(()=>[this.baseClass(),this.variantClass(),this.activeClass(),this.extraClass()].filter(Boolean).join(" "),...ngDevMode?[{debugName:"className"}]:[]);onClick(e){this.clicked.emit(e)}baseClass(){return"inline-flex items-center justify-center align-middle transition-colors duration-300 focus:outline-none"}variantClass(){switch(this.variant()){case"back-square":return"h-10 w-10 rounded-lg text-gray-500 dark:text-gray-400 lg:h-11 lg:w-11";case"back-circle":return"h-11 w-full rounded-full border border-gray-200 bg-white text-gray-500 hover:bg-gray-100 hover:text-gray-700 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-white lg:w-11";default:return"size-9 rounded-full border border-primary bg-primary text-base text-center text-white hover:border-primary-700 hover:bg-primary-700"}}activeClass(){return this.active()&&"back-square"===this.variant()?"bg-gray-100 dark:bg-white/[0.03]":""}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavActionButton,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavActionButton,isStandalone:!0,selector:"aif-nav-action-button",inputs:{route:{classPropertyName:"route",publicName:"route",isSignal:!0,isRequired:!1,transformFunction:null},title:{classPropertyName:"title",publicName:"title",isSignal:!0,isRequired:!1,transformFunction:null},ariaLabel:{classPropertyName:"ariaLabel",publicName:"ariaLabel",isSignal:!0,isRequired:!1,transformFunction:null},variant:{classPropertyName:"variant",publicName:"variant",isSignal:!0,isRequired:!1,transformFunction:null},active:{classPropertyName:"active",publicName:"active",isSignal:!0,isRequired:!1,transformFunction:null},extraClass:{classPropertyName:"extraClass",publicName:"extraClass",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{clicked:"clicked"},ngImport:i0,template:'<ng-template #innerContent>\n <ng-content></ng-content>\n</ng-template>\n\n@if (route()) {\n<a [routerLink]="route()!" [class]="className()" [title]="title()" [attr.aria-label]="ariaLabel() || title()">\n <ng-container *ngTemplateOutlet="innerContent"></ng-container>\n</a>\n} @else {\n<button type="button" [class]="className()" [title]="title()" [attr.aria-label]="ariaLabel() || title()"\n (click)="onClick($event)">\n <ng-container *ngTemplateOutlet="innerContent"></ng-container>\n</button>\n}\n',dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]},{kind:"directive",type:NgTemplateOutlet,selector:"[ngTemplateOutlet]",inputs:["ngTemplateOutletContext","ngTemplateOutlet","ngTemplateOutletInjector"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavActionButton,decorators:[{type:Component,args:[{selector:"aif-nav-action-button",standalone:!0,imports:[RouterLink,NgTemplateOutlet],template:'<ng-template #innerContent>\n <ng-content></ng-content>\n</ng-template>\n\n@if (route()) {\n<a [routerLink]="route()!" [class]="className()" [title]="title()" [attr.aria-label]="ariaLabel() || title()">\n <ng-container *ngTemplateOutlet="innerContent"></ng-container>\n</a>\n} @else {\n<button type="button" [class]="className()" [title]="title()" [attr.aria-label]="ariaLabel() || title()"\n (click)="onClick($event)">\n <ng-container *ngTemplateOutlet="innerContent"></ng-container>\n</button>\n}\n'}]}],propDecorators:{route:[{type:i0.Input,args:[{isSignal:!0,alias:"route",required:!1}]}],title:[{type:i0.Input,args:[{isSignal:!0,alias:"title",required:!1}]}],ariaLabel:[{type:i0.Input,args:[{isSignal:!0,alias:"ariaLabel",required:!1}]}],variant:[{type:i0.Input,args:[{isSignal:!0,alias:"variant",required:!1}]}],active:[{type:i0.Input,args:[{isSignal:!0,alias:"active",required:!1}]}],extraClass:[{type:i0.Input,args:[{isSignal:!0,alias:"extraClass",required:!1}]}],clicked:[{type:i0.Output,args:["clicked"]}]}});class AifNavLogo{cfg=input(void 0,...ngDevMode?[{debugName:"cfg"}]:[]);surface=input("theme",...ngDevMode?[{debugName:"surface"}]:[]);dark=computed(()=>this.cfg()?.dark||"assets/images/logo/logo-light.png",...ngDevMode?[{debugName:"dark"}]:[]);light=computed(()=>this.cfg()?.light||"assets/images/logo/logo-dark.png",...ngDevMode?[{debugName:"light"}]:[]);alt=computed(()=>this.cfg()?.alt||"Logo",...ngDevMode?[{debugName:"alt"}]:[]);route=computed(()=>this.cfg()?.route||"/",...ngDevMode?[{debugName:"route"}]:[]);isThemeSurface=computed(()=>"theme"===this.surface(),...ngDevMode?[{debugName:"isThemeSurface"}]:[]);isLightSurface=computed(()=>"light"===this.surface(),...ngDevMode?[{debugName:"isLightSurface"}]:[]);isDarkSurface=computed(()=>"dark"===this.surface(),...ngDevMode?[{debugName:"isDarkSurface"}]:[]);isFrontNavSurface=computed(()=>"front-nav"===this.surface(),...ngDevMode?[{debugName:"isFrontNavSurface"}]:[]);anchorClass=computed(()=>this.isFrontNavSurface()?"logo inline-flex h-[74px] max-w-full min-w-0 items-center align-middle":"inline-flex h-10 max-w-full min-w-0 items-center align-middle",...ngDevMode?[{debugName:"anchorClass"}]:[]);imageClass=computed(()=>this.isFrontNavSurface()?"block h-8 w-auto max-w-full object-contain align-middle":"block h-6 w-auto max-w-full object-contain",...ngDevMode?[{debugName:"imageClass"}]:[]);static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavLogo,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavLogo,isStandalone:!0,selector:"aif-nav-logo",inputs:{cfg:{classPropertyName:"cfg",publicName:"cfg",isSignal:!0,isRequired:!1,transformFunction:null},surface:{classPropertyName:"surface",publicName:"surface",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (cfg()) {\n<a [class]="anchorClass()" [routerLink]="route() || \'/\'">\n @if (isFrontNavSurface()) {\n <img [src]="light()" class="l-dark" [class]="imageClass()" [alt]="alt()">\n <img [src]="dark()" class="l-light" [class]="imageClass()" [alt]="alt()">\n } @else if (isThemeSurface()) {\n <img [src]="light()" class="dark:hidden" [class]="imageClass()" [alt]="alt()">\n <img [src]="dark()" class="hidden dark:block" [class]="imageClass()" [alt]="alt()">\n } @else if (isDarkSurface()) {\n <img [src]="dark()" [class]="imageClass()" [alt]="alt()">\n } @else {\n <img [src]="light()" [class]="imageClass()" [alt]="alt()">\n }\n</a>\n}\n',styles:[""],dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavLogo,decorators:[{type:Component,args:[{selector:"aif-nav-logo",imports:[RouterLink],template:'@if (cfg()) {\n<a [class]="anchorClass()" [routerLink]="route() || \'/\'">\n @if (isFrontNavSurface()) {\n <img [src]="light()" class="l-dark" [class]="imageClass()" [alt]="alt()">\n <img [src]="dark()" class="l-light" [class]="imageClass()" [alt]="alt()">\n } @else if (isThemeSurface()) {\n <img [src]="light()" class="dark:hidden" [class]="imageClass()" [alt]="alt()">\n <img [src]="dark()" class="hidden dark:block" [class]="imageClass()" [alt]="alt()">\n } @else if (isDarkSurface()) {\n <img [src]="dark()" [class]="imageClass()" [alt]="alt()">\n } @else {\n <img [src]="light()" [class]="imageClass()" [alt]="alt()">\n }\n</a>\n}\n'}]}],propDecorators:{cfg:[{type:i0.Input,args:[{isSignal:!0,alias:"cfg",required:!1}]}],surface:[{type:i0.Input,args:[{isSignal:!0,alias:"surface",required:!1}]}]}});class AifNavDropdownService{activeId=signal(null,...ngDevMode?[{debugName:"activeId"}]:[]);current(){return this.activeId()}isActive(e){return this.activeId()===e}toggle(e){const t=this.activeId()===e?null:e;return this.activeId.set(t),t===e}open(e){this.activeId.set(e)}close(e){e&&this.activeId()!==e||this.activeId.set(null)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavDropdownService,deps:[],target:i0.ɵɵFactoryTarget.Injectable});static"ɵprov"=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavDropdownService,providedIn:"root"})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavDropdownService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}]});class AifNavLangDropDown{static nextId=0;dropdowns=inject(AifNavDropdownService);dropdownId="aif-nav-lang-dropdown-"+ ++AifNavLangDropDown.nextId;config=input(null,...ngDevMode?[{debugName:"config"}]:[]);variant=input("back",...ngDevMode?[{debugName:"variant"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);cfg=computed(()=>this.builtConfig()??this.config(),...ngDevMode?[{debugName:"cfg"}]:[]);currentLang=signal(lang(),...ngDevMode?[{debugName:"currentLang"}]:[]);isOpen=computed(()=>this.dropdowns.isActive(this.dropdownId),...ngDevMode?[{debugName:"isOpen"}]:[]);isFront=computed(()=>"front"===this.variant(),...ngDevMode?[{debugName:"isFront"}]:[]);triggerClass=computed(()=>this.isFront()?"dropdown-toggle cursor-pointer inline-flex size-9 items-center justify-center rounded-full border border-gray-200 bg-white text-xs font-semibold text-center align-middle duration-500 hover:bg-gray-100 dark:border-gray-800 dark:bg-slate-900 dark:hover:bg-gray-700":"dropdown-toggle relative flex h-11 w-full items-center justify-center rounded-full border border-gray-200 bg-white text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-white lg:w-11",...ngDevMode?[{debugName:"triggerClass"}]:[]);panelClass=computed(()=>this.isFront()?"absolute end-0 m-0 mt-3 z-10 w-32 rounded-md overflow-hidden bg-white text-[13px] shadow-sm dark:bg-slate-900 dark:shadow-gray-800":"-left-[20px] absolute mt-[17px] flex w-[260px] flex-col rounded-2xl border border-gray-200 bg-white p-3 shadow-theme-lg dark:border-gray-800 dark:bg-gray-dark",...ngDevMode?[{debugName:"panelClass"}]:[]);reBuild(e){this.resetToInput(),this.build(e)}build(e){this.builtConfig.set(e)}resetToInput(){this.builtConfig.set(null)}toggleDropdown(){this.dropdowns.toggle(this.dropdownId)}closeDropdown(){this.dropdowns.close(this.dropdownId)}langs_setLang(e){this.currentLang.set(e),lang_set(e)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavLangDropDown,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavLangDropDown,isStandalone:!0,selector:"aif-nav-lang-dropdown",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},variant:{classPropertyName:"variant",publicName:"variant",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (cfg()) {\n<div class="relative">\n <button (click)="toggleDropdown()" [class]="triggerClass()" type="button">\n <span class="uppercase">{{ (currentLang()) }}</span>\n </button>\n\n <aif-dropdown [isOpen]="isOpen()" (close)="closeDropdown()"\n [className]="panelClass()">\n @if (isFront()) {\n @for(lang of cfg(); track lang.code) {\n <button type="button" class="block w-full text-left py-2 px-4 hover:bg-gray-100 dark:hover:bg-slate-800"\n [ngClass]="{\'text-primary font-semibold\': lang.code === currentLang()}"\n (click)="langs_setLang(lang.code); closeDropdown()">\n {{ lang.label }}\n </button>\n }\n } @else {\n <ul class="flex flex-col gap-1 pt-4 pb-3 border-b border-gray-200 dark:border-gray-800">\n @if(cfg()?.length) {\n @for(lang of cfg(); track lang.code) {\n <li>\n <button type="button" class="block w-full text-left py-2 px-4 hover:bg-gray-100 dark:hover:bg-slate-800"\n [ngClass]="{\'text-primary font-semibold\': lang.code === currentLang()}"\n (click)="langs_setLang(lang.code); closeDropdown()">\n {{ lang.label }}\n </button>\n </li>\n }\n }\n </ul>\n }\n </aif-dropdown>\n</div>\n}\n',styles:[""],dependencies:[{kind:"component",type:AifDropDown,selector:"aif-dropdown",inputs:["isOpen","className"],outputs:["close"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavLangDropDown,decorators:[{type:Component,args:[{selector:"aif-nav-lang-dropdown",imports:[AifDropDown,NgClass],template:'@if (cfg()) {\n<div class="relative">\n <button (click)="toggleDropdown()" [class]="triggerClass()" type="button">\n <span class="uppercase">{{ (currentLang()) }}</span>\n </button>\n\n <aif-dropdown [isOpen]="isOpen()" (close)="closeDropdown()"\n [className]="panelClass()">\n @if (isFront()) {\n @for(lang of cfg(); track lang.code) {\n <button type="button" class="block w-full text-left py-2 px-4 hover:bg-gray-100 dark:hover:bg-slate-800"\n [ngClass]="{\'text-primary font-semibold\': lang.code === currentLang()}"\n (click)="langs_setLang(lang.code); closeDropdown()">\n {{ lang.label }}\n </button>\n }\n } @else {\n <ul class="flex flex-col gap-1 pt-4 pb-3 border-b border-gray-200 dark:border-gray-800">\n @if(cfg()?.length) {\n @for(lang of cfg(); track lang.code) {\n <li>\n <button type="button" class="block w-full text-left py-2 px-4 hover:bg-gray-100 dark:hover:bg-slate-800"\n [ngClass]="{\'text-primary font-semibold\': lang.code === currentLang()}"\n (click)="langs_setLang(lang.code); closeDropdown()">\n {{ lang.label }}\n </button>\n </li>\n }\n }\n </ul>\n }\n </aif-dropdown>\n</div>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],variant:[{type:i0.Input,args:[{isSignal:!0,alias:"variant",required:!1}]}]}});class AifNavUserDropDown{static nextId=0;built=!1;dropdowns=inject(AifNavDropdownService);dropdownId="aif-nav-user-dropdown-"+ ++AifNavUserDropDown.nextId;config=input(null,...ngDevMode?[{debugName:"config"}]:[]);variant=input("back",...ngDevMode?[{debugName:"variant"}]:[]);cfg=signal(null,...ngDevMode?[{debugName:"cfg"}]:[]);onAction=output();avatar=computed(()=>this.cfg()?.avatar||storage(session()?.user?.photo)||"",...ngDevMode?[{debugName:"avatar"}]:[]);name=computed(()=>this.cfg()?.name||session()?.user?.name||"",...ngDevMode?[{debugName:"name"}]:[]);email=computed(()=>this.cfg()?.email||session()?.user?.email||"",...ngDevMode?[{debugName:"email"}]:[]);dropdown=computed(()=>this.cfg()?.dropdown||session()?.get("dropdown")||[],...ngDevMode?[{debugName:"dropdown"}]:[]);isOpen=computed(()=>this.dropdowns.isActive(this.dropdownId),...ngDevMode?[{debugName:"isOpen"}]:[]);isFront=computed(()=>"front"===this.variant(),...ngDevMode?[{debugName:"isFront"}]:[]);buttonClass=computed(()=>this.isFront()?"dropdown-toggle relative inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-full align-middle leading-none transition-transform duration-300 hover:scale-[1.03] focus:outline-none":"dropdown-toggle flex items-center text-gray-700 dark:text-gray-400",...ngDevMode?[{debugName:"buttonClass"}]:[]);avatarWrapperClass=computed(()=>this.isFront()?"block size-10 overflow-hidden rounded-full border-2 border-white/80 shadow-sm dark:border-slate-700/80":"mr-3 h-11 w-11 overflow-hidden rounded-full",...ngDevMode?[{debugName:"avatarWrapperClass"}]:[]);avatarImageClass=computed(()=>(this.isFront(),"block size-full object-cover"),...ngDevMode?[{debugName:"avatarImageClass"}]:[]);arrowClass=computed(()=>this.isFront()?"stroke-white transition-transform duration-200":"stroke-gray-500 dark:stroke-gray-400 transition-transform duration-200",...ngDevMode?[{debugName:"arrowClass"}]:[]);panelClass=computed(()=>this.isFront()?"absolute end-1 m-0 mt-3 z-10 w-48 rounded-2xl overflow-hidden bg-white dark:bg-slate-900 shadow-sm dark:shadow-gray-800":"absolute right-0 mt-[17px] flex w-[260px] flex-col rounded-2xl border border-gray-200 bg-white p-3 shadow-theme-lg dark:border-gray-800 dark:bg-gray-dark",...ngDevMode?[{debugName:"panelClass"}]:[]);ngOnInit(){this.config()&&this.build(this.config())}reBuild(e){this.built=!1,this.build(e)}build(e){this.built||(this.cfg.set(e),this.built=!0)}toggleDropdown(){this.dropdowns.toggle(this.dropdownId)}closeDropdown(){this.dropdowns.close(this.dropdownId)}onItemClick(e){["click","logout"].includes(e?.type)?this.onAction.emit(e.type):e?.click?.(),this.closeDropdown()}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavUserDropDown,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavUserDropDown,isStandalone:!0,selector:"aif-nav-user-dropdown",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},variant:{classPropertyName:"variant",publicName:"variant",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onAction:"onAction"},ngImport:i0,template:'<div class="relative">\n <button type="button" (click)="toggleDropdown()" [class]="buttonClass()">\n <span [class]="avatarWrapperClass()">\n @if (avatar()) {\n <img [src]="avatar()" [class]="avatarImageClass()" alt="User" />\n } @else {\n <div [class]="avatarImageClass()" class="flex h-full w-full items-center justify-center bg-gray-100 text-gray-500 dark:bg-gray-800">\n <i class="aif aif-user-ico text-xl"></i>\n </div>\n }\n </span>\n @if (!isFront()) {\n <span class="mr-1 block font-medium text-theme-sm">{{ name() }}</span>\n }\n @if (!isFront()) {\n <svg [class]="arrowClass()" [class.rotate-180]="isOpen()" width="18" height="20" viewBox="0 0 18 20"\n fill="none" xmlns="http://www.w3.org/2000/svg">\n <path d="M4.3125 8.65625L9 13.3437L13.6875 8.65625" stroke="currentColor" stroke-width="1.5"\n stroke-linecap="round" stroke-linejoin="round" />\n </svg>\n }\n </button>\n\n <aif-dropdown [isOpen]="isOpen()" (close)="closeDropdown()" [className]="panelClass()">\n @if (isFront()) {\n <div class="relative">\n <div class="bg-gradient-to-tr from-primary to-red-600 py-8"></div>\n <div class="absolute start-0 -bottom-7 px-4">\n <div class="flex items-end">\n <img [src]="avatar()" class="size-10 rounded-full shadow-sm dark:shadow-gray-700" alt="User">\n <span class="ms-1 text-[15px] font-semibold">{{ name() }}</span>\n </div>\n </div>\n </div>\n\n <div class="mt-10 px-4">\n @if (email()) {\n <span class="block text-xs text-gray-500 dark:text-gray-400">{{ email() }}</span>\n }\n </div>\n\n <ul class="py-2 text-start">\n @if(dropdown().length) {\n @for (item of dropdown(); track $index) {\n @if (item.route) {\n <li>\n <a [routerLink]="item?.route" (click)="closeDropdown()"\n class="block px-4 py-1.5 text-[14px] font-semibold hover:text-primary">\n <i class="{{ item.icon ? item.icon : \'\' }} me-1 align-middle text-[16px]"></i>\n {{ item.label }}\n </a>\n </li>\n } @else if (item.type === \'logout\' || item.type === \'click\' || typeof item.click === \'function\') {\n <li>\n <a (click)="onItemClick(item)"\n class="block cursor-pointer px-4 py-1.5 text-[14px] font-semibold hover:text-primary">\n <i class="{{ item.icon ? item.icon : \'\' }} me-1 align-middle text-[16px]"></i>\n {{ item.label }}\n </a>\n </li>\n } @else if(item.type ==\'divider\') {\n <li class="my-2 border-t border-gray-100 dark:border-gray-800"> </li>\n }\n }\n }\n </ul>\n } @else {\n <div>\n <span class="block font-medium text-gray-700 text-theme-sm dark:text-gray-400">\n {{ name() }}\n </span>\n <span class="mt-0.5 block text-theme-xs text-gray-500 dark:text-gray-400">\n {{ email() }}\n </span>\n </div>\n\n <ul class="flex flex-col gap-1 pt-4 pb-3 border-b border-gray-200 dark:border-gray-800">\n @if(dropdown().length) {\n @for (item of dropdown(); track $index) {\n @if (item.route) {\n <li>\n <a (click)="closeDropdown()" [routerLink]="item?.route"\n class="flex items-center gap-3 px-3 py-2 font-medium rounded-lg group text-[14px] font-semibold hover:text-primary cursor-pointer">\n <i class="{{ item.icon? item.icon : \'\' }} align-middle me-1"></i>\n {{ item.label }}\n </a>\n </li>\n } @else if (item.type === \'logout\' || item.type === \'click\' || typeof item.click === \'function\') {\n <li>\n <a (click)="onItemClick(item)"\n class="flex items-center gap-3 px-3 py-2 font-medium rounded-lg group text-[14px] font-semibold hover:text-primary cursor-pointer">\n <i class="{{ item.icon? item.icon : \'\' }} align-middle me-1"></i> {{ item.label }}\n </a>\n </li>\n } @else if(item.type ==\'divider\') {\n <li class="border-t border-gray-200 dark:border-gray-600 my-2"> </li>\n }\n }\n }\n </ul>\n }\n </aif-dropdown>\n</div>\n',styles:[""],dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]},{kind:"component",type:AifDropDown,selector:"aif-dropdown",inputs:["isOpen","className"],outputs:["close"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavUserDropDown,decorators:[{type:Component,args:[{selector:"aif-nav-user-dropdown",imports:[RouterLink,AifDropDown],template:'<div class="relative">\n <button type="button" (click)="toggleDropdown()" [class]="buttonClass()">\n <span [class]="avatarWrapperClass()">\n @if (avatar()) {\n <img [src]="avatar()" [class]="avatarImageClass()" alt="User" />\n } @else {\n <div [class]="avatarImageClass()" class="flex h-full w-full items-center justify-center bg-gray-100 text-gray-500 dark:bg-gray-800">\n <i class="aif aif-user-ico text-xl"></i>\n </div>\n }\n </span>\n @if (!isFront()) {\n <span class="mr-1 block font-medium text-theme-sm">{{ name() }}</span>\n }\n @if (!isFront()) {\n <svg [class]="arrowClass()" [class.rotate-180]="isOpen()" width="18" height="20" viewBox="0 0 18 20"\n fill="none" xmlns="http://www.w3.org/2000/svg">\n <path d="M4.3125 8.65625L9 13.3437L13.6875 8.65625" stroke="currentColor" stroke-width="1.5"\n stroke-linecap="round" stroke-linejoin="round" />\n </svg>\n }\n </button>\n\n <aif-dropdown [isOpen]="isOpen()" (close)="closeDropdown()" [className]="panelClass()">\n @if (isFront()) {\n <div class="relative">\n <div class="bg-gradient-to-tr from-primary to-red-600 py-8"></div>\n <div class="absolute start-0 -bottom-7 px-4">\n <div class="flex items-end">\n <img [src]="avatar()" class="size-10 rounded-full shadow-sm dark:shadow-gray-700" alt="User">\n <span class="ms-1 text-[15px] font-semibold">{{ name() }}</span>\n </div>\n </div>\n </div>\n\n <div class="mt-10 px-4">\n @if (email()) {\n <span class="block text-xs text-gray-500 dark:text-gray-400">{{ email() }}</span>\n }\n </div>\n\n <ul class="py-2 text-start">\n @if(dropdown().length) {\n @for (item of dropdown(); track $index) {\n @if (item.route) {\n <li>\n <a [routerLink]="item?.route" (click)="closeDropdown()"\n class="block px-4 py-1.5 text-[14px] font-semibold hover:text-primary">\n <i class="{{ item.icon ? item.icon : \'\' }} me-1 align-middle text-[16px]"></i>\n {{ item.label }}\n </a>\n </li>\n } @else if (item.type === \'logout\' || item.type === \'click\' || typeof item.click === \'function\') {\n <li>\n <a (click)="onItemClick(item)"\n class="block cursor-pointer px-4 py-1.5 text-[14px] font-semibold hover:text-primary">\n <i class="{{ item.icon ? item.icon : \'\' }} me-1 align-middle text-[16px]"></i>\n {{ item.label }}\n </a>\n </li>\n } @else if(item.type ==\'divider\') {\n <li class="my-2 border-t border-gray-100 dark:border-gray-800"> </li>\n }\n }\n }\n </ul>\n } @else {\n <div>\n <span class="block font-medium text-gray-700 text-theme-sm dark:text-gray-400">\n {{ name() }}\n </span>\n <span class="mt-0.5 block text-theme-xs text-gray-500 dark:text-gray-400">\n {{ email() }}\n </span>\n </div>\n\n <ul class="flex flex-col gap-1 pt-4 pb-3 border-b border-gray-200 dark:border-gray-800">\n @if(dropdown().length) {\n @for (item of dropdown(); track $index) {\n @if (item.route) {\n <li>\n <a (click)="closeDropdown()" [routerLink]="item?.route"\n class="flex items-center gap-3 px-3 py-2 font-medium rounded-lg group text-[14px] font-semibold hover:text-primary cursor-pointer">\n <i class="{{ item.icon? item.icon : \'\' }} align-middle me-1"></i>\n {{ item.label }}\n </a>\n </li>\n } @else if (item.type === \'logout\' || item.type === \'click\' || typeof item.click === \'function\') {\n <li>\n <a (click)="onItemClick(item)"\n class="flex items-center gap-3 px-3 py-2 font-medium rounded-lg group text-[14px] font-semibold hover:text-primary cursor-pointer">\n <i class="{{ item.icon? item.icon : \'\' }} align-middle me-1"></i> {{ item.label }}\n </a>\n </li>\n } @else if(item.type ==\'divider\') {\n <li class="border-t border-gray-200 dark:border-gray-600 my-2"> </li>\n }\n }\n }\n </ul>\n }\n </aif-dropdown>\n</div>\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],variant:[{type:i0.Input,args:[{isSignal:!0,alias:"variant",required:!1}]}],onAction:[{type:i0.Output,args:["onAction"]}]}});class AifNavSearch{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);variant=input("back",...ngDevMode?[{debugName:"variant"}]:[]);submitted=output();builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);term=signal("",...ngDevMode?[{debugName:"term"}]:[]);state=computed(()=>{const e=AifNavSearch.config(this.variant()),t=this.config(),n=this.builtConfig(),i=n??t;return{...e,...t??{},...n??{},value:i?.value??""}},...ngDevMode?[{debugName:"state"}]:[]);ngOnInit(){this.term.set(this.state().value||"")}build(e){this.builtConfig.set(e),this.term.set(e?.value||"")}reBuild(e){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.term.set(this.config()?.value||"")}onInput(e){this.term.set(e.target.value)}submit(e){e?.preventDefault();const t=this.term();this.state().submit?.(t,e),this.submitted.emit(t)}static config(e="back"){return{placeholder:"front"===e?"Buscar...":"Search or type command…",icon:"aif aif-search-alt-ico",id:"front"===e?"front-nav-search":"back-nav-search",value:"",shortcut:"back"===e?"⌘ K":""}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavSearch,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavSearch,isStandalone:!0,selector:"aif-nav-search",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},variant:{classPropertyName:"variant",publicName:"variant",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{submitted:"submitted"},ngImport:i0,template:'@if (state(); as vm) {\n@if (variant() === \'front\') {\n<div class="form-icon relative">\n <i [class]="vm.icon" class="absolute top-1/2 -translate-y-1/2 start-3"></i>\n <input type="text" [value]="term()" (input)="onInput($event)" (keyup.enter)="submit($event)"\n class="form-input sm:w-44 w-28 ps-10 py-2 px-3 h-10 dark:bg-slate-900 dark:text-slate-200 rounded-3xl outline-none border border-gray-200 focus:border-primary dark:border-gray-800 dark:focus:border-primary focus:ring-0 bg-white"\n [name]="vm.id || \'front-nav-search\'" [id]="vm.id || \'front-nav-search\'" [placeholder]="vm.placeholder || \'\'">\n</div>\n} @else {\n<form (submit)="submit($event)">\n <div class="relative">\n <i [class]="vm.icon"\n class="pointer-events-none absolute left-4 top-1/2 -translate-y-1/2 text-gray-400 dark:text-gray-500"></i>\n <input type="text" [value]="term()" (input)="onInput($event)" [placeholder]="vm.placeholder || \'\'"\n [name]="vm.id || \'back-nav-search\'" [id]="vm.id || \'back-nav-search\'" class="dark:bg-dark-900 h-11 w-full rounded-lg border border-gray-200\n bg-transparent py-2.5 pl-12 pr-14 text-sm text-gray-800\n shadow-theme-xs placeholder:text-gray-400\n focus:border-brand-300 focus:outline-hidden focus:ring-3\n focus:ring-brand-500/10 dark:border-gray-800 dark:bg-gray-900\n dark:bg-white/[0.03] dark:text-white/90\n dark:placeholder:text-white/30 dark:focus:border-brand-800\n xl:w-[430px]" />\n @if (vm.shortcut) {\n <button type="submit" class="absolute right-2.5 top-1/2 inline-flex -translate-y-1/2\n items-center gap-0.5 rounded-lg border border-gray-200\n bg-gray-50 px-[7px] py-[4.5px] text-xs -tracking-[0.2px]\n text-gray-500 dark:border-gray-800 dark:bg-white/[0.03]\n dark:text-gray-400">\n {{ vm.shortcut }}\n </button>\n } @else {\n <button type="submit"\n class="absolute right-2.5 top-1/2 inline-flex -translate-y-1/2 rounded-lg px-2 py-1 text-xs text-gray-500 dark:text-gray-400">\n Ir\n </button>\n }\n </div>\n</form>\n}\n}\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavSearch,decorators:[{type:Component,args:[{selector:"aif-nav-search",standalone:!0,template:'@if (state(); as vm) {\n@if (variant() === \'front\') {\n<div class="form-icon relative">\n <i [class]="vm.icon" class="absolute top-1/2 -translate-y-1/2 start-3"></i>\n <input type="text" [value]="term()" (input)="onInput($event)" (keyup.enter)="submit($event)"\n class="form-input sm:w-44 w-28 ps-10 py-2 px-3 h-10 dark:bg-slate-900 dark:text-slate-200 rounded-3xl outline-none border border-gray-200 focus:border-primary dark:border-gray-800 dark:focus:border-primary focus:ring-0 bg-white"\n [name]="vm.id || \'front-nav-search\'" [id]="vm.id || \'front-nav-search\'" [placeholder]="vm.placeholder || \'\'">\n</div>\n} @else {\n<form (submit)="submit($event)">\n <div class="relative">\n <i [class]="vm.icon"\n class="pointer-events-none absolute left-4 top-1/2 -translate-y-1/2 text-gray-400 dark:text-gray-500"></i>\n <input type="text" [value]="term()" (input)="onInput($event)" [placeholder]="vm.placeholder || \'\'"\n [name]="vm.id || \'back-nav-search\'" [id]="vm.id || \'back-nav-search\'" class="dark:bg-dark-900 h-11 w-full rounded-lg border border-gray-200\n bg-transparent py-2.5 pl-12 pr-14 text-sm text-gray-800\n shadow-theme-xs placeholder:text-gray-400\n focus:border-brand-300 focus:outline-hidden focus:ring-3\n focus:ring-brand-500/10 dark:border-gray-800 dark:bg-gray-900\n dark:bg-white/[0.03] dark:text-white/90\n dark:placeholder:text-white/30 dark:focus:border-brand-800\n xl:w-[430px]" />\n @if (vm.shortcut) {\n <button type="submit" class="absolute right-2.5 top-1/2 inline-flex -translate-y-1/2\n items-center gap-0.5 rounded-lg border border-gray-200\n bg-gray-50 px-[7px] py-[4.5px] text-xs -tracking-[0.2px]\n text-gray-500 dark:border-gray-800 dark:bg-white/[0.03]\n dark:text-gray-400">\n {{ vm.shortcut }}\n </button>\n } @else {\n <button type="submit"\n class="absolute right-2.5 top-1/2 inline-flex -translate-y-1/2 rounded-lg px-2 py-1 text-xs text-gray-500 dark:text-gray-400">\n Ir\n </button>\n }\n </div>\n</form>\n}\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],variant:[{type:i0.Input,args:[{isSignal:!0,alias:"variant",required:!1}]}],submitted:[{type:i0.Output,args:["submitted"]}]}});class AifFrontNavHeader{router=inject(Router);_sb1;_sb2;removeScrollListener;scrollFrame=0;built=!1;config=input(null,...ngDevMode?[{debugName:"config"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);state=computed(()=>{const e=AifFrontNavHeader.config(),t=this.config(),n=this.builtConfig(),i=n??t;return{...e,...t??{},...n??{},data:i?.data??e.data,logo:i?.logo??e.logo,btns:i?.btns??e.btns,search:i?.search??e.search,surface:i?.surface??e.surface,loginRoute:i?.loginRoute??e.loginRoute??"/auth-login"}},...ngDevMode?[{debugName:"state"}]:[]);logo=computed(()=>this.state().logo,...ngDevMode?[{debugName:"logo"}]:[]);btns=computed(()=>this.state().btns,...ngDevMode?[{debugName:"btns"}]:[]);search=computed(()=>this.state().search,...ngDevMode?[{debugName:"search"}]:[]);isSolidSurface=computed(()=>"transparent"!==this.state().surface,...ngDevMode?[{debugName:"isSolidSurface"}]:[]);nav_items=signal([],...ngDevMode?[{debugName:"nav_items"}]:[]);nav_lang=signal([],...ngDevMode?[{debugName:"nav_lang"}]:[]);nav_user=signal(null,...ngDevMode?[{debugName:"nav_user"}]:[]);hasUserSession=signal(!1,...ngDevMode?[{debugName:"hasUserSession"}]:[]);activeItemMap=signal({},...ngDevMode?[{debugName:"activeItemMap"}]:[]);expandedItemMap=signal({},...ngDevMode?[{debugName:"expandedItemMap"}]:[]);status=signal(!1,...ngDevMode?[{debugName:"status"}]:[]);isSticky=signal(!1,...ngDevMode?[{debugName:"isSticky"}]:[]);ngOnInit(){this.calculateActiveState(this.router.url,this.nav_items()),this.bindScrollState(),this.updateStickyState(),this._sb1=this.router.events.subscribe(e=>{e instanceof NavigationEnd&&(this.calculateActiveState(e.urlAfterRedirects||e.url,this.nav_items()),this.closeMenu())}),window.scrollTo(0,0),this._sb2=lang_subscribe("change",()=>{this.loadNavItems()});const e=this.config();e&&this.reBuild(e)}ngOnDestroy(){this._sb1?.unsubscribe(),this._sb2?.unsubscribe(),this.scrollFrame&&cancelAnimationFrame(this.scrollFrame),this.removeScrollListener?.()}calculateActiveState(e,t){const n={},i=(e,t)=>{let a=!1;for(const s of t){let t=!1;t=(s.matchRoutes??(s.route?[s.route]:[])).some(t=>{if(!t)return!1;const n=e.split("?")[0].split("#")[0];return n===t||n.startsWith(t+"/")});let o=!1;if(s.children&&s.children.length>0&&i(e,s.children)&&(o=!0),s.categories)for(const t of s.categories)t.items&&i(e,t.items)&&(o=!0);(t||o)&&(n[s.id]=!0,a=!0)}return a};return i(e,t),this.activeItemMap.set(n),Object.keys(n).length>0}toggleItem(e){this.expandedItemMap.update(t=>({...t,[e]:!t[e]}))}closeMenu(e){e&&e.stopPropagation(),this.status.set(!1),this.expandedItemMap.set({})}reBuild(e){return this.resetToInput(),this.build(e)}build(e=null){return this.built?Promise.resolve(!0):(this.built=!0,e&&this.builtConfig.set(this.normalizeConfig(e)),new Promise(e=>{this.loadNavItems(t=>{e(t)})}))}resetToInput(){this.built=!1,this.builtConfig.set(null)}setUser(e){this.nav_user.set(e)}setUserSession(e){this.hasUserSession.set(e)}loadNavItems(e){const t="function"==typeof e,n=this.state();if(!n)return void(t&&e(!1));if(n.data)return this.nav_items.set(n.data.nav||[]),this.nav_lang.set(n.data.lang||[]),this.calculateActiveState(this.router.url,n.data.nav||[]),void(t&&e(!0));const i=n?.resource;if(!i)return void(t&&e(!1));const a=str_replace_vars(i||"",{lang:lang()}),s=a.includes(".json")||a.startsWith("assets/")||a.startsWith("./")||a.startsWith("../")||a.startsWith("http");(s?wHttp(a):rq_get(a)).then(t=>{const n=s?t:t?.data||t||{};this.nav_items.set(n.nav||[]),this.nav_lang.set(n.lang||[]),this.calculateActiveState(this.router.url,n.nav||[]),"function"==typeof e&&e(!0)}).catch(()=>{this.nav_items.set([]),this.nav_lang.set([]),"function"==typeof e&&e(!1)})}nav_toggle(){this.status.update(e=>!e)}bindScrollState(){const e=()=>{this.scrollFrame||(this.scrollFrame=requestAnimationFrame(()=>{this.updateStickyState(),this.scrollFrame=0}))};window.addEventListener("scroll",e,{passive:!0}),this.removeScrollListener=()=>window.removeEventListener("scroll",e)}updateStickyState(){const e=window.scrollY||document.documentElement.scrollTop||document.body.scrollTop||0;this.isSticky.set(e>=50)}normalizeConfig(e){return{...e,showUser:"boolean"!=typeof e.showUser||e.showUser}}static config(e={}){return{showUser:!0,surface:"transparent",...e}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFrontNavHeader,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFrontNavHeader,isStandalone:!0,selector:"aif-front-nav-header",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (state(); as vm) {\n<nav id="topnav" class="defaultscroll is-sticky" [class.nav-sticky]="isSolidSurface() || isSticky()">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8 flow-root">\n \x3c!-- Logo --\x3e\n @if (vm.logo) {\n <aif-nav-logo [cfg]="vm.logo" surface="front-nav"></aif-nav-logo>\n }\n \x3c!-- End Logo --\x3e\n\n @if (nav_items().length > 0) {\n <div class="menu-extras">\n <div class="menu-item">\n <a class="navbar-toggle" id="isToggle" [ngClass]="{\'open\': status()}" (click)="nav_toggle()">\n <div class="lines">\n <span></span>\n <span></span>\n <span></span>\n </div>\n </a>\n </div>\n </div>\n }\n \x3c!-- End Mobile menu toggle--\x3e\n\n\n <ul class="buy-button list-none mb-0">\n \x3c!-- Search --\x3e\n @if (vm.search) {\n <li class="inline-block mb-0">\n <aif-nav-search [config]="vm.search" variant="front" />\n </li>\n }\n \x3c!-- End Search --\x3e\n\n \x3c!-- Buy Button --\x3e\n @if (vm.btns) {\n @for (btn of vm.btns; track $index) {\n @switch (btn.type) {\n @case (\'divider\') {\n <li class="inline-block ps-1 mb-0">\n <div class="divider h-px my-4 bg-gray-200 dark:bg-gray-700"></div>\n </li>\n }\n @default {\n <li class="inline-block ps-1 mb-0">\n <aif-nav-action-button [route]="btn.route || \'/\'" [title]="btn.title || \'\'" variant="front-circle">\n <i class="{{ btn.icon }}"></i>\n </aif-nav-action-button>\n </li>\n }\n }\n }\n }\n \x3c!-- End Buy Button --\x3e\n\n \x3c!-- Language --\x3e\n @if (nav_lang() ) {\n <li class="dropdown inline-block relative ps-1">\n <aif-nav-lang-dropdown [config]="nav_lang()" variant="front" />\n </li>\n }\n \x3c!-- End Language --\x3e\n\n \x3c!-- User Menu --\x3e\n @if(vm.showUser) {\n @if(hasUserSession()) {\n <li class="dropdown inline-block relative ps-1">\n <aif-nav-user-dropdown [config]="nav_user()" variant="front"\n (onAction)="state().actions?.onUserAction?.($event)" />\n </li>\n } @else {\n <li class="dropdown inline-block relative ps-1">\n <aif-nav-action-button [route]="state().loginRoute!" title="Login" variant="front-circle">\n <i class="aif aif-user-ico align-middle text-lg"></i>\n </aif-nav-action-button>\n </li>\n }\n }\n </ul>\n \x3c!--Login button End--\x3e\n\n\n \x3c!--Navigation Menu--\x3e\n @if(nav_items().length > 0) {\n <div id="navigation" [style]="status() ? \'display: block;\' : \'display: none;\'">\n <ul class="navigation-menu nav-light">\n @for (item of nav_items(); track item.id) {\n <ng-container *ngTemplateOutlet="menuNode; context:{ item: item, level: 0 }"></ng-container>\n }\n </ul>\n </div>\x3c!--end navigation--\x3e\n }\n </div>\n\n</nav>\n}\n\n\x3c!-- Recursive Menu Template --\x3e\n<ng-template #menuNode let-item="item" let-level="level">\n\n \x3c!-- LINK SIMPLE --\x3e\n @if (item.type === \'link\') {\n <li [class.active]="!!activeItemMap()[item.id]">\n <a [routerLink]="item.route" class="sub-menu-item" (click)="closeMenu($event)">\n {{ item.label }}\n </a>\n </li>\n }\n\n @else if (item.type === \'megamenu\') {\n <li class="has-submenu parent-parent-menu-item" [class.active]="!!activeItemMap()[item.id]"\n [class.open]="!!expandedItemMap()[item.id]">\n\n <a href="javascript:void(0)" (click)="toggleItem(item.id)">{{ item.label }}</a>\n <span class="menu-arrow"></span>\n\n <div class="submenu megamenu ..." [class.open]="!!expandedItemMap()[item.id]">\n ...\n </div>\n </li>\n }\n\n @else if (item.type === \'submenu\') {\n <li class="has-submenu" [class.active]="!!activeItemMap()[item.id]" [class.open]="!!expandedItemMap()[item.id]"\n [ngClass]="{\'parent-menu-item\': level > 0, \'parent-parent-menu-item\': level === 0}">\n\n <a href="javascript:void(0)" (click)="toggleItem(item.id)">\n {{ item.label }}\n </a>\n\n <span class="" [ngClass]="{\'menu-arrow\': level === 0, \'submenu-arrow\': level > 0}"></span>\n\n <ul class="submenu" [class.open]="!!expandedItemMap()[item.id]">\n @for (child of item.children ?? []; track child.id) {\n <ng-container *ngTemplateOutlet="menuNode; context:{ item: child, level: level + 1 }"></ng-container>\n }\n </ul>\n </li>\n }\n\n \x3c!-- FALLBACK to simple link if type is missing but has route --\x3e\n @else if (item.route) {\n <li [class.active]="!!activeItemMap()[item.id]">\n <a [routerLink]="item.route" class="sub-menu-item" (click)="closeMenu($event)">\n {{ item.label }}\n </a>\n </li>\n }\n</ng-template>',styles:['.has-submenu>.submenu,.has-submenu>.megamenu{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .2s ease}.has-submenu.open>.submenu,.has-submenu.open>.megamenu{opacity:1;visibility:visible;pointer-events:auto}@media(min-width:992px){.has-submenu:hover>.submenu,.has-submenu:hover>.megamenu{opacity:1;visibility:visible;pointer-events:auto}.has-submenu{position:relative}.has-submenu:after{content:"";position:absolute;top:0;left:100%;width:18px;height:100%;pointer-events:auto}.has-submenu>.submenu{position:absolute;top:0;left:calc(100% - 2px)}}.has-submenu>a{position:relative}.submenu-arrow{position:absolute;left:calc(100% - 14px);top:50%;width:6px;height:6px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;pointer-events:none;transition:transform .18s ease,opacity .18s ease}@media(min-width:992px){li.has-submenu:hover>a+.submenu-arrow{opacity:1;transform:rotate(180deg)}}\n'],dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:NgTemplateOutlet,selector:"[ngTemplateOutlet]",inputs:["ngTemplateOutletContext","ngTemplateOutlet","ngTemplateOutletInjector"]},{kind:"component",type:AifNavActionButton,selector:"aif-nav-action-button",inputs:["route","title","ariaLabel","variant","active","extraClass"],outputs:["clicked"]},{kind:"component",type:AifNavLogo,selector:"aif-nav-logo",inputs:["cfg","surface"]},{kind:"component",type:AifNavLangDropDown,selector:"aif-nav-lang-dropdown",inputs:["config","variant"]},{kind:"component",type:AifNavUserDropDown,selector:"aif-nav-user-dropdown",inputs:["config","variant"],outputs:["onAction"]},{kind:"component",type:AifNavSearch,selector:"aif-nav-search",inputs:["config","variant"],outputs:["submitted"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFrontNavHeader,decorators:[{type:Component,args:[{selector:"aif-front-nav-header",standalone:!0,imports:[RouterLink,NgClass,NgTemplateOutlet,AifNavActionButton,AifNavLogo,AifNavLangDropDown,AifNavUserDropDown,AifNavSearch],template:'@if (state(); as vm) {\n<nav id="topnav" class="defaultscroll is-sticky" [class.nav-sticky]="isSolidSurface() || isSticky()">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8 flow-root">\n \x3c!-- Logo --\x3e\n @if (vm.logo) {\n <aif-nav-logo [cfg]="vm.logo" surface="front-nav"></aif-nav-logo>\n }\n \x3c!-- End Logo --\x3e\n\n @if (nav_items().length > 0) {\n <div class="menu-extras">\n <div class="menu-item">\n <a class="navbar-toggle" id="isToggle" [ngClass]="{\'open\': status()}" (click)="nav_toggle()">\n <div class="lines">\n <span></span>\n <span></span>\n <span></span>\n </div>\n </a>\n </div>\n </div>\n }\n \x3c!-- End Mobile menu toggle--\x3e\n\n\n <ul class="buy-button list-none mb-0">\n \x3c!-- Search --\x3e\n @if (vm.search) {\n <li class="inline-block mb-0">\n <aif-nav-search [config]="vm.search" variant="front" />\n </li>\n }\n \x3c!-- End Search --\x3e\n\n \x3c!-- Buy Button --\x3e\n @if (vm.btns) {\n @for (btn of vm.btns; track $index) {\n @switch (btn.type) {\n @case (\'divider\') {\n <li class="inline-block ps-1 mb-0">\n <div class="divider h-px my-4 bg-gray-200 dark:bg-gray-700"></div>\n </li>\n }\n @default {\n <li class="inline-block ps-1 mb-0">\n <aif-nav-action-button [route]="btn.route || \'/\'" [title]="btn.title || \'\'" variant="front-circle">\n <i class="{{ btn.icon }}"></i>\n </aif-nav-action-button>\n </li>\n }\n }\n }\n }\n \x3c!-- End Buy Button --\x3e\n\n \x3c!-- Language --\x3e\n @if (nav_lang() ) {\n <li class="dropdown inline-block relative ps-1">\n <aif-nav-lang-dropdown [config]="nav_lang()" variant="front" />\n </li>\n }\n \x3c!-- End Language --\x3e\n\n \x3c!-- User Menu --\x3e\n @if(vm.showUser) {\n @if(hasUserSession()) {\n <li class="dropdown inline-block relative ps-1">\n <aif-nav-user-dropdown [config]="nav_user()" variant="front"\n (onAction)="state().actions?.onUserAction?.($event)" />\n </li>\n } @else {\n <li class="dropdown inline-block relative ps-1">\n <aif-nav-action-button [route]="state().loginRoute!" title="Login" variant="front-circle">\n <i class="aif aif-user-ico align-middle text-lg"></i>\n </aif-nav-action-button>\n </li>\n }\n }\n </ul>\n \x3c!--Login button End--\x3e\n\n\n \x3c!--Navigation Menu--\x3e\n @if(nav_items().length > 0) {\n <div id="navigation" [style]="status() ? \'display: block;\' : \'display: none;\'">\n <ul class="navigation-menu nav-light">\n @for (item of nav_items(); track item.id) {\n <ng-container *ngTemplateOutlet="menuNode; context:{ item: item, level: 0 }"></ng-container>\n }\n </ul>\n </div>\x3c!--end navigation--\x3e\n }\n </div>\n\n</nav>\n}\n\n\x3c!-- Recursive Menu Template --\x3e\n<ng-template #menuNode let-item="item" let-level="level">\n\n \x3c!-- LINK SIMPLE --\x3e\n @if (item.type === \'link\') {\n <li [class.active]="!!activeItemMap()[item.id]">\n <a [routerLink]="item.route" class="sub-menu-item" (click)="closeMenu($event)">\n {{ item.label }}\n </a>\n </li>\n }\n\n @else if (item.type === \'megamenu\') {\n <li class="has-submenu parent-parent-menu-item" [class.active]="!!activeItemMap()[item.id]"\n [class.open]="!!expandedItemMap()[item.id]">\n\n <a href="javascript:void(0)" (click)="toggleItem(item.id)">{{ item.label }}</a>\n <span class="menu-arrow"></span>\n\n <div class="submenu megamenu ..." [class.open]="!!expandedItemMap()[item.id]">\n ...\n </div>\n </li>\n }\n\n @else if (item.type === \'submenu\') {\n <li class="has-submenu" [class.active]="!!activeItemMap()[item.id]" [class.open]="!!expandedItemMap()[item.id]"\n [ngClass]="{\'parent-menu-item\': level > 0, \'parent-parent-menu-item\': level === 0}">\n\n <a href="javascript:void(0)" (click)="toggleItem(item.id)">\n {{ item.label }}\n </a>\n\n <span class="" [ngClass]="{\'menu-arrow\': level === 0, \'submenu-arrow\': level > 0}"></span>\n\n <ul class="submenu" [class.open]="!!expandedItemMap()[item.id]">\n @for (child of item.children ?? []; track child.id) {\n <ng-container *ngTemplateOutlet="menuNode; context:{ item: child, level: level + 1 }"></ng-container>\n }\n </ul>\n </li>\n }\n\n \x3c!-- FALLBACK to simple link if type is missing but has route --\x3e\n @else if (item.route) {\n <li [class.active]="!!activeItemMap()[item.id]">\n <a [routerLink]="item.route" class="sub-menu-item" (click)="closeMenu($event)">\n {{ item.label }}\n </a>\n </li>\n }\n</ng-template>',styles:['.has-submenu>.submenu,.has-submenu>.megamenu{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .2s ease}.has-submenu.open>.submenu,.has-submenu.open>.megamenu{opacity:1;visibility:visible;pointer-events:auto}@media(min-width:992px){.has-submenu:hover>.submenu,.has-submenu:hover>.megamenu{opacity:1;visibility:visible;pointer-events:auto}.has-submenu{position:relative}.has-submenu:after{content:"";position:absolute;top:0;left:100%;width:18px;height:100%;pointer-events:auto}.has-submenu>.submenu{position:absolute;top:0;left:calc(100% - 2px)}}.has-submenu>a{position:relative}.submenu-arrow{position:absolute;left:calc(100% - 14px);top:50%;width:6px;height:6px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;pointer-events:none;transition:transform .18s ease,opacity .18s ease}@media(min-width:992px){li.has-submenu:hover>a+.submenu-arrow{opacity:1;transform:rotate(180deg)}}\n']}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifThemeToggle{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);theme=inject(AifThemeService);state=computed(()=>{const e=this.builtConfig()??this.config()??{};return{variant:e.variant??"soft",size:e.size??"md",class:e.class??"",ariaLabelLight:e.ariaLabelLight??"Activar tema oscuro",ariaLabelDark:e.ariaLabelDark??"Activar tema claro"}},...ngDevMode?[{debugName:"state"}]:[]);sizeClass=computed(()=>{const e=this.state().size;return"sm"===e?"h-9 w-9":"lg"===e?"h-12 w-12":"h-11 w-11"},...ngDevMode?[{debugName:"sizeClass"}]:[]);buttonClass=computed(()=>{const e=this.state(),t="solid"===e.variant?"bg-slate-900 text-white border-slate-900 hover:bg-slate-800 dark:bg-white dark:text-slate-900 dark:border-white dark:hover:bg-slate-100":"bg-white text-gray-500 border-gray-200 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-900 dark:text-gray-400 dark:border-gray-800 dark:hover:bg-gray-800 dark:hover:text-white";return`relative flex items-center justify-center rounded-full border transition-colors ${this.sizeClass()} ${t} ${e.class}`.trim()},...ngDevMode?[{debugName:"buttonClass"}]:[]);ariaLabel=computed(()=>this.theme.isDark()?this.state().ariaLabelDark:this.state().ariaLabelLight,...ngDevMode?[{debugName:"ariaLabel"}]:[]);toggleTheme(){this.theme.toggle()}build(e){return this.builtConfig.set(e??null),this}reBuild(e){return this.builtConfig.set(null),this.build(e)}resetToInput(){return this.builtConfig.set(null),this}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeToggle,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifThemeToggle,isStandalone:!0,selector:"aif-theme-toggle",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<button type="button" (click)="toggleTheme()" [class]="buttonClass()" [attr.aria-label]="ariaLabel()">\n \x3c!-- Dark icon (moon) --\x3e\n @if (theme.isDark()) {\n <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M9.99998 1.5415C10.4142 1.5415 10.75 1.87729 10.75 2.2915V3.5415C10.75 3.95572 10.4142 4.2915 9.99998 4.2915C9.58577 4.2915 9.24998 3.95572 9.24998 3.5415V2.2915C9.24998 1.87729 9.58577 1.5415 9.99998 1.5415ZM10.0009 6.79327C8.22978 6.79327 6.79402 8.22904 6.79402 10.0001C6.79402 11.7712 8.22978 13.207 10.0009 13.207C11.772 13.207 13.2078 11.7712 13.2078 10.0001C13.2078 8.22904 11.772 6.79327 10.0009 6.79327ZM5.29402 10.0001C5.29402 7.40061 7.40135 5.29327 10.0009 5.29327C12.6004 5.29327 14.7078 7.40061 14.7078 10.0001C14.7078 12.5997 12.6004 14.707 10.0009 14.707C7.40135 14.707 5.29402 12.5997 5.29402 10.0001ZM15.9813 5.08035C16.2742 4.78746 16.2742 4.31258 15.9813 4.01969C15.6884 3.7268 15.2135 3.7268 14.9207 4.01969L14.0368 4.90357C13.7439 5.19647 13.7439 5.67134 14.0368 5.96423C14.3297 6.25713 14.8045 6.25713 15.0974 5.96423L15.9813 5.08035ZM18.4577 10.0001C18.4577 10.4143 18.1219 10.7501 17.7077 10.7501H16.4577C16.0435 10.7501 15.7077 10.4143 15.7077 10.0001C15.7077 9.58592 16.0435 9.25013 16.4577 9.25013H17.7077C18.1219 9.25013 18.4577 9.58592 18.4577 10.0001ZM14.9207 15.9806C15.2135 16.2735 15.6884 16.2735 15.9813 15.9806C16.2742 15.6877 16.2742 15.2128 15.9813 14.9199L15.0974 14.036C14.8045 13.7431 14.3297 13.7431 14.0368 14.036C13.7439 14.3289 13.7439 14.8038 14.0368 15.0967L14.9207 15.9806ZM9.99998 15.7088C10.4142 15.7088 10.75 16.0445 10.75 16.4588V17.7088C10.75 18.123 10.4142 18.4588 9.99998 18.4588C9.58577 18.4588 9.24998 18.123 9.24998 17.7088V16.4588C9.24998 16.0445 9.58577 15.7088 9.99998 15.7088ZM5.96356 15.0972C6.25646 14.8043 6.25646 14.3295 5.96356 14.0366C5.67067 13.7437 5.1958 13.7437 4.9029 14.0366L4.01902 14.9204C3.72613 15.2133 3.72613 15.6882 4.01902 15.9811C4.31191 16.274 4.78679 16.274 5.07968 15.9811L5.96356 15.0972ZM4.29224 10.0001C4.29224 10.4143 3.95645 10.7501 3.54224 10.7501H2.29224C1.87802 10.7501 1.54224 10.4143 1.54224 10.0001C1.54224 9.58592 1.87802 9.25013 2.29224 9.25013H3.54224C3.95645 9.25013 4.29224 9.58592 4.29224 10.0001ZM4.9029 5.9637C5.1958 6.25659 5.67067 6.25659 5.96356 5.9637C6.25646 5.6708 6.25646 5.19593 5.96356 4.90303L5.07968 4.01915C4.78679 3.72626 4.31191 3.72626 4.01902 4.01915C3.72613 4.31204 3.72613 4.78692 4.01902 5.07981L4.9029 5.9637Z"\n fill="currentColor" />\n </svg>\n } @else {\n <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path\n d="M17.4547 11.97L18.1799 12.1611C18.265 11.8383 18.1265 11.4982 17.8401 11.3266C17.5538 11.1551 17.1885 11.1934 16.944 11.4207L17.4547 11.97ZM8.0306 2.5459L8.57989 3.05657C8.80718 2.81209 8.84554 2.44682 8.67398 2.16046C8.50243 1.8741 8.16227 1.73559 7.83948 1.82066L8.0306 2.5459ZM12.9154 13.0035C9.64678 13.0035 6.99707 10.3538 6.99707 7.08524H5.49707C5.49707 11.1823 8.81835 14.5035 12.9154 14.5035V13.0035ZM16.944 11.4207C15.8869 12.4035 14.4721 13.0035 12.9154 13.0035V14.5035C14.8657 14.5035 16.6418 13.7499 17.9654 12.5193L16.944 11.4207ZM16.7295 11.7789C15.9437 14.7607 13.2277 16.9586 10.0003 16.9586V18.4586C13.9257 18.4586 17.2249 15.7853 18.1799 12.1611L16.7295 11.7789ZM10.0003 16.9586C6.15734 16.9586 3.04199 13.8433 3.04199 10.0003H1.54199C1.54199 14.6717 5.32892 18.4586 10.0003 18.4586V16.9586ZM3.04199 10.0003C3.04199 6.77289 5.23988 4.05695 8.22173 3.27114L7.83948 1.82066C4.21532 2.77574 1.54199 6.07486 1.54199 10.0003H3.04199ZM6.99707 7.08524C6.99707 5.52854 7.5971 4.11366 8.57989 3.05657L7.48132 2.03522C6.25073 3.35885 5.49707 5.13487 5.49707 7.08524H6.99707Z"\n fill="currentColor" />\n </svg>\n }\n</button>\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeToggle,decorators:[{type:Component,args:[{selector:"aif-theme-toggle",standalone:!0,imports:[],template:'<button type="button" (click)="toggleTheme()" [class]="buttonClass()" [attr.aria-label]="ariaLabel()">\n \x3c!-- Dark icon (moon) --\x3e\n @if (theme.isDark()) {\n <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M9.99998 1.5415C10.4142 1.5415 10.75 1.87729 10.75 2.2915V3.5415C10.75 3.95572 10.4142 4.2915 9.99998 4.2915C9.58577 4.2915 9.24998 3.95572 9.24998 3.5415V2.2915C9.24998 1.87729 9.58577 1.5415 9.99998 1.5415ZM10.0009 6.79327C8.22978 6.79327 6.79402 8.22904 6.79402 10.0001C6.79402 11.7712 8.22978 13.207 10.0009 13.207C11.772 13.207 13.2078 11.7712 13.2078 10.0001C13.2078 8.22904 11.772 6.79327 10.0009 6.79327ZM5.29402 10.0001C5.29402 7.40061 7.40135 5.29327 10.0009 5.29327C12.6004 5.29327 14.7078 7.40061 14.7078 10.0001C14.7078 12.5997 12.6004 14.707 10.0009 14.707C7.40135 14.707 5.29402 12.5997 5.29402 10.0001ZM15.9813 5.08035C16.2742 4.78746 16.2742 4.31258 15.9813 4.01969C15.6884 3.7268 15.2135 3.7268 14.9207 4.01969L14.0368 4.90357C13.7439 5.19647 13.7439 5.67134 14.0368 5.96423C14.3297 6.25713 14.8045 6.25713 15.0974 5.96423L15.9813 5.08035ZM18.4577 10.0001C18.4577 10.4143 18.1219 10.7501 17.7077 10.7501H16.4577C16.0435 10.7501 15.7077 10.4143 15.7077 10.0001C15.7077 9.58592 16.0435 9.25013 16.4577 9.25013H17.7077C18.1219 9.25013 18.4577 9.58592 18.4577 10.0001ZM14.9207 15.9806C15.2135 16.2735 15.6884 16.2735 15.9813 15.9806C16.2742 15.6877 16.2742 15.2128 15.9813 14.9199L15.0974 14.036C14.8045 13.7431 14.3297 13.7431 14.0368 14.036C13.7439 14.3289 13.7439 14.8038 14.0368 15.0967L14.9207 15.9806ZM9.99998 15.7088C10.4142 15.7088 10.75 16.0445 10.75 16.4588V17.7088C10.75 18.123 10.4142 18.4588 9.99998 18.4588C9.58577 18.4588 9.24998 18.123 9.24998 17.7088V16.4588C9.24998 16.0445 9.58577 15.7088 9.99998 15.7088ZM5.96356 15.0972C6.25646 14.8043 6.25646 14.3295 5.96356 14.0366C5.67067 13.7437 5.1958 13.7437 4.9029 14.0366L4.01902 14.9204C3.72613 15.2133 3.72613 15.6882 4.01902 15.9811C4.31191 16.274 4.78679 16.274 5.07968 15.9811L5.96356 15.0972ZM4.29224 10.0001C4.29224 10.4143 3.95645 10.7501 3.54224 10.7501H2.29224C1.87802 10.7501 1.54224 10.4143 1.54224 10.0001C1.54224 9.58592 1.87802 9.25013 2.29224 9.25013H3.54224C3.95645 9.25013 4.29224 9.58592 4.29224 10.0001ZM4.9029 5.9637C5.1958 6.25659 5.67067 6.25659 5.96356 5.9637C6.25646 5.6708 6.25646 5.19593 5.96356 4.90303L5.07968 4.01915C4.78679 3.72626 4.31191 3.72626 4.01902 4.01915C3.72613 4.31204 3.72613 4.78692 4.01902 5.07981L4.9029 5.9637Z"\n fill="currentColor" />\n </svg>\n } @else {\n <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path\n d="M17.4547 11.97L18.1799 12.1611C18.265 11.8383 18.1265 11.4982 17.8401 11.3266C17.5538 11.1551 17.1885 11.1934 16.944 11.4207L17.4547 11.97ZM8.0306 2.5459L8.57989 3.05657C8.80718 2.81209 8.84554 2.44682 8.67398 2.16046C8.50243 1.8741 8.16227 1.73559 7.83948 1.82066L8.0306 2.5459ZM12.9154 13.0035C9.64678 13.0035 6.99707 10.3538 6.99707 7.08524H5.49707C5.49707 11.1823 8.81835 14.5035 12.9154 14.5035V13.0035ZM16.944 11.4207C15.8869 12.4035 14.4721 13.0035 12.9154 13.0035V14.5035C14.8657 14.5035 16.6418 13.7499 17.9654 12.5193L16.944 11.4207ZM16.7295 11.7789C15.9437 14.7607 13.2277 16.9586 10.0003 16.9586V18.4586C13.9257 18.4586 17.2249 15.7853 18.1799 12.1611L16.7295 11.7789ZM10.0003 16.9586C6.15734 16.9586 3.04199 13.8433 3.04199 10.0003H1.54199C1.54199 14.6717 5.32892 18.4586 10.0003 18.4586V16.9586ZM3.04199 10.0003C3.04199 6.77289 5.23988 4.05695 8.22173 3.27114L7.83948 1.82066C4.21532 2.77574 1.54199 6.07486 1.54199 10.0003H3.04199ZM6.99707 7.08524C6.99707 5.52854 7.5971 4.11366 8.57989 3.05657L7.48132 2.03522C6.25073 3.35885 5.49707 5.13487 5.49707 7.08524H6.99707Z"\n fill="currentColor" />\n </svg>\n }\n</button>\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifNavNotificationDropdown{static nextId=0;dropdowns=inject(AifNavDropdownService);dropdownId="aif-nav-notification-dropdown-"+ ++AifNavNotificationDropdown.nextId;config=input(null,...ngDevMode?[{debugName:"config"}]:[]);notifying=signal(!1,...ngDevMode?[{debugName:"notifying"}]:[]);cfg=signal(null,...ngDevMode?[{debugName:"cfg"}]:[]);data=signal([],...ngDevMode?[{debugName:"data"}]:[]);isOpen=computed(()=>this.dropdowns.isActive(this.dropdownId),...ngDevMode?[{debugName:"isOpen"}]:[]);url=computed(()=>this.cfg()?.url||"",...ngDevMode?[{debugName:"url"}]:[]);route=computed(()=>this.cfg()?.route||"",...ngDevMode?[{debugName:"route"}]:[]);built=!1;timer;position_left=computed(()=>"-left-[20px]",...ngDevMode?[{debugName:"position_left"}]:[]);ngOnInit(){this.config()&&this.build(this.config())}build(e){this.built||(this.cfg.set(e),e&&(this.built=!0,e.data&&(this.data.set(e.data),this.checkNotifying()),e.url&&(this.fetchNotifications(),e.check_time&&(this.timer=setInterval(()=>this.fetchNotifications(),1e3*e.check_time)))))}reBuild(e){this.built=!1,this.timer&&clearInterval(this.timer),this.build(e)}fetchNotifications(){const e=this.cfg()?.url;e&&rq_get(e).then(e=>{const t=e.data||e;Array.isArray(t)&&(this.data.set(t),this.checkNotifying())})}checkNotifying(){const e=this.data().some(e=>!e.isRead);this.notifying.set(e)}toggleDropdown(){this.dropdowns.toggle(this.dropdownId)&&this.notifying.set(!1)}closeDropdown(){this.dropdowns.close(this.dropdownId)}ngOnDestroy(){this.timer&&clearInterval(this.timer)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavNotificationDropdown,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavNotificationDropdown,isStandalone:!0,selector:"aif-nav-notification-dropdown",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (cfg()) {\n<div class="relative w-full lg:w-auto">\n <aif-nav-action-button variant="back-circle" extraClass="dropdown-toggle relative" ariaLabel="Notificaciones"\n (clicked)="toggleDropdown()">\n @if (notifying()) {\n <span class="absolute right-0 top-0.5 z-10 h-2 w-2 rounded-full bg-orange-400">\n <span class="absolute inline-flex w-full h-full bg-orange-400 rounded-full opacity-75 animate-ping"></span>\n </span>\n }\n <svg class="fill-current" width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M10.75 2.29248C10.75 1.87827 10.4143 1.54248 10 1.54248C9.58583 1.54248 9.25004 1.87827 9.25004 2.29248V2.83613C6.08266 3.20733 3.62504 5.9004 3.62504 9.16748V14.4591H3.33337C2.91916 14.4591 2.58337 14.7949 2.58337 15.2091C2.58337 15.6234 2.91916 15.9591 3.33337 15.9591H4.37504H15.625H16.6667C17.0809 15.9591 17.4167 15.6234 17.4167 15.2091C17.4167 14.7949 17.0809 14.4591 16.6667 14.4591H16.375V9.16748C16.375 5.9004 13.9174 3.20733 10.75 2.83613V2.29248ZM14.875 14.4591V9.16748C14.875 6.47509 12.6924 4.29248 10 4.29248C7.30765 4.29248 5.12504 6.47509 5.12504 9.16748V14.4591H14.875ZM8.00004 17.7085C8.00004 18.1228 8.33583 18.4585 8.75004 18.4585H11.25C11.6643 18.4585 12 18.1228 12 17.7085C12 17.2943 11.6643 16.9585 11.25 16.9585H8.75004C8.33583 16.9585 8.00004 17.2943 8.00004 17.7085Z"\n fill="currentColor" />\n </svg>\n </aif-nav-action-button>\n <aif-dropdown [isOpen]="isOpen()" (close)="closeDropdown()" [className]="position_left() + \' absolute \n xl:-left-[320px] \n mt-[17px] \n flex h-[480px] w-[350px] flex-col rounded-2xl border border-gray-200 bg-white p-3\n shadow-theme-lg dark:border-gray-800 dark:bg-gray-dark sm:w-[361px]\'">\n <div class="flex items-center justify-between pb-3 mb-3 border-b border-gray-100 dark:border-gray-700">\n <h5 class="text-lg font-semibold text-gray-800 dark:text-gray-200">\n Notificaciones\n </h5>\n <button (click)="toggleDropdown()"\n class="text-gray-500 transition dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200">\n <svg class="fill-current" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M6.21967 7.28131C5.92678 6.98841 5.92678 6.51354 6.21967 6.22065C6.51256 5.92775 6.98744 5.92775 7.28033 6.22065L11.999 10.9393L16.7176 6.22078C17.0105 5.92789 17.4854 5.92788 17.7782 6.22078C18.0711 6.51367 18.0711 6.98855 17.7782 7.28144L13.0597 12L17.7782 16.7186C18.0711 17.0115 18.0711 17.4863 17.7782 17.7792C17.4854 18.0721 17.0105 18.0721 16.7176 17.7792L11.999 13.0607L7.28033 17.7794C6.98744 18.0722 6.51256 18.0722 6.21967 17.7794C5.92678 17.4865 5.92678 17.0116 6.21967 16.7187L10.9384 12L6.21967 7.28131Z"\n fill="currentColor" />\n </svg>\n </button>\n </div>\n <ul class="flex flex-col h-auto overflow-y-auto custom-scrollbar">\n @for (item of data(); track item.id) {\n <li>\n <aif-dropdown-item (itemClick)="closeDropdown()"\n [className]="\'w-full text-left text-sm text-gray-700 hover:text-gray-900 flex gap-3 rounded-lg border-b border-gray-100 p-3 px-4.5 py-3 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-white/5\'"\n [to]="item.route || \'\'">\n <span class="relative block w-full h-10 rounded-full z-1 max-w-10">\n <img width="40" height="40" [src]="item.image || \'/assets/images/users/avatar-placeholder.png\'"\n alt="User" class="w-full overflow-hidden rounded-full" />\n @if (!item.isRead) {\n <span\n class="absolute bottom-0 right-0 z-10 h-2.5 w-full max-w-2.5 rounded-full border-[1.5px] border-white bg-success-500 dark:border-gray-900"></span>\n }\n </span>\n <span class="block">\n <span class="mb-1.5 block text-theme-sm text-gray-500 dark:text-gray-400 space-x-1">\n <span class="font-medium text-gray-800 dark:text-white/90">\n {{item.title}}\n </span>\n <span>{{item.description}}</span>\n </span>\n <span class="flex items-center gap-2 text-gray-500 text-theme-xs dark:text-gray-400">\n <span>{{item.tag}}</span>\n <span class="w-1 h-1 bg-gray-400 rounded-full"></span>\n <span>{{item.date}}</span>\n </span>\n </span>\n </aif-dropdown-item>\n </li>\n } @empty {\n <li class="p-4 text-center text-gray-500 dark:text-gray-400">\n No hay notificaciones nuevas.\n </li>\n }\n </ul>\n @if (route()) {\n <a [routerLink]="route()"\n class="block px-4 py-2 mt-3 text-sm font-medium text-center text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-100 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700">\n Ver todas las notificaciones\n </a>\n }\n </aif-dropdown>\n</div>\n}\n\n\x3c!-- block w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900 flex gap-3 rounded-lg border-b border-gray-100 p-3 px-4.5 py-3 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-white/5 --\x3e\n',dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"ngmodule",type:RouterModule},{kind:"directive",type:i1$1.RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]},{kind:"component",type:AifNavActionButton,selector:"aif-nav-action-button",inputs:["route","title","ariaLabel","variant","active","extraClass"],outputs:["clicked"]},{kind:"component",type:AifDropDown,selector:"aif-dropdown",inputs:["isOpen","className"],outputs:["close"]},{kind:"component",type:AifDropDownItem,selector:"aif-dropdown-item",inputs:["to","baseClassName","className"],outputs:["itemClick","click"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavNotificationDropdown,decorators:[{type:Component,args:[{selector:"aif-nav-notification-dropdown",imports:[CommonModule,RouterModule,AifNavActionButton,AifDropDown,AifDropDownItem],template:'@if (cfg()) {\n<div class="relative w-full lg:w-auto">\n <aif-nav-action-button variant="back-circle" extraClass="dropdown-toggle relative" ariaLabel="Notificaciones"\n (clicked)="toggleDropdown()">\n @if (notifying()) {\n <span class="absolute right-0 top-0.5 z-10 h-2 w-2 rounded-full bg-orange-400">\n <span class="absolute inline-flex w-full h-full bg-orange-400 rounded-full opacity-75 animate-ping"></span>\n </span>\n }\n <svg class="fill-current" width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M10.75 2.29248C10.75 1.87827 10.4143 1.54248 10 1.54248C9.58583 1.54248 9.25004 1.87827 9.25004 2.29248V2.83613C6.08266 3.20733 3.62504 5.9004 3.62504 9.16748V14.4591H3.33337C2.91916 14.4591 2.58337 14.7949 2.58337 15.2091C2.58337 15.6234 2.91916 15.9591 3.33337 15.9591H4.37504H15.625H16.6667C17.0809 15.9591 17.4167 15.6234 17.4167 15.2091C17.4167 14.7949 17.0809 14.4591 16.6667 14.4591H16.375V9.16748C16.375 5.9004 13.9174 3.20733 10.75 2.83613V2.29248ZM14.875 14.4591V9.16748C14.875 6.47509 12.6924 4.29248 10 4.29248C7.30765 4.29248 5.12504 6.47509 5.12504 9.16748V14.4591H14.875ZM8.00004 17.7085C8.00004 18.1228 8.33583 18.4585 8.75004 18.4585H11.25C11.6643 18.4585 12 18.1228 12 17.7085C12 17.2943 11.6643 16.9585 11.25 16.9585H8.75004C8.33583 16.9585 8.00004 17.2943 8.00004 17.7085Z"\n fill="currentColor" />\n </svg>\n </aif-nav-action-button>\n <aif-dropdown [isOpen]="isOpen()" (close)="closeDropdown()" [className]="position_left() + \' absolute \n xl:-left-[320px] \n mt-[17px] \n flex h-[480px] w-[350px] flex-col rounded-2xl border border-gray-200 bg-white p-3\n shadow-theme-lg dark:border-gray-800 dark:bg-gray-dark sm:w-[361px]\'">\n <div class="flex items-center justify-between pb-3 mb-3 border-b border-gray-100 dark:border-gray-700">\n <h5 class="text-lg font-semibold text-gray-800 dark:text-gray-200">\n Notificaciones\n </h5>\n <button (click)="toggleDropdown()"\n class="text-gray-500 transition dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200">\n <svg class="fill-current" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M6.21967 7.28131C5.92678 6.98841 5.92678 6.51354 6.21967 6.22065C6.51256 5.92775 6.98744 5.92775 7.28033 6.22065L11.999 10.9393L16.7176 6.22078C17.0105 5.92789 17.4854 5.92788 17.7782 6.22078C18.0711 6.51367 18.0711 6.98855 17.7782 7.28144L13.0597 12L17.7782 16.7186C18.0711 17.0115 18.0711 17.4863 17.7782 17.7792C17.4854 18.0721 17.0105 18.0721 16.7176 17.7792L11.999 13.0607L7.28033 17.7794C6.98744 18.0722 6.51256 18.0722 6.21967 17.7794C5.92678 17.4865 5.92678 17.0116 6.21967 16.7187L10.9384 12L6.21967 7.28131Z"\n fill="currentColor" />\n </svg>\n </button>\n </div>\n <ul class="flex flex-col h-auto overflow-y-auto custom-scrollbar">\n @for (item of data(); track item.id) {\n <li>\n <aif-dropdown-item (itemClick)="closeDropdown()"\n [className]="\'w-full text-left text-sm text-gray-700 hover:text-gray-900 flex gap-3 rounded-lg border-b border-gray-100 p-3 px-4.5 py-3 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-white/5\'"\n [to]="item.route || \'\'">\n <span class="relative block w-full h-10 rounded-full z-1 max-w-10">\n <img width="40" height="40" [src]="item.image || \'/assets/images/users/avatar-placeholder.png\'"\n alt="User" class="w-full overflow-hidden rounded-full" />\n @if (!item.isRead) {\n <span\n class="absolute bottom-0 right-0 z-10 h-2.5 w-full max-w-2.5 rounded-full border-[1.5px] border-white bg-success-500 dark:border-gray-900"></span>\n }\n </span>\n <span class="block">\n <span class="mb-1.5 block text-theme-sm text-gray-500 dark:text-gray-400 space-x-1">\n <span class="font-medium text-gray-800 dark:text-white/90">\n {{item.title}}\n </span>\n <span>{{item.description}}</span>\n </span>\n <span class="flex items-center gap-2 text-gray-500 text-theme-xs dark:text-gray-400">\n <span>{{item.tag}}</span>\n <span class="w-1 h-1 bg-gray-400 rounded-full"></span>\n <span>{{item.date}}</span>\n </span>\n </span>\n </aif-dropdown-item>\n </li>\n } @empty {\n <li class="p-4 text-center text-gray-500 dark:text-gray-400">\n No hay notificaciones nuevas.\n </li>\n }\n </ul>\n @if (route()) {\n <a [routerLink]="route()"\n class="block px-4 py-2 mt-3 text-sm font-medium text-center text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-100 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700">\n Ver todas las notificaciones\n </a>\n }\n </aif-dropdown>\n</div>\n}\n\n\x3c!-- block w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900 flex gap-3 rounded-lg border-b border-gray-100 p-3 px-4.5 py-3 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-white/5 --\x3e\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifBackNavHeader{sidebar=inject(AifSideBarService);config=input(null,...ngDevMode?[{debugName:"config"}]:[]);isApplicationMenuOpen=signal(!1,...ngDevMode?[{debugName:"isApplicationMenuOpen"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);userConfig=signal(null,...ngDevMode?[{debugName:"userConfig"}]:[]);notificationConfig=signal(null,...ngDevMode?[{debugName:"notificationConfig"}]:[]);langConfig=signal(null,...ngDevMode?[{debugName:"langConfig"}]:[]);userDropDown=viewChild(AifNavUserDropDown,...ngDevMode?[{debugName:"userDropDown"}]:[]);notificationDropDown=viewChild(AifNavNotificationDropdown,...ngDevMode?[{debugName:"notificationDropDown"}]:[]);langDropDown=viewChild(AifNavLangDropDown,...ngDevMode?[{debugName:"langDropDown"}]:[]);state=computed(()=>{const e=AifBackNavHeader.config(),t=this.config(),n=this.builtConfig(),i=n??t;return{...e,...t??{},...n??{},logo:i?.logo??e.logo,actions:{...e.actions,...i?.actions??{}},searchPlaceholder:i?.searchPlaceholder??e.searchPlaceholder,customClass:i?.customClass??""}},...ngDevMode?[{debugName:"state"}]:[]);hasLogo=computed(()=>!!this.state().logo,...ngDevMode?[{debugName:"hasLogo"}]:[]);hasSearch=computed(()=>!!this.state().showSearch,...ngDevMode?[{debugName:"hasSearch"}]:[]);hasThemeToggle=computed(()=>!!this.state().showThemeToggle,...ngDevMode?[{debugName:"hasThemeToggle"}]:[]);hasNotifications=computed(()=>!!this.state().showNotifications,...ngDevMode?[{debugName:"hasNotifications"}]:[]);hasLangDropdown=computed(()=>!!this.state().showLangDropdown&&(this.langConfig()?.length??0)>0,...ngDevMode?[{debugName:"hasLangDropdown"}]:[]);hasUserDropdown=computed(()=>!!this.state().showUserDropdown,...ngDevMode?[{debugName:"hasUserDropdown"}]:[]);logoConfig=computed(()=>this.state().logo,...ngDevMode?[{debugName:"logoConfig"}]:[]);searchConfig=computed(()=>this.hasSearch()?{placeholder:this.state().searchPlaceholder,id:"back-nav-search",icon:"aif aif-search-alt-ico",shortcut:"⌘ K",submit:e=>{const t=e.trim();t&&this.state().actions?.onSearch?.(t)}}:null,...ngDevMode?[{debugName:"searchConfig"}]:[]);userDropdownConfig=computed(()=>this.userConfig(),...ngDevMode?[{debugName:"userDropdownConfig"}]:[]);notificationDropdownConfig=computed(()=>this.notificationConfig(),...ngDevMode?[{debugName:"notificationDropdownConfig"}]:[]);langDropdownConfig=computed(()=>this.langConfig(),...ngDevMode?[{debugName:"langDropdownConfig"}]:[]);applicationMenuClass=computed(()=>this.isApplicationMenuOpen()?"flex":"hidden",...ngDevMode?[{debugName:"applicationMenuClass"}]:[]);build(e,t){const n="function"==typeof e?e():e;this.builtConfig.set(n),t?.()}reBuild(e,t){this.resetToInput(),this.build(e,t)}resetToInput(){this.builtConfig.set(null)}setUser(e){this.userConfig.set(e),this.userDropDown()?.reBuild(e)}setNotifications(e){this.notificationConfig.set(e),this.notificationDropDown()?.reBuild(e)}setLangs(e){this.langConfig.set(e),this.langDropDown()?.reBuild(e)}handleToggle(){window.innerWidth>=1140?this.sidebar.toggleExpanded():this.sidebar.toggleMobileOpen(),this.state().actions?.onMenuToggle?.()}toggleApplicationMenu(){this.isApplicationMenuOpen.update(e=>!e)}handleLogoClick(){this.state().actions?.onLogoClick?.()}static config(e){return{showSearch:!0,searchPlaceholder:"Search or type command…",showThemeToggle:!0,showNotifications:!0,showLangDropdown:!0,showUserDropdown:!0,logo:{light:"/assets/images/logo/logo-dark.svg",dark:"/assets/images/logo/logo-light.svg"},actions:{onLogoClick:()=>{},onSearch:e=>{}},customClass:"",...e}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifBackNavHeader,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifBackNavHeader,isStandalone:!0,selector:"aif-back-nav-header, aif-back-header, aif-nav-header",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"userDropDown",first:!0,predicate:AifNavUserDropDown,descendants:!0,isSignal:!0},{propertyName:"notificationDropDown",first:!0,predicate:AifNavNotificationDropdown,descendants:!0,isSignal:!0},{propertyName:"langDropDown",first:!0,predicate:AifNavLangDropDown,descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (state(); as vm) {\n<header class="sticky top-0 z-99999 flex w-full border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900 xl:border-b"\n [class]="vm.customClass">\n\n <div class="grow xl:px-6">\n <div class="flex flex-col items-center justify-between xl:flex-row">\n <div class="flex w-full items-center justify-between gap-2 border-b border-gray-200 px-3 py-3 dark:border-gray-800 sm:gap-4 xl:justify-normal xl:border-b-0 xl:px-0 lg:py-4">\n <aif-nav-action-button variant="back-square" [active]="sidebar.isMobileOpen()" ariaLabel="Toggle Sidebar"\n extraClass="z-99999 xl:border border-gray-200 dark:border-gray-800" (clicked)="handleToggle()">\n @if (sidebar.isMobileOpen()) {\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M6.21967 7.28131C5.92678 6.98841 5.92678 6.51354 6.21967 6.22065C6.51256 5.92775 6.98744 5.92775 7.28033 6.22065L11.999 10.9393L16.7176 6.22078C17.0105 5.92789 17.4854 5.92788 17.7782 6.22078C18.0711 6.51367 18.0711 6.98855 17.7782 7.28144L13.0597 12L17.7782 16.7186C18.0711 17.0115 18.0711 17.4863 17.7782 17.7792C17.4854 18.0721 17.0105 18.0721 16.7176 17.7792L11.999 13.0607L7.28033 17.7794C6.98744 18.0722 6.51256 18.0722 6.21967 17.7794C5.92678 17.4865 5.92678 17.0116 6.21967 16.7187L10.9384 12L6.21967 7.28131Z"\n fill="currentColor" />\n </svg>\n } @else {\n <svg width="16" height="12" viewBox="0 0 16 12" fill="none">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M0.583252 1C0.583252 0.585788 0.919038 0.25 1.33325 0.25H14.6666C15.0808 0.25 15.4166 0.585786 15.4166 1C15.4166 1.41421 15.0808 1.75 14.6666 1.75L1.33325 1.75C0.919038 1.75 0.583252 1.41422 0.583252 1ZM0.583252 11C0.583252 10.5858 0.919038 10.25 1.33325 10.25L14.6666 10.25C15.0808 10.25 15.4166 10.5858 15.4166 11C15.4166 11.4142 15.0808 11.75 14.6666 11.75L1.33325 11.75C0.919038 11.75 0.583252 11.4142 0.583252 11ZM1.33325 5.25C0.919038 5.25 0.583252 5.58579 0.583252 6C0.583252 6.41421 0.919038 6.75 1.33325 6.75L7.99992 6.75C8.41413 6.75 8.74992 6.41421 8.74992 6C8.74992 5.58579 8.41413 5.25 7.99992 5.25L1.33325 5.25Z"\n fill="currentColor" />\n </svg>\n }\n </aif-nav-action-button>\n\n @if (hasLogo()) {\n <div class="xl:hidden" (click)="handleLogoClick()">\n <aif-nav-logo [cfg]="logoConfig()" />\n </div>\n }\n\n <aif-nav-action-button variant="back-square" ariaLabel="Toggle Header Actions"\n extraClass="z-99999 text-gray-700 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-800 xl:hidden"\n (clicked)="toggleApplicationMenu()">\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M5.99902 10.4951C6.82745 10.4951 7.49902 11.1667 7.49902 11.9951V12.0051C7.49902 12.8335 6.82745 13.5051 5.99902 13.5051C5.1706 13.5051 4.49902 12.8335 4.49902 12.0051V11.9951C4.49902 11.1667 5.1706 10.4951 5.99902 10.4951ZM17.999 10.4951C18.8275 10.4951 19.499 11.1667 19.499 11.9951V12.0051C19.499 12.8335 18.8275 13.5051 17.999 13.5051C17.1706 13.5051 16.499 12.8335 16.499 12.0051V11.9951C16.499 11.1667 17.1706 10.4951 17.999 10.4951ZM13.499 11.9951C13.499 11.1667 12.8275 10.4951 11.999 10.4951C11.1706 10.4951 10.499 11.1667 10.499 11.9951V12.0051C10.499 12.8335 11.1706 13.5051 11.999 13.5051C12.8275 13.5051 13.499 12.8335 13.499 12.0051V11.9951Z"\n fill="currentColor" />\n </svg>\n </aif-nav-action-button>\n\n @if (hasSearch()) {\n <div class="hidden xl:block">\n <aif-nav-search [config]="searchConfig()" variant="back" />\n </div>\n }\n </div>\n\n <div [class]="applicationMenuClass()" class="w-full items-center justify-between gap-4 px-5 py-4 shadow-theme-md xl:flex xl:justify-end xl:px-0 xl:shadow-none">\n <div class="flex items-center gap-2 2xsm:gap-3">\n @if (hasThemeToggle()) {\n <aif-theme-toggle />\n }\n\n @if (hasLangDropdown()) {\n <aif-nav-lang-dropdown [config]="langDropdownConfig()" />\n }\n\n @if (hasNotifications()) {\n <aif-nav-notification-dropdown [config]="notificationDropdownConfig()" />\n }\n </div>\n\n @if (hasUserDropdown()) {\n <aif-nav-user-dropdown [config]="userDropdownConfig()" variant="front" (onAction)="state().actions.onUserAction?.($event)" />\n }\n </div>\n </div>\n </div>\n</header>\n}\n',styles:[""],dependencies:[{kind:"component",type:AifNavActionButton,selector:"aif-nav-action-button",inputs:["route","title","ariaLabel","variant","active","extraClass"],outputs:["clicked"]},{kind:"component",type:AifNavLogo,selector:"aif-nav-logo",inputs:["cfg","surface"]},{kind:"component",type:AifThemeToggle,selector:"aif-theme-toggle",inputs:["config"]},{kind:"component",type:AifNavNotificationDropdown,selector:"aif-nav-notification-dropdown",inputs:["config"]},{kind:"component",type:AifNavUserDropDown,selector:"aif-nav-user-dropdown",inputs:["config","variant"],outputs:["onAction"]},{kind:"component",type:AifNavLangDropDown,selector:"aif-nav-lang-dropdown",inputs:["config","variant"]},{kind:"component",type:AifNavSearch,selector:"aif-nav-search",inputs:["config","variant"],outputs:["submitted"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifBackNavHeader,decorators:[{type:Component,args:[{selector:"aif-back-nav-header, aif-back-header, aif-nav-header",standalone:!0,imports:[AifNavActionButton,AifNavLogo,AifThemeToggle,AifNavNotificationDropdown,AifNavUserDropDown,AifNavLangDropDown,AifNavSearch],template:'@if (state(); as vm) {\n<header class="sticky top-0 z-99999 flex w-full border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900 xl:border-b"\n [class]="vm.customClass">\n\n <div class="grow xl:px-6">\n <div class="flex flex-col items-center justify-between xl:flex-row">\n <div class="flex w-full items-center justify-between gap-2 border-b border-gray-200 px-3 py-3 dark:border-gray-800 sm:gap-4 xl:justify-normal xl:border-b-0 xl:px-0 lg:py-4">\n <aif-nav-action-button variant="back-square" [active]="sidebar.isMobileOpen()" ariaLabel="Toggle Sidebar"\n extraClass="z-99999 xl:border border-gray-200 dark:border-gray-800" (clicked)="handleToggle()">\n @if (sidebar.isMobileOpen()) {\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M6.21967 7.28131C5.92678 6.98841 5.92678 6.51354 6.21967 6.22065C6.51256 5.92775 6.98744 5.92775 7.28033 6.22065L11.999 10.9393L16.7176 6.22078C17.0105 5.92789 17.4854 5.92788 17.7782 6.22078C18.0711 6.51367 18.0711 6.98855 17.7782 7.28144L13.0597 12L17.7782 16.7186C18.0711 17.0115 18.0711 17.4863 17.7782 17.7792C17.4854 18.0721 17.0105 18.0721 16.7176 17.7792L11.999 13.0607L7.28033 17.7794C6.98744 18.0722 6.51256 18.0722 6.21967 17.7794C5.92678 17.4865 5.92678 17.0116 6.21967 16.7187L10.9384 12L6.21967 7.28131Z"\n fill="currentColor" />\n </svg>\n } @else {\n <svg width="16" height="12" viewBox="0 0 16 12" fill="none">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M0.583252 1C0.583252 0.585788 0.919038 0.25 1.33325 0.25H14.6666C15.0808 0.25 15.4166 0.585786 15.4166 1C15.4166 1.41421 15.0808 1.75 14.6666 1.75L1.33325 1.75C0.919038 1.75 0.583252 1.41422 0.583252 1ZM0.583252 11C0.583252 10.5858 0.919038 10.25 1.33325 10.25L14.6666 10.25C15.0808 10.25 15.4166 10.5858 15.4166 11C15.4166 11.4142 15.0808 11.75 14.6666 11.75L1.33325 11.75C0.919038 11.75 0.583252 11.4142 0.583252 11ZM1.33325 5.25C0.919038 5.25 0.583252 5.58579 0.583252 6C0.583252 6.41421 0.919038 6.75 1.33325 6.75L7.99992 6.75C8.41413 6.75 8.74992 6.41421 8.74992 6C8.74992 5.58579 8.41413 5.25 7.99992 5.25L1.33325 5.25Z"\n fill="currentColor" />\n </svg>\n }\n </aif-nav-action-button>\n\n @if (hasLogo()) {\n <div class="xl:hidden" (click)="handleLogoClick()">\n <aif-nav-logo [cfg]="logoConfig()" />\n </div>\n }\n\n <aif-nav-action-button variant="back-square" ariaLabel="Toggle Header Actions"\n extraClass="z-99999 text-gray-700 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-800 xl:hidden"\n (clicked)="toggleApplicationMenu()">\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M5.99902 10.4951C6.82745 10.4951 7.49902 11.1667 7.49902 11.9951V12.0051C7.49902 12.8335 6.82745 13.5051 5.99902 13.5051C5.1706 13.5051 4.49902 12.8335 4.49902 12.0051V11.9951C4.49902 11.1667 5.1706 10.4951 5.99902 10.4951ZM17.999 10.4951C18.8275 10.4951 19.499 11.1667 19.499 11.9951V12.0051C19.499 12.8335 18.8275 13.5051 17.999 13.5051C17.1706 13.5051 16.499 12.8335 16.499 12.0051V11.9951C16.499 11.1667 17.1706 10.4951 17.999 10.4951ZM13.499 11.9951C13.499 11.1667 12.8275 10.4951 11.999 10.4951C11.1706 10.4951 10.499 11.1667 10.499 11.9951V12.0051C10.499 12.8335 11.1706 13.5051 11.999 13.5051C12.8275 13.5051 13.499 12.8335 13.499 12.0051V11.9951Z"\n fill="currentColor" />\n </svg>\n </aif-nav-action-button>\n\n @if (hasSearch()) {\n <div class="hidden xl:block">\n <aif-nav-search [config]="searchConfig()" variant="back" />\n </div>\n }\n </div>\n\n <div [class]="applicationMenuClass()" class="w-full items-center justify-between gap-4 px-5 py-4 shadow-theme-md xl:flex xl:justify-end xl:px-0 xl:shadow-none">\n <div class="flex items-center gap-2 2xsm:gap-3">\n @if (hasThemeToggle()) {\n <aif-theme-toggle />\n }\n\n @if (hasLangDropdown()) {\n <aif-nav-lang-dropdown [config]="langDropdownConfig()" />\n }\n\n @if (hasNotifications()) {\n <aif-nav-notification-dropdown [config]="notificationDropdownConfig()" />\n }\n </div>\n\n @if (hasUserDropdown()) {\n <aif-nav-user-dropdown [config]="userDropdownConfig()" variant="front" (onAction)="state().actions.onUserAction?.($event)" />\n }\n </div>\n </div>\n </div>\n</header>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],userDropDown:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifNavUserDropDown),{isSignal:!0}]}],notificationDropDown:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifNavNotificationDropdown),{isSignal:!0}]}],langDropDown:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifNavLangDropDown),{isSignal:!0}]}]}});class AifPageHeader{onInit=output();onRef=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);title=signal("",...ngDevMode?[{debugName:"title"}]:[]);subtitle=signal("",...ngDevMode?[{debugName:"subtitle"}]:[]);built=signal(!1,...ngDevMode?[{debugName:"built"}]:[]);show=signal(!1,...ngDevMode?[{debugName:"show"}]:[]);breadcrumbItems=signal([],...ngDevMode?[{debugName:"breadcrumbItems"}]:[]);onClick=signal(()=>{},...ngDevMode?[{debugName:"onClick"}]:[]);isShow=computed(()=>this.show()?"show":"hide",...ngDevMode?[{debugName:"isShow"}]:[]);isLine=computed(()=>!!this.cfg().line,...ngDevMode?[{debugName:"isLine"}]:[]);backTitle=computed(()=>this.cfg().back_title||"Back",...ngDevMode?[{debugName:"backTitle"}]:[]);ngOnInit(){const e=this.config();e&&(e.breadcrumb||e.title)&&this.build(e)}ngAfterViewInit(){this.onInit.emit()}reBuild(e){this.built.set(!1),this.build(e)}build(e={}){if(!this.built()){if(this.built.set(!0),e.click&&this.onClick.set(e.click),e.breadcrumb){const t=[];let n=!1;const i=e.breadcrumb||[];for(let e=0;e<i.length;e++){const a=i[e],s={index:e,link:null,label:a,active:!n&&e===i.length-1};Array.isArray(a)&&(s.label=a[0],a[1]&&(s.link=a[1]),a[2]&&(s.active=!0,n=!0)),t.push(s)}this.breadcrumbItems.set(t)}e.title&&this.title.set(e.title||""),e.subtitle&&this.subtitle.set(e.subtitle||""),this.cfg.set({...e,line:e.line||!1}),this.show.set(!0)}}handleBack(e){e.preventDefault();const t={action:"back"};this.onRef.emit(t),this.onClick()(t)}handleSelect(e){this.onRef.emit(e),this.onClick()(e),e.link&&navigate(e.link)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPageHeader,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifPageHeader,isStandalone:!0,selector:"aif-page-header, aif-nav-head",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit",onRef:"onRef"},ngImport:i0,template:'@if (isShow() === \'show\') {\n <div class="flex flex-col w-full py-4 mb-2 sm:flex-row sm:items-center sm:justify-between">\n <div class="flex items-center gap-3">\n @if (!title() && breadcrumbItems().length > 1) {\n <a href="#" (click)="handleBack($event)" class="inline-flex items-center text-sm font-medium text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-white">\n <i class="mr-1 aif aif-arrow-left-ico"></i>\n <span>{{ backTitle() }}</span>\n </a>\n }\n \n @if (title()) {\n <div [ngClass]="{\'hidden md:block\': breadcrumbItems().length > 1}">\n <h4 class="text-xl font-semibold text-gray-900 dark:text-white">\n {{ title() }}\n </h4>\n @if (subtitle()) {\n <p class="mt-1 text-sm text-gray-500 dark:text-gray-400">\n {{ subtitle() }}\n </p>\n }\n </div>\n }\n </div>\n\n <div class="mt-2 sm:mt-0">\n <ol class="flex items-center list-none">\n @for (item of breadcrumbItems(); track item.index) {\n <li class="flex items-center">\n @if (item.index > 0) {\n <span class="mx-2 text-gray-400 dark:text-gray-600">/</span>\n }\n <button \n type="button"\n (click)="handleSelect(item)" \n [disabled]="item.active"\n class="text-sm font-medium transition-colors"\n [ngClass]="item.active ? \'text-gray-900 dark:text-white cursor-default\' : \'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-white cursor-pointer\'">\n {{ item.label }}\n </button>\n </li>\n }\n </ol>\n </div>\n </div>\n \n @if (isLine()) {\n <hr class="border-gray-200 dark:border-gray-800" />\n }\n}\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPageHeader,decorators:[{type:Component,args:[{selector:"aif-page-header, aif-nav-head",standalone:!0,imports:[NgClass],template:'@if (isShow() === \'show\') {\n <div class="flex flex-col w-full py-4 mb-2 sm:flex-row sm:items-center sm:justify-between">\n <div class="flex items-center gap-3">\n @if (!title() && breadcrumbItems().length > 1) {\n <a href="#" (click)="handleBack($event)" class="inline-flex items-center text-sm font-medium text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-white">\n <i class="mr-1 aif aif-arrow-left-ico"></i>\n <span>{{ backTitle() }}</span>\n </a>\n }\n \n @if (title()) {\n <div [ngClass]="{\'hidden md:block\': breadcrumbItems().length > 1}">\n <h4 class="text-xl font-semibold text-gray-900 dark:text-white">\n {{ title() }}\n </h4>\n @if (subtitle()) {\n <p class="mt-1 text-sm text-gray-500 dark:text-gray-400">\n {{ subtitle() }}\n </p>\n }\n </div>\n }\n </div>\n\n <div class="mt-2 sm:mt-0">\n <ol class="flex items-center list-none">\n @for (item of breadcrumbItems(); track item.index) {\n <li class="flex items-center">\n @if (item.index > 0) {\n <span class="mx-2 text-gray-400 dark:text-gray-600">/</span>\n }\n <button \n type="button"\n (click)="handleSelect(item)" \n [disabled]="item.active"\n class="text-sm font-medium transition-colors"\n [ngClass]="item.active ? \'text-gray-900 dark:text-white cursor-default\' : \'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-white cursor-pointer\'">\n {{ item.label }}\n </button>\n </li>\n }\n </ol>\n </div>\n </div>\n \n @if (isLine()) {\n <hr class="border-gray-200 dark:border-gray-800" />\n }\n}\n'}]}],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],onRef:[{type:i0.Output,args:["onRef"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifSection{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);currentLang=signal(lang(),...ngDevMode?[{debugName:"currentLang"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);_sb;state=computed(()=>{const e=this.config(),t=this.builtConfig()??e,n=t?.item??{},i={...AifSection.config(this.currentLang()),...t?.cfg??{}};return{item:n,cfg:i,labels:{...AifSection.defaultLabels(this.currentLang()),...i.labels||{}}}},...ngDevMode?[{debugName:"state"}]:[]);hasImage=computed(()=>!!this.state().item.imageUrl,...ngDevMode?[{debugName:"hasImage"}]:[]);hasMeta=computed(()=>!(!this.state().item.author&&!this.state().item.date),...ngDevMode?[{debugName:"hasMeta"}]:[]);hasLink=computed(()=>!!this.state().item.linkUrl,...ngDevMode?[{debugName:"hasLink"}]:[]);sectionAlignClass=computed(()=>"center"===this.state().cfg.align?"text-center":"text-left",...ngDevMode?[{debugName:"sectionAlignClass"}]:[]);metaAlignClass=computed(()=>"center"===this.state().cfg.align?"justify-center":"justify-start",...ngDevMode?[{debugName:"metaAlignClass"}]:[]);linkLabel=computed(()=>this.state().item.linkLabel||this.state().labels.defaultLinkLabel,...ngDevMode?[{debugName:"linkLabel"}]:[]);descriptionHtml=computed(()=>this.renderText(this.state().item.description),...ngDevMode?[{debugName:"descriptionHtml"}]:[]);ngOnInit(){this._sb=lang_subscribe("change",e=>this.currentLang.set(e))}ngOnDestroy(){this._sb?.unsubscribe?.()}build(e=null){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e))}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1)}renderText(e){if(!e)return"";if("string"!=typeof e)return String(e);const t=e.split(/\r?\n/);let n="",i=!1,a=!1;const s=()=>{i&&(n+="</ul>",i=!1)},o=()=>{a&&(n+="</blockquote>",a=!1)};for(const e of t){const t=e.trim();if(t)if(/^---+$/.test(t))s(),o(),n+='<hr class="my-4 border-slate-300/40">';else{if(/^###\s+/.test(t)){s(),o();const e=this.inlineFormat(t.replace(/^###\s+/,""));n+=`<h3 class="text-lg font-semibold mt-4 mb-2">${e}</h3>`;continue}if(/^##\s+/.test(t)){s(),o();const e=this.inlineFormat(t.replace(/^##\s+/,""));n+=`<h2 class="text-xl font-semibold mt-5 mb-3">${e}</h2>`;continue}if(/^#\s+/.test(t)){s(),o();const e=this.inlineFormat(t.replace(/^#\s+/,""));n+=`<h1 class="text-2xl font-semibold mt-6 mb-4">${e}</h1>`;continue}if(/^[*•-]\s+/.test(t)){i||(o(),n+='<ul class="list-disc ms-6 my-3">',i=!0);const e=this.inlineFormat(t.replace(/^[*•-]\s+/,""));n+=`<li>${e}</li>`;continue}if(/^>\s+/.test(t)){s(),a||(n+='<blockquote class="border-l-4 ps-4 my-3 italic text-slate-600">',a=!0);const e=this.inlineFormat(t.replace(/^>\s+/,""));n+=e+"<br>";continue}s(),o(),n+=`<p class="mt-2">${this.inlineFormat(t)}</p>`}else s(),n+="<br>"}return s(),o(),n}inlineFormat(e){return e.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>").replace(/\*(.+?)\*/g,"<em>$1</em>")}static config(e=lang()){return{imagePosition:"after-title",linkPosition:"bottom",metaPosition:"after-title",align:"left",labels:AifSection.defaultLabels(e)}}static defaultLabels(e=lang()){return(e||"").toLowerCase().startsWith("en")?{authorPrefix:"By",defaultLinkLabel:"Read more"}:{authorPrefix:"Por",defaultLinkLabel:"Leer mas"}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSection,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSection,isStandalone:!0,selector:"aif-section",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (state(); as vm) {\n<section class="w-full" [ngClass]="sectionAlignClass()">\n <div class="space-y-3">\n\n \x3c!-- Imagen TOP --\x3e\n @if (hasImage() && vm.cfg.imagePosition === \'top\') {\n <ng-container *ngTemplateOutlet="imageTpl"></ng-container>\n }\n\n \x3c!-- Meta TOP (fecha/autor) --\x3e\n @if (hasMeta() && vm.cfg.metaPosition === \'top\') {\n <ng-container *ngTemplateOutlet="metaTpl"></ng-container>\n }\n\n \x3c!-- Link TOP --\x3e\n @if (hasLink() && vm.cfg.linkPosition === \'top\') {\n <ng-container *ngTemplateOutlet="linkTpl"></ng-container>\n }\n\n \x3c!-- Título --\x3e\n @if (vm.item.title) {\n <h3 class="text-2xl md:text-3xl font-semibold text-slate-900 mb-1">\n {{ vm.item.title }}\n </h3>\n }\n\n \x3c!-- Subtítulo --\x3e\n @if (vm.item.subtitle) {\n <h5 class="text-2xl text-slate-500">\n {{ vm.item.subtitle }}\n </h5>\n }\n\n \x3c!-- Imagen AFTER-TITLE --\x3e\n @if (hasImage() && vm.cfg.imagePosition === \'after-title\') {\n <ng-container *ngTemplateOutlet="imageTpl"></ng-container>\n }\n\n \x3c!-- Meta AFTER-TITLE --\x3e\n @if (hasMeta() && vm.cfg.metaPosition === \'after-title\') {\n <ng-container *ngTemplateOutlet="metaTpl"></ng-container>\n }\n\n \x3c!-- Link AFTER-TITLE --\x3e\n @if (hasLink() && vm.cfg.linkPosition === \'after-title\') {\n <ng-container *ngTemplateOutlet="linkTpl"></ng-container>\n }\n\n \x3c!-- Descripción --\x3e\n @if (vm.item.description) {\n <div class="text-slate-500 leading-relaxed text-justify" [innerHTML]="descriptionHtml()"></div>\n }\n\n \x3c!-- Imagen BOTTOM --\x3e\n @if (hasImage() && vm.cfg.imagePosition === \'bottom\') {\n <ng-container *ngTemplateOutlet="imageTpl"></ng-container>\n }\n\n \x3c!-- Meta BOTTOM --\x3e\n @if (hasMeta() && vm.cfg.metaPosition === \'bottom\') {\n <ng-container *ngTemplateOutlet="metaTpl"></ng-container>\n }\n\n \x3c!-- Link BOTTOM --\x3e\n @if (hasLink() && vm.cfg.linkPosition === \'bottom\') {\n <ng-container *ngTemplateOutlet="linkTpl"></ng-container>\n }\n\n </div>\n\n \x3c!-- TEMPLATES REUTILIZABLES --\x3e\n\n <ng-template #imageTpl>\n <div class="mt-3">\n <img [src]="vm.item.imageUrl!" [alt]="vm.item.imageAlt || vm.item.title || \'\'" class="rounded-md max-w-full" />\n </div>\n </ng-template>\n\n <ng-template #metaTpl>\n <div class="mt-1 text-sm text-slate-400 flex gap-2"\n [ngClass]="metaAlignClass()">\n @if (vm.item.date) {\n <span>{{ vm.item.date }}</span>\n }\n @if (vm.item.date && vm.item.author) {\n <span>•</span>\n }\n @if (vm.item.author) {\n <span>{{ vm.labels.authorPrefix }} {{ vm.item.author }}</span>\n }\n </div>\n </ng-template>\n\n <ng-template #linkTpl>\n <div class="mt-2">\n <a [routerLink]="vm.item.linkUrl!" class="inline-flex items-center text-primary font-semibold text-sm cursor-pointer\n hover:text-primary-700 transition-colors duration-200">\n {{ linkLabel() }}\n <i class="aif aif-chevron-right-ico align-middle text-lg mt-1.5"></i>\n </a>\n </div>\n </ng-template>\n</section>\n}\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:NgTemplateOutlet,selector:"[ngTemplateOutlet]",inputs:["ngTemplateOutletContext","ngTemplateOutlet","ngTemplateOutletInjector"]},{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSection,decorators:[{type:Component,args:[{selector:"aif-section",standalone:!0,imports:[NgClass,NgTemplateOutlet,RouterLink],template:'@if (state(); as vm) {\n<section class="w-full" [ngClass]="sectionAlignClass()">\n <div class="space-y-3">\n\n \x3c!-- Imagen TOP --\x3e\n @if (hasImage() && vm.cfg.imagePosition === \'top\') {\n <ng-container *ngTemplateOutlet="imageTpl"></ng-container>\n }\n\n \x3c!-- Meta TOP (fecha/autor) --\x3e\n @if (hasMeta() && vm.cfg.metaPosition === \'top\') {\n <ng-container *ngTemplateOutlet="metaTpl"></ng-container>\n }\n\n \x3c!-- Link TOP --\x3e\n @if (hasLink() && vm.cfg.linkPosition === \'top\') {\n <ng-container *ngTemplateOutlet="linkTpl"></ng-container>\n }\n\n \x3c!-- Título --\x3e\n @if (vm.item.title) {\n <h3 class="text-2xl md:text-3xl font-semibold text-slate-900 mb-1">\n {{ vm.item.title }}\n </h3>\n }\n\n \x3c!-- Subtítulo --\x3e\n @if (vm.item.subtitle) {\n <h5 class="text-2xl text-slate-500">\n {{ vm.item.subtitle }}\n </h5>\n }\n\n \x3c!-- Imagen AFTER-TITLE --\x3e\n @if (hasImage() && vm.cfg.imagePosition === \'after-title\') {\n <ng-container *ngTemplateOutlet="imageTpl"></ng-container>\n }\n\n \x3c!-- Meta AFTER-TITLE --\x3e\n @if (hasMeta() && vm.cfg.metaPosition === \'after-title\') {\n <ng-container *ngTemplateOutlet="metaTpl"></ng-container>\n }\n\n \x3c!-- Link AFTER-TITLE --\x3e\n @if (hasLink() && vm.cfg.linkPosition === \'after-title\') {\n <ng-container *ngTemplateOutlet="linkTpl"></ng-container>\n }\n\n \x3c!-- Descripción --\x3e\n @if (vm.item.description) {\n <div class="text-slate-500 leading-relaxed text-justify" [innerHTML]="descriptionHtml()"></div>\n }\n\n \x3c!-- Imagen BOTTOM --\x3e\n @if (hasImage() && vm.cfg.imagePosition === \'bottom\') {\n <ng-container *ngTemplateOutlet="imageTpl"></ng-container>\n }\n\n \x3c!-- Meta BOTTOM --\x3e\n @if (hasMeta() && vm.cfg.metaPosition === \'bottom\') {\n <ng-container *ngTemplateOutlet="metaTpl"></ng-container>\n }\n\n \x3c!-- Link BOTTOM --\x3e\n @if (hasLink() && vm.cfg.linkPosition === \'bottom\') {\n <ng-container *ngTemplateOutlet="linkTpl"></ng-container>\n }\n\n </div>\n\n \x3c!-- TEMPLATES REUTILIZABLES --\x3e\n\n <ng-template #imageTpl>\n <div class="mt-3">\n <img [src]="vm.item.imageUrl!" [alt]="vm.item.imageAlt || vm.item.title || \'\'" class="rounded-md max-w-full" />\n </div>\n </ng-template>\n\n <ng-template #metaTpl>\n <div class="mt-1 text-sm text-slate-400 flex gap-2"\n [ngClass]="metaAlignClass()">\n @if (vm.item.date) {\n <span>{{ vm.item.date }}</span>\n }\n @if (vm.item.date && vm.item.author) {\n <span>•</span>\n }\n @if (vm.item.author) {\n <span>{{ vm.labels.authorPrefix }} {{ vm.item.author }}</span>\n }\n </div>\n </ng-template>\n\n <ng-template #linkTpl>\n <div class="mt-2">\n <a [routerLink]="vm.item.linkUrl!" class="inline-flex items-center text-primary font-semibold text-sm cursor-pointer\n hover:text-primary-700 transition-colors duration-200">\n {{ linkLabel() }}\n <i class="aif aif-chevron-right-ico align-middle text-lg mt-1.5"></i>\n </a>\n </div>\n </ng-template>\n</section>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifSectionNav{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);items=input([],...ngDevMode?[{debugName:"items"}]:[]);cfg=input({offset:80,orientation:"horizontal"},...ngDevMode?[{debugName:"cfg"}]:[]);opts=input({},...ngDevMode?[{debugName:"opts"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);activeId=signal(null,...ngDevMode?[{debugName:"activeId"}]:[]);state=computed(()=>{const e=this.config(),t=this.builtConfig()??e,n={offset:80,orientation:"horizontal",...t?.cfg??this.cfg()},i={spy:!0,smooth:!0,trigger_offset:40,...t?.opts??this.opts()};return{items:t?.items??this.items(),cfg:n,opts:i}},...ngDevMode?[{debugName:"state"}]:[]);orientation=computed(()=>this.state().cfg.orientation,...ngDevMode?[{debugName:"orientation"}]:[]);currentActiveId=computed(()=>{const e=this.activeId(),t=this.state().items;return e&&t.some(t=>t.id===e)?e:t[0]?.id??null},...ngDevMode?[{debugName:"currentActiveId"}]:[]);navClass=computed(()=>{const{cfg:e,opts:t}=this.state();return t.class_nav||("vertical"===e.orientation?"w-full flex flex-col space-y-4":"w-full flex flex-wrap items-center justify-center gap-4")},...ngDevMode?[{debugName:"navClass"}]:[]);baseButtonClass=computed(()=>this.state().opts.class_button||"font-medium cursor-pointer block py-0 my-0 text-start transition-colors duration-200",...ngDevMode?[{debugName:"baseButtonClass"}]:[]);inactiveButtonClass=computed(()=>this.state().opts.class_button_inactive||"text-slate-600 hover:text-primary dark:text-slate-300 dark:hover:text-primary",...ngDevMode?[{debugName:"inactiveButtonClass"}]:[]);activeButtonClass=computed(()=>this.state().opts.class_button_active||"text-primary dark:text-primary font-semibold",...ngDevMode?[{debugName:"activeButtonClass"}]:[]);build(e=null){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e))}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1)}scrollTo(e){this.activeId.set(e);const t=document.getElementById(e);if(!t)return;const n=t.getBoundingClientRect(),i=this.state().cfg.offset??0,a=window.scrollY+n.top-i;window.scrollTo({top:a,behavior:!1===this.state().opts.smooth?"auto":"smooth"})}onWindowScroll(){if(!1===this.state().opts.spy)return;const e=this.state().items;if(!e||!e.length)return;const t=(this.state().cfg.offset??0)+(this.state().opts.trigger_offset??40);let n=null,i=Number.POSITIVE_INFINITY;for(const a of e){const e=document.getElementById(a.id);if(!e)continue;const s=e.getBoundingClientRect(),o=Math.abs(s.top-t);o<i&&(i=o,n=a.id)}n&&n!==this.currentActiveId()&&this.activeId.set(n)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSectionNav,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSectionNav,isStandalone:!0,selector:"aif-section-nav",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},items:{classPropertyName:"items",publicName:"items",isSignal:!0,isRequired:!1,transformFunction:null},cfg:{classPropertyName:"cfg",publicName:"cfg",isSignal:!0,isRequired:!1,transformFunction:null},opts:{classPropertyName:"opts",publicName:"opts",isSignal:!0,isRequired:!1,transformFunction:null}},host:{listeners:{"window:scroll":"onWindowScroll()"}},ngImport:i0,template:'@if (state().items.length) {\n<nav [class]="navClass()" [attr.aria-orientation]="orientation()">\n @for (item of state().items; track item.id) {\n <button type="button" (click)="scrollTo(item.id)" [class]="baseButtonClass()"\n [ngClass]="item.id === currentActiveId() ? activeButtonClass() : inactiveButtonClass()"\n [attr.aria-current]="item.id === currentActiveId() ? \'true\' : null">\n {{ item.title }}\n </button>\n }\n</nav>\n}\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSectionNav,decorators:[{type:Component,args:[{selector:"aif-section-nav",standalone:!0,imports:[NgClass],template:'@if (state().items.length) {\n<nav [class]="navClass()" [attr.aria-orientation]="orientation()">\n @for (item of state().items; track item.id) {\n <button type="button" (click)="scrollTo(item.id)" [class]="baseButtonClass()"\n [ngClass]="item.id === currentActiveId() ? activeButtonClass() : inactiveButtonClass()"\n [attr.aria-current]="item.id === currentActiveId() ? \'true\' : null">\n {{ item.title }}\n </button>\n }\n</nav>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],items:[{type:i0.Input,args:[{isSignal:!0,alias:"items",required:!1}]}],cfg:[{type:i0.Input,args:[{isSignal:!0,alias:"cfg",required:!1}]}],opts:[{type:i0.Input,args:[{isSignal:!0,alias:"opts",required:!1}]}],onWindowScroll:[{type:HostListener,args:["window:scroll",[]]}]}});class AifSectionSummary{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);currentLang=signal(lang(),...ngDevMode?[{debugName:"currentLang"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);_sb;state=computed(()=>{const e=this.config(),t=this.builtConfig()??e;return{item:{image:"assets/images/business/about01.jpg",title:"Titulo por defecto",description:"Descripcion por defecto",route:"#",buttonLabel:"",imageAlt:"",...t?.item??{}},cfg:{layout:"image-left",...t?.cfg??{}},labels:{...AifSectionSummary.defaultLabels(this.currentLang()),...t?.labels??{}}}},...ngDevMode?[{debugName:"state"}]:[]);isImageRight=computed(()=>"image-right"===this.state().cfg.layout,...ngDevMode?[{debugName:"isImageRight"}]:[]);imageAlt=computed(()=>this.state().item.imageAlt||this.state().item.title,...ngDevMode?[{debugName:"imageAlt"}]:[]);buttonLabel=computed(()=>this.state().item.buttonLabel||this.state().labels.defaultButtonLabel,...ngDevMode?[{debugName:"buttonLabel"}]:[]);route=computed(()=>this.state().item.route||"#",...ngDevMode?[{debugName:"route"}]:[]);ngOnInit(){this._sb=lang_subscribe("change",e=>this.currentLang.set(e))}ngOnDestroy(){this._sb?.unsubscribe?.()}build(e=null){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e))}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1)}static defaultLabels(e=lang()){return(e||"").toLowerCase().startsWith("en")?{defaultButtonLabel:"Read more"}:{defaultButtonLabel:"Leer mas"}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSectionSummary,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSectionSummary,isStandalone:!0,selector:"aif-section-summary",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (state(); as vm) {\n<section class="relative md:py-16 py-16">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n <div class="grid md:grid-cols-12 grid-cols-1 items-center gap-[30px]">\n\n @if (isImageRight()) {\n <div class="md:col-span-7 order-1">\n <div class="lg:me-4">\n <h4 class="mb-6 md:text-3xl text-2xl lg:leading-normal leading-normal font-medium">\n {{ vm.item.title }}\n </h4>\n\n <p class="text-slate-400 max-w-xl">\n {{ vm.item.description }}\n </p>\n\n <a [routerLink]="route()"\n class="py-2 px-5 inline-block font-semibold tracking-wide border align-middle duration-500 text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-md mt-3">\n {{ buttonLabel() }}\n <i class="aif aif-chevron-right-ico align-middle text-lg mt-1.5"></i>\n </a>\n </div>\n </div>\n\n <div class="md:col-span-5 order-2">\n <img [src]="vm.item.image" [alt]="imageAlt()" class="rounded-md" />\n </div>\n } @else {\n <div class="md:col-span-5 order-1">\n <img [src]="vm.item.image" [alt]="imageAlt()" class="rounded-md" />\n </div>\n\n <div class="md:col-span-7 order-2">\n <div class="lg:ms-4">\n <h4 class="mb-6 md:text-3xl text-2xl lg:leading-normal leading-normal font-medium">\n {{ vm.item.title }}\n </h4>\n\n <p class="text-slate-400 max-w-xl">\n {{ vm.item.description }}\n </p>\n\n <a [routerLink]="route()"\n class="py-2 px-5 inline-block font-semibold tracking-wide border align-middle duration-500 text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-md mt-3">\n {{ buttonLabel() }}\n <i class="aif aif-chevron-right-ico align-middle text-lg mt-1.5"></i>\n </a>\n </div>\n </div>\n }\n\n </div>\n </div>\n</section>\n}\n',dependencies:[{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSectionSummary,decorators:[{type:Component,args:[{selector:"aif-section-summary",standalone:!0,imports:[RouterLink],template:'@if (state(); as vm) {\n<section class="relative md:py-16 py-16">\n <div class="relative mx-auto w-full max-w-7xl px-6 lg:px-8">\n <div class="grid md:grid-cols-12 grid-cols-1 items-center gap-[30px]">\n\n @if (isImageRight()) {\n <div class="md:col-span-7 order-1">\n <div class="lg:me-4">\n <h4 class="mb-6 md:text-3xl text-2xl lg:leading-normal leading-normal font-medium">\n {{ vm.item.title }}\n </h4>\n\n <p class="text-slate-400 max-w-xl">\n {{ vm.item.description }}\n </p>\n\n <a [routerLink]="route()"\n class="py-2 px-5 inline-block font-semibold tracking-wide border align-middle duration-500 text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-md mt-3">\n {{ buttonLabel() }}\n <i class="aif aif-chevron-right-ico align-middle text-lg mt-1.5"></i>\n </a>\n </div>\n </div>\n\n <div class="md:col-span-5 order-2">\n <img [src]="vm.item.image" [alt]="imageAlt()" class="rounded-md" />\n </div>\n } @else {\n <div class="md:col-span-5 order-1">\n <img [src]="vm.item.image" [alt]="imageAlt()" class="rounded-md" />\n </div>\n\n <div class="md:col-span-7 order-2">\n <div class="lg:ms-4">\n <h4 class="mb-6 md:text-3xl text-2xl lg:leading-normal leading-normal font-medium">\n {{ vm.item.title }}\n </h4>\n\n <p class="text-slate-400 max-w-xl">\n {{ vm.item.description }}\n </p>\n\n <a [routerLink]="route()"\n class="py-2 px-5 inline-block font-semibold tracking-wide border align-middle duration-500 text-base text-center bg-primary hover:bg-primary-700 border-primary hover:border-primary-700 text-white rounded-md mt-3">\n {{ buttonLabel() }}\n <i class="aif aif-chevron-right-ico align-middle text-lg mt-1.5"></i>\n </a>\n </div>\n </div>\n }\n\n </div>\n </div>\n</section>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});const DEFAULT_MODAL_CONFIG={title:"",size:"lg",close:!0,blur:!1,backdrop:!0,backdrop_class:"bg-slate-950/80",header:!0,border:!0,body_padding:!0,panel_class:"",body_class:"",close_class:"",close_overlay:!1};class AifModal{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);modalDialog=viewChild.required("modalDialog");doneCallback=null;isOpen=signal(!1,...ngDevMode?[{debugName:"isOpen"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);state=computed(()=>({...DEFAULT_MODAL_CONFIG,...this.config()??{},...obj_compact(this.cfg())}),...ngDevMode?[{debugName:"state"}]:[]);title=computed(()=>this.state().title??"",...ngDevMode?[{debugName:"title"}]:[]);size=computed(()=>this.state().size??DEFAULT_MODAL_CONFIG.size,...ngDevMode?[{debugName:"size"}]:[]);canClose=computed(()=>!1!==this.state().close,...ngDevMode?[{debugName:"canClose"}]:[]);showHeader=computed(()=>!1!==this.state().header,...ngDevMode?[{debugName:"showHeader"}]:[]);showBorder=computed(()=>!1!==this.state().border,...ngDevMode?[{debugName:"showBorder"}]:[]);bodyPadding=computed(()=>!1!==this.state().body_padding,...ngDevMode?[{debugName:"bodyPadding"}]:[]);blur=computed(()=>!0===this.state().blur,...ngDevMode?[{debugName:"blur"}]:[]);backdropClass=computed(()=>this.state().backdrop_class??DEFAULT_MODAL_CONFIG.backdrop_class,...ngDevMode?[{debugName:"backdropClass"}]:[]);dialogClass=computed(()=>{const e=[`backdrop:${this.backdropClass()}`];return this.blur()&&e.push("backdrop:backdrop-blur-sm"),e.join(" ")},...ngDevMode?[{debugName:"dialogClass"}]:[]);closeOnBackdrop=computed(()=>!1!==this.state().backdrop,...ngDevMode?[{debugName:"closeOnBackdrop"}]:[]);bodyPaddingClass=computed(()=>"full"!==this.size()&&this.bodyPadding()?"p-4 sm:p-6":"p-0",...ngDevMode?[{debugName:"bodyPaddingClass"}]:[]);panelClass=computed(()=>["bg-white dark:bg-slate-900 shadow-2xl flex flex-col overflow-hidden transition-all transform max-h-full relative",this.modalMaxWidth(),this.showBorder()?"border border-slate-200 dark:border-slate-700/50":"border-0",this.state().panel_class??""].filter(Boolean).join(" "),...ngDevMode?[{debugName:"panelClass"}]:[]);headerClass=computed(()=>["flex items-center justify-between px-6 py-4 shrink-0",this.showBorder()?"border-b border-slate-200 dark:border-slate-800/80":"border-b-0","bg-slate-50 dark:bg-slate-950/40"].join(" "),...ngDevMode?[{debugName:"headerClass"}]:[]);bodyClass=computed(()=>["overflow-y-auto flex-1 text-slate-700 dark:text-slate-300",this.bodyPadding()?"p-6":"p-0",this.state().body_class??""].join(" "),...ngDevMode?[{debugName:"bodyClass"}]:[]);closeButtonClass=computed(()=>["rounded-lg transition-all focus:outline-none",this.state().close_overlay?"absolute top-4 right-4 z-10 bg-white/90 text-slate-500 shadow-sm size-10 inline-flex items-center justify-center":"p-2 -mr-2 text-slate-400 hover:text-slate-600 hover:bg-slate-200/50 dark:hover:text-slate-200 dark:hover:bg-slate-800/50",this.state().close_class??""].join(" "),...ngDevMode?[{debugName:"closeButtonClass"}]:[]);modalMaxWidth=computed(()=>{const e=this.size();return"full"===e?"w-full h-full max-w-none !rounded-none":"sm"===e?"max-w-sm rounded-2xl w-full":"md"===e?"max-w-2xl rounded-2xl w-full":"lg"===e?"max-w-4xl rounded-2xl w-full":"xl"===e?"max-w-6xl rounded-2xl w-full":["xs","xl","2xl","3xl","4xl","5xl","6xl","7xl"].includes(e)?`max-w-${e} rounded-2xl w-full`:"max-w-4xl rounded-2xl w-full"},...ngDevMode?[{debugName:"modalMaxWidth"}]:[]);build(e={}){this.cfg.set(obj_compact(e)),this.isBuilt.set(!0)}reBuild(e={}){this.resetToInput(),this.build(e)}resetToInput(){this.cfg.set({}),this.isBuilt.set(!1)}setConfig(e={}){this.build(e)}setTitle(e){this.cfg.update(t=>({...t,title:e})),this.isBuilt.set(!0)}setSize(e){this.cfg.update(t=>({...t,size:e})),this.isBuilt.set(!0)}open(e=null){let t=null;"function"==typeof e?t=e:"string"==typeof e?this.setTitle(e):e&&"object"==typeof e&&!Array.isArray(e)&&(this.build(e),t="function"==typeof e.done?e.done:null),this.doneCallback=t,this.isOpen.set(!0),queueMicrotask(()=>{const e=this.modalDialog().nativeElement;e.open||e.showModal()})}_close(e="close"){this.finalizeClose(e)}close(){const e=this.state().confirm_closed;("function"!=typeof e||e())&&this.finalizeClose("close")}onBackdropClick(){this.closeOnBackdrop()&&this.close()}finalizeClose(e="close"){const t=this.modalDialog().nativeElement;t.open&&t.close(),this.isOpen.set(!1),this.doneCallback?.(e),this.doneCallback=null}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifModal,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifModal,isStandalone:!0,selector:"aif-modal",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"modalDialog",first:!0,predicate:["modalDialog"],descendants:!0,isSignal:!0}],ngImport:i0,template:'<dialog\n #modalDialog\n class="bg-transparent focus:outline-none w-full h-full max-w-none max-h-none m-0 p-0 pointer-events-none"\n [ngClass]="dialogClass()">\n @if (isOpen()) {\n <div class="fixed inset-0 w-full h-full flex items-center justify-center pointer-events-auto" \n [ngClass]="bodyPaddingClass()"\n (click)="onBackdropClick()">\n <div\n [class]="panelClass()"\n (click)="$event.stopPropagation()">\n @if (canClose() && state().close_overlay) {\n <button type="button" [class]="closeButtonClass()" (click)="close()">\n <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M6 18L18 6M6 6l12 12"></path>\n </svg>\n </button>\n }\n\n @if (showHeader()) {\n <div [class]="headerClass()">\n <h3 class="text-lg font-bold text-slate-800 dark:text-slate-100 tracking-tight">{{ title() }}</h3>\n \n @if (canClose() && !state().close_overlay) {\n <button type="button" [class]="closeButtonClass()" (click)="close()">\n <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M6 18L18 6M6 6l12 12"></path>\n </svg>\n </button>\n }\n </div>\n }\n\n <div [class]="bodyClass()">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n }\n</dialog>\n',styles:["dialog::backdrop{background-color:#020617cc!important}\n"],dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifModal,decorators:[{type:Component,args:[{selector:"aif-modal",standalone:!0,imports:[NgClass],template:'<dialog\n #modalDialog\n class="bg-transparent focus:outline-none w-full h-full max-w-none max-h-none m-0 p-0 pointer-events-none"\n [ngClass]="dialogClass()">\n @if (isOpen()) {\n <div class="fixed inset-0 w-full h-full flex items-center justify-center pointer-events-auto" \n [ngClass]="bodyPaddingClass()"\n (click)="onBackdropClick()">\n <div\n [class]="panelClass()"\n (click)="$event.stopPropagation()">\n @if (canClose() && state().close_overlay) {\n <button type="button" [class]="closeButtonClass()" (click)="close()">\n <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M6 18L18 6M6 6l12 12"></path>\n </svg>\n </button>\n }\n\n @if (showHeader()) {\n <div [class]="headerClass()">\n <h3 class="text-lg font-bold text-slate-800 dark:text-slate-100 tracking-tight">{{ title() }}</h3>\n \n @if (canClose() && !state().close_overlay) {\n <button type="button" [class]="closeButtonClass()" (click)="close()">\n <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M6 18L18 6M6 6l12 12"></path>\n </svg>\n </button>\n }\n </div>\n }\n\n <div [class]="bodyClass()">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n }\n</dialog>\n',styles:["dialog::backdrop{background-color:#020617cc!important}\n"]}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],modalDialog:[{type:i0.ViewChild,args:["modalDialog",{isSignal:!0}]}]}});const DEFAULT_CFG={overlay:"bg-slate-900/70",buttonClass:"size-20 rounded-full shadow-lg inline-flex items-center justify-center bg-white text-primary mx-auto mt-10",iconClass:"aif aif-play-filled-ico",modalSize:"xl",modal:{}};class AifSectionVideo{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);sanitizer=inject(DomSanitizer);modal=viewChild(AifModal,...ngDevMode?[{debugName:"modal"}]:[]);isActive=signal(!1,...ngDevMode?[{debugName:"isActive"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);state=computed(()=>{const e=this.config(),t=this.builtConfig()??e;return{item:t?.item??{},cfg:{...DEFAULT_CFG,...t?.cfg??{}}}},...ngDevMode?[{debugName:"state"}]:[]);modalConfig=computed(()=>({title:"",size:this.state().cfg.modalSize,close:!0,blur:!0,backdrop:!0,backdrop_class:"bg-slate-950/90",header:!1,border:!1,body_padding:!1,close_overlay:!0,panel_class:"full"===this.state().cfg.modalSize?"bg-black":"bg-black rounded-2xl overflow-hidden aspect-video w-full",body_class:"bg-black",close_class:"hover:bg-white text-slate-600",...this.state().cfg.modal??{}}),...ngDevMode?[{debugName:"modalConfig"}]:[]);videoContainerClass=computed(()=>"full"===this.state().cfg.modalSize?"relative h-full min-h-[60vh] bg-black":"relative aspect-video w-full bg-black",...ngDevMode?[{debugName:"videoContainerClass"}]:[]);safeVideoUrl=computed(()=>this.sanitizer.bypassSecurityTrustResourceUrl(this.state().item.videoUrl),...ngDevMode?[{debugName:"safeVideoUrl"}]:[]);build(e=null){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e))}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1)}openModal(){this.isActive.set(!0),this.modal()?.open({...this.modalConfig(),done:()=>this.onModalClosed()})}closeModal(){this.modal()?.close()}onModalClosed(){this.isActive.set(!1)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSectionVideo,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSectionVideo,isStandalone:!0,selector:"aif-section-video",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"modal",first:!0,predicate:AifModal,descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (state(); as vm) {\n<section class="py-20 w-full table relative bg-center bg-no-repeat bg-cover"\n [style.background-image]="\'url(\' + vm.item.background + \')\'">\n <div class="absolute inset-0" [ngClass]="vm.cfg.overlay"></div>\n\n <div class="container relative">\n <div class="grid grid-cols-1 text-center">\n <h3 class="mb-4 md:text-3xl text-2xl text-white font-medium">\n {{ vm.item.title }}\n </h3>\n\n <p class="text-white/80 max-w-xl mx-auto">\n {{ vm.item.description }}\n </p>\n\n <button type="button" (click)="openModal()" [ngClass]="vm.cfg.buttonClass">\n <i [class]="vm.cfg.iconClass + \' text-2xl align-middle mt-2\'"></i>\n </button>\n </div>\n </div>\n</section>\n\n<aif-modal [config]="modalConfig()">\n @if (isActive()) {\n <div [class]="videoContainerClass()">\n <iframe width="100%" height="100%" [src]="safeVideoUrl()" allowfullscreen>\n </iframe>\n\n <button type="button" (click)="closeModal()"\n class="absolute top-4 right-4 bg-white/90 text-gray-500 size-9 rounded-full shadow-sm">\n <span class="aif aif-cross-alt-ico align-middle"></span>\n </button>\n </div>\n }\n</aif-modal>\n}\n',styles:[""],dependencies:[{kind:"component",type:AifModal,selector:"aif-modal",inputs:["config"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSectionVideo,decorators:[{type:Component,args:[{selector:"aif-section-video",standalone:!0,imports:[AifModal,NgClass],template:'@if (state(); as vm) {\n<section class="py-20 w-full table relative bg-center bg-no-repeat bg-cover"\n [style.background-image]="\'url(\' + vm.item.background + \')\'">\n <div class="absolute inset-0" [ngClass]="vm.cfg.overlay"></div>\n\n <div class="container relative">\n <div class="grid grid-cols-1 text-center">\n <h3 class="mb-4 md:text-3xl text-2xl text-white font-medium">\n {{ vm.item.title }}\n </h3>\n\n <p class="text-white/80 max-w-xl mx-auto">\n {{ vm.item.description }}\n </p>\n\n <button type="button" (click)="openModal()" [ngClass]="vm.cfg.buttonClass">\n <i [class]="vm.cfg.iconClass + \' text-2xl align-middle mt-2\'"></i>\n </button>\n </div>\n </div>\n</section>\n\n<aif-modal [config]="modalConfig()">\n @if (isActive()) {\n <div [class]="videoContainerClass()">\n <iframe width="100%" height="100%" [src]="safeVideoUrl()" allowfullscreen>\n </iframe>\n\n <button type="button" (click)="closeModal()"\n class="absolute top-4 right-4 bg-white/90 text-gray-500 size-9 rounded-full shadow-sm">\n <span class="aif aif-cross-alt-ico align-middle"></span>\n </button>\n </div>\n }\n</aif-modal>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],modal:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifModal),{isSignal:!0}]}]}});class AifSideBar{sidebar=inject(AifSideBarService);router=inject(Router);config=input(null,...ngDevMode?[{debugName:"config"}]:[]);currentUrl=signal(this.router.url,...ngDevMode?[{debugName:"currentUrl"}]:[]);openSubmenu=signal(null,...ngDevMode?[{debugName:"openSubmenu"}]:[]);subMenuHeights=signal({},...ngDevMode?[{debugName:"subMenuHeights"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);isWide=computed(()=>this.sidebar.isExpanded()||this.sidebar.isMobileOpen()||this.sidebar.isHovered(),...ngDevMode?[{debugName:"isWide"}]:[]);isMobileOpen=computed(()=>this.sidebar.isMobileOpen(),...ngDevMode?[{debugName:"isMobileOpen"}]:[]);_routerSb;state=computed(()=>{const e=this.config(),t=this.builtConfig()??e;return{logo:t?.logo??null,logoIcon:t?.logoIcon??null,menu:t?.menu??[]}},...ngDevMode?[{debugName:"state"}]:[]);menu=computed(()=>this.state().menu,...ngDevMode?[{debugName:"menu"}]:[]);logoConfig=computed(()=>this.state().logo,...ngDevMode?[{debugName:"logoConfig"}]:[]);logoIcon=computed(()=>this.state().logoIcon,...ngDevMode?[{debugName:"logoIcon"}]:[]);showExpandedSidebar=computed(()=>this.sidebar.isExpanded()||this.sidebar.isHovered()||this.sidebar.isMobileOpen(),...ngDevMode?[{debugName:"showExpandedSidebar"}]:[]);showExpandedLogo=computed(()=>!!this.logoConfig()&&this.showExpandedSidebar(),...ngDevMode?[{debugName:"showExpandedLogo"}]:[]);showCollapsedLogo=computed(()=>!!this.logoIcon()&&!this.showExpandedSidebar(),...ngDevMode?[{debugName:"showCollapsedLogo"}]:[]);ngOnInit(){this._routerSb=this.router.events.pipe(filter(e=>e instanceof NavigationEnd)).subscribe(e=>this.setActiveMenuFromRoute(e.urlAfterRedirects||e.url)),this.setActiveMenuFromRoute(this.router.url)}ngOnDestroy(){this._routerSb?.unsubscribe?.()}isActive(e){return this.router.url===e}toggleSubmenu(e,t){const n=`${e}-${t}`;if(this.openSubmenu()===n)return this.openSubmenu.set(null),void this.subMenuHeights.update(e=>({...e,[n]:0}));this.openSubmenu.set(n),setTimeout(()=>{const e=document.getElementById(n);e&&this.subMenuHeights.update(t=>({...t,[n]:e.scrollHeight}))},0)}onSidebarMouseEnter(){this.sidebar.isExpanded()||this.sidebar.setHovered(!0)}onSubmenuClick(){this.sidebar.isMobileOpen()&&this.sidebar.setMobileOpen(!1)}build(e=null){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e),this.syncActiveMenu())}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1),this.openSubmenu.set(null),this.subMenuHeights.set({}),this.syncActiveMenu()}setMenu(e=[]){const t=this.builtConfig()??this.config()??{};this.reBuild({...t,menu:e})}setLogo(e,t){const n=this.builtConfig()??this.config()??{};this.reBuild({...n,logo:e,logoIcon:void 0===t?n.logoIcon??null:t})}setActiveMenuFromRoute(e){this.currentUrl.set(e),this.syncActiveMenu()}icon_span(e=""){return`<span class="${e}"></span>`}syncActiveMenu(){const e=this.menu();if(e.length>0)for(const t of e)(t.items||[]).forEach((e,n)=>{if(e.subItems)for(const i of e.subItems)if(this.currentUrl()===i.path){const e=`${t.prefix}-${n}`;this.openSubmenu.set(e),setTimeout(()=>{const t=document.getElementById(e);t&&this.subMenuHeights.update(n=>({...n,[e]:t.scrollHeight}))},0)}})}closeSidebar(){this.sidebar.setMobileOpen(!1)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSideBar,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSideBar,isStandalone:!0,selector:"aif-side-bar",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<aside\n class="fixed top-0 left-0 z-50 flex h-screen flex-col border-r border-gray-200 bg-white px-5 text-gray-900 transition-all duration-300 ease-in-out dark:border-gray-800 dark:bg-gray-900"\n [ngClass]="{\n \'w-[290px]\': isWide(),\n \'w-[90px]\': !isWide(),\n \'translate-x-0\': isMobileOpen(),\n \'-translate-x-full\': !isMobileOpen(),\n \'xl:translate-x-0\': true\n }"\n (mouseenter)="onSidebarMouseEnter()"\n (mouseleave)="sidebar.setHovered(false)">\n <div\n class="flex h-[74px] items-center border-b border-gray-200 dark:border-gray-800"\n [ngClass]="{\n \'xl:justify-center\': !showExpandedSidebar(),\n \'justify-start\': showExpandedSidebar()\n }">\n @if (showExpandedLogo() && logoConfig(); as logo) {\n <aif-nav-logo [cfg]="logo" />\n } @else if (showCollapsedLogo()) {\n <a routerLink="/" class="inline-flex h-10 w-10 items-center justify-center">\n <img [src]="logoIcon()" [alt]="logoConfig()?.alt || \'Logo\'" width="32" height="32" />\n </a>\n }\n </div>\n\n <div class="no-scrollbar flex flex-col overflow-y-auto duration-300 ease-linear">\n <nav class="mb-6">\n <div class="flex flex-col gap-4">\n @if (menu().length) {\n @for (menuItems of menu(); track $index; let i = $index) {\n <div>\n <h2\n class="mb-4 flex text-xs leading-[20px] uppercase text-gray-400"\n [ngClass]="{\n \'xl:justify-center\': !showExpandedSidebar(),\n \'justify-start\': showExpandedSidebar()\n }">\n @if (showExpandedSidebar()) {\n {{ menuItems.name }}\n } @else {\n @if(menuItems.icon){\n <span class="menu-item-icon-size" [innerHTML]="icon_span(menuItems.icon) | aifSafeHtml"></span>\n } @else {\n <svg\n width="1em"\n height="1em"\n viewBox="0 0 24 24"\n fill="none"\n xmlns="http://www.w3.org/2000/svg"\n class="size-6">\n <path\n fill-rule="evenodd"\n clip-rule="evenodd"\n d="M5.99915 10.2451C6.96564 10.2451 7.74915 11.0286 7.74915 11.9951V12.0051C7.74915 12.9716 6.96564 13.7551 5.99915 13.7551C5.03265 13.7551 4.24915 12.9716 4.24915 12.0051V11.9951C4.24915 11.0286 5.03265 10.2451 5.99915 10.2451ZM17.9991 10.2451C18.9656 10.2451 19.7491 11.0286 19.7491 11.9951V12.0051C19.7491 12.9716 18.9656 13.7551 17.9991 13.7551C17.0326 13.7551 16.2491 12.9716 16.2491 12.0051V11.9951C16.2491 11.0286 17.0326 10.2451 17.9991 10.2451ZM13.7491 11.9951C13.7491 11.0286 12.9656 10.2451 11.9991 10.2451C11.0326 10.2451 10.2491 11.0286 10.2491 11.9951V12.0051C10.2491 12.9716 11.0326 13.7551 11.9991 13.7551C12.9656 13.7551 13.7491 12.9716 13.7491 12.0051V11.9951Z"\n fill="currentColor"></path>\n </svg>\n }\n }\n </h2>\n\n @if (menuItems.items) {\n <ul class="flex flex-col gap-1">\n @for (nav of menuItems.items; track $index; let i = $index) {\n <li>\n @if (nav.subItems) {\n <button\n type="button"\n (click)="toggleSubmenu(menuItems.prefix||\'main\', i)"\n class="menu-item group cursor-pointer"\n [class.menu-item-active]="openSubmenu() === menuItems.prefix + \'-\' + i"\n [class.menu-item-inactive]="openSubmenu() !== menuItems.prefix + \'-\' + i"\n [ngClass]="{\n \'xl:justify-center\': !showExpandedSidebar(),\n \'xl:justify-start\': showExpandedSidebar()\n }">\n <span\n class="menu-item-icon-size"\n [class.menu-item-icon-active]="openSubmenu() === menuItems.prefix + \'-\' + i"\n [class.menu-item-icon-inactive]="openSubmenu() !== menuItems.prefix + \'-\' + i"\n [innerHTML]="nav.svg ? nav.svg : icon_span(nav.icon) | aifSafeHtml"></span>\n\n @if (showExpandedSidebar()) {\n <span class="menu-item-text">{{ nav.name }}</span>\n }\n\n @if (nav.new && showExpandedSidebar()) {\n <span\n class="menu-dropdown-badge absolute right-10 ml-auto"\n [ngClass]="{\n \'menu-dropdown-badge-active\': openSubmenu() === menuItems.prefix + \'-\' + i,\n \'menu-dropdown-badge-inactive\': openSubmenu() !== menuItems.prefix + \'-\' + i\n }">\n new\n </span>\n }\n\n @if (showExpandedSidebar()) {\n <svg\n [ngClass]="{ \'rotate-180 text-brand-500\': openSubmenu() === menuItems.prefix + \'-\' + i }"\n width="1em"\n height="1em"\n viewBox="0 0 20 20"\n fill="none"\n xmlns="http://www.w3.org/2000/svg"\n class="ml-auto h-5 w-5 transition-transform duration-200">\n <path\n d="M4.79175 7.396L10.0001 12.6043L15.2084 7.396"\n stroke="currentColor"\n stroke-width="1.5"\n stroke-linecap="round"\n stroke-linejoin="round"></path>\n </svg>\n }\n </button>\n\n <div\n class="overflow-hidden transition-all duration-300"\n [id]="menuItems.prefix + \'-\' + i"\n [style.display]="isWide() ? \'block\' : \'none\'"\n [ngStyle]="{\n height:\n openSubmenu() === menuItems.prefix + \'-\' + i\n ? ((subMenuHeights()[menuItems.prefix + \'-\' + i] || 0) + \'px\')\n : \'0px\'\n }">\n <ul class="mt-2 ml-9 space-y-1">\n @for (subItem of nav.subItems; track $index) {\n <li>\n <a\n [routerLink]="subItem.path"\n routerLinkActive=""\n (click)="onSubmenuClick()"\n class="menu-dropdown-item"\n [ngClass]="{\n \'menu-dropdown-item-inactive\': !isActive(subItem.path),\n \'menu-dropdown-item-active\': isActive(subItem.path)\n }">\n {{ subItem.name }}\n\n <span class="ml-auto flex items-center gap-1">\n @if (subItem.new) {\n <span\n class="menu-dropdown-badge"\n [ngClass]="{\n \'menu-dropdown-badge-active\': isActive(subItem.path),\n \'menu-dropdown-badge-inactive\': !isActive(subItem.path)\n }">\n new\n </span>\n }\n @if (subItem.pro) {\n <span\n class="menu-dropdown-badge-pro ml-auto"\n [ngClass]="{\n \'menu-dropdown-badge-pro-active\': isActive(subItem.path),\n \'menu-dropdown-badge-pro-inactive\': !isActive(subItem.path)\n }">\n pro\n </span>\n }\n </span>\n </a>\n </li>\n }\n </ul>\n </div>\n } @else {\n @if (nav.path) {\n <a\n [routerLink]="nav.path"\n routerLinkActive="menu-item-active"\n class="menu-item group"\n [ngClass]="{\n \'menu-item-inactive\': !isActive(nav.path),\n \'xl:justify-center\': !showExpandedSidebar(),\n \'xl:justify-start\': showExpandedSidebar()\n }">\n <span\n class="menu-item-icon-size"\n [ngClass]="{\n \'menu-item-icon-active\': isActive(nav.path),\n \'menu-item-icon-inactive\': !isActive(nav.path)\n }"\n [innerHTML]="nav.svg ? nav.svg : icon_span(nav.icon) | aifSafeHtml"></span>\n\n @if (showExpandedSidebar()) {\n <span class="menu-item-text">\n {{ nav.name }}\n </span>\n }\n </a>\n }\n }\n </li>\n }\n </ul>\n }\n </div>\n }\n }\n </div>\n </nav>\n </div>\n</aside>\n\n@if (isMobileOpen()) {\n<div class="fixed inset-0 z-40 bg-gray-900/50 lg:hidden" (click)="closeSidebar()"></div>\n}\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:NgStyle,selector:"[ngStyle]",inputs:["ngStyle"]},{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]},{kind:"component",type:AifNavLogo,selector:"aif-nav-logo",inputs:["cfg","surface"]},{kind:"pipe",type:AifSafeHtmlPipe,name:"aifSafeHtml"}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSideBar,decorators:[{type:Component,args:[{selector:"aif-side-bar",standalone:!0,imports:[NgClass,NgStyle,RouterLink,AifSafeHtmlPipe,AifNavLogo],template:'<aside\n class="fixed top-0 left-0 z-50 flex h-screen flex-col border-r border-gray-200 bg-white px-5 text-gray-900 transition-all duration-300 ease-in-out dark:border-gray-800 dark:bg-gray-900"\n [ngClass]="{\n \'w-[290px]\': isWide(),\n \'w-[90px]\': !isWide(),\n \'translate-x-0\': isMobileOpen(),\n \'-translate-x-full\': !isMobileOpen(),\n \'xl:translate-x-0\': true\n }"\n (mouseenter)="onSidebarMouseEnter()"\n (mouseleave)="sidebar.setHovered(false)">\n <div\n class="flex h-[74px] items-center border-b border-gray-200 dark:border-gray-800"\n [ngClass]="{\n \'xl:justify-center\': !showExpandedSidebar(),\n \'justify-start\': showExpandedSidebar()\n }">\n @if (showExpandedLogo() && logoConfig(); as logo) {\n <aif-nav-logo [cfg]="logo" />\n } @else if (showCollapsedLogo()) {\n <a routerLink="/" class="inline-flex h-10 w-10 items-center justify-center">\n <img [src]="logoIcon()" [alt]="logoConfig()?.alt || \'Logo\'" width="32" height="32" />\n </a>\n }\n </div>\n\n <div class="no-scrollbar flex flex-col overflow-y-auto duration-300 ease-linear">\n <nav class="mb-6">\n <div class="flex flex-col gap-4">\n @if (menu().length) {\n @for (menuItems of menu(); track $index; let i = $index) {\n <div>\n <h2\n class="mb-4 flex text-xs leading-[20px] uppercase text-gray-400"\n [ngClass]="{\n \'xl:justify-center\': !showExpandedSidebar(),\n \'justify-start\': showExpandedSidebar()\n }">\n @if (showExpandedSidebar()) {\n {{ menuItems.name }}\n } @else {\n @if(menuItems.icon){\n <span class="menu-item-icon-size" [innerHTML]="icon_span(menuItems.icon) | aifSafeHtml"></span>\n } @else {\n <svg\n width="1em"\n height="1em"\n viewBox="0 0 24 24"\n fill="none"\n xmlns="http://www.w3.org/2000/svg"\n class="size-6">\n <path\n fill-rule="evenodd"\n clip-rule="evenodd"\n d="M5.99915 10.2451C6.96564 10.2451 7.74915 11.0286 7.74915 11.9951V12.0051C7.74915 12.9716 6.96564 13.7551 5.99915 13.7551C5.03265 13.7551 4.24915 12.9716 4.24915 12.0051V11.9951C4.24915 11.0286 5.03265 10.2451 5.99915 10.2451ZM17.9991 10.2451C18.9656 10.2451 19.7491 11.0286 19.7491 11.9951V12.0051C19.7491 12.9716 18.9656 13.7551 17.9991 13.7551C17.0326 13.7551 16.2491 12.9716 16.2491 12.0051V11.9951C16.2491 11.0286 17.0326 10.2451 17.9991 10.2451ZM13.7491 11.9951C13.7491 11.0286 12.9656 10.2451 11.9991 10.2451C11.0326 10.2451 10.2491 11.0286 10.2491 11.9951V12.0051C10.2491 12.9716 11.0326 13.7551 11.9991 13.7551C12.9656 13.7551 13.7491 12.9716 13.7491 12.0051V11.9951Z"\n fill="currentColor"></path>\n </svg>\n }\n }\n </h2>\n\n @if (menuItems.items) {\n <ul class="flex flex-col gap-1">\n @for (nav of menuItems.items; track $index; let i = $index) {\n <li>\n @if (nav.subItems) {\n <button\n type="button"\n (click)="toggleSubmenu(menuItems.prefix||\'main\', i)"\n class="menu-item group cursor-pointer"\n [class.menu-item-active]="openSubmenu() === menuItems.prefix + \'-\' + i"\n [class.menu-item-inactive]="openSubmenu() !== menuItems.prefix + \'-\' + i"\n [ngClass]="{\n \'xl:justify-center\': !showExpandedSidebar(),\n \'xl:justify-start\': showExpandedSidebar()\n }">\n <span\n class="menu-item-icon-size"\n [class.menu-item-icon-active]="openSubmenu() === menuItems.prefix + \'-\' + i"\n [class.menu-item-icon-inactive]="openSubmenu() !== menuItems.prefix + \'-\' + i"\n [innerHTML]="nav.svg ? nav.svg : icon_span(nav.icon) | aifSafeHtml"></span>\n\n @if (showExpandedSidebar()) {\n <span class="menu-item-text">{{ nav.name }}</span>\n }\n\n @if (nav.new && showExpandedSidebar()) {\n <span\n class="menu-dropdown-badge absolute right-10 ml-auto"\n [ngClass]="{\n \'menu-dropdown-badge-active\': openSubmenu() === menuItems.prefix + \'-\' + i,\n \'menu-dropdown-badge-inactive\': openSubmenu() !== menuItems.prefix + \'-\' + i\n }">\n new\n </span>\n }\n\n @if (showExpandedSidebar()) {\n <svg\n [ngClass]="{ \'rotate-180 text-brand-500\': openSubmenu() === menuItems.prefix + \'-\' + i }"\n width="1em"\n height="1em"\n viewBox="0 0 20 20"\n fill="none"\n xmlns="http://www.w3.org/2000/svg"\n class="ml-auto h-5 w-5 transition-transform duration-200">\n <path\n d="M4.79175 7.396L10.0001 12.6043L15.2084 7.396"\n stroke="currentColor"\n stroke-width="1.5"\n stroke-linecap="round"\n stroke-linejoin="round"></path>\n </svg>\n }\n </button>\n\n <div\n class="overflow-hidden transition-all duration-300"\n [id]="menuItems.prefix + \'-\' + i"\n [style.display]="isWide() ? \'block\' : \'none\'"\n [ngStyle]="{\n height:\n openSubmenu() === menuItems.prefix + \'-\' + i\n ? ((subMenuHeights()[menuItems.prefix + \'-\' + i] || 0) + \'px\')\n : \'0px\'\n }">\n <ul class="mt-2 ml-9 space-y-1">\n @for (subItem of nav.subItems; track $index) {\n <li>\n <a\n [routerLink]="subItem.path"\n routerLinkActive=""\n (click)="onSubmenuClick()"\n class="menu-dropdown-item"\n [ngClass]="{\n \'menu-dropdown-item-inactive\': !isActive(subItem.path),\n \'menu-dropdown-item-active\': isActive(subItem.path)\n }">\n {{ subItem.name }}\n\n <span class="ml-auto flex items-center gap-1">\n @if (subItem.new) {\n <span\n class="menu-dropdown-badge"\n [ngClass]="{\n \'menu-dropdown-badge-active\': isActive(subItem.path),\n \'menu-dropdown-badge-inactive\': !isActive(subItem.path)\n }">\n new\n </span>\n }\n @if (subItem.pro) {\n <span\n class="menu-dropdown-badge-pro ml-auto"\n [ngClass]="{\n \'menu-dropdown-badge-pro-active\': isActive(subItem.path),\n \'menu-dropdown-badge-pro-inactive\': !isActive(subItem.path)\n }">\n pro\n </span>\n }\n </span>\n </a>\n </li>\n }\n </ul>\n </div>\n } @else {\n @if (nav.path) {\n <a\n [routerLink]="nav.path"\n routerLinkActive="menu-item-active"\n class="menu-item group"\n [ngClass]="{\n \'menu-item-inactive\': !isActive(nav.path),\n \'xl:justify-center\': !showExpandedSidebar(),\n \'xl:justify-start\': showExpandedSidebar()\n }">\n <span\n class="menu-item-icon-size"\n [ngClass]="{\n \'menu-item-icon-active\': isActive(nav.path),\n \'menu-item-icon-inactive\': !isActive(nav.path)\n }"\n [innerHTML]="nav.svg ? nav.svg : icon_span(nav.icon) | aifSafeHtml"></span>\n\n @if (showExpandedSidebar()) {\n <span class="menu-item-text">\n {{ nav.name }}\n </span>\n }\n </a>\n }\n }\n </li>\n }\n </ul>\n }\n </div>\n }\n }\n </div>\n </nav>\n </div>\n</aside>\n\n@if (isMobileOpen()) {\n<div class="fixed inset-0 z-40 bg-gray-900/50 lg:hidden" (click)="closeSidebar()"></div>\n}\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifSliderBar{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);sliderContainer=viewChild("sliderContainer",...ngDevMode?[{debugName:"sliderContainer"}]:[]);state=computed(()=>{const e=this.builtConfig()??this.config();return{items:e?.items??[],cfg:{controls:!0,mouseDrag:!0,loop:!0,rewind:!0,autoplay:!0,autoplayTimeout:3e3,nav:!1,speed:400,gutter:0,controlsText:['<i class="aif aif-chevron-left-ico"></i>','<i class="aif aif-chevron-right-ico"></i>'],...e?.cfg??{}}}},...ngDevMode?[{debugName:"state"}]:[]);itemsVisible=signal(12,...ngDevMode?[{debugName:"itemsVisible"}]:[]);itemWidth=computed(()=>`calc(100% / ${this.itemsVisible()})`,...ngDevMode?[{debugName:"itemWidth"}]:[]);autoplayInterval;isBrowser;isDragging=signal(!1,...ngDevMode?[{debugName:"isDragging"}]:[]);startX=0;scrollLeftPos=0;constructor(e){this.isBrowser=isPlatformBrowser(e),effect(()=>{const e=this.state();this.isBrowser&&e.items.length>0?(this.updateItemsVisible(),this.startAutoplay()):this.stopAutoplay()})}build(e=null){e&&this.builtConfig.set(e)}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null)}onResize(){this.isBrowser&&this.updateItemsVisible()}updateItemsVisible(){const e=this.state().cfg,t=window.innerWidth;let n=1;if(e.responsive&&Object.keys(e.responsive).length>0){const i=Object.keys(e.responsive).map(Number).sort((e,t)=>t-e);for(const a of i)if(t>=a){n=e.responsive[a].items;break}}else{const e=120;n=Math.max(2,Math.floor(t/e))}this.itemsVisible.set(n)}startAutoplay(){this.stopAutoplay();const e=this.state().cfg;e.autoplay&&this.isBrowser&&(this.autoplayInterval=setInterval(()=>{this.next()},e.autoplayTimeout||3e3))}stopAutoplay(){this.autoplayInterval&&(clearInterval(this.autoplayInterval),this.autoplayInterval=null)}next(){const e=this.sliderContainer()?.nativeElement;if(!e)return;const t=e.firstElementChild?.clientWidth||0,n=e.scrollWidth-e.clientWidth;let i=e.scrollLeft+t;i>n+t/2&&(this.state().cfg.rewind||this.state().cfg.loop)&&(i=0),e.scrollTo({left:i,behavior:"smooth"})}prev(){const e=this.sliderContainer()?.nativeElement;if(!e)return;const t=e.firstElementChild?.clientWidth||0;let n=e.scrollLeft-t;n<-t/2&&(this.state().cfg.rewind||this.state().cfg.loop)&&(n=e.scrollWidth-e.clientWidth),e.scrollTo({left:n,behavior:"smooth"})}onPointerDown(e){if(!this.state().cfg.mouseDrag)return;this.isDragging.set(!0);const t=this.sliderContainer()?.nativeElement;t&&(this.startX=e.pageX-t.offsetLeft,this.scrollLeftPos=t.scrollLeft,t.style.scrollBehavior="auto"),this.stopAutoplay()}onPointerMove(e){if(!this.isDragging()||!this.state().cfg.mouseDrag)return;e.preventDefault();const t=this.sliderContainer()?.nativeElement;if(t){const n=1.5*(e.pageX-t.offsetLeft-this.startX);t.scrollLeft=this.scrollLeftPos-n}}onPointerUp(){if(!this.isDragging())return;this.isDragging.set(!1);const e=this.sliderContainer()?.nativeElement;e&&(e.style.scrollBehavior="smooth"),this.startAutoplay()}ngOnDestroy(){this.stopAutoplay()}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSliderBar,deps:[{token:PLATFORM_ID}],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSliderBar,isStandalone:!0,selector:"aif-slider-bar",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},host:{listeners:{"window:resize":"onResize()"}},viewQueries:[{propertyName:"sliderContainer",first:!0,predicate:["sliderContainer"],descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (state(); as vm) {\n<section class="container-fluid relative bg-slate-900 dark:bg-slate-800 py-3 group pl-9 pr-9" (mouseenter)="stopAutoplay()" (mouseleave)="startAutoplay()">\n \x3c!-- Optional Controls --\x3e\n @if (vm.cfg.controls) {\n <button class="absolute left-2 top-1/2 -translate-y-1/2 z-10 text-white p-2 hover:bg-slate-700/50 rounded transition-colors opacity-50 hover:opacity-100 disabled:opacity-30"\n (click)="prev()">\n <span [innerHTML]="vm.cfg.controlsText[0] || \'<i class=\\\'aif aif-chevron-left-ico\\\'></i>\'"></span>\n </button>\n <button class="absolute right-2 top-1/2 -translate-y-1/2 z-10 text-white p-2 hover:bg-slate-700/50 rounded transition-colors opacity-50 hover:opacity-100 disabled:opacity-30"\n (click)="next()">\n <span [innerHTML]="vm.cfg.controlsText[1] || \'<i class=\\\'aif aif-chevron-right-ico\\\'></i>\'"></span>\n </button>\n }\n\n \x3c!-- Viewport Container --\x3e\n <div \n #sliderContainer\n class="flex items-center overflow-x-auto snap-x snap-mandatory scroll-smooth [&::-webkit-scrollbar]:hidden"\n [class.cursor-grab]="vm.cfg.mouseDrag && !isDragging()"\n [class.cursor-grabbing]="isDragging()"\n (pointerdown)="onPointerDown($event)"\n (pointerleave)="onPointerUp()"\n (pointerup)="onPointerUp()"\n (pointermove)="onPointerMove($event)"\n style="scrollbar-width: none; -ms-overflow-style: none;"\n >\n @for (item of vm.items; track item.image + \'-\' + item.route) {\n <div class="snap-start shrink-0 flex-none relative transition-all duration-300 px-2 box-border select-none"\n [style.width]="itemWidth()">\n <div class="flex items-center justify-center h-full">\n <a [href]="item.route" target="_blank" class="inline-block select-none pointer-events-auto" [title]="item.title || \'\'" draggable="false" (dragstart)="$event.preventDefault()">\n <img [src]="item.image" class="opacity-50 hover:opacity-100 transition-opacity duration-300 mx-auto select-none max-h-20 w-auto pointer-events-none"\n [alt]="item.label || item.title || \'Slider image\'" draggable="false" (dragstart)="$event.preventDefault()" />\n </a>\n </div>\n </div>\n }\n </div>\n</section>\n}\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSliderBar,decorators:[{type:Component,args:[{selector:"aif-slider-bar",standalone:!0,imports:[],template:'@if (state(); as vm) {\n<section class="container-fluid relative bg-slate-900 dark:bg-slate-800 py-3 group pl-9 pr-9" (mouseenter)="stopAutoplay()" (mouseleave)="startAutoplay()">\n \x3c!-- Optional Controls --\x3e\n @if (vm.cfg.controls) {\n <button class="absolute left-2 top-1/2 -translate-y-1/2 z-10 text-white p-2 hover:bg-slate-700/50 rounded transition-colors opacity-50 hover:opacity-100 disabled:opacity-30"\n (click)="prev()">\n <span [innerHTML]="vm.cfg.controlsText[0] || \'<i class=\\\'aif aif-chevron-left-ico\\\'></i>\'"></span>\n </button>\n <button class="absolute right-2 top-1/2 -translate-y-1/2 z-10 text-white p-2 hover:bg-slate-700/50 rounded transition-colors opacity-50 hover:opacity-100 disabled:opacity-30"\n (click)="next()">\n <span [innerHTML]="vm.cfg.controlsText[1] || \'<i class=\\\'aif aif-chevron-right-ico\\\'></i>\'"></span>\n </button>\n }\n\n \x3c!-- Viewport Container --\x3e\n <div \n #sliderContainer\n class="flex items-center overflow-x-auto snap-x snap-mandatory scroll-smooth [&::-webkit-scrollbar]:hidden"\n [class.cursor-grab]="vm.cfg.mouseDrag && !isDragging()"\n [class.cursor-grabbing]="isDragging()"\n (pointerdown)="onPointerDown($event)"\n (pointerleave)="onPointerUp()"\n (pointerup)="onPointerUp()"\n (pointermove)="onPointerMove($event)"\n style="scrollbar-width: none; -ms-overflow-style: none;"\n >\n @for (item of vm.items; track item.image + \'-\' + item.route) {\n <div class="snap-start shrink-0 flex-none relative transition-all duration-300 px-2 box-border select-none"\n [style.width]="itemWidth()">\n <div class="flex items-center justify-center h-full">\n <a [href]="item.route" target="_blank" class="inline-block select-none pointer-events-auto" [title]="item.title || \'\'" draggable="false" (dragstart)="$event.preventDefault()">\n <img [src]="item.image" class="opacity-50 hover:opacity-100 transition-opacity duration-300 mx-auto select-none max-h-20 w-auto pointer-events-none"\n [alt]="item.label || item.title || \'Slider image\'" draggable="false" (dragstart)="$event.preventDefault()" />\n </a>\n </div>\n </div>\n }\n </div>\n</section>\n}\n'}]}],ctorParameters:()=>[{type:Object,decorators:[{type:Inject,args:[PLATFORM_ID]}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],sliderContainer:[{type:i0.ViewChild,args:["sliderContainer",{isSignal:!0}]}],onResize:[{type:HostListener,args:["window:resize"]}]}});class AifSliderFull{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);state=computed(()=>{const e=this.builtConfig()??this.config();return{items:e?.items??[],cfg:e?.cfg??{},opts:e?.opts??{}}},...ngDevMode?[{debugName:"state"}]:[]);options=computed(()=>{const e=this.state().opts;return{class_container:e.class_container||"carouselThree swiper-slider-hero relative overflow-x-hidden h-screen",class_wrapper:e.class_wrapper||"relative h-screen inset-0",buttons:void 0===e.buttons||e.buttons,pagination:void 0===e.pagination||e.pagination}},...ngDevMode?[{debugName:"options"}]:[]);swiperContainer=viewChild("swiperContainer",...ngDevMode?[{debugName:"swiperContainer"}]:[]);swiper;currentSignature="";initFrame=null;constructor(){register(),afterRenderEffect(()=>{const e=this.swiperContainer(),t=this.state(),n=JSON.stringify({items:t.items,cfg:t.cfg,opts:t.opts});n!==this.currentSignature&&(this.currentSignature=n,e&&0!==t.items.length?this.scheduleMountSwiper():this.destroySwiper())})}build(e=null){e&&this.builtConfig.set(e),this.currentSignature=""}reBuild(e=null){this.resetToInput(),this.build(e)}resetToInput(){this.builtConfig.set(null),this.currentSignature=""}scheduleMountSwiper(){this.cancelPendingInit(),this.destroySwiper(),this.initFrame=this.scheduleInit(()=>{this.mountSwiper(),this.initFrame=null})}mountSwiper(){const e=this.swiperContainer(),t=this.state().items;if(!e||!e.nativeElement.isConnected||!t||0===t.length)return;const n={slidesPerView:1,spaceBetween:0,autoplay:!0,speed:3e3,loop:!0,navigation:{nextEl:".swiper-button-next",prevEl:".swiper-button-prev"},pagination:{el:".swiper-pagination",clickable:!0},...this.state().cfg};this.swiper=new Swiper(e.nativeElement,n)}scheduleInit(e){return"function"==typeof requestAnimationFrame?requestAnimationFrame(e):globalThis.setTimeout(()=>e(performance.now()),0)}cancelPendingInit(){null!==this.initFrame&&("function"==typeof cancelAnimationFrame?cancelAnimationFrame(this.initFrame):globalThis.clearTimeout(this.initFrame),this.initFrame=null)}destroySwiper(){this.cancelPendingInit(),this.swiper?.destroy(!0,!0),this.swiper=void 0}ngOnDestroy(){this.destroySwiper()}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSliderFull,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifSliderFull,isStandalone:!0,selector:"aif-slider-full",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"swiperContainer",first:!0,predicate:["swiperContainer"],descendants:!0,isSignal:!0}],ngImport:i0,template:"@if (state(); as vm) {\n<div class=\"swiper\" [class]=\"options().class_container\" #swiperContainer>\n <div class=\"swiper-wrapper\" [class]=\"options().class_wrapper\">\n\n @for (slide of vm.items; track $index) {\n <div class=\"swiper-slide flex items-center justify-center duration-700 ease-in-out overflow-hidden\">\n\n \x3c!-- Imagen con efecto extendido tipo Techwind --\x3e\n <div class=\"image-wrap absolute inset-0\n -top-[350px] -bottom-[350px]\n -start-[100px] -end-[100px]\n min-w-full w-auto min-h-full h-auto\n overflow-hidden m-auto z-1\n bg-top bg-no-repeat bg-cover\" [ngStyle]=\"{\n 'background-image': 'url(' + slide.image + ')'\n }\">\n </div>\n\n \x3c!-- Overlay dinámico --\x3e\n <div class=\"absolute inset-0 z-2 bg-slate-900/70\" [ngClass]=\"{\n 'ltr:md:bg-gradient-to-r rtl:md:bg-gradient-to-l md:from-slate-900 md:via-slate-900/80 md:bg-slate-900/20':\n slide.gradient_direction === 'right',\n 'md:bg-gradient-to-b md:from-transparent md:to-slate-900 md:bg-slate-900/20':\n slide.gradient_direction === 'bottom',\n 'ltr:md:bg-gradient-to-l rtl:md:bg-gradient-to-r md:from-slate-900 md:via-slate-900/80 md:bg-slate-900/20':\n slide.gradient_direction === 'left'\n }\"></div>\n\n \x3c!-- Contenido --\x3e\n <div class=\"relative z-3 mx-auto h-full w-full max-w-7xl px-6 lg:px-8 flex items-center\" [ngClass]=\"{\n 'justify-center': slide.align === 'center',\n 'justify-start': slide.align === 'start',\n 'justify-end': slide.align === 'end'\n }\">\n\n <div class=\"grid grid-cols-1 mt-10 w-full\">\n <div [ngClass]=\"{\n 'text-center': slide.align === 'center',\n 'md:text-start text-center': slide.align === 'start',\n 'md:text-end text-center': slide.align === 'end'\n }\"\n class=\"w-full max-w-4xl\">\n <h1 class=\"font-bold text-white lg:leading-normal leading-normal text-4xl lg:text-5xl mb-6\">\n {{ slide.title }}\n </h1>\n\n <p class=\"text-white/70 text-lg max-w-xl\" [ngClass]=\"{\n 'mx-auto': slide.align === 'center',\n 'md:ms-auto': slide.align === 'end'\n }\">\n {{ slide.description }}\n </p>\n\n <div class=\"mt-8\">\n <a [routerLink]=\"slide.route\" class=\"py-2 px-5 inline-block font-semibold tracking-wide border align-middle duration-500\n text-base text-center bg-primary hover:bg-primary-700\n border-primary hover:border-primary-700 text-white rounded-md\">\n {{ slide.label }}\n </a>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n\n \x3c!-- 🔹 Botones de navegación --\x3e\n @if(options().buttons === true) {\n <div class=\"swiper-button-prev\">\n <span class=\"aif aif-chevron-left-ico text-6xl\"></span>\n </div>\n <div class=\"swiper-button-next\">\n <span class=\"aif aif-chevron-right-ico text-6xl\"></span>\n </div>\n }\n\n\n @if(options().pagination === true) {\n <div class=\"swiper-pagination\"></div>\n }\n\n</div>\n}\n",styles:[":host .swiper-pagination{position:absolute;left:50%;bottom:1.35rem;z-index:20;display:inline-flex;width:auto;transform:translate(-50%);align-items:center;gap:.38rem;padding:0;background:transparent;box-shadow:none;border:0;-webkit-backdrop-filter:none;backdrop-filter:none}:host .swiper-pagination-bullet{margin:0;width:.42rem;height:.42rem;border-radius:999px;background:#38bdf859;opacity:1;transition:background-color .18s ease,transform .18s ease}:host .swiper-pagination-bullet-active{background:#38bdf8f2;transform:scale(1.05)}@media(max-width:768px){:host .swiper-pagination{bottom:.95rem;gap:.34rem}}\n"],dependencies:[{kind:"directive",type:NgStyle,selector:"[ngStyle]",inputs:["ngStyle"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:RouterLink,selector:"[routerLink]",inputs:["target","queryParams","fragment","queryParamsHandling","state","info","relativeTo","preserveFragment","skipLocationChange","replaceUrl","routerLink"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifSliderFull,decorators:[{type:Component,args:[{selector:"aif-slider-full",standalone:!0,imports:[NgStyle,NgClass,RouterLink],template:"@if (state(); as vm) {\n<div class=\"swiper\" [class]=\"options().class_container\" #swiperContainer>\n <div class=\"swiper-wrapper\" [class]=\"options().class_wrapper\">\n\n @for (slide of vm.items; track $index) {\n <div class=\"swiper-slide flex items-center justify-center duration-700 ease-in-out overflow-hidden\">\n\n \x3c!-- Imagen con efecto extendido tipo Techwind --\x3e\n <div class=\"image-wrap absolute inset-0\n -top-[350px] -bottom-[350px]\n -start-[100px] -end-[100px]\n min-w-full w-auto min-h-full h-auto\n overflow-hidden m-auto z-1\n bg-top bg-no-repeat bg-cover\" [ngStyle]=\"{\n 'background-image': 'url(' + slide.image + ')'\n }\">\n </div>\n\n \x3c!-- Overlay dinámico --\x3e\n <div class=\"absolute inset-0 z-2 bg-slate-900/70\" [ngClass]=\"{\n 'ltr:md:bg-gradient-to-r rtl:md:bg-gradient-to-l md:from-slate-900 md:via-slate-900/80 md:bg-slate-900/20':\n slide.gradient_direction === 'right',\n 'md:bg-gradient-to-b md:from-transparent md:to-slate-900 md:bg-slate-900/20':\n slide.gradient_direction === 'bottom',\n 'ltr:md:bg-gradient-to-l rtl:md:bg-gradient-to-r md:from-slate-900 md:via-slate-900/80 md:bg-slate-900/20':\n slide.gradient_direction === 'left'\n }\"></div>\n\n \x3c!-- Contenido --\x3e\n <div class=\"relative z-3 mx-auto h-full w-full max-w-7xl px-6 lg:px-8 flex items-center\" [ngClass]=\"{\n 'justify-center': slide.align === 'center',\n 'justify-start': slide.align === 'start',\n 'justify-end': slide.align === 'end'\n }\">\n\n <div class=\"grid grid-cols-1 mt-10 w-full\">\n <div [ngClass]=\"{\n 'text-center': slide.align === 'center',\n 'md:text-start text-center': slide.align === 'start',\n 'md:text-end text-center': slide.align === 'end'\n }\"\n class=\"w-full max-w-4xl\">\n <h1 class=\"font-bold text-white lg:leading-normal leading-normal text-4xl lg:text-5xl mb-6\">\n {{ slide.title }}\n </h1>\n\n <p class=\"text-white/70 text-lg max-w-xl\" [ngClass]=\"{\n 'mx-auto': slide.align === 'center',\n 'md:ms-auto': slide.align === 'end'\n }\">\n {{ slide.description }}\n </p>\n\n <div class=\"mt-8\">\n <a [routerLink]=\"slide.route\" class=\"py-2 px-5 inline-block font-semibold tracking-wide border align-middle duration-500\n text-base text-center bg-primary hover:bg-primary-700\n border-primary hover:border-primary-700 text-white rounded-md\">\n {{ slide.label }}\n </a>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n\n \x3c!-- 🔹 Botones de navegación --\x3e\n @if(options().buttons === true) {\n <div class=\"swiper-button-prev\">\n <span class=\"aif aif-chevron-left-ico text-6xl\"></span>\n </div>\n <div class=\"swiper-button-next\">\n <span class=\"aif aif-chevron-right-ico text-6xl\"></span>\n </div>\n }\n\n\n @if(options().pagination === true) {\n <div class=\"swiper-pagination\"></div>\n }\n\n</div>\n}\n",styles:[":host .swiper-pagination{position:absolute;left:50%;bottom:1.35rem;z-index:20;display:inline-flex;width:auto;transform:translate(-50%);align-items:center;gap:.38rem;padding:0;background:transparent;box-shadow:none;border:0;-webkit-backdrop-filter:none;backdrop-filter:none}:host .swiper-pagination-bullet{margin:0;width:.42rem;height:.42rem;border-radius:999px;background:#38bdf859;opacity:1;transition:background-color .18s ease,transform .18s ease}:host .swiper-pagination-bullet-active{background:#38bdf8f2;transform:scale(1.05)}@media(max-width:768px){:host .swiper-pagination{bottom:.95rem;gap:.34rem}}\n"]}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],swiperContainer:[{type:i0.ViewChild,args:["swiperContainer",{isSignal:!0}]}]}});class AifThemeSwitcher{config=input(null,...ngDevMode?[{debugName:"config"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);themeService=inject(AifThemeService);state=computed(()=>{const e=this.builtConfig()??this.config()??{};return{position:e.position??"right-center",class:e.class??"",trackClass:e.trackClass??"",thumbClass:e.thumbClass??"",ariaLabelLight:e.ariaLabelLight??"Activar tema oscuro",ariaLabelDark:e.ariaLabelDark??"Activar tema claro"}},...ngDevMode?[{debugName:"state"}]:[]);wrapperClass=computed(()=>`${{"right-center":"fixed top-[30%] -right-2 z-50","left-center":"fixed top-[30%] -left-2 z-50","right-bottom":"fixed bottom-6 right-4 z-50","left-bottom":"fixed bottom-6 left-4 z-50"}[this.state().position]} ${this.state().class}`.trim(),...ngDevMode?[{debugName:"wrapperClass"}]:[]);trackClass=computed(()=>`relative flex h-8 w-14 rotate-90 cursor-pointer items-center justify-between rounded-full bg-slate-900 p-1 shadow-sm dark:bg-white ${this.state().trackClass}`.trim(),...ngDevMode?[{debugName:"trackClass"}]:[]);thumbClass=computed(()=>`pointer-events-none absolute left-1 top-1 flex size-6 items-center justify-center rounded-full bg-white text-slate-900 shadow-sm transition-transform duration-200 dark:bg-slate-900 dark:text-yellow-400 ${this.themeService.isLight()?"translate-x-6":"translate-x-0"} ${this.state().thumbClass}`.trim(),...ngDevMode?[{debugName:"thumbClass"}]:[]);ariaLabel=computed(()=>this.themeService.isDark()?this.state().ariaLabelDark:this.state().ariaLabelLight,...ngDevMode?[{debugName:"ariaLabel"}]:[]);changeTheme(){this.themeService.toggle()}build(e){return this.builtConfig.set(e??null),this}reBuild(e){return this.builtConfig.set(null),this.build(e)}resetToInput(){return this.builtConfig.set(null),this}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeSwitcher,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifThemeSwitcher,isStandalone:!0,selector:"aif-theme-switcher",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div [class]="wrapperClass()">\n <button type="button" role="switch" [attr.aria-checked]="themeService.isLight()" [attr.aria-label]="ariaLabel()"\n [class]="trackClass()" (click)="changeTheme()">\n <svg class="-rotate-90 text-yellow-500" width="13" height="13" viewBox="0 0 20 20" fill="none"\n aria-hidden="true">\n <path\n d="M17.4547 11.97L18.1799 12.1611C18.265 11.8383 18.1265 11.4982 17.8401 11.3266C17.5538 11.1551 17.1885 11.1934 16.944 11.4207L17.4547 11.97ZM8.0306 2.5459L8.57989 3.05657C8.80718 2.81209 8.84554 2.44682 8.67398 2.16046C8.50243 1.8741 8.16227 1.73559 7.83948 1.82066L8.0306 2.5459ZM12.9154 13.0035C9.64678 13.0035 6.99707 10.3538 6.99707 7.08524H5.49707C5.49707 11.1823 8.81835 14.5035 12.9154 14.5035V13.0035ZM16.944 11.4207C15.8869 12.4035 14.4721 13.0035 12.9154 13.0035V14.5035C14.8657 14.5035 16.6418 13.7499 17.9654 12.5193L16.944 11.4207ZM16.7295 11.7789C15.9437 14.7607 13.2277 16.9586 10.0003 16.9586V18.4586C13.9257 18.4586 17.2249 15.7853 18.1799 12.1611L16.7295 11.7789ZM10.0003 16.9586C6.15734 16.9586 3.04199 13.8433 3.04199 10.0003H1.54199C1.54199 14.6717 5.32892 18.4586 10.0003 18.4586V16.9586ZM3.04199 10.0003C3.04199 6.77289 5.23988 4.05695 8.22173 3.27114L7.83948 1.82066C4.21532 2.77574 1.54199 6.07486 1.54199 10.0003H3.04199ZM6.99707 7.08524C6.99707 5.52854 7.5971 4.11366 8.57989 3.05657L7.48132 2.03522C6.25073 3.35885 5.49707 5.13487 5.49707 7.08524H6.99707Z"\n fill="currentColor" />\n </svg>\n\n <svg class="-rotate-90 text-yellow-500" width="13" height="13" viewBox="0 0 20 20" fill="none"\n aria-hidden="true">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M9.99998 1.5415C10.4142 1.5415 10.75 1.87729 10.75 2.2915V3.5415C10.75 3.95572 10.4142 4.2915 9.99998 4.2915C9.58577 4.2915 9.24998 3.95572 9.24998 3.5415V2.2915C9.24998 1.87729 9.58577 1.5415 9.99998 1.5415ZM10.0009 6.79327C8.22978 6.79327 6.79402 8.22904 6.79402 10.0001C6.79402 11.7712 8.22978 13.207 10.0009 13.207C11.772 13.207 13.2078 11.7712 13.2078 10.0001C13.2078 8.22904 11.772 6.79327 10.0009 6.79327ZM5.29402 10.0001C5.29402 7.40061 7.40135 5.29327 10.0009 5.29327C12.6004 5.29327 14.7078 7.40061 14.7078 10.0001C14.7078 12.5997 12.6004 14.707 10.0009 14.707C7.40135 14.707 5.29402 12.5997 5.29402 10.0001ZM15.9813 5.08035C16.2742 4.78746 16.2742 4.31258 15.9813 4.01969C15.6884 3.7268 15.2135 3.7268 14.9207 4.01969L14.0368 4.90357C13.7439 5.19647 13.7439 5.67134 14.0368 5.96423C14.3297 6.25713 14.8045 6.25713 15.0974 5.96423L15.9813 5.08035ZM18.4577 10.0001C18.4577 10.4143 18.1219 10.7501 17.7077 10.7501H16.4577C16.0435 10.7501 15.7077 10.4143 15.7077 10.0001C15.7077 9.58592 16.0435 9.25013 16.4577 9.25013H17.7077C18.1219 9.25013 18.4577 9.58592 18.4577 10.0001ZM14.9207 15.9806C15.2135 16.2735 15.6884 16.2735 15.9813 15.9806C16.2742 15.6877 16.2742 15.2128 15.9813 14.9199L15.0974 14.036C14.8045 13.7431 14.3297 13.7431 14.0368 14.036C13.7439 14.3289 13.7439 14.8038 14.0368 15.0967L14.9207 15.9806ZM9.99998 15.7088C10.4142 15.7088 10.75 16.0445 10.75 16.4588V17.7088C10.75 18.123 10.4142 18.4588 9.99998 18.4588C9.58577 18.4588 9.24998 18.123 9.24998 17.7088V16.4588C9.24998 16.0445 9.58577 15.7088 9.99998 15.7088ZM5.96356 15.0972C6.25646 14.8043 6.25646 14.3295 5.96356 14.0366C5.67067 13.7437 5.1958 13.7437 4.9029 14.0366L4.01902 14.9204C3.72613 15.2133 3.72613 15.6882 4.01902 15.9811C4.31191 16.274 4.78679 16.274 5.07968 15.9811L5.96356 15.0972ZM4.29224 10.0001C4.29224 10.4143 3.95645 10.7501 3.54224 10.7501H2.29224C1.87802 10.7501 1.54224 10.4143 1.54224 10.0001C1.54224 9.58592 1.87802 9.25013 2.29224 9.25013H3.54224C3.95645 9.25013 4.29224 9.58592 4.29224 10.0001ZM4.9029 5.9637C5.1958 6.25659 5.67067 6.25659 5.96356 5.9637C6.25646 5.6708 6.25646 5.19593 5.96356 4.90303L5.07968 4.01915C4.78679 3.72626 4.31191 3.72626 4.01902 4.01915C3.72613 4.31204 3.72613 4.78692 4.01902 5.07981L4.9029 5.9637Z"\n fill="currentColor" />\n </svg>\n\n <span [class]="thumbClass()"></span>\n </button>\n</div>\n',styles:[""]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifThemeSwitcher,decorators:[{type:Component,args:[{selector:"aif-theme-switcher",standalone:!0,imports:[],template:'<div [class]="wrapperClass()">\n <button type="button" role="switch" [attr.aria-checked]="themeService.isLight()" [attr.aria-label]="ariaLabel()"\n [class]="trackClass()" (click)="changeTheme()">\n <svg class="-rotate-90 text-yellow-500" width="13" height="13" viewBox="0 0 20 20" fill="none"\n aria-hidden="true">\n <path\n d="M17.4547 11.97L18.1799 12.1611C18.265 11.8383 18.1265 11.4982 17.8401 11.3266C17.5538 11.1551 17.1885 11.1934 16.944 11.4207L17.4547 11.97ZM8.0306 2.5459L8.57989 3.05657C8.80718 2.81209 8.84554 2.44682 8.67398 2.16046C8.50243 1.8741 8.16227 1.73559 7.83948 1.82066L8.0306 2.5459ZM12.9154 13.0035C9.64678 13.0035 6.99707 10.3538 6.99707 7.08524H5.49707C5.49707 11.1823 8.81835 14.5035 12.9154 14.5035V13.0035ZM16.944 11.4207C15.8869 12.4035 14.4721 13.0035 12.9154 13.0035V14.5035C14.8657 14.5035 16.6418 13.7499 17.9654 12.5193L16.944 11.4207ZM16.7295 11.7789C15.9437 14.7607 13.2277 16.9586 10.0003 16.9586V18.4586C13.9257 18.4586 17.2249 15.7853 18.1799 12.1611L16.7295 11.7789ZM10.0003 16.9586C6.15734 16.9586 3.04199 13.8433 3.04199 10.0003H1.54199C1.54199 14.6717 5.32892 18.4586 10.0003 18.4586V16.9586ZM3.04199 10.0003C3.04199 6.77289 5.23988 4.05695 8.22173 3.27114L7.83948 1.82066C4.21532 2.77574 1.54199 6.07486 1.54199 10.0003H3.04199ZM6.99707 7.08524C6.99707 5.52854 7.5971 4.11366 8.57989 3.05657L7.48132 2.03522C6.25073 3.35885 5.49707 5.13487 5.49707 7.08524H6.99707Z"\n fill="currentColor" />\n </svg>\n\n <svg class="-rotate-90 text-yellow-500" width="13" height="13" viewBox="0 0 20 20" fill="none"\n aria-hidden="true">\n <path fill-rule="evenodd" clip-rule="evenodd"\n d="M9.99998 1.5415C10.4142 1.5415 10.75 1.87729 10.75 2.2915V3.5415C10.75 3.95572 10.4142 4.2915 9.99998 4.2915C9.58577 4.2915 9.24998 3.95572 9.24998 3.5415V2.2915C9.24998 1.87729 9.58577 1.5415 9.99998 1.5415ZM10.0009 6.79327C8.22978 6.79327 6.79402 8.22904 6.79402 10.0001C6.79402 11.7712 8.22978 13.207 10.0009 13.207C11.772 13.207 13.2078 11.7712 13.2078 10.0001C13.2078 8.22904 11.772 6.79327 10.0009 6.79327ZM5.29402 10.0001C5.29402 7.40061 7.40135 5.29327 10.0009 5.29327C12.6004 5.29327 14.7078 7.40061 14.7078 10.0001C14.7078 12.5997 12.6004 14.707 10.0009 14.707C7.40135 14.707 5.29402 12.5997 5.29402 10.0001ZM15.9813 5.08035C16.2742 4.78746 16.2742 4.31258 15.9813 4.01969C15.6884 3.7268 15.2135 3.7268 14.9207 4.01969L14.0368 4.90357C13.7439 5.19647 13.7439 5.67134 14.0368 5.96423C14.3297 6.25713 14.8045 6.25713 15.0974 5.96423L15.9813 5.08035ZM18.4577 10.0001C18.4577 10.4143 18.1219 10.7501 17.7077 10.7501H16.4577C16.0435 10.7501 15.7077 10.4143 15.7077 10.0001C15.7077 9.58592 16.0435 9.25013 16.4577 9.25013H17.7077C18.1219 9.25013 18.4577 9.58592 18.4577 10.0001ZM14.9207 15.9806C15.2135 16.2735 15.6884 16.2735 15.9813 15.9806C16.2742 15.6877 16.2742 15.2128 15.9813 14.9199L15.0974 14.036C14.8045 13.7431 14.3297 13.7431 14.0368 14.036C13.7439 14.3289 13.7439 14.8038 14.0368 15.0967L14.9207 15.9806ZM9.99998 15.7088C10.4142 15.7088 10.75 16.0445 10.75 16.4588V17.7088C10.75 18.123 10.4142 18.4588 9.99998 18.4588C9.58577 18.4588 9.24998 18.123 9.24998 17.7088V16.4588C9.24998 16.0445 9.58577 15.7088 9.99998 15.7088ZM5.96356 15.0972C6.25646 14.8043 6.25646 14.3295 5.96356 14.0366C5.67067 13.7437 5.1958 13.7437 4.9029 14.0366L4.01902 14.9204C3.72613 15.2133 3.72613 15.6882 4.01902 15.9811C4.31191 16.274 4.78679 16.274 5.07968 15.9811L5.96356 15.0972ZM4.29224 10.0001C4.29224 10.4143 3.95645 10.7501 3.54224 10.7501H2.29224C1.87802 10.7501 1.54224 10.4143 1.54224 10.0001C1.54224 9.58592 1.87802 9.25013 2.29224 9.25013H3.54224C3.95645 9.25013 4.29224 9.58592 4.29224 10.0001ZM4.9029 5.9637C5.1958 6.25659 5.67067 6.25659 5.96356 5.9637C6.25646 5.6708 6.25646 5.19593 5.96356 4.90303L5.07968 4.01915C4.78679 3.72626 4.31191 3.72626 4.01902 4.01915C3.72613 4.31204 3.72613 4.78692 4.01902 5.07981L4.9029 5.9637Z"\n fill="currentColor" />\n </svg>\n\n <span [class]="thumbClass()"></span>\n </button>\n</div>\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifGoTop{destroyRef=inject(DestroyRef);circleRef=viewChild.required("progressCircle");strokeLength=signal(0,...ngDevMode?[{debugName:"strokeLength"}]:[]);rafId=null;offsetFromTop=450;isVisible=signal(!1,...ngDevMode?[{debugName:"isVisible"}]:[]);dashOffset=signal(0,...ngDevMode?[{debugName:"dashOffset"}]:[]);ngAfterViewInit(){const e=this.circleRef().nativeElement.getTotalLength();this.strokeLength.set(e),this.dashOffset.set(e);const t=()=>{null===this.rafId&&(this.rafId=requestAnimationFrame(()=>{this.rafId=null;const e=document.documentElement,t=e.scrollTop||document.body.scrollTop||0,n=e.scrollHeight-e.clientHeight||1,i=Math.max(0,Math.min(1,t/n)),a=this.strokeLength(),s=a-a*i;this.dashOffset.set(s),this.isVisible.set((window.scrollY||t)>this.offsetFromTop)}))};t(),window.addEventListener("scroll",t,{passive:!0}),this.destroyRef.onDestroy(()=>{window.removeEventListener("scroll",t),null!==this.rafId&&cancelAnimationFrame(this.rafId)})}scrollToTop(){window.scrollTo({top:0,behavior:"smooth"})}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGoTop,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.2.0",version:"21.1.1",type:AifGoTop,isStandalone:!0,selector:"aif-go-top",viewQueries:[{propertyName:"circleRef",first:!0,predicate:["progressCircle"],descendants:!0,isSignal:!0}],ngImport:i0,template:'<button type="button" aria-label="Scroll back to top" (click)="scrollToTop()" class="fixed bottom-6 right-6 z-50 h-12 w-12 rounded-full border border-slate-200/80 bg-white/85 text-slate-900 shadow-[0_10px_30px_rgba(15,23,42,0.18)] backdrop-blur-md\n transition-all duration-300 ease-out hover:-translate-y-0.5 hover:bg-white hover:shadow-[0_16px_40px_rgba(15,23,42,0.24)]\n dark:border-slate-700/80 dark:bg-slate-900/85 dark:text-slate-100 dark:shadow-[0_12px_30px_rgba(2,6,23,0.45)] dark:hover:bg-slate-900\n opacity-0 pointer-events-none translate-y-2"\n [class.opacity-100]="isVisible()"\n [class.pointer-events-auto]="isVisible()"\n [class.translate-y-0]="isVisible()"\n [class.opacity-0]="!isVisible()"\n [class.pointer-events-none]="!isVisible()"\n [class.translate-y-2]="!isVisible()">\n <span\n class="absolute inset-[3px] rounded-full bg-gradient-to-br from-sky-100 via-white to-cyan-50 dark:from-slate-800 dark:via-slate-900 dark:to-slate-800"></span>\n\n <svg class="absolute inset-0 h-full w-full -rotate-90" viewBox="0 0 40 40" fill="none">\n <circle cx="20" cy="20" r="19" stroke="currentColor" stroke-width="1.5"\n class="text-slate-300/80 dark:text-slate-700/90"></circle>\n <circle #progressCircle cx="20" cy="20" r="19" stroke="currentColor" stroke-width="2.25" stroke-linecap="round"\n class="text-sky-500 dark:text-cyan-400"\n [style.stroke-dasharray]="strokeLength()"\n [style.stroke-dashoffset]="dashOffset()"\n style="transition: stroke-dashoffset 80ms linear"></circle>\n </svg>\n\n <span class="relative flex h-full w-full items-center justify-center">\n <i class="aif aif-arrow-up-ico text-[15px]"></i>\n </span>\n</button>\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGoTop,decorators:[{type:Component,args:[{selector:"aif-go-top",template:'<button type="button" aria-label="Scroll back to top" (click)="scrollToTop()" class="fixed bottom-6 right-6 z-50 h-12 w-12 rounded-full border border-slate-200/80 bg-white/85 text-slate-900 shadow-[0_10px_30px_rgba(15,23,42,0.18)] backdrop-blur-md\n transition-all duration-300 ease-out hover:-translate-y-0.5 hover:bg-white hover:shadow-[0_16px_40px_rgba(15,23,42,0.24)]\n dark:border-slate-700/80 dark:bg-slate-900/85 dark:text-slate-100 dark:shadow-[0_12px_30px_rgba(2,6,23,0.45)] dark:hover:bg-slate-900\n opacity-0 pointer-events-none translate-y-2"\n [class.opacity-100]="isVisible()"\n [class.pointer-events-auto]="isVisible()"\n [class.translate-y-0]="isVisible()"\n [class.opacity-0]="!isVisible()"\n [class.pointer-events-none]="!isVisible()"\n [class.translate-y-2]="!isVisible()">\n <span\n class="absolute inset-[3px] rounded-full bg-gradient-to-br from-sky-100 via-white to-cyan-50 dark:from-slate-800 dark:via-slate-900 dark:to-slate-800"></span>\n\n <svg class="absolute inset-0 h-full w-full -rotate-90" viewBox="0 0 40 40" fill="none">\n <circle cx="20" cy="20" r="19" stroke="currentColor" stroke-width="1.5"\n class="text-slate-300/80 dark:text-slate-700/90"></circle>\n <circle #progressCircle cx="20" cy="20" r="19" stroke="currentColor" stroke-width="2.25" stroke-linecap="round"\n class="text-sky-500 dark:text-cyan-400"\n [style.stroke-dasharray]="strokeLength()"\n [style.stroke-dashoffset]="dashOffset()"\n style="transition: stroke-dashoffset 80ms linear"></circle>\n </svg>\n\n <span class="relative flex h-full w-full items-center justify-center">\n <i class="aif aif-arrow-up-ico text-[15px]"></i>\n </span>\n</button>\n'}]}],propDecorators:{circleRef:[{type:i0.ViewChild,args:["progressCircle",{isSignal:!0}]}]}});class AifAccordionBody{config=input({},...ngDevMode?[{debugName:"config"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);content=computed(()=>this.cfg()._content??this.config()?._content??"",...ngDevMode?[{debugName:"content"}]:[]);build(e={}){this.cfg.set(e||{})}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAccordionBody,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifAccordionBody,isStandalone:!0,selector:"aif-accordion-body",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'\n <div\n class="prose prose-sm max-w-none text-slate-700"\n [innerHTML]="content() | aifSafeHtml"\n ></div>\n ',isInline:!0,dependencies:[{kind:"pipe",type:AifSafeHtmlPipe,name:"aifSafeHtml"}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAccordionBody,decorators:[{type:Component,args:[{selector:"aif-accordion-body",standalone:!0,imports:[AifSafeHtmlPipe],template:'\n <div\n class="prose prose-sm max-w-none text-slate-700"\n [innerHTML]="content() | aifSafeHtml"\n ></div>\n '}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifAccordionDynamic{config=input({},...ngDevMode?[{debugName:"config"}]:[]);container=viewChild("container",{...ngDevMode?{debugName:"container"}:{},read:ViewContainerRef});state=signal({},...ngDevMode?[{debugName:"state"}]:[]);ready=signal(!1,...ngDevMode?[{debugName:"ready"}]:[]);injector=inject(Injector);renderId=0;currentComponentType=null;instance=null;constructor(){effect(()=>{this.state.set(this.config()??{}),this.render()})}ngAfterViewInit(){this.ready.set(!0),this.render()}async render(){if(!this.ready())return;const e=this.container();if(!e)return;const t=this.state(),n=t?.component;if(!n)return e.clear(),this.currentComponentType=null,void(this.instance=null);const i=++this.renderId;if(n===this.currentComponentType&&this.instance){if("function"==typeof this.instance.load&&(await this.instance.load(t),i!==this.renderId))return;return void this.instance.build?.(t)}e.clear();const a=e.createComponent(n,{injector:this.injector});this.instance=a.instance,this.currentComponentType=n,"function"==typeof this.instance.load&&(await this.instance.load(t),i!==this.renderId)||this.instance.build?.(t)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAccordionDynamic,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.2.0",version:"21.1.1",type:AifAccordionDynamic,isStandalone:!0,selector:"aif-accordion-dynamic",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"container",first:!0,predicate:["container"],descendants:!0,read:ViewContainerRef,isSignal:!0}],ngImport:i0,template:"<ng-template #container></ng-template>",isInline:!0})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAccordionDynamic,decorators:[{type:Component,args:[{selector:"aif-accordion-dynamic",standalone:!0,template:"<ng-template #container></ng-template>"}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],container:[{type:i0.ViewChild,args:["container",{read:ViewContainerRef,isSignal:!0}]}]}});let accordionInstanceId=0;class AifAccordion{onInit=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);title=signal("",...ngDevMode?[{debugName:"title"}]:[]);id=signal("",...ngDevMode?[{debugName:"id"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);current=-1;sts={};openIndexes=signal(new Set,...ngDevMode?[{debugName:"openIndexes"}]:[]);uid="aif-accordion-"+ ++accordionInstanceId;state=computed(()=>{const e=this.cfg();return e&&Object.keys(e).length>0?e:this.config()??{}},...ngDevMode?[{debugName:"state"}]:[]);closeOthers=computed(()=>!!this.state().close_others,...ngDevMode?[{debugName:"closeOthers"}]:[]);wrapperClass=computed(()=>this.state().class??"overflow-hidden rounded-xl border border-slate-200 dark:border-slate-700/60 bg-white shadow-sm dark:bg-transparent divide-y divide-slate-200 dark:divide-slate-700/80",...ngDevMode?[{debugName:"wrapperClass"}]:[]);items=computed(()=>{const e=this.state().items??[],t=this.openIndexes(),n=this.state().component??AifAccordionBody;return e.map((e,i)=>{const a=e.id||e.name||`${this.uid}-item-${i+1}`,s={...e.config??{},id:e.config?.id??e.id??e.name??a,_content:e.content??""};return{...e,index:i,trackId:`${a}-${i}`,itemId:a,buttonId:`${this.uid}-button-${i}`,panelId:`${this.uid}-panel-${i}`,isOpen:t.has(i),resolvedTitle:e.title||e.name||"",resolvedHtml:e.html||"",resolvedStatus:e.status||"",resolvedStatusHtml:e.status_html||"",dynamicConfig:{...s,component:e.component??n},itemClass:e.class??"relative overflow-hidden bg-white dark:bg-slate-900/40 transition-all duration-200",headerButtonClass:e.headerClass??"group flex w-full items-center gap-4 px-6 py-4.5 text-left transition-all hover:bg-slate-50 dark:hover:bg-slate-800/40 focus:outline-none focus:relative z-10",bodyWrapperClass:e.bodyClass??"border-t border-slate-100 dark:border-slate-800/60 bg-slate-50/30 dark:bg-slate-900/20 px-6 py-6 transition-all duration-300"}})},...ngDevMode?[{debugName:"items"}]:[]);constructor(){effect(()=>{const e=this.config();this.createFunctions(e),e&&0!==Object.keys(e).length&&(this.isBuilt()||this.build(e))})}ngAfterViewInit(){queueMicrotask(()=>this.onInit.emit())}reBuild(e={},t=null){this.isBuilt.set(!1),this.current=-1,this.sts={},this.openIndexes.set(new Set),this.title.set(""),this.id.set(""),this.cfg.set({}),this.build(e,t)}build(e={},t=null){if(this.isBuilt())return;const n=e||{};this.isBuilt.set(!0),this.cfg.set(n),this.createFunctions(n),this.applyInitialSelection(n,t)}selItem(e=0){this.openItem(e)}make_item(e,t=0){return{...e,config:{...e?.config??{},_content:e?.content??"",_index:t}}}itemCollapse(e,t=0){return!this.openIndexes().has(t)}onCollapse(e,t=0){e&&this.toggleItem(t)}loadBuild(e,t={}){e?.build?.(t)}loadComponent(e,t={},n=0){const i=this.state(),a=[...i.items??[]],s=a[n];s&&(a[n]={...s,component:e,config:{...s.config??{},...t??{}}},this.reBuild({...i,items:a},n))}makeItems(e={}){const t=[];if(e.modules&&e.cfg){const n=e.cfg,i=e.modules,a=e.request||{},s=e.component||null,o=e.prefix||"";for(let e=0;e<i.length;e++){const r=i[e];let l=r[2];a&&(n.request=!0,n.url=a[n.id]),l&&!obj_empty(l)&&(void 0!==l.url&&(n.url=l.url),void 0!==l.request&&(n.request=l.request),l=void 0!==l.component?l.component:s),t.push({html:format_title_html(r[1],format_zero(e+1,2)),name:r[1],component:l,config:{...n,id:o+r[0]}})}}return t}toggleItem(e){const t=this.items()[e];t&&!t.disabled&&(t.isOpen?this.closeItem(e):this.openItem(e))}createFunctions(e=this.config()){e&&(e.build=(e={},t=null)=>this.build(e,t),e.reBuild=(e={},t=null)=>this.reBuild(e,t),e.selItem=(e=0)=>this.selItem(e),e.makeItems=(e={})=>this.makeItems(e))}applyInitialSelection(e,t){const n=e?.items??[];if(!n.length)return void this.openIndexes.set(new Set);if(null!==t&&n[t])return void this.openItem(t);const i=n.map((e,t)=>({item:e,index:t})).filter(e=>!!e.item?.active||!!e.item?.open).map(e=>e.index);if(i.length>0)if(this.closeOthers())this.openItem(i[0]);else{const e=new Set(i);this.openIndexes.set(e),this.syncStatusFromOpenIndexes(),this.setCurrentFromOpenIndexes(i[i.length-1])}else this.openItem(0)}openItem(e){if(!(this.state().items??[])[e])return;const t=this.closeOthers()?new Set([e]):new Set(this.openIndexes());t.add(e),this.openIndexes.set(t),this.syncStatusFromOpenIndexes(),this.setCurrent(e)}closeItem(e){const t=new Set(this.openIndexes());if(t.delete(e),this.openIndexes.set(t),this.syncStatusFromOpenIndexes(),this.current!==e)return;const n=Array.from(t),i=n.length>0?n[n.length-1]:-1;i>=0?this.setCurrent(i):(this.current=-1,this.title.set(""),this.id.set(""))}syncStatusFromOpenIndexes(){const e={};for(const t of this.openIndexes())e[t]=!0;this.sts=e}setCurrent(e){const t=(this.state().items??[])[e];t&&(this.current=e,this.title.set(t.title||t.name||""),this.id.set(t.id||t.name||""))}setCurrentFromOpenIndexes(e){this.setCurrent(e)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAccordion,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifAccordion,isStandalone:!0,selector:"aif-accordion",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},ngImport:i0,template:'<div [class]="wrapperClass()">\n @for (item of items(); track item.trackId) {\n <section [class]="item.itemClass" [class.opacity-60]="item.disabled" \n [class.z-20]="item.isOpen"\n [class.bg-slate-50/80]="item.isOpen"\n [class.dark:bg-slate-800/40]="item.isOpen"\n class="[&:nth-child(even)]:bg-slate-50/30 dark:[&:nth-child(even)]:bg-white/[0.02] transition-colors duration-200">\n \n \x3c!-- Active Indicator --\x3e\n @if (item.isOpen) {\n <div class="absolute left-0 top-0 bottom-0 w-1 bg-primary-500 z-20"></div>\n }\n\n <h3 class="group/header">\n <button\n type="button"\n [class]="item.headerButtonClass"\n [attr.id]="item.buttonId"\n [attr.aria-controls]="item.panelId"\n [attr.aria-expanded]="item.isOpen"\n [disabled]="item.disabled"\n (click)="toggleItem(item.index)"\n >\n <div class="min-w-0 flex-1 flex items-center justify-between gap-4">\n \n \x3c!-- Title Content --\x3e\n <div class="min-w-0 flex-1 text-[15px] font-medium text-slate-700 dark:text-slate-200 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">\n @if (item.resolvedHtml) {\n <div [innerHTML]="item.resolvedHtml | aifSafeHtml"></div>\n } @else {\n <span>{{ item.resolvedTitle }}</span>\n }\n </div>\n\n \x3c!-- Status & Chevron Area --\x3e\n <div class="flex items-center gap-4 shrink-0">\n @if (item.resolvedStatus || item.resolvedStatusHtml) {\n <div class="text-xs">\n @if (item.resolvedStatusHtml) {\n <div [innerHTML]="item.resolvedStatusHtml | aifSafeHtml"></div>\n } @else {\n <span class="inline-flex items-center rounded-full bg-slate-100 px-2 py-0.5 font-medium text-slate-600 dark:bg-slate-800 dark:text-slate-400">\n {{ item.resolvedStatus }}\n </span>\n }\n </div>\n }\n\n \x3c!-- Simple Chevron --\x3e\n <div\n class="text-slate-400 group-hover:text-slate-600 dark:group-hover:text-slate-200 transition-all duration-300"\n [class.rotate-180]="item.isOpen"\n [class.text-primary-500]="item.isOpen"\n >\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd" d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z" clip-rule="evenodd" />\n </svg>\n </div>\n </div>\n </div>\n </button>\n </h3>\n\n @if (item.isOpen) {\n <div\n [attr.id]="item.panelId"\n [attr.aria-labelledby]="item.buttonId"\n role="region"\n [class]="item.bodyWrapperClass"\n >\n <aif-accordion-dynamic [config]="item.dynamicConfig"></aif-accordion-dynamic>\n </div>\n }\n </section>\n }\n</div>\n',styles:[".rotate-180{transform:rotate(180deg)}\n"],dependencies:[{kind:"component",type:AifAccordionDynamic,selector:"aif-accordion-dynamic",inputs:["config"]},{kind:"pipe",type:AifSafeHtmlPipe,name:"aifSafeHtml"}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAccordion,decorators:[{type:Component,args:[{selector:"aif-accordion",standalone:!0,imports:[AifSafeHtmlPipe,AifAccordionDynamic],template:'<div [class]="wrapperClass()">\n @for (item of items(); track item.trackId) {\n <section [class]="item.itemClass" [class.opacity-60]="item.disabled" \n [class.z-20]="item.isOpen"\n [class.bg-slate-50/80]="item.isOpen"\n [class.dark:bg-slate-800/40]="item.isOpen"\n class="[&:nth-child(even)]:bg-slate-50/30 dark:[&:nth-child(even)]:bg-white/[0.02] transition-colors duration-200">\n \n \x3c!-- Active Indicator --\x3e\n @if (item.isOpen) {\n <div class="absolute left-0 top-0 bottom-0 w-1 bg-primary-500 z-20"></div>\n }\n\n <h3 class="group/header">\n <button\n type="button"\n [class]="item.headerButtonClass"\n [attr.id]="item.buttonId"\n [attr.aria-controls]="item.panelId"\n [attr.aria-expanded]="item.isOpen"\n [disabled]="item.disabled"\n (click)="toggleItem(item.index)"\n >\n <div class="min-w-0 flex-1 flex items-center justify-between gap-4">\n \n \x3c!-- Title Content --\x3e\n <div class="min-w-0 flex-1 text-[15px] font-medium text-slate-700 dark:text-slate-200 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">\n @if (item.resolvedHtml) {\n <div [innerHTML]="item.resolvedHtml | aifSafeHtml"></div>\n } @else {\n <span>{{ item.resolvedTitle }}</span>\n }\n </div>\n\n \x3c!-- Status & Chevron Area --\x3e\n <div class="flex items-center gap-4 shrink-0">\n @if (item.resolvedStatus || item.resolvedStatusHtml) {\n <div class="text-xs">\n @if (item.resolvedStatusHtml) {\n <div [innerHTML]="item.resolvedStatusHtml | aifSafeHtml"></div>\n } @else {\n <span class="inline-flex items-center rounded-full bg-slate-100 px-2 py-0.5 font-medium text-slate-600 dark:bg-slate-800 dark:text-slate-400">\n {{ item.resolvedStatus }}\n </span>\n }\n </div>\n }\n\n \x3c!-- Simple Chevron --\x3e\n <div\n class="text-slate-400 group-hover:text-slate-600 dark:group-hover:text-slate-200 transition-all duration-300"\n [class.rotate-180]="item.isOpen"\n [class.text-primary-500]="item.isOpen"\n >\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd" d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z" clip-rule="evenodd" />\n </svg>\n </div>\n </div>\n </div>\n </button>\n </h3>\n\n @if (item.isOpen) {\n <div\n [attr.id]="item.panelId"\n [attr.aria-labelledby]="item.buttonId"\n role="region"\n [class]="item.bodyWrapperClass"\n >\n <aif-accordion-dynamic [config]="item.dynamicConfig"></aif-accordion-dynamic>\n </div>\n }\n </section>\n }\n</div>\n',styles:[".rotate-180{transform:rotate(180deg)}\n"]}]}],ctorParameters:()=>[],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifCreate{onInit=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);container=viewChild("container",{...ngDevMode?{debugName:"container"}:{},read:ViewContainerRef});cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);type=computed(()=>this.cfg().component,...ngDevMode?[{debugName:"type"}]:[]);viewReady=!1;injector=inject(Injector);constructor(){effect(()=>this.syncConfig(this.config()))}ngAfterViewInit(){this.viewReady=!0,this.onInit.emit(),this.hasConfig(this.cfg())&&this.load()}reBuild(e){this.syncConfig({...e,rebuilt:!0})}build(e){this.syncConfig(e)}load(){const e=this.container();if(!e)return;const t=this.type();if(e.clear(),!t)return;const n=e.createComponent(t,{injector:this.injector}).instance;n.build?.(this.cfg())}syncConfig(e){this.hasConfig(e)&&(this.cfg.set(e),this.viewReady&&this.load())}hasConfig(e){return!!e&&Object.keys(e).length>0}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifCreate,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.2.0",version:"21.1.1",type:AifCreate,isStandalone:!0,selector:"aif-create",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},viewQueries:[{propertyName:"container",first:!0,predicate:["container"],descendants:!0,read:ViewContainerRef,isSignal:!0}],ngImport:i0,template:"<ng-template #container></ng-template>",isInline:!0})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifCreate,decorators:[{type:Component,args:[{selector:"aif-create",standalone:!0,template:"<ng-template #container></ng-template>"}]}],ctorParameters:()=>[],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],container:[{type:i0.ViewChild,args:["container",{read:ViewContainerRef,isSignal:!0}]}]}});class AifEmbed{config=input({},...ngDevMode?[{debugName:"config"}]:[]);loaded=output();failed=output();cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);iframeRef=viewChild("embedFrame",...ngDevMode?[{debugName:"iframeRef"}]:[]);isLoading=signal(!1,...ngDevMode?[{debugName:"isLoading"}]:[]);isLoaded=signal(!1,...ngDevMode?[{debugName:"isLoaded"}]:[]);hasError=signal(!1,...ngDevMode?[{debugName:"hasError"}]:[]);pendingBuildPromise=null;resolveBuildPromise=null;rejectBuildPromise=null;lastLoadKey="";state=computed(()=>{const e=this.cfg();return Object.keys(e).length?e:this.config()},...ngDevMode?[{debugName:"state"}]:[]);url=computed(()=>this.state().url??"",...ngDevMode?[{debugName:"url"}]:[]);html=computed(()=>this.state().html??"",...ngDevMode?[{debugName:"html"}]:[]);width=computed(()=>this.state().width??"100%",...ngDevMode?[{debugName:"width"}]:[]);height=computed(()=>this.state().height??600,...ngDevMode?[{debugName:"height"}]:[]);title=computed(()=>this.state().title??"Embedded content",...ngDevMode?[{debugName:"title"}]:[]);allow=computed(()=>this.state().allow??"",...ngDevMode?[{debugName:"allow"}]:[]);sandbox=computed(()=>this.state().sandbox??"",...ngDevMode?[{debugName:"sandbox"}]:[]);scrolling=computed(()=>this.state().scrolling??"no",...ngDevMode?[{debugName:"scrolling"}]:[]);showToolbar=computed(()=>this.state().showToolbar??!0,...ngDevMode?[{debugName:"showToolbar"}]:[]);showOpen=computed(()=>this.state().showOpen??!0,...ngDevMode?[{debugName:"showOpen"}]:[]);showDownload=computed(()=>this.state().showDownload??!0,...ngDevMode?[{debugName:"showDownload"}]:[]);textOpen=computed(()=>this.state().textOpen??"Abrir",...ngDevMode?[{debugName:"textOpen"}]:[]);textDownload=computed(()=>this.state().textDownload??"Descargar",...ngDevMode?[{debugName:"textDownload"}]:[]);textEmpty=computed(()=>this.state().textEmpty??"Sin contenido para mostrar.",...ngDevMode?[{debugName:"textEmpty"}]:[]);downloadName=computed(()=>this.state().downloadName??"documento.pdf",...ngDevMode?[{debugName:"downloadName"}]:[]);wrapperClass=computed(()=>this.state().class??"",...ngDevMode?[{debugName:"wrapperClass"}]:[]);type=computed(()=>{const e=this.state().type;return e||(this.html()?"html":"iframe")},...ngDevMode?[{debugName:"type"}]:[]);source=computed(()=>Object.keys(this.cfg()).length?"build":"input",...ngDevMode?[{debugName:"source"}]:[]);constructor(){effect(()=>{const e=this.iframeRef()?.nativeElement,t=this.allow();e&&(t?e.setAttribute("allow",t):e.removeAttribute("allow"))}),effect(()=>{const e=JSON.stringify({type:this.type(),url:this.url(),html:this.html(),source:this.source()});e!==this.lastLoadKey&&(this.lastLoadKey=e,this.trackLoadCycle())})}build(e={},t=null){return this.isBuilt()||(this.isBuilt.set(!0),this.createBuildPromise(),this.cfg.set(e),t&&t.open(()=>this.reset())),this.whenLoaded()}reBuild(e={},t=null){return this.reset(),this.build(e,t)}reset(){this.isBuilt.set(!1),this.cfg.set({}),this.isLoading.set(!1),this.isLoaded.set(!1),this.hasError.set(!1),this.lastLoadKey="",this.pendingBuildPromise=null,this.resolveBuildPromise=null,this.rejectBuildPromise=null}whenLoaded(){return this.isLoaded()?Promise.resolve(this.makeLoadedEvent()):(this.pendingBuildPromise||this.createBuildPromise(),this.pendingBuildPromise)}openNewTab(){const e=this.url();e&&window.open(e,"_blank","noopener,noreferrer")}download(){const e=this.url();if(!e)return;const t=document.createElement("a");t.href=e,t.download=this.downloadName(),t.rel="noopener",document.body.appendChild(t),t.click(),t.remove()}onFrameLoad(){this.completeLoad()}onFrameError(e){this.failLoad(e)}createBuildPromise(){this.pendingBuildPromise=new Promise((e,t)=>{this.resolveBuildPromise=e,this.rejectBuildPromise=t})}trackLoadCycle(){const e=this.url(),t=this.html();if(this.hasError.set(!1),!e&&!t)return this.isLoading.set(!1),void this.isLoaded.set(!1);this.isLoading.set(!0),this.isLoaded.set(!1),"html"===this.type()&&t&&queueMicrotask(()=>this.completeLoad())}completeLoad(){const e=this.makeLoadedEvent();this.isLoading.set(!1),this.isLoaded.set(!0),this.hasError.set(!1),this.loaded.emit(e),this.resolveBuildPromise&&(this.resolveBuildPromise(e),this.resolveBuildPromise=null,this.rejectBuildPromise=null,this.pendingBuildPromise=Promise.resolve(e))}failLoad(e){const t={...this.makeLoadedEvent(),error:e};this.isLoading.set(!1),this.isLoaded.set(!1),this.hasError.set(!0),this.failed.emit(t),this.rejectBuildPromise&&(this.rejectBuildPromise(t),this.resolveBuildPromise=null,this.rejectBuildPromise=null,this.pendingBuildPromise=null)}makeLoadedEvent(){return{type:this.type(),source:this.source(),url:this.url()||void 0,html:this.html()||void 0}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifEmbed,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifEmbed,isStandalone:!0,selector:"aif-embed",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{loaded:"loaded",failed:"failed"},viewQueries:[{propertyName:"iframeRef",first:!0,predicate:["embedFrame"],descendants:!0,isSignal:!0}],ngImport:i0,template:'<div class="w-full" [class]="wrapperClass()">\n @if (showToolbar() && url()) {\n <div class="mb-2 flex items-center justify-end gap-2">\n @if (showOpen()) {\n <button type="button" (click)="openNewTab()" class="inline-flex items-center rounded-md border border-black/10 bg-white px-3 py-1.5 text-sm text-slate-700\n hover:bg-black/5 focus:outline-none focus-visible:ring-2 focus-visible:ring-black/20 dark:border-white/10 dark:bg-slate-900 dark:text-slate-100 dark:hover:bg-slate-800">\n {{ textOpen() }}\n </button>\n }\n\n @if (showDownload()) {\n <button type="button" (click)="download()" class="inline-flex items-center rounded-md border border-black/10 bg-white px-3 py-1.5 text-sm text-slate-700\n hover:bg-black/5 focus:outline-none focus-visible:ring-2 focus-visible:ring-black/20 dark:border-white/10 dark:bg-slate-900 dark:text-slate-100 dark:hover:bg-slate-800">\n {{ textDownload() }}\n </button>\n }\n </div>\n }\n\n @if (url() && (type() === \'iframe\' || type() === \'pdf\')) {\n <div class="w-full overflow-hidden rounded-lg border border-black/10 bg-white">\n <iframe #embedFrame [src]="url() | safeUrl" [attr.title]="title()" [attr.width]="width()" [attr.height]="height()"\n [attr.sandbox]="sandbox() || null" [attr.scrolling]="scrolling()"\n frameborder="0" class="block w-full" (load)="onFrameLoad()" (error)="onFrameError($event)"></iframe>\n </div>\n }\n\n @if (html()) {\n <div class="prose max-w-none">\n <div [innerHTML]="html()"></div>\n </div>\n }\n\n @if (!url() && !html()) {\n <div class="rounded-lg border border-dashed border-black/15 p-6 text-sm text-black/60">\n {{ textEmpty() }}\n </div>\n }\n</div>\n',dependencies:[{kind:"pipe",type:AifSafeUrlPipe,name:"safeUrl"}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifEmbed,decorators:[{type:Component,args:[{selector:"aif-embed",standalone:!0,imports:[AifSafeUrlPipe],template:'<div class="w-full" [class]="wrapperClass()">\n @if (showToolbar() && url()) {\n <div class="mb-2 flex items-center justify-end gap-2">\n @if (showOpen()) {\n <button type="button" (click)="openNewTab()" class="inline-flex items-center rounded-md border border-black/10 bg-white px-3 py-1.5 text-sm text-slate-700\n hover:bg-black/5 focus:outline-none focus-visible:ring-2 focus-visible:ring-black/20 dark:border-white/10 dark:bg-slate-900 dark:text-slate-100 dark:hover:bg-slate-800">\n {{ textOpen() }}\n </button>\n }\n\n @if (showDownload()) {\n <button type="button" (click)="download()" class="inline-flex items-center rounded-md border border-black/10 bg-white px-3 py-1.5 text-sm text-slate-700\n hover:bg-black/5 focus:outline-none focus-visible:ring-2 focus-visible:ring-black/20 dark:border-white/10 dark:bg-slate-900 dark:text-slate-100 dark:hover:bg-slate-800">\n {{ textDownload() }}\n </button>\n }\n </div>\n }\n\n @if (url() && (type() === \'iframe\' || type() === \'pdf\')) {\n <div class="w-full overflow-hidden rounded-lg border border-black/10 bg-white">\n <iframe #embedFrame [src]="url() | safeUrl" [attr.title]="title()" [attr.width]="width()" [attr.height]="height()"\n [attr.sandbox]="sandbox() || null" [attr.scrolling]="scrolling()"\n frameborder="0" class="block w-full" (load)="onFrameLoad()" (error)="onFrameError($event)"></iframe>\n </div>\n }\n\n @if (html()) {\n <div class="prose max-w-none">\n <div [innerHTML]="html()"></div>\n </div>\n }\n\n @if (!url() && !html()) {\n <div class="rounded-lg border border-dashed border-black/15 p-6 text-sm text-black/60">\n {{ textEmpty() }}\n </div>\n }\n</div>\n'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],loaded:[{type:i0.Output,args:["loaded"]}],failed:[{type:i0.Output,args:["failed"]}],iframeRef:[{type:i0.ViewChild,args:["embedFrame",{isSignal:!0}]}]}});class AifTableBase{config=input({},...ngDevMode?[{debugName:"config"}]:[]);header=computed(()=>this.config()?.header||{},...ngDevMode?[{debugName:"header"}]:[]);columns=computed(()=>this.config()?.columns||[],...ngDevMode?[{debugName:"columns"}]:[]);fields=computed(()=>this.config()?.fields||[],...ngDevMode?[{debugName:"fields"}]:[]);data=computed(()=>this.config()?.data||[],...ngDevMode?[{debugName:"data"}]:[]);footer=computed(()=>this.config()?.footer||{},...ngDevMode?[{debugName:"footer"}]:[]);readonly=computed(()=>!!this.config()?.readonly,...ngDevMode?[{debugName:"readonly"}]:[]);disabled=computed(()=>!!this.config()?.disabled,...ngDevMode?[{debugName:"disabled"}]:[]);showSelection=computed(()=>!!this.config()?.showSelection,...ngDevMode?[{debugName:"showSelection"}]:[]);selectionType=computed(()=>this.config()?.selectionType||"checkbox",...ngDevMode?[{debugName:"selectionType"}]:[]);showActions=computed(()=>!!this.config()?.showActions&&!this.readonly(),...ngDevMode?[{debugName:"showActions"}]:[]);noResultsLabel=computed(()=>this.config()?.noResultsLabel||"Sin resultados",...ngDevMode?[{debugName:"noResultsLabel"}]:[]);selectedRows=computed(()=>this.config()?.selectedRows||new Set,...ngDevMode?[{debugName:"selectedRows"}]:[]);onRowClickHandler=computed(()=>this.config()?.onRowClick,...ngDevMode?[{debugName:"onRowClickHandler"}]:[]);onCellClickHandler=computed(()=>this.config()?.onCellClick,...ngDevMode?[{debugName:"onCellClickHandler"}]:[]);onToggleSelectionHandler=computed(()=>this.config()?.onToggleSelection,...ngDevMode?[{debugName:"onToggleSelectionHandler"}]:[]);onActionHandler=computed(()=>this.config()?.onAction,...ngDevMode?[{debugName:"onActionHandler"}]:[]);getRowIdHandler=computed(()=>this.config()?.getRowId,...ngDevMode?[{debugName:"getRowIdHandler"}]:[]);getCellValueHandler=computed(()=>this.config()?.getCellValue,...ngDevMode?[{debugName:"getCellValueHandler"}]:[]);interactive=computed(()=>!this.readonly()&&!this.disabled(),...ngDevMode?[{debugName:"interactive"}]:[]);colspan=computed(()=>{let e=0;return this.showSelection()&&e++,this.showActions()&&e++,this.columns().length+e},...ngDevMode?[{debugName:"colspan"}]:[]);isRadio=computed(()=>"radio"===this.selectionType(),...ngDevMode?[{debugName:"isRadio"}]:[]);viewRows=computed(()=>{const e=this.data()||[],t=this.fields()||[],n=this.selectedRows(),i=this.getRowIdHandler(),a=this.getCellValueHandler(),s=this.interactive(),o=!!this.onRowClickHandler(),r=!!this.onCellClickHandler();return e.map((e,l)=>{const d="function"==typeof i?i(e):e?.id,c=`${null==d||""===d?"row":`${d}`}-${l}`,g=n.has(d),m=t.map((t,n)=>{const i=!!t&&"object"==typeof t&&["edit","delete","action"].includes(t.type),o="function"==typeof a?a(t,e,n):"";let l="text-slate-500 hover:text-slate-700 dark:text-slate-300 dark:hover:text-slate-100";return t?.class?l=t.class:"red"===t?.color?l="text-rose-500 hover:text-rose-600 dark:text-rose-400 dark:hover:text-rose-300":"blue"===t?.color&&(l="text-sky-500 hover:text-sky-600 dark:text-sky-400 dark:hover:text-sky-300"),{field:t,cellIndex:n,isAction:i,value:o,isHtml:!!o&&"object"==typeof o&&"string"==typeof o.html,actionTitle:t?.title||t?.label||"",actionClass:l,interactiveCell:s&&r&&!i}});return{row:e,rowIndex:l,rowId:d,trackId:c,isSelected:g,interactiveRow:s&&(this.showSelection()||o),cells:m}})},...ngDevMode?[{debugName:"viewRows"}]:[]);onRowClick(e,t,n){if(!this.interactive())return;const i=this.onRowClickHandler();"function"==typeof i&&i(e,t,n)}onCellClick(e,t,n,i){if(!this.interactive())return;const a=this.onCellClickHandler();"function"==typeof a&&a(e,t,n,i)}onToggleSelection(e,t){if(!this.interactive())return;const n=this.onToggleSelectionHandler();"function"==typeof n&&n(e,t)}onAction(e,t,n){if(!this.interactive())return;const i=this.onActionHandler();"function"==typeof i&&i(e,t,n)}onFieldAction(e,t,n,i){i?.stopPropagation(),this.onAction(e?.type||"action",t,n)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifTableBase,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifTableBase,isStandalone:!0,selector:"aif-table-base",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (header()?.table_title) {\n <div class="mb-4">\n <h5 class="text-base font-semibold text-slate-800 dark:text-slate-100">\n {{ header().table_title }}\n </h5>\n </div>\n}\n\n<div\n class="overflow-hidden rounded-lg border border-slate-200 dark:border-slate-700/60 bg-white dark:bg-slate-900"\n [class.opacity-70]="!interactive()"\n>\n <div class="overflow-x-auto">\n <table class="min-w-full divide-y divide-slate-200 dark:divide-slate-700/60">\n <thead class="bg-slate-100/80 dark:bg-slate-800 text-slate-900 dark:text-white">\n <tr>\n @if (showSelection()) {\n <th class="w-10 px-4 py-3 text-left text-xs font-semibold uppercase tracking-wider"></th>\n }\n @for (column of columns(); track \'col-\' + $index) {\n <th class="px-4 py-3 text-left text-xs font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-300">\n {{ column }}\n </th>\n }\n @if (showActions()) {\n <th class="w-12 px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-300">\n <i class="aif aif-dots-horizontal-ico"></i>\n </th>\n }\n </tr>\n </thead>\n <tbody class="divide-y divide-slate-200 dark:divide-slate-700/50 bg-white dark:bg-slate-900">\n @for (item of viewRows(); track \'row-\' + $index) {\n <tr\n class="transition-colors duration-150"\n [class.cursor-pointer]="item.interactiveRow"\n [class.bg-primary-50]="item.isSelected"\n [class.dark:bg-primary-900/10]="item.isSelected"\n [class.hover:bg-slate-50]="interactive() && !item.isSelected"\n [class.dark:hover:bg-slate-800/50]="interactive() && !item.isSelected"\n [class.bg-slate-50/70]="!item.isSelected && item.rowIndex % 2 !== 0"\n [class.dark:bg-slate-800/20]="!item.isSelected && item.rowIndex % 2 !== 0"\n (click)="onRowClick(item.row, item.rowIndex, $event)"\n >\n @if (showSelection()) {\n <td class="w-10 px-4 py-3 text-right">\n @if (isRadio()) {\n <input\n type="radio"\n class="h-4 w-4 border-slate-300 text-indigo-600 focus:ring-indigo-500 dark:border-slate-600 dark:bg-slate-700"\n [checked]="item.isSelected"\n [value]="item.rowId"\n [disabled]="!interactive()"\n (click)="onToggleSelection(item.row, $event); $event.stopPropagation()"\n />\n } @else {\n <input\n type="checkbox"\n class="h-4 w-4 rounded border-slate-300 text-indigo-600 focus:ring-indigo-500 dark:border-slate-600 dark:bg-slate-700"\n [checked]="item.isSelected"\n [value]="item.rowId"\n [disabled]="!interactive()"\n (click)="onToggleSelection(item.row, $event); $event.stopPropagation()"\n />\n }\n </td>\n }\n @for (cell of item.cells; track \'cell-\' + $index) {\n <td\n class="px-4 py-3 text-sm text-slate-700 dark:text-slate-300"\n [class.cursor-pointer]="cell.interactiveCell"\n [class.w-12]="cell.isAction"\n [class.text-center]="cell.isAction"\n (click)="cell.isAction ? null : onCellClick(cell.field, item.row, item.rowIndex, cell.cellIndex)"\n >\n @if (cell.isAction) {\n <button\n type="button"\n class="inline-flex items-center justify-center"\n [class]="cell.actionClass"\n [title]="cell.actionTitle"\n [disabled]="!interactive()"\n (click)="onFieldAction(cell.field, item.row, item.rowIndex, $event)"\n >\n @if (cell.field.icon) {\n <i [class]="cell.field.icon"></i>\n } @else {\n {{ cell.field.label || cell.field.type }}\n }\n </button>\n } @else {\n @if (cell.isHtml) {\n <div [innerHTML]="cell.value.html"></div>\n } @else {\n {{ cell.value }}\n }\n }\n </td>\n }\n @if (showActions()) {\n <td class="px-4 py-3 text-right text-sm">\n <button\n type="button"\n class="inline-flex items-center text-rose-500 hover:text-rose-600 dark:text-rose-400 dark:hover:text-rose-300"\n title="Quitar"\n [disabled]="!interactive()"\n (click)="onAction(\'del\', item.row, item.rowIndex); $event.stopPropagation()"\n >\n <svg\n class="w-5 h-5"\n fill="none"\n stroke="currentColor"\n viewBox="0 0 24 24"\n xmlns="http://www.w3.org/2000/svg"\n >\n <path\n stroke-linecap="round"\n stroke-linejoin="round"\n stroke-width="2"\n d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"\n ></path>\n </svg>\n </button>\n </td>\n }\n </tr>\n }\n\n @if (data().length === 0) {\n <tr>\n <td [attr.colspan]="colspan()" class="px-4 py-4 text-center text-sm text-slate-500 dark:text-slate-400">\n {{ noResultsLabel() }}\n </td>\n </tr>\n }\n\n @if (footer().tbody && data().length > 0) {\n <tr>\n <td [attr.colspan]="colspan()" class="px-4 py-4 text-sm text-slate-700 dark:text-slate-300" [style]="footer().tbody?.style">\n {{ footer().tbody?.content || \'\' }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n</div>\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifTableBase,decorators:[{type:Component,args:[{selector:"aif-table-base",standalone:!0,imports:[],template:'@if (header()?.table_title) {\n <div class="mb-4">\n <h5 class="text-base font-semibold text-slate-800 dark:text-slate-100">\n {{ header().table_title }}\n </h5>\n </div>\n}\n\n<div\n class="overflow-hidden rounded-lg border border-slate-200 dark:border-slate-700/60 bg-white dark:bg-slate-900"\n [class.opacity-70]="!interactive()"\n>\n <div class="overflow-x-auto">\n <table class="min-w-full divide-y divide-slate-200 dark:divide-slate-700/60">\n <thead class="bg-slate-100/80 dark:bg-slate-800 text-slate-900 dark:text-white">\n <tr>\n @if (showSelection()) {\n <th class="w-10 px-4 py-3 text-left text-xs font-semibold uppercase tracking-wider"></th>\n }\n @for (column of columns(); track \'col-\' + $index) {\n <th class="px-4 py-3 text-left text-xs font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-300">\n {{ column }}\n </th>\n }\n @if (showActions()) {\n <th class="w-12 px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-300">\n <i class="aif aif-dots-horizontal-ico"></i>\n </th>\n }\n </tr>\n </thead>\n <tbody class="divide-y divide-slate-200 dark:divide-slate-700/50 bg-white dark:bg-slate-900">\n @for (item of viewRows(); track \'row-\' + $index) {\n <tr\n class="transition-colors duration-150"\n [class.cursor-pointer]="item.interactiveRow"\n [class.bg-primary-50]="item.isSelected"\n [class.dark:bg-primary-900/10]="item.isSelected"\n [class.hover:bg-slate-50]="interactive() && !item.isSelected"\n [class.dark:hover:bg-slate-800/50]="interactive() && !item.isSelected"\n [class.bg-slate-50/70]="!item.isSelected && item.rowIndex % 2 !== 0"\n [class.dark:bg-slate-800/20]="!item.isSelected && item.rowIndex % 2 !== 0"\n (click)="onRowClick(item.row, item.rowIndex, $event)"\n >\n @if (showSelection()) {\n <td class="w-10 px-4 py-3 text-right">\n @if (isRadio()) {\n <input\n type="radio"\n class="h-4 w-4 border-slate-300 text-indigo-600 focus:ring-indigo-500 dark:border-slate-600 dark:bg-slate-700"\n [checked]="item.isSelected"\n [value]="item.rowId"\n [disabled]="!interactive()"\n (click)="onToggleSelection(item.row, $event); $event.stopPropagation()"\n />\n } @else {\n <input\n type="checkbox"\n class="h-4 w-4 rounded border-slate-300 text-indigo-600 focus:ring-indigo-500 dark:border-slate-600 dark:bg-slate-700"\n [checked]="item.isSelected"\n [value]="item.rowId"\n [disabled]="!interactive()"\n (click)="onToggleSelection(item.row, $event); $event.stopPropagation()"\n />\n }\n </td>\n }\n @for (cell of item.cells; track \'cell-\' + $index) {\n <td\n class="px-4 py-3 text-sm text-slate-700 dark:text-slate-300"\n [class.cursor-pointer]="cell.interactiveCell"\n [class.w-12]="cell.isAction"\n [class.text-center]="cell.isAction"\n (click)="cell.isAction ? null : onCellClick(cell.field, item.row, item.rowIndex, cell.cellIndex)"\n >\n @if (cell.isAction) {\n <button\n type="button"\n class="inline-flex items-center justify-center"\n [class]="cell.actionClass"\n [title]="cell.actionTitle"\n [disabled]="!interactive()"\n (click)="onFieldAction(cell.field, item.row, item.rowIndex, $event)"\n >\n @if (cell.field.icon) {\n <i [class]="cell.field.icon"></i>\n } @else {\n {{ cell.field.label || cell.field.type }}\n }\n </button>\n } @else {\n @if (cell.isHtml) {\n <div [innerHTML]="cell.value.html"></div>\n } @else {\n {{ cell.value }}\n }\n }\n </td>\n }\n @if (showActions()) {\n <td class="px-4 py-3 text-right text-sm">\n <button\n type="button"\n class="inline-flex items-center text-rose-500 hover:text-rose-600 dark:text-rose-400 dark:hover:text-rose-300"\n title="Quitar"\n [disabled]="!interactive()"\n (click)="onAction(\'del\', item.row, item.rowIndex); $event.stopPropagation()"\n >\n <svg\n class="w-5 h-5"\n fill="none"\n stroke="currentColor"\n viewBox="0 0 24 24"\n xmlns="http://www.w3.org/2000/svg"\n >\n <path\n stroke-linecap="round"\n stroke-linejoin="round"\n stroke-width="2"\n d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"\n ></path>\n </svg>\n </button>\n </td>\n }\n </tr>\n }\n\n @if (data().length === 0) {\n <tr>\n <td [attr.colspan]="colspan()" class="px-4 py-4 text-center text-sm text-slate-500 dark:text-slate-400">\n {{ noResultsLabel() }}\n </td>\n </tr>\n }\n\n @if (footer().tbody && data().length > 0) {\n <tr>\n <td [attr.colspan]="colspan()" class="px-4 py-4 text-sm text-slate-700 dark:text-slate-300" [style]="footer().tbody?.style">\n {{ footer().tbody?.content || \'\' }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n</div>\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifFormDataTable{config=input({},...ngDevMode?[{debugName:"config"}]:[]);header=signal({},...ngDevMode?[{debugName:"header"}]:[]);footer=signal({},...ngDevMode?[{debugName:"footer"}]:[]);data=signal([],...ngDevMode?[{debugName:"data"}]:[]);columns=signal([],...ngDevMode?[{debugName:"columns"}]:[]);fields=signal([],...ngDevMode?[{debugName:"fields"}]:[]);filasSeleccionadas=signal(new Set,...ngDevMode?[{debugName:"filasSeleccionadas"}]:[]);noResultsLabel=signal(lang(["form","table.no_results"])||"Sin resultados",...ngDevMode?[{debugName:"noResultsLabel"}]:[]);tableBaseConfig=computed(()=>({header:this.header(),columns:this.columns(),fields:this.fields(),data:this.data(),readonly:this.config()?.readonly,disabled:this.config()?.disabled,showSelection:!0,selectionType:this.selectionMode(),selectedRows:this.filasSeleccionadas(),noResultsLabel:this.noResultsLabel(),getCellValue:(e,t,n)=>this.getField(e,t,n),getRowId:e=>this.getSelectionValue(e),onRowClick:e=>this.toggleSeleccionFila(this.getSelectionValue(e),e),onToggleSelection:(e,t)=>this.onSelectionChange(this.getSelectionValue(e),e,{target:t.target})}),...ngDevMode?[{debugName:"tableBaseConfig"}]:[]);selectionField=signal("id",...ngDevMode?[{debugName:"selectionField"}]:[]);selectionMode=signal("checkbox",...ngDevMode?[{debugName:"selectionMode"}]:[]);constructor(){effect(()=>{const e=this.config();this.build(e)})}ngOnInit(){}build(e={}){"function"==typeof e.onComponent&&e.onComponent(this),this.createFunctions(e),e.columns&&this.prepareTable(e)}createFunctions(e){e&&(e.getData=e=>this.data()||[],e.onLoadData=e.onLoadData||function(){},e.build=(e={})=>this.build(e),e.getContext=()=>this,e.onSetData=e.onSetData||function(){})}normalizeRow(e={}){if(!e||"object"!=typeof e||Array.isArray(e))return e;const t={...e};return t.id=t.id??t.value,t.value=t.value??t.id,t.text=t.text??t.description??t.descripcion,t.description=t.description??t.descripcion??t.text,t}getSelectionValue(e={}){return this.resolveFieldValue(this.selectionField(),e)}resolveFieldValue(e,t={}){if(!t||"object"!=typeof t)return"";if(void 0!==t[e]&&null!==t[e])return t[e];switch(e){case"id":return t.id??t.value??"";case"value":return t.value??t.id??"";case"text":return t.text??t.description??t.descripcion??"";case"description":case"descripcion":return t.description??t.descripcion??t.text??"";default:return""}}checkToCat(e){return(e||[]).map(e=>this.normalizeRow(e))}prepareTable(e={}){const t=[],n=[];let i="id",a="checkbox";if(this.header.set(e.header||{}),"string"==typeof e.data){const t=e.data+"";this.data.set([]),rq_req().get(t).then(t=>{const n=this.checkToCat(t||[]);this.data.set(n),e.value&&this.addCheckData(e.value)})}else{const t=this.checkToCat(e.data||[]);this.data.set(t),e.value&&this.addCheckData(e.value)}for(let s of e.columns)if("string"==typeof s)t.push(s),n.push(s.toLowerCase().replace(/ /g,"_"));else{if("checkbox"===s.type||"radio"===s.type){a=s.type,i=s.field||"id";continue}t.push(s.name),s.image?n.push(s):s.field&&!s.click?n.push(s.field):s.action?n.push(s.action):n.push(s)}this.selectionField.set(i),this.selectionMode.set(a),this.columns.set(t),this.fields.set(n)}json_hierarchy_val(e,t){let n=e;for(const e of t){if(!n[e])return"";n=n[e]}return n}getField(e,t={},n){if("string"==typeof e)return this.resolveFieldValue(e,t);if(e instanceof Array)return this.json_hierarchy_val(t,e);if("object"==typeof e){if(e.image&&e.field)return this.resolveFieldValue(e.field,t);if(e.action)return e.action;if(e.click)return this.resolveFieldValue(e.field,t);if(e.field)return this.resolveFieldValue(e.field,t)}return"otro"}toggleSeleccionFila(e,t={},n){const i=new Set(this.filasSeleccionadas());if("radio"===this.selectionMode())return i.clear(),null!=e&&""!==e&&i.add(e),void this.onSetValue(t,"set",i);i.has(e)?(i.delete(e),this.onSetValue(t,"del",i)):(i.add(e),this.onSetValue(t,"add",i))}onSelectionChange(e,t={},n){const i=n.target.checked,a=new Set(this.filasSeleccionadas());if("radio"===this.selectionMode())return a.clear(),i&&null!=e&&""!==e&&a.add(e),void this.onSetValue(t,"set",a);i?(a.add(e),this.onSetValue(t,"add",a)):(a.delete(e),this.onSetValue(t,"del",a))}onSetValue(e,t,n){this.filasSeleccionadas.set(n);const i=[...n],a=this.config();a.onSetData&&a.onSetData("radio"===this.selectionMode()?i.length>0?i[0]:null:i.length>0?i:null)}addCheckData(e={}){const t=new Set(this.filasSeleccionadas());let n=!1;e instanceof Array?e.forEach(e=>{t.has(e)||(t.add(e),n=!0)}):null!=e&&""!==e&&(t.clear(),t.add(e),n=!0),n&&this.filasSeleccionadas.set(t)}clear(){this.filasSeleccionadas.set(new Set)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormDataTable,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifFormDataTable,isStandalone:!0,selector:"aif-form-data-table",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<aif-table-base [config]="tableBaseConfig()"></aif-table-base>\n',dependencies:[{kind:"component",type:AifTableBase,selector:"aif-table-base",inputs:["config"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormDataTable,decorators:[{type:Component,args:[{selector:"aif-form-data-table",standalone:!0,imports:[AifTableBase],template:'<aif-table-base [config]="tableBaseConfig()"></aif-table-base>\n'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifFormSub{config=input({},...ngDevMode?[{debugName:"config"}]:[]);ngOnInit(){}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormSub,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifFormSub,isStandalone:!0,selector:"aif-form-sub",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="rounded-xl border border-slate-200/80 bg-slate-50/60 shadow-sm dark:border-slate-700/60 dark:bg-slate-900/45">\n <div class="p-5 md:p-6">\n <div class="flex items-start">\n <div class="flex-grow overflow-hidden">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n</div>\n'})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormSub,decorators:[{type:Component,args:[{selector:"aif-form-sub",standalone:!0,template:'<div class="rounded-xl border border-slate-200/80 bg-slate-50/60 shadow-sm dark:border-slate-700/60 dark:bg-slate-900/45">\n <div class="p-5 md:p-6">\n <div class="flex items-start">\n <div class="flex-grow overflow-hidden">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n</div>\n'}]}],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifFormTag{item=input([],...ngDevMode?[{debugName:"item"}]:[]);ngOnInit(){}onTagClick(e){e._click&&e._click()}getItem(e){return"object"==typeof e?"":e}getAlertClass(e="primary"){switch(e){case"primary":case"info":default:return"text-blue-800 bg-blue-50 dark:bg-gray-800 dark:text-blue-400";case"secondary":case"light":return"text-gray-800 bg-gray-50 dark:bg-gray-800 dark:text-gray-300";case"success":return"text-green-800 bg-green-50 dark:bg-gray-800 dark:text-green-400";case"danger":return"text-red-800 bg-red-50 dark:bg-gray-800 dark:text-red-400";case"warning":return"text-yellow-800 bg-yellow-50 dark:bg-gray-800 dark:text-yellow-300";case"dark":return"text-gray-50 bg-gray-800 dark:bg-gray-900 dark:text-gray-300"}}getButtonClass(e="primary"){const t="px-4 py-2 rounded-md text-white focus:outline-none focus:ring-2 focus:ring-offset-2";switch(e){case"primary":default:return`${t} bg-indigo-600 hover:bg-indigo-700 focus:ring-indigo-500`;case"secondary":return`${t} bg-gray-600 hover:bg-gray-700 focus:ring-gray-500`;case"success":return`${t} bg-green-600 hover:bg-green-700 focus:ring-green-500`;case"danger":return`${t} bg-red-600 hover:bg-red-700 focus:ring-red-500`;case"warning":return`${t} bg-yellow-500 hover:bg-yellow-600 focus:ring-yellow-500`;case"info":return`${t} bg-blue-500 hover:bg-blue-600 focus:ring-blue-500`;case"light":return"px-4 py-2 rounded-md text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 shadow-sm";case"dark":return`${t} bg-gray-800 hover:bg-gray-900 focus:ring-gray-500`}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormTag,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormTag,isStandalone:!0,selector:"aif-form-tag",inputs:{item:{classPropertyName:"item",publicName:"item",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (item()[0] == \'control\') {\n <div class="relative mb-5">\n <div\n class="block w-full rounded-md border-0 py-1.5 text-gray-900 dark:text-white shadow-sm ring-1 ring-inset ring-gray-300 dark:ring-gray-600 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"\n >\n <div class="px-2">{{ getItem(item()[2]) }}</div>\n </div>\n <label\n class="absolute -top-2 left-2 inline-block px-1 text-xs font-medium text-gray-900 dark:text-gray-300"\n >{{ item()[1] }}</label\n >\n </div>\n} @else if (item()[0] == \'html\') {\n <div [innerHTML]="item()[1]"></div>\n} @else if (item()[0] == \'img\') {\n <img\n [src]="item()[1]"\n [class]="item()[2]?.class"\n [alt]="item()[2].alt"\n [style]="item()[2].style"\n />\n} @else if (item()[0] == \'div\') {\n <div [class]="item()[2]?.class" [style]="item()[2]?.style">\n {{ item()[1] }}\n </div>\n} @else if (item()[0] == \'a\') {\n <a\n [href]="item()[2]?.href"\n [class]="item()[2]?.class"\n [target]="item()[2]?.target"\n [title]="item()[2]?.title"\n >\n {{ item()[1] }}\n </a>\n} @else if (item()[0] == \'p\') {\n <p [class]="item()[2]?.class" [style]="item()[2]?.style">\n {{ item()[1] }}\n </p>\n} @else if (item()[0] == \'alert\') {\n <div\n class="p-4 mb-4 text-sm rounded-lg"\n [ngClass]="getAlertClass(item()[2]?.type)"\n role="alert"\n >\n @if (item()[2]?.title) {\n <div class="font-medium">{{ item()[2]?.title }}</div>\n }\n {{ item()[1] }}\n </div>\n} @else if (item()[0] == \'button\') {\n <div class="flex justify-center mx-auto" [class]="item()[2].col">\n <button\n (click)="onTagClick(item()[2])"\n [ngClass]="getButtonClass(item()[2]?.type)"\n class="btn"\n type="button"\n >\n {{ item()[1] }}\n </button>\n </div>\n} @else if (item()[0] == \'card\') {\n <div\n class="bg-white border rounded-lg shadow-sm"\n [class]="item()[2]?.class"\n [style]="item()[2]?.style"\n >\n <div class="px-6 py-4 border-b border-gray-200 font-bold">\n {{ item()[2]?.title }}\n </div>\n <div class="p-6">\n {{ item()[1] }}\n </div>\n </div>\n}\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormTag,decorators:[{type:Component,args:[{selector:"aif-form-tag",imports:[NgClass],template:'@if (item()[0] == \'control\') {\n <div class="relative mb-5">\n <div\n class="block w-full rounded-md border-0 py-1.5 text-gray-900 dark:text-white shadow-sm ring-1 ring-inset ring-gray-300 dark:ring-gray-600 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"\n >\n <div class="px-2">{{ getItem(item()[2]) }}</div>\n </div>\n <label\n class="absolute -top-2 left-2 inline-block px-1 text-xs font-medium text-gray-900 dark:text-gray-300"\n >{{ item()[1] }}</label\n >\n </div>\n} @else if (item()[0] == \'html\') {\n <div [innerHTML]="item()[1]"></div>\n} @else if (item()[0] == \'img\') {\n <img\n [src]="item()[1]"\n [class]="item()[2]?.class"\n [alt]="item()[2].alt"\n [style]="item()[2].style"\n />\n} @else if (item()[0] == \'div\') {\n <div [class]="item()[2]?.class" [style]="item()[2]?.style">\n {{ item()[1] }}\n </div>\n} @else if (item()[0] == \'a\') {\n <a\n [href]="item()[2]?.href"\n [class]="item()[2]?.class"\n [target]="item()[2]?.target"\n [title]="item()[2]?.title"\n >\n {{ item()[1] }}\n </a>\n} @else if (item()[0] == \'p\') {\n <p [class]="item()[2]?.class" [style]="item()[2]?.style">\n {{ item()[1] }}\n </p>\n} @else if (item()[0] == \'alert\') {\n <div\n class="p-4 mb-4 text-sm rounded-lg"\n [ngClass]="getAlertClass(item()[2]?.type)"\n role="alert"\n >\n @if (item()[2]?.title) {\n <div class="font-medium">{{ item()[2]?.title }}</div>\n }\n {{ item()[1] }}\n </div>\n} @else if (item()[0] == \'button\') {\n <div class="flex justify-center mx-auto" [class]="item()[2].col">\n <button\n (click)="onTagClick(item()[2])"\n [ngClass]="getButtonClass(item()[2]?.type)"\n class="btn"\n type="button"\n >\n {{ item()[1] }}\n </button>\n </div>\n} @else if (item()[0] == \'card\') {\n <div\n class="bg-white border rounded-lg shadow-sm"\n [class]="item()[2]?.class"\n [style]="item()[2]?.style"\n >\n <div class="px-6 py-4 border-b border-gray-200 font-bold">\n {{ item()[2]?.title }}\n </div>\n <div class="p-6">\n {{ item()[1] }}\n </div>\n </div>\n}\n'}]}],propDecorators:{item:[{type:i0.Input,args:[{isSignal:!0,alias:"item",required:!1}]}]}});class AifNavBar{onInit=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);side=input("top",...ngDevMode?[{debugName:"side"}]:[]);destroyRef=inject(DestroyRef);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);effectiveConfig=computed(()=>{const e=this.builtConfig(),t=this.config();return(this.isBuilt()?e:t)||{}},...ngDevMode?[{debugName:"effectiveConfig"}]:[]);left_nav=computed(()=>this.effectiveConfig().left||[],...ngDevMode?[{debugName:"left_nav"}]:[]);center_nav=computed(()=>this.effectiveConfig().center||[],...ngDevMode?[{debugName:"center_nav"}]:[]);right_nav=computed(()=>this.effectiveConfig().right||[],...ngDevMode?[{debugName:"right_nav"}]:[]);parent=computed(()=>this.effectiveConfig().parent||null,...ngDevMode?[{debugName:"parent"}]:[]);showLine=computed(()=>!!this.effectiveConfig().line,...ngDevMode?[{debugName:"showLine"}]:[]);hasItems=computed(()=>this.left_nav().length>0||this.center_nav().length>0||this.right_nav().length>0,...ngDevMode?[{debugName:"hasItems"}]:[]);ngAfterViewInit(){this.destroyRef.destroyed||this.onInit.emit()}reBuild(e){this.isBuilt.set(!1),this.build(e)}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1)}build(e={}){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e||{}))}btnClick(e){e.click&&e.click(e,{},this.parent(),this)}searchTimeout;ngOnDestroy(){this.searchTimeout&&(clearTimeout(this.searchTimeout),this.searchTimeout=null)}submitInput(e,t={}){this.clearSearchTimeout(),this.executeChange(this.getInputValue(e),t)}onInputChange(e,t={}){if(!t.live)return;const n=this.getInputValue(e);if(t.delay)return this.clearSearchTimeout(),void(this.searchTimeout=setTimeout(()=>{this.executeChange(n,t)},t.delay));this.executeChange(n,t)}getInputValue(e){return"object"==typeof e?e.value:e}clearSearchTimeout(){this.searchTimeout&&(clearTimeout(this.searchTimeout),this.searchTimeout=null)}executeChange(e,t){"function"==typeof t.change&&t.change(e),"function"==typeof t.onSearch&&t.onSearch(e)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavBar,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavBar,isStandalone:!0,selector:"aif-nav-bar",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},side:{classPropertyName:"side",publicName:"side",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},ngImport:i0,template:'@if (hasItems()) {\n <div class="aif-nav-bar flex flex-col w-full">\n <div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4 w-full">\n \n @if (left_nav().length > 0){\n <div class="flex flex-wrap items-center gap-2 justify-start w-full md:w-auto">\n <ng-container *ngTemplateOutlet="blockNavOptions; context: {items: left_nav()}"></ng-container>\n </div>\n }\n\n @if (center_nav().length > 0) {\n <div class="flex flex-wrap items-center gap-2 justify-center w-full md:w-auto flex-1">\n <ng-container *ngTemplateOutlet="blockNavOptions; context: {items: center_nav()}"></ng-container>\n </div>\n }\n\n @if (right_nav().length > 0) {\n <div class="flex flex-wrap items-center gap-2 justify-end w-full md:w-auto ml-auto">\n <ng-container *ngTemplateOutlet="blockNavOptions; context: {items: right_nav()}"></ng-container>\n </div>\n }\n </div>\n\n @if(showLine()) {\n <hr class="w-full border-t border-slate-200 dark:border-slate-700 my-4" />\n }\n </div>\n}\n\n<ng-template #blockNavOptions let-items="items">\n @for (item of items; track $index) {\n @switch (item.type || \'button\') {\n \n @case (\'input\') {\n <ng-container *ngTemplateOutlet="blockInput; context: {item: item}"></ng-container>\n }\n @case (\'search\') {\n <ng-container *ngTemplateOutlet="blockInput; context: {item: item}"></ng-container>\n }\n\n @case (\'button\') {\n <button type="button" (click)="btnClick(item)" [title]="item.tooltip || \'\'" \n class="cursor-pointer inline-flex items-center justify-center transition-colors h-[38px]"\n [ngClass]="item.class ? item.class : \'px-3 py-1.5 bg-slate-100 hover:bg-slate-200 text-slate-700 font-medium text-sm rounded-md dark:bg-slate-800 dark:hover:bg-slate-700 dark:text-slate-200 border border-slate-200 dark:border-slate-700\'">\n @if(item.icon) { <i class="{{item.icon}}" [class.mr-1]="item.title || item.label"></i> }\n {{item.title || item.label}}\n </button>\n }\n\n @case (\'text\') {\n <span [ngClass]="item.class || \'text-slate-700 dark:text-slate-300 font-medium\'">\n @if(item.icon) { <i class="{{item.icon}}" [class.mr-1]="item.title || item.label"></i> }\n {{item.title || item.label}}\n </span>\n }\n\n @case (\'menu\') {\n <aif-menu [config]="item" />\n }\n }\n }\n</ng-template>\n\n<ng-template #blockInput let-item="item">\n <div class="relative flex items-center shadow-sm w-full sm:w-64 max-w-xs">\n <input #search_input \n (keydown.enter)="submitInput(search_input, item)"\n (input)="onInputChange(search_input, item)"\n class="flex-1 block w-full bg-slate-50 dark:bg-slate-800 text-slate-700 dark:text-slate-200 border border-slate-300 dark:border-slate-600 focus:ring-primary-500 focus:border-primary-500 sm:text-sm pl-3 pr-10 py-1.5 transition-colors rounded-md h-[38px]"\n placeholder="{{item.placeholder||\'\'}}" type="text" />\n \n @if(item.button || item.icon) {\n <button type="button" (click)="submitInput(search_input, item)" \n class="absolute inset-y-0 right-0 flex items-center pr-3 cursor-pointer text-slate-400 hover:text-primary-500 transition-colors">\n @if(item.icon){<i class="{{item.icon}}"></i>}\n @if(item.button && item.button !== true && item.button !== \' \'){<span class="ml-1 text-sm font-medium">{{item.button}}</span>}\n </button>\n }\n </div>\n</ng-template>\n',styles:[""],dependencies:[{kind:"directive",type:NgTemplateOutlet,selector:"[ngTemplateOutlet]",inputs:["ngTemplateOutletContext","ngTemplateOutlet","ngTemplateOutletInjector"]},{kind:"component",type:AifMenu,selector:"aif-menu",inputs:["config","fields","index","total"],outputs:["onInit"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavBar,decorators:[{type:Component,args:[{selector:"aif-nav-bar",imports:[NgTemplateOutlet,AifMenu,NgClass],template:'@if (hasItems()) {\n <div class="aif-nav-bar flex flex-col w-full">\n <div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4 w-full">\n \n @if (left_nav().length > 0){\n <div class="flex flex-wrap items-center gap-2 justify-start w-full md:w-auto">\n <ng-container *ngTemplateOutlet="blockNavOptions; context: {items: left_nav()}"></ng-container>\n </div>\n }\n\n @if (center_nav().length > 0) {\n <div class="flex flex-wrap items-center gap-2 justify-center w-full md:w-auto flex-1">\n <ng-container *ngTemplateOutlet="blockNavOptions; context: {items: center_nav()}"></ng-container>\n </div>\n }\n\n @if (right_nav().length > 0) {\n <div class="flex flex-wrap items-center gap-2 justify-end w-full md:w-auto ml-auto">\n <ng-container *ngTemplateOutlet="blockNavOptions; context: {items: right_nav()}"></ng-container>\n </div>\n }\n </div>\n\n @if(showLine()) {\n <hr class="w-full border-t border-slate-200 dark:border-slate-700 my-4" />\n }\n </div>\n}\n\n<ng-template #blockNavOptions let-items="items">\n @for (item of items; track $index) {\n @switch (item.type || \'button\') {\n \n @case (\'input\') {\n <ng-container *ngTemplateOutlet="blockInput; context: {item: item}"></ng-container>\n }\n @case (\'search\') {\n <ng-container *ngTemplateOutlet="blockInput; context: {item: item}"></ng-container>\n }\n\n @case (\'button\') {\n <button type="button" (click)="btnClick(item)" [title]="item.tooltip || \'\'" \n class="cursor-pointer inline-flex items-center justify-center transition-colors h-[38px]"\n [ngClass]="item.class ? item.class : \'px-3 py-1.5 bg-slate-100 hover:bg-slate-200 text-slate-700 font-medium text-sm rounded-md dark:bg-slate-800 dark:hover:bg-slate-700 dark:text-slate-200 border border-slate-200 dark:border-slate-700\'">\n @if(item.icon) { <i class="{{item.icon}}" [class.mr-1]="item.title || item.label"></i> }\n {{item.title || item.label}}\n </button>\n }\n\n @case (\'text\') {\n <span [ngClass]="item.class || \'text-slate-700 dark:text-slate-300 font-medium\'">\n @if(item.icon) { <i class="{{item.icon}}" [class.mr-1]="item.title || item.label"></i> }\n {{item.title || item.label}}\n </span>\n }\n\n @case (\'menu\') {\n <aif-menu [config]="item" />\n }\n }\n }\n</ng-template>\n\n<ng-template #blockInput let-item="item">\n <div class="relative flex items-center shadow-sm w-full sm:w-64 max-w-xs">\n <input #search_input \n (keydown.enter)="submitInput(search_input, item)"\n (input)="onInputChange(search_input, item)"\n class="flex-1 block w-full bg-slate-50 dark:bg-slate-800 text-slate-700 dark:text-slate-200 border border-slate-300 dark:border-slate-600 focus:ring-primary-500 focus:border-primary-500 sm:text-sm pl-3 pr-10 py-1.5 transition-colors rounded-md h-[38px]"\n placeholder="{{item.placeholder||\'\'}}" type="text" />\n \n @if(item.button || item.icon) {\n <button type="button" (click)="submitInput(search_input, item)" \n class="absolute inset-y-0 right-0 flex items-center pr-3 cursor-pointer text-slate-400 hover:text-primary-500 transition-colors">\n @if(item.icon){<i class="{{item.icon}}"></i>}\n @if(item.button && item.button !== true && item.button !== \' \'){<span class="ml-1 text-sm font-medium">{{item.button}}</span>}\n </button>\n }\n </div>\n</ng-template>\n'}]}],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],side:[{type:i0.Input,args:[{isSignal:!0,alias:"side",required:!1}]}]}});class AifFormTable{config=input({},...ngDevMode?[{debugName:"config"}]:[]);header=signal({},...ngDevMode?[{debugName:"header"}]:[]);footer=signal({},...ngDevMode?[{debugName:"footer"}]:[]);data=signal([],...ngDevMode?[{debugName:"data"}]:[]);columns=signal([],...ngDevMode?[{debugName:"columns"}]:[]);fields=signal([],...ngDevMode?[{debugName:"fields"}]:[]);selectedRows=signal(new Set,...ngDevMode?[{debugName:"selectedRows"}]:[]);showSelection=signal(!1,...ngDevMode?[{debugName:"showSelection"}]:[]);selectionType=signal("checkbox",...ngDevMode?[{debugName:"selectionType"}]:[]);selectionTrackBy=signal("id",...ngDevMode?[{debugName:"selectionTrackBy"}]:[]);selectionBind=signal("",...ngDevMode?[{debugName:"selectionBind"}]:[]);selectionTrueValue=signal(!0,...ngDevMode?[{debugName:"selectionTrueValue"}]:[]);selectionFalseValue=signal(!1,...ngDevMode?[{debugName:"selectionFalseValue"}]:[]);count_data=signal(0,...ngDevMode?[{debugName:"count_data"}]:[]);noResultsLabel=signal(lang(["form","table.no_results"])||"Sin resultados",...ngDevMode?[{debugName:"noResultsLabel"}]:[]);navbar=signal({},...ngDevMode?[{debugName:"navbar"}]:[]);tableBaseConfig=computed(()=>({header:this.header(),footer:this.footer(),columns:this.columns(),fields:this.fields(),data:this.data(),readonly:this.config()?.readonly,disabled:this.config()?.disabled,showSelection:this.showSelection(),selectionType:this.selectionType(),selectedRows:this.selectedRows(),showActions:!1,noResultsLabel:this.config()?.emptyMessage?this.config()?.emptyMessage:this.noResultsLabel(),getCellValue:(e,t,n)=>this.getField(e,t,n),onCellClick:(e,t,n)=>this.onClick(e,n,this.fields()),getRowId:e=>this.getSelectionValue(e),onRowClick:e=>this.showSelection()?this.toggleSelection(this.getSelectionValue(e),e):null,onToggleSelection:(e,t)=>this.onSelectionChange(this.getSelectionValue(e),e,{target:t.target}),onAction:(e,t,n)=>this.onOption(e,t,n)}),...ngDevMode?[{debugName:"tableBaseConfig"}]:[]);constructor(){effect(()=>{this.build(this.config())})}ngOnInit(){}createFunctions(e){e&&(e.getData=e=>this.data()||[],e.onLoadData=e.onLoadData||(()=>{}),e.onContext=e.onContext||(()=>{}),e.build=(e={})=>this.build(e),e.getContext=()=>this,e.onValidUnique=(e={},t=[])=>this.validUnique(e,t),e.onAction=e.onAction||(()=>{}),e.onContext(this))}build(e={}){this.createFunctions(e),e.columns&&this.prepareTable(e)}prepareTable(e={}){const t=[],n=[],i=e.selection||null;this.showSelection.set(!!i),this.selectionType.set("radio"===i?.type?"radio":"checkbox"),this.selectionTrackBy.set(i?.trackBy||"id"),this.selectionBind.set(i?.bind||""),this.selectionTrueValue.set(i?.trueValue??!0),this.selectionFalseValue.set(i?.falseValue??!1);for(let i of e.columns)"string"==typeof i?(t.push(i),n.push(i.toLowerCase().replace(/ /g,"_"))):(t.push(i.name),i.image?n.push(i):i.field&&!i.click?n.push(i.field):i.action?n.push(i.action):n.push(i));this.columns.set(t),this.fields.set(n),this.navbar.set(e.navbar||{});const a=e.data||[];this.data.set(a),this.header.set(e.header||{}),this.syncSelectedRows(a),e.onLoadData&&e.onLoadData(a,this)}getSelectionValue(e={}){return e&&"object"==typeof e?e[this.selectionTrackBy()]??e.id??e.hash??e.name??"":""}syncSelectedRows(e=[]){if(!this.showSelection()||!this.selectionBind())return void this.selectedRows.set(new Set);const t=new Set;e.forEach(e=>{e?.[this.selectionBind()]===this.selectionTrueValue()&&t.add(this.getSelectionValue(e))}),this.selectedRows.set(t)}toggleSelection(e,t={},n){n?.stopPropagation(),this.onSelectionChange(e,t,{target:{checked:!this.selectedRows().has(e)}})}onSelectionChange(e,t={},n){if(!this.showSelection())return;const i=!!n?.target?.checked,a=this.selectionBind(),s=[...this.data()].map(t=>{const n=this.getSelectionValue(t)===e;return a?"radio"===this.selectionType()?{...t,[a]:n&&i?this.selectionTrueValue():this.selectionFalseValue()}:n?{...t,[a]:i?this.selectionTrueValue():this.selectionFalseValue()}:t:t});this.data.set(s),this.syncSelectedRows(s),this.config()?.onSetData?.(s,t,e)}setFooterTbody(e){this.footer.update(t=>({...t,tbody:e||{}}))}json_hierarchy_val(e,t){let n=e;for(const e of t){if(!n[e])return"";if(n[e]&&"string"==typeof n[e])return n[e];n=n[e]}return n}validUnique(e={},t=[]){const n=this.data();for(const i of n){let n=0;for(const a in t){const s=t[a];str_to_normalize(i[s])==str_to_normalize(e[s])&&n++}if(n&&n>=t.length)return e.success=!1,e.message="El registro ya existe",e}return""}getField(e,t={},n){if("string"==typeof e)return t[e];if(e instanceof Array)return this.json_hierarchy_val(t,e);if("object"==typeof e){if("function"==typeof e.custom)return e.custom(t,n);if(e.image&&e.field)return t[e.field];if(e.action)return e.action;if(e.click)return t[e.field]}return"otro"}onOption(e,t={},n=0){if("del"==e||"delete"==e){const e=[...this.data()];e.splice(n,1),this.data.set(e);const t=this.config();t.data=e,t.onDelete&&t.onDelete(n)}else"edit"==e?this.config()?.onAction?.("edit",t,n):"add"==e?this.config()?.onAction?.("add",t,n):this.config()?.onAction?.(e,t,n)}onClick(e,t,n){return e&&e.click&&e.click(this.data()[t],t,n),null}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormTable,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormTable,isStandalone:!0,selector:"aif-form-table",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (navbar()?.left?.length || navbar()?.center?.length || navbar()?.right?.length) {\n <div class="mb-4">\n <aif-nav-bar [config]="navbar()"></aif-nav-bar>\n </div>\n}\n<aif-table-base [config]="tableBaseConfig()"></aif-table-base>\n',dependencies:[{kind:"component",type:AifTableBase,selector:"aif-table-base",inputs:["config"]},{kind:"component",type:AifNavBar,selector:"aif-nav-bar",inputs:["config","side"],outputs:["onInit"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormTable,decorators:[{type:Component,args:[{selector:"aif-form-table",standalone:!0,imports:[AifTableBase,AifNavBar],template:'@if (navbar()?.left?.length || navbar()?.center?.length || navbar()?.right?.length) {\n <div class="mb-4">\n <aif-nav-bar [config]="navbar()"></aif-nav-bar>\n </div>\n}\n<aif-table-base [config]="tableBaseConfig()"></aif-table-base>\n'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifAlert{config=input({},...ngDevMode?[{debugName:"config"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);state=computed(()=>({...this.config(),...this.cfg()}),...ngDevMode?[{debugName:"state"}]:[]);type=computed(()=>this.state().type??"primary",...ngDevMode?[{debugName:"type"}]:[]);message=computed(()=>this.state().message??"",...ngDevMode?[{debugName:"message"}]:[]);center=computed(()=>this.state().center??!1,...ngDevMode?[{debugName:"center"}]:[]);closable=computed(()=>this.state().closable??!0,...ngDevMode?[{debugName:"closable"}]:[]);wrapperClass=computed(()=>this.state().class??"",...ngDevMode?[{debugName:"wrapperClass"}]:[]);show=computed(()=>{if(!this.message())return!1;return this.state().show??!0},...ngDevMode?[{debugName:"show"}]:[]);alertClasses=computed(()=>{const e={primary:"border border-blue-200 bg-blue-100/80 text-blue-900 dark:border-blue-500/25 dark:bg-blue-500/10 dark:text-blue-300",secondary:"border border-slate-200 bg-slate-100/85 text-slate-800 dark:border-slate-500/25 dark:bg-slate-400/10 dark:text-slate-200",success:"border border-green-200 bg-green-100/75 text-green-900 dark:border-green-500/25 dark:bg-green-500/10 dark:text-green-300",danger:"border border-red-200 bg-red-100/75 text-red-900 dark:border-red-500/25 dark:bg-red-500/10 dark:text-red-300",warning:"border border-amber-200 bg-amber-100/80 text-amber-900 dark:border-amber-400/25 dark:bg-amber-400/10 dark:text-amber-200",info:"border border-cyan-200 bg-cyan-100/80 text-cyan-900 dark:border-cyan-400/25 dark:bg-cyan-400/10 dark:text-cyan-200",light:"border border-gray-200 bg-gray-50 text-gray-800 dark:border-gray-500/25 dark:bg-gray-100/10 dark:text-gray-100",dark:"border border-slate-700/80 bg-slate-900/95 text-slate-50 dark:border-slate-600/80 dark:bg-slate-900 dark:text-slate-100"};return e[this.type()]??e.primary},...ngDevMode?[{debugName:"alertClasses"}]:[]);closeButtonClasses=computed(()=>{const e={primary:"text-blue-500 hover:bg-blue-500/10 hover:text-blue-700 dark:text-blue-300 dark:hover:bg-blue-400/10 dark:hover:text-blue-200",secondary:"text-slate-500 hover:bg-slate-500/10 hover:text-slate-700 dark:text-slate-300 dark:hover:bg-slate-400/10 dark:hover:text-slate-100",success:"text-green-500 hover:bg-green-500/10 hover:text-green-700 dark:text-green-300 dark:hover:bg-green-400/10 dark:hover:text-green-200",danger:"text-red-500 hover:bg-red-500/10 hover:text-red-700 dark:text-red-300 dark:hover:bg-red-400/10 dark:hover:text-red-200",warning:"text-amber-500 hover:bg-amber-500/10 hover:text-amber-700 dark:text-amber-200 dark:hover:bg-amber-400/10 dark:hover:text-amber-100",info:"text-cyan-500 hover:bg-cyan-500/10 hover:text-cyan-700 dark:text-cyan-200 dark:hover:bg-cyan-400/10 dark:hover:text-cyan-100",light:"text-gray-500 hover:bg-gray-500/10 hover:text-gray-700 dark:text-gray-200 dark:hover:bg-gray-400/10 dark:hover:text-white",dark:"text-slate-300 hover:bg-white/10 hover:text-white dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white"};return e[this.type()]??e.primary},...ngDevMode?[{debugName:"closeButtonClasses"}]:[]);constructor(){effect(()=>{this.attachApi(this.config())})}build(e={}){this.cfg.update(t=>({...t,...e})),this.attachApi(this.config())}reBuild(e={}){this.cfg.set({...e}),this.attachApi(this.config())}resetToInput(){this.cfg.set({}),this.attachApi(this.config())}close(){this.cfg.update(e=>({...e,show:!1}))}closeAlert(){this.close()}open(e,t){this.cfg.update(n=>({...n,message:e,type:t??n.type??this.type(),show:!0}))}attachApi(e){e&&(e.build=(e={})=>this.build(e),e.reBuild=(e={})=>this.reBuild(e),e.open=(e,t)=>this.open(e,t),e.close=()=>this.close())}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAlert,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifAlert,isStandalone:!0,selector:"aif-alert",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'@if (show()) {\n <div\n class="aif-alert mb-4 flex items-start gap-3 rounded-lg p-4 text-sm"\n [ngClass]="[alertClasses(), wrapperClass()]"\n role="alert"\n >\n <div [class.text-center]="center()" class="min-w-0 flex-1">\n {{ message() }}\n </div>\n\n @if (closable()) {\n <button\n type="button"\n class="ml-auto -mx-1.5 -my-1.5 inline-flex h-8 w-8 rounded-lg bg-transparent p-1.5 focus:ring-2"\n [ngClass]="closeButtonClasses()"\n aria-label="Close"\n (click)="close()"\n >\n <span class="sr-only">Close</span>\n <svg\n class="h-3 w-3"\n aria-hidden="true"\n xmlns="http://www.w3.org/2000/svg"\n fill="none"\n viewBox="0 0 14 14"\n >\n <path\n stroke="currentColor"\n stroke-linecap="round"\n stroke-linejoin="round"\n stroke-width="2"\n d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"\n />\n </svg>\n </button>\n }\n </div>\n}\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifAlert,decorators:[{type:Component,args:[{selector:"aif-alert",standalone:!0,imports:[NgClass],template:'@if (show()) {\n <div\n class="aif-alert mb-4 flex items-start gap-3 rounded-lg p-4 text-sm"\n [ngClass]="[alertClasses(), wrapperClass()]"\n role="alert"\n >\n <div [class.text-center]="center()" class="min-w-0 flex-1">\n {{ message() }}\n </div>\n\n @if (closable()) {\n <button\n type="button"\n class="ml-auto -mx-1.5 -my-1.5 inline-flex h-8 w-8 rounded-lg bg-transparent p-1.5 focus:ring-2"\n [ngClass]="closeButtonClasses()"\n aria-label="Close"\n (click)="close()"\n >\n <span class="sr-only">Close</span>\n <svg\n class="h-3 w-3"\n aria-hidden="true"\n xmlns="http://www.w3.org/2000/svg"\n fill="none"\n viewBox="0 0 14 14"\n >\n <path\n stroke="currentColor"\n stroke-linecap="round"\n stroke-linejoin="round"\n stroke-width="2"\n d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"\n />\n </svg>\n </button>\n }\n </div>\n}\n'}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifFormHiddenText{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormHiddenText,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifFormHiddenText,isStandalone:!0,selector:"aif-form-hidden-text",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="relative mb-0" [formGroup]="aifForm().form">\n <div\n class="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 sm:text-sm sm:leading-6 bg-gray-50">\n <input type="hidden" [name]="fd().name" [formControlName]="fd().name">\n <div [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled" class="px-2">{{ aifForm().field[fd().name].text }}</div>\n </div>\n <label class="absolute -top-2 left-2 inline-block px-1 text-xs font-medium text-gray-900 dark:text-slate-300">{{\n fd().label }}</label>\n</div>\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormHiddenText,decorators:[{type:Component,args:[{selector:"aif-form-hidden-text",standalone:!0,imports:[ReactiveFormsModule],template:'<div class="relative mb-0" [formGroup]="aifForm().form">\n <div\n class="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 sm:text-sm sm:leading-6 bg-gray-50">\n <input type="hidden" [name]="fd().name" [formControlName]="fd().name">\n <div [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled" class="px-2">{{ aifForm().field[fd().name].text }}</div>\n </div>\n <label class="absolute -top-2 left-2 inline-block px-1 text-xs font-medium text-gray-900 dark:text-slate-300">{{\n fd().label }}</label>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormInput{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);field=computed(()=>this.fd(),...ngDevMode?[{debugName:"field"}]:[]);formCtx=computed(()=>this.aifForm(),...ngDevMode?[{debugName:"formCtx"}]:[]);isRequired=computed(()=>{const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.isFieldRequired(e)},...ngDevMode?[{debugName:"isRequired"}]:[]);isReadonly=computed(()=>!(!this.field()?.attr?.readonly&&!this.field()?.attr?.disabled),...ngDevMode?[{debugName:"isReadonly"}]:[]);nativeType=computed(()=>{const e=this.field();if(!e)return"text";const t="object"==typeof e.type?e.type.type:e.type;return"datetime"===t?"datetime-local":t},...ngDevMode?[{debugName:"nativeType"}]:[]);getNativeType(){return this.nativeType()}hasFieldError(){const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.hasError(e)}currentFieldClass(){const e=this.field(),t=this.formCtx();return e&&t?t.fieldClass(e):{}}validateInput(e){const t=this.fd();if(!t?.attr?.readonly&&!t?.attr?.disabled&&t?.attr){let n=e.key;if(t.attr.uppercase){const i=e.target;n=n.toUpperCase(),i.value=i.value.toUpperCase(),this.aifForm().field[t.name].value=i.value,this.aifForm().form.get(t.name)?.setValue(i.value)}if(t.attr.pattern){let i=t.attr.pattern;new RegExp(i).test(n)||"Backspace"===n||"Tab"===n||e.preventDefault()}}}validateField(e){const t=this.fd();if(!t?.attr?.readonly&&!t?.attr?.disabled&&t?.attr){let n=e.target;const i=n.selectionStart||0;if(t.attr.uppercase&&(n.value=n.value.toUpperCase(),this.aifForm().field[t.name].value=n.value,this.aifForm().form.get(t.name)?.setValue(n.value)),t.attr.pattern){let e=t.attr.pattern,i=new RegExp(e);if(n.value&&!i.test(n.value)){const e=n.value.split("").filter(e=>i.test(e)).join("");n.value=e.trim()}}"number"!==t.type&&n.setSelectionRange(i,i)}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormInput,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormInput,isStandalone:!0,selector:"aif-form-input",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <input [type]="nativeType()" [maxlength]="field()?.attr?.maxlength" [class.bg-gray-100]="isReadonly()"\n [class.dark:bg-gray-700]="isReadonly()" [style]="field()?.attr?.style"\n [readonly]="field()?.attr?.readonly"\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 px-3 text-gray-900 dark:text-white bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset sm:text-sm sm:leading-6 placeholder:text-gray-400 appearance-none transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [id]="field()?.name" [formControlName]="field()?.name" placeholder=" "\n (keypress)="validateInput($event)" (input)="validateField($event)"\n >\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">\n {{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }\n </label>\n</div>\n@if(field()?.attr?.reload) {\n<span (click)="formCtx().fieldReload(field())"\n class="absolute right-0 top-0 mt-2 mr-2 cursor-pointer text-gray-400 hover:text-gray-600">\n <i class="aif aif-sync-ico"></i> \x3c!-- Replace icon --\x3e\n</span>\n}\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.MaxLengthValidator,selector:"[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",inputs:["maxlength"]},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormInput,decorators:[{type:Component,args:[{selector:"aif-form-input",standalone:!0,imports:[ReactiveFormsModule],template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <input [type]="nativeType()" [maxlength]="field()?.attr?.maxlength" [class.bg-gray-100]="isReadonly()"\n [class.dark:bg-gray-700]="isReadonly()" [style]="field()?.attr?.style"\n [readonly]="field()?.attr?.readonly"\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 px-3 text-gray-900 dark:text-white bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset sm:text-sm sm:leading-6 placeholder:text-gray-400 appearance-none transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [id]="field()?.name" [formControlName]="field()?.name" placeholder=" "\n (keypress)="validateInput($event)" (input)="validateField($event)"\n >\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">\n {{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }\n </label>\n</div>\n@if(field()?.attr?.reload) {\n<span (click)="formCtx().fieldReload(field())"\n class="absolute right-0 top-0 mt-2 mr-2 cursor-pointer text-gray-400 hover:text-gray-600">\n <i class="aif aif-sync-ico"></i> \x3c!-- Replace icon --\x3e\n</span>\n}\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormSelect{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);field=computed(()=>this.fd(),...ngDevMode?[{debugName:"field"}]:[]);formCtx=computed(()=>this.aifForm(),...ngDevMode?[{debugName:"formCtx"}]:[]);isRequired=computed(()=>{const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.isFieldRequired(e)},...ngDevMode?[{debugName:"isRequired"}]:[]);isReadonly=computed(()=>!(!this.field()?.attr?.readonly&&!this.field()?.attr?.disabled),...ngDevMode?[{debugName:"isReadonly"}]:[]);hasFieldError(){const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.hasError(e)}currentFieldClass(){const e=this.field(),t=this.formCtx();return e&&t?t.fieldClass(e):{}}items=computed(()=>{const e=this.formCtx(),t=this.field();return e&&t?.name?e.catOptions(t.name):[]},...ngDevMode?[{debugName:"items"}]:[]);selectionOptionLabel=signal(lang(["form","select.selection_one_option"])||"— Selecciona una opción —",...ngDevMode?[{debugName:"selectionOptionLabel"}]:[]);static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormSelect,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormSelect,isStandalone:!0,selector:"aif-form-select",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <select\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 pl-3 pr-10 text-gray-900 dark:text-gray-100 bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset sm:text-sm sm:leading-6 appearance-none transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [class.bg-gray-100]="isReadonly()" [class.dark:bg-gray-800]="isReadonly()" [class.pointer-events-none]="field()?.attr?.readonly" [id]="field()?.name"\n [style]="field()?.attr?.style" [attr.tabindex]="field()?.attr?.readonly ? -1 : null" [formControlName]="field()?.name">\n <option value="" disabled hidden class="text-gray-400 dark:text-slate-500 italic">{{ selectionOptionLabel() }}</option>\n @if(items().length > 0) {\n @for (option of items(); track $index) {\n <option [value]="option.value" class="text-gray-900 dark:text-gray-100 dark:bg-gray-800">\n {{option?.description}}\n </option>\n }\n }\n </select>\n <div\n class="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-gray-500 group-hover:text-indigo-600 group-focus-within:text-indigo-600 dark:group-hover:text-indigo-400 dark:group-focus-within:text-indigo-400 transition-colors">\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd"\n d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"\n clip-rule="evenodd" />\n </svg>\n </div>\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">{{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }</label>\n</div>\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.NgSelectOption,selector:"option",inputs:["ngValue","value"]},{kind:"directive",type:i1$2.ɵNgSelectMultipleOption,selector:"option",inputs:["ngValue","value"]},{kind:"directive",type:i1$2.SelectControlValueAccessor,selector:"select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]",inputs:["compareWith"]},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}],changeDetection:i0.ChangeDetectionStrategy.OnPush})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormSelect,decorators:[{type:Component,args:[{selector:"aif-form-select",standalone:!0,imports:[ReactiveFormsModule],changeDetection:ChangeDetectionStrategy.OnPush,template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <select\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 pl-3 pr-10 text-gray-900 dark:text-gray-100 bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset sm:text-sm sm:leading-6 appearance-none transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [class.bg-gray-100]="isReadonly()" [class.dark:bg-gray-800]="isReadonly()" [class.pointer-events-none]="field()?.attr?.readonly" [id]="field()?.name"\n [style]="field()?.attr?.style" [attr.tabindex]="field()?.attr?.readonly ? -1 : null" [formControlName]="field()?.name">\n <option value="" disabled hidden class="text-gray-400 dark:text-slate-500 italic">{{ selectionOptionLabel() }}</option>\n @if(items().length > 0) {\n @for (option of items(); track $index) {\n <option [value]="option.value" class="text-gray-900 dark:text-gray-100 dark:bg-gray-800">\n {{option?.description}}\n </option>\n }\n }\n </select>\n <div\n class="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-gray-500 group-hover:text-indigo-600 group-focus-within:text-indigo-600 dark:group-hover:text-indigo-400 dark:group-focus-within:text-indigo-400 transition-colors">\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd"\n d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"\n clip-rule="evenodd" />\n </svg>\n </div>\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">{{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }</label>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormNgSelect{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);field=computed(()=>this.fd(),...ngDevMode?[{debugName:"field"}]:[]);formCtx=computed(()=>this.aifForm(),...ngDevMode?[{debugName:"formCtx"}]:[]);isRequired=computed(()=>{const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.isFieldRequired(e)},...ngDevMode?[{debugName:"isRequired"}]:[]);isReadonly=computed(()=>!(!this.field()?.attr?.readonly&&!this.field()?.attr?.disabled),...ngDevMode?[{debugName:"isReadonly"}]:[]);items=computed(()=>{const e=this.formCtx(),t=this.field();return e&&t?.name?e.catOptions(t.name):[]},...ngDevMode?[{debugName:"items"}]:[]);onSearch(e){this.aifForm()?.onSearch?.(e,this.fd())}onClear(){this.aifForm()?.onClear?.(this.fd()?.name)}hasFieldError(){const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.hasError(e)}currentFieldClass(){const e=this.field(),t=this.formCtx();return e&&t?t.fieldClass(e):{}}isClearable(){const e=this.field(),t=this.formCtx();if(!e||!t||this.isReadonly())return!1;const n=t.form?.get(e.name)?.value;return Array.isArray(n)?n.length>0:null!=n&&""!==n}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormNgSelect,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormNgSelect,isStandalone:!0,selector:"aif-form-ng-select",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <ng-select\n class="custom-ng-select block w-full text-sm text-gray-900 dark:text-white bg-transparent appearance-none focus:outline-none focus:ring-0 peer"\n [class.has-error]="hasFieldError()"\n [class.readonly]="isReadonly()" (search)="onSearch($event)"\n [items]="items()" bindLabel="description" bindValue="value" notFoundText=""\n [readonly]="field()?.attr?.readonly" [searchable]="!isReadonly()" [clearable]="isClearable()"\n [tabIndex]="field()?.attr?.readonly ? -1 : 0" [formControlName]="field()?.name"\n [ngClass]="currentFieldClass()"\n (clear)="onClear()" appendTo="body">\n </ng-select>\n <label\n class="ng-select-floating-label absolute -top-2 left-2 inline-block rounded px-1 text-xs z-20 transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">\n {{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }\n </label>\n</div>\n',styles:['.custom-ng-select .ng-select-container{border:none!important;border-radius:.375rem!important;min-height:2.625rem;box-shadow:inset 0 0 0 1px #e2e8f0!important;background-color:#f8fafc80!important;transition:box-shadow .15s ease,background-color .15s ease,color .15s ease!important}.custom-ng-select:hover .ng-select-container{box-shadow:inset 0 0 0 1px #4f46e54d!important}.custom-ng-select .ng-value-container{padding:0 .75rem!important;align-items:center!important}.ng-select-floating-label{box-shadow:0 0 0 4px #fff}.custom-ng-select .ng-value-container .ng-placeholder{color:#9ca3af!important}.custom-ng-select .ng-value-container .ng-value{display:flex!important;align-items:center!important;margin-top:0!important;margin-bottom:0!important}.custom-ng-select .ng-clear-wrapper{opacity:1!important;color:#94a3b8;width:1.5rem;min-width:1.5rem;height:1.5rem;justify-content:center;padding-right:.5rem!important;transition:opacity .15s ease,color .15s ease!important}.custom-ng-select .ng-clear-wrapper,.custom-ng-select .ng-arrow-wrapper{display:flex;align-items:center}.custom-ng-select .ng-clear-wrapper:hover,.custom-ng-select .ng-clear-wrapper:focus{color:#e2e8f0}.custom-ng-select .ng-clear-wrapper:before{content:"\\d7";display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;color:inherit;font-size:1.125rem;line-height:1;font-weight:500}.custom-ng-select .ng-clear-wrapper .ng-clear,.custom-ng-select.readonly .ng-clear-wrapper,.custom-ng-select.ng-select-disabled .ng-clear-wrapper{display:none!important}.custom-ng-select .ng-input{top:50%!important;left:.75rem!important;right:2.5rem!important;width:auto!important;transform:translateY(-50%)!important}.dark .custom-ng-select .ng-select-container{box-shadow:inset 0 0 0 1px #33415580!important;background-color:#1e293b80!important}.dark .custom-ng-select:hover .ng-select-container{box-shadow:inset 0 0 0 1px #818cf859!important}.dark .ng-select-floating-label{box-shadow:0 0 0 4px #111827}.custom-ng-select.ng-select-focused .ng-select-container{box-shadow:inset 0 0 0 2px #6366f1f2,0 0 0 1px #6366f124!important}.dark .custom-ng-select.ng-select-focused .ng-select-container{box-shadow:inset 0 0 0 2px #818cf8f2,0 0 0 1px #818cf833!important}.custom-ng-select.has-error .ng-select-container{box-shadow:inset 0 0 0 1px #f43f5e!important}.custom-ng-select.has-error.ng-select-focused .ng-select-container{box-shadow:inset 0 0 0 1px #f43f5e,0 0 0 1px #f43f5e24!important}.custom-ng-select.readonly .ng-select-container{background-color:#f3f4f6!important}.dark .custom-ng-select.readonly .ng-select-container{background-color:#374151!important}.custom-ng-select.readonly .ng-value-container,.custom-ng-select.readonly .ng-arrow-wrapper,.custom-ng-select.readonly .ng-clear-wrapper{color:#94a3b8!important}.ng-dropdown-panel{background-color:#fff;z-index:9999!important;border:1px solid #e5e7eb;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;border-radius:.375rem}.ng-dropdown-panel .ng-option{padding:.5rem 1rem;cursor:pointer;color:#111827;background-color:#fff}.ng-dropdown-panel .ng-option:hover,.ng-dropdown-panel .ng-option.ng-option-marked{background-color:#f3f4f6}.dark .ng-dropdown-panel{background-color:#1f2937!important;border-color:#374151}.dark .ng-dropdown-panel .ng-option{background-color:#1f2937;color:#f9fafb}.dark .ng-dropdown-panel .ng-option:hover,.dark .ng-dropdown-panel .ng-option.ng-option-marked{background-color:#374151}\n'],dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"ngmodule",type:NgSelectModule},{kind:"component",type:i2.NgSelectComponent,selector:"ng-select",inputs:["ariaLabelDropdown","ariaLabel","markFirst","placeholder","fixedPlaceholder","notFoundText","typeToSearchText","preventToggleOnRightClick","addTagText","loadingText","clearAllText","dropdownPosition","appendTo","outsideClickEvent","loading","closeOnSelect","hideSelected","selectOnTab","openOnEnter","maxSelectedItems","groupBy","groupValue","bufferAmount","virtualScroll","selectableGroup","tabFocusOnClearButton","selectableGroupAsModel","searchFn","trackByFn","clearOnBackspace","labelForId","inputAttrs","tabIndex","readonly","searchWhileComposing","minTermLength","editableSearchTerm","ngClass","typeahead","multiple","addTag","searchable","clearable","clearKeepsDisabledOptions","deselectOnClick","clearSearchOnAdd","compareWith","keyDownFn","bindLabel","bindValue","appearance","isOpen","items"],outputs:["bindLabelChange","bindValueChange","appearanceChange","isOpenChange","itemsChange","blur","focus","change","open","close","search","clear","add","remove","scroll","scrollToEnd"],exportAs:["ngSelect"]}],changeDetection:i0.ChangeDetectionStrategy.OnPush,encapsulation:i0.ViewEncapsulation.None})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormNgSelect,decorators:[{type:Component,args:[{selector:"aif-form-ng-select",standalone:!0,imports:[NgClass,ReactiveFormsModule,NgSelectModule],encapsulation:ViewEncapsulation.None,changeDetection:ChangeDetectionStrategy.OnPush,template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <ng-select\n class="custom-ng-select block w-full text-sm text-gray-900 dark:text-white bg-transparent appearance-none focus:outline-none focus:ring-0 peer"\n [class.has-error]="hasFieldError()"\n [class.readonly]="isReadonly()" (search)="onSearch($event)"\n [items]="items()" bindLabel="description" bindValue="value" notFoundText=""\n [readonly]="field()?.attr?.readonly" [searchable]="!isReadonly()" [clearable]="isClearable()"\n [tabIndex]="field()?.attr?.readonly ? -1 : 0" [formControlName]="field()?.name"\n [ngClass]="currentFieldClass()"\n (clear)="onClear()" appendTo="body">\n </ng-select>\n <label\n class="ng-select-floating-label absolute -top-2 left-2 inline-block rounded px-1 text-xs z-20 transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">\n {{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }\n </label>\n</div>\n',styles:['.custom-ng-select .ng-select-container{border:none!important;border-radius:.375rem!important;min-height:2.625rem;box-shadow:inset 0 0 0 1px #e2e8f0!important;background-color:#f8fafc80!important;transition:box-shadow .15s ease,background-color .15s ease,color .15s ease!important}.custom-ng-select:hover .ng-select-container{box-shadow:inset 0 0 0 1px #4f46e54d!important}.custom-ng-select .ng-value-container{padding:0 .75rem!important;align-items:center!important}.ng-select-floating-label{box-shadow:0 0 0 4px #fff}.custom-ng-select .ng-value-container .ng-placeholder{color:#9ca3af!important}.custom-ng-select .ng-value-container .ng-value{display:flex!important;align-items:center!important;margin-top:0!important;margin-bottom:0!important}.custom-ng-select .ng-clear-wrapper{opacity:1!important;color:#94a3b8;width:1.5rem;min-width:1.5rem;height:1.5rem;justify-content:center;padding-right:.5rem!important;transition:opacity .15s ease,color .15s ease!important}.custom-ng-select .ng-clear-wrapper,.custom-ng-select .ng-arrow-wrapper{display:flex;align-items:center}.custom-ng-select .ng-clear-wrapper:hover,.custom-ng-select .ng-clear-wrapper:focus{color:#e2e8f0}.custom-ng-select .ng-clear-wrapper:before{content:"\\d7";display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;color:inherit;font-size:1.125rem;line-height:1;font-weight:500}.custom-ng-select .ng-clear-wrapper .ng-clear,.custom-ng-select.readonly .ng-clear-wrapper,.custom-ng-select.ng-select-disabled .ng-clear-wrapper{display:none!important}.custom-ng-select .ng-input{top:50%!important;left:.75rem!important;right:2.5rem!important;width:auto!important;transform:translateY(-50%)!important}.dark .custom-ng-select .ng-select-container{box-shadow:inset 0 0 0 1px #33415580!important;background-color:#1e293b80!important}.dark .custom-ng-select:hover .ng-select-container{box-shadow:inset 0 0 0 1px #818cf859!important}.dark .ng-select-floating-label{box-shadow:0 0 0 4px #111827}.custom-ng-select.ng-select-focused .ng-select-container{box-shadow:inset 0 0 0 2px #6366f1f2,0 0 0 1px #6366f124!important}.dark .custom-ng-select.ng-select-focused .ng-select-container{box-shadow:inset 0 0 0 2px #818cf8f2,0 0 0 1px #818cf833!important}.custom-ng-select.has-error .ng-select-container{box-shadow:inset 0 0 0 1px #f43f5e!important}.custom-ng-select.has-error.ng-select-focused .ng-select-container{box-shadow:inset 0 0 0 1px #f43f5e,0 0 0 1px #f43f5e24!important}.custom-ng-select.readonly .ng-select-container{background-color:#f3f4f6!important}.dark .custom-ng-select.readonly .ng-select-container{background-color:#374151!important}.custom-ng-select.readonly .ng-value-container,.custom-ng-select.readonly .ng-arrow-wrapper,.custom-ng-select.readonly .ng-clear-wrapper{color:#94a3b8!important}.ng-dropdown-panel{background-color:#fff;z-index:9999!important;border:1px solid #e5e7eb;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;border-radius:.375rem}.ng-dropdown-panel .ng-option{padding:.5rem 1rem;cursor:pointer;color:#111827;background-color:#fff}.ng-dropdown-panel .ng-option:hover,.ng-dropdown-panel .ng-option.ng-option-marked{background-color:#f3f4f6}.dark .ng-dropdown-panel{background-color:#1f2937!important;border-color:#374151}.dark .ng-dropdown-panel .ng-option{background-color:#1f2937;color:#f9fafb}.dark .ng-dropdown-panel .ng-option:hover,.dark .ng-dropdown-panel .ng-option.ng-option-marked{background-color:#374151}\n']}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormTextarea{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);field=computed(()=>this.fd(),...ngDevMode?[{debugName:"field"}]:[]);formCtx=computed(()=>this.aifForm(),...ngDevMode?[{debugName:"formCtx"}]:[]);isRequired=computed(()=>{const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.isFieldRequired(e)},...ngDevMode?[{debugName:"isRequired"}]:[]);isReadonly=computed(()=>!(!this.field()?.attr?.readonly&&!this.field()?.attr?.disabled),...ngDevMode?[{debugName:"isReadonly"}]:[]);hasFieldError(){const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.hasError(e)}currentFieldClass(){const e=this.field(),t=this.formCtx();return e&&t?t.fieldClass(e):{}}validateInput(e){const t=this.fd();if(!t?.attr?.readonly&&!t?.attr?.disabled&&t?.attr){let n=e.key;if(t.attr.uppercase){const i=e.target;n=n.toUpperCase(),i.value=i.value.toUpperCase(),this.aifForm().field[t.name].value=i.value,this.aifForm().form.get(t.name)?.setValue(i.value)}if(t.attr.pattern){let i=t.attr.pattern;new RegExp(i).test(n)||"Backspace"===n||"Tab"===n||"Enter"===n||e.preventDefault()}}}validateField(e){const t=this.fd();if(!t?.attr?.readonly&&!t?.attr?.disabled&&t?.attr){let n=e.target;const i=n.selectionStart||0;if(t.attr.uppercase&&(n.value=n.value.toUpperCase(),this.aifForm().field[t.name].value=n.value,this.aifForm().form.get(t.name)?.setValue(n.value)),t.attr.pattern){let e=t.attr.pattern,i=new RegExp(e);if(n.value&&!i.test(n.value)){const e=n.value.split("").filter(e=>i.test(e)).join("");n.value=e.trim()}}n.setSelectionRange(i,i)}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormTextarea,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormTextarea,isStandalone:!0,selector:"aif-form-textarea",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <textarea\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 px-3 text-gray-900 dark:text-white bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset sm:text-sm sm:leading-6 placeholder:text-gray-400 appearance-none transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [maxlength]="field()?.attr?.maxlength" [class.bg-gray-100]="isReadonly()"\n [class.dark:bg-gray-700]="isReadonly()" [readonly]="field()?.attr?.readonly" [style]="field()?.attr?.style" [id]="field()?.name"\n [rows]="field()?.attr?.rows || 3" [formControlName]="field()?.name" placeholder=" "\n (keypress)="validateInput($event)" (input)="validateField($event)"></textarea>\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">{{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }</label>\n</div>\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.MaxLengthValidator,selector:"[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",inputs:["maxlength"]},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormTextarea,decorators:[{type:Component,args:[{selector:"aif-form-textarea",standalone:!0,imports:[ReactiveFormsModule],template:'<div class="relative z-0 w-full mb-5 group" [formGroup]="formCtx().form">\n <textarea\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 px-3 text-gray-900 dark:text-white bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset sm:text-sm sm:leading-6 placeholder:text-gray-400 appearance-none transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [maxlength]="field()?.attr?.maxlength" [class.bg-gray-100]="isReadonly()"\n [class.dark:bg-gray-700]="isReadonly()" [readonly]="field()?.attr?.readonly" [style]="field()?.attr?.style" [id]="field()?.name"\n [rows]="field()?.attr?.rows || 3" [formControlName]="field()?.name" placeholder=" "\n (keypress)="validateInput($event)" (input)="validateField($event)"></textarea>\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">{{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }</label>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormDate{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);field=computed(()=>this.fd(),...ngDevMode?[{debugName:"field"}]:[]);formCtx=computed(()=>this.aifForm(),...ngDevMode?[{debugName:"formCtx"}]:[]);isRequired=computed(()=>{const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.isFieldRequired(e)},...ngDevMode?[{debugName:"isRequired"}]:[]);isReadonly=computed(()=>!(!this.field()?.attr?.readonly&&!this.field()?.attr?.disabled),...ngDevMode?[{debugName:"isReadonly"}]:[]);nativeType=computed(()=>{const e=this.field();if(!e)return"text";const t="object"==typeof e.type?e.type.type:e.type;return"datetime"===t?"datetime-local":t},...ngDevMode?[{debugName:"nativeType"}]:[]);timeType=computed(()=>{const e=this.field();if(!e)return!1;return"time"===("object"==typeof e.type?e.type.type:e.type)},...ngDevMode?[{debugName:"timeType"}]:[]);getNativeType(){return this.nativeType()}isTimeType(){return this.timeType()}hasFieldError(){const e=this.field(),t=this.formCtx();return!(!e||!t)&&t.hasError(e)}currentFieldClass(){const e=this.field(),t=this.formCtx();return e&&t?t.fieldClass(e):{}}openCalendar(e){if(!this.fd()?.attr?.readonly&&!this.fd()?.attr?.disabled)try{"function"==typeof e.showPicker&&e.showPicker()}catch(t){e.focus()}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormDate,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormDate,isStandalone:!0,selector:"aif-form-date",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="relative z-0 w-full mb-5 group cursor-pointer" [class.cursor-not-allowed]="field()?.attr?.disabled" [formGroup]="formCtx().form"\n (click)="openCalendar(dateInput)">\n <input #dateInput [type]="nativeType()" [style]="field()?.attr?.style" [class.bg-gray-100]="isReadonly()"\n [class.dark:bg-gray-700]="isReadonly()"\n [readonly]="field()?.attr?.readonly"\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 pl-3 pr-10 text-gray-900 dark:text-white bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset placeholder:text-gray-400 sm:text-sm sm:leading-6 cursor-pointer [&::-webkit-calendar-picker-indicator]:opacity-0 [&::-webkit-calendar-picker-indicator]:absolute [&::-webkit-calendar-picker-indicator]:right-0 [&::-webkit-calendar-picker-indicator]:w-full [&::-webkit-calendar-picker-indicator]:h-full [&::-webkit-calendar-picker-indicator]:cursor-pointer transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [id]="field()?.name" [formControlName]="field()?.name" [placeholder]="field()?.label"\n >\n\n \x3c!-- Custom Icon overlay --\x3e\n <div\n class="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-gray-500 group-hover:text-indigo-600 group-focus-within:text-indigo-600 dark:group-hover:text-indigo-400 dark:group-focus-within:text-indigo-400 transition-colors">\n @if (isTimeType()) {\n \x3c!-- Clock Icon --\x3e\n <svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />\n </svg>\n } @else {\n \x3c!-- Calendar Icon --\x3e\n <svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />\n </svg>\n }\n </div>\n\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">\n {{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }</label>\n</div>\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormDate,decorators:[{type:Component,args:[{selector:"aif-form-date",standalone:!0,imports:[ReactiveFormsModule],template:'<div class="relative z-0 w-full mb-5 group cursor-pointer" [class.cursor-not-allowed]="field()?.attr?.disabled" [formGroup]="formCtx().form"\n (click)="openCalendar(dateInput)">\n <input #dateInput [type]="nativeType()" [style]="field()?.attr?.style" [class.bg-gray-100]="isReadonly()"\n [class.dark:bg-gray-700]="isReadonly()"\n [readonly]="field()?.attr?.readonly"\n class="block w-full min-h-[2.625rem] rounded-md border-0 py-2 pl-3 pr-10 text-gray-900 dark:text-white bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset placeholder:text-gray-400 sm:text-sm sm:leading-6 cursor-pointer [&::-webkit-calendar-picker-indicator]:opacity-0 [&::-webkit-calendar-picker-indicator]:absolute [&::-webkit-calendar-picker-indicator]:right-0 [&::-webkit-calendar-picker-indicator]:w-full [&::-webkit-calendar-picker-indicator]:h-full [&::-webkit-calendar-picker-indicator]:cursor-pointer transition-all"\n [class.ring-rose-500]="hasFieldError()"\n [class.dark:ring-rose-500]="hasFieldError()"\n [class.hover:ring-rose-500]="hasFieldError()"\n [class.focus:ring-rose-500]="hasFieldError()"\n [class.ring-slate-200]="!hasFieldError()"\n [class.dark:ring-slate-700/50]="!hasFieldError()"\n [class.hover:ring-indigo-600/30]="!hasFieldError()"\n [class.dark:hover:ring-indigo-400/35]="!hasFieldError()"\n [class.focus:ring-2]="true"\n [class.focus:ring-inset]="true"\n [class.focus:ring-indigo-500]="!hasFieldError()"\n [class.focus:outline-none]="true"\n [class.focus-visible:outline-none]="true"\n [style.color]="field()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [id]="field()?.name" [formControlName]="field()?.name" [placeholder]="field()?.label"\n >\n\n \x3c!-- Custom Icon overlay --\x3e\n <div\n class="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-gray-500 group-hover:text-indigo-600 group-focus-within:text-indigo-600 dark:group-hover:text-indigo-400 dark:group-focus-within:text-indigo-400 transition-colors">\n @if (isTimeType()) {\n \x3c!-- Clock Icon --\x3e\n <svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />\n </svg>\n } @else {\n \x3c!-- Calendar Icon --\x3e\n <svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />\n </svg>\n }\n </div>\n\n <label [for]="field()?.name"\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="hasFieldError()"\n [class.dark:text-rose-400]="hasFieldError()"\n [class.text-gray-400]="!hasFieldError()"\n [class.dark:text-slate-400]="!hasFieldError()"\n [class.group-hover:text-indigo-600]="!hasFieldError()"\n [class.group-focus-within:text-indigo-600]="!hasFieldError()"\n [class.dark:group-hover:text-indigo-400]="!hasFieldError()"\n [class.dark:group-focus-within:text-indigo-400]="!hasFieldError()">\n {{ field()?.label }}@if(isRequired()) { <span class="ml-0.5 text-rose-400">*</span> }</label>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormOptions{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);items=computed(()=>{const e=this.aifForm(),t=this.fd();return e&&t?.name?e.catOptions(t.name):[]},...ngDevMode?[{debugName:"items"}]:[]);static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormOptions,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormOptions,isStandalone:!0,selector:"aif-form-options",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="group flex w-full flex-wrap items-start gap-x-4 gap-y-2 rounded-md border-0 px-3 pt-3 pb-2 text-gray-900 bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset ring-slate-200 hover:ring-indigo-600/30 group-focus-within:ring-2 group-focus-within:ring-inset group-focus-within:ring-indigo-500 dark:ring-slate-700/50 dark:hover:ring-indigo-400/35 dark:group-focus-within:ring-indigo-400 sm:text-sm sm:leading-6 min-h-[2.625rem] relative mb-5 transition-all"\n [class.opacity-70]="fd()?.attr?.disabled"\n [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n [class.dark:bg-gray-800]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n [class.pointer-events-none]="fd()?.attr?.readonly"\n [ngClass]="aifForm().fieldClass(fd())" [formGroup]="aifForm().form">\n @if(items().length > 0) {\n @for (option of items(); track $index; let i = $index) {\n <div class="inline-flex min-w-0 max-w-full items-center sm:w-auto">\n <input class="h-4 w-4 border-gray-300 text-indigo-600 focus:ring-indigo-600" type="radio"\n [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled" [formControlName]="fd().name" [value]="option.value"\n [attr.tabindex]="fd()?.attr?.readonly ? -1 : null" [name]="fd().name" [id]="fd().name+i" (change)="aifForm().actionChange(fd())">\n <label class="ml-2 block break-words text-sm text-gray-900 dark:text-gray-300 mt-0"\n [style.color]="fd()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [class.text-gray-500]="fd()?.attr?.disabled" [for]="fd().name+i">{{option.description}}</label>\n </div>\n }\n }\n <label\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="aifForm().hasError(fd())"\n [class.dark:text-rose-400]="aifForm().hasError(fd())"\n [class.text-gray-400]="!aifForm().hasError(fd())"\n [class.dark:text-slate-400]="!aifForm().hasError(fd())"\n [class.group-hover:text-indigo-600]="!aifForm().hasError(fd())"\n [class.group-focus-within:text-indigo-600]="!aifForm().hasError(fd())"\n [class.dark:group-hover:text-indigo-400]="!aifForm().hasError(fd())"\n [class.dark:group-focus-within:text-indigo-400]="!aifForm().hasError(fd())">{{ fd().label }}</label>\n</div>\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.RadioControlValueAccessor,selector:"input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]",inputs:["name","formControlName","value"]},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}],changeDetection:i0.ChangeDetectionStrategy.OnPush})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormOptions,decorators:[{type:Component,args:[{selector:"aif-form-options",standalone:!0,imports:[NgClass,ReactiveFormsModule],changeDetection:ChangeDetectionStrategy.OnPush,template:'<div class="group flex w-full flex-wrap items-start gap-x-4 gap-y-2 rounded-md border-0 px-3 pt-3 pb-2 text-gray-900 bg-slate-50/50 dark:bg-slate-800/50 shadow-sm ring-1 ring-inset ring-slate-200 hover:ring-indigo-600/30 group-focus-within:ring-2 group-focus-within:ring-inset group-focus-within:ring-indigo-500 dark:ring-slate-700/50 dark:hover:ring-indigo-400/35 dark:group-focus-within:ring-indigo-400 sm:text-sm sm:leading-6 min-h-[2.625rem] relative mb-5 transition-all"\n [class.opacity-70]="fd()?.attr?.disabled"\n [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n [class.dark:bg-gray-800]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n [class.pointer-events-none]="fd()?.attr?.readonly"\n [ngClass]="aifForm().fieldClass(fd())" [formGroup]="aifForm().form">\n @if(items().length > 0) {\n @for (option of items(); track $index; let i = $index) {\n <div class="inline-flex min-w-0 max-w-full items-center sm:w-auto">\n <input class="h-4 w-4 border-gray-300 text-indigo-600 focus:ring-indigo-600" type="radio"\n [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled" [formControlName]="fd().name" [value]="option.value"\n [attr.tabindex]="fd()?.attr?.readonly ? -1 : null" [name]="fd().name" [id]="fd().name+i" (change)="aifForm().actionChange(fd())">\n <label class="ml-2 block break-words text-sm text-gray-900 dark:text-gray-300 mt-0"\n [style.color]="fd()?.attr?.readonly ? \'rgb(148 163 184)\' : null"\n [class.text-gray-500]="fd()?.attr?.disabled" [for]="fd().name+i">{{option.description}}</label>\n </div>\n }\n }\n <label\n class="absolute -top-2 left-2 inline-block rounded px-1 text-xs transition-colors bg-slate-900 dark:bg-slate-900"\n [class.text-rose-400]="aifForm().hasError(fd())"\n [class.dark:text-rose-400]="aifForm().hasError(fd())"\n [class.text-gray-400]="!aifForm().hasError(fd())"\n [class.dark:text-slate-400]="!aifForm().hasError(fd())"\n [class.group-hover:text-indigo-600]="!aifForm().hasError(fd())"\n [class.group-focus-within:text-indigo-600]="!aifForm().hasError(fd())"\n [class.dark:group-hover:text-indigo-400]="!aifForm().hasError(fd())"\n [class.dark:group-focus-within:text-indigo-400]="!aifForm().hasError(fd())">{{ fd().label }}</label>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormSwitch{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);checked=signal(!1,...ngDevMode?[{debugName:"checked"}]:[]);control=computed(()=>{const e=this.fd()?.name,t=this.aifForm()?.form;return e&&t?t.get(e):null},...ngDevMode?[{debugName:"control"}]:[]);isDisabled=computed(()=>!(!this.fd()?.attr?.disabled&&!this.fd()?.attr?.readonly),...ngDevMode?[{debugName:"isDisabled"}]:[]);constructor(){effect(e=>{const t=this.control();if(!t)return void this.checked.set(!1);this.checked.set(!!t.value);const n=t.valueChanges.subscribe(e=>this.checked.set(!!e));e(()=>n.unsubscribe())})}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormSwitch,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifFormSwitch,isStandalone:!0,selector:"aif-form-switch",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="mb-5 flex items-center" [formGroup]="aifForm().form">\n <div class="relative mr-3 inline-flex items-center">\n <input\n class="peer sr-only"\n type="checkbox"\n role="switch"\n [id]="fd().name"\n [formControlName]="fd().name"\n >\n <label\n [for]="fd().name"\n class="relative block h-7 w-12 rounded-full transition-colors duration-200 cursor-pointer"\n [class.bg-slate-300]="!checked()"\n [class.dark:bg-slate-600]="!checked()"\n [class.bg-indigo-600]="checked()"\n [class.dark:bg-indigo-500]="checked()"\n [class.opacity-60]="isDisabled()"\n [class.cursor-not-allowed]="isDisabled()"\n >\n <span\n class="absolute top-0.5 left-0.5 h-6 w-6 rounded-full bg-white shadow-sm ring-1 ring-slate-200 transition-transform duration-200"\n [ngClass]="checked() ? \'translate-x-5\' : \'translate-x-0\'"\n ></span>\n </label>\n </div>\n <label class="text-sm font-medium text-gray-900 dark:text-gray-300" [for]="fd().name">{{ fd().label }}</label>\n</div>\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.CheckboxControlValueAccessor,selector:"input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormSwitch,decorators:[{type:Component,args:[{selector:"aif-form-switch",standalone:!0,imports:[ReactiveFormsModule,NgClass],template:'<div class="mb-5 flex items-center" [formGroup]="aifForm().form">\n <div class="relative mr-3 inline-flex items-center">\n <input\n class="peer sr-only"\n type="checkbox"\n role="switch"\n [id]="fd().name"\n [formControlName]="fd().name"\n >\n <label\n [for]="fd().name"\n class="relative block h-7 w-12 rounded-full transition-colors duration-200 cursor-pointer"\n [class.bg-slate-300]="!checked()"\n [class.dark:bg-slate-600]="!checked()"\n [class.bg-indigo-600]="checked()"\n [class.dark:bg-indigo-500]="checked()"\n [class.opacity-60]="isDisabled()"\n [class.cursor-not-allowed]="isDisabled()"\n >\n <span\n class="absolute top-0.5 left-0.5 h-6 w-6 rounded-full bg-white shadow-sm ring-1 ring-slate-200 transition-transform duration-200"\n [ngClass]="checked() ? \'translate-x-5\' : \'translate-x-0\'"\n ></span>\n </label>\n </div>\n <label class="text-sm font-medium text-gray-900 dark:text-gray-300" [for]="fd().name">{{ fd().label }}</label>\n</div>\n'}]}],ctorParameters:()=>[],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormCheckbox{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormCheckbox,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.1.0",version:"21.1.1",type:AifFormCheckbox,isStandalone:!0,selector:"aif-form-checkbox",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="mb-5 flex items-center" [formGroup]="aifForm().form">\n <input class="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600" type="checkbox"\n [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled" [attr.tabindex]="fd()?.attr?.readonly ? -1 : null" [formControlName]="fd().name" [id]="fd().name">\n <label class="ml-2 block text-sm text-gray-900 dark:text-gray-300" [style.color]="fd()?.attr?.readonly ? \'rgb(148 163 184)\' : null" [class.text-gray-500]="fd()?.attr?.disabled"\n [for]="fd().name">\n {{ fd().label }}\n </label>\n</div>\n',dependencies:[{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.CheckboxControlValueAccessor,selector:"input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormCheckbox,decorators:[{type:Component,args:[{selector:"aif-form-checkbox",standalone:!0,imports:[ReactiveFormsModule],template:'<div class="mb-5 flex items-center" [formGroup]="aifForm().form">\n <input class="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600" type="checkbox"\n [class.bg-gray-100]="fd()?.attr?.readonly || fd()?.attr?.disabled" [attr.tabindex]="fd()?.attr?.readonly ? -1 : null" [formControlName]="fd().name" [id]="fd().name">\n <label class="ml-2 block text-sm text-gray-900 dark:text-gray-300" [style.color]="fd()?.attr?.readonly ? \'rgb(148 163 184)\' : null" [class.text-gray-500]="fd()?.attr?.disabled"\n [for]="fd().name">\n {{ fd().label }}\n </label>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormFile{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);uploadLabel=signal(lang(["form","file.upload"])||"Subir archivo",...ngDevMode?[{debugName:"uploadLabel"}]:[]);fileInputDoc;cdr=inject(ChangeDetectorRef);formatBytes(e,t=2){if(0===e)return"0 Bytes";const n=t<0?0:t,i=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,i)).toFixed(n))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][i]}getIconForExtension(e){const t=e?.toLowerCase()||"";return["pdf","doc","docx","xls","xlsx","ppt","pptx","zip","rar","csv","txt","xml","json"].includes(t)?`aif-${t}-ico`:"aif-file-ico"}getFileIcon(){const e=this.fd();if(e?.attr?.icon)return e.attr.icon;const t=this.aifForm().field[e.name];return t?._file?.extension?"aif text-6xl text-indigo-500 "+this.getIconForExtension(t._file.extension):"aif aif-file-ico text-6xl text-slate-400 group-hover:text-indigo-500 transition-colors"}onFileSelect(e){const t=e.target,n=t.files?.[0]||null,i=this.fd().name,a=this.aifForm().form,s=this.aifForm().field;if(n){s[i]||(s[i]={}),s[i].file=n,s[i].description=n.name;const e=a.get(i);if(e?.setValue(n,{emitEvent:!1}),s[i]._was_required&&e&&(e.removeValidators(Validators.required),e.updateValueAndValidity()),n.type&&n.type.startsWith("image/")){const e=new FileReader;e.onload=e=>{const t=e.target.result;s[i].image=t,s[i]._exists=!0;const o=new Image;o.onload=()=>{const e={name:n.name,size:n.size,size_label:this.formatBytes(n.size),type:n.type,width:o.naturalWidth,height:o.naturalHeight,resolution:`${o.naturalWidth}x${o.naturalHeight}`};s[i].details=e;const t=`_${i}_detail`;a.contains(t)||a.addControl(t,new FormControl("")),a.get(t)?.setValue(JSON.stringify(e)),this.cdr.markForCheck()},o.src=t,this.cdr.markForCheck()},e.readAsDataURL(n)}else{let e=n.name?n.name.split(".").pop()?.toLowerCase():"file";s[i].details={name:n.name,size:n.size,size_label:this.formatBytes(n.size),type:n.type,extension:e},s[i]._file={extension:e,description:n.name},s[i]._exists=!0,this.cdr.markForCheck()}}}onFileRemove(){const e=this.fd().name,t=this.aifForm().form,n=this.aifForm().field,i=t.get(e);i&&i.setValue(null,{emitEvent:!1});const a=`_${e}_detail`;t.contains(a)&&t.get(a)?.setValue(null,{emitEvent:!1}),n[e]&&(n[e].image=null,n[e].file=null,n[e].description=null,n[e].details=null,n[e]._exists=!1,n[e]._file=null,n[e]._was_required&&i&&(i.addValidators(Validators.required),i.updateValueAndValidity())),this.cdr.markForCheck()}onPdfPreview(){const e=this.fd();if(e){let t="";const n=this.aifForm().field[e.name];n?.file?t=URL.createObjectURL(n.file):n?._value&&(t=n._value,t.startsWith("http")||(t=n._value.replace("//","/"),t=env("storage")+t)),t&&window.open(t,"_blank")}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormFile,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormFile,isStandalone:!0,selector:"aif-form-file",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"fileInputDoc",first:!0,predicate:["fileInputDoc"],descendants:!0}],ngImport:i0,template:'<div class="p-4 mb-4 text-sm text-gray-800 rounded-lg bg-gray-50 dark:bg-gray-800 dark:text-gray-300" role="alert"\n [ngClass]="aifForm().fieldClass(fd())" [formGroup]="aifForm().form">\n <div class="flex items-center justify-between">\n <a href="javascript:void(0);" (click)="onPdfPreview()"\n class="text-indigo-600 hover:text-indigo-900">\n Preview\n </a>\n @if (aifForm().field[fd().name]?.image && aifForm().field[fd().name]?.description !=\n aifForm().field[fd().name]?._file?.description) {\n <button type="button"\n class="ml-auto -mx-1.5 -my-1.5 bg-gray-50 text-gray-500 rounded-lg focus:ring-2 focus:ring-gray-400 p-1.5 hover:bg-gray-200 inline-flex"\n aria-label="Close" (click)="onFileRemove()">\n <span class="sr-only">Remove</span>\n <svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">\n <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6" />\n </svg>\n </button>\n }\n </div>\n <div (click)="!fd()?.attr?.readonly && !fd()?.attr?.disabled && fileInputDoc.click()" [class.opacity-50]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n class="flex justify-center items-center mt-2 cursor-pointer border-2 border-dashed border-gray-300 dark:border-gray-600 rounded-md p-4 hover:border-indigo-500 dark:hover:border-indigo-400 group">\n <div class="text-center">\n <input type="file" (change)="onFileSelect($event)" style="display: none" #fileInputDoc\n [disabled]="fd()?.attr?.disabled"\n [id]="fd().name" />\n\n @if (aifForm().field[fd().name]?.image || fd()?.attr?.image) {\n <img class="mx-auto h-12 w-auto object-contain mb-2"\n [src]="aifForm().field[fd().name]?.image || fd()?.attr?.image"\n [alt]="fd().name" />\n } @else {\n <i [class]="getFileIcon() + \' mb-2 block\'"></i>\n }\n\n <p class="mt-1 text-sm text-gray-600">{{aifForm().field[fd().name]?.image ?\n aifForm().field[fd().name]?.description: (fd().label || uploadLabel())}}\n </p>\n </div>\n </div>\n</div>\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormFile,decorators:[{type:Component,args:[{selector:"aif-form-file",standalone:!0,imports:[NgClass,ReactiveFormsModule],template:'<div class="p-4 mb-4 text-sm text-gray-800 rounded-lg bg-gray-50 dark:bg-gray-800 dark:text-gray-300" role="alert"\n [ngClass]="aifForm().fieldClass(fd())" [formGroup]="aifForm().form">\n <div class="flex items-center justify-between">\n <a href="javascript:void(0);" (click)="onPdfPreview()"\n class="text-indigo-600 hover:text-indigo-900">\n Preview\n </a>\n @if (aifForm().field[fd().name]?.image && aifForm().field[fd().name]?.description !=\n aifForm().field[fd().name]?._file?.description) {\n <button type="button"\n class="ml-auto -mx-1.5 -my-1.5 bg-gray-50 text-gray-500 rounded-lg focus:ring-2 focus:ring-gray-400 p-1.5 hover:bg-gray-200 inline-flex"\n aria-label="Close" (click)="onFileRemove()">\n <span class="sr-only">Remove</span>\n <svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">\n <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6" />\n </svg>\n </button>\n }\n </div>\n <div (click)="!fd()?.attr?.readonly && !fd()?.attr?.disabled && fileInputDoc.click()" [class.opacity-50]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n class="flex justify-center items-center mt-2 cursor-pointer border-2 border-dashed border-gray-300 dark:border-gray-600 rounded-md p-4 hover:border-indigo-500 dark:hover:border-indigo-400 group">\n <div class="text-center">\n <input type="file" (change)="onFileSelect($event)" style="display: none" #fileInputDoc\n [disabled]="fd()?.attr?.disabled"\n [id]="fd().name" />\n\n @if (aifForm().field[fd().name]?.image || fd()?.attr?.image) {\n <img class="mx-auto h-12 w-auto object-contain mb-2"\n [src]="aifForm().field[fd().name]?.image || fd()?.attr?.image"\n [alt]="fd().name" />\n } @else {\n <i [class]="getFileIcon() + \' mb-2 block\'"></i>\n }\n\n <p class="mt-1 text-sm text-gray-600">{{aifForm().field[fd().name]?.image ?\n aifForm().field[fd().name]?.description: (fd().label || uploadLabel())}}\n </p>\n </div>\n </div>\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}],fileInputDoc:[{type:ViewChild,args:["fileInputDoc"]}]}});class AifFormImage{fd=input(...ngDevMode?[void 0,{debugName:"fd"}]:[]);aifForm=input(...ngDevMode?[void 0,{debugName:"aifForm"}]:[]);cdr=inject(ChangeDetectorRef);formatBytes(e,t=2){if(0===e)return"0 Bytes";const n=t<0?0:t,i=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,i)).toFixed(n))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][i]}onFileSelect(e){const t=e.target,n=t.files?.[0]||null,i=this.fd().name,a=this.aifForm().form,s=this.aifForm().field;if(n){s[i]||(s[i]={}),s[i].file=n,s[i].description=n.name;const e=a.get(i);if(e?.setValue(n,{emitEvent:!1}),s[i]._was_required&&e&&(e.removeValidators(Validators.required),e.updateValueAndValidity()),"image"===s[i].control_type||n.type&&n.type.startsWith("image/")){const e=new FileReader;e.onload=e=>{const t=e.target.result;s[i].image=t,s[i]._exists=!0;const o=new Image;o.onload=()=>{const e={name:n.name,size:n.size,size_label:this.formatBytes(n.size),type:n.type,width:o.naturalWidth,height:o.naturalHeight,resolution:`${o.naturalWidth}x${o.naturalHeight}`};s[i].details=e;const t=`_${i}_detail`;a.contains(t)||a.addControl(t,new FormControl("")),a.get(t)?.setValue(JSON.stringify(e)),this.cdr.markForCheck()},o.src=t,this.cdr.markForCheck()},e.readAsDataURL(n)}}}onFileRemove(){const e=this.fd().name,t=this.aifForm().form,n=this.aifForm().field,i=t.get(e);i&&i.setValue(null,{emitEvent:!1});const a=`_${e}_detail`;t.contains(a)&&t.get(a)?.setValue(null,{emitEvent:!1}),n[e]&&(n[e].image=null,n[e].file=null,n[e].description=null,n[e].details=null,n[e]._exists=!1,n[e]._file=null,n[e]._was_required&&i&&(i.addValidators(Validators.required),i.updateValueAndValidity())),this.cdr.markForCheck()}onPreviewImage(){const e=this.fd();if(!e?.name)return;const t=this.aifForm().field[e.name];let n="";if(t?.file instanceof File){n=URL.createObjectURL(t.file);const e=window.open(n,"_blank");return void(e?e.addEventListener("beforeunload",()=>URL.revokeObjectURL(n),{once:!0}):URL.revokeObjectURL(n))}"string"==typeof t?.image&&t.image?n=t.image:"string"==typeof t?._value&&t._value&&(n=t._value),n&&window.open(n,"_blank")}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormImage,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormImage,isStandalone:!0,selector:"aif-form-image",inputs:{fd:{classPropertyName:"fd",publicName:"fd",isSignal:!0,isRequired:!1,transformFunction:null},aifForm:{classPropertyName:"aifForm",publicName:"aifForm",isSignal:!0,isRequired:!1,transformFunction:null}},ngImport:i0,template:'<div class="p-4 mb-4 text-sm rounded-lg bg-slate-50 dark:bg-slate-800/50 border border-slate-200 dark:border-slate-700/50"\n [ngClass]="aifForm().fieldClass(fd())" [formGroup]="aifForm().form">\n \n <input accept="image/*" type="file" (change)="onFileSelect($event)"\n style="display: none" #fileInput [id]="fd().name" />\n\n @if (aifForm().field[fd().name]?.image) {\n <div class="flex items-center gap-4">\n \x3c!-- Thumbnail --\x3e\n <div class="flex-shrink-0">\n <img [src]="aifForm().field[fd().name]?.image" \n class="h-16 w-16 object-cover rounded-lg shadow-sm border border-slate-200 dark:border-slate-700" \n [alt]="fd().name" />\n </div>\n\n \x3c!-- Info --\x3e\n <div class="flex-grow min-w-0">\n <h4 class="text-sm font-semibold text-slate-800 dark:text-slate-100 truncate">\n {{ aifForm().field[fd().name]?.description }}\n </h4>\n <div class="flex flex-wrap gap-x-3 gap-y-1 mt-1 text-xs text-slate-500 dark:text-slate-400">\n <span>{{ aifForm().field[fd().name]?.details?.size_label }}</span>\n <span class="opacity-30">|</span>\n <span>{{ aifForm().field[fd().name]?.details?.type }}</span>\n @if (aifForm().field[fd().name]?.details?.resolution) {\n <span class="opacity-30">|</span>\n <span class="font-mono bg-slate-200/50 dark:bg-slate-700/50 px-1.5 rounded">\n [{{ aifForm().field[fd().name]?.details?.resolution }}]\n </span>\n }\n </div>\n </div>\n\n \x3c!-- Actions --\x3e\n <div class="flex flex-col gap-2">\n @if (!fd()?.attr?.readonly && !fd()?.attr?.disabled) {\n <button type="button" (click)="onFileRemove()"\n class="p-2 text-slate-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-full transition-colors"\n title="Quitar imagen">\n <i class="aif aif-trash-ico text-lg"></i>\n </button>\n }\n <button type="button" (click)="onPreviewImage()"\n class="p-2 text-slate-400 hover:text-indigo-500 hover:bg-indigo-50 dark:hover:bg-indigo-900/20 rounded-full transition-colors"\n title="Ver previsualización"\n aria-label="Ver previsualización">\n <i class="aif aif-zoom-in-ico text-lg"></i>\n </button>\n </div>\n </div>\n } @else {\n \x3c!-- Empty State --\x3e\n <div (click)="!fd()?.attr?.readonly && !fd()?.attr?.disabled && fileInput.click()" [class.opacity-50]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n class="group flex flex-col justify-center items-center py-8 cursor-pointer border-2 border-dashed border-slate-300 dark:border-slate-600 rounded-xl hover:border-indigo-500 dark:hover:border-indigo-400 hover:bg-indigo-50/30 dark:hover:bg-indigo-900/10 transition-all">\n @if (fd()?.attr?.image) {\n <img [src]="fd()?.attr?.image" [alt]="fd().name"\n class="h-16 w-auto object-contain opacity-40 group-hover:opacity-100 transition-opacity" />\n } @else {\n <i [class]="fd()?.attr?.icon || \'aif aif-image-ico text-6xl\'" \n class="text-slate-400 group-hover:text-indigo-500 transition-colors"></i>\n }\n <p class="mt-3 text-xs font-semibold text-slate-500 dark:text-slate-400 uppercase tracking-widest group-hover:text-indigo-600 transition-colors">\n {{ fd().label || fd()?.attr?.placeholder || \'Subir archivo\' }}\n </p>\n </div>\n }\n</div>\n',dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormImage,decorators:[{type:Component,args:[{selector:"aif-form-image",standalone:!0,imports:[NgClass,ReactiveFormsModule],template:'<div class="p-4 mb-4 text-sm rounded-lg bg-slate-50 dark:bg-slate-800/50 border border-slate-200 dark:border-slate-700/50"\n [ngClass]="aifForm().fieldClass(fd())" [formGroup]="aifForm().form">\n \n <input accept="image/*" type="file" (change)="onFileSelect($event)"\n style="display: none" #fileInput [id]="fd().name" />\n\n @if (aifForm().field[fd().name]?.image) {\n <div class="flex items-center gap-4">\n \x3c!-- Thumbnail --\x3e\n <div class="flex-shrink-0">\n <img [src]="aifForm().field[fd().name]?.image" \n class="h-16 w-16 object-cover rounded-lg shadow-sm border border-slate-200 dark:border-slate-700" \n [alt]="fd().name" />\n </div>\n\n \x3c!-- Info --\x3e\n <div class="flex-grow min-w-0">\n <h4 class="text-sm font-semibold text-slate-800 dark:text-slate-100 truncate">\n {{ aifForm().field[fd().name]?.description }}\n </h4>\n <div class="flex flex-wrap gap-x-3 gap-y-1 mt-1 text-xs text-slate-500 dark:text-slate-400">\n <span>{{ aifForm().field[fd().name]?.details?.size_label }}</span>\n <span class="opacity-30">|</span>\n <span>{{ aifForm().field[fd().name]?.details?.type }}</span>\n @if (aifForm().field[fd().name]?.details?.resolution) {\n <span class="opacity-30">|</span>\n <span class="font-mono bg-slate-200/50 dark:bg-slate-700/50 px-1.5 rounded">\n [{{ aifForm().field[fd().name]?.details?.resolution }}]\n </span>\n }\n </div>\n </div>\n\n \x3c!-- Actions --\x3e\n <div class="flex flex-col gap-2">\n @if (!fd()?.attr?.readonly && !fd()?.attr?.disabled) {\n <button type="button" (click)="onFileRemove()"\n class="p-2 text-slate-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-full transition-colors"\n title="Quitar imagen">\n <i class="aif aif-trash-ico text-lg"></i>\n </button>\n }\n <button type="button" (click)="onPreviewImage()"\n class="p-2 text-slate-400 hover:text-indigo-500 hover:bg-indigo-50 dark:hover:bg-indigo-900/20 rounded-full transition-colors"\n title="Ver previsualización"\n aria-label="Ver previsualización">\n <i class="aif aif-zoom-in-ico text-lg"></i>\n </button>\n </div>\n </div>\n } @else {\n \x3c!-- Empty State --\x3e\n <div (click)="!fd()?.attr?.readonly && !fd()?.attr?.disabled && fileInput.click()" [class.opacity-50]="fd()?.attr?.readonly || fd()?.attr?.disabled"\n class="group flex flex-col justify-center items-center py-8 cursor-pointer border-2 border-dashed border-slate-300 dark:border-slate-600 rounded-xl hover:border-indigo-500 dark:hover:border-indigo-400 hover:bg-indigo-50/30 dark:hover:bg-indigo-900/10 transition-all">\n @if (fd()?.attr?.image) {\n <img [src]="fd()?.attr?.image" [alt]="fd().name"\n class="h-16 w-auto object-contain opacity-40 group-hover:opacity-100 transition-opacity" />\n } @else {\n <i [class]="fd()?.attr?.icon || \'aif aif-image-ico text-6xl\'" \n class="text-slate-400 group-hover:text-indigo-500 transition-colors"></i>\n }\n <p class="mt-3 text-xs font-semibold text-slate-500 dark:text-slate-400 uppercase tracking-widest group-hover:text-indigo-600 transition-colors">\n {{ fd().label || fd()?.attr?.placeholder || \'Subir archivo\' }}\n </p>\n </div>\n }\n</div>\n'}]}],propDecorators:{fd:[{type:i0.Input,args:[{isSignal:!0,alias:"fd",required:!1}]}],aifForm:[{type:i0.Input,args:[{isSignal:!0,alias:"aifForm",required:!1}]}]}});class AifFormSubformEngine{host;constructor(e){this.host=e}subFormDynamicTable(e){const t=this.host.form_data[e.name];return t&&t.tableConfig||{}}subFormDynamicForm(e){const t=this.host.form_data[e.name];return t&&t.showForm&&t.config||{}}buildSubFormFields(e=[],t={}){return(e||[]).map(e=>{const n={};for(const i in e){const a=e[i];Array.isArray(a)?n[i]=a.map((e,n)=>2===n&&Object.prototype.hasOwnProperty.call(t,i)?t[i]:Array.isArray(e)?[...e]:e&&"object"==typeof e?{...e}:e):n[i]=a}return n})}rebuildSubFormTableConfig(e){const t=this.host.form_data[e];if(!t)return;const n=t.table||{},i=(n.navbar||[]).map(t=>({...t,type:"add"===t.type?"button":t.type,click:"function"==typeof t.click?t.click:"add"===t.type?()=>this.openSubForm(e):t.click}));t.tableConfig={header:n.header||{},navbar:i.length>0?{left:i,parent:this.host}:{},columns:n.columns||[],data:t.data||[],emptyMessage:n.emptyMessage||lang(["form","table.no_results"])||"Sin resultados",readonly:t.readonly,disabled:t.disabled,selection:n.selection||null,onSetData:n=>{t.data=n||[],this.host.setValueField(e,t.data),this.host.refreshSubFormView()},onAction:(t,n,i)=>this.onSubFormTableAction(e,t,n,i),onDelete:t=>this.removeSubFormRow(e,t)}}openSubForm(e,t=null,n=null){const i=this.host.form_data[e];if(!i||i.readonly||i.disabled)return;const a=i.table?.valid?.max_columns||i.attr?.max_columns;null===n&&a?.max&&(i.data||[]).length>=a.max||(i.editIndex="number"==typeof n?n:null,i.currentData=t?{...t}:null,i.showForm=!0,this.rebuildSubFormTableConfig(e),this.rebuildSubFormConfig(e),this.host.refreshSubFormView(),this.host.focusSubForm(e))}closeSubForm(e){const t=this.host.form_data[e];t&&(t.editIndex=null,t.currentData=null,t.showForm=!1,t.config={},this.rebuildSubFormTableConfig(e),this.host.refreshSubFormView())}rebuildSubFormConfig(e){const t=this.host.form_data[e];if(!t||!t.showForm)return;const n=null===t.editIndex?"Agregar":"Actualizar",i=t.buttons||{},a=i?.cancel?.action;t.config={fields:this.buildSubFormFields(t.fields||[],t.currentData||{}),readonly:t.readonly,disabled:t.disabled,embedded:!0,btn:{inner:!0,text:i?.save?.label||n},buttons:{...i,save:{...i?.save,label:i?.save?.label||n},cancel:{...i?.cancel,label:i?.cancel?.label||"Cancelar",action:(...t)=>{"function"==typeof a&&a(...t),this.closeSubForm(e)}}},onSubmit:(t,n)=>this.saveSubFormRow(e,t,n)}}onSubFormTableAction(e,t,n,i){"edit"!==t?"delete"!==t?"add"===t&&this.openSubForm(e):this.removeSubFormRow(e,i):this.openSubForm(e,n,i)}removeSubFormRow(e,t){const n=this.host.form_data[e];if(!n)return;const i=[...n.data||[]];i.splice(t,1),n.data=i,this.rebuildSubFormTableConfig(e),this.host.setValueField(e,i),this.host.refreshSubFormView()}loadSubFormData(e,t=[],n={}){const i=this.host.form_data[e];if(!i)return[];const a=Array.isArray(t)?t:[],s=a.map((e,t)=>"function"==typeof i.transformRow?i.transformRow(e,t,a):e).filter(e=>null!=e),o=n.append?[...i.data||[],...s]:s;return i.data=o,i.editIndex=null,i.currentData=null,i.showForm=!1,i.config={},this.rebuildSubFormTableConfig(e),this.host.setValueField(e,o),"function"==typeof i.onLoadData&&i.onLoadData(o,this.host,e),this.host.refreshSubFormView(),o}validateSubFormRow(e,t){const n=this.host.form_data[e];if(!n)return null;const i=(n.data||[]).filter((e,t)=>t!==n.editIndex),a=n.table?.valid?.duplicate||n.attr?.duplicate;if(a?.matches?.length){if(i.some(e=>a.matches.every(n=>{const i=`${e?.[n]??""}`.trim().toLowerCase(),a=`${t?.[n]??""}`.trim().toLowerCase();return i&&a&&i===a})))return a}return"function"==typeof n.validateRow?n.validateRow(t,i,n.editIndex):null}saveSubFormRow(e,t,n){const i=this.host.form_data[e];if(!i)return void n(!1,"No se pudo procesar el registro");const a=this.validateSubFormRow(e,t);if(a)return msg.error(a.title||"Registro duplicado",a.message||"El registro ya existe.",a.close||a.confirm||{text:"Cerrar"}),void n(!1,a.message||"El registro ya existe.");const s=[...i.data||[]],o=null!==i.editIndex&&i.editIndex>=0?i.editIndex:s.length,r="function"==typeof i.transformRow?i.transformRow(t,o,s):t;null!==i.editIndex&&i.editIndex>=0?s[i.editIndex]=r:s.push(r),i.data=s,this.rebuildSubFormTableConfig(e),this.host.setValueField(e,s),this.closeSubForm(e),this.host.refreshSubFormView(),n(!0,"")}}class AifFormActionsEngine{host;constructor(e){this.host=e}actionShowHide(e,t){const n=this.host.getFieldVisibility();if(n[t]!==e&&this.host.setFieldVisibility({...n,[t]:e}),e)return this.host.addControl(t),void(this.host.field[t]&&(this.host.field[t].attr=this.host.field[t].attr||{},this.host.field[t].attr.hidden=!1));this.host.delControl(t),this.host.field[t]&&(this.host.field[t].attr=this.host.field[t].attr||{},this.host.field[t].attr.hidden=!0)}actionReadonly(e,t){this.host.field[t]&&(this.host.field[t].attr=this.host.field[t].attr||{},this.host.field[t].attr.readonly=e)}actionDisabled(e,t){this.host.field[t]&&(this.host.field[t].attr=this.host.field[t].attr||{},this.host.field[t].attr.disabled=e),this.host.form&&this.host.form.contains(t)&&(e?this.host.form.get(t)?.disable({emitEvent:!1}):this.host.form.get(t)?.enable({emitEvent:!1}))}actionRequired(e,t){const n=this.host.form?.get(t);n&&(e?n.addValidators(Validators.required):n.removeValidators(Validators.required),n.updateValueAndValidity({emitEvent:!1}))}assignActions(e){this.host.change_data[e]&&this.setActionChange(e)}setActionChange(e){this.host.form.get(e)?.valueChanges.subscribe(t=>{this.changeRequest(this.host.change_data[e],t)})}changeRequest(e,t){if(null!=t&&""!==t)if("click"===e.type&&e.fn)e.fn(t,this.host);else if("cat"===e.type){const n=e.name,i=e.get,a=e.min;if(a&&"string"==typeof t&&t.length<a)return;let s=i;s=str_replace_field(s?.replace("{id}",t),this.host.field,this.host.form),loading(),rq_req().get(s).then(e=>{loading(!1),this.host.setCatalogEntry(n,e||[])}).catch(e=>{loading(!1),console.error(e)})}}preActions(){this.host.form.valueChanges.subscribe(e=>{this.applyDynamicActions(e)}),setTimeout(()=>this.applyDynamicActions(this.host.form.value));for(const e in this.host.change_data)this.setActionChange(e)}applyDynamicActions(e){for(const t in this.host.actions){const n=this.host.actions[t];if(n.show){const i=this.evalRule(n.show,e);this.actionShowHide(i,t)}if(n.hide){const i=this.evalRule(n.hide,e);this.actionShowHide(!i,t)}if(n.readonly){const i=this.evalRule(n.readonly,e);this.actionReadonly(i,t)}if(n.disabled){const i=this.evalRule(n.disabled,e);this.actionDisabled(i,t)}if(n.required){const i=this.evalRule(n.required,e);this.actionRequired(i,t)}}}evalRule(e,t){return!(!e||"object"!=typeof e)&&Object.keys(e).some(n=>{const i=e[n],a=t[n];return this.host.cmpValues(a,i,n)})}}class AifFormTableEngine{host;constructor(e){this.host=e}setTableData(e={},t=!1,n=!1){e.type=e.type||{},e.type.readonly=!(!e.attr?.readonly&&!t),e.type.disabled=!(!e.attr?.disabled&&!n),e.type.onSetData=t=>this.host.setValueField(e.name,t),this.host.table_data[e.name]={...e.type,data:e.type.data||e.value||[],value:e.value||null}}getTableData(e){return this.host.table_data[e.name]||{}}}class AifFormCatalogEngine{host;constructor(e){this.host=e}reset(){this.host.clearCatalogCache(),this.host.setCatalogState({...this.host._config?.cat||{}})}upCatalog(e={}){const t={...this.host.getCatalogState()||{}};for(const n in e)this.host._config.cat&&(this.host._config.cat[n]=e[n]),t[n]=e[n]||[];this.host.setCatalogState(t)}setCatalogEntry(e,t=[]){this.host._config.cat||(this.host._config.cat={}),this.host._config.cat[e]=t,this.host.updateCatalogState(n=>({...n,[e]:t}))}normalizeCatalogOption(e){if(null==e)return{value:e,description:""};if("object"!=typeof e||Array.isArray(e))return{value:e,description:`${e??""}`};const t=e.value??e.id??e.text??e.description??"",n=e.description??e.text??`${t??""}`;return{...e,value:t,description:n}}catOptions(e){const t=this.host.getCatalogState()?.[e],n=this.host.getCatalogCache();if(!t||0===t.length)return n.has(e)||n.set(e,[]),n.get(e);const i=t.map(e=>this.normalizeCatalogOption(e));return n.set(e,i),i}}function valid_SelectRequired(){return e=>{const t=e.value;return""===t||0===t||"0"===t?{select_required:!0}:null}}function valid_ValuesAllowed(e=[],t,n){return i=>{const a=i.value;if(t){const i="function"==typeof n?n(t):null;if(i&&i.file){const t=i.file?i.file.name:i._value;if(!t)return null;const n=t.split(".").pop().toLowerCase();if(-1===e.indexOf(n)&&-1===e.indexOf("."+n))return{allowed:!0}}}else if(-1===e.indexOf(a))return{allowed:!0};return null}}function valid_MaxSizeFile(e=1,t,n){return i=>{const a="function"==typeof n?n(t):null;if(a&&a.file&&a.file.size){const t=1024*e*1024;if(a.file.size>t)return{max_size:!0}}return null}}function valid_CheckedValidator(e){return!0!==e.value?{check_required:!0}:null}function valid_MinAgeValidator(e){return t=>{const n=new Date,i=new Date(t.value);let a=n.getFullYear()-i.getFullYear();const s=n.getMonth()-i.getMonth();return(s<0||0===s&&n.getDate()<i.getDate())&&a--,a>=e?null:{min_age:{value:t.value}}}}function valid_DistinctValidator(e){return t=>e!==t.value?null:{distinct:{value:t.value}}}function valid_interpretDate(e){const t=new Date;if("now"===e)return t;const n=e.match(/^(-?\d+)([dmy])$/);if(n){const e=parseInt(n[1],10);switch(n[2]){case"d":t.setDate(t.getDate()+e);break;case"m":t.setMonth(t.getMonth()+e);break;case"y":t.setFullYear(t.getFullYear()+e)}return t}return new Date(e)}function valid_DateRangeValidator(e={},t={}){return n=>{const i=new Date(n.value);if(e.min){let a=e.min;if("object"==typeof a&&a.field&&(a=t.getValueField(a.field)),"string"==typeof a){if(i<valid_interpretDate(a))return{date:{value:n.value}}}}if(e.max){let a=e.max;if("object"==typeof a&&a.field&&(a=t.getValueField(a.field)),"string"==typeof a){if(i>valid_interpretDate(a))return{date:{value:n.value}}}}return null}}function valid_interpretTime(e){const t=new Date;if("time"===e)return t;const n=e.match(/^(-?\d+)([hm])$/);if(n){const e=parseInt(n[1],10);switch(n[2]){case"h":t.setHours(t.getHours()+e);break;case"m":t.setMinutes(t.getMinutes()+e)}return t}const i=e.split(":");if(2===i.length)return t.setHours(parseInt(i[0],10),parseInt(i[1],10)),t;throw new Error("Formato de hora inválido")}function valid_createTimeFromDate(e){const t=new Date,n=e.split(":");if(n.length>=2){const e=parseInt(n[0],10),i=parseInt(n[1],10);return t.setHours(e,i,0,0),t}return null}function valid_TimeRangeValidator(e={},t={}){return n=>{if(!n.value)return null;const i=valid_createTimeFromDate(n.value);if(!i)return null;let a=!1;if(e.date){let s=e.date;if("object"==typeof s&&s.field&&s.value){const o=t.getValueField(s.field);if(o){const r=valid_interpretDate(s.value);if(a=0===date_compare(date_local(o),r),a){if(e.date.time&&"object"==typeof e.date.time){let a=e.date.time.min;if("object"==typeof a&&a.field&&(a=t.getValueField(a.field)),"string"==typeof a&&a){if(i<valid_interpretTime(a))return{time_date:{value:n.value}}}}if(e.date.time&&"object"==typeof e.date.time){let a=e.date.time.max;if("object"==typeof a&&a.field&&(a=t.getValueField(a.field)),"string"==typeof a&&a){if(i>valid_interpretTime(a))return{time_date:{value:n.value}}}}}}}}if(e.min){let a=e.min;if("object"==typeof a&&a.field&&(a=t.getValueField(a.field)),"string"==typeof a&&a){if(i<valid_interpretTime(a))return{time:{value:n.value}}}}if(e.max){let a=e.max;if("object"==typeof a&&a.field&&(a=t.getValueField(a.field)),"string"==typeof a&&a){if(i>valid_interpretTime(a))return{time:{value:n.value}}}}return null}}function valid_builds(e={},t,n=null){let i=[];if(e)for(let a in e)if(Object.prototype.hasOwnProperty.call(e,a))switch(a=a.toLowerCase(),a){case"select_required":e[a]&&(i.push(Validators.required),i.push(valid_SelectRequired()));break;case"check_required":i.push(valid_CheckedValidator);break;case"required":e[a]&&i.push(Validators.required);break;case"pattern":i.push(Validators.pattern(e[a]));break;case"email":i.push(Validators.email);break;case"min":i.push(Validators.min(e[a]));break;case"max":i.push(Validators.max(e[a]));break;case"min_length":case"minlength":i.push(Validators.minLength(e[a]));break;case"max_length":case"maxlength":i.push(Validators.maxLength(e[a]));break;case"required_true":i.push(Validators.requiredTrue);break;case"allowed":i.push(valid_ValuesAllowed(e[a],t,n));break;case"max_size":i.push(valid_MaxSizeFile(e[a],t,n));break;case"min_age":i.push(valid_MinAgeValidator(e[a]));break;case"distinct":i.push(valid_DistinctValidator(e[a]));break;case"date":i.push(valid_DateRangeValidator(e[a],n));break;case"time":i.push(valid_TimeRangeValidator(e[a],n))}return i}function valid_messages(e={},t={}){return e.hasError("required")?t.required||lang(["form.valid","input.required"]):e.hasError("select_required")?t.select_required||lang(["form.valid","select.required"]):e.hasError("check_required")?t.check_required||lang(["form.valid","check.required"]):e.hasError("pattern")?t.pattern||lang(["form.valid","input.pattern"]):e.hasError("email")?t.email||lang(["form.valid","input.email"]):e.hasError("min")?t.min||lang(["form.valid","input.min"],{min:e.errors?.min.min}):e.hasError("max")?t.max||lang(["form.valid","input.max"],{max:e.errors?.max.max}):e.hasError("maxlength")?t.maxlength||t.max_length||lang(["form.valid","input.max-length"],{max:e.errors?.maxlength.requiredLength}):e.hasError("minlength")?t.minlength||t.min_length||lang(["form.valid","input.min-length"],{min:e.errors?.minlength.requiredLength}):e.hasError("requiredTrue")?t.required_true||lang(["form.valid","input.required"]):e.hasError("allowed")?t.allowed||lang(["form.valid","input.allowed"]):e.hasError("max_size")?t.max_size||lang(["form.valid","input.max-size"]):e.hasError("min_age")?t.min_age||lang(["form.valid","input.min-age"]):e.hasError("distinct")?t.distinct||lang(["form.valid","input.distinct"]):e.hasError("date")?t.date||lang(["form.valid","input.date"]):e.hasError("time")?t.time||lang(["form.valid","input.time"]):e.hasError("time_date")?t.time_date||lang(["form.valid","input.time-date"]):t.default||lang(["form.valid","input.invalid"])}class AifFormViewEngine{host;constructor(e){this.host=e}hasError(e){const t=this.host.form.get(e.name)?.errors||this.host.field[e.name]?.custom_error;return!(!this.host.submitted()||!t)}fieldClass(e){const t=this.hasError(e);return{"ring-rose-500 dark:ring-rose-500 hover:ring-rose-500 focus:outline-none focus-visible:outline-none focus:ring-2 focus:ring-inset focus:ring-rose-500":t,"ring-slate-200 dark:ring-slate-700/50 hover:ring-indigo-600/30 dark:hover:ring-indigo-400/35 focus:outline-none focus-visible:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500":!t}}isRequired(e){const t=this.host.field[e];if(!t)return!1;const n=t.validations||{};return!!(n.required||n.select_required||n.check_required)}isFieldRequired(e){return this.isRequired(e?.name)}isShow(e){return!1!==this.host.getFieldVisibility()[e]}onClassConfirm(e){return this.host.submitted()&&this.host.form.get(e)?.invalid?"bg-red-50 dark:bg-red-900/20 border border-red-300 dark:border-red-500/50 ring-1 ring-red-400 dark:ring-red-500/50":""}getTagData(e){return e._data}getErrorMessage(e){return this.host.field[e]?.custom_error?.message?this.host.field[e].custom_error.message:valid_messages(this.host.form?.controls?.[e],this.host.field[e]?.validations?.messages)}}class AifFormBuildEngine{host;constructor(e){this.host=e}normalizeSchema(e){if(!e)return[];if(!this.isV2Schema(e))return e;const t=e||{},n=Math.max(1,Number(t?.layout?.columns||1)),i=Array.from({length:n},()=>[]);return(Array.isArray(t?.fieldsets)?t.fieldsets:[]).forEach(e=>{const t=Math.min(n-1,Math.max(0,Number(e?.column||e?.layout?.column||1)-1));i[t].push({label:e?.title||e?.label||"",fields:[this.mapV2Fields(e?.fields||[])]})}),i}isV2Schema(e){return!(!e||Array.isArray(e)||2!==e.schemaVersion&&!Array.isArray(e.fieldsets))}mapV2Fields(e=[]){const t={};return e.forEach(e=>{e?.key&&(t[e.key]=this.mapV2Field(e))}),t}mapV2GroupFields(e=[]){return(e||[]).map(e=>{const t=Array.isArray(e)?e:[e];return[this.mapV2Fields(t)]})}mapV2Field(e){if("tag"===e?.type)return["tag",e?.tagType||"div",e?.defaultValue??"",e?.ui||{}];const t={type:e?.type||"text"},n={...e?.props||{},...e?.attr||{}};Object.keys(n).length>0&&(t.attr=n),e?.dataSource?.get&&(t.get=e.dataSource.get),e?.dataSource?.options&&(t.cat=e.dataSource.options),"group"===e?.type&&(t.fields=this.mapV2GroupFields(e?.fields||[])),"form"===e?.type&&(t.table=e?.table||{},t.buttons=e?.buttons||{},t.fields=e?.fields||[],t.transformRow=e?.transformRow||e?.hooks?.transformRow||null,t.onLoadData=e?.onLoadData||e?.hooks?.onLoadData||null,t.validateRow=e?.validateRow||e?.hooks?.validateRow||null),"table"===e?.type&&(t.data=e?.data,t.columns=e?.columns||[]),e?.hooks?.onChange&&(t.change=[this.getDefaultChangeEvent(e),e.hooks.onChange]);const i=e?.validators||{},a={};return e?.rules?.visibleWhen&&(a.show=e.rules.visibleWhen),e?.rules?.hiddenWhen&&(a.hide=e.rules.hiddenWhen),e?.rules?.requiredWhen&&(a.required=e.rules.requiredWhen),e?.rules?.disabledWhen&&(a.disabled=e.rules.disabledWhen),e?.rules?.readonlyWhen&&(a.readonly=e.rules.readonlyWhen),[1===Object.keys(t).length?t.type:t,e?.label||"",e?.defaultValue??null,i,Object.keys(a).length>0?a:void 0]}getDefaultChangeEvent(e){return["options","switch","checkbox","radio"].includes(e?.type||"text")?"click":"change"}newFieldFile(e){const t=e.value,n=t?t.split("/").pop():"";if(e._exists=!0,e._value=t,"image"==e.control_type)e.image=storage(t),e._image=t;else if("file"==e.control_type){const i=t?t.split(".")?.pop()?.toLowerCase():"";e._file={extension:i,description:n},e.file_url=storage(t)}return e.validations?.required&&(e._was_required=!0,delete e.validations.required),e.description=n,e.value=null,e}newTag(e={}){return[e.label,e.value,e.validations]}newField(e,t){const n="object"==typeof e[0]?e[0]?.type:e[0]||"text",i=void 0!==e[2]?e[2]:null,a=i instanceof Array&&"hidden-text"==n?i[0]:i,s=i instanceof Array&&"hidden-text"==n?i[1]:"";return"object"==typeof e[0]&&e[0].cat&&this.host.setCatalogEntry(t,obj_val_text_cat(e[0].cat)),{name:t,attr:"object"==typeof e[0]?e[0]?.attr:{},control_type:n,type:e[0]||"text",label:e[1]||"",text:s,value:a,validations:e[3]||{}}}isCorrectFormatForm(e){return e instanceof Array&&e.length>0&&e[0]instanceof Array&&e[0].length>0}convertFormat(e){return e=this.normalizeSchema(e),this.isCorrectFormatForm(e)?e:e.map(e=>[{fields:[e]}])}resolveRenderType(e){const t=("object"==typeof e?e?.type:e)||"text";if(["text","password","email","number","search","tel","url","hidden"].indexOf(t)>=0)return"input";return["date","datetime-local","datetime","month","week","time"].indexOf(t)>=0?"date":"options"==t||"radio"==t?"options":"select"==t||"select-multiple"==t?"select":"check"==t||"checkbox"==t?"checkbox":t}resolveGroupFieldset(e){const t=("object"==typeof e.type?e.type:{}).fields??e.attr?.fields??e.value??[];return Array.isArray(t)?t:[]}createProcessedField(e,t,n,i){let a=[],s=this.newField(e,t);if(s.render_type=this.resolveRenderType(s.type),"tag"==s.type)return s._data=this.newTag(s),this.host.field[t]=s,s;if(e[4]&&(e[4]?.cat&&(this.host.setCatalogEntry(t,obj_val_text_cat(e[4].cat)),delete e[4].cat),this.host.actions[t]=e[4]),"group"===s.render_type)return s.group_fields=this.buildFieldLayout(this.resolveGroupFieldset(s),n,i),this.host.field[t]=s,s;"object"==typeof s.type&&(s.type.get&&this.host.getData(s),s.type.change?this.host.setChangeData(s):"form"==s.control_type?this.host.setFormData(s,n.readonly,n.disabled):"table"==s.control_type&&this.host.setTableData(s,n.readonly,n.disabled)),s.attr?.default&&("now"==s.attr.default&&(s.value=s.value||date_now()),"time"==s.attr.default?s.value=s.value||date_time():s.value=s.value||s.attr.default);let o=s.value;return["date","time"].indexOf(s.control_type)>=0?a=valid_builds(s.validations,s.control_type,this.host):["file","image"].indexOf(s.control_type)>=0?(s=o?this.newFieldFile(s):s,o=s.value,a=valid_builds(s.validations,t,this.host.onGetFileByName.bind(this.host))):a=valid_builds(s.validations,s.control_type),["switch","checkbox","options"].indexOf(s.control_type)>=0&&(o=o||null),"select"!==s.control_type||null!=o&&0!==o||(o=""),s.build_validations=a,this.host.field[t]=s,(s.attr?.readonly||n.readonly)&&(s.attr=s.attr||{},s.attr.readonly=!0),(s.attr?.disabled||n.disabled)&&(s.attr=s.attr||{},s.attr.disabled=!0),this.host.field[t]=s,i[this.host.field[t].name]=new FormControl({value:o,disabled:!!s.attr?.disabled},a),s}buildFieldLayout(e,t,n){const i=this.convertFormat(e||[]),a=[];return i.forEach((e,i)=>{a[i]=[],e.forEach((e,s)=>{const o=e&&Array.isArray(e.fields)?e:{label:e?.label||"",fields:[e]};a[i][s]={},o.label&&(a[i][s].label=o.label||""),a[i][s].fields=[],o.fields.forEach((e,o)=>{a[i][s].fields[o]=[];for(const r in e){const l=e[r];if("__config__"==r)continue;const d=this.createProcessedField(l,r,t,n);a[i][s].fields[o].push(d)}})})}),a}newCreateForm(){const e={},t=this.host._config;if(t.fields=this.normalizeSchema(t.fields),!t.fields||!t.fields.length)return this.host.getFormBuilder().group(e);if(t.readonly&&(t.confirm=null),this.host.fieldset=this.convertFormat(t.fields),this.host.col=Math.floor(12/this.host.fieldset.length),this.host.col_span_class=`xl:col-span-${this.host.col} sm:col-span-${this.host.col}`,console.log("xxx: col:",this.host.col),this.host.fields=this.buildFieldLayout(this.host.fieldset,t,e),t.confirm){t.confirm=t.confirm||{},t.confirm.name=t.confirm?.name||"dynamic_confirm";const n=t.confirm.name;this.host.field[n]=this.newField(["switch","",!!t.confirm?.value],n),this.host.form_confirm=new FormControl(this.host.field[n].value,[Validators.requiredTrue]),e[this.host.field[n].name]=this.host.form_confirm}return this.host.getFormBuilder().group(e)}createForm(){const e=this.host._config;if(e.title,e.card&&(this.host.card.card_body_class=e.card_body_class||"p-4"),e.onEmpty=e.onEmpty||function(){return!1},e.onSubmit=e.onSubmit||function(){return!1},e.cat=e.cat||{},this.host.reset={},e.btn&&this.host.btn.update(t=>({...t,...e.btn})),e.reset)for(const t in e.reset)this.host.reset[t]=e.reset[t];return e.num_required&&(this.host.num_required=e.num_required||0),this.newCreateForm()}}class AifFormInteractionEngine{host;constructor(e){this.host=e}getTypeField(e,t){if("object"==typeof e)return this.specialField(t),this.getTypeField(e.type,t);if(["text","password","email","number","search","tel","url","hidden"].indexOf(e)>=0)return"input";return["date","datetime-local","datetime","month","week","time"].indexOf(e)>=0?"date":"options"==e||"radio"==e?"options":"select"==e||"select-multiple"==e?"select":"check"==e||"checkbox"==e?"checkbox":e}specialField(e=""){e.type.get&&this.getData(e),e.type.change&&this.host.setChangeData(e)}getData(e,t=""){if(!this.host.get_data[e.name]){this.host.get_data[e.name]=!0;let n=t||e.type.get;n=str_replace_field(n?.replace("{id}",e.value),this.host.field,this.host.form),loading(),rq_req().get(n).then(t=>{loading(!1),this.host.setCatalogEntry(e.name,t||[])}).catch(e=>{loading(!1),console.error(e)})}}onClear(e){e&&this.host.form?.contains(e)&&(this.host.form.get(e)?.setValue(null),this.host.form.get(e)?.markAsDirty(),this.host.form.get(e)?.markAsTouched())}addControl(e){if(this.host.form&&!this.host.form.contains(e)&&this.host.field[e]){this.host.field[e].deleted=!1;const t=this.host.field[e].build_validations;this.host.form.addControl(e,new FormControl(this.host.field[e].value,t)),this.host.assignActions(e)}}delControl(e,t=!1){this.host.form&&this.host.form.contains(e)&&(this.host.field[e].deleted=t,this.host.form.removeControl(e))}cmpValues(e,t,n=null){return t instanceof Array?t.some(t=>t==e):"object"==typeof t&&(t.text||t.text_chr)?t.text?this.compareSelectText(t.text,e,n):this.compareSelectTextChr(t.text_chr,e,n):e==t}compareSelectText(e,t,n){const i=this.getCatalogLabel(n,t);return!!i&&this.matchCatalogText(i,e,"equals")}compareSelectTextChr(e,t,n){const i=this.getCatalogLabel(n,t);return!!i&&this.matchCatalogText(i,e,"startsWith")}getCatalogLabel(e,t){if(!e)return"string"==typeof t?t:`${t??""}`;const n=this.host.catOptions(e).find(e=>`${e?.value}`==`${t}`);return n?n.description||n.text||`${n.value??""}`:"string"==typeof t?t:`${t??""}`}matchCatalogText(e,t,n){const i=`${e||""}`.trim().toLowerCase();return(Array.isArray(t)?t:[t]).some(e=>{const t=`${e||""}`.trim().toLowerCase();return!!t&&("startsWith"===n?i.startsWith(t):i===t)})}}class AifFormSubmitEngine{host;constructor(e){this.host=e}onSubmit(){if(this.host.submitted.set(!0),this.host.form.invalid)return this.host.form.markAllAsTouched(),!1;const e=()=>{this.host.alert_config.set({show:!1,message:"",type:"warning"}),this.host.sending.set(!0);const e=this.getDataForm();this.postValidSubmit(e).then(e=>{!1!==e?this.sendSubmit(e):this.host.sending.set(!1)})};if(this.host._config.confirm&&this.host._config.confirm.alert){const t={...this.host._config.confirm.alert,message:this.host._config.confirm.alert.message||this.host._config.confirm.message};msg.confirm_message(t).then(t=>{t?e():(this.host.sending.set(!1),this.host.alert_config.set({show:!1,message:"",type:"warning"}))})}else e();return!1}getDataForm(){return this.host.form.value}postValidSubmit(e){return Promise.resolve(e)}sendSubmit(e=null){this.host._config.onSubmit(e,this.host.feedback.bind(this.host),this.host)}onReset(){this.host.submitted.set(!1),this.host.build(this.host._config)}runButtonConfirm(e={},t){e?.message&&(e?.confirm||e?.cancel)?msg.confirm_message({message:e.message,confirm:e.confirm||{text:"Aceptar"},cancel:e.cancel||{text:"Cancelar"}}).then(e=>{e&&t()}):t()}closeForm(){this.host._config?.buttons?.close?.action&&"function"==typeof this.host._config.buttons.close.action&&this.host._config.buttons.close.action(this.host),this.host.closeParentModal("close")||this.host.modal&&"function"==typeof this.host.modal.close&&this.host.modal.close("close")}cancelForm(){const e=this.host._config?.buttons?.cancel||{};this.runButtonConfirm(e,()=>{e.action&&"function"==typeof e.action&&e.action(this.host),this.host._config?.embedded||this.host.closeParentModal("cancel")||this.host.modal&&"function"==typeof this.host.modal.close&&this.host.modal.close("cancel")})}clearForm(){const e=this.host._config?.buttons?.clear||{};this.runButtonConfirm(e,()=>{this.host.submitted.set(!1);const e={};for(const t in this.host.field){const n=this.host.field[t];"hidden"===n.control_type?e[t]=n.value:"select"===n.control_type?e[t]="":"switch"===n.control_type?e[t]=!1:e[t]=null}this.host.form.reset(e)})}}class AifForm{gridSpanClassMap={1:"aif-responsive-span-1",2:"aif-responsive-span-2",3:"aif-responsive-span-3",4:"aif-responsive-span-4",6:"aif-responsive-span-6",12:"aif-responsive-span-12"};config=input({},...ngDevMode?[{debugName:"config"}]:[]);formContainerRef=viewChild("container_form",...ngDevMode?[{debugName:"formContainerRef"}]:[]);fb=inject(FormBuilder);parentModal=inject(AifModal,{optional:!0});cdr=inject(ChangeDetectorRef);gtm_label=signal(lang(["form","gtm.label"],"gtm"),...ngDevMode?[{debugName:"gtm_label"}]:[]);show_form=signal(!1,...ngDevMode?[{debugName:"show_form"}]:[]);submitted=signal(!1,...ngDevMode?[{debugName:"submitted"}]:[]);sending=signal(!1,...ngDevMode?[{debugName:"sending"}]:[]);is_alert=signal(!1,...ngDevMode?[{debugName:"is_alert"}]:[]);field_visibility=signal({},...ngDevMode?[{debugName:"field_visibility"}]:[]);form;fields=[];field={};btn=signal({text:lang(["form","btn.ok"]),class:"btn-primary"},...ngDevMode?[{debugName:"btn"}]:[]);reset={};alert_config=signal({message:"",show:!1,type:"warning"},...ngDevMode?[{debugName:"alert_config"}]:[]);col=1;col_span_class="xl:col-span-12 sm:col-span-12";card={card_body_class:"p-4"};fieldset=[];actions={};get_data={};change_data={};actions_data={};form_data={};table_data={};css_style="";modal=null;num_required=0;form_confirm=null;_value={};_config={};catalogs=signal({},...ngDevMode?[{debugName:"catalogs"}]:[]);_catCache=new Map;catalogEngine=new AifFormCatalogEngine(this);actionsEngine=new AifFormActionsEngine(this);subformEngine=new AifFormSubformEngine(this);tableEngine=new AifFormTableEngine(this);viewEngine=new AifFormViewEngine(this);buildEngine=new AifFormBuildEngine(this);interactionEngine=new AifFormInteractionEngine(this);submitEngine=new AifFormSubmitEngine(this);constructor(){effect(()=>{const e=this.config();if(e&&(0==this.fields.length||e!==this._config)){if("form-slim"==e)return;this.build(e)}})}get f(){return this.form?this.form.controls:{}}ngOnInit(){this.createFunctions()}getFormBuilder(){return this.fb}closeParentModal(e){return!!this.parentModal&&(this.parentModal._close(e),!0)}getCatalogState(){return this.catalogs()}setCatalogState(e){this.catalogs.set(e)}updateCatalogState(e){this.catalogs.update(e)}getCatalogCache(){return this._catCache}clearCatalogCache(){this._catCache.clear()}upCatalog=(e={})=>{console.log("xx: AifForm: upCatalog: cat",e),this.catalogEngine.upCatalog(e)};update(e,t){if("cat"===e)this.upCatalog(t)}setCatalogEntry(e,t=[]){this.catalogEngine.setCatalogEntry(e,t)}getFieldVisibility(){return this.field_visibility()}setFieldVisibility(e){this.field_visibility.set(e)}hide(){this.show_form.set(!1)}build(e={},t=null){console.log("xx: AifForm: build: cfg",e),this.show_form.set(!1),this._config=e||{},this._config.fields=this.buildEngine.normalizeSchema(this._config.fields),this.catalogEngine.reset(),this.actions={},this.get_data={},this.change_data={},this.actions_data={},this.form_data={},this.table_data={},this.actions_data={},this.css_style=this._config.style||"",this._config.fields_hidden=this._config.fields_hidden||!1,this._config.confirm=this._config.confirm||null,this.btn.set({text:lang(["form","btn.ok"]),class:"btn-primary"}),this.submitted.set(!1),this.alert_config.set({show:!1,message:"",type:"warning"}),this.sending.set(!1),this.field_visibility.set({}),this.form=this.createForm(),this.show_form.set(!!(this._config.fields&&this._config.fields instanceof Array&&this._config.fields.length>0&&this.form)),this.preActions(),this.createFunctions(),this._config.post_build&&"function"==typeof this._config.post_build&&setTimeout(()=>this._config.post_build(this),300),t&&(this.modal=t,this.modal.open())}feedback(e,t){if(console.log("xx: AifForm: feedback: resolve",e),this.is_alert.set(!1),e){if(this.sending.set(!1),this._config?.embedded)return;this.closeForm()}else this.sending.set(!1),this.is_alert.set(!0),t&&this.alert_config.set({show:!0,type:"warning",message:t})}createFunctions(){const e=this._config;e&&(e.onContext=e.onContext||(()=>{}),e.build=(e={})=>this.build(e),e.update=(e,t)=>this.update(e,t),e.feedback=(e,t)=>this.feedback(e,t),e.runReset=()=>this.onReset(),e.runSubmit=()=>this.onSubmit(),e.getContext=()=>this,e.onContext(this))}setChangeData(e){Array.isArray(e.type.change)?this.change_data[e.name]={type:e.type.change[0],name:"string"==typeof e.type.change[1]?e.type.change[1]:"",fn:"function"==typeof e.type.change[1]?e.type.change[1]:null,get:e.type.change[2]||0,min:e.type.change[3]||0}:this.change_data[e.name]=e.type.change}setFormData(e={},t=!1,n=!1){e.type=e.type||{},e.type.readonly=!(!e.attr?.readonly&&!t),e.type.disabled=!(!e.attr?.disabled&&!n),this.form_data[e.name]={...e.type,data:[...e.value||e.type.table?.data||[]],editIndex:null,currentData:null,showForm:!(e.value&&e.value.length>0),config:{},tableConfig:{}},this.subformEngine.rebuildSubFormTableConfig(e.name)}setTableData(e={},t=!1,n=!1){this.tableEngine.setTableData(e,t,n)}newCreateForm(){return this.buildEngine.newCreateForm()}createForm(){return this.buildEngine.createForm()}fieldReload(e){"function"==typeof e.attr.reload&&e.attr.reload(e,this)}hasError(e){return this.viewEngine.hasError(e)}fieldClass(e){return this.viewEngine.fieldClass(e)}getOuterColumnClass(){return this.gridSpanClassMap[this.col]||"aif-responsive-span-12"}getInnerColumnClass(e){const t=e>0?Math.floor(12/e):12;return this.gridSpanClassMap[t]||"aif-responsive-span-12"}getTypeField(e,t){return this.interactionEngine.getTypeField(e,t)}specialField(e=""){this.interactionEngine.specialField(e)}setValueField(e,t){this.form&&this.form.contains(e)&&(this.form.get(e)?.setValue(t),this.field[e]&&(this.field[e].value=t))}getValueField(e){return this.form&&this.form.contains(e)?this.form.get(e)?.value:null}showFields(...e){e.forEach(e=>this.actionShowHide(!0,e))}hideFields(...e){e.forEach(e=>this.actionShowHide(!1,e))}setCat(e,t){this.setCatalogEntry(e,t||[])}getRequest(e){return rq_req().get(e)}updValidity(e){this.form.get(e)?.updateValueAndValidity()}setErrorField(e,t){const n=this.form.get(e);this.field[e]&&(this.field[e].custom_error={message:t}),n?.setErrors({custom:!0}),n?.markAsTouched()}getData(e,t=""){this.interactionEngine.getData(e,t)}onGetFileByName(e){return""}addControl(e){this.interactionEngine.addControl(e)}delControl(e,t=!1){this.interactionEngine.delControl(e,t)}cmpValues(e,t,n=null){return this.interactionEngine.cmpValues(e,t,n)}actionShowHide(e,t){this.actionsEngine.actionShowHide(e,t)}actionReadonly(e,t){this.actionsEngine.actionReadonly(e,t)}actionDisabled(e,t){this.actionsEngine.actionDisabled(e,t)}actionRequired(e,t){this.actionsEngine.actionRequired(e,t)}assignActions(e){this.actionsEngine.assignActions(e)}setActionChange(e){this.actionsEngine.setActionChange(e)}changeRequest(e,t){this.actionsEngine.changeRequest(e,t)}preActions(){this.actionsEngine.preActions()}applyDynamicActions(e){this.actionsEngine.applyDynamicActions(e)}evalRule(e,t){return this.actionsEngine.evalRule(e,t)}actionChange(e){}onSearch(e,t){}onClear(e){this.interactionEngine.onClear(e)}onSubmit(){return this.submitEngine.onSubmit()}getDataForm(){return this.form.value}postValidSubmit(e){return Promise.resolve(e)}onReset(){this.submitEngine.onReset()}runButtonConfirm(e={},t){this.submitEngine.runButtonConfirm(e,t)}closeForm(){this.submitEngine.closeForm()}cancelForm(){this.submitEngine.cancelForm()}clearForm(){this.submitEngine.clearForm()}isCatOptions(e){const t=this.catalogs();return!!t&&!!t[e]}catOptions(e){return this.catalogEngine.catOptions(e)}isRequired(e){return this.viewEngine.isRequired(e)}isFieldRequired(e){return this.viewEngine.isFieldRequired(e)}isShow(e){return this.viewEngine.isShow(e)}isShowButton(){return!1}onClassConfirm(e){return this.viewEngine.onClassConfirm(e)}getTagData(e){return this.viewEngine.getTagData(e)}getSubFormData(e){return this.form_data[e.name]?.config||{}}getSubFormTableData(e){return this.form_data[e.name]?.tableConfig||{}}getTableData(e){return this.tableEngine.getTableData(e)}refreshSubFormView(){this.cdr.markForCheck(),this.cdr.detectChanges()}focusSubForm(e){setTimeout(()=>{const t=this.formContainerRef()?.nativeElement;if(!t)return;const n=t.querySelector(`[data-subform-name="${e}"]`);if(!(n instanceof HTMLElement))return;n.scrollIntoView({behavior:"smooth",block:"center"});const i=n.querySelector('input:not([type="hidden"]):not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])');i instanceof HTMLElement&&i.focus()},80)}openSubForm(e,t=null,n=null){this.subformEngine.openSubForm(e,t,n)}closeSubForm(e){this.subformEngine.closeSubForm(e)}rebuildSubFormConfig(e){this.subformEngine.rebuildSubFormConfig(e)}rebuildSubFormTable(e){this.subformEngine.rebuildSubFormTableConfig(e)}loadSubFormData(e,t=[],n={}){return this.subformEngine.loadSubFormData(e,t,n)}onSubFormTableAction(e,t,n,i){this.subformEngine.onSubFormTableAction(e,t,n,i)}removeSubFormRow(e,t){this.subformEngine.removeSubFormRow(e,t)}validateSubFormRow(e,t){return this.subformEngine.validateSubFormRow(e,t)}saveSubFormRow(e,t,n){this.subformEngine.saveSubFormRow(e,t,n)}getErrorMessage(e,t){return this.viewEngine.getErrorMessage(e)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifForm,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifForm,isStandalone:!0,selector:"aif-form",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"formContainerRef",first:!0,predicate:["container_form"],descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (show_form() && form) {\n<div [formGroup]="form">\n@if (_config?.embedded) {\n<div class="aif-form" #container_form [class]="css_style" [style]="_config?.style || \'\'">\n <ng-container *ngTemplateOutlet="formContent"></ng-container>\n</div>\n} @else {\n<form class="aif-form" #container_form [class]="css_style" [style]="_config?.style || \'\'"\n (ngSubmit)="onSubmit()">\n <ng-container *ngTemplateOutlet="formContent"></ng-container>\n</form>\n}\n<ng-template #formContent>\n <div class="grid grid-cols-12 gap-4">\n <div class="col-span-12">\n <aif-alert [config]="alert_config()"></aif-alert>\n </div>\n @for (cols of fields; track $index) {\n <div class="col-span-12" [ngClass]="getOuterColumnClass()" [class.hidden]="_config?.fields_hidden || false"\n [class.block]="_config?.fields_hidden ? false : true">\n @for (fds of cols; track $index; let ix = $index) {\n <div class="border-0 shadow-none bg-transparent" [class]="css_style">\n <div class="p-0">\n <div class="flex items-start">\n <div class="flex-grow">\n @if (fds.label) {\n <div class="mediaFieldset">\n <fieldset class="rounded-lg border border-slate-200/80 bg-white/30 p-3 dark:border-slate-700/60 dark:bg-slate-900/10">\n <legend class="float-none w-auto px-2 text-sm font-medium text-slate-700 dark:text-slate-300">{{fds.label}}\n </legend>\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: fds.fields, showInnerButtons: true }"></ng-container>\n </fieldset>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: fds.fields, showInnerButtons: true }"></ng-container>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n <ng-template #blockFields let-fdd="fdd" let-showInnerButtons="showInnerButtons">\n <div class="grid grid-cols-12 gap-4">\n @for (dd of fdd; track $index; let cc = $index) {\n <div class="col-span-12" [ngClass]="getInnerColumnClass(fdd.length)">\n @for (fd of dd; track fd.name || $index) {\n @if (fd.control_type == \'hidden\') {\n <input type="hidden" [name]="fd.name" [formControlName]="fd.name">\n } @else if (isShow(fd.name)) {\n <div class="relative mb-4 rounded-lg transition-all"\n [class.pl-2]="hasError(fd)"\n [class.border-l-2]="hasError(fd)"\n [class.border-rose-500]="hasError(fd)">\n\n @switch (fd.render_type || getTypeField(fd.type, fd)) {\n @case (\'hidden-text\') {\n <aif-form-hidden-text [fd]="fd" [aifForm]="this"></aif-form-hidden-text>\n }\n @case (\'input\') {\n <aif-form-input [fd]="fd" [aifForm]="this"></aif-form-input>\n }\n @case (\'select\') {\n <aif-form-select [fd]="fd" [aifForm]="this"></aif-form-select>\n }\n @case (\'ng-select\') {\n <aif-form-ng-select [fd]="fd" [aifForm]="this"></aif-form-ng-select>\n }\n @case (\'textarea\') {\n <aif-form-textarea [fd]="fd" [aifForm]="this"></aif-form-textarea>\n }\n @case (\'date\') {\n <aif-form-date [fd]="fd" [aifForm]="this"></aif-form-date>\n }\n @case (\'options\') {\n <aif-form-options [fd]="fd" [aifForm]="this"></aif-form-options>\n }\n @case (\'switch\') {\n <aif-form-switch [fd]="fd" [aifForm]="this"></aif-form-switch>\n }\n @case (\'checkbox\') {\n <aif-form-checkbox [fd]="fd" [aifForm]="this"></aif-form-checkbox>\n }\n @case (\'file\') {\n <aif-form-file [fd]="fd" [aifForm]="this"></aif-form-file>\n }\n @case (\'image\') {\n <aif-form-image [fd]="fd" [aifForm]="this"></aif-form-image>\n }\n @case (\'group\') {\n <div class="mb-4 rounded-xl border border-slate-200/80 bg-slate-50/60 p-4 shadow-sm dark:border-slate-700/60 dark:bg-slate-900/20">\n @if (fd.label) {\n <div class="mb-3 text-sm font-semibold text-slate-700 dark:text-slate-200">\n {{ fd.label }}\n </div>\n }\n @if (fd.group_fields?.length) {\n <ng-container *ngTemplateOutlet="blockGroups; context: { gdd: fd.group_fields }"></ng-container>\n }\n </div>\n }\n @case (\'tag\') {\n <aif-form-tag [item]="getTagData(fd)"></aif-form-tag>\n }\n @case (\'form\') {\n <div [class.opacity-50]="fd?.attr?.readonly || fd?.attr?.disabled" class="mb-4" [ngClass]="fieldClass(fd)">\n @if (getSubFormData(fd); as subFormCfg) {\n <aif-form-sub [config]="subFormCfg" [attr.data-subform-name]="fd.name">\n <aif-form-table [config]="getSubFormTableData(fd)"></aif-form-table>\n @if (subFormCfg?.fields?.length) {\n <div class="mt-4 rounded-xl border border-slate-200/80 bg-white/80 p-4 shadow-sm dark:border-slate-700/60 dark:bg-slate-950/35">\n <aif-form [config]="subFormCfg"></aif-form>\n </div>\n }\n </aif-form-sub>\n }\n </div>\n @if (isRequired(fd.name)) {\n <div class="absolute top-0 right-0">\n <i class="text-red-500">*</i>\n </div>\n }\n }\n @case (\'table\') {\n <div [class.opacity-50]="fd?.attr?.readonly || fd?.attr?.disabled" class="mb-4" [ngClass]="fieldClass(fd)">\n <aif-form-data-table [config]="getTableData(fd)"></aif-form-data-table>\n </div>\n }\n }\n\n @if (hasError(fd)) {\n <div class="flex items-center gap-1.5 mt-1 px-1 text-xs text-rose-400 dark:text-rose-400/90">\n <svg class="w-3 h-3 shrink-0" viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.345 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>\n </svg>\n <span>{{ getErrorMessage(fd.name, fd.label) }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n }\n @if (showInnerButtons && btn().inner) {\n <div class="col-span-12 flex gap-2 justify-center">\n <aif-alert [config]="alert_config()"></aif-alert>\n @if (!sending() && (_config?.buttons?.cancel)) {\n <button type="button"\n class="btn bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-md shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="cancelForm()">{{\n _config.buttons.cancel.label || \'Cancelar\'}}</button>\n }\n @if (!sending() && (_config?.buttons?.clear)) {\n <button type="button"\n class="btn bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-md shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="clearForm()">{{\n _config.buttons.clear.label || \'Limpiar\'}}</button>\n }\n @if (!sending()) {\n <button type="button"\n (click)="onSubmit()"\n class="btn bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-md shadow-sm">\n @if (btn().icon) { <i class="{{btn().icon}} mr-2"></i> }\n {{ btn().text}}\n </button>\n }\n @if (sending()) {\n \x3c!-- Spinner --\x3e\n <div class="animate-spin rounded-full h-5 w-5 border-b-2 border-indigo-600"></div>\n }\n </div>\n }\n </div>\n </ng-template>\n\n <ng-template #blockGroups let-gdd="gdd">\n <div class="grid grid-cols-12 gap-4">\n @for (groupCols of gdd; track $index) {\n <div class="col-span-12" [ngClass]="getInnerColumnClass(gdd.length)">\n @for (groupFieldset of groupCols; track $index) {\n @if (groupFieldset.label) {\n <fieldset class="mb-4 rounded-lg border border-slate-200/80 p-3 dark:border-slate-700/60">\n <legend class="px-1 text-sm font-medium text-slate-700 dark:text-slate-200">\n {{ groupFieldset.label }}\n </legend>\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: groupFieldset.fields, showInnerButtons: false }"></ng-container>\n </fieldset>\n } @else {\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: groupFieldset.fields, showInnerButtons: false }"></ng-container>\n }\n }\n </div>\n }\n </div>\n </ng-template>\n\n @if (form_confirm && _config?.confirm) {\n <div class="col-span-12 text-center mt-4">\n <div class="p-4 rounded-md" [ngClass]="onClassConfirm(_config.confirm.name)">\n <div class="flex items-center justify-center">\n <input class="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600 mr-2"\n [formControlName]="_config.confirm.name" type="checkbox" role="switch" [id]="_config.confirm.name">\n <label class="text-sm font-medium text-gray-900 dark:text-gray-300 cursor-pointer" [for]="_config.confirm.name">\n {{ _config.confirm.message }}\n </label>\n </div>\n </div>\n </div>\n }\n\n @if (!btn().hide && !btn().inner && !_config?.readonly) {\n <div class="col-span-12 border-t border-slate-200 dark:border-slate-800/80 mt-8 pt-6 text-center">\n <div class="flex justify-center gap-2">\n @if (reset?.btn && !sending()) {\n <button type="button" class="px-4 py-2 rounded-md text-sm font-medium {{reset?.btn?.class}}"\n (click)="onReset()">\n @if (btn().icon) { <i class="{{btn().icon}} mr-2"></i> }\n {{ reset?.btn?.text}}\n </button>\n }\n @if (!sending() && (_config?.buttons?.cancel)) {\n <button type="button"\n class="px-4 py-2 rounded-md text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="cancelForm()">{{\n _config.buttons.cancel.label || \'Cancelar\'}}</button>\n }\n @if (!sending() && (_config?.buttons && _config?.buttons?.clear)) {\n <button type="button"\n class="px-4 py-2 rounded-md text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="clearForm()">{{\n _config.buttons.clear.label || \'Limpiar\'}}</button>\n }\n @if (!sending()) {\n <button type="button"\n (click)="onSubmit()"\n class="px-4 py-2 rounded-md text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 shadow-sm transition-all {{btn().class}}">\n @if (btn().icon) { <i class="{{btn().icon}} mr-2"></i> }\n {{ _config?.buttons?.save?.label || btn().text}}\n </button>\n }\n @if (sending()) {\n <div class="animate-spin rounded-full h-5 w-5 border-b-2 border-indigo-600"></div>\n }\n </div>\n </div>\n }\n @if (isShowButton()) {\n <div class="col-span-12 border-t border-slate-200 dark:border-slate-800/80 mt-8 pt-6 text-center">\n <button type="button"\n class="px-4 py-2 rounded-md text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="closeForm()">{{\n _config.buttons?.close?.label || \'Cerrar vista\'}}</button>\n </div>\n }\n </div>\n</ng-template>\n</div>\n}\n',styles:[".aif-responsive-span-12{grid-column:span 12 / span 12}@media(min-width:640px){.aif-responsive-span-6{grid-column:span 6 / span 6}.aif-responsive-span-4{grid-column:span 4 / span 4}.aif-responsive-span-3{grid-column:span 3 / span 3}.aif-responsive-span-2{grid-column:span 2 / span 2}.aif-responsive-span-1{grid-column:span 1 / span 1}}\n"],dependencies:[{kind:"component",type:AifForm,selector:"aif-form",inputs:["config"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.ɵNgNoValidate,selector:"form:not([ngNoForm]):not([ngNativeValidate])"},{kind:"directive",type:i1$2.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i1$2.CheckboxControlValueAccessor,selector:"input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:NgTemplateOutlet,selector:"[ngTemplateOutlet]",inputs:["ngTemplateOutletContext","ngTemplateOutlet","ngTemplateOutletInjector"]},{kind:"ngmodule",type:NgSelectModule},{kind:"component",type:AifFormTag,selector:"aif-form-tag",inputs:["item"]},{kind:"component",type:AifFormSub,selector:"aif-form-sub",inputs:["config"]},{kind:"component",type:AifFormDataTable,selector:"aif-form-data-table",inputs:["config"]},{kind:"component",type:AifFormTable,selector:"aif-form-table",inputs:["config"]},{kind:"component",type:AifAlert,selector:"aif-alert",inputs:["config"]},{kind:"component",type:AifFormHiddenText,selector:"aif-form-hidden-text",inputs:["fd","aifForm"]},{kind:"component",type:AifFormInput,selector:"aif-form-input",inputs:["fd","aifForm"]},{kind:"component",type:AifFormSelect,selector:"aif-form-select",inputs:["fd","aifForm"]},{kind:"component",type:AifFormNgSelect,selector:"aif-form-ng-select",inputs:["fd","aifForm"]},{kind:"component",type:AifFormTextarea,selector:"aif-form-textarea",inputs:["fd","aifForm"]},{kind:"component",type:AifFormDate,selector:"aif-form-date",inputs:["fd","aifForm"]},{kind:"component",type:AifFormOptions,selector:"aif-form-options",inputs:["fd","aifForm"]},{kind:"component",type:AifFormSwitch,selector:"aif-form-switch",inputs:["fd","aifForm"]},{kind:"component",type:AifFormCheckbox,selector:"aif-form-checkbox",inputs:["fd","aifForm"]},{kind:"component",type:AifFormFile,selector:"aif-form-file",inputs:["fd","aifForm"]},{kind:"component",type:AifFormImage,selector:"aif-form-image",inputs:["fd","aifForm"]}]})}function form_prebuild(e,t={},n=null){return new Promise(async(i,a)=>{e.cfg={...e.cfg,...t.form||t||{}},e.cfg.type=e.cfg.type||"add";let s={...e.model,...e.cfg},o=e.cat||{};o={...o,...t.cat||{}},console.log("xx: cat",o),e.cfg.lang&&await lang_load(e.cfg.lang);const r=t.onSubmit||e.onSubmit,l=t.validate||e.validate,d=t.preData||e.preData,c=t.postBuild||e.postBuild,g=t.postData||e.postData,m=t.onFailed||e.onFailed,u=t.send_url||e.urls.send,p=t.data_url||e.urls.data,f=t.valid_url||e.urls.valid,h=t.cat_url||e.urls.cat,b=t.setButtons||e.setButtons,v=t.setMessages||e.setMessages,x=t.setConfirm||e.setConfirm;t.fields||e.fields;let y=t.fields||e.cfg.fields||e.fields;y="string"==typeof y?e[y]:y;const k=await fx_resolve(d,[],e);if(k&&(s={...s,...k}),p)try{const t=await wGet(str_replace_vars(p,s));if(!t||!t.data)return msg.warning(lang("error"),lang("error.data.url",{url:p}));{const n=await fx_resolve(d,[t.data],e)||t.data;s={...s,...n}}}catch(e){return msg.warning(lang("error"),lang("error.get.url",{url:p}))}if(f)try{const t=await wGet(str_replace_vars(f,s));if(t._error_message)return msg.warning(e.modal?.title||lang("warnnig"),t._error_message)}catch(e){return msg.warning(lang("error"),lang("error.get.url",{url:f}))}if(h)try{const e=await wGet(str_replace_vars(h,s));o={...o,...e.data||e||{}}}catch(e){return msg.warning(lang("error"),lang("error.get.url",{url:h}))}if(!u)return msg.warning(lang("error"),lang("error.form.url"));const w=str_replace_vars(u,{...s,action:e.cfg.action||"save"}),C=await fx_resolve(y,[t],e),D=await fx_resolve(v,[e.cfg],e)||{};i({step:e.cfg.step||!1,size:e.modal.size,title:str_replace_vars(e.modal.title,s),config:{rebuild:e.cfg.rebuild||!1,cat:o,result_type:e.cfg.result_type||t.result_type||"none",post_build:c,buttons:await fx_resolve(b,[e.cfg],e),confirm:await fx_resolve(x,[e.cfg],e),messages:{...D},readonly:!!e.cfg.readonly,step:e.cfg.step,listen:e.cfg.listen||!0,onSubmit:r||(async(t,i,a=null)=>{const s=t.files||{};let o=t.fields||t;if(l){const t=await fx_resolve(l,[o,a],e);if(!0!==t)return void i(!1,t)}loading(),g&&(o=await fx_resolve(g,[o,a],e));const r=D.error||{};D.error={title:r.title||lang(["alert","submit.fail.title"]),message:r.message||lang(["alert","submit.fail.message"],{err:t.message||""}),confirm:{text:r.confirm?.text||lang(["form","btn.ok"]),color:r.confirm?.color||"red"}},rq_req().post(w,o,s).then(async t=>{!0===t.success?(loading_close(i,!!t.success),await fx_resolve(n,[t,i])):(msg.error(D.error.title,D.error.message,D.error.confirm),await fx_resolve(m,[t,a,i],e),await fx_resolve(n,[null,i]),loading_close(i))}).catch(e=>{msg.error(D.error.title,D.error.message,D.error.confirm),loading_close(i)})}),fields:C}})})}function menu_option(e,t,n){return{title:e,icon:t,click:n}}function menu_divider(){return{divider:!0}}function menu_edit(e,t){return menu_option(e,"aif aif-edit-ico",(e,n)=>t("edit",n))}function menu_delete(e,t){return menu_option(e,"aif aif-trash-ico",(e,n)=>t("delete",n))}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifForm,decorators:[{type:Component,args:[{selector:"aif-form",standalone:!0,imports:[ReactiveFormsModule,NgClass,NgTemplateOutlet,NgSelectModule,AifFormTag,AifFormSub,AifFormDataTable,AifFormTable,AifAlert,AifFormHiddenText,AifFormInput,AifFormSelect,AifFormNgSelect,AifFormTextarea,AifFormDate,AifFormOptions,AifFormSwitch,AifFormCheckbox,AifFormFile,AifFormImage],template:'@if (show_form() && form) {\n<div [formGroup]="form">\n@if (_config?.embedded) {\n<div class="aif-form" #container_form [class]="css_style" [style]="_config?.style || \'\'">\n <ng-container *ngTemplateOutlet="formContent"></ng-container>\n</div>\n} @else {\n<form class="aif-form" #container_form [class]="css_style" [style]="_config?.style || \'\'"\n (ngSubmit)="onSubmit()">\n <ng-container *ngTemplateOutlet="formContent"></ng-container>\n</form>\n}\n<ng-template #formContent>\n <div class="grid grid-cols-12 gap-4">\n <div class="col-span-12">\n <aif-alert [config]="alert_config()"></aif-alert>\n </div>\n @for (cols of fields; track $index) {\n <div class="col-span-12" [ngClass]="getOuterColumnClass()" [class.hidden]="_config?.fields_hidden || false"\n [class.block]="_config?.fields_hidden ? false : true">\n @for (fds of cols; track $index; let ix = $index) {\n <div class="border-0 shadow-none bg-transparent" [class]="css_style">\n <div class="p-0">\n <div class="flex items-start">\n <div class="flex-grow">\n @if (fds.label) {\n <div class="mediaFieldset">\n <fieldset class="rounded-lg border border-slate-200/80 bg-white/30 p-3 dark:border-slate-700/60 dark:bg-slate-900/10">\n <legend class="float-none w-auto px-2 text-sm font-medium text-slate-700 dark:text-slate-300">{{fds.label}}\n </legend>\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: fds.fields, showInnerButtons: true }"></ng-container>\n </fieldset>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: fds.fields, showInnerButtons: true }"></ng-container>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n <ng-template #blockFields let-fdd="fdd" let-showInnerButtons="showInnerButtons">\n <div class="grid grid-cols-12 gap-4">\n @for (dd of fdd; track $index; let cc = $index) {\n <div class="col-span-12" [ngClass]="getInnerColumnClass(fdd.length)">\n @for (fd of dd; track fd.name || $index) {\n @if (fd.control_type == \'hidden\') {\n <input type="hidden" [name]="fd.name" [formControlName]="fd.name">\n } @else if (isShow(fd.name)) {\n <div class="relative mb-4 rounded-lg transition-all"\n [class.pl-2]="hasError(fd)"\n [class.border-l-2]="hasError(fd)"\n [class.border-rose-500]="hasError(fd)">\n\n @switch (fd.render_type || getTypeField(fd.type, fd)) {\n @case (\'hidden-text\') {\n <aif-form-hidden-text [fd]="fd" [aifForm]="this"></aif-form-hidden-text>\n }\n @case (\'input\') {\n <aif-form-input [fd]="fd" [aifForm]="this"></aif-form-input>\n }\n @case (\'select\') {\n <aif-form-select [fd]="fd" [aifForm]="this"></aif-form-select>\n }\n @case (\'ng-select\') {\n <aif-form-ng-select [fd]="fd" [aifForm]="this"></aif-form-ng-select>\n }\n @case (\'textarea\') {\n <aif-form-textarea [fd]="fd" [aifForm]="this"></aif-form-textarea>\n }\n @case (\'date\') {\n <aif-form-date [fd]="fd" [aifForm]="this"></aif-form-date>\n }\n @case (\'options\') {\n <aif-form-options [fd]="fd" [aifForm]="this"></aif-form-options>\n }\n @case (\'switch\') {\n <aif-form-switch [fd]="fd" [aifForm]="this"></aif-form-switch>\n }\n @case (\'checkbox\') {\n <aif-form-checkbox [fd]="fd" [aifForm]="this"></aif-form-checkbox>\n }\n @case (\'file\') {\n <aif-form-file [fd]="fd" [aifForm]="this"></aif-form-file>\n }\n @case (\'image\') {\n <aif-form-image [fd]="fd" [aifForm]="this"></aif-form-image>\n }\n @case (\'group\') {\n <div class="mb-4 rounded-xl border border-slate-200/80 bg-slate-50/60 p-4 shadow-sm dark:border-slate-700/60 dark:bg-slate-900/20">\n @if (fd.label) {\n <div class="mb-3 text-sm font-semibold text-slate-700 dark:text-slate-200">\n {{ fd.label }}\n </div>\n }\n @if (fd.group_fields?.length) {\n <ng-container *ngTemplateOutlet="blockGroups; context: { gdd: fd.group_fields }"></ng-container>\n }\n </div>\n }\n @case (\'tag\') {\n <aif-form-tag [item]="getTagData(fd)"></aif-form-tag>\n }\n @case (\'form\') {\n <div [class.opacity-50]="fd?.attr?.readonly || fd?.attr?.disabled" class="mb-4" [ngClass]="fieldClass(fd)">\n @if (getSubFormData(fd); as subFormCfg) {\n <aif-form-sub [config]="subFormCfg" [attr.data-subform-name]="fd.name">\n <aif-form-table [config]="getSubFormTableData(fd)"></aif-form-table>\n @if (subFormCfg?.fields?.length) {\n <div class="mt-4 rounded-xl border border-slate-200/80 bg-white/80 p-4 shadow-sm dark:border-slate-700/60 dark:bg-slate-950/35">\n <aif-form [config]="subFormCfg"></aif-form>\n </div>\n }\n </aif-form-sub>\n }\n </div>\n @if (isRequired(fd.name)) {\n <div class="absolute top-0 right-0">\n <i class="text-red-500">*</i>\n </div>\n }\n }\n @case (\'table\') {\n <div [class.opacity-50]="fd?.attr?.readonly || fd?.attr?.disabled" class="mb-4" [ngClass]="fieldClass(fd)">\n <aif-form-data-table [config]="getTableData(fd)"></aif-form-data-table>\n </div>\n }\n }\n\n @if (hasError(fd)) {\n <div class="flex items-center gap-1.5 mt-1 px-1 text-xs text-rose-400 dark:text-rose-400/90">\n <svg class="w-3 h-3 shrink-0" viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.345 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>\n </svg>\n <span>{{ getErrorMessage(fd.name, fd.label) }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n }\n @if (showInnerButtons && btn().inner) {\n <div class="col-span-12 flex gap-2 justify-center">\n <aif-alert [config]="alert_config()"></aif-alert>\n @if (!sending() && (_config?.buttons?.cancel)) {\n <button type="button"\n class="btn bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-md shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="cancelForm()">{{\n _config.buttons.cancel.label || \'Cancelar\'}}</button>\n }\n @if (!sending() && (_config?.buttons?.clear)) {\n <button type="button"\n class="btn bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-md shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="clearForm()">{{\n _config.buttons.clear.label || \'Limpiar\'}}</button>\n }\n @if (!sending()) {\n <button type="button"\n (click)="onSubmit()"\n class="btn bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-md shadow-sm">\n @if (btn().icon) { <i class="{{btn().icon}} mr-2"></i> }\n {{ btn().text}}\n </button>\n }\n @if (sending()) {\n \x3c!-- Spinner --\x3e\n <div class="animate-spin rounded-full h-5 w-5 border-b-2 border-indigo-600"></div>\n }\n </div>\n }\n </div>\n </ng-template>\n\n <ng-template #blockGroups let-gdd="gdd">\n <div class="grid grid-cols-12 gap-4">\n @for (groupCols of gdd; track $index) {\n <div class="col-span-12" [ngClass]="getInnerColumnClass(gdd.length)">\n @for (groupFieldset of groupCols; track $index) {\n @if (groupFieldset.label) {\n <fieldset class="mb-4 rounded-lg border border-slate-200/80 p-3 dark:border-slate-700/60">\n <legend class="px-1 text-sm font-medium text-slate-700 dark:text-slate-200">\n {{ groupFieldset.label }}\n </legend>\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: groupFieldset.fields, showInnerButtons: false }"></ng-container>\n </fieldset>\n } @else {\n <ng-container *ngTemplateOutlet="blockFields; context: { fdd: groupFieldset.fields, showInnerButtons: false }"></ng-container>\n }\n }\n </div>\n }\n </div>\n </ng-template>\n\n @if (form_confirm && _config?.confirm) {\n <div class="col-span-12 text-center mt-4">\n <div class="p-4 rounded-md" [ngClass]="onClassConfirm(_config.confirm.name)">\n <div class="flex items-center justify-center">\n <input class="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600 mr-2"\n [formControlName]="_config.confirm.name" type="checkbox" role="switch" [id]="_config.confirm.name">\n <label class="text-sm font-medium text-gray-900 dark:text-gray-300 cursor-pointer" [for]="_config.confirm.name">\n {{ _config.confirm.message }}\n </label>\n </div>\n </div>\n </div>\n }\n\n @if (!btn().hide && !btn().inner && !_config?.readonly) {\n <div class="col-span-12 border-t border-slate-200 dark:border-slate-800/80 mt-8 pt-6 text-center">\n <div class="flex justify-center gap-2">\n @if (reset?.btn && !sending()) {\n <button type="button" class="px-4 py-2 rounded-md text-sm font-medium {{reset?.btn?.class}}"\n (click)="onReset()">\n @if (btn().icon) { <i class="{{btn().icon}} mr-2"></i> }\n {{ reset?.btn?.text}}\n </button>\n }\n @if (!sending() && (_config?.buttons?.cancel)) {\n <button type="button"\n class="px-4 py-2 rounded-md text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="cancelForm()">{{\n _config.buttons.cancel.label || \'Cancelar\'}}</button>\n }\n @if (!sending() && (_config?.buttons && _config?.buttons?.clear)) {\n <button type="button"\n class="px-4 py-2 rounded-md text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="clearForm()">{{\n _config.buttons.clear.label || \'Limpiar\'}}</button>\n }\n @if (!sending()) {\n <button type="button"\n (click)="onSubmit()"\n class="px-4 py-2 rounded-md text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 shadow-sm transition-all {{btn().class}}">\n @if (btn().icon) { <i class="{{btn().icon}} mr-2"></i> }\n {{ _config?.buttons?.save?.label || btn().text}}\n </button>\n }\n @if (sending()) {\n <div class="animate-spin rounded-full h-5 w-5 border-b-2 border-indigo-600"></div>\n }\n </div>\n </div>\n }\n @if (isShowButton()) {\n <div class="col-span-12 border-t border-slate-200 dark:border-slate-800/80 mt-8 pt-6 text-center">\n <button type="button"\n class="px-4 py-2 rounded-md text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm dark:bg-slate-800 dark:text-slate-100 dark:border-slate-700 dark:hover:bg-slate-700 transition-colors"\n (click)="closeForm()">{{\n _config.buttons?.close?.label || \'Cerrar vista\'}}</button>\n </div>\n }\n </div>\n</ng-template>\n</div>\n}\n',styles:[".aif-responsive-span-12{grid-column:span 12 / span 12}@media(min-width:640px){.aif-responsive-span-6{grid-column:span 6 / span 6}.aif-responsive-span-4{grid-column:span 4 / span 4}.aif-responsive-span-3{grid-column:span 3 / span 3}.aif-responsive-span-2{grid-column:span 2 / span 2}.aif-responsive-span-1{grid-column:span 1 / span 1}}\n"]}]}],ctorParameters:()=>[],propDecorators:{config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],formContainerRef:[{type:i0.ViewChild,args:["container_form",{isSignal:!0}]}]}});class AifPagination{onInit=output();config=input(null,...ngDevMode?[{debugName:"config"}]:[]);builtConfig=signal(null,...ngDevMode?[{debugName:"builtConfig"}]:[]);page=signal(AifPagination.config(),...ngDevMode?[{debugName:"page"}]:[]);currentLang=signal(lang(),...ngDevMode?[{debugName:"currentLang"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);_sb;state=computed(()=>{const e=this.config(),t=this.builtConfig();return AifPagination.config(t??e??{})},...ngDevMode?[{debugName:"state"}]:[]);total=computed(()=>this.page().total||0,...ngDevMode?[{debugName:"total"}]:[]);per_page=computed(()=>this.page().per_page||10,...ngDevMode?[{debugName:"per_page"}]:[]);current_page=computed(()=>this.page().current_page||1,...ngDevMode?[{debugName:"current_page"}]:[]);max_size=computed(()=>this.page().max_size||5,...ngDevMode?[{debugName:"max_size"}]:[]);labels=computed(()=>({...AifPagination.defaultLabels(this.currentLang()),...this.page().labels||{}}),...ngDevMode?[{debugName:"labels"}]:[]);totalPages=computed(()=>Math.max(1,Math.ceil(this.total()/(this.per_page()||1))),...ngDevMode?[{debugName:"totalPages"}]:[]);startIndex=computed(()=>0===this.total()?0:Math.min(this.total(),(this.current_page()-1)*this.per_page()+1),...ngDevMode?[{debugName:"startIndex"}]:[]);endIndex=computed(()=>0===this.total()?0:Math.min(this.total(),this.current_page()*this.per_page()),...ngDevMode?[{debugName:"endIndex"}]:[]);pages=computed(()=>{let e=Math.max(1,this.current_page()-Math.floor(this.max_size()/2)),t=Math.min(this.totalPages(),e+this.max_size()-1);t-e+1<this.max_size()&&(e=Math.max(1,t-this.max_size()+1));const n=[];for(let i=e;i<=t;i++)n.push(i);return n},...ngDevMode?[{debugName:"pages"}]:[]);constructor(){effect(()=>{const e=this.config();e&&Object.keys(e).length>0&&untracked(()=>this.reBuild(e))})}ngAfterViewInit(){setTimeout(()=>this.onInit.emit())}ngOnInit(){const e=this.state();e&&Object.keys(e).length>0&&this.build(e),this._sb=lang_subscribe("change",e=>this.currentLang.set(e))}ngOnDestroy(){this._sb?.unsubscribe?.()}reBuild(e){this.resetToInput(),this.build(e)}build(e=null){this.isBuilt()||(this.isBuilt.set(!0),this.builtConfig.set(e),this.update(e))}resetToInput(){this.builtConfig.set(null),this.isBuilt.set(!1)}update(e=null){this.page.set(AifPagination.config(e||{}))}onPageChange(e){const t={...this.page()};t.current_page!=e&&e>=1&&e<=this.totalPages()&&(t.current_page=e,t.onPageChange?.(t),this.page.set(t))}previous(){this.current_page()>1&&this.onPageChange(this.current_page()-1)}next(){this.current_page()<this.totalPages()&&this.onPageChange(this.current_page()+1)}selectPage(e){this.onPageChange(e)}static config(e={}){return{total:e.total||0,per_page:e.per_page||0,last_page:e.last_page||0,current_page:e.current_page||1,max_size:e.max_size||5,labels:e.labels||{},onPageChange:e.onPageChange||(()=>{})}}static defaultLabels(e){return(e||"").toLowerCase().startsWith("en")?{previous:"Previous",next:"Next",previous_aria:"Previous",next_aria:"Next"}:{previous:"Anterior",next:"Siguiente",previous_aria:"Anterior",next_aria:"Siguiente"}}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPagination,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifPagination,isStandalone:!0,selector:"aif-pagination",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},ngImport:i0,template:'@if (isBuilt() && totalPages() > 0 && total() > 0) {\n<nav class="flex items-center justify-between bg-transparent sm:px-0 w-full">\n \n \x3c!-- Mobile Pagination View (Visible only on small screens) --\x3e\n <div class="flex flex-1 justify-between sm:hidden w-full gap-2">\n <button (click)="previous()" [disabled]="current_page() === 1" \n class="relative inline-flex items-center justify-center rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-slate-800 dark:border-slate-700 dark:text-slate-200 dark:hover:bg-slate-700 w-full transition-colors">\n {{ labels().previous }}\n </button>\n <button (click)="next()" [disabled]="current_page() === totalPages()" \n class="relative inline-flex items-center justify-center rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-slate-800 dark:border-slate-700 dark:text-slate-200 dark:hover:bg-slate-700 w-full transition-colors">\n {{ labels().next }}\n </button>\n </div>\n \n \x3c!-- Desktop Pagination View (Hidden on mobile) --\x3e\n <div class="hidden sm:flex sm:flex-1 sm:items-center sm:justify-end w-full">\n \n \x3c!-- Right Pager Toolbar --\x3e\n <div>\n <ul class="inline-flex -space-x-px rounded-md shadow-sm">\n \n \x3c!-- Previous Page Anchor --\x3e\n <li>\n <button (click)="previous()" [disabled]="current_page() === 1" \n class="relative inline-flex items-center rounded-l-md px-2.5 py-2 hover:z-10 text-slate-400 ring-1 ring-inset ring-slate-300 hover:bg-slate-50 focus:z-20 disabled:opacity-40 disabled:cursor-not-allowed dark:ring-slate-700 dark:hover:bg-slate-800 dark:text-slate-300 transition-colors">\n <span class="sr-only">{{ labels().previous_aria }}</span>\n \x3c!-- Custom back chevron icon SVG --\x3e\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd" d="M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z" clip-rule="evenodd" />\n </svg>\n </button>\n </li>\n \n \x3c!-- Rotatory Pages Map --\x3e\n @for (p of pages(); track p) {\n <li>\n <button (click)="selectPage(p)" \n [class.bg-primary-600]="p === current_page()"\n [class.dark:bg-primary-600]="p === current_page()"\n [class.text-white]="p === current_page()"\n [class.z-10]="p === current_page()"\n [class.text-slate-900]="p !== current_page()"\n [class.dark:text-slate-200]="p !== current_page()"\n [class.hover:bg-slate-50]="p !== current_page()"\n [class.dark:hover:bg-slate-800]="p !== current_page()"\n class="relative inline-flex items-center px-4 py-2 text-sm font-semibold ring-1 ring-inset ring-slate-300 dark:ring-slate-700 focus:z-20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 transition-colors">\n {{ p }}\n </button>\n </li>\n }\n \n \x3c!-- Next Page Anchor --\x3e\n <li>\n <button (click)="next()" [disabled]="current_page() === totalPages()" \n class="relative inline-flex items-center rounded-r-md px-2.5 py-2 hover:z-10 text-slate-400 ring-1 ring-inset ring-slate-300 hover:bg-slate-50 focus:z-20 disabled:opacity-40 disabled:cursor-not-allowed dark:ring-slate-700 dark:hover:bg-slate-800 dark:text-slate-300 transition-colors">\n <span class="sr-only">{{ labels().next_aria }}</span>\n \x3c!-- Custom next chevron icon SVG --\x3e\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd" d="M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z" clip-rule="evenodd" />\n </svg>\n </button>\n </li>\n \n </ul>\n </div>\n </div>\n</nav>\n}\n',styles:[""]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifPagination,decorators:[{type:Component,args:[{selector:"aif-pagination",imports:[],template:'@if (isBuilt() && totalPages() > 0 && total() > 0) {\n<nav class="flex items-center justify-between bg-transparent sm:px-0 w-full">\n \n \x3c!-- Mobile Pagination View (Visible only on small screens) --\x3e\n <div class="flex flex-1 justify-between sm:hidden w-full gap-2">\n <button (click)="previous()" [disabled]="current_page() === 1" \n class="relative inline-flex items-center justify-center rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-slate-800 dark:border-slate-700 dark:text-slate-200 dark:hover:bg-slate-700 w-full transition-colors">\n {{ labels().previous }}\n </button>\n <button (click)="next()" [disabled]="current_page() === totalPages()" \n class="relative inline-flex items-center justify-center rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-slate-800 dark:border-slate-700 dark:text-slate-200 dark:hover:bg-slate-700 w-full transition-colors">\n {{ labels().next }}\n </button>\n </div>\n \n \x3c!-- Desktop Pagination View (Hidden on mobile) --\x3e\n <div class="hidden sm:flex sm:flex-1 sm:items-center sm:justify-end w-full">\n \n \x3c!-- Right Pager Toolbar --\x3e\n <div>\n <ul class="inline-flex -space-x-px rounded-md shadow-sm">\n \n \x3c!-- Previous Page Anchor --\x3e\n <li>\n <button (click)="previous()" [disabled]="current_page() === 1" \n class="relative inline-flex items-center rounded-l-md px-2.5 py-2 hover:z-10 text-slate-400 ring-1 ring-inset ring-slate-300 hover:bg-slate-50 focus:z-20 disabled:opacity-40 disabled:cursor-not-allowed dark:ring-slate-700 dark:hover:bg-slate-800 dark:text-slate-300 transition-colors">\n <span class="sr-only">{{ labels().previous_aria }}</span>\n \x3c!-- Custom back chevron icon SVG --\x3e\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd" d="M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z" clip-rule="evenodd" />\n </svg>\n </button>\n </li>\n \n \x3c!-- Rotatory Pages Map --\x3e\n @for (p of pages(); track p) {\n <li>\n <button (click)="selectPage(p)" \n [class.bg-primary-600]="p === current_page()"\n [class.dark:bg-primary-600]="p === current_page()"\n [class.text-white]="p === current_page()"\n [class.z-10]="p === current_page()"\n [class.text-slate-900]="p !== current_page()"\n [class.dark:text-slate-200]="p !== current_page()"\n [class.hover:bg-slate-50]="p !== current_page()"\n [class.dark:hover:bg-slate-800]="p !== current_page()"\n class="relative inline-flex items-center px-4 py-2 text-sm font-semibold ring-1 ring-inset ring-slate-300 dark:ring-slate-700 focus:z-20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 transition-colors">\n {{ p }}\n </button>\n </li>\n }\n \n \x3c!-- Next Page Anchor --\x3e\n <li>\n <button (click)="next()" [disabled]="current_page() === totalPages()" \n class="relative inline-flex items-center rounded-r-md px-2.5 py-2 hover:z-10 text-slate-400 ring-1 ring-inset ring-slate-300 hover:bg-slate-50 focus:z-20 disabled:opacity-40 disabled:cursor-not-allowed dark:ring-slate-700 dark:hover:bg-slate-800 dark:text-slate-300 transition-colors">\n <span class="sr-only">{{ labels().next_aria }}</span>\n \x3c!-- Custom next chevron icon SVG --\x3e\n <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd" d="M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z" clip-rule="evenodd" />\n </svg>\n </button>\n </li>\n \n </ul>\n </div>\n </div>\n</nav>\n}\n'}]}],ctorParameters:()=>[],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifFormStep{formComponents=viewChildren("dynamicFormComponents",...ngDevMode?[{debugName:"formComponents"}]:[]);config=input({},...ngDevMode?[{debugName:"config"}]:[]);fb=inject(FormBuilder);currentStep=signal(0,...ngDevMode?[{debugName:"currentStep"}]:[]);steps=signal([],...ngDevMode?[{debugName:"steps"}]:[]);values=signal({},...ngDevMode?[{debugName:"values"}]:[]);values_fields=signal({},...ngDevMode?[{debugName:"values_fields"}]:[]);sending=signal(!1,...ngDevMode?[{debugName:"sending"}]:[]);alert_config=signal({message:"",show:!1,type:"warning",build:()=>{}},...ngDevMode?[{debugName:"alert_config"}]:[]);show=signal(!1,...ngDevMode?[{debugName:"show"}]:[]);modal=null;submit=()=>{};result="none";form_confirm=null;form;cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);constructor(){effect(()=>{const e=this.config();e&&Object.keys(e).length>0&&setTimeout(()=>this.build(e))})}ngOnInit(){const e=this.config()||{};e.build=e=>this.build(e),Object.keys(e).length>0&&this.build(e)}newField(e,t){return{name:t,attr:"object"==typeof e[0]?e[0]?.attr:{},control_type:"object"==typeof e[0]?e[0]?.type:e[0]||"text",type:e[0]||"text",label:e[1]||"",value:void 0!==e[2]?e[2]:null,validations:e[3]||{}}}build(e,t=null){if(this.reset(),(e=e||{}).build=e=>this.build(e,t||this.modal),this.cfg.set(e),e.fields instanceof Array&&e.fields.length>0&&e.fields[0]instanceof Array&&e.fields[0].length>0){this.show.set(!0),this.alert_config().build&&this.alert_config().build({show:!1}),this.submit=e.onSubmit||(()=>{}),this.result=e.result_type||"none";const t=[];for(let n of e.fields)for(let i of n){const n=i.fields||[];t.push({title:i.label,completed:!1,onStep:()=>(e,t)=>{e&&"function"==typeof e&&e(this.values_fields(),t,this)},config:{cat:e.cat||[],readonly:e.readonly||!1,onSubmit:e=>{this.values_fields.update(t=>({...t,...e}));const t=this.values();t[this.currentStep()]=e,this.values.set(t)},fields:n,btn:{hide:!0}}})}this.steps.set(t);let n=this.cfg();if(n.validate=n.validate||(()=>!0),n.confirm){let e={};n.confirm=n.confirm||{},n.confirm.name=n.confirm?.name||"dynamic_confirm";const t=n.confirm.name,i=this.newField(["switch","",!!n.confirm?.value],t);this.form_confirm=new FormControl(i.value),e[i.name]=this.form_confirm,this.form=this.fb.group(e)}this.cfg.set(n)}t&&(this.modal=t,this.modal.open())}reset(){this.steps.set([]),this.values.set({}),this.values_fields.set({}),this.sending.set(!1),this.alert_config.set({message:"",show:!1,type:"warning",build:()=>{}}),this.currentStep.set(0),this.show.set(!1),this.form_confirm=null}goToStep(e){}prevStep(){if(this.currentStep()>0){const e=this.steps();e[this.currentStep()].completed=!0,this.steps.set(e),this.currentStep.update(e=>e-1)}}nextStep(){this.isValidStep().then(()=>{const e=this.steps();e[this.currentStep()].completed=!0,this.steps.set(e),this.currentStep.update(e=>e+1),this.sendNotification(this.currentStep())}).catch(e=>{console.log("error en el formulario step",e)})}clearStep(){const e=this.formComponents()[this.currentStep()];msg.clear_message({message:this.cfg().buttons?.clear?.message}).then(t=>{t&&e&&(e.form.reset(),e.submitted.set(!1))})}cancelStep(){msg.cancel_message({message:this.cfg().buttons?.cancel?.message||this.cfg().buttons?.cancel}).then(e=>{e&&this.modal&&this.modal?.close()})}isValid(){const e=this.formComponents()[this.currentStep()];return e&&e.onSubmit()}sendNotification(e){const t=this.formComponents()[e];if(t&&t.config&&"function"==typeof t.config){const e=t.config();e?.onStep&&"function"==typeof e.onStep&&e.onStep(this.values_fields(),t,this)}else t&&t._config&&t._config?.onStep&&"function"==typeof t._config.onStep&&t._config.onStep(this.values_fields(),t,this)}isValidStep(){return new Promise((e,t)=>{const n=this.formComponents()[this.currentStep()];if(n)if(n.submitted.set(!0),n.form.invalid)n.form.markAllAsTouched(),t();else{const t=n._config,i=n.getDataForm();t&&"function"==typeof t.onSubmit&&t.onSubmit(i,n.feedback.bind(n),n),e()}else t()})}confirm_save(e=null){const t=this.steps();t[this.currentStep()].completed=!0,this.steps.set(t);let n=Object.values(this.values());"join"==this.result&&(n=obj_fields_join(n)),e&&(n={...n,[this.cfg().confirm.name]:!0}),this.submit(n,this.feedback.bind(this)),this.sending.set(!0)}save(){this.isValidStep().then(()=>{this.cfg().confirm&&1==this.form.get(this.cfg().confirm.name)?.value?msg.confirm_message(this.cfg().confirm).then(e=>{e?this.confirm_save(!0):this.feedback(!1,"")}):this.confirm_save()}).catch(e=>{console.log("error en el formulario step",e)})}close(){this.modal&&this.modal?.close()}feedback(e,t){if(e)this.modal&&this.modal?.close();else{this.sending.set(!1);const e=this.alert_config();e.build&&e.build({show:!0,type:"warning",message:t})}}onClassConfirm(e){const t=this.form.get(e)?.value,n={"text-amber-700 bg-amber-50 ring-amber-600/20":!t,"text-green-700 bg-green-50 ring-green-600/20":t};return this.cfg().confirm?.class&&(this.cfg().confirm.class.enable&&(n[this.cfg().confirm.class.enable]=t),this.cfg().confirm.class.disable&&(n[this.cfg().confirm.class.disable]=!t)),n}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormStep,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifFormStep,isStandalone:!0,selector:"aif-form-step",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},viewQueries:[{propertyName:"formComponents",predicate:["dynamicFormComponents"],descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (show()) {\n<div class="bg-white dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-800 p-6 shadow-sm flex flex-col w-full h-full">\n \n \x3c!-- Tailwind UI Wizard Header (Stepper) --\x3e\n <nav aria-label="Progress" class="mb-8 overflow-x-auto pb-4 -mx-2 px-2 [scrollbar-width:none] [-ms-overflow-style:none]">\n <div class="flex justify-center md:block">\n <ol role="list" class="flex items-center justify-center gap-x-2 pr-2 sm:gap-x-3 md:min-w-max md:justify-start">\n @for (step of steps(); track step; let i = $index) {\n \n \x3c!-- Render line connecting steps EXCEPT for the first one --\x3e\n @if (i !== 0) {\n <li class="relative hidden sm:block sm:w-8 md:w-14 shrink-0">\n <div class="absolute inset-0 flex items-center" aria-hidden="true">\n <div class="h-0.5 w-full bg-slate-200 dark:bg-slate-700"\n [ngClass]="{\'bg-primary-600 dark:bg-primary-500\': step.completed || currentStep() > i}"></div>\n </div>\n </li>\n }\n\n <li class="relative shrink-0">\n \x3c!-- Step State Machine: Completed, Current, or Upcoming --\x3e\n \n \x3c!-- COMPLETED OR PASSED STEP --\x3e\n @if (step.completed || currentStep() > i) {\n <a class="group flex items-center cursor-pointer" (click)="sending() ? null : goToStep(i)">\n <span class="flex h-10 w-10 items-center justify-center rounded-full bg-primary-600 hover:bg-primary-700 group-hover:bg-primary-800 transition-colors">\n <svg class="h-6 w-6 text-white" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd" d="M19.916 4.626a.75.75 0 01.208 1.04l-9 13.5a.75.75 0 01-1.154.114l-6-6a.75.75 0 011.06-1.06l5.353 5.353 8.493-12.739a.75.75 0 011.04-.208z" clip-rule="evenodd" />\n </svg>\n </span>\n <span class="ml-2 hidden max-w-[7.5rem] truncate text-sm font-medium leading-tight text-slate-900 dark:text-slate-200 md:inline">{{ step.title }}</span>\n </a>\n }\n\n \x3c!-- CURRENT ACTIVE STEP --\x3e\n @if (!step.completed && currentStep() === i) {\n <a class="flex items-center" aria-current="step">\n <span class="flex h-10 w-10 items-center justify-center rounded-full border-2 border-primary-600 bg-white dark:bg-slate-900" aria-hidden="true">\n <span class="h-2.5 w-2.5 rounded-full bg-primary-600"></span>\n </span>\n <span class="ml-2 hidden max-w-[7.5rem] truncate text-sm font-bold leading-tight text-primary-600 dark:text-primary-500 md:inline">{{ step.title }}</span>\n </a>\n }\n\n \x3c!-- UPCOMING INACTIVE STEP --\x3e\n @if (!step.completed && currentStep() < i) {\n <a class="group flex items-center">\n <span class="flex h-10 w-10 items-center justify-center rounded-full border-2 border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-900 transition-colors" aria-hidden="true">\n <span class="text-slate-500 dark:text-slate-400 font-medium">{{ i + 1 }}</span>\n </span>\n <span class="ml-2 hidden max-w-[7.5rem] truncate text-sm font-medium leading-tight text-slate-500 dark:text-slate-400 md:inline">{{ step.title }}</span>\n </a>\n }\n </li>\n }\n </ol>\n </div>\n <div class="mt-3 flex w-full justify-center text-center md:hidden">\n @if (steps()[currentStep()]; as activeStep) {\n <span class="inline-block max-w-[80vw] truncate text-sm font-semibold text-primary-600 dark:text-primary-500">\n {{ activeStep.title }}\n </span>\n }\n </div>\n </nav>\n\n \x3c!-- Wizard Forms Loop --\x3e\n @for (step of steps(); track step; let i = $index) {\n \x3c!-- Conditionally display using hidden instead of @if to preserve instance states in the DOM --\x3e\n <aif-form [config]="step.config" [hidden]="currentStep() !== i" #dynamicFormComponents></aif-form>\n }\n \n \x3c!-- Dynamic Form Confirm Checkbox --\x3e\n @if (form_confirm && cfg()?.confirm) {\n <form #container_form [formGroup]="form" class="mt-6 flex justify-center">\n <div class="px-6 py-4 rounded-xl ring-1 ring-inset" [ngClass]="onClassConfirm(cfg().confirm.name)">\n <div class="flex items-center justify-center gap-x-3">\n <input \n class="h-5 w-5 rounded border-slate-300 text-primary-600 focus:ring-primary-600 dark:border-slate-600 dark:bg-slate-700 dark:ring-offset-slate-900 transition-colors cursor-pointer" \n [formControlName]="cfg().confirm.name" \n type="checkbox" \n [id]="cfg().confirm.name">\n <label class="text-sm font-medium leading-none cursor-pointer" [for]="cfg().confirm.name">\n {{ cfg().confirm.message }}\n </label>\n </div>\n </div>\n </form>\n }\n\n \x3c!-- Error / Warning Alert Component --\x3e\n <aif-alert class="mt-4" [config]="alert_config()"></aif-alert>\n\n \x3c!-- Navigation Grid Footer --\x3e\n <div class="mt-8 pt-5 border-t border-slate-200 dark:border-slate-800 flex items-center justify-between">\n \n @if (!sending()) {\n <div class="flex-none">\n @if (currentStep() > 0) {\n <button type="button" class="rounded-md bg-white dark:bg-slate-800 px-3.5 py-2.5 text-sm font-semibold text-slate-900 dark:text-slate-200 shadow-sm ring-1 ring-inset ring-slate-300 dark:ring-slate-700 hover:bg-slate-50 dark:hover:bg-slate-700" (click)="prevStep()">\n Anterior\n </button>\n }\n </div>\n \n <div class="flex flex-1 justify-end gap-x-3">\n @if (!cfg()?.readonly && cfg().buttons?.cancel) {\n <button type="button" class="rounded-md px-3.5 py-2.5 text-sm font-semibold text-slate-500 hover:text-slate-700 dark:text-slate-400 dark:hover:text-slate-300" (click)="cancelStep()">\n {{ cfg().buttons.cancel.label || \'Cancelar\' }}\n </button>\n }\n \n @if (!cfg()?.readonly && cfg().buttons?.clear) {\n <button type="button" class="rounded-md bg-white dark:bg-slate-800 px-3.5 py-2.5 text-sm font-semibold text-slate-900 dark:text-slate-200 shadow-sm ring-1 ring-inset ring-slate-300 dark:ring-slate-700 hover:bg-slate-50 dark:hover:bg-slate-700" (click)="clearStep()">\n {{ cfg().buttons.clear.label || \'Limpiar\' }}\n </button>\n }\n \n @if (currentStep() < steps().length - 1) { \n <button type="button" class="rounded-md bg-primary-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600" (click)="nextStep()">\n Siguiente\n </button>\n }\n \n @if (!cfg()?.readonly && currentStep() === steps().length - 1) {\n <button type="button" class="rounded-md bg-primary-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600" (click)="save()">\n {{ cfg().buttons?.save?.label || \'Guardar\' }}\n </button>\n }\n \n @if (cfg()?.readonly && currentStep() === steps().length - 1) {\n <button type="button" class="rounded-md bg-slate-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-slate-500" (click)="close()">\n Cerrar vista\n </button>\n }\n </div>\n } @else {\n \x3c!-- Spinning Loader --\x3e\n <div class="w-full flex justify-center py-2">\n <svg class="animate-spin h-8 w-8 text-primary-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">\n <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>\n <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>\n </svg>\n </div>\n }\n </div>\n</div>\n}\n',styles:[""],dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"directive",type:i1$2.ɵNgNoValidate,selector:"form:not([ngNoForm]):not([ngNativeValidate])"},{kind:"directive",type:i1$2.CheckboxControlValueAccessor,selector:"input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]"},{kind:"directive",type:i1$2.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1$2.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i1$2.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i1$2.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:AifForm,selector:"aif-form",inputs:["config"]},{kind:"component",type:AifAlert,selector:"aif-alert",inputs:["config"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifFormStep,decorators:[{type:Component,args:[{selector:"aif-form-step",imports:[NgClass,ReactiveFormsModule,AifForm,AifAlert],template:'@if (show()) {\n<div class="bg-white dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-800 p-6 shadow-sm flex flex-col w-full h-full">\n \n \x3c!-- Tailwind UI Wizard Header (Stepper) --\x3e\n <nav aria-label="Progress" class="mb-8 overflow-x-auto pb-4 -mx-2 px-2 [scrollbar-width:none] [-ms-overflow-style:none]">\n <div class="flex justify-center md:block">\n <ol role="list" class="flex items-center justify-center gap-x-2 pr-2 sm:gap-x-3 md:min-w-max md:justify-start">\n @for (step of steps(); track step; let i = $index) {\n \n \x3c!-- Render line connecting steps EXCEPT for the first one --\x3e\n @if (i !== 0) {\n <li class="relative hidden sm:block sm:w-8 md:w-14 shrink-0">\n <div class="absolute inset-0 flex items-center" aria-hidden="true">\n <div class="h-0.5 w-full bg-slate-200 dark:bg-slate-700"\n [ngClass]="{\'bg-primary-600 dark:bg-primary-500\': step.completed || currentStep() > i}"></div>\n </div>\n </li>\n }\n\n <li class="relative shrink-0">\n \x3c!-- Step State Machine: Completed, Current, or Upcoming --\x3e\n \n \x3c!-- COMPLETED OR PASSED STEP --\x3e\n @if (step.completed || currentStep() > i) {\n <a class="group flex items-center cursor-pointer" (click)="sending() ? null : goToStep(i)">\n <span class="flex h-10 w-10 items-center justify-center rounded-full bg-primary-600 hover:bg-primary-700 group-hover:bg-primary-800 transition-colors">\n <svg class="h-6 w-6 text-white" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">\n <path fill-rule="evenodd" d="M19.916 4.626a.75.75 0 01.208 1.04l-9 13.5a.75.75 0 01-1.154.114l-6-6a.75.75 0 011.06-1.06l5.353 5.353 8.493-12.739a.75.75 0 011.04-.208z" clip-rule="evenodd" />\n </svg>\n </span>\n <span class="ml-2 hidden max-w-[7.5rem] truncate text-sm font-medium leading-tight text-slate-900 dark:text-slate-200 md:inline">{{ step.title }}</span>\n </a>\n }\n\n \x3c!-- CURRENT ACTIVE STEP --\x3e\n @if (!step.completed && currentStep() === i) {\n <a class="flex items-center" aria-current="step">\n <span class="flex h-10 w-10 items-center justify-center rounded-full border-2 border-primary-600 bg-white dark:bg-slate-900" aria-hidden="true">\n <span class="h-2.5 w-2.5 rounded-full bg-primary-600"></span>\n </span>\n <span class="ml-2 hidden max-w-[7.5rem] truncate text-sm font-bold leading-tight text-primary-600 dark:text-primary-500 md:inline">{{ step.title }}</span>\n </a>\n }\n\n \x3c!-- UPCOMING INACTIVE STEP --\x3e\n @if (!step.completed && currentStep() < i) {\n <a class="group flex items-center">\n <span class="flex h-10 w-10 items-center justify-center rounded-full border-2 border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-900 transition-colors" aria-hidden="true">\n <span class="text-slate-500 dark:text-slate-400 font-medium">{{ i + 1 }}</span>\n </span>\n <span class="ml-2 hidden max-w-[7.5rem] truncate text-sm font-medium leading-tight text-slate-500 dark:text-slate-400 md:inline">{{ step.title }}</span>\n </a>\n }\n </li>\n }\n </ol>\n </div>\n <div class="mt-3 flex w-full justify-center text-center md:hidden">\n @if (steps()[currentStep()]; as activeStep) {\n <span class="inline-block max-w-[80vw] truncate text-sm font-semibold text-primary-600 dark:text-primary-500">\n {{ activeStep.title }}\n </span>\n }\n </div>\n </nav>\n\n \x3c!-- Wizard Forms Loop --\x3e\n @for (step of steps(); track step; let i = $index) {\n \x3c!-- Conditionally display using hidden instead of @if to preserve instance states in the DOM --\x3e\n <aif-form [config]="step.config" [hidden]="currentStep() !== i" #dynamicFormComponents></aif-form>\n }\n \n \x3c!-- Dynamic Form Confirm Checkbox --\x3e\n @if (form_confirm && cfg()?.confirm) {\n <form #container_form [formGroup]="form" class="mt-6 flex justify-center">\n <div class="px-6 py-4 rounded-xl ring-1 ring-inset" [ngClass]="onClassConfirm(cfg().confirm.name)">\n <div class="flex items-center justify-center gap-x-3">\n <input \n class="h-5 w-5 rounded border-slate-300 text-primary-600 focus:ring-primary-600 dark:border-slate-600 dark:bg-slate-700 dark:ring-offset-slate-900 transition-colors cursor-pointer" \n [formControlName]="cfg().confirm.name" \n type="checkbox" \n [id]="cfg().confirm.name">\n <label class="text-sm font-medium leading-none cursor-pointer" [for]="cfg().confirm.name">\n {{ cfg().confirm.message }}\n </label>\n </div>\n </div>\n </form>\n }\n\n \x3c!-- Error / Warning Alert Component --\x3e\n <aif-alert class="mt-4" [config]="alert_config()"></aif-alert>\n\n \x3c!-- Navigation Grid Footer --\x3e\n <div class="mt-8 pt-5 border-t border-slate-200 dark:border-slate-800 flex items-center justify-between">\n \n @if (!sending()) {\n <div class="flex-none">\n @if (currentStep() > 0) {\n <button type="button" class="rounded-md bg-white dark:bg-slate-800 px-3.5 py-2.5 text-sm font-semibold text-slate-900 dark:text-slate-200 shadow-sm ring-1 ring-inset ring-slate-300 dark:ring-slate-700 hover:bg-slate-50 dark:hover:bg-slate-700" (click)="prevStep()">\n Anterior\n </button>\n }\n </div>\n \n <div class="flex flex-1 justify-end gap-x-3">\n @if (!cfg()?.readonly && cfg().buttons?.cancel) {\n <button type="button" class="rounded-md px-3.5 py-2.5 text-sm font-semibold text-slate-500 hover:text-slate-700 dark:text-slate-400 dark:hover:text-slate-300" (click)="cancelStep()">\n {{ cfg().buttons.cancel.label || \'Cancelar\' }}\n </button>\n }\n \n @if (!cfg()?.readonly && cfg().buttons?.clear) {\n <button type="button" class="rounded-md bg-white dark:bg-slate-800 px-3.5 py-2.5 text-sm font-semibold text-slate-900 dark:text-slate-200 shadow-sm ring-1 ring-inset ring-slate-300 dark:ring-slate-700 hover:bg-slate-50 dark:hover:bg-slate-700" (click)="clearStep()">\n {{ cfg().buttons.clear.label || \'Limpiar\' }}\n </button>\n }\n \n @if (currentStep() < steps().length - 1) { \n <button type="button" class="rounded-md bg-primary-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600" (click)="nextStep()">\n Siguiente\n </button>\n }\n \n @if (!cfg()?.readonly && currentStep() === steps().length - 1) {\n <button type="button" class="rounded-md bg-primary-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600" (click)="save()">\n {{ cfg().buttons?.save?.label || \'Guardar\' }}\n </button>\n }\n \n @if (cfg()?.readonly && currentStep() === steps().length - 1) {\n <button type="button" class="rounded-md bg-slate-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-slate-500" (click)="close()">\n Cerrar vista\n </button>\n }\n </div>\n } @else {\n \x3c!-- Spinning Loader --\x3e\n <div class="w-full flex justify-center py-2">\n <svg class="animate-spin h-8 w-8 text-primary-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">\n <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>\n <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>\n </svg>\n </div>\n }\n </div>\n</div>\n}\n'}]}],ctorParameters:()=>[],propDecorators:{formComponents:[{type:i0.ViewChildren,args:["dynamicFormComponents",{isSignal:!0}]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}]}});class AifTableColumnEngine{host;constructor(e){this.host=e}buildProcessedColumns(e=[]){const t=[],n=[];this.host.resetCheckCount();for(const i of e){if("string"==typeof i){const e=i,a=i.toLowerCase().replace(/ /g,"_");t.push({name:e,type:"text",class:"",style:{}}),n.push({name:e,type:"text",field:a});continue}const e=this.columnType(i),a={name:"string"==typeof i.name?i.name:i.name?.name??"",type:e,class:"",style:i.style||{}},s={...i,type:e};if(i.hide){const e=this.getHideClass(i.hide);a.class=e,s.class=s.class?`${s.class} ${e}`:e}t.push(a),n.push(s)}return{columns:t,fields:n}}columnType(e){if("string"==typeof e||e instanceof Array)return"text";if("object"==typeof e){if("string"==typeof e.type&&e.type.trim())return e.type;if(e.image)return"image";if(e.form)return"form";if(e.menu)return"menu";if(e.check||"check"===e.type)return this.host.incrementCheckCount(),"check";if(e.click)return"click";if(e.expand)return"expand";if(e.custom)return"custom"}return"text"}getHideClass(e){switch(e){case"sm":return"hidden sm:table-cell";case"md":return"hidden md:table-cell";case"lg":return"hidden lg:table-cell";case"xl":return"hidden xl:table-cell";default:return""}}}class AifTableBuildEngine{host;constructor(e){this.host=e}mergeConfig(e=null,t=null,n=null){return{...e||{},...t?{data:t}:{},...n?{columns:n}:{}}}build(e){!this.host.isBuilt()&&e&&(this.host.isBuiltSignal.set(!0),this.host.resetSelection(),this.host.header.set(e.header||{}),this.host.footer.set(e.footer||{}),this.host.th_hide.set(e.th_hide||!1),this.host.filter.set(e.filter||{}),this.host.navbar.set(e.navbar||{}),this.host.navbar_bottom.set(e.navbar_bottom||{}),this.host.empty.set(e.empty||{}),e.values&&this.host.addInitialValues(e.values),this.host.cfg.set(e),e.filter&&e.filter.url?this.host.loadData(e.filter.url,e.filter.fields||{}):this.host.data.set(e.data||[]),e.page?this.host.page.set({...e.page,onPageChange:e=>this.host.loadPageData(e.current_page)}):this.host.page.set({current_page:1,onPageChange:e=>this.host.loadPageData(e.current_page)}))}}class AifTableDataEngine{host;constructor(e){this.host=e}loadDataByUrl(e,t={},n=null){loading(!0);const i=rq_sanitize_method(this.host.filter().method,"post");rq_req().send(i,e,t).then(e=>{if(this.host.destroyRef.destroyed)return;loading(!1);const t=e.data||e||[];this.host.data.set(t),e.total>0&&e.total>(e.per_page||0)&&this.host.page.update(t=>({...t,...e,current_page:e.current_page||1})),e.general&&this.host.general.set(e.general),this.host.onLoad.emit({total:e.total,data:t}),"function"==typeof n&&n(!0,e.total)}).catch(e=>{this.host.destroyRef.destroyed||(loading(!1),"function"==typeof n&&n(!1,e))})}loadPageData(e){this.host.page.update(t=>({...t,current_page:e}));const t=this.host.filter()||{};this.loadDataByUrl(t.url+"?page="+e,t.fields||{})}applyFilter(e,t=null){if(!e)return;const n=this.host.filter()||{};n.fields={...n.fields||{},...e},this.host.filter.set(n),this.loadPageData(1),"function"==typeof t&&t()}refreshFilter(e=null){const t=this.host.filter()||{};t.fields=t.fields||{},this.loadPageData(this.host.page().current_page||1),"function"==typeof e&&e()}reload(e=null){this.refreshFilter(e)}}class AifTableExpandEngine{host;constructor(e){this.host=e}toggleExpand(e,t){this.host.expanded().id!==e.id?this.host.expandedSignal.set({id:e.id,data:e,...t.expand}):this.host.expandedSignal.set({})}}class AifTableModalEngine{host;constructor(e){this.host=e}openModal(e,t,n){n(e.form,t)}openForm(e,t={},n=null){const i=this.host.forms()[e]||e;if("function"!=typeof i)return;const a=i(e,t,n);a instanceof Promise?a.then(e=>e?this.openModalForm(e):null):a&&this.openModalForm(a)}openModalForm(e={}){const t=this.host.aifModal();void 0===e.backdrop&&(e.backdrop=!1),t.build(e),e.step||e.config?.step?this.host.aifFormStep().build(e.config,t):this.host.aifForm().build(e.config,t)}openClick(e,t){"function"==typeof e.click&&e.click(t,e)}}class AifTableRowEngine{host;constructor(e){this.host=e}buildRows(e=[],t=[]){return e.map((e,n)=>{const i=t.map((t,n)=>this.showField(t,e)?{...t,canShow:!0,value:this.getFieldValue(t,e,t.type),matchValue:"match"===t.type?this.getFieldMatch(t,e):null,isCheck:"check"===t.type&&this.host.isChecked(e,n),customVal:"custom"===t.type?this.customField(t,e,n):null,expandVal:"expand"===t.type?this.expandedField(t,e):null,imageSrc:"image"===t.type&&t.image?this.getFieldValue(t.image,e,"image"):null}:{...t,canShow:!1,alt:this.altField(t,e)});return{id:e.id,raw:e,index:n,mappedFields:i,isExpanded:this.host.expanded().id===e.id,isSelected:this.host.isRowChecked(e)}})}getFieldValue(e,t={},n="text"){if("string"==typeof e)return"image"===n?storage(t[e]||e):t[e];if(e instanceof Array)return json_hierarchy_val(t,e);if("object"==typeof e&&null!==e){if(e.field){if(e.field instanceof Array)return json_hierarchy_val(t,e.field);if("string"==typeof e.field)return/\{[^}]+\}/.test(e.field)?this.getFieldMatch(e,t):t[e.field]}if(e.action)return e.action}return""}getFieldMatch(e,t={}){return str_replace_vars(e.field,t,e.prefix,e.suffix)}customField(e,t,n){return"function"==typeof e.custom?e.custom(t,n):e.custom||{}}expandedField(e,t){return"function"==typeof e.expand?.field?e.expand.field(t,e):e.expand?.field||{}}showField(e,t){const n={...t,...this.host.general()||{}};if(e&&(e.show||e.hide)&&Object.keys(n).length>0){if(e.show)return e.show instanceof Array?field_evaluate(e.show[0],n,!0):field_evaluate(e.show,n);if(e.hide)return e.hide instanceof Array?!field_evaluate(e.hide[0],n,!0):!field_evaluate(e.hide,n)}return!0}altField(e,t){if("check"===e.type&&this.host.not_check().add(t.id),e.alt?.field&&"object"==typeof e.alt.field)for(const n in e.alt.field)if(void 0!==t[n]&&"object"==typeof e.alt.field[n])for(const i in e.alt.field[n])if(t[n]==i)return e.alt.field[n][i];return null}}class AifTableSelectionEngine{host;check_data={};check_num=0;constructor(e){this.host=e}reset(){this.check_num=0,this.check_data={}}resetCheckCount(){this.check_num=0}incrementCheckCount(){this.check_num++}isRowChecked(e){if(this.check_num>1){for(const t in this.check_data)if(this.check_data[t].has(e.id))return!0;return!1}const t="column_"+this.check_num;return!!this.check_data[t]?.has(e.id)}isChecked(e){return this.isRowChecked(e)}addCheckData(e={}){if(Array.isArray(e))if(this.check_num>1)for(const t in e){const n="column_"+t;this.check_data[n]=new Set(e[t])}else{const t="column_"+this.check_num;this.check_data[t]=new Set(e)}else if("object"==typeof e)for(const t in e)this.check_data[t]=new Set(e[t])}onCheckChange(e,t,n){const i=n.target,a=t?.id||"column_"+this.check_num;this.check_data[a]=this.check_data[a]||new Set,i.checked?this.check_data[a].add(e.id):this.check_data[a].delete(e.id),"function"==typeof t?.click&&t.click(e,t,0,i.checked),this.emitCheckedData()}onCheckChangeAll(e,t){const n=e.target,i=t?.id||"column_"+this.check_num;this.check_data[i]=new Set,n.checked&&this.host.data().forEach(e=>{this.host.not_check().has(e.id)||this.check_data[i].add(e.id)}),this.emitCheckedData()}emitCheckedData(){this.host.selectionTrigger.update(e=>e+1);const e=this.getCheckData();this.host.onChecked.emit(e),"function"==typeof this.host.cfg()?.onChecked&&this.host.cfg().onChecked(e)}getCheckData(){if(this.check_num>1)return this.getCheckDataMulti();const e="column_"+this.check_num;return[...this.check_data[e]||new Set]}getCheckDataMulti(){const e={};for(const t in this.check_data)e[t]=[...this.check_data[t]];return e}}class AifTableViewEngine{host;constructor(e){this.host=e}titleHeader(){const e=this.host.header();return e.title_empty&&0===this.host.data().length?e.title_empty:e.table_title||e.title||""}seeHeader(){return 0!==this.host.data().length&&!(!this.host.header().title&&!this.host.header().table_title)}seePage(){return this.host.page().total>this.host.page().per_page}seeFooter(){return!!this.host.footer().title&&this.seePage()}titleFooter(){let e=this.host.footer().table_title||this.host.footer().title||"";if(e&&Object.keys(this.host.page()).length>0){const t=this.host.page(),n={};for(const e in t)n[e]=`<span class="font-bold text-slate-900 dark:text-slate-100">${t[e]}</span>`;return str_replace_vars(e,n)}return e}totalPages(){return this.host.page().last_page||Math.ceil((this.host.page().total||0)/(this.host.page().per_page||1))}}class AifTable{onInitEvent=output();onChecked=output();onLoad=output();config=input(null,...ngDevMode?[{debugName:"config"}]:[]);dataInput=input(null,{...ngDevMode?{debugName:"dataInput"}:{},alias:"data"});columnsInput=input(null,{...ngDevMode?{debugName:"columnsInput"}:{},alias:"columns"});cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);header=signal({},...ngDevMode?[{debugName:"header"}]:[]);footer=signal({},...ngDevMode?[{debugName:"footer"}]:[]);filter=signal({},...ngDevMode?[{debugName:"filter"}]:[]);data=signal([],...ngDevMode?[{debugName:"data"}]:[]);page=signal({},...ngDevMode?[{debugName:"page"}]:[]);navbar=signal({},...ngDevMode?[{debugName:"navbar"}]:[]);navbar_bottom=signal({},...ngDevMode?[{debugName:"navbar_bottom"}]:[]);general=signal({},...ngDevMode?[{debugName:"general"}]:[]);th_hide=signal(!1,...ngDevMode?[{debugName:"th_hide"}]:[]);expanded=signal({},...ngDevMode?[{debugName:"expanded"}]:[]);not_check=signal(new Set,...ngDevMode?[{debugName:"not_check"}]:[]);empty=signal({},...ngDevMode?[{debugName:"empty"}]:[]);selectionTrigger=signal(0,...ngDevMode?[{debugName:"selectionTrigger"}]:[]);aifModal=viewChild.required(AifModal);aifForm=viewChild.required(AifForm);aifFormStep=viewChild.required(AifFormStep);destroyRef=inject(DestroyRef);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);buildEngine=new AifTableBuildEngine(this);columnEngine=new AifTableColumnEngine(this);dataEngine=new AifTableDataEngine(this);expandEngine=new AifTableExpandEngine(this);modalEngine=new AifTableModalEngine(this);rowEngine=new AifTableRowEngine(this);selectionEngine=new AifTableSelectionEngine(this);viewEngine=new AifTableViewEngine(this);forms=computed(()=>this.cfg().forms||{},...ngDevMode?[{debugName:"forms"}]:[]);style=computed(()=>{const e=this.cfg().style||{};return{...e,table:e.table??"bg-white dark:bg-slate-900 rounded-lg shadow-sm border border-slate-200 dark:border-slate-800",padding:e.padding??"p-4 md:p-6"}},...ngDevMode?[{debugName:"style"}]:[]);processedColumns=computed(()=>{const e=this.cfg().columns||this.columnsInput()||[];return this.columnEngine.buildProcessedColumns(e)},...ngDevMode?[{debugName:"processedColumns"}]:[]);rows=computed(()=>{this.selectionTrigger();const e=this.data(),t=this.processedColumns().fields;return this.rowEngine.buildRows(e,t)},...ngDevMode?[{debugName:"rows"}]:[]);titleHeader=computed(()=>this.viewEngine.titleHeader(),...ngDevMode?[{debugName:"titleHeader"}]:[]);seeHeader=computed(()=>this.viewEngine.seeHeader(),...ngDevMode?[{debugName:"seeHeader"}]:[]);seePage=computed(()=>this.viewEngine.seePage(),...ngDevMode?[{debugName:"seePage"}]:[]);seeFooter=computed(()=>this.viewEngine.seeFooter(),...ngDevMode?[{debugName:"seeFooter"}]:[]);titleFooter=computed(()=>this.viewEngine.titleFooter(),...ngDevMode?[{debugName:"titleFooter"}]:[]);totalPages=computed(()=>this.viewEngine.totalPages(),...ngDevMode?[{debugName:"totalPages"}]:[]);constructor(){effect(()=>{const e=this.getMergedConfig();Object.keys(e).length>0&&untracked(()=>this.reBuild(e))})}ngOnInit(){(this.config()||this.dataInput()||this.columnsInput())&&this.build(this.getMergedConfig()),setTimeout(()=>{this.destroyRef.destroyed||this.onInitEvent.emit()},0)}reBuild(e){this.isBuilt.set(!1),this.build(e)}build(e){this.buildEngine.build(e)}get isBuiltSignal(){return this.isBuilt}resetSelection(){this.selectionEngine.reset()}addInitialValues(e={}){this.addCheckData(e)}loadData(e,t={}){this.dataEngine.loadDataByUrl(e,t)}incrementCheckCount(){this.selectionEngine.incrementCheckCount()}resetCheckCount(){this.selectionEngine.resetCheckCount()}loadDataByUrl(e,t={},n=null){this.dataEngine.loadDataByUrl(e,t,n)}loadPageData(e){this.dataEngine.loadPageData(e)}isRowChecked(e){return this.selectionEngine.isRowChecked(e)}isChecked(e,t){return this.selectionEngine.isChecked(e)}addCheckData(e={}){this.selectionEngine.addCheckData(e)}onCheckChange(e,t,n){this.selectionEngine.onCheckChange(e,t,n)}onCheckChangeAll(e,t){this.selectionEngine.onCheckChangeAll(e,t)}getCheckData(){return this.selectionEngine.getCheckData()}getCheckDataMulti(){return this.selectionEngine.getCheckDataMulti()}setNavBar(e,t="top"){"bottom"===t?this.navbar_bottom.set(e):this.navbar.set(e)}applyFilter(e,t=null){this.dataEngine.applyFilter(e,t)}refreshFilter(e=null){this.dataEngine.refreshFilter(e)}reload(e=null){this.dataEngine.reload(e)}openModal(e,t){this.modalEngine.openModal(e,t,this.openForm.bind(this))}openForm(e,t={}){this.modalEngine.openForm(e,t,this)}openModalForm(e={}){this.modalEngine.openModalForm(e)}openClick(e,t){this.modalEngine.openClick(e,t)}toggleExpand(e,t){this.expandEngine.toggleExpand(e,t)}get expandedSignal(){return this.expanded}getMergedConfig(){return this.buildEngine.mergeConfig(this.config(),this.dataInput(),this.columnsInput())}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifTable,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifTable,isStandalone:!0,selector:"aif-table",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null},dataInput:{classPropertyName:"dataInput",publicName:"data",isSignal:!0,isRequired:!1,transformFunction:null},columnsInput:{classPropertyName:"columnsInput",publicName:"columns",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInitEvent:"onInitEvent",onChecked:"onChecked",onLoad:"onLoad"},viewQueries:[{propertyName:"aifModal",first:!0,predicate:AifModal,descendants:!0,isSignal:!0},{propertyName:"aifForm",first:!0,predicate:AifForm,descendants:!0,isSignal:!0},{propertyName:"aifFormStep",first:!0,predicate:AifFormStep,descendants:!0,isSignal:!0}],ngImport:i0,template:'@if (config() || dataInput() || columnsInput() || isBuilt()) {\n<div class="aif-table" [ngClass]="style().table">\n <div [ngClass]="style().padding">\n\n\n @if (navbar() && (navbar().left?.length || navbar().right?.length || navbar().center?.length)) {\n <div class="mb-4">\n <aif-nav-bar [config]="navbar()"></aif-nav-bar>\n </div>\n }\n\n @if (seeHeader()) {\n <div class="flex flex-row mb-4">\n <div class="w-full">\n <h5 class="text-lg font-semibold text-slate-800 dark:text-slate-100" [ngClass]="header().class"\n [style]="header().style">\n {{ titleHeader() }}\n </h5>\n </div>\n </div>\n }\n\n @if (data().length > 0) {\n <div class="relative w-full overflow-visible rounded" [ngClass]="style().table.includes(\'border-none\') ? \'\' : \'border border-slate-200 dark:border-slate-700\'">\n <div class="overflow-x-auto overflow-y-visible">\n <table class="w-full text-left text-sm text-slate-600 dark:text-slate-300">\n @if (!th_hide()) {\n <thead\n class="bg-slate-100/80 dark:bg-slate-800 text-slate-900 dark:text-white text-xs font-bold"\n [class.uppercase]="!!style().th_uppercase"\n [class.normal-case]="!style().th_uppercase">\n <tr>\n @for (col of processedColumns().columns; track col.name || $index; let hix = $index) {\n <th class="py-3 border-b border-slate-200 dark:border-slate-700 font-bold text-left"\n [ngClass]="col?.class" [style]="col?.style"\n [class.px-4]="![\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(col?.type)"\n [class.px-2]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(col?.type)"\n [class.whitespace-nowrap]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(col?.type)"\n [class.w-px]="[\'check\'].includes(col?.type)"\n [class.w-12]="[\'form\', \'icon\', \'menu\', \'expand\'].includes(col?.type)"\n [class.text-right]="[\'form\', \'icon\', \'menu\', \'expand\'].includes(col?.type)">\n @if (col?.type === \'icon\') {\n <i [class]="col.icon"></i>\n } @else if (col?.type === \'check\') {\n <input type="checkbox"\n class="rounded border-slate-300 text-primary-600 focus:ring-primary-500 focus:ring-2 bg-white dark:bg-slate-700 dark:border-slate-600 cursor-pointer"\n (click)="onCheckChangeAll($event, col); $event.stopPropagation()">\n } @else {\n {{ col?.name || \'\' }}\n }\n </th>\n }\n </tr>\n </thead>\n }\n\n <tbody class="divide-y divide-slate-200 dark:divide-slate-700/50 bg-white dark:bg-slate-900">\n @for (row of rows(); track row.id) {\n <tr class="hover:bg-slate-100/50 dark:hover:bg-slate-800/50 transition-colors" [ngClass]="[\n row.isSelected ? \'bg-primary-50 dark:bg-primary-900/10\' : \'\',\n row.isExpanded ? \'bg-slate-100/40 dark:bg-slate-800\' : \'\',\n row.index % 2 !== 0 ? \'bg-slate-50 dark:bg-slate-800/20\' : \'\',\n style().tr || \'\'\n ]">\n\n @for (field of row.mappedFields; track field.name || $index; let idx = $index) {\n <td class="py-2 align-middle" [ngClass]="field.class" [style]="field.style"\n [class.px-4]="![\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)"\n [class.px-2]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)"\n [class.whitespace-nowrap]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)"\n [class.w-px]="[\'check\'].includes(field?.type)"\n [class.w-12]="[\'form\', \'icon\', \'menu\', \'expand\'].includes(field?.type)"\n [class.text-right]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)">\n @if (field.canShow) {\n @switch (field.type) {\n\n @case (\'text\') {\n <span class="text-slate-700 dark:text-slate-300">{{ field.value }}</span>\n }\n\n @case (\'date\') {\n <span class="text-slate-600 dark:text-slate-400">{{ field.value | date: \'dd/MM/yyyy HH:mm\' }}</span>\n }\n\n @case (\'datetime\') {\n <span class="text-slate-600 dark:text-slate-400">{{ field.value | date: \'dd/MM/yyyy HH:mm\' }}</span>\n }\n\n @case (\'match\') {\n <span class="text-slate-700 dark:text-slate-300">{{ field.matchValue }}</span>\n }\n\n @case (\'image\') {\n @if (field.click) {\n <a (click)="openClick(field, row.raw)"\n class="inline-flex items-center text-primary-600 hover:text-primary-700 cursor-pointer"\n [ngClass]="field.class" [style]="field.style">\n <img [src]="field.imageSrc" class="w-8 h-8 rounded-full mr-2 object-cover" />\n {{ field.value }}\n </a>\n } @else {\n <span class="inline-flex items-center text-slate-700 dark:text-slate-300" [ngClass]="field.class"\n [style]="field.style">\n <img [src]="field.imageSrc" class="w-8 h-8 rounded-full mr-2 object-cover" />\n {{ field.value }}\n </span>\n }\n }\n\n @case (\'click\') {\n <a (click)="openClick(field, row.raw)"\n class="text-primary-600 hover:text-primary-700 dark:text-primary-500 dark:hover:text-primary-400 cursor-pointer underline hover:no-underline transition-all"\n [ngClass]="field.class" [style]="field.style">\n {{ field.value }}\n </a>\n }\n\n @case (\'form\') {\n <a (click)="openModal(field, row.raw)"\n class="inline-flex items-center justify-center w-8 h-8 transition-colors hover:text-primary-600 dark:hover:text-primary-400 cursor-pointer"\n [title]="field.title || \'\'" [ngClass]="field.class" [style]="field.style">\n <i [class]="field.icon"></i>\n </a>\n }\n\n @case (\'menu\') {\n <aif-menu [config]="field.menu" [fields]="row.raw" [index]="row.index" [total]="rows().length"></aif-menu>\n }\n\n @case (\'check\') {\n <input type="checkbox" [checked]="field.isCheck"\n (click)="onCheckChange(row.raw, field, $event); $event.stopPropagation()" [value]="row.id"\n class="rounded border-slate-300 text-primary-600 focus:ring-primary-500 bg-white dark:bg-slate-700 dark:border-slate-600 cursor-pointer">\n }\n\n @case (\'expand\') {\n <button (click)="toggleExpand(row.raw, field)"\n class="inline-flex items-center justify-center w-8 h-8 transition-colors hover:text-primary-600 dark:hover:text-primary-400 ml-auto">\n <svg class="w-4 h-4 transition-transform duration-200" [ngClass]="{\'rotate-90\': row.isExpanded}"\n fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />\n </svg>\n </button>\n }\n\n @case (\'component\') {\n <aif-create [config]="field"></aif-create>\n }\n\n @case (\'custom\') {\n @if (field.customVal) {\n @switch (field.customVal.type) {\n @case (\'button\') {\n <button (click)="field.customVal?.click(row.raw)"\n class="px-3 py-1.5 text-sm font-medium rounded-md transition-colors"\n [ngClass]="field.customVal?.class || \'bg-primary-50 text-primary-700 hover:bg-primary-100 dark:bg-primary-900/30 dark:text-primary-400 dark:hover:bg-primary-900/50\'">\n @if (field.customVal.icon) { <i [class]="field.customVal.icon"></i> }\n {{ field.customVal?.text }}\n </button>\n }\n @case (\'text\') {\n <span [ngClass]="field.customVal.class">{{ field.customVal?.text }}</span>\n }\n @case (\'html\') {\n <span [ngClass]="field.customVal?.class" [class.cursor-pointer]="!!field.customVal?.click"\n [innerHTML]="field.customVal?.html" (click)="field.customVal?.click?.(row.raw)"></span>\n }\n @default {\n @if (field.customVal.html) {\n <div [ngClass]="field.customVal?.class" [class.cursor-pointer]="!!field.customVal?.click"\n [innerHTML]="field.customVal?.html" (click)="field.customVal?.click?.(row.raw)"></div>\n }\n }\n }\n }\n }\n }\n } @else {\n @if (field.alt) {\n <span [style]="field.alt?.style" [title]="field.alt?.title" [ngClass]="field.alt?.class"\n [innerHTML]="field.alt?.html" (click)="field.alt?.click?.(row.raw)"></span>\n }\n }\n </td>\n }\n </tr>\n\n @if (row.isExpanded) {\n <tr class="bg-slate-50/80 dark:bg-slate-900/80 border-b border-slate-100 dark:border-slate-800">\n <td [colSpan]="processedColumns().fields.length" class="p-0">\n <div class="px-6 py-4 overflow-hidden shadow-inner">\n <aif-create [config]="expanded()"></aif-create>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n </div>\n\n \x3c!-- Pagination Footer --\x3e\n @if (seePage() || seeFooter()) {\n <div\n class="flex flex-col sm:flex-row justify-between items-center mt-4 text-sm text-slate-600 dark:text-slate-400 gap-4">\n @if (seeFooter()) {\n <div class="w-full sm:w-auto text-left" [innerHTML]="titleFooter()">\n </div>\n }\n\n @if (seePage()) {\n <div class="w-full sm:w-auto flex flex-row items-center gap-2 justify-end">\n <aif-pagination [config]="page()"></aif-pagination>\n </div>\n }\n </div>\n }\n\n @if (navbar_bottom() && (navbar_bottom().left?.length || navbar_bottom().right?.length ||\n navbar_bottom().center?.length)) {\n <div class="mt-4">\n <aif-nav-bar [config]="navbar_bottom()"></aif-nav-bar>\n </div>\n }\n } @else {\n \x3c!-- Empty State --\x3e\n <div class="py-12 flex flex-col items-center justify-center text-slate-400 dark:text-slate-500">\n @if (empty().icon) {\n <i [class]="empty().icon" class="text-6xl mb-4 text-slate-300 dark:text-slate-600"></i>\n } @else {\n <svg class="w-12 h-12 mb-4 text-slate-300 dark:text-slate-600" fill="none" stroke="currentColor"\n viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"\n d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 002-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10">\n </path>\n </svg>\n }\n <p class="text-sm font-medium">{{ empty().title || \'No data available to display\' }}</p>\n </div>\n }\n\n </div>\n</div>\n}\n\n<aif-modal>\n <aif-form></aif-form>\n <aif-form-step></aif-form-step>\n</aif-modal>\n',styles:[":host{display:block}.tr-expand-content{animation:expandDown .2s ease-out}@keyframes expandDown{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"],dependencies:[{kind:"directive",type:NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"component",type:AifCreate,selector:"aif-create",inputs:["config"],outputs:["onInit"]},{kind:"component",type:AifMenu,selector:"aif-menu",inputs:["config","fields","index","total"],outputs:["onInit"]},{kind:"component",type:AifNavBar,selector:"aif-nav-bar",inputs:["config","side"],outputs:["onInit"]},{kind:"component",type:AifPagination,selector:"aif-pagination",inputs:["config"],outputs:["onInit"]},{kind:"component",type:AifModal,selector:"aif-modal",inputs:["config"]},{kind:"component",type:AifForm,selector:"aif-form",inputs:["config"]},{kind:"component",type:AifFormStep,selector:"aif-form-step",inputs:["config"]},{kind:"pipe",type:DatePipe,name:"date"}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifTable,decorators:[{type:Component,args:[{selector:"aif-table",imports:[DatePipe,NgClass,AifCreate,AifMenu,AifNavBar,AifPagination,AifModal,AifForm,AifFormStep],template:'@if (config() || dataInput() || columnsInput() || isBuilt()) {\n<div class="aif-table" [ngClass]="style().table">\n <div [ngClass]="style().padding">\n\n\n @if (navbar() && (navbar().left?.length || navbar().right?.length || navbar().center?.length)) {\n <div class="mb-4">\n <aif-nav-bar [config]="navbar()"></aif-nav-bar>\n </div>\n }\n\n @if (seeHeader()) {\n <div class="flex flex-row mb-4">\n <div class="w-full">\n <h5 class="text-lg font-semibold text-slate-800 dark:text-slate-100" [ngClass]="header().class"\n [style]="header().style">\n {{ titleHeader() }}\n </h5>\n </div>\n </div>\n }\n\n @if (data().length > 0) {\n <div class="relative w-full overflow-visible rounded" [ngClass]="style().table.includes(\'border-none\') ? \'\' : \'border border-slate-200 dark:border-slate-700\'">\n <div class="overflow-x-auto overflow-y-visible">\n <table class="w-full text-left text-sm text-slate-600 dark:text-slate-300">\n @if (!th_hide()) {\n <thead\n class="bg-slate-100/80 dark:bg-slate-800 text-slate-900 dark:text-white text-xs font-bold"\n [class.uppercase]="!!style().th_uppercase"\n [class.normal-case]="!style().th_uppercase">\n <tr>\n @for (col of processedColumns().columns; track col.name || $index; let hix = $index) {\n <th class="py-3 border-b border-slate-200 dark:border-slate-700 font-bold text-left"\n [ngClass]="col?.class" [style]="col?.style"\n [class.px-4]="![\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(col?.type)"\n [class.px-2]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(col?.type)"\n [class.whitespace-nowrap]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(col?.type)"\n [class.w-px]="[\'check\'].includes(col?.type)"\n [class.w-12]="[\'form\', \'icon\', \'menu\', \'expand\'].includes(col?.type)"\n [class.text-right]="[\'form\', \'icon\', \'menu\', \'expand\'].includes(col?.type)">\n @if (col?.type === \'icon\') {\n <i [class]="col.icon"></i>\n } @else if (col?.type === \'check\') {\n <input type="checkbox"\n class="rounded border-slate-300 text-primary-600 focus:ring-primary-500 focus:ring-2 bg-white dark:bg-slate-700 dark:border-slate-600 cursor-pointer"\n (click)="onCheckChangeAll($event, col); $event.stopPropagation()">\n } @else {\n {{ col?.name || \'\' }}\n }\n </th>\n }\n </tr>\n </thead>\n }\n\n <tbody class="divide-y divide-slate-200 dark:divide-slate-700/50 bg-white dark:bg-slate-900">\n @for (row of rows(); track row.id) {\n <tr class="hover:bg-slate-100/50 dark:hover:bg-slate-800/50 transition-colors" [ngClass]="[\n row.isSelected ? \'bg-primary-50 dark:bg-primary-900/10\' : \'\',\n row.isExpanded ? \'bg-slate-100/40 dark:bg-slate-800\' : \'\',\n row.index % 2 !== 0 ? \'bg-slate-50 dark:bg-slate-800/20\' : \'\',\n style().tr || \'\'\n ]">\n\n @for (field of row.mappedFields; track field.name || $index; let idx = $index) {\n <td class="py-2 align-middle" [ngClass]="field.class" [style]="field.style"\n [class.px-4]="![\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)"\n [class.px-2]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)"\n [class.whitespace-nowrap]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)"\n [class.w-px]="[\'check\'].includes(field?.type)"\n [class.w-12]="[\'form\', \'icon\', \'menu\', \'expand\'].includes(field?.type)"\n [class.text-right]="[\'form\', \'icon\', \'check\', \'menu\', \'expand\'].includes(field?.type)">\n @if (field.canShow) {\n @switch (field.type) {\n\n @case (\'text\') {\n <span class="text-slate-700 dark:text-slate-300">{{ field.value }}</span>\n }\n\n @case (\'date\') {\n <span class="text-slate-600 dark:text-slate-400">{{ field.value | date: \'dd/MM/yyyy HH:mm\' }}</span>\n }\n\n @case (\'datetime\') {\n <span class="text-slate-600 dark:text-slate-400">{{ field.value | date: \'dd/MM/yyyy HH:mm\' }}</span>\n }\n\n @case (\'match\') {\n <span class="text-slate-700 dark:text-slate-300">{{ field.matchValue }}</span>\n }\n\n @case (\'image\') {\n @if (field.click) {\n <a (click)="openClick(field, row.raw)"\n class="inline-flex items-center text-primary-600 hover:text-primary-700 cursor-pointer"\n [ngClass]="field.class" [style]="field.style">\n <img [src]="field.imageSrc" class="w-8 h-8 rounded-full mr-2 object-cover" />\n {{ field.value }}\n </a>\n } @else {\n <span class="inline-flex items-center text-slate-700 dark:text-slate-300" [ngClass]="field.class"\n [style]="field.style">\n <img [src]="field.imageSrc" class="w-8 h-8 rounded-full mr-2 object-cover" />\n {{ field.value }}\n </span>\n }\n }\n\n @case (\'click\') {\n <a (click)="openClick(field, row.raw)"\n class="text-primary-600 hover:text-primary-700 dark:text-primary-500 dark:hover:text-primary-400 cursor-pointer underline hover:no-underline transition-all"\n [ngClass]="field.class" [style]="field.style">\n {{ field.value }}\n </a>\n }\n\n @case (\'form\') {\n <a (click)="openModal(field, row.raw)"\n class="inline-flex items-center justify-center w-8 h-8 transition-colors hover:text-primary-600 dark:hover:text-primary-400 cursor-pointer"\n [title]="field.title || \'\'" [ngClass]="field.class" [style]="field.style">\n <i [class]="field.icon"></i>\n </a>\n }\n\n @case (\'menu\') {\n <aif-menu [config]="field.menu" [fields]="row.raw" [index]="row.index" [total]="rows().length"></aif-menu>\n }\n\n @case (\'check\') {\n <input type="checkbox" [checked]="field.isCheck"\n (click)="onCheckChange(row.raw, field, $event); $event.stopPropagation()" [value]="row.id"\n class="rounded border-slate-300 text-primary-600 focus:ring-primary-500 bg-white dark:bg-slate-700 dark:border-slate-600 cursor-pointer">\n }\n\n @case (\'expand\') {\n <button (click)="toggleExpand(row.raw, field)"\n class="inline-flex items-center justify-center w-8 h-8 transition-colors hover:text-primary-600 dark:hover:text-primary-400 ml-auto">\n <svg class="w-4 h-4 transition-transform duration-200" [ngClass]="{\'rotate-90\': row.isExpanded}"\n fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />\n </svg>\n </button>\n }\n\n @case (\'component\') {\n <aif-create [config]="field"></aif-create>\n }\n\n @case (\'custom\') {\n @if (field.customVal) {\n @switch (field.customVal.type) {\n @case (\'button\') {\n <button (click)="field.customVal?.click(row.raw)"\n class="px-3 py-1.5 text-sm font-medium rounded-md transition-colors"\n [ngClass]="field.customVal?.class || \'bg-primary-50 text-primary-700 hover:bg-primary-100 dark:bg-primary-900/30 dark:text-primary-400 dark:hover:bg-primary-900/50\'">\n @if (field.customVal.icon) { <i [class]="field.customVal.icon"></i> }\n {{ field.customVal?.text }}\n </button>\n }\n @case (\'text\') {\n <span [ngClass]="field.customVal.class">{{ field.customVal?.text }}</span>\n }\n @case (\'html\') {\n <span [ngClass]="field.customVal?.class" [class.cursor-pointer]="!!field.customVal?.click"\n [innerHTML]="field.customVal?.html" (click)="field.customVal?.click?.(row.raw)"></span>\n }\n @default {\n @if (field.customVal.html) {\n <div [ngClass]="field.customVal?.class" [class.cursor-pointer]="!!field.customVal?.click"\n [innerHTML]="field.customVal?.html" (click)="field.customVal?.click?.(row.raw)"></div>\n }\n }\n }\n }\n }\n }\n } @else {\n @if (field.alt) {\n <span [style]="field.alt?.style" [title]="field.alt?.title" [ngClass]="field.alt?.class"\n [innerHTML]="field.alt?.html" (click)="field.alt?.click?.(row.raw)"></span>\n }\n }\n </td>\n }\n </tr>\n\n @if (row.isExpanded) {\n <tr class="bg-slate-50/80 dark:bg-slate-900/80 border-b border-slate-100 dark:border-slate-800">\n <td [colSpan]="processedColumns().fields.length" class="p-0">\n <div class="px-6 py-4 overflow-hidden shadow-inner">\n <aif-create [config]="expanded()"></aif-create>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n </div>\n\n \x3c!-- Pagination Footer --\x3e\n @if (seePage() || seeFooter()) {\n <div\n class="flex flex-col sm:flex-row justify-between items-center mt-4 text-sm text-slate-600 dark:text-slate-400 gap-4">\n @if (seeFooter()) {\n <div class="w-full sm:w-auto text-left" [innerHTML]="titleFooter()">\n </div>\n }\n\n @if (seePage()) {\n <div class="w-full sm:w-auto flex flex-row items-center gap-2 justify-end">\n <aif-pagination [config]="page()"></aif-pagination>\n </div>\n }\n </div>\n }\n\n @if (navbar_bottom() && (navbar_bottom().left?.length || navbar_bottom().right?.length ||\n navbar_bottom().center?.length)) {\n <div class="mt-4">\n <aif-nav-bar [config]="navbar_bottom()"></aif-nav-bar>\n </div>\n }\n } @else {\n \x3c!-- Empty State --\x3e\n <div class="py-12 flex flex-col items-center justify-center text-slate-400 dark:text-slate-500">\n @if (empty().icon) {\n <i [class]="empty().icon" class="text-6xl mb-4 text-slate-300 dark:text-slate-600"></i>\n } @else {\n <svg class="w-12 h-12 mb-4 text-slate-300 dark:text-slate-600" fill="none" stroke="currentColor"\n viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"\n d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 002-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10">\n </path>\n </svg>\n }\n <p class="text-sm font-medium">{{ empty().title || \'No data available to display\' }}</p>\n </div>\n }\n\n </div>\n</div>\n}\n\n<aif-modal>\n <aif-form></aif-form>\n <aif-form-step></aif-form-step>\n</aif-modal>\n',styles:[":host{display:block}.tr-expand-content{animation:expandDown .2s ease-out}@keyframes expandDown{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"]}]}],ctorParameters:()=>[],propDecorators:{onInitEvent:[{type:i0.Output,args:["onInitEvent"]}],onChecked:[{type:i0.Output,args:["onChecked"]}],onLoad:[{type:i0.Output,args:["onLoad"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],dataInput:[{type:i0.Input,args:[{isSignal:!0,alias:"data",required:!1}]}],columnsInput:[{type:i0.Input,args:[{isSignal:!0,alias:"columns",required:!1}]}],aifModal:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifModal),{isSignal:!0}]}],aifForm:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifForm),{isSignal:!0}]}],aifFormStep:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifFormStep),{isSignal:!0}]}]}});class AifGrid{onInit=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);datePipe=inject(DatePipe);currencyPipe=inject(CurrencyPipe);decimalPipe=inject(DecimalPipe);see=section("content","page","footer","header","message");cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);data=signal([],...ngDevMode?[{debugName:"data"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);header=signal({},...ngDevMode?[{debugName:"header"}]:[]);footer=signal({},...ngDevMode?[{debugName:"footer"}]:[]);page=signal({},...ngDevMode?[{debugName:"page"}]:[]);general=signal({},...ngDevMode?[{debugName:"general"}]:[]);style=signal({},...ngDevMode?[{debugName:"style"}]:[]);navbar=signal({},...ngDevMode?[{debugName:"navbar"}]:[]);navbar_bottom=signal({},...ngDevMode?[{debugName:"navbar_bottom"}]:[]);fields=signal({},...ngDevMode?[{debugName:"fields"}]:[]);format=signal({},...ngDevMode?[{debugName:"format"}]:[]);buttons=signal({},...ngDevMode?[{debugName:"buttons"}]:[]);loadingMore=signal(!1,...ngDevMode?[{debugName:"loadingMore"}]:[]);sentinel=viewChild("sentinel",...ngDevMode?[{debugName:"sentinel"}]:[]);observer=null;aifModal=viewChild.required(AifModal);aifForm=viewChild.required(AifForm);aifFormStep=viewChild.required(AifFormStep);forms=computed(()=>this.cfg().forms||{},...ngDevMode?[{debugName:"forms"}]:[]);items=computed(()=>{const e=this.data(),t=this.fields(),n=this.format(),i=this.buttons();return e.map((e,a)=>{const s={id:this.getFieldValue(t.id||"id",e),title:this.getFieldValue(t.title||"name",e),description:t.description?this.getFieldValue(t.description,e):null,image:t.image?this.getFieldValue(t.image,e,"image"):null,tag:t.tag?this.getFieldValue(t.tag,e):null,status:t.status?this.getFieldValue(t.status,e):null};if(n)for(const e in n)void 0!==s[e]&&(s[e]=this.applyFormat(s[e],n[e]));return{...e,_grid:{...s,resolvedImage:s.image?storage(s.image):null,buttons:{top_left:(i.top_left||[]).map(t=>this.resolveButton(t,e)),top_right:(i.top_right||[]).map(t=>this.resolveButton(t,e)),bottom_left:(i.bottom_left||[]).map(t=>this.resolveButton(t,e)),bottom_right:(i.bottom_right||[]).map(t=>this.resolveButton(t,e)),center:(i.center||[]).map(t=>this.resolveButton(t,e))}}}})},...ngDevMode?[{debugName:"items"}]:[]);hasHeader=computed(()=>!!this.header().table_title||this.header().title_empty&&0===this.page().total,...ngDevMode?[{debugName:"hasHeader"}]:[]);hasFooter=computed(()=>!!this.footer().table_title,...ngDevMode?[{debugName:"hasFooter"}]:[]);showPagination=computed(()=>this.page().total>this.page().per_page,...ngDevMode?[{debugName:"showPagination"}]:[]);fxEvent={};filter={};ngOnInit(){const e=this.config();e&&(e.filter?.url||e.data&&e.data.length>0)&&this.build(e)}ngAfterViewInit(){this.initInfiniteScroll(),setTimeout(()=>this.onInit.emit())}ngOnDestroy(){this.observer&&this.observer.disconnect()}initInfiniteScroll(){const e=this.sentinel();e&&(this.observer=new IntersectionObserver(e=>{e[0].isIntersecting&&!this.loadingMore()&&this.page().current_page<this.page().last_page&&this.loadPageData(this.page().current_page+1)},{threshold:.1}),this.observer.observe(e.nativeElement))}reBuild(e){this.isBuilt.set(!1),this.build(e)}build(e={}){!e||this.isBuilt()&&this.cfg()===e||(this.isBuilt.set(!0),this.buildFunctions(e),this.buildConfig(e),this.buildData(e),this.buildPage(e.page),this.cfg.set(e))}buildFunctions(e={}){this.fxEvent={getContext:()=>this,onLoad:e.onLoad||(()=>{}),onChecked:e.onChecked||(()=>{}),onLoadChecked:e.onLoadChecked||(()=>{}),beforeOnData:e.beforeOnData||(()=>{}),onClick:e.click||(()=>{})}}buildConfig(e={}){this.header.set(e.header||{}),this.footer.set(e.footer||{}),this.filter=e.filter||{},this.style.set(e.style||{}),this.navbar.set(e.navbar||{}),this.navbar_bottom.set(e.navbar_bottom||{}),this.fields.set(e.fields||{}),this.format.set(e.format||{}),this.buttons.set(e.buttons||{})}buildData(e={}){if(e.filter?.url)this.loadDataByUrl(e.filter.url,e.filter.fields||{});else{const t=e.data||[];t.length>0&&this.see.show("content"),this.data.set(t)}}loadDataByUrl(e,t={},n=null){if(this.loadingMore())return;this.loadingMore.set(!0);const i=e.includes("page=")&&!e.includes("page=1");i||(this.see.hide("content","page","footer","header"),loading(!0));const a=rq_sanitize_method(this.filter.method,"post");rq_req().send(a,e,t).then(e=>{const t=e.data||e||[];e.total>0&&(this.see.show("content"),this.buildPage(e),this.setVarsFooter(e)),e.general&&this.general.set(e.general),this.setVarsHeader(e),i?this.data.update(e=>[...e,...t]):(this.data.set(t),loading(!1)),this.loadingMore.set(!1),"function"==typeof n&&n(!0,e.total),this.fxEvent.onLoad(e.total,t)}).catch(e=>{loading(!1),this.loadingMore.set(!1),"function"==typeof n&&n(!1,e)})}buildPage(e={}){const t=e||{};t.onPageChange=e=>{this.loadPageData(e.current_page||1)},this.page.set(t)}loadPageData(e,t=null){this.page.update(t=>({...t,current_page:e})),this.fxEvent.beforeOnData();const n=this.filter||{},i=n.url+(n.url.includes("?")?"&":"?")+"page="+e;this.loadDataByUrl(i,n.fields||{},t)}setVarsHeader(e){const t=this.general()||{},n={...e,...t},i={...this.header()};i.line=i.line||!1,i.title?(i.table_title=str_replace_vars(i.title,n),this.see.show("header")):i.title_empty&&0===e.total?this.see.show("header"):this.see.hide("header"),this.header.set(i)}setVarsFooter(e){const t={...e,...this.general()||{}},n={...this.footer()};n.line=n.line||!1,n.title&&(n.table_title=str_replace_vars(n.title,t),this.see.show("footer")),this.footer.set(n)}resolveButton(e,t){const n={...e};return"function"==typeof e.label?n.resolvedLabel=e.label(t):"string"==typeof e.label?n.resolvedLabel=str_replace_vars(e.label,t):n.resolvedLabel=e.label||"","function"==typeof e.class?n.resolvedClass=e.class(t):n.resolvedClass=e.class||"","function"==typeof e.icon?n.resolvedIcon=e.icon(t):n.resolvedIcon=e.icon||"",n}getFieldValue(e,t={},n="text"){if("string"==typeof e)return"image"===n?t[e]||e:t[e];if(e instanceof Array)return json_hierarchy_val(t,e);if("object"==typeof e&&null!==e&&e.field){if(e.field instanceof Array)return json_hierarchy_val(t,e.field);if("string"==typeof e.field)return/\{[^}]+\}/.test(e.field)?str_replace_vars(e.field,t,e.prefix,e.suffix):t[e.field]}return""}applyFormat(e,t){if(null==e)return"";switch(t){case"date":return this.datePipe.transform(e,"dd/MM/yyyy");case"datetime":return this.datePipe.transform(e,"dd/MM/yyyy HH:mm");case"currency":return this.currencyPipe.transform(e,"USD","symbol","1.2-2");case"decimal":return this.decimalPipe.transform(e,"1.2-2");default:return e}}handleButtonClick(e,t){if("form"===e.type)this.openForm(e.form,t);else if("link"===e.type){const n="function"==typeof e.link?e.link(t):e.link;navigate(n)}else"function"==typeof e.click&&e.click(t,e)}handleItemClick(e,t){e.preventDefault(),this.fxEvent.onClick(t)}setNavBar(e,t="top"){"bottom"===t?this.navbar_bottom.set(e):this.navbar.set(e)}applyFilter(e,t=null){if(!e)return;const n=this.filter||{};n.fields={...n.fields||{},...e},this.filter=n,this.data.set([]),this.loadPageData(1,t)}reload(e=null){this.data.set([]),this.loadPageData(1,e)}refreshFilter(e=null){this.reload(e)}openModal(e,t){this.openForm(e.form,t)}openForm(e,t={}){const n=this.forms()[e]||e;if("function"==typeof n){const i=n(e,t,this);i instanceof Promise?i.then(e=>e?this.openModalForm(e):null):i&&this.openModalForm(i)}}openModalForm(e={}){const t=this.aifModal();t.build(e),e.step?this.aifFormStep().build(e.config,t):this.aifForm().build(e.config,t)}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGrid,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifGrid,isStandalone:!0,selector:"aif-grid",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},providers:[DatePipe,CurrencyPipe,DecimalPipe],viewQueries:[{propertyName:"sentinel",first:!0,predicate:["sentinel"],descendants:!0,isSignal:!0},{propertyName:"aifModal",first:!0,predicate:AifModal,descendants:!0,isSignal:!0},{propertyName:"aifForm",first:!0,predicate:AifForm,descendants:!0,isSignal:!0},{propertyName:"aifFormStep",first:!0,predicate:AifFormStep,descendants:!0,isSignal:!0}],ngImport:i0,template:'<div class="aif-grid w-full">\n \n @if (hasHeader()) {\n <header class="mb-6 text-center">\n <h3 class="text-2xl font-bold text-slate-900 dark:text-white">\n {{ header().table_title || header().title }}\n </h3>\n @if (header().line) {\n <hr class="mt-4 border-slate-200 dark:border-slate-800" />\n }\n </header>\n }\n\n @if (navbar() && (navbar().left?.length || navbar().right?.length || navbar().center?.length)) {\n <div class="mb-6">\n <aif-nav-bar [config]="navbar()"></aif-nav-bar>\n </div>\n }\n\n <div class="grid gap-3 sm:gap-6 px-0" style="grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));">\n @for (item of items(); track $index) {\n <article class="group relative flex flex-col overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm transition-all hover:shadow-md dark:border-slate-800 dark:bg-slate-900/50">\n \n \x3c!-- Image Area --\x3e\n <div class="aspect-video overflow-hidden bg-slate-100 dark:bg-slate-800 relative">\n @if (item._grid.resolvedImage) {\n <img [src]="item._grid.resolvedImage" \n class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-110" \n [alt]="item._grid.title" />\n } @else {\n <div class="flex h-full w-full items-center justify-center text-slate-400 dark:text-slate-600">\n <i class="aif aif-image-ico text-4xl"></i>\n </div>\n }\n\n \x3c!-- Overlay Buttons (Center) --\x3e\n @if (item._grid.buttons.center?.length) {\n <div class="absolute inset-0 flex items-center justify-center bg-slate-900/40 opacity-0 transition-opacity duration-300 group-hover:opacity-100 backdrop-blur-[2px]">\n @for (btn of item._grid.buttons.center; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [class]="btn.resolvedClass || \'bg-white text-slate-900 hover:bg-slate-50 dark:bg-slate-800 dark:text-white dark:hover:bg-slate-700\'"\n class="rounded-lg px-4 py-2 text-sm font-bold shadow-xl transition-all active:scale-95">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon" class="mr-2"></i> }\n {{ btn.resolvedLabel || \'Abrir\' }}\n </button>\n }\n </div>\n }\n\n \x3c!-- Top Left Buttons --\x3e\n <div class="absolute left-2 top-2 flex flex-col gap-2">\n @for (btn of item._grid.buttons.top_left; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [title]="btn.resolvedLabel || \'\'"\n [class]="btn.resolvedClass || \'bg-white/90 text-slate-700 dark:bg-slate-900/80 dark:text-slate-300\'"\n class="flex h-8 min-w-[32px] items-center justify-center rounded-lg shadow-sm backdrop-blur-sm transition-all hover:bg-white hover:text-primary-600 dark:hover:text-primary-400">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon"></i> }\n @else { <span class="px-1 text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n </div>\n\n \x3c!-- Top Right Buttons --\x3e\n <div class="absolute right-2 top-2 flex flex-col gap-2">\n @for (btn of item._grid.buttons.top_right; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [title]="btn.resolvedLabel || \'\'"\n [class]="btn.resolvedClass || \'bg-white/90 text-slate-700 dark:bg-slate-900/80 dark:text-slate-300\'"\n class="flex h-8 min-w-[32px] items-center justify-center rounded-lg shadow-sm backdrop-blur-sm transition-all hover:bg-white hover:text-danger-600 dark:hover:text-danger-400">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon"></i> }\n @else { <span class="px-1 text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n </div>\n </div>\n\n \x3c!-- Content Area --\x3e\n <div class="flex flex-1 flex-col p-4">\n @if (item._grid.title) {\n <h3 class="text-base font-bold text-slate-900 dark:text-white group-hover:text-primary-600 dark:group-hover:text-primary-400 transition-colors line-clamp-1">\n <a href="#" (click)="handleItemClick($event, item)">{{ item._grid.title }}</a>\n </h3>\n }\n \n @if (item._grid.description) {\n <p class="mt-2 line-clamp-2 text-xs text-slate-500 dark:text-slate-400 leading-relaxed overflow-hidden">\n {{ item._grid.description }}\n </p>\n }\n\n \x3c!-- Bottom Meta & Positioning Buttons --\x3e\n <div class="mt-auto pt-4 flex items-center justify-between pointer-events-none">\n \n \x3c!-- Left Side: Tag & Bottom Left Button --\x3e\n <div class="flex items-center gap-2 pointer-events-auto">\n @for (btn of item._grid.buttons.bottom_left; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [class]="btn.resolvedClass || \'text-slate-400 hover:text-primary-600\'"\n class="transition-colors">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon" class="text-sm"></i> }\n @else { <span class="text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n @if (item._grid.tag) {\n <span class="inline-flex items-center rounded-md bg-primary-50 px-2 py-1 text-[10px] font-bold text-primary-700 ring-1 ring-inset ring-primary-700/10 dark:bg-primary-900/20 dark:text-primary-400 dark:ring-primary-400/20">\n {{ item._grid.tag }}\n </span>\n }\n </div>\n\n \x3c!-- Right Side: Status & Bottom Right Button --\x3e\n <div class="flex items-center gap-2 pointer-events-auto">\n @if (item._grid.status) {\n <span class="text-[10px] font-semibold text-slate-400 dark:text-slate-500 italic">\n {{ item._grid.status }}\n </span>\n }\n @for (btn of item._grid.buttons.bottom_right; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [class]="btn.resolvedClass || \'text-slate-400 hover:text-primary-600\'"\n class="transition-colors">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon" class="text-sm"></i> }\n @else { <span class="text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n </div>\n </div>\n\n </div>\n </article>\n }\n </div>\n\n \x3c!-- Sentinel for Infinite Scroll --\x3e\n <div #sentinel class="h-10 w-full flex items-center justify-center mt-4">\n @if (loadingMore()) {\n <div class="flex items-center gap-2 text-slate-400">\n <svg class="animate-spin h-5 w-5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">\n <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>\n <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>\n </svg>\n <span class="text-xs font-medium">Cargando más resultados...</span>\n </div>\n }\n </div>\n\n @if (hasFooter()) {\n <footer class="mt-12 text-center text-slate-500 dark:text-slate-400 pb-8">\n <p class="text-sm">\n {{ footer().table_title || footer().title }}\n </p>\n @if (footer().line) {\n <hr class="mt-4 border-slate-200 dark:border-slate-800" />\n }\n </footer>\n }\n\n @if (navbar_bottom() && (navbar_bottom().left?.length || navbar_bottom().right?.length || navbar_bottom().center?.length)) {\n <div class="mt-6">\n <aif-nav-bar [config]="navbar_bottom()"></aif-nav-bar>\n </div>\n }\n</div>\n\n<aif-modal>\n <aif-form></aif-form>\n <aif-form-step></aif-form-step>\n</aif-modal>\n',dependencies:[{kind:"component",type:AifNavBar,selector:"aif-nav-bar",inputs:["config","side"],outputs:["onInit"]},{kind:"component",type:AifModal,selector:"aif-modal",inputs:["config"]},{kind:"component",type:AifForm,selector:"aif-form",inputs:["config"]},{kind:"component",type:AifFormStep,selector:"aif-form-step",inputs:["config"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifGrid,decorators:[{type:Component,args:[{selector:"aif-grid",standalone:!0,imports:[AifNavBar,AifModal,AifForm,AifFormStep],providers:[DatePipe,CurrencyPipe,DecimalPipe],schemas:[NO_ERRORS_SCHEMA],template:'<div class="aif-grid w-full">\n \n @if (hasHeader()) {\n <header class="mb-6 text-center">\n <h3 class="text-2xl font-bold text-slate-900 dark:text-white">\n {{ header().table_title || header().title }}\n </h3>\n @if (header().line) {\n <hr class="mt-4 border-slate-200 dark:border-slate-800" />\n }\n </header>\n }\n\n @if (navbar() && (navbar().left?.length || navbar().right?.length || navbar().center?.length)) {\n <div class="mb-6">\n <aif-nav-bar [config]="navbar()"></aif-nav-bar>\n </div>\n }\n\n <div class="grid gap-3 sm:gap-6 px-0" style="grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));">\n @for (item of items(); track $index) {\n <article class="group relative flex flex-col overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm transition-all hover:shadow-md dark:border-slate-800 dark:bg-slate-900/50">\n \n \x3c!-- Image Area --\x3e\n <div class="aspect-video overflow-hidden bg-slate-100 dark:bg-slate-800 relative">\n @if (item._grid.resolvedImage) {\n <img [src]="item._grid.resolvedImage" \n class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-110" \n [alt]="item._grid.title" />\n } @else {\n <div class="flex h-full w-full items-center justify-center text-slate-400 dark:text-slate-600">\n <i class="aif aif-image-ico text-4xl"></i>\n </div>\n }\n\n \x3c!-- Overlay Buttons (Center) --\x3e\n @if (item._grid.buttons.center?.length) {\n <div class="absolute inset-0 flex items-center justify-center bg-slate-900/40 opacity-0 transition-opacity duration-300 group-hover:opacity-100 backdrop-blur-[2px]">\n @for (btn of item._grid.buttons.center; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [class]="btn.resolvedClass || \'bg-white text-slate-900 hover:bg-slate-50 dark:bg-slate-800 dark:text-white dark:hover:bg-slate-700\'"\n class="rounded-lg px-4 py-2 text-sm font-bold shadow-xl transition-all active:scale-95">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon" class="mr-2"></i> }\n {{ btn.resolvedLabel || \'Abrir\' }}\n </button>\n }\n </div>\n }\n\n \x3c!-- Top Left Buttons --\x3e\n <div class="absolute left-2 top-2 flex flex-col gap-2">\n @for (btn of item._grid.buttons.top_left; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [title]="btn.resolvedLabel || \'\'"\n [class]="btn.resolvedClass || \'bg-white/90 text-slate-700 dark:bg-slate-900/80 dark:text-slate-300\'"\n class="flex h-8 min-w-[32px] items-center justify-center rounded-lg shadow-sm backdrop-blur-sm transition-all hover:bg-white hover:text-primary-600 dark:hover:text-primary-400">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon"></i> }\n @else { <span class="px-1 text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n </div>\n\n \x3c!-- Top Right Buttons --\x3e\n <div class="absolute right-2 top-2 flex flex-col gap-2">\n @for (btn of item._grid.buttons.top_right; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [title]="btn.resolvedLabel || \'\'"\n [class]="btn.resolvedClass || \'bg-white/90 text-slate-700 dark:bg-slate-900/80 dark:text-slate-300\'"\n class="flex h-8 min-w-[32px] items-center justify-center rounded-lg shadow-sm backdrop-blur-sm transition-all hover:bg-white hover:text-danger-600 dark:hover:text-danger-400">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon"></i> }\n @else { <span class="px-1 text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n </div>\n </div>\n\n \x3c!-- Content Area --\x3e\n <div class="flex flex-1 flex-col p-4">\n @if (item._grid.title) {\n <h3 class="text-base font-bold text-slate-900 dark:text-white group-hover:text-primary-600 dark:group-hover:text-primary-400 transition-colors line-clamp-1">\n <a href="#" (click)="handleItemClick($event, item)">{{ item._grid.title }}</a>\n </h3>\n }\n \n @if (item._grid.description) {\n <p class="mt-2 line-clamp-2 text-xs text-slate-500 dark:text-slate-400 leading-relaxed overflow-hidden">\n {{ item._grid.description }}\n </p>\n }\n\n \x3c!-- Bottom Meta & Positioning Buttons --\x3e\n <div class="mt-auto pt-4 flex items-center justify-between pointer-events-none">\n \n \x3c!-- Left Side: Tag & Bottom Left Button --\x3e\n <div class="flex items-center gap-2 pointer-events-auto">\n @for (btn of item._grid.buttons.bottom_left; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [class]="btn.resolvedClass || \'text-slate-400 hover:text-primary-600\'"\n class="transition-colors">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon" class="text-sm"></i> }\n @else { <span class="text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n @if (item._grid.tag) {\n <span class="inline-flex items-center rounded-md bg-primary-50 px-2 py-1 text-[10px] font-bold text-primary-700 ring-1 ring-inset ring-primary-700/10 dark:bg-primary-900/20 dark:text-primary-400 dark:ring-primary-400/20">\n {{ item._grid.tag }}\n </span>\n }\n </div>\n\n \x3c!-- Right Side: Status & Bottom Right Button --\x3e\n <div class="flex items-center gap-2 pointer-events-auto">\n @if (item._grid.status) {\n <span class="text-[10px] font-semibold text-slate-400 dark:text-slate-500 italic">\n {{ item._grid.status }}\n </span>\n }\n @for (btn of item._grid.buttons.bottom_right; track $index) {\n <button (click)="handleButtonClick(btn, item)" \n [class]="btn.resolvedClass || \'text-slate-400 hover:text-primary-600\'"\n class="transition-colors">\n @if (btn.resolvedIcon) { <i [class]="btn.resolvedIcon" class="text-sm"></i> }\n @else { <span class="text-[10px] font-bold">{{ btn.resolvedLabel }}</span> }\n </button>\n }\n </div>\n </div>\n\n </div>\n </article>\n }\n </div>\n\n \x3c!-- Sentinel for Infinite Scroll --\x3e\n <div #sentinel class="h-10 w-full flex items-center justify-center mt-4">\n @if (loadingMore()) {\n <div class="flex items-center gap-2 text-slate-400">\n <svg class="animate-spin h-5 w-5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">\n <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>\n <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>\n </svg>\n <span class="text-xs font-medium">Cargando más resultados...</span>\n </div>\n }\n </div>\n\n @if (hasFooter()) {\n <footer class="mt-12 text-center text-slate-500 dark:text-slate-400 pb-8">\n <p class="text-sm">\n {{ footer().table_title || footer().title }}\n </p>\n @if (footer().line) {\n <hr class="mt-4 border-slate-200 dark:border-slate-800" />\n }\n </footer>\n }\n\n @if (navbar_bottom() && (navbar_bottom().left?.length || navbar_bottom().right?.length || navbar_bottom().center?.length)) {\n <div class="mt-6">\n <aif-nav-bar [config]="navbar_bottom()"></aif-nav-bar>\n </div>\n }\n</div>\n\n<aif-modal>\n <aif-form></aif-form>\n <aif-form-step></aif-form-step>\n</aif-modal>\n'}]}],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],sentinel:[{type:i0.ViewChild,args:["sentinel",{isSignal:!0}]}],aifModal:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifModal),{isSignal:!0}]}],aifForm:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifForm),{isSignal:!0}]}],aifFormStep:[{type:i0.ViewChild,args:[i0.forwardRef(()=>AifFormStep),{isSignal:!0}]}]}});class AifNavTab{onInit=output();config=input({},...ngDevMode?[{debugName:"config"}]:[]);cfg=signal({},...ngDevMode?[{debugName:"cfg"}]:[]);title=signal("",...ngDevMode?[{debugName:"title"}]:[]);id=signal("",...ngDevMode?[{debugName:"id"}]:[]);isBuilt=signal(!1,...ngDevMode?[{debugName:"isBuilt"}]:[]);tabList=viewChild("tabList",...ngDevMode?[{debugName:"tabList"}]:[]);canScrollLeft=signal(!1,...ngDevMode?[{debugName:"canScrollLeft"}]:[]);canScrollRight=signal(!1,...ngDevMode?[{debugName:"canScrollRight"}]:[]);selectedIndex=signal(0,...ngDevMode?[{debugName:"selectedIndex"}]:[]);currentComponent=signal(null,...ngDevMode?[{debugName:"currentComponent"}]:[]);currentConfig=signal({},...ngDevMode?[{debugName:"currentConfig"}]:[]);state=computed(()=>{const e=this.cfg(),t=this.config()??{};return e&&Object.keys(e).length>0?{...t,...e}:t},...ngDevMode?[{debugName:"state"}]:[]);wrapperClass=computed(()=>this.state().class??"",...ngDevMode?[{debugName:"wrapperClass"}]:[]);headerClass=computed(()=>this.state().headerClass??"flex flex-col gap-4 px-2 pt-4 md:px-6 md:flex-row md:items-end mb-0",...ngDevMode?[{debugName:"headerClass"}]:[]);bodyClass=computed(()=>this.state().bodyClass??"rounded-lg border border-slate-200 bg-slate-100 px-0 py-4 sm:px-6 sm:py-6 dark:border-slate-700/50 dark:bg-slate-900/50",...ngDevMode?[{debugName:"bodyClass"}]:[]);titleClass=computed(()=>this.state().titleClass??"hidden max-w-[300px] truncate pb-4 text-base font-semibold text-slate-900 dark:text-white md:block",...ngDevMode?[{debugName:"titleClass"}]:[]);tabListClass=computed(()=>this.state().tabListClass??"flex overflow-x-auto scrollbar-hide flex-nowrap gap-0 -mb-px",...ngDevMode?[{debugName:"tabListClass"}]:[]);tabClass=computed(()=>this.state().tabClass??"inline-flex items-center gap-2 border border-transparent px-3 py-2 sm:px-5 sm:py-2.5 text-sm font-semibold transition-colors focus:outline-none rounded-t-md",...ngDevMode?[{debugName:"tabClass"}]:[]);tabActiveClass=computed(()=>this.state().tabActiveClass??"border-slate-200 border-b-transparent bg-slate-100 text-primary-600 dark:border-slate-700/50 dark:border-b-transparent dark:bg-slate-900/50 dark:text-primary-400",...ngDevMode?[{debugName:"tabActiveClass"}]:[]);tabInactiveClass=computed(()=>this.state().tabInactiveClass??"text-slate-500 hover:text-slate-700 dark:text-slate-400 dark:hover:text-slate-200",...ngDevMode?[{debugName:"tabInactiveClass"}]:[]);tabs=computed(()=>{const e=this.state().tabs??[],t=this.selectedIndex();return e.map((e,n)=>{const i=e.id||n.toString(),a=e.id||`tab-${n}`;return{...e,index:n,tabId:a,buttonId:`aif-tab-btn-${i}`,panelId:`aif-tab-panel-${i}`,trackId:`aif-tab-track-${i}`,isActive:t===n,resolvedName:e.name||e.title||"",resolvedTitle:e.title||e.name||""}})},...ngDevMode?[{debugName:"tabs"}]:[]);activeTab=computed(()=>this.tabs()[this.selectedIndex()]??null,...ngDevMode?[{debugName:"activeTab"}]:[]);activeDynamicConfig=computed(()=>({...this.currentConfig()??{},component:this.currentComponent()}),...ngDevMode?[{debugName:"activeDynamicConfig"}]:[]);constructor(){effect(()=>{const e=this.config();this.createFunctions(e),e&&0!==Object.keys(e).length&&(this.isBuilt()?this.cfg.set(e):this.build(e))})}ngAfterViewInit(){queueMicrotask(()=>this.onInit.emit()),setTimeout(()=>this.checkScrollState(),100)}onResize(){this.checkScrollState()}checkScrollState(){const e=this.tabList()?.nativeElement;if(!e)return;const{scrollLeft:t,scrollWidth:n,clientWidth:i}=e;this.canScrollLeft.set(t>10),this.canScrollRight.set(t+i<n-10)}scrollTabs(e){const t=this.tabList()?.nativeElement;if(!t)return;const n=.8*t.clientWidth;t.scrollBy({left:"left"===e?-n:n,behavior:"smooth"})}selTab(e=0){this.selectTab(e)}reBuild(e={},t=null){this.isBuilt.set(!1),this.cfg.set({}),this.title.set(""),this.id.set(""),this.currentComponent.set(null),this.currentConfig.set({}),this.selectedIndex.set(0),this.build(e,t)}build(e={},t=null){if(!e||this.isBuilt()&&this.cfg()===e)return;const n=e||{};this.isBuilt.set(!0),this.cfg.set(n),this.createFunctions(n);const i=this.tab_selected(t,n);null!==i&&this.selTab(i)}tab_selected(e,t){if(null!=e)return e;if(null!=t?.active_tab)return t.active_tab;const n=t?.tabs??[];for(let e=0;e<n.length;e++)if(n[e]?.active)return e;return 0}onTab(e){if(!e)return;this.title.set(e.title||""),this.id.set(e.id||e.name||"");const t={...e.config??{},id:e.config?.id??e.id??e.name??""};this.loadComponent(e.component||this.state().component||null,t)}loadBuild(e,t={}){e?.build?.(t)}loadComponent(e,t={}){this.currentComponent()===e&&JSON.stringify(this.currentConfig())===JSON.stringify(t)||(this.currentComponent.set(e),this.currentConfig.set(t||{}))}selectTab(e){const t=this.tabs();if(0===t.length)return;const n=t[e];n&&!n.disabled&&(this.selectedIndex.set(e),this.onTab(n))}createFunctions(e=this.config()){e&&(e.build=(e={},t=null)=>this.build(e,t),e.reBuild=(e={},t=null)=>this.reBuild(e,t),e.selTab=(e=0)=>this.selTab(e),e.onTab=e=>this.onTab(e))}static"ɵfac"=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavTab,deps:[],target:i0.ɵɵFactoryTarget.Component});static"ɵcmp"=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"21.1.1",type:AifNavTab,isStandalone:!0,selector:"aif-nav-tab, aif-nav-tabs",inputs:{config:{classPropertyName:"config",publicName:"config",isSignal:!0,isRequired:!1,transformFunction:null}},outputs:{onInit:"onInit"},host:{listeners:{"window:resize":"onResize()"}},viewQueries:[{propertyName:"tabList",first:!0,predicate:["tabList"],descendants:!0,isSignal:!0}],ngImport:i0,template:'<div [class]="wrapperClass()">\n <div [class]="headerClass()">\n @if (title()) {\n <h5 [class]="titleClass()">\n {{ title() }}\n </h5>\n }\n\n <div class="group relative flex w-full items-center md:ml-auto md:w-auto">\n @if (canScrollLeft()) {\n <button\n type="button"\n (click)="scrollTabs(\'left\')"\n class="scroll-btn left-0 h-full bg-gradient-to-r from-slate-100 to-transparent dark:from-slate-900"\n aria-label="Scroll left"\n >\n <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />\n </svg>\n </button>\n }\n\n <div\n #tabList\n [class]="tabListClass()"\n role="tablist"\n aria-orientation="horizontal"\n (scroll)="checkScrollState()"\n >\n @for (tab of tabs(); track tab.trackId) {\n <button\n type="button"\n role="tab"\n [class]="tabClass() + \' \' + (tab.isActive ? tabActiveClass() : tabInactiveClass()) + \' \' + (tab.class || \'\')"\n [class.opacity-50]="tab.disabled"\n [class.cursor-not-allowed]="tab.disabled"\n [attr.id]="tab.buttonId"\n [attr.aria-controls]="tab.panelId"\n [attr.aria-selected]="tab.isActive"\n [disabled]="tab.disabled"\n (click)="selectTab(tab.index)"\n >\n @if (tab.icon) {\n <i [class]="tab.icon"></i>\n }\n <span>{{ tab.resolvedName }}</span>\n\n @if (tab.badge !== undefined && tab.badge !== null && tab.badge !== \'\') {\n <span\n class="inline-flex min-w-6 items-center justify-center rounded-full px-2 py-0.5 text-xs font-semibold"\n [class.bg-white/20]="tab.isActive"\n [class.text-white]="tab.isActive"\n [class.bg-slate-100]="!tab.isActive"\n [class.text-slate-700]="!tab.isActive"\n >\n {{ tab.badge }}\n </span>\n }\n </button>\n }\n </div>\n\n @if (canScrollRight()) {\n <button\n type="button"\n (click)="scrollTabs(\'right\')"\n class="scroll-btn right-0 h-full bg-gradient-to-l from-slate-100 to-transparent dark:from-slate-900"\n aria-label="Scroll right"\n >\n <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />\n </svg>\n </button>\n }\n </div>\n </div>\n\n <div\n [class]="bodyClass()"\n [attr.id]="activeTab()?.panelId || null"\n [attr.aria-labelledby]="activeTab()?.buttonId || null"\n role="tabpanel"\n >\n <aif-accordion-dynamic [config]="activeDynamicConfig()"></aif-accordion-dynamic>\n </div>\n</div>\n',styles:[":host{display:block}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none;scroll-behavior:smooth}.scroll-btn{position:absolute;z-index:20;display:flex;width:2.5rem;align-items:center;justify-content:center;color:#64748b;transition:all .3s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;top:0;bottom:0}.scroll-btn:hover{color:var(--primary-600, #2563eb);transform:scale(1.1)}:host-context(.dark) .scroll-btn{color:#94a3b8}:host-context(.dark) .scroll-btn:hover{color:var(--primary-400, #60a5fa)}.scroll-btn svg{filter:drop-shadow(0 0 2px rgba(0,0,0,.1))}button[role=tab] i{font-size:1.1em;line-height:1;margin-right:.5rem;margin-left:-.25rem}\n"],dependencies:[{kind:"component",type:AifAccordionDynamic,selector:"aif-accordion-dynamic",inputs:["config"]}]})}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.1",ngImport:i0,type:AifNavTab,decorators:[{type:Component,args:[{selector:"aif-nav-tab, aif-nav-tabs",standalone:!0,imports:[AifAccordionDynamic],template:'<div [class]="wrapperClass()">\n <div [class]="headerClass()">\n @if (title()) {\n <h5 [class]="titleClass()">\n {{ title() }}\n </h5>\n }\n\n <div class="group relative flex w-full items-center md:ml-auto md:w-auto">\n @if (canScrollLeft()) {\n <button\n type="button"\n (click)="scrollTabs(\'left\')"\n class="scroll-btn left-0 h-full bg-gradient-to-r from-slate-100 to-transparent dark:from-slate-900"\n aria-label="Scroll left"\n >\n <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />\n </svg>\n </button>\n }\n\n <div\n #tabList\n [class]="tabListClass()"\n role="tablist"\n aria-orientation="horizontal"\n (scroll)="checkScrollState()"\n >\n @for (tab of tabs(); track tab.trackId) {\n <button\n type="button"\n role="tab"\n [class]="tabClass() + \' \' + (tab.isActive ? tabActiveClass() : tabInactiveClass()) + \' \' + (tab.class || \'\')"\n [class.opacity-50]="tab.disabled"\n [class.cursor-not-allowed]="tab.disabled"\n [attr.id]="tab.buttonId"\n [attr.aria-controls]="tab.panelId"\n [attr.aria-selected]="tab.isActive"\n [disabled]="tab.disabled"\n (click)="selectTab(tab.index)"\n >\n @if (tab.icon) {\n <i [class]="tab.icon"></i>\n }\n <span>{{ tab.resolvedName }}</span>\n\n @if (tab.badge !== undefined && tab.badge !== null && tab.badge !== \'\') {\n <span\n class="inline-flex min-w-6 items-center justify-center rounded-full px-2 py-0.5 text-xs font-semibold"\n [class.bg-white/20]="tab.isActive"\n [class.text-white]="tab.isActive"\n [class.bg-slate-100]="!tab.isActive"\n [class.text-slate-700]="!tab.isActive"\n >\n {{ tab.badge }}\n </span>\n }\n </button>\n }\n </div>\n\n @if (canScrollRight()) {\n <button\n type="button"\n (click)="scrollTabs(\'right\')"\n class="scroll-btn right-0 h-full bg-gradient-to-l from-slate-100 to-transparent dark:from-slate-900"\n aria-label="Scroll right"\n >\n <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />\n </svg>\n </button>\n }\n </div>\n </div>\n\n <div\n [class]="bodyClass()"\n [attr.id]="activeTab()?.panelId || null"\n [attr.aria-labelledby]="activeTab()?.buttonId || null"\n role="tabpanel"\n >\n <aif-accordion-dynamic [config]="activeDynamicConfig()"></aif-accordion-dynamic>\n </div>\n</div>\n',styles:[":host{display:block}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none;scroll-behavior:smooth}.scroll-btn{position:absolute;z-index:20;display:flex;width:2.5rem;align-items:center;justify-content:center;color:#64748b;transition:all .3s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;top:0;bottom:0}.scroll-btn:hover{color:var(--primary-600, #2563eb);transform:scale(1.1)}:host-context(.dark) .scroll-btn{color:#94a3b8}:host-context(.dark) .scroll-btn:hover{color:var(--primary-400, #60a5fa)}.scroll-btn svg{filter:drop-shadow(0 0 2px rgba(0,0,0,.1))}button[role=tab] i{font-size:1.1em;line-height:1;margin-right:.5rem;margin-left:-.25rem}\n"]}]}],ctorParameters:()=>[],propDecorators:{onInit:[{type:i0.Output,args:["onInit"]}],config:[{type:i0.Input,args:[{isSignal:!0,alias:"config",required:!1}]}],tabList:[{type:i0.ViewChild,args:["tabList",{isSignal:!0}]}],onResize:[{type:HostListener,args:["window:resize"]}]}});export{AIF_THEME,AIF_THEME_DARK,AIF_THEME_LIGHT,AifAccordion,AifAlert,AifBackFooter,AifBackNavHeader as AifBackHeader,AifBackNavHeader,AifCookies,AifCreate,AifDropDown,AifDropDownItem,AifEmbed,AifForm,AifFormStep,AifFrontFooter,AifPageHero as AifFrontHeader,AifPageHeroSearch as AifFrontHeaderSearch,AifFrontNavHeader,AifGoBack,AifGoTop,AifGoUp,AifGrid,AifLoading,AifMenu,AifModal,AifNavActionButton,AifNavBar,AifPageHeader as AifNavHead,AifBackNavHeader as AifNavHeader,AifNavLangDropDown,AifNavLogo,AifNavNotificationDropdown,AifNavSearch,AifNavTab,AifNavUserDropDown,AifPageHeader,AifPageHero,AifPageHeroSearch,AifPagination,AifSafeHtmlPipe,AifSection,AifSectionNav,AifSectionSummary,AifSectionVideo,AifSideBar,AifSideBarService,AifSliderBar,AifSliderFull,AifTable,AifThemeService,AifThemeSwitcher,AifThemeToggle,form_prebuild,menu_delete,menu_divider,menu_edit,menu_option,valid_builds,valid_messages};