@ngxviewbuilder/runtime 0.12.2 → 0.12.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.
- package/fesm2022/ngxviewbuilder-runtime-autocomplete-element-DaMuvB5p.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-avatar-element-DCy3AEHW.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-badge-element-Ci2NV1MC.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-breadcrumbs-element-Bcq5oGI8.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-button-element-DzJfdCcx.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-chart-element-BCg3CI8N.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-checkbox-element-Cj3HQvkO.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-column-p1eNMy75.mjs +43 -0
- package/fesm2022/ngxviewbuilder-runtime-custom-html-element-BMdxXckt.mjs +3 -0
- package/fesm2022/ngxviewbuilder-runtime-date-range-element-BE_9Ba_-.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-datepicker-element-BFwwyRt-.mjs +1 -0
- package/fesm2022/{ngxviewbuilder-runtime-divider-element-Bit-YRpc.mjs → ngxviewbuilder-runtime-divider-element-CbCCZ1Qu.mjs} +1 -1
- package/fesm2022/ngxviewbuilder-runtime-element-wrapper-EBaWVZvf.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-file-upload-element-BYU3tLZw.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-icon-element-CLqWvjKL.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-iframe-element-Bl74Zm6Y.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-image-element-iDSaX41Y.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-list-box-element-DrDTjcW5.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-list-grid-element-CgiY-Lcy.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-mark-for-check-on-property-change-WxfEoWah.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-message-card-element-60xyNliB.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-multi-select-element-DHqMGyjB.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-ngx-view-builder-api.service-BYA8UfCA.mjs +4 -0
- package/fesm2022/ngxviewbuilder-runtime-number-element-CdhEZPYp.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-number-stepper-element-f9KrH_YF.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-nvb-select-Dkh4SIap.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-page-title-element-8T25QlMQ.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-phone-input-element-CZCkF7lo.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-progress-bar-element-BqCwBXpQ.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-radio-element-CvVAePSa.mjs +1 -0
- package/fesm2022/{ngxviewbuilder-runtime-rich-text-element-DAl3vSxG.mjs → ngxviewbuilder-runtime-rich-text-element-D4knphJa.mjs} +2 -2
- package/fesm2022/ngxviewbuilder-runtime-router-outlet-element-BzouCbdg.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-select-button-element-CtysP-cz.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-select-element-Be-lGWkG.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-signature-pad-element-CJqDTYnO.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-single-checkbox-element-DrJcESGd.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-slider-element-CsTb-3m4.mjs +1 -0
- package/fesm2022/{ngxviewbuilder-runtime-spacer-element-BGJ-ObOf.mjs → ngxviewbuilder-runtime-spacer-element-OAgkc5so.mjs} +1 -1
- package/fesm2022/ngxviewbuilder-runtime-stats-card-element-CzjJKd-Y.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-table-element-C25OdqZn.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-text-element-0eMB6sBj.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-textarea-element-BRJA5Lzb.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-time-picker-element-3qN3oxZF.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-toast-element-CzKIkQVY.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-toggle-switch-element-D9svjkSP.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-video-element-CliJnlMX.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime.mjs +1 -1
- package/package.json +1 -1
- package/types/ngxviewbuilder-runtime.d.ts +254 -41
- package/fesm2022/ngxviewbuilder-runtime-autocomplete-element-DWbMobho.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-avatar-element-98vFX6ZL.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-badge-element-WdHbUp_X.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-breadcrumbs-element-qlHbgWfh.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-button-element-BWI56rGB.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-chart-element-wN98hSa2.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-checkbox-element-yAUJgMY7.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-column-CEOo23I_.mjs +0 -43
- package/fesm2022/ngxviewbuilder-runtime-custom-html-element-D7ezjkGw.mjs +0 -3
- package/fesm2022/ngxviewbuilder-runtime-date-range-element-kRoWWvXf.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-datepicker-element-Co2_JHM2.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-dynamic-text.pipe-BUJ4fCqt.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-element-wrapper-D0lfZvuW.mjs +0 -4
- package/fesm2022/ngxviewbuilder-runtime-file-upload-element-B1sGgTAJ.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-icon-element-BBV3IriU.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-iframe-element-DAKlSTTJ.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-image-element-Co9eNt6D.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-list-box-element-BkqVfq4H.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-list-grid-element-BsVooLf9.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-message-card-element-DOlB-FAw.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-multi-select-element-5YHKOX69.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-number-element-MNO3T8kR.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-number-stepper-element-Jl6DZNAb.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-nvb-select-DuPHFQk6.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-page-title-element-BdfBrnaW.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-phone-input-element-BDZkscMD.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-progress-bar-element-Dg7Y6-jq.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-radio-element-xscwN_Hs.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-router-outlet-element-BpGv-kkh.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-select-button-element-BPH_N-fd.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-select-element-B_FOlIzR.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-signature-pad-element-BxZMh4-H.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-single-checkbox-element-DZiHDP6i.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-slider-element-NBbgW-1w.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-stats-card-element-DUxzXyTC.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-table-element-yvDWlU-z.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-text-element-C9W3pPu7.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-textarea-element-55rqT93w.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-time-picker-element-C1p0lG_4.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-toast-element-Dc8tFqFS.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-toggle-switch-element-DEmC69ye.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-video-element-COR0eePU.mjs +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as Fe}from"./ngxviewbuilder-runtime-rolldown-runtime-DpJrqANO.mjs";import{Ft as Me,Rt as Ne,_ as B,b as ie,cn as A,d as Pe,f as He,hn as F,it as D,l as ze,ln as Ve,p as $e,r as se,v as Le,w as Oe,yn as b}from"./ngxviewbuilder-runtime-mark-for-check-on-property-change-WxfEoWah.mjs";import{X as Be,Z as Ke,et as de,g as ce,t as je,tt as be,x as qe}from"./ngxviewbuilder-runtime-ngx-view-builder-api.service-BYA8UfCA.mjs";import{a as Ue,i as N,o as ue,t as ve}from"./ngxviewbuilder-runtime-element-wrapper-EBaWVZvf.mjs";import{t as pe}from"./ngxviewbuilder-runtime-nvb-select-Dkh4SIap.mjs";import{t as me}from"./ngxviewbuilder-runtime-nvb-style-outlet-CVovePT_.mjs";import*as h from"@angular/core";import{ChangeDetectionStrategy as he,Component as ge,HostListener as K,Injectable as j,computed as d,effect as q,inject as S,input as xe,signal as u,viewChild as P}from"@angular/core";import*as fe from"@angular/common";import{CommonModule as _e,NgComponentOutlet as we}from"@angular/common";import{cloneDeep as H,get as p,isEqual as ye,set as U}from"lodash-es";import{firstValueFrom as C}from"rxjs";import*as T from"@angular/forms";import{FormsModule as Se}from"@angular/forms";import{CdkDrag as ke,CdkDragHandle as Ce,CdkDropList as De,moveItemInArray as We}from"@angular/cdk/drag-drop";var z=class te extends ie{flatModelMap={};builderActivePageName=u(null,...ngDevMode?[{debugName:"builderActivePageName"}]:[]);setStructure(e){this._structure.set(e);this.ensureBuilderActivePageName()}getElement(e){return this._structure().elements[e]}getNextElementName(e){const t=Me(this.structure?.elements);(this.structure?.pages??[]).forEach(n=>t.add(String(n?.name??"")));return Ne(String(e??"").trim()||"element",t)}set structure(e){this._structure.set(e);this.ensureBuilderActivePageName();this.onStructureChanged.fire(e)}get structure(){return this._structure()}setBuilderActivePageName(e){const t=Array.isArray(this._structure()?.pages)?this._structure().pages:[];const n=String(e??"").trim();if(!n){this.builderActivePageName.set(t[0]?.name??null);return}const a=t.find(o=>o.name===n);this.builderActivePageName.set(a?.name??t[0]?.name??null)}ensureBuilderActivePageName(){const e=Array.isArray(this._structure()?.pages)?this._structure().pages:[];if(e.length===0){this.builderActivePageName.set(null);return}const t=String(this.builderActivePageName()??"").trim();if(t&&e.some(n=>n.name===t))return;this.builderActivePageName.set(e[0]?.name??null)}static ɵfac=h.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:te,deps:null,target:h.ɵɵFactoryTarget.Injectable});static ɵprov=h.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:te,providedIn:"root"})};h.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:z,decorators:[{type:j,args:[{providedIn:"root"}]}]});var W=class ne{eventService;structureService;constructor(e,t){this.eventService=e;this.structureService=t}setFocus(e){const t=this.resolveFocusPayload(e);Pe.setItem("focusedElementName",String(t?.["name"]??""));this.eventService.onElementFocus.fire({payload:t})}resolveFocusPayload(e){if(!e||typeof e!=="object")return e;if(String(e["propertyType"]??"").trim()==="tableColumn")return e;if(!String(e["name"]??"").trim())return e;return this.structureService.refreshElementReferenceFor(e)??e}static ɵfac=h.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:ne,deps:[{token:B},{token:z}],target:h.ɵɵFactoryTarget.Injectable});static ɵprov=h.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:ne,providedIn:"root"})};h.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:W,decorators:[{type:j,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:B},{type:z}]});function Ge(l){const e=l?.["inheritParentState"];if(e!==void 0&&e!==null)return Boolean(e);return!Boolean(l?.["ignoreParentState"])}function Ee(l){return{disabled:Boolean(l?.["__pfBaseDisabled"])||Boolean(l?.["__pfLogicDisabled"]),readOnly:Boolean(l?.["__pfBaseReadOnly"])||Boolean(l?.["__pfLogicReadOnly"])}}function G(l,e=new Set){if(!l||e.has(l)||!Ge(l))return{disabled:false,readOnly:false};e.add(l);const t=l.parentElement;if(!t)return{disabled:false,readOnly:false};const n=Ee(t);const a=G(t,e);return{disabled:n.disabled||a.disabled,readOnly:n.readOnly||a.readOnly}}function Te(l){const e=Ee(l);const t=G(l);return{disabled:e.disabled||t.disabled,readOnly:e.readOnly||t.readOnly}}var Y=class ae{runtimeRegistry;loadedComponents=new Map;pendingLoads=new Map;constructor(e){this.runtimeRegistry=e}async load(e){const t=String(e??"").trim();if(!t)return null;const n=this.runtimeRegistry.getComponent(t);if(n){this.loadedComponents.set(t,n);return n}const a=this.loadedComponents.get(t);if(a)return a;const o=this.pendingLoads.get(t);if(o)return await o;const r=Ye[t];if(!r)return null;const i=r().then(s=>{if(s)this.loadedComponents.set(t,s);this.pendingLoads.delete(t);return s}).catch(s=>{this.pendingLoads.delete(t);console.error(`[RuntimeLazyElementLoader] Failed to load component for type "${t}".`,s);return null});this.pendingLoads.set(t,i);return await i}getLoaded(e){const t=String(e??"").trim();if(!t)return null;return this.runtimeRegistry.getComponent(t)??this.loadedComponents.get(t)??null}async preloadStructure(e){const t=e?.elements;if(!t||typeof t!=="object")return;const n=[];const a=o=>{if(!o||typeof o!=="object")return;if(Array.isArray(o)){o.forEach(a);return}const r=o;const i=String(r["type"]??"").trim();if(i)n.push(i);a(r["template"]);a(r["columns"])};Object.values(t).forEach(a);await this.preload(n)}async preload(e){if(!Array.isArray(e)||e.length===0)return;const t=Array.from(new Set(e.map(n=>String(n??"").trim()).filter(n=>Boolean(n))));if(t.length===0)return;await Promise.all(t.map(n=>this.load(n)))}static ɵfac=h.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:ae,deps:[{token:ce}],target:h.ɵɵFactoryTarget.Injectable});static ɵprov=h.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:ae,providedIn:"root"})};h.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:Y,decorators:[{type:j,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:ce}]});const Ye={[b.TEXT]:()=>import("./ngxviewbuilder-runtime-text-element-0eMB6sBj.mjs").then(l=>l.n).then(l=>l.TextElement),[b.PHONE_INPUT]:()=>import("./ngxviewbuilder-runtime-phone-input-element-CZCkF7lo.mjs").then(l=>l.n).then(l=>l.PhoneInputElement),[b.NUMBER]:()=>import("./ngxviewbuilder-runtime-number-element-CdhEZPYp.mjs").then(l=>l.n).then(l=>l.NumberElement),[b.TEXTAREA]:()=>import("./ngxviewbuilder-runtime-textarea-element-BRJA5Lzb.mjs").then(l=>l.n).then(l=>l.TextAreaElement),[b.RICH_TEXT]:()=>import("./ngxviewbuilder-runtime-rich-text-element-D4knphJa.mjs").then(l=>l.n).then(l=>l.RichTextElement),[b.RICH_TEXT_VIEWER]:()=>import("./ngxviewbuilder-runtime-rich-text-element-D4knphJa.mjs").then(l=>l.n).then(l=>l.RichTextElement),[b.CUSTOM_HTML]:()=>import("./ngxviewbuilder-runtime-custom-html-element-BMdxXckt.mjs").then(l=>l.n).then(l=>l.CustomHtmlElement),[b.HTML_SNIPPET]:()=>import("./ngxviewbuilder-runtime-custom-html-element-BMdxXckt.mjs").then(l=>l.n).then(l=>l.CustomHtmlElement),[b.DATEPICKER]:()=>import("./ngxviewbuilder-runtime-datepicker-element-BFwwyRt-.mjs").then(l=>l.n).then(l=>l.DatepickerElement),[b.DATE_RANGE]:()=>import("./ngxviewbuilder-runtime-date-range-element-BE_9Ba_-.mjs").then(l=>l.n).then(l=>l.DateRangeElement),[b.BUTTON]:()=>import("./ngxviewbuilder-runtime-button-element-DzJfdCcx.mjs").then(l=>l.n).then(l=>l.ButtonElement),[b.SELECT_BUTTON]:()=>import("./ngxviewbuilder-runtime-select-button-element-CtysP-cz.mjs").then(l=>l.n).then(l=>l.SelectButtonElement),[b.RADIO]:()=>import("./ngxviewbuilder-runtime-radio-element-CvVAePSa.mjs").then(l=>l.n).then(l=>l.RadioElement),[b.CHECKBOX]:()=>import("./ngxviewbuilder-runtime-checkbox-element-Cj3HQvkO.mjs").then(l=>l.n).then(l=>l.CheckboxElement),[b.SINGLE_CHECKBOX]:()=>import("./ngxviewbuilder-runtime-single-checkbox-element-DrJcESGd.mjs").then(l=>l.n).then(l=>l.SingleCheckboxElement),[b.SLIDER]:()=>import("./ngxviewbuilder-runtime-slider-element-CsTb-3m4.mjs").then(l=>l.n).then(l=>l.SliderElement),[b.PROGRESS_BAR]:()=>import("./ngxviewbuilder-runtime-progress-bar-element-BqCwBXpQ.mjs").then(l=>l.n).then(l=>l.ProgressBarElement),[b.TOGGLE_BUTTON]:()=>import("./ngxviewbuilder-runtime-toggle-switch-element-D9svjkSP.mjs").then(l=>l.n).then(l=>l.ToggleSwitchElement),[b.TOGGLE_SWITCH]:()=>import("./ngxviewbuilder-runtime-toggle-switch-element-D9svjkSP.mjs").then(l=>l.n).then(l=>l.ToggleSwitchElement),[b.DYNAMIC_TABLE]:()=>import("./ngxviewbuilder-runtime-column-p1eNMy75.mjs").then(l=>l.a).then(l=>l.DynamicTableElement),[b.TABLE]:()=>Promise.resolve().then(()=>ct).then(l=>l.TableElement),[b.LIST_GRID]:()=>import("./ngxviewbuilder-runtime-list-grid-element-CgiY-Lcy.mjs").then(l=>l.n).then(l=>l.ListGridElement),[b.SELECT]:()=>import("./ngxviewbuilder-runtime-select-element-Be-lGWkG.mjs").then(l=>l.n).then(l=>l.SelectElement),[b.AUTOCOMPLETE]:()=>import("./ngxviewbuilder-runtime-autocomplete-element-DaMuvB5p.mjs").then(l=>l.n).then(l=>l.AutocompleteElement),[b.MULTI_SELECT]:()=>import("./ngxviewbuilder-runtime-multi-select-element-DHqMGyjB.mjs").then(l=>l.n).then(l=>l.MultiSelectElement),[b.MESSAGE_CARD]:()=>import("./ngxviewbuilder-runtime-message-card-element-60xyNliB.mjs").then(l=>l.n).then(l=>l.MessageCardElement),[b.TOAST]:()=>import("./ngxviewbuilder-runtime-toast-element-CzKIkQVY.mjs").then(l=>l.ToastElement),[b.BADGE]:()=>import("./ngxviewbuilder-runtime-badge-element-Ci2NV1MC.mjs").then(l=>l.n).then(l=>l.BadgeElement),[b.STATS_CARD]:()=>import("./ngxviewbuilder-runtime-stats-card-element-CzjJKd-Y.mjs").then(l=>l.n).then(l=>l.StatsCardElement),[b.CHART]:()=>import("./ngxviewbuilder-runtime-chart-element-BCg3CI8N.mjs").then(l=>l.n).then(l=>l.ChartElement),[b.FILE_UPLOAD]:()=>import("./ngxviewbuilder-runtime-file-upload-element-BYU3tLZw.mjs").then(l=>l.n).then(l=>l.FileUploadElement),[b.IMAGE]:()=>import("./ngxviewbuilder-runtime-image-element-iDSaX41Y.mjs").then(l=>l.n).then(l=>l.ImageElement),[b.VIDEO]:()=>import("./ngxviewbuilder-runtime-video-element-CliJnlMX.mjs").then(l=>l.n).then(l=>l.VideoElement),[b.IFRAME]:()=>import("./ngxviewbuilder-runtime-iframe-element-Bl74Zm6Y.mjs").then(l=>l.n).then(l=>l.IframeElement),[b.ROUTER_OUTLET]:()=>import("./ngxviewbuilder-runtime-router-outlet-element-BzouCbdg.mjs").then(l=>l.n).then(l=>l.RouterOutletElement),[b.AVATAR]:()=>import("./ngxviewbuilder-runtime-avatar-element-DCy3AEHW.mjs").then(l=>l.AvatarElement),[b.ICON]:()=>import("./ngxviewbuilder-runtime-icon-element-CLqWvjKL.mjs").then(l=>l.IconElement),[b.DIVIDER]:()=>import("./ngxviewbuilder-runtime-divider-element-CbCCZ1Qu.mjs").then(l=>l.n).then(l=>l.DividerElement),[b.SPACER]:()=>import("./ngxviewbuilder-runtime-spacer-element-OAgkc5so.mjs").then(l=>l.n).then(l=>l.SpacerElement),[b.BREADCRUMBS]:()=>import("./ngxviewbuilder-runtime-breadcrumbs-element-Bcq5oGI8.mjs").then(l=>l.BreadcrumbsElement),[b.PAGE_TITLE]:()=>import("./ngxviewbuilder-runtime-page-title-element-8T25QlMQ.mjs").then(l=>l.n).then(l=>l.PageTitleElement),[b.NUMBER_STEPPER]:()=>import("./ngxviewbuilder-runtime-number-stepper-element-f9KrH_YF.mjs").then(l=>l.n).then(l=>l.NumberStepperElement),[b.TIME_PICKER]:()=>import("./ngxviewbuilder-runtime-time-picker-element-3qN3oxZF.mjs").then(l=>l.n).then(l=>l.TimePickerElement),[b.SIGNATURE_PAD]:()=>import("./ngxviewbuilder-runtime-signature-pad-element-CJqDTYnO.mjs").then(l=>l.n).then(l=>l.SignaturePadElement),[b.LIST_BOX]:()=>import("./ngxviewbuilder-runtime-list-box-element-DrDTjcW5.mjs").then(l=>l.n).then(l=>l.ListBoxElement)};var V=class oe{model=xe.required(...ngDevMode?[{debugName:"model"}]:[]);componentType=u(null,...ngDevMode?[{debugName:"componentType"}]:[]);loader=S(Y);constructor(){q(()=>{const e=this.model();const t=String(e?.type??"").trim();if(!t){this.componentType.set(null);return}const n=this.loader.getLoaded(t);if(n){this.componentType.set(n);return}this.loadComponent(e,t)})}async loadComponent(e,t){const n=await this.loader.load(t);if(this.model()!==e)return;this.componentType.set(n)}static ɵfac=h.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:oe,deps:[],target:h.ɵɵFactoryTarget.Component});static ɵcmp=h.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"22.2.1",type:oe,isStandalone:true,selector:"runtime-lazy-element-outlet",inputs:{model:{classPropertyName:"model",publicName:"model",isSignal:true,isRequired:true,transformFunction:null}},ngImport:h,template:'@if (componentType()) {\n <ng-container *ngComponentOutlet="componentType(); inputs: { model: model() }"></ng-container>\n}\n',styles:[""],dependencies:[{kind:"directive",type:we,selector:"[ngComponentOutlet]",inputs:["ngComponentOutlet","ngComponentOutletInputs","ngComponentOutletInjector","ngComponentOutletEnvironmentInjector","ngComponentOutletContent","ngComponentOutletNgModule"],exportAs:["ngComponentOutlet"]}],changeDetection:h.ChangeDetectionStrategy.OnPush})};h.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:V,decorators:[{type:ge,args:[{selector:"runtime-lazy-element-outlet",changeDetection:he.OnPush,imports:[we],template:'@if (componentType()) {\n <ng-container *ngComponentOutlet="componentType(); inputs: { model: model() }"></ng-container>\n}\n'}]}],ctorParameters:()=>[],propDecorators:{model:[{type:h.Input,args:[{isSignal:true,alias:"model",required:true}]}]}});const Xe=1;const Je=2;const Qe=3;function Ze(l){const e=new TextEncoder;return dt([{name:"[Content_Types].xml",data:e.encode(ot)},{name:"_rels/.rels",data:e.encode(rt)},{name:"xl/workbook.xml",data:e.encode(at(l.name))},{name:"xl/_rels/workbook.xml.rels",data:e.encode(lt)},{name:"xl/styles.xml",data:e.encode(it)},{name:"xl/worksheets/sheet1.xml",data:e.encode(et(l))}])}function et(l){const e=Math.max(l.headers.length,1);const t=l.headers.map((r,i)=>{const s=l.rows.slice(0,500).reduce((c,v)=>Math.max(c,nt(v[i])),r.length);return Math.min(Math.max(s+2,8),60)});const n=`${J(e-1)}${l.rows.length+1}`;const a=`<row r="1">${l.headers.map((r,i)=>X(`${J(i)}1`,r,Xe)).join("")}</row>`;const o=l.rows.map((r,i)=>{const s=i+2;return`<row r="${s}">${l.headers.map((c,v)=>tt(`${J(v)}${s}`,r[v])).join("")}</row>`}).join("");return['<?xml version="1.0" encoding="UTF-8" standalone="yes"?>','<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">',`<dimension ref="A1:${n}"/>`,'<sheetViews><sheetView workbookViewId="0">','<pane ySplit="1" topLeftCell="A2" activePane="bottomLeft" state="frozen"/>',"</sheetView></sheetViews>",'<sheetFormatPr defaultRowHeight="15"/>',`<cols>${t.map((r,i)=>`<col min="${i+1}" max="${i+1}" width="${r}" customWidth="1"/>`).join("")}</cols>`,`<sheetData>${a}${o}</sheetData>`,`<autoFilter ref="A1:${n}"/>`,"</worksheet>"].join("")}function tt(l,e){if(e===null||e===void 0||e==="")return"";if(typeof e==="number"){if(!Number.isFinite(e))return X(l,String(e));return`<c r="${l}"${Number.isInteger(e)?"":` s="${Qe}"`}><v>${e}</v></c>`}if(typeof e==="boolean")return`<c r="${l}" t="b"><v>${e?1:0}</v></c>`;if(e instanceof Date){if(Number.isNaN(e.getTime()))return"";const t=Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds())/864e5+25569;return`<c r="${l}" s="${Je}"><v>${t}</v></c>`}return X(l,e)}function X(l,e,t){return`<c r="${l}" t="inlineStr"${t?` s="${t}"`:""}><is><t xml:space="preserve">${Q(e)}</t></is></c>`}function nt(l){if(l===null||l===void 0)return 0;if(l instanceof Date)return 10;return String(l).length}function J(l){let e="";let t=l+1;while(t>0){const n=(t-1)%26;e=String.fromCharCode(65+n)+e;t=Math.floor((t-1)/26)}return e}function Q(l){return String(l).replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F]/g,"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function at(l){const e=String(l||"Sheet1").replace(/[:\\/?*[\]]/g," ").trim().slice(0,31)||"Sheet1";return['<?xml version="1.0" encoding="UTF-8" standalone="yes"?>','<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" ','xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">',`<sheets><sheet name="${Q(e)}" sheetId="1" r:id="rId1"/></sheets>`,`<definedNames><definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'${Q(e).replace(/'/g,"''")}'!$A$1</definedName></definedNames>`,"</workbook>"].join("")}const ot=['<?xml version="1.0" encoding="UTF-8" standalone="yes"?>','<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">','<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>','<Default Extension="xml" ContentType="application/xml"/>','<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>','<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>','<Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/>',"</Types>"].join("");const rt=['<?xml version="1.0" encoding="UTF-8" standalone="yes"?>','<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">','<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>',"</Relationships>"].join("");const lt=['<?xml version="1.0" encoding="UTF-8" standalone="yes"?>','<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">','<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>','<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>',"</Relationships>"].join("");const it=['<?xml version="1.0" encoding="UTF-8" standalone="yes"?>','<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">','<numFmts count="1"><numFmt numFmtId="164" formatCode="yyyy-mm-dd"/></numFmts>','<fonts count="2">','<font><sz val="11"/><name val="Calibri"/><family val="2"/></font>','<font><b/><sz val="11"/><name val="Calibri"/><family val="2"/></font>',"</fonts>",'<fills count="3">','<fill><patternFill patternType="none"/></fill>','<fill><patternFill patternType="gray125"/></fill>','<fill><patternFill patternType="solid"><fgColor rgb="FFF1F3F6"/><bgColor indexed="64"/></patternFill></fill>',"</fills>",'<borders count="2">',"<border><left/><right/><top/><bottom/><diagonal/></border>",'<border><left/><right/><top/><bottom style="thin"><color rgb="FFC9CED6"/></bottom><diagonal/></border>',"</borders>",'<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>','<cellXfs count="4">','<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>','<xf numFmtId="0" fontId="1" fillId="2" borderId="1" xfId="0" applyFont="1" applyFill="1" applyBorder="1"/>','<xf numFmtId="164" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>','<xf numFmtId="4" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>',"</cellXfs>",'<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>',"</styleSheet>"].join("");let $=null;function st(l){if(!$){$=new Uint32Array(256);for(let t=0;t<256;t+=1){let n=t;for(let a=0;a<8;a+=1)n=n&1?3988292384^n>>>1:n>>>1;$[t]=n>>>0}}let e=4294967295;for(let t=0;t<l.length;t+=1)e=$[(e^l[t])&255]^e>>>8;return(e^4294967295)>>>0}function dt(l){const e=new TextEncoder;const t=[];const n=[];let a=0;const o=new Date;const r=o.getHours()<<11|o.getMinutes()<<5|Math.floor(o.getSeconds()/2);const i=o.getFullYear()-1980<<9|o.getMonth()+1<<5|o.getDate();l.forEach(x=>{const w=e.encode(x.name);const E=st(x.data);const k=x.data.length;const y=new DataView(new ArrayBuffer(30));y.setUint32(0,67324752,true);y.setUint16(4,20,true);y.setUint16(6,2048,true);y.setUint16(8,0,true);y.setUint16(10,r,true);y.setUint16(12,i,true);y.setUint32(14,E,true);y.setUint32(18,k,true);y.setUint32(22,k,true);y.setUint16(26,w.length,true);y.setUint16(28,0,true);t.push(new Uint8Array(y.buffer),w,x.data);const _=new DataView(new ArrayBuffer(46));_.setUint32(0,33639248,true);_.setUint16(4,20,true);_.setUint16(6,20,true);_.setUint16(8,2048,true);_.setUint16(10,0,true);_.setUint16(12,r,true);_.setUint16(14,i,true);_.setUint32(16,E,true);_.setUint32(20,k,true);_.setUint32(24,k,true);_.setUint16(28,w.length,true);_.setUint32(42,a,true);n.push(new Uint8Array(_.buffer),w);a+=30+w.length+k});const s=n.reduce((x,w)=>x+w.length,0);const c=new DataView(new ArrayBuffer(22));c.setUint32(0,101010256,true);c.setUint16(8,l.length,true);c.setUint16(10,l.length,true);c.setUint32(12,s,true);c.setUint32(16,a,true);const v=[...t,...n,new Uint8Array(c.buffer)];const m=v.reduce((x,w)=>x+w.length,0);const g=new Uint8Array(m);let f=0;v.forEach(x=>{g.set(x,f);f+=x.length});return g}var ct=Fe({TableElement:()=>ee});const Ae="nvb-table-export-format";const L={text:[{value:"%-%",label:"table.search.op.contains"},{value:"!%-%",label:"table.search.op.notContains"},{value:"%-",label:"table.search.op.startsWith"},{value:"-%",label:"table.search.op.endsWith"},{value:"=",label:"table.search.op.equals"},{value:"!=",label:"table.search.op.notEquals"}],number:[{value:"=",label:"table.search.op.equals"},{value:"!=",label:"table.search.op.notEquals"},{value:">",label:"table.search.op.greaterThan"},{value:">=",label:"table.search.op.greaterOrEqual"},{value:"<",label:"table.search.op.lessThan"},{value:"<=",label:"table.search.op.lessOrEqual"}],date:[{value:"=",label:"table.search.op.equals"},{value:"!=",label:"table.search.op.notEquals"},{value:">",label:"table.search.op.after"},{value:">=",label:"table.search.op.onOrAfter"},{value:"<",label:"table.search.op.before"},{value:"<=",label:"table.search.op.onOrBefore"}],boolean:[{value:"=",label:"table.search.op.equals"},{value:"!=",label:"table.search.op.notEquals"}]};const Ie=[b.BUTTON,b.SELECT,b.AUTOCOMPLETE,b.MULTI_SELECT,b.TEXT,b.NUMBER,b.RADIO,b.CHECKBOX,b.SINGLE_CHECKBOX,b.TOGGLE_SWITCH,b.DATEPICKER];const Z=new Set(Ie);const bt={[b.BUTTON]:"Button",[b.SELECT]:"Select",[b.AUTOCOMPLETE]:"Autocomplete",[b.MULTI_SELECT]:"Multi-select",[b.TEXT]:"Text input",[b.NUMBER]:"Number input",[b.RADIO]:"Radio",[b.CHECKBOX]:"Checkbox",[b.SINGLE_CHECKBOX]:"Single checkbox",[b.TOGGLE_SWITCH]:"Toggle switch",[b.DATEPICKER]:"Date picker"};const ut=new Set([b.DIALOG]);const vt=new Set([b.BADGE,b.STATS_CARD,b.MESSAGE_CARD,b.CUSTOM_HTML,b.HTML_SNIPPET,b.RICH_TEXT_VIEWER,b.PROGRESS_BAR,b.IMAGE,b.ICON,b.AVATAR,b.DIVIDER,b.SPACER,b.PAGE_TITLE].map(l=>String(l).toLowerCase()));var ee=class re{model=xe.required(...ngDevMode?[{debugName:"model"}]:[]);templateScopeId=`nvb-table-template-${Math.random().toString(36).slice(2,11)}`;templateScopeSelector=`[data-nvb-template-scope="${this.templateScopeId}"]`;tableShellRef=P("tableShellRef",...ngDevMode?[{debugName:"tableShellRef"}]:[]);stickyHeaderRef=P("stickyHeaderRef",...ngDevMode?[{debugName:"stickyHeaderRef"}]:[]);tableScrollerRef=P("tableScrollerRef",...ngDevMode?[{debugName:"tableScrollerRef"}]:[]);mainHeaderRowRef=P("mainHeaderRowRef",...ngDevMode?[{debugName:"mainHeaderRowRef"}]:[]);stickyHeaderOffset=u(0,...ngDevMode?[{debugName:"stickyHeaderOffset"}]:[]);stickyHeaderPinned=u(false,...ngDevMode?[{debugName:"stickyHeaderPinned"}]:[]);stickyHeaderScrollLeft=u(0,...ngDevMode?[{debugName:"stickyHeaderScrollLeft"}]:[]);stickyHeaderTableWidth=u(0,...ngDevMode?[{debugName:"stickyHeaderTableWidth"}]:[]);stickyHeaderCellWidths=u([],...ngDevMode?[{debugName:"stickyHeaderCellWidths"}]:[]);stickyHeaderEnabled=d(()=>this.coerceBooleanValue(this.model()?.stickyHeader),...ngDevMode?[{debugName:"stickyHeaderEnabled"}]:[]);stickyHeaderActiveOffset=d(()=>this.stickyHeaderEnabled()&&this.stickyHeaderPinned()?this.stickyHeaderOffset():0,...ngDevMode?[{debugName:"stickyHeaderActiveOffset"}]:[]);stickyHeaderCloneVisible=d(()=>{if(!this.stickyHeaderEnabled()||!this.stickyHeaderPinned()||this.virtualScrollEnabled())return false;return this.stickyHeaderCellWidths().some(e=>Number.isFinite(e)&&e>0)},...ngDevMode?[{debugName:"stickyHeaderCloneVisible"}]:[]);stickyHeaderResizeObserver=null;stickyHeaderSyncFrame=null;stickyHeaderGlobalScrollHandler=()=>{this.scheduleStickyHeaderSync()};stickyHeaderObserverEffect=q(()=>{const e=this.stickyHeaderRef()?.nativeElement??null;const t=this.mainHeaderRowRef()?.nativeElement??null;const n=this.tableScrollerRef()?.nativeElement??null;const a=this.stickyHeaderEnabled();this.syncStickyHeaderObserver(a?e:null,a?t:null,a?n:null)},...ngDevMode?[{debugName:"stickyHeaderObserverEffect"}]:[]);loading=u(false,...ngDevMode?[{debugName:"loading"}]:[]);initialLoadCompleted=u(false,...ngDevMode?[{debugName:"initialLoadCompleted"}]:[]);showLoadingOverlay=u(false,...ngDevMode?[{debugName:"showLoadingOverlay"}]:[]);skeletonVisible=u(false,...ngDevMode?[{debugName:"skeletonVisible"}]:[]);rows=u([],...ngDevMode?[{debugName:"rows"}]:[]);visibleRows=u([],...ngDevMode?[{debugName:"visibleRows"}]:[]);showInitialSkeleton=d(()=>this.skeletonVisible(),...ngDevMode?[{debugName:"showInitialSkeleton"}]:[]);initialSkeletonRows=d(()=>{const e=this.resolveInitialSkeletonRowCount();return Array.from({length:e},(t,n)=>n)},...ngDevMode?[{debugName:"initialSkeletonRows"}]:[]);totalRecords=u(0,...ngDevMode?[{debugName:"totalRecords"}]:[]);pageIndex=u(0,...ngDevMode?[{debugName:"pageIndex"}]:[]);sortField=u("",...ngDevMode?[{debugName:"sortField"}]:[]);sortDirection=u("",...ngDevMode?[{debugName:"sortDirection"}]:[]);openActionMenuRow=u(null,...ngDevMode?[{debugName:"openActionMenuRow"}]:[]);rowActionMenuPosition=u("bottom",...ngDevMode?[{debugName:"rowActionMenuPosition"}]:[]);rowActionMenuStyle=u({},...ngDevMode?[{debugName:"rowActionMenuStyle"}]:[]);openSelectionActionMenu=u(false,...ngDevMode?[{debugName:"openSelectionActionMenu"}]:[]);selectionActionMenuPosition=u("bottom",...ngDevMode?[{debugName:"selectionActionMenuPosition"}]:[]);selectionActionMenuStyle=u({},...ngDevMode?[{debugName:"selectionActionMenuStyle"}]:[]);selectedRowKeys=u([],...ngDevMode?[{debugName:"selectedRowKeys"}]:[]);expandedRowKeys=u([],...ngDevMode?[{debugName:"expandedRowKeys"}]:[]);virtualScrollStartIndex=u(0,...ngDevMode?[{debugName:"virtualScrollStartIndex"}]:[]);virtualScrollEndIndex=u(0,...ngDevMode?[{debugName:"virtualScrollEndIndex"}]:[]);expandedDataRows=u([],...ngDevMode?[{debugName:"expandedDataRows"}]:[]);expandedDataRowsKey=u(null,...ngDevMode?[{debugName:"expandedDataRowsKey"}]:[]);expandedDataRowsLoading=u(false,...ngDevMode?[{debugName:"expandedDataRowsLoading"}]:[]);expandedDataRowsError=u("",...ngDevMode?[{debugName:"expandedDataRowsError"}]:[]);activeRowKey=u(null,...ngDevMode?[{debugName:"activeRowKey"}]:[]);clickedRowKey=u(null,...ngDevMode?[{debugName:"clickedRowKey"}]:[]);quickSearchTerm=u("",...ngDevMode?[{debugName:"quickSearchTerm"}]:[]);quickSearchDraft=u("",...ngDevMode?[{debugName:"quickSearchDraft"}]:[]);showDetailedSearchPanel=u(false,...ngDevMode?[{debugName:"showDetailedSearchPanel"}]:[]);detailedFilters=u([],...ngDevMode?[{debugName:"detailedFilters"}]:[]);openDetailedFilterMultiSelectId=u(null,...ngDevMode?[{debugName:"openDetailedFilterMultiSelectId"}]:[]);openDetailedFilterDatePickerId=u(null,...ngDevMode?[{debugName:"openDetailedFilterDatePickerId"}]:[]);detailedFilterDateViewMonth=u(new Date,...ngDevMode?[{debugName:"detailedFilterDateViewMonth"}]:[]);exportScope=u("current",...ngDevMode?[{debugName:"exportScope"}]:[]);openExportMenu=u(false,...ngDevMode?[{debugName:"openExportMenu"}]:[]);headerCenterAddMenuOpen=u(false,...ngDevMode?[{debugName:"headerCenterAddMenuOpen"}]:[]);headerAddMenuPosition=u(null,...ngDevMode?[{debugName:"headerAddMenuPosition"}]:[]);exportMenuPosition=u("bottom",...ngDevMode?[{debugName:"exportMenuPosition"}]:[]);exportMenuStyle=u({},...ngDevMode?[{debugName:"exportMenuStyle"}]:[]);openExportDialog=u(false,...ngDevMode?[{debugName:"openExportDialog"}]:[]);exportSelectedColumnKeys=u([],...ngDevMode?[{debugName:"exportSelectedColumnKeys"}]:[]);exportBusy=u(false,...ngDevMode?[{debugName:"exportBusy"}]:[]);exportFormat=u("excel",...ngDevMode?[{debugName:"exportFormat"}]:[]);exportFileNameDraft=u("",...ngDevMode?[{debugName:"exportFileNameDraft"}]:[]);exportFormatOptions=[{value:"excel",icon:"table_view",labelKey:"table.export.format.excel",label:"Excel",hintKey:"table.export.format.excel.hint",hint:"Excel, Numbers, Google Sheets",extension:"xlsx"},{value:"csv",icon:"description",labelKey:"table.export.format.csv",label:"CSV",hintKey:"table.export.format.csv.hint",hint:"Plain text, for imports",extension:"csv"},{value:"pdf",icon:"picture_as_pdf",labelKey:"table.export.format.pdf",label:"PDF",hintKey:"table.export.format.pdf.hint",hint:"Print-ready document",extension:"pdf"}];headerActionDropdownValue=u("",...ngDevMode?[{debugName:"headerActionDropdownValue"}]:[]);headerMenuValue=u("",...ngDevMode?[{debugName:"headerMenuValue"}]:[]);headerMenuDataSourceOptions=u([],...ngDevMode?[{debugName:"headerMenuDataSourceOptions"}]:[]);headerMenuDataSourceLoading=u(false,...ngDevMode?[{debugName:"headerMenuDataSourceLoading"}]:[]);openSavedFiltersDialog=u(false,...ngDevMode?[{debugName:"openSavedFiltersDialog"}]:[]);savedFilterDialogTab=u("create",...ngDevMode?[{debugName:"savedFilterDialogTab"}]:[]);savedFilterName=u("",...ngDevMode?[{debugName:"savedFilterName"}]:[]);savedFilterDescription=u("",...ngDevMode?[{debugName:"savedFilterDescription"}]:[]);savedFilterCode=u("",...ngDevMode?[{debugName:"savedFilterCode"}]:[]);savedFilters=u([],...ngDevMode?[{debugName:"savedFilters"}]:[]);savedFiltersLoading=u(false,...ngDevMode?[{debugName:"savedFiltersLoading"}]:[]);savedFilterBusy=u(false,...ngDevMode?[{debugName:"savedFilterBusy"}]:[]);openColumnSettingsDialog=u(false,...ngDevMode?[{debugName:"openColumnSettingsDialog"}]:[]);columnSettingsState=u([],...ngDevMode?[{debugName:"columnSettingsState"}]:[]);columnSettingsDraft=u([],...ngDevMode?[{debugName:"columnSettingsDraft"}]:[]);configVersion=u(0,...ngDevMode?[{debugName:"configVersion"}]:[]);columnSettingsWidthMin=120;columnSettingsWidthMax=720;columnSettingsWidthStep=10;columnSettingsWidthDefault=240;editingRowKey=u(null,...ngDevMode?[{debugName:"editingRowKey"}]:[]);editingRowDraft=u(null,...ngDevMode?[{debugName:"editingRowDraft"}]:[]);editingOriginalRow=u(null,...ngDevMode?[{debugName:"editingOriginalRow"}]:[]);editingRowSaving=u(false,...ngDevMode?[{debugName:"editingRowSaving"}]:[]);pageSizeOverride=u(null,...ngDevMode?[{debugName:"pageSizeOverride"}]:[]);pageSize=d(()=>{this.configVersion();const e=this.pageSizeOverride();const t=Number(e??this.model()?.pageSize??10);if(!Number.isFinite(t)||t<=0)return 10;return Math.floor(t)},...ngDevMode?[{debugName:"pageSize"}]:[]);showPageSizeSelector=d(()=>{this.configVersion();const e=this.model()?.showPageSizeSelector;return e===void 0||e===null?true:this.coerceBooleanValue(e)},...ngDevMode?[{debugName:"showPageSizeSelector"}]:[]);pageSizeOptions=d(()=>{this.configVersion();const e=this.parsePageSizeOptions(this.model()?.pageSizeOptions);const t=this.pageSize();if(!e.includes(t))e.push(t);return[...new Set(e)].sort((n,a)=>n-a)},...ngDevMode?[{debugName:"pageSizeOptions"}]:[]);tableStyle=d(()=>{this.configVersion();const e=String(this.model()?.tableStyle??"default").trim().toLowerCase();if(e==="grid"||e==="striped")return e;return"default"},...ngDevMode?[{debugName:"tableStyle"}]:[]);dataColumns=d(()=>{this.configVersion();const e=this.isEditor();const t=this.dataService.buildRuntimeContext();const n=this.selectedRowKeys();const a=this.rows();const o=Array.isArray(this.model()?.columnsConfig)?this.model().columnsConfig:[];const r=new Map(this.columnSettingsState().map(i=>[String(i.key).trim(),i]));return o.filter(i=>String(i?.key??"").trim().length>0).slice().sort((i,s)=>{const c=o.indexOf(i);const v=o.indexOf(s);if(e)return c-v;const m=String(i?.key??"").trim();const g=String(s?.key??"").trim();return(r.get(m)?.order??c)-(r.get(g)?.order??v)}).filter((i,s)=>{const c=String(i?.key??"").trim();if(!e&&i?.showInTable===false)return false;if(!e&&r.get(c)?.visible===false)return false;return!this.isColumnHiddenByCondition(i,s,t,a,n)}).map(i=>{const s=String(i?.key??"").trim();const c=r.get(s);return{...i,width:c?.width??i?.width}})},...ngDevMode?[{debugName:"dataColumns"}]:[]);detailColumns=d(()=>{this.configVersion();return(Array.isArray(this.model()?.columnsConfig)?this.model().columnsConfig:[]).filter(e=>{if(!String(e?.key??"").trim())return false;return Boolean(e?.showInDetails)})},...ngDevMode?[{debugName:"detailColumns"}]:[]);headerControlsEnabled=d(()=>{this.configVersion();return Boolean(this.model()?.showHeaderControls??true)},...ngDevMode?[{debugName:"headerControlsEnabled"}]:[]);quickSearchEnabled=d(()=>{this.configVersion();return this.headerControlsEnabled()&&Boolean(this.model()?.showQuickSearch??true)},...ngDevMode?[{debugName:"quickSearchEnabled"}]:[]);detailedSearchEnabled=d(()=>{this.configVersion();return this.headerControlsEnabled()&&Boolean(this.model()?.showDetailedSearch??true)},...ngDevMode?[{debugName:"detailedSearchEnabled"}]:[]);exportEnabled=d(()=>{this.configVersion();return this.headerControlsEnabled()&&Boolean(this.model()?.showExport??true)},...ngDevMode?[{debugName:"exportEnabled"}]:[]);columnSettingsEnabled=d(()=>{this.configVersion();return this.headerControlsEnabled()&&Boolean(this.model()?.showColumnSettings??false)},...ngDevMode?[{debugName:"columnSettingsEnabled"}]:[]);columnSettingsMode=d(()=>{this.configVersion();const e=String(this.model()?.columnSettingsMode??"none").trim().toLowerCase();if(e==="localstorage")return"localStorage";if(e==="datasource")return"dataSource";if(e==="host")return"host";return"none"},...ngDevMode?[{debugName:"columnSettingsMode"}]:[]);exportUsesColumnPicker=d(()=>{this.configVersion();if(!this.exportEnabled())return false;const e=this.model()?.exportUseColumnPicker;return e===void 0||e===null?true:Boolean(e)},...ngDevMode?[{debugName:"exportUsesColumnPicker"}]:[]);exportColumns=d(()=>{this.configVersion();const e=new Set;const t=[];const n=a=>{const o=String(a?.key??"").trim();if(!o||e.has(o))return;e.add(o);t.push(a)};this.dataColumns().forEach(a=>n(a));this.detailColumns().forEach(a=>n(a));return t},...ngDevMode?[{debugName:"exportColumns"}]:[]);selectedExportColumns=d(()=>{const e=new Set(this.exportSelectedColumnKeys());const t=this.exportColumns();if(e.size===0)return[];return t.filter(n=>e.has(String(n?.key??"").trim()))},...ngDevMode?[{debugName:"selectedExportColumns"}]:[]);exportCurrentCount=d(()=>this.visibleRows().length,...ngDevMode?[{debugName:"exportCurrentCount"}]:[]);exportAllCount=d(()=>{if(this.model().lazyLoad&&this.hasDataSource())return this.totalRecords();return this.applySearchFilters(this.rows()).length},...ngDevMode?[{debugName:"exportAllCount"}]:[]);exportSelectedCount=d(()=>this.selectionEnabled()?this.resolveSelectionState().selectedRows.length:0,...ngDevMode?[{debugName:"exportSelectedCount"}]:[]);exportHasFilters=d(()=>this.quickSearchTerm().trim().length>0||this.detailedFilters().length>0,...ngDevMode?[{debugName:"exportHasFilters"}]:[]);exportRowCount=d(()=>{switch(this.exportScope()){case"selected":return this.exportSelectedCount();case"current":return this.exportCurrentCount();default:return this.exportAllCount()}},...ngDevMode?[{debugName:"exportRowCount"}]:[]);exportExtension=d(()=>this.exportFormatOptions.find(e=>e.value===this.exportFormat())?.extension??"xlsx",...ngDevMode?[{debugName:"exportExtension"}]:[]);allExportColumnsSelected=d(()=>{const e=this.exportColumns();if(e.length===0)return false;const t=new Set(this.exportSelectedColumnKeys());return e.every(n=>t.has(String(n?.key??"").trim()))},...ngDevMode?[{debugName:"allExportColumnsSelected"}]:[]);savedFiltersEnabled=d(()=>{this.configVersion();return this.detailedSearchEnabled()&&Boolean(this.model()?.enableSavedFilters)},...ngDevMode?[{debugName:"savedFiltersEnabled"}]:[]);savedFiltersMode=d(()=>{this.configVersion();const e=String(this.model()?.savedFiltersMode??"localStorage").trim().toLowerCase();if(e==="datasource")return"dataSource";if(e==="host")return"host";return"localStorage"},...ngDevMode?[{debugName:"savedFiltersMode"}]:[]);rowHoverEnabled=d(()=>{this.configVersion();return this.model()?.rowHover!==false},...ngDevMode?[{debugName:"rowHoverEnabled"}]:[]);flatHeaderSurface=d(()=>{this.configVersion();const e=this.model()?.flatHeaderSurface;if(typeof e==="string")return e.trim().toLowerCase()!=="false";return e===void 0||e===null?true:Boolean(e)},...ngDevMode?[{debugName:"flatHeaderSurface"}]:[]);headerActionsPosition=d(()=>{this.configVersion();const e=String(this.model()?.headerActionsPosition??"end").trim().toLowerCase();return e==="start"||e==="center"?e:"end"},...ngDevMode?[{debugName:"headerActionsPosition"}]:[]);headerActionsDisplayMode=d(()=>{this.configVersion();return String(this.model()?.headerActionsDisplayMode??"buttons").trim().toLowerCase()==="dropdown"?"dropdown":"buttons"},...ngDevMode?[{debugName:"headerActionsDisplayMode"}]:[]);headerActionsDropdownTrigger=d(()=>{this.configVersion();return String(this.model()?.headerActionsDropdownTrigger??"blur").trim().toLowerCase()==="change"?"change":"blur"},...ngDevMode?[{debugName:"headerActionsDropdownTrigger"}]:[]);flatFooterSurface=d(()=>{this.configVersion();const e=this.model()?.flatFooterSurface;if(typeof e==="string")return e.trim().toLowerCase()!=="false";return e===void 0||e===null?true:Boolean(e)},...ngDevMode?[{debugName:"flatFooterSurface"}]:[]);paginatorAlign=d(()=>{this.configVersion();const e=String(this.model()?.paginatorAlign??"end").trim().toLowerCase();if(e==="start"||e==="center")return e;return"end"},...ngDevMode?[{debugName:"paginatorAlign"}]:[]);headerActions=d(()=>{this.configVersion();return Array.isArray(this.model()?.headerActions)?this.model().headerActions:[]},...ngDevMode?[{debugName:"headerActions"}]:[]);headerActionDropdownOptions=d(()=>{this.configVersion();return this.visibleHeaderActions().map((e,t)=>({value:this.resolveHeaderActionDropdownOptionValue(e,t),label:this.resolveActionLabel(e),action:e}))},...ngDevMode?[{debugName:"headerActionDropdownOptions"}]:[]);hasHeaderActions=d(()=>this.headerActions().length>0,...ngDevMode?[{debugName:"hasHeaderActions"}]:[]);headerMenuEnabled=d(()=>{this.configVersion();return this.headerControlsEnabled()&&Boolean(this.model()?.headerMenuEnabled)},...ngDevMode?[{debugName:"headerMenuEnabled"}]:[]);headerMenuOptions=d(()=>{this.configVersion();this.headerMenuValue();return this.resolveHeaderMenuOptions()},...ngDevMode?[{debugName:"headerMenuOptions"}]:[]);hasHeaderMenu=d(()=>this.headerMenuEnabled()&&this.headerMenuOptions().length>0,...ngDevMode?[{debugName:"hasHeaderMenu"}]:[]);customHeaderTemplateHtml=d(()=>{this.configVersion();const e=String(this.model()?.headerTemplate??"").trim();if(!e)return null;const t={...this.dataService.getData()??{},quickSearch:this.quickSearchTerm(),filters:this.detailedFilters(),table:{name:String(this.model()?.name??"").trim(),quickSearch:this.quickSearchTerm(),filters:this.detailedFilters(),sortField:this.sortField(),sortDirection:this.sortDirection(),page:this.pageIndex()+1,pageSize:this.pageSize()},...this.buildSelectionRuntimeContext()};try{return this.templateEngineService.renderTemplate(e,t)}catch{return null}},...ngDevMode?[{debugName:"customHeaderTemplateHtml"}]:[]);rowTemplateSource=d(()=>{this.configVersion();return this.templateEngineService.resolveTemplateContentByName(String(this.model()?.rowTemplateName??"").trim(),String(this.model()?.rowTemplate??"").trim())},...ngDevMode?[{debugName:"rowTemplateSource"}]:[]);rowTemplateEnabled=d(()=>Boolean(this.rowTemplateSource()),...ngDevMode?[{debugName:"rowTemplateEnabled"}]:[]);rowTemplateColspan=d(()=>Math.max(this.dataColumns().length,1),...ngDevMode?[{debugName:"rowTemplateColspan"}]:[]);templateCss=d(()=>{this.configVersion();const e=new Set;const t=[];const n=[this.templateScopeSelector,".nvb-table",".nvb-table-detail-panel"];this.collectConfiguredTemplateSources().forEach(a=>{const o=String(a??"").trim();if(!o||e.has(o))return;e.add(o);n.forEach(r=>{const i=this.templateEngineService.resolveTemplateCss(o,r);const s=String(i??"").trim();if(!s||t.includes(s))return;t.push(s)})});return t.join("\n\n")},...ngDevMode?[{debugName:"templateCss"}]:[]);styleOutletKey=d(()=>{this.configVersion();return`table:${String(this.model()?.name??"").trim()||this.templateScopeId}:template-css`},...ngDevMode?[{debugName:"styleOutletKey"}]:[]);hasCustomHeaderTemplate=d(()=>this.customHeaderTemplateHtml()!==null,...ngDevMode?[{debugName:"hasCustomHeaderTemplate"}]:[]);headerCenterElementNames=d(()=>{this.configVersion();const e=Array.isArray(this.model()?.headerCenterElements)?this.model().headerCenterElements:[];const t=new Set;const n=[];e.forEach(a=>{const o=String(a??"").trim();if(!o||t.has(o))return;t.add(o);n.push(o)});return n},...ngDevMode?[{debugName:"headerCenterElementNames"}]:[]);headerCenterElements=d(()=>{this.configVersion();return this.headerCenterElementNames().map(e=>this.structureService.getElement(e)).filter(e=>Boolean(e))},...ngDevMode?[{debugName:"headerCenterElements"}]:[]);hasHeaderCenterElements=d(()=>this.headerCenterElementNames().length>0,...ngDevMode?[{debugName:"hasHeaderCenterElements"}]:[]);showHeaderCenterControls=d(()=>this.hasHeaderCenterElements()||A.isEditor(),...ngDevMode?[{debugName:"showHeaderCenterControls"}]:[]);headerCenterElementsPosition=d(()=>{this.configVersion();const e=String(this.model()?.headerCenterElementsPosition??"center").trim().toLowerCase();if(e==="left"||e==="right")return e;return"center"},...ngDevMode?[{debugName:"headerCenterElementsPosition"}]:[]);showHeaderCenterInLeft=d(()=>this.showHeaderCenterControls()&&this.headerCenterElementsPosition()==="left",...ngDevMode?[{debugName:"showHeaderCenterInLeft"}]:[]);showHeaderCenterInCenter=d(()=>this.showHeaderCenterControls()&&this.headerCenterElementsPosition()==="center",...ngDevMode?[{debugName:"showHeaderCenterInCenter"}]:[]);showHeaderCenterInRight=d(()=>this.showHeaderCenterControls()&&this.headerCenterElementsPosition()==="right",...ngDevMode?[{debugName:"showHeaderCenterInRight"}]:[]);headerCenterAddOptions=Ie.map(e=>({type:e,labelKey:`element.${e}`,fallbackLabel:bt[e]??e}));showHeaderCenterArea=d(()=>this.hasCustomHeaderTemplate()||this.showHeaderCenterInCenter(),...ngDevMode?[{debugName:"showHeaderCenterArea"}]:[]);headerCenterDropActive=u(false,...ngDevMode?[{debugName:"headerCenterDropActive"}]:[]);headerCenterDropAllowed=u(false,...ngDevMode?[{debugName:"headerCenterDropAllowed"}]:[]);showToolbar=d(()=>{if(!this.headerControlsEnabled())return false;return this.quickSearchEnabled()||this.detailedSearchEnabled()||this.exportEnabled()||this.columnSettingsEnabled()||this.hasCustomHeaderTemplate()||this.hasHeaderCenterElements()||A.isEditor()},...ngDevMode?[{debugName:"showToolbar"}]:[]);hasRowActions=d(()=>{this.configVersion();return(Array.isArray(this.model()?.rowActions)?this.model().rowActions:[]).length>0||this.inlineEditEnabled()&&this.hasInlineEditableColumns()},...ngDevMode?[{debugName:"hasRowActions"}]:[]);virtualScrollEnabled=d(()=>{this.configVersion();return Boolean(this.model()?.virtualScroll)&&!this.showInitialSkeleton()&&!this.expandedUsesInline()},...ngDevMode?[{debugName:"virtualScrollEnabled"}]:[]);virtualScrollViewportHeight=d(()=>{this.configVersion();const e=Number(this.model()?.virtualScrollViewportHeight??420);if(!Number.isFinite(e)||e<160)return 420;return Math.floor(e)},...ngDevMode?[{debugName:"virtualScrollViewportHeight"}]:[]);virtualScrollRowHeight=d(()=>{this.configVersion();const e=Number(this.model()?.virtualScrollRowHeight??52);if(!Number.isFinite(e)||e<24)return 52;return Math.floor(e)},...ngDevMode?[{debugName:"virtualScrollRowHeight"}]:[]);virtualScrollBuffer=d(()=>{this.configVersion();const e=Number(this.model()?.virtualScrollBuffer??6);if(!Number.isFinite(e)||e<1)return 6;return Math.floor(e)},...ngDevMode?[{debugName:"virtualScrollBuffer"}]:[]);renderedRows=d(()=>{const e=this.visibleRows();if(!this.virtualScrollEnabled())return e.map((a,o)=>({row:a,visibleIndex:o}));const t=Math.max(0,this.virtualScrollStartIndex());const n=Math.max(t,Math.min(e.length,this.virtualScrollEndIndex()));if(e.length>0&&n<=t){const a=Math.ceil(this.virtualScrollViewportHeight()/this.virtualScrollRowHeight())+this.virtualScrollBuffer()*2;return e.slice(0,Math.min(e.length,Math.max(1,a))).map((o,r)=>({row:o,visibleIndex:r}))}return e.slice(t,n).map((a,o)=>({row:a,visibleIndex:t+o}))},...ngDevMode?[{debugName:"renderedRows"}]:[]);virtualTopSpacerHeight=d(()=>{if(!this.virtualScrollEnabled())return 0;return this.virtualScrollStartIndex()*this.virtualScrollRowHeight()},...ngDevMode?[{debugName:"virtualTopSpacerHeight"}]:[]);virtualBottomSpacerHeight=d(()=>{if(!this.virtualScrollEnabled())return 0;return Math.max(this.visibleRows().length-this.virtualScrollEndIndex(),0)*this.virtualScrollRowHeight()},...ngDevMode?[{debugName:"virtualBottomSpacerHeight"}]:[]);rowActionsDisplayMode=d(()=>{this.configVersion();const e=String(this.model()?.rowActionsDisplayMode??"dropdown").trim().toLowerCase();if(e==="iconbuttons"||e==="icon-buttons")return"iconButtons";if(e==="buttons")return"buttons";return"dropdown"},...ngDevMode?[{debugName:"rowActionsDisplayMode"}]:[]);rowActionsDropdownButtonStyle=d(()=>{this.configVersion();return String(this.model()?.rowActionsDropdownButtonStyle??"borderless").trim().toLowerCase()==="default"?"default":"borderless"},...ngDevMode?[{debugName:"rowActionsDropdownButtonStyle"}]:[]);selectionActions=d(()=>{this.configVersion();return Array.isArray(this.model()?.selectionActions)?this.model().selectionActions:[]},...ngDevMode?[{debugName:"selectionActions"}]:[]);hasSelectionActions=d(()=>{this.configVersion();if(!Boolean(this.model()?.enableSelection))return false;return this.selectionActions().length>0},...ngDevMode?[{debugName:"hasSelectionActions"}]:[]);selectedRowsCount=d(()=>{this.configVersion();if(!Boolean(this.model()?.enableSelection))return 0;return this.selectedRowKeys().length},...ngDevMode?[{debugName:"selectedRowsCount"}]:[]);showActionsHeaderLabel=d(()=>{this.configVersion();const e=this.model()?.showActionsHeaderLabel;return e===void 0||e===null?true:this.coerceBooleanValue(e)},...ngDevMode?[{debugName:"showActionsHeaderLabel"}]:[]);selectionEnabled=d(()=>{this.configVersion();return Boolean(this.model()?.enableSelection)},...ngDevMode?[{debugName:"selectionEnabled"}]:[]);inlineEditEnabled=d(()=>{this.configVersion();return Boolean(this.model()?.enableInlineEdit)&&!this.isEditor()},...ngDevMode?[{debugName:"inlineEditEnabled"}]:[]);inlineEditStartMode=d(()=>{this.configVersion();return String(this.model()?.inlineEditStartMode??"action").trim().toLowerCase()==="doubleclick"?"doubleClick":"action"},...ngDevMode?[{debugName:"inlineEditStartMode"}]:[]);inlineEditSaveDataSourceName=d(()=>{this.configVersion();return String(this.model()?.inlineEditSaveDataSourceName??"").trim()},...ngDevMode?[{debugName:"inlineEditSaveDataSourceName"}]:[]);inlineEditCancelOnReload=d(()=>{this.configVersion();const e=this.model()?.inlineEditCancelOnReload;return e===void 0||e===null?true:this.coerceBooleanValue(e)},...ngDevMode?[{debugName:"inlineEditCancelOnReload"}]:[]);hasInlineEditableColumns=d(()=>{if(this.rowTemplateEnabled())return false;return this.dataColumns().some(e=>this.isInlineEditableColumn(e))},...ngDevMode?[{debugName:"hasInlineEditableColumns"}]:[]);expansionEnabled=d(()=>{this.configVersion();return Boolean(this.model()?.expandableRows)},...ngDevMode?[{debugName:"expansionEnabled"}]:[]);rowDetailsEnabled=d(()=>{return this.expansionEnabled()||this.detailColumns().length>0},...ngDevMode?[{debugName:"rowDetailsEnabled"}]:[]);expandedDisplayMode=d(()=>{this.configVersion();if(String(this.model()?.expandedDisplayMode??"sidePanel").trim().toLowerCase()==="inline")return"inline";return"sidePanel"},...ngDevMode?[{debugName:"expandedDisplayMode"}]:[]);expandedUsesSidePanel=d(()=>{return this.rowDetailsEnabled()&&this.expandedDisplayMode()!=="inline"},...ngDevMode?[{debugName:"expandedUsesSidePanel"}]:[]);expandedUsesInline=d(()=>{return this.rowDetailsEnabled()&&this.expandedDisplayMode()==="inline"},...ngDevMode?[{debugName:"expandedUsesInline"}]:[]);virtualScrollSyncEffect=q(()=>{this.virtualScrollEnabled();this.visibleRows().length;this.virtualScrollViewportHeight();this.virtualScrollRowHeight();this.virtualScrollBuffer();this.tableScrollerRef();queueMicrotask(()=>this.syncVirtualScrollWindow())},...ngDevMode?[{debugName:"virtualScrollSyncEffect"}]:[]);showExpandChevronColumn=d(()=>{this.configVersion();return this.rowDetailsEnabled()&&this.coerceBooleanValue(this.model()?.showExpandChevron)},...ngDevMode?[{debugName:"showExpandChevronColumn"}]:[]);alwaysShowExpandChevron=d(()=>{this.configVersion();return this.showExpandChevronColumn()&&this.coerceBooleanValue(this.model()?.alwaysShowExpandChevron)},...ngDevMode?[{debugName:"alwaysShowExpandChevron"}]:[]);expandedRowPanelContext=d(()=>{if(!this.expandedUsesSidePanel())return null;return this.findExpandedRowContext()},...ngDevMode?[{debugName:"expandedRowPanelContext"}]:[]);editorExpandedPreviewContext=d(()=>{this.configVersion();if(!this.isEditor()||!this.rowDetailsEnabled())return null;return{key:`${String(this.model()?.uuid??"").trim()||String(this.model()?.name??"").trim()||"table"}|editor-expanded-preview`,row:{},rowIndex:-1}},...ngDevMode?[{debugName:"editorExpandedPreviewContext"}]:[]);activeExpandedPanelContext=d(()=>{if(!this.expandedUsesSidePanel())return null;return this.expandedRowPanelContext()??this.editorExpandedPreviewContext()},...ngDevMode?[{debugName:"activeExpandedPanelContext"}]:[]);expandedDataColumns=d(()=>{this.configVersion();const e=(Array.isArray(this.model()?.expandedColumnsConfig)?this.model().expandedColumnsConfig:[]).filter(t=>String(t?.key??"").trim().length>0);if(e.length>0||this.isEditor())return e;return this.dataColumns()},...ngDevMode?[{debugName:"expandedDataColumns"}]:[]);expandedRowActions=d(()=>{this.configVersion();return Array.isArray(this.model()?.expandedRowActions)?this.model().expandedRowActions:[]},...ngDevMode?[{debugName:"expandedRowActions"}]:[]);hasExpandedRowActions=d(()=>this.expandedRowActions().length>0,...ngDevMode?[{debugName:"hasExpandedRowActions"}]:[]);allVisibleSelected=d(()=>{if(!this.selectionEnabled())return false;const e=this.visibleRows();if(e.length===0)return false;const t=new Set(this.selectedRowKeys());return e.every((n,a)=>t.has(this.resolveRowSelectionKey(n,this.resolveAbsoluteRowIndex(a))))},...ngDevMode?[{debugName:"allVisibleSelected"}]:[]);totalPages=d(()=>{if(!this.model().paginator)return 1;const e=this.pageSize();const t=this.totalRecords();if(t<=0)return 1;return Math.max(1,Math.ceil(t/e))},...ngDevMode?[{debugName:"totalPages"}]:[]);paginatorVariant=d(()=>{this.configVersion();const e=String(this.model()?.paginatorVariant??"full").trim().toLowerCase();if(e==="simple"||e==="numbers"||e==="pager")return e;return"full"},...ngDevMode?[{debugName:"paginatorVariant"}]:[]);paginatorStyle=d(()=>{this.configVersion();const e=String(this.model()?.paginatorStyle??"default").trim().toLowerCase();return e==="compact"||e==="segmented"?e:"default"},...ngDevMode?[{debugName:"paginatorStyle"}]:[]);showNumericPaginator=d(()=>{const e=this.paginatorVariant();return e==="numbers"||e==="pager"||e==="full"},...ngDevMode?[{debugName:"showNumericPaginator"}]:[]);showPrevNextPaginator=d(()=>{const e=this.paginatorVariant();return e==="simple"||e==="pager"||e==="full"},...ngDevMode?[{debugName:"showPrevNextPaginator"}]:[]);showFirstLastPaginator=d(()=>this.paginatorVariant()==="full",...ngDevMode?[{debugName:"showFirstLastPaginator"}]:[]);showPageMeta=d(()=>this.paginatorVariant()!=="pager"&&this.totalRecords()>0,...ngDevMode?[{debugName:"showPageMeta"}]:[]);useIconOnlyPaginatorNav=d(()=>{const e=this.paginatorStyle();return e==="compact"||e==="segmented"||this.paginatorVariant()==="pager"},...ngDevMode?[{debugName:"useIconOnlyPaginatorNav"}]:[]);visiblePageNumbers=d(()=>{this.configVersion();if(!this.showNumericPaginator())return[];const e=this.totalPages();if(e<=0)return[];const t=Number(this.model()?.paginatorMaxButtons??7);const n=Number.isFinite(t)&&t>0?Math.floor(t):7;if(n>=e)return Array.from({length:e}).map((g,f)=>f);const a=Math.floor(n/2);const o=this.pageIndex();const r=e;const i=Math.max(0,r-n);const s=Math.max(0,o-a);const c=Math.min(s,i);const v=Math.min(r,c+n);const m=[];for(let g=c;g<v;g+=1)m.push(g);return m},...ngDevMode?[{debugName:"visiblePageNumbers"}]:[]);pageMeta=d(()=>{const e=this.totalRecords();if(e<=0)return"";const t=this.pageSize();const n=this.pageIndex()*t+1;return`${n}-${Math.min(n+this.visibleRows().length-1,e)} / ${e}`},...ngDevMode?[{debugName:"pageMeta"}]:[]);isEditor=d(()=>A.isEditor(),...ngDevMode?[{debugName:"isEditor"}]:[]);focusedColumn=u(null,...ngDevMode?[{debugName:"focusedColumn"}]:[]);focusedHeaderCenterElementName=u("",...ngDevMode?[{debugName:"focusedHeaderCenterElementName"}]:[]);dataSourceService=S(ze);localeFormatService=S(Le);actionService=S(Ke);dataService=S(Ve);structureService=S(ie);eventService=S(B);ngxViewBuilderApi=S(je);elementFocusService=S(W);expressionService=S(He);templateEngineService=S(Be);modelService=S(Oe);rendererService=S(qe);dataSubscription=null;expandedDataSubscription=null;onElementFocusHandler=null;onPropertyChangedHandler=null;onDataValueChangedHandler=null;onDataMutationHandler=null;onDataSourceReloadedHandler=null;onTableSettingsChangedHandler=null;onTableFiltersChangedHandler=null;onTableSavedFiltersChangedHandler=null;quickSearchDebounceHandle=null;loadingShowDelayHandle=null;loadingHideHandle=null;cellElementModels=new Map;cellElementSubscriptions=new Map;stableRowIds=new WeakMap;stableRowIdCounter=0;initialSkeletonWidthPattern=[96,88,74,91,79,84];initialSkeletonShowDelayMs=150;initialSkeletonMinVisibleMs=400;skeletonShownAt=0;ngOnInit(){this.initHeaderCenterExtensions();this.onElementFocusHandler=e=>{const t=e.payload;if(t?.propertyType==="tableColumn"){this.focusedHeaderCenterElementName.set("");if(t?.__tableParent===this.model())this.focusedColumn.set(t);else this.focusedColumn.set(null);return}this.focusedColumn.set(null);const n=String(t?.name??"").trim();if(n&&this.headerCenterElementNames().includes(n)){this.focusedHeaderCenterElementName.set(n);return}this.focusedHeaderCenterElementName.set("")};this.onPropertyChangedHandler=e=>{const t=e?.payload;const n=String(this.model()?.name??"").trim();const a=String(t?.elementName??t?.elementNameOrPath??"").trim();const o=a.length>0&&this.headerCenterElementNames().includes(a);if(t&&a&&a!==n&&!o)return;this.configVersion.update(i=>i+1);this.ensureFocusedColumnExists();const r=String(t?.key??t?.propertyKey??"").trim();if(r==="enableSelection"&&!this.selectionEnabled()){this.selectedRowKeys.set([]);this.openSelectionActionMenu.set(false)}if(r==="enableInlineEdit"&&!this.inlineEditEnabled())this.clearInlineEditState();if(r==="expandableRows"&&!this.rowDetailsEnabled()){this.expandedRowKeys.set([]);this.resetExpandedDataState()}if(r==="expandableRows"||r==="expandedDisplayMode"||r==="expandedItemsPath"||r==="expandedDataSourceName"||r==="expandedDataSourceItemsPath"||r==="expandedTemplate"||r==="expandedColumnsConfig"){this.resetExpandedDataState();this.reloadExpandedDataForCurrentRow()}if(r==="tableDataSourceName"||r==="tableItemsPath"||r==="tableTotalPath"||r==="orderClause"||r==="orderDirection"||r==="lazyLoad"||r==="pageSize"||r==="virtualScroll"||r==="virtualScrollViewportHeight"||r==="virtualScrollRowHeight"||r==="virtualScrollBuffer"||r==="params"||r==="quickSearchParamName"||r==="quickSearchCondition"||r==="quickSearchCaseMode"||r==="detailedSearchCaseMode"){if(r==="pageSize")this.pageSizeOverride.set(null);this.pageIndex.set(0);this.loadTableData(true);return}if(r==="columnsConfig"||r==="showColumnSettings"||r==="columnSettingsMode"||r==="columnSettingsStorageKey"||r==="columnSettingsDataSourceName"||r==="columnSettingsDataSourcePath"||r==="saveColumnSettingsDataSourceName"){this.syncColumnSettingsState();this.initializeColumnSettings()}if(r==="headerActions"||r==="headerActionsPosition"||r==="headerActionsDisplayMode"||r==="headerActionsDropdownTrigger")this.headerActionDropdownValue.set("");if(r==="autoSelectCondition"||r==="selectionKey")this.applyAutoSelectionByCondition(this.rows());if(r==="selectionItemTemplate")this.syncSelectionContext();this.resetCellElementModels();this.applyClientState()};this.eventService.onElementFocus.add(this.onElementFocusHandler);this.eventService.afterPropertyChanged.add(this.onPropertyChangedHandler);this.onDataValueChangedHandler=()=>{this.configVersion.update(e=>e+1);this.refreshDetailedFilterDataSourceOptions()};this.onDataMutationHandler=e=>{const t=String(e?.dataPath??"").trim();if(this.mirrorCellElementValueToRow(t))return;if(!this.shouldRefreshDataSource(t))return;this.pageIndex.set(0);this.loadTableData(true)};this.onDataSourceReloadedHandler=e=>{const t=String(e?.sourceName??"").trim();const n=this.resolveTableSourceName();if(n&&n===t){const r=String(this.model()?.name??"").trim();const i=String(e?.contextElementName??"").trim();if(this.initialLoadCompleted()&&r&&i===r&&e?.result!==void 0){this.dataSubscription?.unsubscribe();this.applyLoadedTableResult(e.result);return}this.loadTableData(true);return}const a=String(this.model()?.columnSettingsDataSourceName??"").trim();if(this.columnSettingsMode()==="dataSource"&&a&&a===t)this.loadColumnSettingsFromDataSource();const o=this.resolveExpandedDataSourceName();if(o&&o===t)this.reloadExpandedDataForCurrentRow()};this.dataService.onValueChanged.add(this.onDataValueChangedHandler);this.dataService.onDataMutated.add(this.onDataMutationHandler);this.dataSourceService.onDataSourceReloaded.add(this.onDataSourceReloadedHandler);this.onTableSettingsChangedHandler=e=>{if(!this.matchesTableSettingsEvent(e))return;this.applyColumnSettingsState(e.settings)};this.ngxViewBuilderApi.onTableSettingsChanged.add(this.onTableSettingsChangedHandler);this.onTableFiltersChangedHandler=e=>{if(!this.matchesTableFiltersEvent(e))return;const t=this.normalizeDetailedFilterPayload(e.filters);if(JSON.stringify(this.detailedFiltersAsApiPayload(this.detailedFilters()))===JSON.stringify(this.detailedFiltersAsApiPayload(t)))return;this.applyDetailedFiltersState(t,e.source==="host")};this.ngxViewBuilderApi.onTableFiltersChanged.add(this.onTableFiltersChangedHandler);this.onTableSavedFiltersChangedHandler=e=>{if(!this.matchesTableSavedFiltersEvent(e))return;this.savedFilters.set(this.normalizeSavedFiltersFromApi(e.filters))};this.ngxViewBuilderApi.onTableSavedFiltersChanged.add(this.onTableSavedFiltersChangedHandler);if(typeof document!=="undefined")document.addEventListener("scroll",this.stickyHeaderGlobalScrollHandler,true);this.syncColumnSettingsState();this.initializeColumnSettings();this.initializeAppliedTableFilters();this.loadSavedFilters(true);this.loadTableData(true)}ngOnDestroy(){this.dataSubscription?.unsubscribe();this.expandedDataSubscription?.unsubscribe();this.resetCellElementModels();this.stopStickyHeaderObserver();this.clearLoadingTimers();if(this.quickSearchDebounceHandle){clearTimeout(this.quickSearchDebounceHandle);this.quickSearchDebounceHandle=null}if(this.onElementFocusHandler)this.eventService.onElementFocus.remove(this.onElementFocusHandler);if(this.onPropertyChangedHandler)this.eventService.afterPropertyChanged.remove(this.onPropertyChangedHandler);if(this.onDataValueChangedHandler)this.dataService.onValueChanged.remove(this.onDataValueChangedHandler);if(this.onDataMutationHandler)this.dataService.onDataMutated.remove(this.onDataMutationHandler);if(this.onDataSourceReloadedHandler)this.dataSourceService.onDataSourceReloaded.remove(this.onDataSourceReloadedHandler);if(this.onTableSettingsChangedHandler)this.ngxViewBuilderApi.onTableSettingsChanged.remove(this.onTableSettingsChangedHandler);if(this.onTableFiltersChangedHandler)this.ngxViewBuilderApi.onTableFiltersChanged.remove(this.onTableFiltersChangedHandler);if(this.onTableSavedFiltersChangedHandler)this.ngxViewBuilderApi.onTableSavedFiltersChanged.remove(this.onTableSavedFiltersChangedHandler);if(typeof document!=="undefined")document.removeEventListener("scroll",this.stickyHeaderGlobalScrollHandler,true);if(this.stickyHeaderSyncFrame!==null&&typeof cancelAnimationFrame==="function"){cancelAnimationFrame(this.stickyHeaderSyncFrame);this.stickyHeaderSyncFrame=null}}syncStickyHeaderObserver(e,t,n){this.stopStickyHeaderObserver();if(!e||typeof ResizeObserver!=="function"){this.stickyHeaderOffset.set(0);this.stickyHeaderPinned.set(false);this.stickyHeaderScrollLeft.set(0);this.stickyHeaderTableWidth.set(0);this.stickyHeaderCellWidths.set([]);return}this.syncStickyHeaderLayout(e,t,n);this.stickyHeaderResizeObserver=new ResizeObserver(()=>{this.syncStickyHeaderLayout(e,t,n)});this.stickyHeaderResizeObserver.observe(e);if(t)this.stickyHeaderResizeObserver.observe(t);if(n)this.stickyHeaderResizeObserver.observe(n)}stopStickyHeaderObserver(){this.stickyHeaderResizeObserver?.disconnect();this.stickyHeaderResizeObserver=null;this.stickyHeaderPinned.set(false)}scheduleStickyHeaderSync(){if(this.stickyHeaderSyncFrame!==null)return;if(typeof requestAnimationFrame!=="function"){this.syncStickyHeaderLayout();return}this.stickyHeaderSyncFrame=requestAnimationFrame(()=>{this.stickyHeaderSyncFrame=null;this.syncStickyHeaderLayout()})}syncStickyHeaderLayout(e,t,n){const a=e??this.stickyHeaderRef()?.nativeElement??null;const o=t??this.mainHeaderRowRef()?.nativeElement??null;const r=n??this.tableScrollerRef()?.nativeElement??null;if(a)this.updateStickyHeaderOffset(a);this.updateStickyHeaderCloneMetrics(o,r);this.syncStickyHeaderPinnedState(a)}updateStickyHeaderOffset(e){const t=Number(e.getBoundingClientRect().height);this.stickyHeaderOffset.set(Number.isFinite(t)&&t>0?t:0)}updateStickyHeaderCloneMetrics(e,t){const n=e??this.mainHeaderRowRef()?.nativeElement??null;const a=t??this.tableScrollerRef()?.nativeElement??null;if(!n||!a){this.stickyHeaderCellWidths.set([]);this.stickyHeaderTableWidth.set(0);this.stickyHeaderScrollLeft.set(0);return}const o=Array.from(n.children).map(i=>{const s=Number(i.getBoundingClientRect().width);return Number.isFinite(s)&&s>0?Math.round(s):0});this.stickyHeaderCellWidths.set(o);const r=Number(a.scrollWidth);this.stickyHeaderTableWidth.set(Number.isFinite(r)&&r>0?r:0);this.stickyHeaderScrollLeft.set(Math.max(0,Math.floor(a.scrollLeft)))}syncStickyHeaderPinnedState(e){const t=e??this.stickyHeaderRef()?.nativeElement??null;if(!this.stickyHeaderEnabled()||!t){this.stickyHeaderPinned.set(false);return}const n=this.tableShellRef()?.nativeElement??null;const a=Number(t.getBoundingClientRect().top);const o=Number(n?.getBoundingClientRect().bottom??NaN);const r=this.stickyHeaderOffset();const i=!Number.isFinite(o)||o>Math.max(r+1,t.offsetHeight+1);this.stickyHeaderPinned.set(Number.isFinite(a)&&a<=.5&&i)}onSort(e){if(!e?.sortable)return;const t=String(e.key??"").trim();if(!t)return;if(this.sortField()!==t){this.sortField.set(t);this.sortDirection.set("asc")}else if(this.sortDirection()==="asc")this.sortDirection.set("desc");else if(this.sortDirection()==="desc"){this.sortDirection.set("");this.sortField.set("")}else this.sortDirection.set("asc");this.pageIndex.set(0);if(this.model().lazyLoad&&this.hasDataSource()){this.loadTableData(true);return}this.applyClientState()}onColumnHeaderClick(e,t,n){if(this.isEditor()){n.preventDefault();n.stopPropagation();this.focusColumn(e,t);return}this.onSort(e)}onColumnHeaderFocus(e,t){if(!this.isEditor())return;this.focusColumn(e,t)}onExpandedColumnHeaderClick(e,t,n){if(!this.isEditor())return;n.preventDefault();n.stopPropagation();this.focusColumn(e,t,"expandedColumnsConfig")}onExpandedColumnHeaderFocus(e,t){if(!this.isEditor())return;this.focusColumn(e,t,"expandedColumnsConfig")}isColumnFocused(e,t){const n=this.focusedColumn();if(!n)return false;return n.__columnCollection==="columnsConfig"&&n.__columnId===this.resolveColumnIdentity(e,t,"columnsConfig")}isExpandedColumnFocused(e,t){const n=this.focusedColumn();if(!n)return false;return n.__columnCollection==="expandedColumnsConfig"&&n.__columnId===this.resolveColumnIdentity(e,t,"expandedColumnsConfig")}quickSearchPlaceholder(){const e=String(this.model()?.quickSearchPlaceholder??"").trim();if(e)return e;return"table.search.quickPlaceholder"}onQuickSearchValueChange(e){this.quickSearchDraft.set(String(e??""));if(!this.model()?.quickSearchOnType)return;this.quickSearchTerm.set(this.quickSearchDraft());this.pageIndex.set(0);this.scheduleSearchReload()}applyQuickSearch(){this.quickSearchTerm.set(this.quickSearchDraft());this.pageIndex.set(0);this.scheduleSearchReload(true)}clearQuickSearch(){const e=Boolean(this.quickSearchTerm());if(!e&&!this.quickSearchDraft())return;this.quickSearchDraft.set("");this.quickSearchTerm.set("");if(!e)return;this.pageIndex.set(0);this.scheduleSearchReload(true)}toggleDetailedSearch(){if(this.isEditor())return;const e=!this.showDetailedSearchPanel();this.showDetailedSearchPanel.set(e);if(!e){this.openDetailedFilterMultiSelectId.set(null);this.openDetailedFilterDatePickerId.set(null)}if(e&&this.detailedFilters().length===0){this.addDetailedFilter();return}if(e)this.refreshDetailedFilterDataSourceOptions(true)}detailedFiltersCount(){return this.detailedFilters().filter(e=>this.isDetailedFilterActive(e)).length}addDetailedFilter(){const e=this.dataColumns()[0];if(!e)return;const t=this.resolveColumnType(e);const n=this.resolveColumnFilterControlType(e,t);const a=this.defaultOperatorForType(t);const o={id:D(),key:String(e.key??"").trim(),operator:a,value:this.defaultFilterValue(t,n,e),type:t,controlType:n,options:this.resolveColumnFilterOptions(e),column:e};this.detailedFilters.set([...this.detailedFilters(),o]);this.loadFilterOptionsFromDataSourceForFilter(o.id,e,true)}removeDetailedFilter(e){const t=this.detailedFilters().filter(n=>n.id!==e);this.detailedFilters.set(t);if(this.openDetailedFilterMultiSelectId()===e)this.openDetailedFilterMultiSelectId.set(null);if(this.openDetailedFilterDatePickerId()===e)this.openDetailedFilterDatePickerId.set(null);this.pageIndex.set(0);this.emitTableFiltersChanged(this.cloneDetailedFilters(t),"user");this.scheduleSearchReload()}clearDetailedSearch(){this.detailedFilters.set([]);this.openDetailedFilterMultiSelectId.set(null);this.openDetailedFilterDatePickerId.set(null);this.pageIndex.set(0);this.emitTableFiltersChanged([],"user");this.scheduleSearchReload(true)}applyDetailedSearch(){this.openDetailedFilterDatePickerId.set(null);this.pageIndex.set(0);this.emitTableFiltersChanged(this.cloneDetailedFilters(this.detailedFilters()),"user");this.scheduleSearchReload(true)}openSavedFilters(){if(!this.savedFiltersEnabled())return;this.savedFilterDialogTab.set("create");this.savedFilterName.set("");this.savedFilterDescription.set("");this.savedFilterCode.set("");this.openSavedFiltersDialog.set(true);this.loadSavedFilters(true)}closeSavedFilters(){this.openSavedFiltersDialog.set(false)}setSavedFilterDialogTab(e){this.savedFilterDialogTab.set(e)}async saveCurrentFilter(e){e.preventDefault();e.stopPropagation();if(this.savedFilterBusy())return;const t=String(this.savedFilterName()??"").trim();if(!t)return;const n={id:D(),name:t,description:String(this.savedFilterDescription()??"").trim(),code:String(this.savedFilterCode()??"").trim(),filters:this.cloneDetailedFilters(this.detailedFilters())};const a=[n,...this.savedFilters().filter(o=>o.id!==n.id)];this.ngxViewBuilderApi.requestTableSavedFilterSave(this.resolveTableStateTableName(),this.resolveTableStateElementName(),this.toApiSavedFilterEntry(n),this.savedFiltersAsApiPayload(a));this.savedFilterBusy.set(true);try{await this.persistSavedFilterToDataSource(n);const o=this.savedFilters();this.savedFilters.set([n,...o]);this.saveFiltersToLocalStorage(this.savedFilters());this.savedFilterName.set("");this.savedFilterDescription.set("");this.savedFilterCode.set("");this.savedFilterDialogTab.set("list")}finally{this.savedFilterBusy.set(false)}}applySavedFilter(e,t){t.preventDefault();t.stopPropagation();this.detailedFilters.set(this.cloneDetailedFilters(e?.filters??[]));this.refreshDetailedFilterDataSourceOptions(true);this.pageIndex.set(0);this.emitTableFiltersChanged(this.cloneDetailedFilters(e?.filters??[]),"savedFilter",this.toApiSavedFilterEntry(e));this.scheduleSearchReload(true);this.closeSavedFilters()}async deleteSavedFilter(e,t){t.preventDefault();t.stopPropagation();if(!e||this.savedFilterBusy())return;this.savedFilterBusy.set(true);try{await this.deleteSavedFilterFromDataSource(e);const n=this.savedFilters().filter(a=>a.id!==e.id);this.savedFilters.set(n);this.saveFiltersToLocalStorage(n)}finally{this.savedFilterBusy.set(false)}}updateDetailedFilterKey(e,t){const n=String(t??"").trim();if(!n)return;const a=this.dataColumns().find(c=>String(c.key??"").trim()===n);const o=this.resolveColumnType(a);const r=this.resolveColumnFilterControlType(a,o);const i=this.defaultOperatorForType(o);const s=this.defaultFilterValue(o,r,a);this.updateDetailedFilter(e,()=>({key:n,type:o,controlType:r,options:this.resolveColumnFilterOptions(a),column:a,operator:i,value:s}));if(this.openDetailedFilterMultiSelectId()===e)this.openDetailedFilterMultiSelectId.set(null);this.loadFilterOptionsFromDataSourceForFilter(e,a,true)}updateDetailedFilterOperator(e,t){const n=this.normalizeOperator(t);this.updateDetailedFilter(e,()=>({operator:n}))}updateDetailedFilterValue(e,t){this.updateDetailedFilter(e,n=>({value:this.normalizeFilterValue(n.type,t,this.resolveDetailedFilterControlType(n),n.column)}))}getFilterOperators(e){const t=this.resolveDetailedFilterControlType(e);if(t==="select"||t==="multiSelect"||t==="checkbox"||t==="toggle"||t==="boolean")return L.boolean;if(t==="number")return L.number;if(t==="date"||t==="dateTime")return L.date;return this.operatorsForType(e.type)}isBooleanFilter(e){return this.resolveDetailedFilterControlType(e)==="boolean"}isNumericFilter(e){return this.resolveDetailedFilterControlType(e)==="number"}isDateFilter(e){return this.resolveDetailedFilterControlType(e)==="date"}isDateTimeFilter(e){return this.resolveDetailedFilterControlType(e)==="dateTime"}resolveDetailedFilterDateLabel(e){const t=this.parseDetailedFilterDate(e?.value);if(!t)return"";return this.toIsoDate(t)}toggleDetailedFilterDatePicker(e,t){t.preventDefault();t.stopPropagation();const n=String(e?.id??"").trim();if(!n)return;if(this.openDetailedFilterDatePickerId()===n){this.openDetailedFilterDatePickerId.set(null);return}const a=this.parseDetailedFilterDate(e?.value)??new Date;this.detailedFilterDateViewMonth.set(new Date(a.getFullYear(),a.getMonth(),1));this.openDetailedFilterDatePickerId.set(n);this.openDetailedFilterMultiSelectId.set(null)}isDetailedFilterDatePickerOpen(e){return this.openDetailedFilterDatePickerId()===e}resolveDetailedFilterDateMonthLabel(){return new Intl.DateTimeFormat(void 0,{month:"long",year:"numeric"}).format(this.detailedFilterDateViewMonth())}resolveDetailedFilterDateWeekdays(){const e=new Date(2024,0,1);return Array.from({length:7},(t,n)=>{const a=new Date(e);a.setDate(e.getDate()+n);return new Intl.DateTimeFormat(void 0,{weekday:"short"}).format(a)})}resolveDetailedFilterDateDays(e){const t=this.detailedFilterDateViewMonth();const n=new Date(t.getFullYear(),t.getMonth(),1);const a=(n.getDay()+6)%7;const o=new Date(n);o.setDate(n.getDate()-a);const r=this.parseDetailedFilterDate(e?.value);const i=this.normalizeDateOnly(new Date);return Array.from({length:42},(s,c)=>{const v=new Date(o);v.setDate(o.getDate()+c);const m=this.toIsoDate(v);const g=this.normalizeDateOnly(v);return{key:`${m}-${c}`,iso:m,day:g.getDate(),outsideMonth:g.getMonth()!==n.getMonth(),isToday:this.areSameDate(g,i),isSelected:this.areSameDate(g,r)}})}previousDetailedFilterDateMonth(e){e.preventDefault();e.stopPropagation();const t=this.detailedFilterDateViewMonth();this.detailedFilterDateViewMonth.set(new Date(t.getFullYear(),t.getMonth()-1,1))}nextDetailedFilterDateMonth(e){e.preventDefault();e.stopPropagation();const t=this.detailedFilterDateViewMonth();this.detailedFilterDateViewMonth.set(new Date(t.getFullYear(),t.getMonth()+1,1))}selectDetailedFilterDate(e,t,n){n.preventDefault();n.stopPropagation();this.updateDetailedFilterValue(e,String(t??"").trim());this.openDetailedFilterDatePickerId.set(null)}clearDetailedFilterDate(e,t){t.preventDefault();t.stopPropagation();this.updateDetailedFilterValue(e,"");this.openDetailedFilterDatePickerId.set(null)}isSelectFilter(e){return this.resolveDetailedFilterControlType(e)==="select"}isMultiSelectFilter(e){return this.resolveDetailedFilterControlType(e)==="multiSelect"}isCheckboxFilter(e){return this.resolveDetailedFilterControlType(e)==="checkbox"}isToggleFilter(e){return this.resolveDetailedFilterControlType(e)==="toggle"}updateDetailedToggleFilterValue(e,t){const n=this.detailedFilters().find(a=>a.id===e);if(!n)return;this.updateDetailedFilterValue(e,this.resolveFilterToggleValue(n.column,t))}resolveDetailedFilterOptions(e){return Array.isArray(e?.options)?e.options:[]}useDetailedFilterOptionSelect(e){if(!e)return false;const t=this.resolveDetailedFilterControlType(e);if(t!=="checkbox"&&t!=="toggle"&&t!=="boolean")return false;return this.resolveDetailedFilterOptions(e).length>0}resolveDetailedBooleanOptions(e){const t=this.resolveDetailedFilterOptions(e);if(t.length>0)return t;return[{label:"True",value:"true"},{label:"False",value:"false"}]}filterValueAsString(e){return String(e??"")}isFilterOptionSelected(e,t){return this.resolveSelectedFilterOptionValues(e).includes(String(t??"").trim())}isFilterValueTrue(e){return this.filterValueAsString(e?.value).trim()!=="false"}isToggleFilterValueTrue(e){return this.filterValueAsString(e?.value).trim()===this.resolveFilterToggleValue(e?.column,true)}onDetailedFilterMultiSelectChange(e,t){const n=t.target;if(!n)return;const a=Array.from(n.selectedOptions).map(i=>String(i?.value??"").trim());const o=this.detailedFilters().find(i=>i.id===e);const r=this.resolveFilterMultiDelimiter(o?.column);this.updateDetailedFilterValue(e,a.join(r))}toggleDetailedFilterMultiSelectMenu(e,t){t.preventDefault();t.stopPropagation();const n=this.openDetailedFilterMultiSelectId()===e?null:e;this.openDetailedFilterMultiSelectId.set(n)}isDetailedFilterMultiSelectOpen(e){return this.openDetailedFilterMultiSelectId()===e}resolveDetailedFilterMultiSelectLabel(e){const t=this.resolveSelectedFilterOptionValues(e);if(t.length===0)return"";const n=new Map(this.resolveDetailedFilterOptions(e).map(o=>[String(o.value??"").trim(),String(o.label??"").trim()]));const a=t.map(o=>n.get(o)??o).filter(o=>String(o??"").trim().length>0);if(a.length<=2)return a.join(", ");return`${a[0]}, +${a.length-1}`}hasDetailedFilterSelectedOptions(e){return this.resolveSelectedFilterOptionValues(e).length>0}onDetailedFilterMultiSelectOptionToggle(e,t,n){const a=this.detailedFilters().find(c=>c.id===e);if(!a)return;const o=String(t??"").trim();if(!o)return;const r=this.resolveSelectedFilterOptionValues(a);const i=n?Array.from(new Set([...r,o])):r.filter(c=>c!==o);const s=this.resolveFilterMultiDelimiter(a.column);this.updateDetailedFilterValue(e,i.join(s))}isExportColumnSelected(e){const t=String(e?.key??"").trim();if(!t)return false;return this.exportSelectedColumnKeys().includes(t)}onExportColumnSelectionChange(e,t){const n=String(e?.key??"").trim();this.toggleExportColumnSelection(n,t)}exportBusyLabel(){return this.exportBusy()?"table.export.busy":""}async exportCsv(e){await this.exportRows("csv",e)}async exportExcel(e){await this.exportRows("excel",e)}async exportPdf(e){await this.exportRows("pdf",e)}async onHeaderTemplateClick(e){const t={...this.dataService.getData()??{},table:{name:String(this.model()?.name??"").trim(),quickSearch:this.quickSearchTerm(),filters:this.detailedFilters()},quickSearch:this.quickSearchTerm(),filters:this.detailedFilters(),...this.buildSelectionRuntimeContext()};await this.templateEngineService.handleTemplateClickEvent(e,t,this.model())}toggleHeaderCenterAddMenu(e){e.preventDefault();e.stopPropagation();this.openActionMenuRow.set(null);this.openSelectionActionMenu.set(false);this.openExportMenu.set(false);this.openDetailedFilterMultiSelectId.set(null);const t=!this.headerCenterAddMenuOpen();if(t)this.positionHeaderAddMenu(e.currentTarget);this.headerCenterAddMenuOpen.set(t)}positionHeaderAddMenu(e){if(!e||typeof window==="undefined")return;const t=e.getBoundingClientRect();const n=220;const a=6;const o=8;const r=Math.min(280,this.headerCenterAddOptions.length*33+10);const i=window.innerHeight-t.bottom-a-o;const s=t.top-a-o;const c=i<r&&s>i;const v=Math.max(120,Math.min(280,c?s:i));const m=Math.min(Math.max(t.right-n,o),window.innerWidth-n-o);const g=c?t.top-a-Math.min(r,v):t.bottom+a;const f=Ue(e);this.headerAddMenuPosition.set({top:g-f.top,left:m-f.left,maxHeight:v});window.addEventListener("scroll",()=>this.headerCenterAddMenuOpen.set(false),{capture:true,once:true})}addHeaderCenterElementByType(e,t){t?.preventDefault();t?.stopPropagation();if(!this.isEditor())return;const n=this.createHeaderCenterElement(e,null);if(!n)return;const a=this.structureService.getStructure();if(!a?.elements)return;a.elements[n.name]=n;this.insertHeaderCenterElementName(n.name);this.configVersion.update(o=>o+1);this.eventService.onDrop.fire({payload:n});this.focusHeaderCenterElement(n);this.headerCenterAddMenuOpen.set(false)}onHeaderCenterDragOver(e){if(!A.isEditor())return;const t=this.resolveHeaderCenterDropIntent(e);this.headerCenterDropActive.set(true);this.headerCenterDropAllowed.set(t.accepted);if(!t.accepted)return;e.preventDefault();e.stopPropagation();if(e.dataTransfer)e.dataTransfer.dropEffect=t.existingElementName?"move":"copy"}onHeaderCenterDragLeave(e){if(!A.isEditor())return;const t=e.currentTarget;const n=e.relatedTarget;if(t&&n&&t.contains(n))return;this.headerCenterDropActive.set(false);this.headerCenterDropAllowed.set(false)}onHeaderCenterDrop(e){if(!A.isEditor())return;const t=this.resolveHeaderCenterDropIntent(e);this.headerCenterDropActive.set(false);this.headerCenterDropAllowed.set(false);if(!t.accepted||!t.type)return;let n=this.resolveHeaderCenterInsertIndex(e);e.preventDefault();e.stopPropagation();if(t.existingElementName){const r=this.structureService.getElement(t.existingElementName);if(!r)return;const i=this.headerCenterElementNames().indexOf(t.existingElementName);if(i>=0&&i<n)n-=1;this.structureService.removeFromPage(t.existingElementName);this.insertHeaderCenterElementName(t.existingElementName,n);this.configVersion.update(s=>s+1);this.eventService.onDrop.fire({payload:r});this.focusHeaderCenterElement(r);return}const a=this.createHeaderCenterElement(t.type,t.sourceModel);if(!a)return;const o=this.structureService.getStructure();if(!o?.elements)return;o.elements[a.name]=a;this.insertHeaderCenterElementName(a.name,n);this.configVersion.update(r=>r+1);this.eventService.onDrop.fire({payload:a});this.focusHeaderCenterElement(a)}removeHeaderCenterElement(e,t){t?.preventDefault();t?.stopPropagation();const n=String(e??"").trim();if(!n)return;if(this.structureService.getElement(n))this.structureService.removeFromElement(n);else this.model().headerCenterElements=this.headerCenterElementNames().filter(a=>a!==n);this.configVersion.update(a=>a+1)}focusHeaderCenterElementByName(e,t){if(!this.isEditor())return;if(t?.target?.closest(".nvb-table-toolbar__drop-remove"))return;t?.preventDefault();t?.stopPropagation();const n=String(e??"").trim();if(!n)return;const a=this.structureService.getElement(n);if(!a)return;this.focusHeaderCenterElement(a)}isHeaderCenterElementFocused(e){const t=String(e??"").trim();if(!t)return false;return this.focusedHeaderCenterElementName()===t}previousPage(){this.setPageIndex(this.pageIndex()-1)}nextPage(){this.setPageIndex(this.pageIndex()+1)}firstPage(){this.setPageIndex(0)}lastPage(){this.setPageIndex(this.totalPages()-1)}goToPage(e){this.setPageIndex(e)}setPageSize(e){const t=this.normalizePageSizeValue(e);if(t===this.pageSize())return;this.pageSizeOverride.set(t);this.pageIndex.set(0);if(this.model().lazyLoad&&this.hasDataSource()){this.loadTableData(true);return}this.applyClientState()}onTableScroll(e){const t=e.target;this.updateStickyHeaderCloneMetrics(void 0,t);if(!this.virtualScrollEnabled())return;this.syncVirtualScrollWindow(t)}toggleActionMenu(e,t,n){n.preventDefault();n.stopPropagation();if(this.isEditor())return;this.openExportMenu.set(false);this.openSelectionActionMenu.set(false);this.headerCenterAddMenuOpen.set(false);if(this.openActionMenuRow()===e){this.openActionMenuRow.set(null);return}const a=this.resolveFloatingMenuPosition(n.currentTarget,160,this.estimateFloatingMenuHeight(t));this.rowActionMenuPosition.set(a.position);this.rowActionMenuStyle.set(a.style);this.openActionMenuRow.set(e)}toggleSelectionActionMenu(e,t){t.preventDefault();t.stopPropagation();if(this.isEditor())return;this.openExportMenu.set(false);this.openActionMenuRow.set(null);this.headerCenterAddMenuOpen.set(false);const n=!this.openSelectionActionMenu();if(n){const a=this.resolveFloatingMenuPosition(t.currentTarget,190,this.estimateFloatingMenuHeight(e));this.selectionActionMenuPosition.set(a.position);this.selectionActionMenuStyle.set(a.style)}this.openSelectionActionMenu.set(n)}toggleExportMenu(e){e.preventDefault();e.stopPropagation();if(this.isEditor())return;if(this.exportBusy())return;this.openExportSelectionDialog()}setExportFormat(e){this.exportFormat.set(e);try{localStorage.setItem(Ae,e)}catch{}}setExportScope(e){this.exportScope.set(e)}onExportFileNameInput(e){this.exportFileNameDraft.set(String(e??""))}async confirmExport(e){e?.preventDefault();e?.stopPropagation();if(this.exportBusy()||this.exportRowCount()===0)return;const t=this.exportUsesColumnPicker()?this.selectedExportColumns():this.exportColumns();if(t.length===0)return;await this.exportRows(this.exportFormat(),t);this.openExportDialog.set(false)}onExportDialogKeydown(e){if(e.key==="Escape"){e.stopPropagation();this.closeExportSelectionDialog();return}const t=e.target;if(e.key==="Enter"&&t?.tagName!=="BUTTON")this.confirmExport(e)}onExportScopeToggle(e){e.stopPropagation();const t=e.target;this.exportScope.set(t?.checked?"all":"current")}async runExport(e,t,n){if(t){t.preventDefault();t.stopPropagation()}this.openExportMenu.set(false);this.openExportDialog.set(false);if(e==="csv"){await this.exportCsv(n);return}if(e==="excel"){await this.exportExcel(n);return}await this.exportPdf(n)}openExportSelectionDialog(){this.openActionMenuRow.set(null);this.openSelectionActionMenu.set(false);this.openExportMenu.set(false);this.headerCenterAddMenuOpen.set(false);const e=this.exportColumns().map(t=>String(t?.key??"").trim());this.exportSelectedColumnKeys.set(e);try{const t=localStorage.getItem(Ae);if(t==="excel"||t==="csv"||t==="pdf")this.exportFormat.set(t)}catch{}this.exportScope.set(this.exportSelectedCount()>0?"selected":"all");this.exportFileNameDraft.set(this.buildExportFileName());this.openExportDialog.set(true)}selectAllExportColumns(e){this.exportSelectedColumnKeys.set(e?this.exportColumns().map(t=>String(t?.key??"").trim()):[])}closeExportSelectionDialog(){this.openExportDialog.set(false)}toggleAllExportColumns(e){const t=e.target;if(!t)return;if(t.checked){const n=this.exportColumns().map(a=>String(a?.key??"").trim());this.exportSelectedColumnKeys.set(n);return}this.exportSelectedColumnKeys.set([])}toggleExportColumnSelection(e,t){const n=String(e??"").trim();if(!n)return;const a=t.target;if(!a)return;const o=new Set(this.exportSelectedColumnKeys());if(a.checked)o.add(n);else o.delete(n);this.exportSelectedColumnKeys.set(Array.from(o))}async runExportFromDialog(e,t){t.preventDefault();t.stopPropagation();if(this.exportBusy())return;const n=this.selectedExportColumns();if(n.length===0)return;await this.runExport(e,void 0,n)}selectionActionsLabel(){const e=String(this.model()?.selectionActionsLabel??"").trim();if(e)return e;return this.model().actionsLabel||"table.actions"}runRowAction(e,t,n){n.preventDefault();n.stopPropagation();const a=this.buildRowActionRuntimeContext(t);this.runTableAction(e,a);this.openActionMenuRow.set(null)}runColumnCellAction(e,t,n,a,o){n.preventDefault();n.stopPropagation();const r=a?this.buildColumnRuntimeContext(t,a,o):this.buildRowActionRuntimeContext(t,o);this.runTableAction(e,r)}onColumnCellActionSelect(e,t,n,a){n.stopPropagation();const o=n.target;const r=String(o?.value??"").trim();if(!r)return;const i=this.visibleColumnCellActions(e,t,a).find((c,v)=>this.resolveColumnCellActionOptionValue(c,v)===r)??null;if(!i){if(o)o.value="";return}const s=this.buildColumnRuntimeContext(e,t,a);this.runTableAction(i,s);if(o)o.value=""}runExpandedRowAction(e,t,n,a){a.preventDefault();a.stopPropagation();const o=this.buildRowActionRuntimeContext(n,t);this.runTableAction(e,o)}onExpandedRowActionSelect(e,t,n){n.stopPropagation();const a=n.target;const o=String(a?.value??"").trim();if(!o)return;const r=this.visibleExpandedRowActions(e,t).find((s,c)=>this.resolveExpandedRowActionOptionValue(s,c)===o)??null;if(!r){if(a)a.value="";return}const i=this.buildRowActionRuntimeContext(t,e);this.runTableAction(r,i);if(a)a.value=""}runSelectionAction(e,t){t.preventDefault();t.stopPropagation();const n=this.buildSelectionActionRuntimeContext();this.runTableAction(e,n);this.openSelectionActionMenu.set(false)}onRowClick(e,t,n){if(this.isEditor())return;if(this.isInlineEditRow(e,t))return;this.clickedRowKey.set(this.resolveRowSelectionKey(e,this.resolveAbsoluteRowIndex(t)));this.syncSelectedRowContext();const a=this.rowDetailsEnabled()&&!this.showExpandChevronColumn()&&Boolean(this.model()?.rowClickOpensDetails)&&Number(n?.detail??1)<=1;const o=Array.isArray(this.model()?.rowClickActions)?this.model().rowClickActions:[];if(o.length>0){const r={...this.buildRowActionRuntimeContext(e),rowIndex:this.resolveAbsoluteRowIndex(t),active:true};for(const i of o){const s=String(i?.trigger??"click").trim().toLowerCase();if(s!=="click"&&s!=="change")continue;this.runTableAction(i,r)}}if(a)this.toggleRowExpand(e,t,n)}onRowDoubleClick(e,t,n){if(this.isEditor())return;if(this.inlineEditEnabled()&&this.inlineEditStartMode()==="doubleClick"&&this.hasInlineEditableColumns()&&!this.isInlineEditRow(e,t)){this.startInlineEdit(e,t,n);return}if(this.model()?.rowClickOpensDetails)return;if(this.showExpandChevronColumn())return;if(!this.rowDetailsEnabled())return;this.toggleRowExpand(e,t,n)}isRowActive(e,t){const n=this.resolveRowSelectionKey(e,this.resolveAbsoluteRowIndex(t));return this.activeRowKey()===n}isInlineEditableColumn(e){if(!e)return false;if(this.isElementColumn(e))return false;return Boolean(e.editable)&&String(e.key??"").trim().length>0}isInlineEditRow(e,t){if(!this.inlineEditEnabled())return false;const n=this.resolveRowSelectionKey(e,this.resolveAbsoluteRowIndex(t));return this.editingRowKey()===n&&!!this.editingRowDraft()}isInlineEditBusy(e,t){return this.isInlineEditRow(e,t)&&this.editingRowSaving()}resolveInlineEditorType(e){const t=String(e?.editorType??"auto").trim().toLowerCase();if(t==="text")return"text";if(t==="number")return"number";if(t==="date")return"date";if(t==="textarea")return"textarea";if(t==="checkbox")return"checkbox";if(t==="toggle")return"toggle";if(t==="select")return"select";const n=this.resolveColumnType(e);if(n==="number")return"number";if(n==="date")return"date";if(n==="boolean"||n==="singleCheckbox")return"checkbox";if(n==="toggleSwitch")return"toggle";return"text"}resolveInlineEditorPlaceholder(e){return String(e?.editorPlaceholder??"")}resolveInlineEditorValue(e){const t=this.editingRowDraft();if(!t)return null;return p(t,String(e?.key??"").trim())}resolveInlineSelectOptions(e){const t=Array.isArray(e?.editorOptions)?e.editorOptions:[];const n=String(e?.editorOptionLabelKey??"label").trim()||"label";const a=String(e?.editorOptionValueKey??"value").trim()||"value";return t.map(o=>({label:String(o?.[n]??o?.["label"]??o?.[a]??""),rawValue:o?.[a]}))}startInlineEdit(e,t,n){n?.preventDefault();n?.stopPropagation();if(!this.inlineEditEnabled()||!this.hasInlineEditableColumns())return;if(this.editingRowSaving())return;const a=this.resolveRowSelectionKey(e,this.resolveAbsoluteRowIndex(t));this.openActionMenuRow.set(null);this.editingOriginalRow.set(e);this.editingRowDraft.set(H(e));this.editingRowKey.set(a)}cancelInlineEdit(e){e?.preventDefault();e?.stopPropagation();if(this.editingRowSaving())return;this.clearInlineEditState()}async saveInlineEdit(e,t,n){n?.preventDefault();n?.stopPropagation();if(!this.isInlineEditRow(e,t)||this.editingRowSaving())return;const a=this.editingRowDraft();const o=this.editingOriginalRow()??e;if(!a)return;const r=H(a);const i=this.buildInlineChangedValues(o,r);const s=this.inlineEditSaveDataSourceName();this.editingRowSaving.set(true);try{if(s)await C(this.dataSourceService.reloadDataSource$(s,this.model(),{...this.buildRowActionRuntimeContext(r),row:r,item:r,originalRow:o,draftRow:r,changedValues:i,rowIndex:this.resolveAbsoluteRowIndex(t),inlineEdit:true,table:{name:String(this.model()?.name??"").trim(),rowIndex:this.resolveAbsoluteRowIndex(t),changedValues:i}}));this.commitInlineEditRow(o,r);this.clearInlineEditState()}catch(c){console.warn("[Table] Failed to save inline edit.",{table:this.model()?.name,dataSourceName:s,error:c})}finally{this.editingRowSaving.set(false)}}updateInlineEditValue(e,t,n){n?.stopPropagation();const a=String(e?.key??"").trim();const o=this.editingRowDraft();if(!a||!o)return;const r=H(o);U(r,a,t);this.editingRowDraft.set(r)}rowActionsUseDropdown(){return this.rowActionsDisplayMode()==="dropdown"}rowActionsUseBorderlessDropdownToggle(){return this.rowActionsDropdownButtonStyle()==="borderless"}rowActionsUseIconButtons(){return this.rowActionsDisplayMode()==="iconButtons"}rowActionsUseButtons(){return this.rowActionsDisplayMode()==="buttons"}actionHidesText(e){return Boolean(e?.hideText)}actionRendersText(e,t){return!this.actionHidesText(e)&&(t||!this.resolveActionIcon(e))}columnCellActionsEnabled(e){return Boolean(e?.cellActionsEnabled)}resolveColumnCellActionsDisplayMode(e){const t=String(e?.cellActionsDisplayMode??"").trim().toLowerCase();if(t==="iconbuttons"||t==="icon-buttons")return"iconButtons";if(t==="buttons")return"buttons";return"dropdown"}columnCellActionsUseDropdown(e){return this.resolveColumnCellActionsDisplayMode(e)==="dropdown"}columnCellActionsUseIconButtons(e){return this.resolveColumnCellActionsDisplayMode(e)==="iconButtons"}columnCellActionsUseButtons(e){return this.resolveColumnCellActionsDisplayMode(e)==="buttons"}resolveColumnCellActionsPlaceholder(e){const t=String(e?.cellActionsPlaceholder??"").trim();if(t)return t;return"Actions"}isInteractiveColumn(e){const t=this.resolveColumnType(e);return t==="toggleSwitch"||t==="singleCheckbox"}isToggleSwitchColumn(e){return this.resolveColumnType(e)==="toggleSwitch"}isSingleCheckboxColumn(e){return this.resolveColumnType(e)==="singleCheckbox"}resolveInteractiveColumnAriaLabel(e){const t=this.resolveColumnLabel(e).trim();if(t)return t;return this.isToggleSwitchColumn(e)?"Toggle switch":"Checkbox"}showColumnHeaderLabel(e){const t=e?.showHeaderLabel;return t===void 0||t===null?true:this.coerceBooleanValue(t)}resolveInteractiveColumnChecked(e,t,n){const a=this.coerceBooleanValue(this.resolveCellValue(e,t));const o=String(t?.controlActiveIf??"").trim();if(!o)return a;return this.evaluateColumnBooleanExpression(e,t,o,n,a)}isInteractiveColumnEnabled(e,t,n){if(this.isEditor())return false;const a=String(t?.controlEnabledIf??"").trim();if(!a)return true;return this.evaluateColumnBooleanExpression(e,t,a,n,true)}onInteractiveColumnChange(e,t,n,a){n.stopPropagation();const o=n.target;if(!o)return;if(!this.isInteractiveColumnEnabled(e,t,a)){o.checked=this.resolveInteractiveColumnChecked(e,t,a);return}const r=Boolean(o.checked);const i=String(t?.key??"").trim();if(i)U(e,i,r);const s=this.visibleColumnCellActions(e,t,a,{checked:r,active:r}).filter(c=>{const v=String(c?.trigger??"click").trim().toLowerCase();return v==="change"||v==="click"});if(s.length===0)return;this.runInteractiveColumnActions(s,e,t,r,a)}visibleColumnCellActions(e,t,n,a){if(!this.columnCellActionsEnabled(t))return[];const o=Array.isArray(t?.cellActions)?t.cellActions:[];if(o.length===0)return[];const r=this.buildColumnRuntimeContext(e,t,n,a);return o.filter(i=>this.isActionVisible(i,e,r))}visibleRowActions(e){const t=Array.isArray(this.model()?.rowActions)?this.model().rowActions:[];if(t.length===0)return[];const n=this.buildRowActionRuntimeContext(e);return t.filter(a=>this.isActionVisible(a,e,n))}visibleExpandedRowActions(e,t){const n=this.expandedRowActions();if(n.length===0)return[];const a=this.buildRowActionRuntimeContext(t,e);return n.filter(o=>this.isActionVisible(o,t,a))}resolveExpandedRowActionsPlaceholder(){return String(this.model()?.actionsLabel??"").trim()||"Actions"}visibleSelectionActions(){const e=this.selectionActions();if(e.length===0||!this.selectionEnabled()||this.selectedRowsCount()<=0)return[];const t=this.buildSelectionActionRuntimeContext();return e.filter(n=>this.isActionConditionVisible(n,t))}visibleHeaderActions(){const e=this.headerActions();if(e.length===0||!this.headerControlsEnabled())return[];const t=this.buildHeaderActionRuntimeContext();return e.filter(n=>this.isActionConditionVisible(n,t))}renderHeaderActionsAtStart(){return this.headerActionsPosition()==="start"}renderHeaderActionsAtCenter(){return this.headerActionsPosition()==="center"}renderHeaderActionsAtEnd(){return this.headerActionsPosition()==="end"}renderHeaderActionsAsDropdown(){return this.headerActionsDisplayMode()==="dropdown"}renderHeaderActionsAsButtons(){return this.headerActionsDisplayMode()!=="dropdown"}headerActionsDropdownPlaceholder(){return String(this.model()?.headerActionsDropdownPlaceholder??"").trim()||this.headerMenuPlaceholder()}onHeaderActionDropdownChange(e){if(this.isEditor()){this.headerActionDropdownValue.set("");return}const t=String(e??"").trim();this.headerActionDropdownValue.set(t);if(!t)return;if(this.headerActionsDropdownTrigger()==="change")this.runHeaderDropdownActionByValue(t)}onHeaderActionDropdownBlur(){if(this.isEditor()){this.headerActionDropdownValue.set("");return}if(this.headerActionsDropdownTrigger()!=="blur")return;const e=String(this.headerActionDropdownValue()??"").trim();if(!e)return;this.runHeaderDropdownActionByValue(e)}headerMenuPlaceholder(){const e=String(this.model()?.headerMenuPlaceholder??"").trim();if(e)return e;return"Select action"}onHeaderMenuChange(e){if(this.isEditor()){this.headerMenuValue.set("");return}const t=String(e??"");this.headerMenuValue.set(t);const n=this.headerMenuOptions().find(a=>a.value===t);if(!n)return;this.runHeaderMenuActions(n)}runHeaderAction(e,t){t.preventDefault();t.stopPropagation();if(this.isEditor())return;const n=this.buildHeaderActionRuntimeContext();this.runTableAction(e,n)}coerceBooleanValue(e){if(typeof e==="boolean")return e;if(typeof e==="number")return e!==0;const t=String(e??"").trim().toLowerCase();if(!t)return false;return["1","true","y","yes","on"].includes(t)}buildColumnRuntimeContext(e,t,n,a){const o=this.buildRowActionRuntimeContext(e,n);const r=this.resolveCellValue(e,t);return{...o,column:t,cellValue:r,columnValue:r,...a??{}}}evaluateColumnBooleanExpression(e,t,n,a,o=false){const r=this.normalizeConditionExpression(n);if(!r)return o;try{const i=this.expressionService.applyContextToExpression(r,this.model()).trim();if(!i)return o;return Boolean(this.expressionService.runPropertyConditionSync(this.buildColumnRuntimeContext(e,t,a),i))}catch{return o}}async runInteractiveColumnActions(e,t,n,a,o){const r=this.buildColumnRuntimeContext(t,n,o,{checked:a,active:a});for(const i of e)await this.runTableAction(i,r)}resolveCellText(e,t){if(this.isInteractiveColumn(t))return this.resolveInteractiveColumnChecked(e,t)?"true":"false";const n=this.resolveCellValue(e,t);if(n===null||n===void 0)return"";if(t.type==="date"||t.type==="dateTime")return this.formatColumnDateValue(n,t);if(t.type==="number")return this.formatColumnNumberValue(n,t);if(t.type==="boolean")return n?"true":"false";return String(n)}formatColumnDateValue(e,t){const n=this.coerceColumnDate(e);if(!n)return String(e??"");const a=String(t?.dateFormatPattern??"").trim();if(a)return this.formatDateWithPattern(n,a);return this.localeFormatService.formatDateTimeValue(n,t.type==="dateTime"?"datetime":"date",Boolean(t?.dateIncludeSeconds),String(t?.formatLocale??"").trim())}formatColumnNumberValue(e,t){const n=typeof e==="number"?e:this.localeFormatService.parseNumber(e,String(t?.formatLocale??"").trim());if(n===null||!Number.isFinite(n))return String(e??"");const a=t?.numberUseGrouping===void 0||t?.numberUseGrouping===null?true:Boolean(t.numberUseGrouping);return this.localeFormatService.formatNumber(n,{locale:this.localeFormatService.resolveLocale(String(t?.formatLocale??"").trim()),useGrouping:a,minimumFractionDigits:this.coerceColumnFractionDigits(t?.numberMinFractionDigits)??void 0,maximumFractionDigits:this.coerceColumnFractionDigits(t?.numberMaxFractionDigits)??void 0})}coerceColumnDate(e){if(e instanceof Date)return Number.isNaN(e.getTime())?null:e;if(typeof e==="number"&&Number.isFinite(e)){const a=new Date(e);return Number.isNaN(a.getTime())?null:a}const t=String(e??"").trim();if(!t)return null;const n=new Date(t);return Number.isNaN(n.getTime())?null:n}coerceColumnFractionDigits(e){const t=Number(e);if(!Number.isFinite(t))return null;return Math.max(0,Math.min(20,Math.floor(t)))}formatDateWithPattern(e,t){const n=(i,s=2)=>String(i).padStart(s,"0");const a=e.getHours();const o=a%12===0?12:a%12;const r={yyyy:String(e.getFullYear()),yy:n(e.getFullYear()%100),MM:n(e.getMonth()+1),dd:n(e.getDate()),HH:n(a),hh:n(o),mm:n(e.getMinutes()),ss:n(e.getSeconds()),SSS:n(e.getMilliseconds(),3),a:a<12?"AM":"PM"};return t.replace(/yyyy|yy|MM|dd|HH|hh|mm|ss|SSS|a/g,i=>r[i]??i)}resolveColumnLabel(e){const t=String(e?.label??"").trim();const n=this.resolveDynamicLabelText(t).trim();if(n)return n;const a=String(e?.key??"").trim();if(a)return a;return t}resolveCellHtml(e,t){const n=this.templateEngineService.resolveTemplateContentByName(this.resolveColumnTemplateName(t),this.resolveColumnTemplateMarkup(t));if(!n)return null;const a=this.resolveCellValue(e,t);try{return this.renderTemplate(n,e,a,{__templateFieldMap:this.resolveTemplateFieldMapFromUnknown(t["templateFieldMap"])})}catch{return null}}resolveRowTemplateHtml(e,t){const n=this.rowTemplateSource();if(!n)return null;try{return this.renderTemplate(n,e,e,{...this.buildRowTemplateRuntimeContext(e,t),__templateFieldMap:this.resolveTemplateFieldMapFromUnknown(this.model()?.["rowTemplateFieldMap"])})}catch{return null}}async onTemplateContentClick(e,t,n,a){const o={...this.dataService.getData()??{},row:t,item:t,value:n,parentRow:a,tableRow:a,...this.buildSelectionRuntimeContext()};await this.templateEngineService.handleTemplateClickEvent(e,o,this.model())}resolveStatusBadge(e,t){if(this.resolveColumnType(t)!=="status")return null;const n=this.resolveCellValue(e,t);const a=Array.isArray(t?.statusRules)?t.statusRules:[];const o={...this.dataService.getData()??{},row:e,item:e,value:n};for(const r of a){if(!this.matchesStatusRule(r,o))continue;return{label:this.resolveStatusLabel(r,e,n),tone:this.normalizeStatusTone(r?.tone),icon:this.resolveStatusIcon(r,t),rounded:this.resolveStatusRounded(r)}}return{label:String(n??""),tone:"neutral",icon:this.resolveStatusIcon(void 0,t),rounded:this.resolveStatusRounded(void 0)}}sortIndicator(e){if(!e?.sortable)return"";if(this.sortField()!==e.key)return"unfold_more";return this.sortDirection()==="asc"?"arrow_upward":"arrow_downward"}isSortedColumn(e){if(!e?.sortable)return false;return String(this.sortField()??"").trim()===String(e?.key??"").trim()}resolveActionLabel(e){const t=String(e?.label??"").trim();if(t)return t;const n=String(e?.type??"").trim().toLowerCase();if(n==="navigate")return"Navigate";if(n==="datasource")return"Run source";if(n==="toast")return"Toast";return"Action"}resolveActionIcon(e){const t=String(e?.icon??"").trim();if(t)return t;return this.resolveSuggestedActionIcon(e)}columnAlignClass(e){const t=String(e?.align??"left").trim().toLowerCase();if(t==="center")return"nvb-align-center";if(t==="right")return"nvb-align-right";return"nvb-align-left"}columnWidthStyle(e){const t=String(e?.width??"").trim();if(!t)return null;if(/^-?\d+(\.\d+)?$/.test(t))return`${t}px`;return t}stickyHeaderCellWidthAt(e){const t=this.stickyHeaderCellWidths()[e];return Number.isFinite(t)&&t>0?t:null}stickyHeaderDataColumnStartIndex(){let e=0;if(this.showExpandChevronColumn())e+=1;if(this.selectionEnabled())e+=1;return e}stickyHeaderActionColumnIndex(){return this.stickyHeaderDataColumnStartIndex()+this.dataColumns().length}resolveColumnDataLabel(e){const t=String(e?.mobileLabel??"").trim();if(t){const n=this.resolveDynamicLabelText(t).trim();if(n)return n}return this.resolveColumnLabel(e)}resolveDetailLabel(e){const t=String(e?.detailLabel??"").trim();if(t){const a=this.resolveDynamicLabelText(t).trim();if(a)return a}const n=String(e?.mobileLabel??"").trim();if(n){const a=this.resolveDynamicLabelText(n).trim();if(a)return a}return this.resolveColumnLabel(e)}toggleRowExpand(e,t,n){n.preventDefault();n.stopPropagation();if(!this.canExpandRow(e,t)&&!this.alwaysShowExpandChevron())return;const a=this.resolveRowExpansionKey(e,t);const o=this.expandedRowKeys().includes(a);if(o){this.expandedRowKeys.set([]);this.activeRowKey.set(null);this.syncActiveRowContext();this.cancelExpandedDataLoad();this.resetExpandedDataState();return}this.expandedRowKeys.set([a]);this.activeRowKey.set(a);this.syncActiveRowContext();if(this.usesExpandedDataSource())this.loadExpandedDataForRow(e,t,true);else this.resetExpandedDataState();if(!o)this.runRowExpandActions(e,t)}closeExpandedRowPanel(e){e?.preventDefault();e?.stopPropagation();this.expandedRowKeys.set([]);this.activeRowKey.set(null);this.cancelExpandedDataLoad();this.resetExpandedDataState();this.syncActiveRowContext()}isRowExpanded(e,t){if(!this.canExpandRow(e,t))return false;const n=this.resolveRowExpansionKey(e,t);return this.expandedRowKeys().includes(n)}resolveExpandedRows(e,t){if(this.usesExpandedDataSource()){const i=this.resolveExpandedDataRowKey(e,t);if(i&&i===this.expandedDataRowsKey())return this.expandedDataRows();return[]}const n=String(this.model()?.expandedItemsPath??"").trim();const a=this.normalizeExpandedItemsPath(n);let o=a?p(e,a):void 0;if(!Array.isArray(o)&&n)o=this.tryEvaluateExpandedItemsExpression(n,e);const r=Array.isArray(o)?o:p(e,"children")??p(e,"items")??p(e,"rows");if(!Array.isArray(r))return[];return this.normalizeRows(r)}tryEvaluateExpandedItemsExpression(e,t){try{const n=this.normalizeConditionExpression(e);const a=this.expressionService.applyContextToExpression(n,this.model()).trim();if(!a)return;const o={...this.dataService.getData()??{},row:t,item:t,value:t};return this.expressionService.runPropertyConditionSync(o,a)}catch{return}}resolveExpandedTemplateHtml(e,t){const n=String(this.model()?.expandedTemplate??"").trim();if(!n)return null;const a=this.resolveExpandedRows(e,t);try{return this.renderTemplate(n,e,a)}catch{return null}}resolveExpandedEmptyMessage(){const e=String(this.model()?.expandedEmptyMessage??"").trim();if(e)return e;return"table.expanded.empty"}resolveDetailsPanelTitle(){const e=String(this.model()?.detailsPanelTitle??"").trim();if(e)return e;return"table.details.panelTitle"}expandedInlineColspan(){return this.dataColumns().length+(this.hasRowActions()?1:0)+(this.selectionEnabled()?1:0)+(this.showExpandChevronColumn()?1:0)}canExpandRow(e,t){if(!this.rowDetailsEnabled())return false;if(this.usesExpandedDataSource())return true;if(String(this.model()?.expandedTemplate??"").trim())return true;if(this.detailColumns().length>0)return true;return this.resolveExpandedRows(e,t).length>0}showExpandToggle(e,t){if(this.alwaysShowExpandChevron())return true;if(!this.canExpandRow(e,t))return false;const n=this.resolveRowExpansionKey(e,t);if(this.expandedRowKeys().includes(n))return true;const a=this.resolveKnownExpandedRowsAvailability(e,t);if(a!==null)return a;return this.usesExpandedDataSource()}resolveKnownExpandedRowsAvailability(e,t){if(!this.usesExpandedDataSource())return this.resolveExpandedRows(e,t).length>0;const n=String(this.model()?.expandedItemsPath??"").trim();const a=this.normalizeExpandedItemsPath(n);if(a){const o=this.readExpandableRowsValue(e,a);if(Array.isArray(o))return o.length>0}for(const o of["children","items","rows"]){const r=this.readExpandableRowsValue(e,o);if(Array.isArray(r))return r.length>0}for(const o of["hasChildren","hasItems","hasRows","hasDetails","hasExpandedRows","expandable","canExpand","canExpandRow"]){const r=this.readExpandableRowsValue(e,o);if(r!==void 0&&r!==null)return this.coerceBooleanValue(r)}for(const o of["childrenCount","childCount","itemsCount","rowsCount","rowCount","detailsCount","expandedCount","expandedItemsCount"]){const r=this.readExpandableRowsValue(e,o);if(r!==void 0&&r!==null&&String(r).trim().length>0)return Number(r)>0}return null}readExpandableRowsValue(e,t){const n=String(t??"").trim();if(!n)return;return p(e,n)}resolveExpandToggleLabel(e,t){if(this.isRowExpanded(e,t))return String(this.model()?.collapseLabel??"").trim()||"Collapse details";return String(this.model()?.expandLabel??"").trim()||"Expand details"}resolveExpandToggleIcon(e,t){return"chevron_right"}isExpandedRowsLoading(e,t){if(!this.usesExpandedDataSource())return false;const n=this.resolveExpandedDataRowKey(e,t);return Boolean(n&&n===this.expandedDataRowsKey()&&this.expandedDataRowsLoading())}resolveExpandedRowsError(e,t){if(!this.usesExpandedDataSource())return null;const n=this.resolveExpandedDataRowKey(e,t);if(!n||n!==this.expandedDataRowsKey())return null;return String(this.expandedDataRowsError()??"").trim()||null}resolveExpandedLoadingMessage(){return"table.expanded.loading"}shouldRenderExpandedNestedTable(e,t){if(this.expandedDataColumns().length===0)return false;if(this.isEditor()&&Number(t??0)<0)return true;return this.resolveExpandedRows(e,t).length>0}findExpandedRowContext(){if(!this.rowDetailsEnabled())return null;const e=this.expandedRowKeys();const t=e.length>0?e[e.length-1]:null;if(!t)return null;const n=this.visibleRows();for(let a=0;a<n.length;a+=1){const o=n[a];if(this.resolveRowExpansionKey(o,a)===t)return{key:t,row:o,rowIndex:a}}return null}setPageIndex(e){if(!this.model().paginator)return;const t=Math.max(0,Math.min(Math.floor(Number(e)||0),Math.max(this.totalPages()-1,0)));if(t===this.pageIndex())return;this.pageIndex.set(t);if(this.model().lazyLoad&&this.hasDataSource()){this.loadTableData(true);return}this.applyClientState()}parsePageSizeOptions(e){const t=String(e??"10,25,50,100").trim().split(/[,\s;|]+/g).map(n=>Number(n)).filter(n=>Number.isFinite(n)&&n>0).map(n=>Math.floor(n));if(t.length===0)return[10,25,50,100];return[...new Set(t)]}normalizePageSizeValue(e){const t=Number(e);if(!Number.isFinite(t)||t<=0)return this.pageSize();return Math.floor(t)}closeActionMenu(){if(this.openActionMenuRow()!==null)this.openActionMenuRow.set(null);if(this.openSelectionActionMenu())this.openSelectionActionMenu.set(false);if(this.openExportMenu())this.openExportMenu.set(false);if(this.openDetailedFilterMultiSelectId()!==null)this.openDetailedFilterMultiSelectId.set(null);if(this.openDetailedFilterDatePickerId()!==null)this.openDetailedFilterDatePickerId.set(null);if(this.headerCenterAddMenuOpen())this.headerCenterAddMenuOpen.set(false)}onWindowScroll(){this.scheduleStickyHeaderSync()}onWindowResize(){this.scheduleStickyHeaderSync()}loadTableData(e=false){if(!this.hasDataSource()){this.loadLocalData();return}const t=String(this.model().tableDataSourceName??"").trim()||this.model().dataSource||"";if(!t){this.loadLocalData();return}const n=this.buildDataSourceRequestPayload();this.updateLazyStateContext(n);const a=this.buildTableRuntimeContext(n);this.setLoadingState(true);this.dataSubscription?.unsubscribe();this.dataSubscription=this.dataSourceService.getData$(t,e,this.model(),a).subscribe({next:o=>this.applyLoadedTableResult(o),error:()=>{if(this.inlineEditCancelOnReload())this.clearInlineEditState();this.rows.set([]);this.visibleRows.set([]);this.totalRecords.set(0);this.setLoadingState(false);this.finalizeInitialLoad()}})}applyLoadedTableResult(e){const t=this.extractItems(e);if(this.inlineEditCancelOnReload())this.clearInlineEditState();this.rows.set(t);this.applyAutoSelectionByCondition(t);if(this.model().lazyLoad){const n=this.extractTotal(e,t.length);this.totalRecords.set(n)}else this.totalRecords.set(t.length);this.applyClientState();this.setLoadingState(false);this.finalizeInitialLoad()}loadLocalData(){const e=this.model().value;const t=Array.isArray(e)?this.normalizeRows(e):[];if(this.inlineEditCancelOnReload())this.clearInlineEditState();this.rows.set(t);this.applyAutoSelectionByCondition(t);this.totalRecords.set(t.length);this.applyClientState();this.setLoadingState(false);this.finalizeInitialLoad()}usesExpandedDataSource(){return this.resolveExpandedDataSourceName().length>0}resolveExpandedDataSourceName(){return String(this.model()?.expandedDataSourceName??"").trim()}reloadExpandedDataForCurrentRow(){if(!this.usesExpandedDataSource())return;const e=this.findExpandedRowContext();if(!e)return;this.loadExpandedDataForRow(e.row,e.rowIndex,true)}loadExpandedDataForRow(e,t,n=false){const a=this.resolveExpandedDataSourceName();if(!a){this.resetExpandedDataState();return}const o=this.resolveRowExpansionKey(e,t);const r={...this.buildRowActionRuntimeContext(e),rowIndex:this.resolveAbsoluteRowIndex(t),expanded:true};this.cancelExpandedDataLoad();this.expandedDataRowsKey.set(o);this.expandedDataRows.set([]);this.expandedDataRowsLoading.set(true);this.expandedDataRowsError.set("");this.expandedDataSubscription=this.dataSourceService.getData$(a,n,this.model(),r).subscribe({next:i=>{this.expandedDataRows.set(this.extractExpandedDataRows(i));this.expandedDataRowsLoading.set(false);this.expandedDataRowsError.set("")},error:i=>{this.expandedDataRows.set([]);this.expandedDataRowsLoading.set(false);this.expandedDataRowsError.set(this.resolveExpandedDataLoadErrorMessage(i))}})}cancelExpandedDataLoad(){this.expandedDataSubscription?.unsubscribe();this.expandedDataSubscription=null}resetExpandedDataState(){this.expandedDataRows.set([]);this.expandedDataRowsKey.set(null);this.expandedDataRowsLoading.set(false);this.expandedDataRowsError.set("")}resolveExpandedDataRowKey(e,t){if(Number.isFinite(t))return this.resolveRowExpansionKey(e,Number(t));const n=this.visibleRows().findIndex(r=>r===e);if(n>=0)return this.resolveRowExpansionKey(e,n);const a=String(this.model()?.selectionKey??"id").trim()||"id";const o=p(e,a);if(o!==null&&o!==void 0&&String(o).trim().length>0)return String(o);return null}normalizeExpandedItemsPath(e){return String(e??"").trim().replace(/^(row|item|parentRow|tableRow)\./,"")}extractExpandedDataRows(e){return this.extractRowsFromResult(e,String(this.model()?.expandedDataSourceItemsPath??"").trim(),["items","data","results","rows","children"])}resolveExpandedDataLoadErrorMessage(e){if(e&&typeof e==="object"){const t=e;const n=t["error"]&&typeof t["error"]==="object"?t["error"]:null;const a=String(n?.["detail"]??t["message"]??"").trim();if(a)return a}return"table.expanded.error"}applyClientState(){const e=this.model().lazyLoad&&this.hasDataSource();const t=e?this.rows():this.applySearchFilters(this.rows());const n=this.sortRows(t);if(e){this.visibleRows.set(n);this.reconcileExpandedRows();this.reconcileSelectionAndSyncContext();this.reconcileActiveRow();this.reconcileInlineEditState();this.syncCellElementModels();return}if(!this.model().paginator){this.visibleRows.set(n);if(!this.model().lazyLoad)this.totalRecords.set(n.length);this.reconcileExpandedRows();this.reconcileSelectionAndSyncContext();this.reconcileActiveRow();this.reconcileInlineEditState();this.syncCellElementModels();return}const a=this.pageSize();const o=Math.max(1,Math.ceil((this.model().lazyLoad?this.totalRecords():n.length)/a));if(this.pageIndex()>o-1)this.pageIndex.set(o-1);const r=this.pageIndex()*a;const i=n.slice(r,r+a);this.visibleRows.set(i);if(!this.model().lazyLoad)this.totalRecords.set(n.length);this.reconcileExpandedRows();this.reconcileSelectionAndSyncContext();this.reconcileActiveRow();this.reconcileInlineEditState();this.syncCellElementModels()}sortRows(e){const t=String(this.sortField()??"").trim();const n=this.sortDirection();if(!t||!n)return[...e];const a=[...e];a.sort((o,r)=>{const i=p(o,t);const s=p(r,t);const c=this.tryNumber(i);const v=this.tryNumber(s);if(c!==null&&v!==null)return c-v;const m=String(i??"").toLowerCase();const g=String(s??"").toLowerCase();if(m<g)return-1;if(m>g)return 1;return 0});if(n==="desc")a.reverse();return a}extractItems(e){return this.extractRowsFromResult(e,String(this.model().tableItemsPath??"").trim())}extractRowsFromResult(e,t="",n=["items","data","results","rows"]){if(Array.isArray(e))return this.normalizeRows(e);if(!e||typeof e!=="object")return[];const a=String(t??"").trim();if(a){const o=p(e,a);return this.normalizeRows(Array.isArray(o)?o:[])}for(const o of n){const r=p(e,o);if(Array.isArray(r))return this.normalizeRows(r)}return[]}extractTotal(e,t){return this.extractExplicitTotal(e)??t}extractExplicitTotal(e){if(!e||typeof e!=="object")return null;const t=String(this.model().tableTotalPath??"").trim();const n=[];if(t)n.push(p(e,t));n.push(p(e,"total"),p(e,"totalCount"),p(e,"totalRecords"),p(e,"count"),p(e,"cnt"),p(e,"paging.total"),p(e,"paging.totalCount"),p(e,"paging.totalRecords"),p(e,"paging.count"),p(e,"paging.cnt"));for(const a of n){const o=Number(a);if(Number.isFinite(o)&&o>=0)return Math.floor(o)}return null}normalizeRows(e){return e.filter(t=>t&&typeof t==="object")}instanceTestId=d(()=>{const e=this.model();return N(e?.dataPath)||N(e?.name)||"table"},...ngDevMode?[{debugName:"instanceTestId"}]:[]);tid(e,...t){const n=t.map(a=>N(a)).filter(a=>a.length>0);return[`nvb-table-${e}`,this.instanceTestId(),...n].join("-")}columnTestToken(e,t){return String(e?.key??"").trim()||`col${t}`}actionTestToken(e,t){return String(e?.actionCode??"").trim()||String(e?.id??"").trim()||this.slugifyTestToken(String(e?.label??""))||`action${t}`}slugifyTestToken(e){return N(e)}rowTrackKey(e,t){const n=String(this.model()?.selectionKey??"id").trim()||"id";const a=p(e,n);if(a!==null&&a!==void 0){const i=String(a).trim();if(i)return`key:${i}`}const o=this.stableRowIds.get(e);if(o)return o;const r=`row:${this.stableRowIdCounter++}:${t}`;this.stableRowIds.set(e,r);return r}isElementColumn(e){return String(e?.type??"").trim()==="element"&&String(e?.elementType??"").trim().length>0}isDisplayOnlyCellElement(e){return vt.has(String(e?.elementType??"").trim().toLowerCase())}onCellElementPointerEvent(e,t){if(this.isDisplayOnlyCellElement(e))return;t.stopPropagation()}getCellElementModel(e,t,n,a,o="cell"){if(!this.isElementColumn(n))return null;return this.cellElementModels.get(this.resolveCellElementKey(o,this.rowTrackKey(e,t),n,a))??null}syncCellElementModels(){this.syncTableRowsContext();const e=this.dataColumns().filter(a=>this.isElementColumn(a));const t=this.detailColumns().filter(a=>this.isElementColumn(a));if(e.length===0&&t.length===0){this.resetCellElementModels();return}const n=new Set;this.visibleRows().forEach((a,o)=>{const r=this.rowTrackKey(a,o);e.forEach((i,s)=>{n.add(this.ensureCellElementModel("cell",r,a,o,i,s))});t.forEach((i,s)=>{n.add(this.ensureCellElementModel("detail",r,a,o,i,s))})});Array.from(this.cellElementModels.keys()).forEach(a=>{if(!n.has(a))this.disposeCellElementModel(a)})}syncTableRowsContext(){const e=`__table.${String(this.model()?.name??"table").trim()||"table"}`;const t=this.visibleRows();this.dataService.setValue(`${e}.rows`,t);this.dataService.setValue(`${e}.allRows`,this.rows());this.dataService.setValue(`${e}.rowCount`,t.length);this.dataService.setValue(`${e}.totalRecords`,this.totalRecords());this.dataService.setValue(`${e}.page`,this.pageIndex()+1);this.dataService.setValue(`${e}.size`,this.pageSize());this.dataService.setValue(`${e}.sortField`,this.sortField()??"");this.dataService.setValue(`${e}.sortDirection`,this.sortDirection()||"asc");this.dataService.setValue(`${e}.quickSearch`,this.quickSearchTerm()??"")}ensureCellElementModel(e,t,n,a,o,r){const i=String(o?.key??"").trim();const s=this.resolveCellElementKey(e,t,o,r);const c=this.cellElementModels.get(s);if(c&&String(c.type??"").trim()===String(o?.elementType??"").trim()&&String(c.dataPath??"")===this.resolveCellElementDataPath(a,i)){this.refreshCellElementModel(c,n,a,o);return s}this.disposeCellElementModel(s);const v=this.createCellElementModel(s,n,a,o);if(v)this.cellElementModels.set(s,v);return s}createCellElementModel(e,t,n,a){const o=String(a?.elementType??"").trim();const r=String(a?.key??"").trim();if(!o||!r)return null;const i=this.resolveCellElementDataPath(n,r);const s=this.resolveCellValue(t,a);const c=this.modelService.createModel(o,{...this.resolveColumnElementConfig(a),type:o,name:r,dataPath:i,schemaPath:`${String(this.model()?.schemaPath??"")}.columnsConfig.${r}`,dependsOn:[],index:n,parentElement:this.model(),value:s,__nvbHideLabel:true,[$e]:this.resolveCellElementRowsPath()});c["__nvbCellSourceValue"]=F(s);this.structureService.flatModelMap[i]=c;be(c,this.buildCellElementRowContext(t,n,a));this.applyCellElementInteractionState(c);this.dataService.setValue(i,s);this.rendererService.applyElementDependencies(c);this.expressionService.evaluateStartingElement(c);this.loadCellElementDataSource(e,c);return c}refreshCellElementModel(e,t,n,a){const o=e;const r=this.resolveCellValue(t,a);if(!ye(o["__nvbCellSourceValue"],r)){o["__nvbCellSourceValue"]=F(r);e.value=r;this.dataService.setValue(String(e.dataPath??""),r)}e.index=n;be(e,this.buildCellElementRowContext(t,n,a));this.applyCellElementInteractionState(e)}buildCellElementRowContext(e,t,n){return{row:e,index:this.resolveAbsoluteRowIndex(t),rowKey:this.rowTrackKey(e,t),column:n,cellValue:this.resolveCellValue(e,n),table:{name:String(this.model()?.name??"").trim(),page:this.pageIndex()+1,pageSize:this.pageSize()}}}applyCellElementInteractionState(e){const t=e;const n=Te(this.model());if(typeof t["__pfBaseReadOnly"]!=="boolean")t["__pfBaseReadOnly"]=Boolean(e.readOnly);if(typeof t["__pfBaseDisabled"]!=="boolean")t["__pfBaseDisabled"]=Boolean(e.disabled);e.readOnly=Boolean(t["__pfBaseReadOnly"])||n.readOnly;e.disabled=Boolean(t["__pfBaseDisabled"])||n.disabled;t["__pfInteractionReadonly"]=Boolean(e.readOnly);t["__pfInteractionDisabled"]=Boolean(e.disabled);t["__pfInteractionLocked"]=Boolean(e.readOnly)||Boolean(e.disabled)}loadCellElementDataSource(e,t){const n=String(t?.dataSource?.name??"").trim();if(!n)return;const a=this.dataSourceService.getSource(n);if(!a)return;t.dataSource.source=a;this.cellElementSubscriptions.get(e)?.unsubscribe();const o=this.dataSourceService.getData$(t.dataSource,false,t,this.buildCellElementDataSourceContext(t)).subscribe({next:r=>{this.notifyCellElementDataSourceChanged(t,a,r)},error:()=>{this.notifyCellElementDataSourceChanged(t,a,[])}});this.cellElementSubscriptions.set(e,o)}notifyCellElementDataSourceChanged(e,t,n){e["onDataSourceChanged"]?.fire?.({dataSource:t,result:n})}buildCellElementDataSourceContext(e){const t=de(e);if(!t)return;return{row:t.row,item:t.row,index:t.index,rowIndex:t.index}}mirrorCellElementValueToRow(e){const t=this.resolveCellElementRowsPath();if(e!==t&&!e.startsWith(`${t}[`))return false;const n=this.structureService.flatModelMap[e];const a=de(n);const o=a?.row;const r=String(a?.column?.["key"]??"").trim();if(!o||!r)return true;const i=this.dataService.getValue(e);if(ye(p(o,r),i))return true;U(o,r,i);if(n)n["__nvbCellSourceValue"]=F(i);this.configVersion.update(s=>s+1);return true}resolveColumnElementConfig(e){const t=e?.element;if(!t||typeof t!=="object"||Array.isArray(t))return{};return F(t)}resolveCellElementKey(e,t,n,a){return`${e}|${t}|${String(n?.id??"").trim()||`${String(n?.key??"").trim()}#${a}`}`}resolveCellElementRowsPath(){return`__table.${String(this.model()?.name??"table").trim()||"table"}.rows`}resolveCellElementDataPath(e,t){return`${this.resolveCellElementRowsPath()}[${e}].${t}`}disposeCellElementModel(e){this.cellElementSubscriptions.get(e)?.unsubscribe();this.cellElementSubscriptions.delete(e);const t=this.cellElementModels.get(e);if(t){const n=String(t.dataPath??"").trim();if(n&&this.structureService.flatModelMap[n]===t)delete this.structureService.flatModelMap[n]}this.cellElementModels.delete(e)}resetCellElementModels(){Array.from(this.cellElementModels.keys()).forEach(e=>{this.disposeCellElementModel(e)})}resolveCellValue(e,t){const n=String(t?.key??"").trim();if(!n)return null;return p(e,n)}renderTemplate(e,t,n,a){const{__templateFieldMap:o,...r}=a??{};const i={...this.dataService.getData()??{},...r,row:t,item:t,value:n};return this.templateEngineService.renderTemplate(e,this.templateEngineService.applyTemplateFieldMap(i,this.resolveTemplateFieldMapFromUnknown(o)))}resolveTemplateFieldMapFromUnknown(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:null}collectConfiguredTemplateSources(){const e=[];const t=n=>{const a=String(n??"").trim();if(!a)return;e.push(a)};t(String(this.model()?.headerTemplate??"").trim());t(this.rowTemplateSource());t(String(this.model()?.expandedTemplate??"").trim());(Array.isArray(this.model()?.columnsConfig)?this.model().columnsConfig:[]).forEach(n=>{t(this.templateEngineService.resolveTemplateContentByName(this.resolveColumnTemplateName(n),this.resolveColumnTemplateMarkup(n)))});return e}resolveColumnTemplateName(e){const t=e;return String(e?.templateName??t["templateRef"]??t["templateNameRef"]??t["template_name"]??"").trim()}resolveColumnTemplateMarkup(e){const t=e;return String(e?.template??t["templateHtml"]??t["templateMarkup"]??"").trim()}tryNumber(e){if(typeof e==="number")return Number.isFinite(e)?e:null;if(typeof e==="string"){const t=e.trim();if(!t)return null;const n=Number(t);return Number.isFinite(n)?n:null}return null}resolveTableSourceName(){const e=String(this.model()?.tableDataSourceName??"").trim();if(e)return e;return String(this.model()?.dataSource?.name??"").trim()}hasDataSource(){return this.resolveTableSourceName().length>0}updateLazyStateContext(e){const t=`__table.${String(this.model()?.name??"table").trim()||"table"}`;const n=e??this.buildDataSourceRequestPayload();this.dataService.setValue(`${t}.page`,this.pageIndex()+1);this.dataService.setValue(`${t}.size`,this.pageSize());this.dataService.setValue(`${t}.sortField`,this.sortField());this.dataService.setValue(`${t}.sortDirection`,this.sortDirection()||"asc");this.dataService.setValue(`${t}.quickSearch`,this.quickSearchTerm());this.dataService.setValue(`${t}.detailedFilters`,this.detailedFilters());this.dataService.setValue(`${t}.request`,n);this.dataService.setValue("__table.request",n)}shouldRefreshDataSource(e){if(!this.hasDataSource())return false;const t=!this.model().lazyLoad?this.model().dataSource:null;if(!(t?t.refreshOnChange!==false:this.model().refreshOnChange!==false))return false;if(this.isInternalTablePath(e))return false;const n=this.resolveRefreshPaths();if(n.length===0)return false;return n.some(a=>this.isPathMatch(a,e))}resolveRefreshPaths(){const e=!this.model().lazyLoad?this.model().dataSource:null;const t=e?e.refreshPaths:this.model()?.refreshPaths;return(Array.isArray(t)?t:String(t??"").split(/[\r\n,]+/g).map(n=>n.trim())).map(n=>String(n??"").trim().replace(/^\{/,"").replace(/\}$/,"")).filter((n,a,o)=>Boolean(n)&&o.indexOf(n)===a)}isPathMatch(e,t){const n=String(e??"").trim();const a=String(t??"").trim();if(!n||!a)return false;return a===n||a.startsWith(`${n}.`)||a.startsWith(`${n}[`)||n.startsWith(`${a}.`)||n.startsWith(`${a}[`)}isInternalTablePath(e){const t=String(e??"").trim();const n=String(this.model()?.name??"").trim();if(!t)return false;if(["request","selectedItems","selectedKeys","selectedRows","selectedCount","selectedRow","selectedRowKey","selectedRowIndex","activeRowKey","activeRow"].some(a=>t===`__table.${a}`||t.startsWith(`__table.${a}.`)))return true;if(!n)return false;return t===`__table.${n}`||t.startsWith(`__table.${n}.`)}scheduleSearchReload(e=false){if(!(this.model().lazyLoad&&this.hasDataSource())){this.applyClientState();return}if(this.quickSearchDebounceHandle){clearTimeout(this.quickSearchDebounceHandle);this.quickSearchDebounceHandle=null}if(e){this.loadTableData(true);return}const t=Number(this.model()?.searchDebounceMs??260);const n=Number.isFinite(t)&&t>=0?t:260;this.quickSearchDebounceHandle=setTimeout(()=>{this.quickSearchDebounceHandle=null;this.loadTableData(true)},n)}setLoadingState(e){if(this.initialLoadCompleted()){this.loading.set(false);if(this.showLoadingOverlay())this.showLoadingOverlay.set(false);this.clearLoadingTimers();return}this.loading.set(Boolean(e));if(e)this.scheduleInitialSkeletonShow();else{if(this.showLoadingOverlay())this.showLoadingOverlay.set(false);this.scheduleInitialSkeletonHide()}}scheduleInitialSkeletonShow(){if(this.skeletonVisible()||this.loadingShowDelayHandle)return;this.loadingShowDelayHandle=setTimeout(()=>{this.loadingShowDelayHandle=null;if(this.loading()&&!this.initialLoadCompleted()){this.skeletonVisible.set(true);this.skeletonShownAt=Date.now()}},this.initialSkeletonShowDelayMs)}scheduleInitialSkeletonHide(){if(this.loadingShowDelayHandle){clearTimeout(this.loadingShowDelayHandle);this.loadingShowDelayHandle=null}if(this.loadingHideHandle){clearTimeout(this.loadingHideHandle);this.loadingHideHandle=null}if(!this.skeletonVisible())return;const e=this.initialSkeletonMinVisibleMs-(Date.now()-this.skeletonShownAt);if(e<=0){this.skeletonVisible.set(false);return}this.loadingHideHandle=setTimeout(()=>{this.loadingHideHandle=null;this.skeletonVisible.set(false)},e)}finalizeInitialLoad(){if(this.initialLoadCompleted())return;this.initialLoadCompleted.set(true);this.loading.set(false);if(this.showLoadingOverlay())this.showLoadingOverlay.set(false)}initialSkeletonCellWidth(e,t){const n=((Number.isFinite(e)?Math.max(0,Math.floor(e)):0)+(Number.isFinite(t)?Math.max(0,Math.floor(t)):0))%this.initialSkeletonWidthPattern.length;return`${this.initialSkeletonWidthPattern[n]}%`}resolveInitialSkeletonRowCount(){const e=Number(this.model()?.pageSize??10);return Math.max(1,Math.min(Number.isFinite(e)&&e>0?Math.floor(e):10,40))}clearLoadingTimers(){if(this.loadingShowDelayHandle){clearTimeout(this.loadingShowDelayHandle);this.loadingShowDelayHandle=null}if(this.loadingHideHandle){clearTimeout(this.loadingHideHandle);this.loadingHideHandle=null}}updateDetailedFilter(e,t){const n=this.detailedFilters().map(a=>{if(a.id!==e)return a;const o=t(a);return{...a,...o}});this.detailedFilters.set(n)}resolveColumnType(e){const t=String(e?.type??"text").trim().toLowerCase().replace(/[-_\s]+/g,"");if(t==="number")return"number";if(t==="date")return"date";if(t==="boolean")return"boolean";if(t==="status")return"status";if(t==="html")return"html";if(t==="toggleswitch"||t==="togglebutton")return"toggleSwitch";if(t==="singlecheckbox")return"singleCheckbox";return"text"}resolveFilterTypeGroup(e){if(e==="number")return"number";if(e==="date")return"date";if(e==="boolean"||e==="toggleSwitch"||e==="singleCheckbox")return"boolean";return"text"}resolveDetailedFilterControlType(e){const t=this.resolveFilterTypeGroup(e?.type??"text");const n=t==="number"?"number":t==="date"?"date":t==="boolean"?"boolean":"text";return this.normalizeFilterControlType(e?.controlType,n)}resolveColumnFilterControlType(e,t){const n=this.resolveFilterTypeGroup(t);const a=n==="number"?"number":n==="date"?"date":n==="boolean"?"boolean":"text";return this.normalizeFilterControlType(e?.filterControlType,a)}normalizeFilterControlType(e,t){const n=String(e??"").trim().toLowerCase();if(n==="auto")return t;if(n==="text")return"text";if(n==="number")return"number";if(n==="date")return"date";if(n==="datetime"||n==="date-time")return"dateTime";if(n==="boolean")return"boolean";if(n==="select")return"select";if(n==="multiselect"||n==="multi-select")return"multiSelect";if(n==="checkbox")return"checkbox";if(n==="toggle"||n==="togglebutton"||n==="toggle-button")return"toggle";return t}resolveColumnFilterOptions(e){if(!e)return[];const t=this.resolveFilterOptionsSourceType(e);const n=Array.isArray(e.filterOptions)?e.filterOptions:[];const a=this.resolveFilterOptionsFromPath(String(e.filterOptionsPath??"").trim());const o=this.parseStaticFilterOptions(String(e.filterOptionsJson??""));const r=t==="datasource"?n.length>0?n:[]:n.length>0?n:a.length>0?a:o;const i=String(e?.filterOptionLabelKey??"label").trim()||"label";const s=String(e?.filterOptionValueKey??"value").trim()||"value";return this.normalizeDetailedFilterOptions(r,i,s)}refreshDetailedFilterDataSourceOptions(e=false){this.detailedFilters().forEach(t=>{const n=t?.column??this.dataColumns().find(a=>String(a?.key??"").trim()===String(t?.key??"").trim());if(this.resolveFilterOptionsSourceType(n)!=="datasource")return;this.loadFilterOptionsFromDataSourceForFilter(t.id,n,e)})}async loadFilterOptionsFromDataSourceForFilter(e,t,n=false){const a=t??this.dataColumns().find(m=>String(m?.key??"").trim()===String(this.detailedFilters().find(g=>g.id===e)?.key??"").trim());const o=this.resolveFilterOptionsSourceType(a);const r=String(a?.filterOptionsDataSourceName??"").trim();if(!a||o!=="datasource"||!r)return;const i=String(a?.filterOptionsDataSourceItemsPath??"").trim();const s=String(a?.filterOptionLabelKey??"label").trim()||"label";const c=String(a?.filterOptionValueKey??"value").trim()||"value";const v=String(a?.key??"").trim();if(!v)return;try{const m=this.buildHeaderActionRuntimeContext();const g=await C(this.dataSourceService.getData$(r,n,this.model(),m));const f=this.resolveDetailedFilterOptionsDataSourceItems(g,i);const x=this.normalizeDetailedFilterOptions(f,s,c);const w=this.resolveColumnFilterOptions(a);const E=x.length>0?x:w;this.updateDetailedFilter(e,k=>{if(String(k?.key??"").trim()!==v)return{};return{options:E,column:a}})}catch{this.updateDetailedFilter(e,m=>{if(String(m?.key??"").trim()!==v)return{};return{options:this.resolveColumnFilterOptions(a),column:a}})}}resolveDetailedFilterOptionsDataSourceItems(e,t){const n=String(t??"").trim();if(n){const o=p(e,n);if(Array.isArray(o))return o}if(Array.isArray(e))return e;if(!e||typeof e!=="object")return[];const a=e;for(const o of["items","data.items","data.rows","data.records","data.results","records","rows","results","result","data"]){const r=this.readDetailedFilterResultPath(a,o);if(Array.isArray(r))return r}return[]}readDetailedFilterResultPath(e,t){const n=String(t??"").trim().split(".").filter(o=>o.length>0);if(n.length===0)return;let a=e;for(const o of n){if(!a||typeof a!=="object"||Array.isArray(a))return;a=a[o]}return a}resolveFilterOptionsSourceType(e){if(!e)return"static";const t=String(e.filterOptionsSourceType??"").trim().toLowerCase();if(t==="datasource")return"datasource";if(t==="static")return"static";return String(e.filterOptionsDataSourceName??"").trim()?"datasource":"static"}resolveFilterOptionsFromPath(e){const t=String(e??"").trim();if(!t)return[];const n=this.dataService.buildRuntimeContext();const a=p(n,t);if(Array.isArray(a))return a;try{const o=this.expressionService.applyContextToExpression(this.normalizeConditionExpression(t),this.model()).trim();if(!o)return[];const r=this.expressionService.runPropertyConditionSync(n,o);return Array.isArray(r)?r:[]}catch{return[]}}parseStaticFilterOptions(e){const t=String(e??"").trim();if(!t)return[];try{const n=JSON.parse(t);return Array.isArray(n)?n:[]}catch{return[]}}normalizeDetailedFilterOptions(e,t,n){const a=new Map;e.forEach((o,r)=>{if(o===null||o===void 0)return;if(typeof o==="object"&&!Array.isArray(o)){const s=o;const c=String(p(s,n)??p(s,t)??"").trim();const v=String(p(s,t)??p(s,n)??"").trim();if(!c||!v)return;a.set(c,{label:v,value:c});return}const i=String(o).trim();if(!i)return;a.set(i,{label:i,value:i||String(r)})});return Array.from(a.values())}resolveFilterMultiDelimiter(e){return String(e?.filterMultiValueDelimiter??"|").trim()||"|"}resolveFilterToggleValue(e,t){const n=t?e?.filterToggleTrueValue:e?.filterToggleFalseValue;const a=String(n??(t?"true":"false")).trim();if(a.length>0)return a;return t?"true":"false"}parseFilterTypedValue(e){const t=String(e??"").trim();if(!t)return"";if(t==="true"||t==="false"||t==="null"||/^-?\d+(\.\d+)?$/.test(t)||t.startsWith('"')||t.startsWith("[")||t.startsWith("{"))try{return JSON.parse(t)}catch{}return t}resolveSelectedFilterOptionValues(e){const t=this.filterValueAsString(e?.value);const n=this.resolveFilterMultiDelimiter(e?.column);return t.split(n).map(a=>a.trim()).filter(a=>a.length>0)}defaultOperatorForType(e){return this.operatorsForType(e)[0]?.value??"%-%"}operatorsForType(e){return L[this.resolveFilterTypeGroup(e)]}defaultFilterValue(e,t,n){if(t==="toggle")return this.resolveFilterToggleValue(n,true);if(t==="boolean"||t==="checkbox")return"true";return""}normalizeOperator(e){const t=String(e??"").trim();if(["%-%","!%-%","%-","-%","=","!=",">",">=","<","<="].includes(t))return t;return"%-%"}normalizeFilterValue(e,t,n,a){if(n==="toggle"){if(typeof t==="boolean")return this.resolveFilterToggleValue(a,t);const o=String(t??"").trim();if(!o)return"";if(o.toLowerCase()==="true")return this.resolveFilterToggleValue(a,true);if(o.toLowerCase()==="false")return this.resolveFilterToggleValue(a,false);return o}if(n==="boolean"||n==="checkbox")return String(t??"").trim().toLowerCase()==="false"?"false":"true";if(n==="multiSelect"&&Array.isArray(t))return t.map(o=>String(o??"").trim()).filter(o=>o.length>0).join(this.resolveFilterMultiDelimiter(a));if(t===null||t===void 0)return"";return String(t)}isDetailedFilterActive(e){if(!String(e?.key??"").trim())return false;const t=this.resolveDetailedFilterControlType(e);const n=String(e?.value??"").trim();if(t==="boolean"||t==="checkbox")return n==="true"||n==="false";if(t==="toggle")return n===this.resolveFilterToggleValue(e?.column,true)||n===this.resolveFilterToggleValue(e?.column,false);if(t==="select")return n.length>0;if(t==="multiSelect"){const a=this.resolveFilterMultiDelimiter(e?.column);return n.split(a).map(o=>o.trim()).filter(o=>o.length>0).length>0}return n.length>0}applySearchFilters(e){let t=[...e];const n=String(this.quickSearchTerm()??"").trim();if(n){const o=n.toLowerCase();t=t.filter(r=>this.dataColumns().some(i=>{const s=this.resolveCellValue(r,i);if(s===null||s===void 0)return false;return String(s).toLowerCase().includes(o)}))}const a=this.detailedFilters().filter(o=>this.isDetailedFilterActive(o));if(a.length===0)return t;return t.filter(o=>a.every(r=>this.matchesDetailedFilter(o,r)))}matchesDetailedFilter(e,t){const n=p(e,String(t.key??"").trim());const a=this.normalizeOperator(t.operator);const o=String(t.value??"").trim();const r=this.resolveDetailedFilterControlType(t);const i=r==="number"?"number":r==="date"||r==="dateTime"?"date":r==="boolean"||r==="checkbox"||r==="toggle"?"boolean":this.resolveFilterTypeGroup(t.type);if(r==="multiSelect"){const v=this.resolveFilterMultiDelimiter(t?.column);const m=o.split(v).map(x=>x.trim().toLowerCase()).filter(x=>x.length>0);if(m.length===0)return true;const g=String(n??"").trim().toLowerCase();const f=m.includes(g);if(a==="!=")return!f;return f}if(r==="select"){const v=String(n??"").trim().toLowerCase();const m=o.toLowerCase();if(a==="!=")return v!==m;return v===m}if(r==="toggle"){const v=String(n??"").trim().toLowerCase();const m=o.toLowerCase();if(a==="!=")return v!==m;return v===m}if(i==="boolean"){const v=o!=="false";const m=Boolean(n);if(a==="!=")return m!==v;return m===v}if(i==="number"){const v=this.tryNumber(n);const m=this.tryNumber(o);if(v===null||m===null)return false;return this.comparePrimitive(v,m,a)}if(i==="date"){const v=this.tryDateValue(n);const m=this.tryDateValue(o);if(v===null||m===null)return false;return this.comparePrimitive(v,m,a)}const s=String(n??"").toLowerCase();const c=o.toLowerCase();switch(a){case"%-%":return s.includes(c);case"!%-%":return!s.includes(c);case"%-":return s.startsWith(c);case"-%":return s.endsWith(c);case"!=":return s!==c;default:return s===c}}comparePrimitive(e,t,n){switch(n){case"!=":return e!==t;case">":return e>t;case">=":return e>=t;case"<":return e<t;case"<=":return e<=t;default:return e===t}}tryDateValue(e){const t=String(e??"").trim();if(!t)return null;const n=new Date(t).getTime();if(Number.isNaN(n))return null;return n}parseDetailedFilterDate(e){const t=String(e??"").trim();if(!t)return null;const n=new Date(t);if(Number.isNaN(n.getTime()))return null;return this.normalizeDateOnly(n)}normalizeDateOnly(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}areSameDate(e,t){if(!e||!t)return false;return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}toIsoDate(e){return`${String(e.getFullYear())}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}buildQuickSearchExtendedParam(){const e=String(this.quickSearchTerm()??"").trim();if(!e)return null;return{paramName:String(this.model()?.quickSearchParamName??"quickSearch").trim()||"quickSearch",paramValue:{condition:String(this.model()?.quickSearchCondition??"%-%").trim()||"%-%",value:e,upperLower:String(this.model()?.quickSearchCaseMode??"caseInsensitiveLatin").trim()||void 0}}}buildDetailedSearchExtendedParams(){const e=String(this.model()?.detailedSearchCaseMode??"caseInsensitiveLatin").trim();return this.detailedFilters().filter(t=>this.isDetailedFilterActive(t)).map(t=>{const n=String(t.key??"").trim();if(!n)return null;const a=this.resolveDetailedFilterControlType(t);const o=a==="boolean"||a==="checkbox";const r=a==="text"||a==="select"||a==="multiSelect"||a==="auto"&&this.resolveFilterTypeGroup(t.type)==="text";const i=o?String(t.value??"").trim()!=="false":a==="toggle"?this.parseFilterTypedValue(String(t.value??"").trim()):a==="number"?this.tryNumber(t.value):a==="multiSelect"?String(t.value??"").split(this.resolveFilterMultiDelimiter(t?.column)).map(s=>s.trim()).filter(s=>s.length>0):String(t.value??"").trim();return{paramName:n,paramValue:{condition:this.normalizeOperator(t.operator),value:i,upperLower:r?e||void 0:void 0}}}).filter(t=>t!==null)}buildExtendedParams(){const e=[];const t=this.buildQuickSearchExtendedParam();if(t)e.push(t);e.push(...this.buildDetailedSearchExtendedParams());return e}buildOrderClause(){const e=String(this.sortField()??"").trim();const t=this.sortDirection();if(!e||!t){const n=String(this.model()?.orderClause??"").trim();if(n){const r=String(this.model()?.orderDirection??"asc").trim().toLowerCase()==="desc"?"DESC":"ASC";return this.withResolvedOrderDirection(n,r)}const a=this.resolveDefaultOrderColumnKey();const o=String(this.model()?.orderDirection??"asc").trim().toLowerCase()==="desc"?"DESC":"ASC";return a?`${a} ${o}`:""}return`${e} ${t==="desc"?"DESC":"ASC"}`}withResolvedOrderDirection(e,t){const n=String(e??"").trim().replace(/\s+(ASC|DESC)\s*$/i,"");if(!n)return"";return`${n} ${t}`}resolveDefaultOrderColumnKey(){const e=(Array.isArray(this.model()?.columnsConfig)?this.model().columnsConfig:[]).find(t=>String(t?.key??"").trim().length>0);return String(e?.key??"").trim()}buildDataSourceRequestPayload(e){const t=!this.model().lazyLoad;const n=e?.exportAll||t?this.resolveExportAllPageSize():this.pageSize();const a=e?.exportAll||!this.model().paginator||t?0:this.pageIndex()*this.pageSize();return{pagingParams:{cnt:null,orderClause:this.buildOrderClause(),pageSize:n,skipRows:a,totalCountUsed:false},params:this.buildRequestParams(),extendedParams:this.buildExtendedParams()}}buildRequestParams(){return(Array.isArray(this.model()?.params)?this.model().params:[]).map(e=>this.buildRequestParamTuple(e)).filter(e=>e!==null)}buildRequestParamTuple(e){const t=String(e?.paramName??"").trim();if(!t)return null;return[t,this.resolveRequestParamValue(e?.paramValue)]}resolveRequestParamValue(e){if(e===null||e===void 0)return null;if(typeof e!=="string")return e;const t=String(e??"").trim();if(!t)return null;const n=t.match(/^\{\{([\s\S]+)\}\}$/);if(n)return this.evaluateRequestParamExpression(String(n[1]??""));const a=t.match(/^\{([^}]+)\}$/);if(a)return this.evaluateRequestParamExpression(`{${String(a[1]??"").trim()}}`);return t.replace(/\{\{([\s\S]+?)\}\}/g,(o,r)=>this.stringifyRequestParamValue(this.evaluateRequestParamExpression(r))).replace(/\{([^}]+)\}/g,(o,r)=>this.stringifyRequestParamValue(this.evaluateRequestParamExpression(`{${r}}`)))}evaluateRequestParamExpression(e){const t=this.expressionService.evaluateInlineExpression(e,this.model());return t===void 0?null:t}stringifyRequestParamValue(e){if(e===null||e===void 0)return"";if(typeof e==="object")try{return JSON.stringify(e)}catch{return""}return String(e)}resolveExportAllPageSize(){const e=Number(this.model()?.exportAllPageSize??1e4);const t=Number.isFinite(e)&&e>0?Math.floor(e):1e4;const n=this.totalRecords();if(Number.isFinite(n)&&n>0)return Math.max(Math.floor(n),this.pageSize(),1);return Math.max(t,this.rows().length||1)}buildTableRuntimeContext(e){const t=String(this.model()?.name??"table").trim()||"table";const n=this.dataService.getData()??{};const a=p(n,"__table")??{};const o=p(a,t)??{};return{...n,__table:{...a,[t]:{...o,request:e},request:e}}}async exportRows(e,t){if(this.exportBusy())return;this.exportBusy.set(true);try{const n=Array.isArray(t)&&t.length>0?t:this.exportColumns();const a=await this.resolveRowsForExport(this.exportScope());if(a.length===0)return;if(e==="csv"){const o=this.buildCsv(a,n);this.downloadBlob(o,"text/csv;charset=utf-8","csv");return}if(e==="excel"){const o=Ze({name:this.resolveExportTitle(),headers:n.map(r=>this.resolveColumnLabel(r)),rows:a.map(r=>n.map(i=>this.resolveExportCellValue(r,i)))});this.downloadBlob(o,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","xlsx");return}this.openPrintViewForPdf(a,n)}finally{this.exportBusy.set(false)}}async resolveRowsForExport(e){if(e==="selected")return this.resolveSelectionState().selectedRows;if(e==="current")return[...this.visibleRows()];if(!(this.model().lazyLoad&&this.hasDataSource()))return this.sortRows(this.applySearchFilters(this.rows()));const t=this.resolveTableSourceName();if(!t)return this.sortRows(this.applySearchFilters(this.rows()));const n=this.buildDataSourceRequestPayload({exportAll:true});const a=this.buildTableRuntimeContext(n);try{const o=await C(this.dataSourceService.getData$(t,true,this.model(),a));return this.extractItems(o)}catch{return[]}}buildCsv(e,t){const n=";";const a=[t.map(o=>this.escapeCsvValue(this.resolveColumnLabel(o),n)).join(n)];e.forEach(o=>{const r=t.map(i=>this.escapeCsvValue(this.resolveExportCellText(o,i),n));a.push(r.join(n))});return`\uFEFF${a.join("\n")}`}resolveExportTitle(){return String(this.model()?.label??"").trim()||String(this.model()?.name??"").trim()||"Table"}openPrintViewForPdf(e,t){if(typeof window==="undefined")return;const n=window.open("","_blank");if(!n)return;const a=n.document;const o=this.resolveExportTitle();const r=this.resolveExportFileBaseName();const i=a.head??a.createElement("head");if(!a.head)a.documentElement.appendChild(i);const s=a.body??a.createElement("body");if(!a.body)a.documentElement.appendChild(s);i.replaceChildren();s.replaceChildren();const c=a.createElement("meta");c.setAttribute("charset","UTF-8");i.appendChild(c);const v=a.createElement("title");v.textContent=r;i.appendChild(v);const m=t.length>6;const g=a.createElement("style");g.textContent=[`@page { size: A4 ${m?"landscape":"portrait"}; margin: 14mm 12mm; }`,"* { box-sizing: border-box; }",'body { margin: 0; color: #1f2937; font: 11px/1.45 "Segoe UI", system-ui, -apple-system, Roboto, Arial, sans-serif; -webkit-print-color-adjust: exact; print-color-adjust: exact; }',"header { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; margin: 0 0 12px; padding-bottom: 10px; border-bottom: 2px solid #111827; }","h1 { margin: 0; font-size: 18px; font-weight: 600; color: #111827; }",".meta { color: #6b7280; font-size: 11px; white-space: nowrap; }","table { width: 100%; border-collapse: collapse; }","thead { display: table-header-group; }","tr { page-break-inside: avoid; break-inside: avoid; }","th { padding: 7px 8px; border-bottom: 1px solid #9ca3af; color: #374151; font-size: 10px; font-weight: 600; letter-spacing: .02em; text-transform: uppercase; text-align: left; }","td { padding: 6px 8px; border-bottom: 1px solid #e5e7eb; vertical-align: top; }","tbody tr:nth-child(even) td { background: #f9fafb; }",".num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }","@media screen { body { max-width: 1100px; margin: 32px auto; padding: 0 24px; } }"].join("\n");i.appendChild(g);const f=a.createElement("header");const x=a.createElement("h1");x.textContent=o;const w=a.createElement("span");w.className="meta";w.textContent=`${e.length} ${e.length===1?"row":"rows"} · ${new Date().toLocaleString()}`;f.append(x,w);s.appendChild(f);const E=a.createElement("table");const k=a.createElement("thead");const y=a.createElement("tr");const _=t.map(I=>I.type==="number");t.forEach((I,M)=>{const R=a.createElement("th");R.textContent=this.resolveColumnLabel(I);if(_[M])R.className="num";y.appendChild(R)});k.appendChild(y);const le=a.createElement("tbody");e.forEach(I=>{const M=a.createElement("tr");t.forEach((R,Re)=>{const O=a.createElement("td");O.textContent=this.resolveExportDisplayText(I,R);if(_[Re])O.className="num";M.appendChild(O)});le.appendChild(M)});E.append(k,le);s.appendChild(E);n.focus();n.setTimeout(()=>n.print(),50)}resolveExportCellValue(e,t){if(this.isInteractiveColumn(t))return this.resolveInteractiveColumnChecked(e,t);const n=this.resolveCellValue(e,t);if(n===null||n===void 0||n==="")return null;if(typeof n==="number"||typeof n==="boolean")return n;if(t.type==="number"){const a=Number(String(n).replace(",","."));return Number.isFinite(a)?a:String(n)}if(t.type==="date"){const a=/^(\d{4})-(\d{2})-(\d{2})$/.exec(String(n).trim());const o=n instanceof Date?n:a?new Date(Number(a[1]),Number(a[2])-1,Number(a[3])):new Date(n);return Number.isNaN(o.getTime())?String(n):o}return this.resolveExportCellText(e,t)}resolveExportDisplayText(e,t){const n=this.resolveExportCellValue(e,t);if(n===null||n===void 0)return"";if(typeof n==="number")return n.toLocaleString();if(typeof n==="boolean")return n?"✓":"";if(n instanceof Date)return n.toLocaleDateString();return String(n)}downloadBlob(e,t,n){if(typeof document==="undefined"||typeof URL==="undefined")return;const a=new Blob([e],{type:t});const o=URL.createObjectURL(a);const r=document.createElement("a");r.href=o;r.download=`${this.resolveExportFileBaseName()}.${n}`;r.style.display="none";document.body.appendChild(r);r.click();r.remove();URL.revokeObjectURL(o)}buildExportFileName(){const e=String(this.model()?.exportFileName??"").trim();if(e)return e;const t=this.resolveExportTitle().normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"table";const n=new Date;return`${t}-${`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`}`}resolveExportFileBaseName(){return String(this.exportFileNameDraft()??"").trim().replace(/\.(xlsx|xls|csv|pdf)$/i,"").replace(/[\\/:*?"<>|]+/g,"-")||this.buildExportFileName()}estimateFloatingMenuHeight(e){const t=Math.max(1,Math.floor(Number(e)||1));return Math.min(300,t*38+12)}resolveFloatingMenuPosition(e,t,n){if(typeof window==="undefined"||!e||typeof e.getBoundingClientRect!=="function")return{position:"bottom",style:{minWidth:`${t}px`}};const a=e.getBoundingClientRect();const o=8;const r=6;const i=window.innerHeight-a.bottom-o;const s=a.top-o;const c=i<Math.min(n,220)&&s>i;const v=Math.max(o,Math.min(Math.round(a.right-t),window.innerWidth-t-o));return{position:c?"top":"bottom",style:{position:"fixed",left:`${v}px`,top:`${Math.round(c?a.top-r:a.bottom+r)}px`,minWidth:`${t}px`,zIndex:"1400"}}}resolveExportCellText(e,t){if(this.isInteractiveColumn(t))return this.resolveInteractiveColumnChecked(e,t)?"true":"false";const n=this.resolveCellValue(e,t);if(n===null||n===void 0)return"";if(t.type==="date"){const a=new Date(n);if(!Number.isNaN(a.getTime()))return a.toLocaleDateString()}if(typeof n==="object")try{return JSON.stringify(n)}catch{return""}return String(n)}escapeCsvValue(e,t){let n=String(e??"");if(/^[=+\-@\t\r]/.test(n)&&!/^[+-]?\d[\d\s.,]*%?$/.test(n))n=`'${n}`;const a=n.replaceAll('"','""');if(a.includes(t)||a.includes('"')||a.includes("\n")||a.includes("\r"))return`"${a}"`;return a}toggleSelectAllVisible(e){e.stopPropagation();if(!this.selectionEnabled())return;const t=new Set(this.selectedRowKeys());const n=this.visibleRows();const a=!this.allVisibleSelected();n.forEach((o,r)=>{const i=this.resolveAbsoluteRowIndex(r);const s=this.resolveRowSelectionKey(o,i);if(a)t.add(s);else t.delete(s)});this.selectedRowKeys.set(Array.from(t));this.syncSelectionContext()}toggleRowSelection(e,t,n){n.stopPropagation();if(!this.selectionEnabled())return;const a=new Set(this.selectedRowKeys());const o=this.resolveAbsoluteRowIndex(t);const r=this.resolveRowSelectionKey(e,o);if(a.has(r))a.delete(r);else a.add(r);this.selectedRowKeys.set(Array.from(a));this.syncSelectionContext()}isRowSelected(e,t){if(!this.selectionEnabled())return false;const n=this.resolveAbsoluteRowIndex(t);const a=this.resolveRowSelectionKey(e,n);return this.selectedRowKeys().includes(a)}ensureFocusedColumnExists(){const e=this.focusedColumn();if(!e)return;if(!(e.__columnCollection==="expandedColumnsConfig"?this.expandedDataColumns():this.dataColumns()).some((t,n)=>{return this.resolveColumnIdentity(t,n,e.__columnCollection??"columnsConfig")===e.__columnId}))this.focusedColumn.set(null)}focusColumn(e,t,n="columnsConfig"){const a={...e,propertyType:"tableColumn",__tableParent:this.model(),__columnId:this.resolveColumnIdentity(e,t,n),__columnIndex:t,__columnCollection:n};this.focusedColumn.set(a);this.elementFocusService.setFocus(a)}resolveColumnIdentity(e,t,n="columnsConfig"){const a=String(this.model()?.uuid??"").trim()||String(this.model()?.name??"").trim()||String(this.model()?.dataPath??"").trim()||"table";const o=n==="expandedColumnsConfig"?"expandedColumnsConfig":"columnsConfig";const r=String(e?.id??"").trim();if(r)return`${a}|${o}|id:${r}`;const i=String(e?.key??"").trim();if(i)return`${a}|${o}|key:${i}`;return`${a}|${o}|index:${t}`}matchesStatusRule(e,t){const n=String(e?.condition??"").trim();if(!n)return true;const a=n.replace(/\{([^}]+)\}/g,(o,r)=>String(r??"").trim());try{const o=this.expressionService.runPropertyConditionSync(t,a);return Boolean(o)}catch{return false}}resolveStatusLabel(e,t,n){const a=String(e?.label??"").trim();if(!a)return String(n??"");return a.replace(/\{value\}/g,String(n??"")).replace(/\{row\.([^}]+)\}/g,(o,r)=>String(p(t,String(r??"").trim())??"")).replace(/\{item\.([^}]+)\}/g,(o,r)=>String(p(t,String(r??"").trim())??""))}normalizeStatusTone(e){const t=String(e??"").trim().toLowerCase();if(t==="success")return"success";if(t==="warning"||t==="warn")return"warning";if(t==="risk"||t==="danger"||t==="error")return"risk";if(t==="info")return"info";if(t==="primary")return"primary";return"neutral"}resolveStatusIcon(e,t){if(!this.coerceBooleanValue(t?.statusShowIcon))return null;const n=String(e?.icon??"").trim();if(n)return n;const a=this.normalizeStatusTone(e?.tone);if(a==="success")return"check_circle";if(a==="warning")return"warning";if(a==="risk")return"error";if(a==="primary"||a==="info")return"info";return"radio_button_checked"}resolveStatusRounded(e){return this.coerceBooleanValue(e?.rounded)}resolveHeaderActionButtonClassNames(e){const t=this.shouldUseCustomHeaderActionButtonStyle(e);const n=t?this.normalizeHeaderActionButtonVariant(e?.buttonVariant):"outlined";const a=t?this.normalizeHeaderActionButtonTone(e?.buttonTone):"neutral";return["table-toolbar__button","table-toolbar__button--header-action",`table-toolbar__button--${n}`,`table-toolbar__button--tone-${a}`].join(" ")}shouldUseCustomHeaderActionButtonStyle(e){if(typeof e?.useCustomButtonStyle==="boolean")return e.useCustomButtonStyle;const t=String(e?.buttonVariant??"").trim().toLowerCase();const n=String(e?.buttonTone??"").trim().toLowerCase();return t.length>0&&t!=="outlined"||n.length>0&&n!=="neutral"&&n!=="default"}normalizeHeaderActionButtonVariant(e){const t=String(e??"").trim().toLowerCase();if(t==="filled"||t==="solid")return"filled";if(t==="text")return"text";return"outlined"}normalizeHeaderActionButtonTone(e){const t=String(e??"").trim().toLowerCase();if(t==="primary")return"primary";if(t==="risk"||t==="danger"||t==="error")return"risk";return"neutral"}resolveAbsoluteRowIndex(e){if(!this.model().paginator||this.model().lazyLoad&&this.hasDataSource())return e;return this.pageIndex()*this.pageSize()+e}resolveRowSelectionKey(e,t){const n=String(this.model()?.selectionKey??"id").trim()||"id";const a=p(e,n);if(a!==null&&a!==void 0&&String(a).trim().length>0)return String(a);return`row:${t}`}resolveRowExpansionKey(e,t){const n=this.resolveAbsoluteRowIndex(t);return this.resolveRowSelectionKey(e,n)}syncVirtualScrollWindow(e){const t=this.visibleRows().length;if(!this.virtualScrollEnabled()){this.virtualScrollStartIndex.set(0);this.virtualScrollEndIndex.set(t);return}const n=this.virtualScrollRowHeight();const a=this.virtualScrollBuffer();const o=e?.clientHeight||this.tableScrollerRef()?.nativeElement?.clientHeight||0;const r=o>0?o:this.virtualScrollViewportHeight();const i=Math.max(1,Math.ceil(r/n));const s=Math.max(e?.scrollTop??this.tableScrollerRef()?.nativeElement?.scrollTop??0,0);const c=Math.floor(s/n)-a;const v=Math.max(t-1,0);const m=Math.min(Math.max(0,c),v);const g=Math.min(t,m+i+a*2);this.virtualScrollStartIndex.set(m);this.virtualScrollEndIndex.set(g)}reconcileExpandedRows(){if(!this.rowDetailsEnabled()){this.expandedRowKeys.set([]);this.cancelExpandedDataLoad();this.resetExpandedDataState();return}const e=new Set(this.visibleRows().map((o,r)=>this.resolveRowExpansionKey(o,r)));const t=this.expandedRowKeys().filter(o=>e.has(o));const n=t.length>0?[t[t.length-1]]:[];const a=this.expandedRowKeys();if(a.length!==n.length||a.length>0&&a[0]!==n[0])this.expandedRowKeys.set(n);if(n.length===0){this.cancelExpandedDataLoad();this.resetExpandedDataState();return}if(this.usesExpandedDataSource()&&this.expandedDataRowsKey()&&this.expandedDataRowsKey()!==n[0]){this.cancelExpandedDataLoad();this.resetExpandedDataState()}}applyAutoSelectionByCondition(e){if(!this.selectionEnabled())return;const t=String(this.model()?.autoSelectCondition??"").trim();if(!t)return;const n=t.replace(/\{([^}]+)\}/g,(o,r)=>String(r??"").trim());const a=[];e.forEach((o,r)=>{const i={...this.dataService.getData()??{},row:o,item:o,value:p(o,String(this.model()?.selectionKey??"id").trim()||"id")};try{const s=this.expressionService.runPropertyConditionSync(i,n);if(Boolean(s))a.push(this.resolveRowSelectionKey(o,r))}catch{}});this.selectedRowKeys.set(Array.from(new Set(a)))}reconcileSelectionAndSyncContext(){if(!this.selectionEnabled()){this.selectedRowKeys.set([]);this.syncSelectionContext();return}const e=new Set(this.rows().map((n,a)=>this.resolveRowSelectionKey(n,a)));const t=this.selectedRowKeys().filter(n=>e.has(n));if(t.length!==this.selectedRowKeys().length)this.selectedRowKeys.set(t);if(this.selectedRowKeys().length===0&&this.openSelectionActionMenu())this.openSelectionActionMenu.set(false);this.syncSelectionContext()}reconcileActiveRow(){const e=this.activeRowKey();if(!e){this.syncActiveRowContext();return}if(!new Set(this.rows().map((t,n)=>this.resolveRowSelectionKey(t,n))).has(e))this.activeRowKey.set(null);this.syncActiveRowContext()}reconcileInlineEditState(){const e=this.editingRowKey();if(!e)return;if(!new Set(this.visibleRows().map((t,n)=>this.resolveRowSelectionKey(t,this.resolveAbsoluteRowIndex(n)))).has(e))this.clearInlineEditState()}clearInlineEditState(){this.editingRowKey.set(null);this.editingRowDraft.set(null);this.editingOriginalRow.set(null);this.editingRowSaving.set(false)}buildInlineChangedValues(e,t){const n={};this.dataColumns().forEach(a=>{if(!this.isInlineEditableColumn(a))return;const o=String(a?.key??"").trim();if(!o)return;const r=p(e,o);const i=p(t,o);if(!Object.is(r,i))n[o]=i});return n}commitInlineEditRow(e,t){const n=this.rows();const a=n.indexOf(e);if(a<0)return;const o=[...n];o[a]=t;if(Array.isArray(this.model().value)){const r=[...this.model().value];r[a]=t;this.model().value=r}this.rows.set(o);this.applyClientState()}buildRowActionRuntimeContext(e,t){const n=String(this.model()?.selectionKey??"id").trim()||"id";const a=p(e,n);const o=this.buildSelectionRuntimeContext();return{...this.dataService.getData()??{},row:e,item:e,value:a,parentRow:t,tableRow:t,...o}}buildSelectionActionRuntimeContext(){const e=this.buildSelectionRuntimeContext();const t=Array.isArray(e["selectedRows"])?e["selectedRows"]:[];const n=Array.isArray(e["selectedItems"])?e["selectedItems"]:t;return{...this.dataService.getData()??{},...e,rows:t,items:n,item:n,value:n}}buildHeaderActionRuntimeContext(){const e=this.buildSelectionRuntimeContext();return{...this.dataService.getData()??{},quickSearch:this.quickSearchTerm(),filters:this.detailedFilters(),...e,table:{...e["table"],name:String(this.model()?.name??"").trim(),quickSearch:this.quickSearchTerm(),filters:this.detailedFilters(),sortField:this.sortField(),sortDirection:this.sortDirection(),page:this.pageIndex()+1,pageSize:this.pageSize()}}}buildRowTemplateRuntimeContext(e,t){const n=this.buildHeaderActionRuntimeContext();const a=this.resolveRowSelectionKey(e,t);const o=this.isRowSelected(e,t);const r=this.isRowExpanded(e,t);return{...n,index:t,rowIndex:t,rowKey:a,selected:o,expanded:r,table:{...n["table"]??{},rowIndex:t,visibleRowIndex:t,rowKey:a,selected:o,expanded:r}}}async runHeaderMenuActions(e){const t=Array.isArray(this.model()?.headerMenuActions)?this.model().headerMenuActions:[];if(t.length===0){this.headerMenuValue.set("");return}const n=this.buildHeaderMenuRuntimeContext(e);for(const a of t){const o=String(a?.trigger??"click").trim().toLowerCase();if(o!=="click"&&o!=="change")continue;await this.runTableAction(a,n)}this.headerMenuValue.set("")}async runRowExpandActions(e,t){const n=Array.isArray(this.model()?.rowExpandActions)?this.model().rowExpandActions:[];if(!n.length)return;const a={...this.buildRowActionRuntimeContext(e),rowIndex:this.resolveAbsoluteRowIndex(t),expanded:true};for(const o of n){const r=String(o?.trigger??"click").trim().toLowerCase();if(r!=="click"&&r!=="change")continue;await this.runTableAction(o,a)}}async loadHeaderMenuDataSourceOptions(e=false){if(!this.headerMenuEnabled()){this.headerMenuDataSourceOptions.set([]);this.headerMenuDataSourceLoading.set(false);return}const t=String(this.model()?.headerMenuDataSourceName??"").trim();if(!t){this.headerMenuDataSourceOptions.set([]);this.headerMenuDataSourceLoading.set(false);return}this.headerMenuDataSourceLoading.set(true);try{const n=this.buildHeaderActionRuntimeContext();const a=await C(this.dataSourceService.getData$(t,e,this.model(),n));const o=String(this.model()?.headerMenuDataSourceItemsPath??"").trim();let r=a;if(o)r=p(a,o);const i=(Array.isArray(r)?r:Array.isArray(a)?a:[]).filter(s=>s!==null&&s!==void 0).map(s=>{if(typeof s==="object"&&!Array.isArray(s))return{...s};const c=String(s??"").trim();if(!c)return null;return{label:c,value:c}}).filter(s=>Boolean(s));this.headerMenuDataSourceOptions.set(i)}catch{this.headerMenuDataSourceOptions.set([])}finally{this.headerMenuDataSourceLoading.set(false)}}async openColumnSettings(){if(!this.columnSettingsEnabled())return;if(this.columnSettingsMode()==="dataSource")await this.loadColumnSettingsFromDataSource();this.syncColumnSettingsState();this.columnSettingsDraft.set(this.cloneColumnSettingsRows(this.columnSettingsState()));this.openColumnSettingsDialog.set(true)}closeColumnSettings(){this.openColumnSettingsDialog.set(false)}async saveColumnSettings(e){e?.preventDefault();e?.stopPropagation();const t=this.normalizeColumnSettingsRows(this.columnSettingsDraft());this.applyColumnSettingsState(t);this.ngxViewBuilderApi.setTableSettings(this.resolveTableSettingsIdentifier(),t,{tableName:this.resolveTableSettingsTableName(),elementName:this.resolveTableSettingsElementName(),source:"user"});this.ngxViewBuilderApi.requestTableSettingsSave(this.resolveTableSettingsTableName(),this.resolveTableSettingsElementName(),t);await this.persistColumnSettings(t);this.openColumnSettingsDialog.set(false)}async applyColumnSettings(e){e?.preventDefault();e?.stopPropagation();const t=this.normalizeColumnSettingsRows(this.columnSettingsDraft());this.applyColumnSettingsState(t);this.ngxViewBuilderApi.setTableSettings(this.resolveTableSettingsIdentifier(),t,{tableName:this.resolveTableSettingsTableName(),elementName:this.resolveTableSettingsElementName(),source:"user"});await this.persistColumnSettings(t);this.openColumnSettingsDialog.set(false)}showColumnSettingsSaveAction(){return this.columnSettingsMode()==="host"}async resetColumnSettings(){await this.resetColumnSettingsInDataSource();this.columnSettingsDraft.set(this.resolveDefaultColumnSettings())}showAllColumnSettings(){this.columnSettingsDraft.update(e=>this.normalizeColumnSettingsRows(e).map(t=>({...t,visible:true})))}setColumnSettingsVisibility(e,t){const n=String(e??"").trim();if(!n)return;this.columnSettingsDraft.update(a=>a.map(o=>o.key===n?{...o,visible:t}:o))}setColumnSettingsWidth(e,t){const n=String(e??"").trim();if(!n)return;const a=this.normalizeColumnSettingsWidthValue(t);this.columnSettingsDraft.update(o=>o.map(r=>r.key===n?{...r,width:a}:r))}resetColumnSettingsWidth(e){this.setColumnSettingsWidth(e,"")}hasColumnSettingsCustomWidth(e){return String(e?.width??"").trim().length>0}resolveColumnSettingsWidthSliderValue(e){const t=this.parseColumnSettingsWidthPixels(e?.width);return this.clampColumnSettingsWidthValue(t??this.columnSettingsWidthDefault)}resolveColumnSettingsWidthDisplay(e){if(!this.hasColumnSettingsCustomWidth(e))return"Automatinis";return String(this.resolveColumnSettingsWidthSliderValue(e))}moveColumnSettingsRow(e,t){const n=String(e??"").trim();if(!n)return;this.columnSettingsDraft.update(a=>{const o=this.normalizeColumnSettingsRows(a);const r=o.findIndex(v=>v.key===n);if(r<0)return o;const i=r+t;if(i<0||i>=o.length)return o;const s=[...o];const[c]=s.splice(r,1);s.splice(i,0,c);return s.map((v,m)=>({...v,order:m}))})}reorderColumnSettingsRows(e){if(e.previousIndex===e.currentIndex)return;this.columnSettingsDraft.update(t=>{const n=this.normalizeColumnSettingsRows(t);We(n,e.previousIndex,e.currentIndex);return n.map((a,o)=>({...a,order:o}))})}isColumnSettingsRowFirst(e){const t=this.normalizeColumnSettingsRows(this.columnSettingsDraft());return t.length===0||t[0]?.key===String(e??"").trim()}isColumnSettingsRowLast(e){const t=this.normalizeColumnSettingsRows(this.columnSettingsDraft());return t.length===0||t[t.length-1]?.key===String(e??"").trim()}columnSettingsDialogTitle(){return String(this.model()?.columnSettingsDialogTitle??"").trim()||"table.columns.settings.title"}async initializeColumnSettings(){this.syncColumnSettingsState();const e=this.resolveHostTableSettings();if(e.length>0){this.applyColumnSettingsState(e);return}const t=this.columnSettingsMode();if(t==="localStorage"){const n=this.loadColumnSettingsFromLocalStorage();if(n.length>0){this.applyColumnSettingsState(n);this.ngxViewBuilderApi.setTableSettings(this.resolveTableSettingsIdentifier(),n,{tableName:this.resolveTableSettingsTableName(),elementName:this.resolveTableSettingsElementName(),source:"localStorage"})}return}if(t==="dataSource"){await this.loadColumnSettingsFromDataSource();return}if(t==="host")this.ngxViewBuilderApi.requestTableSettings(this.resolveTableSettingsTableName(),this.resolveTableSettingsElementName(),this.columnSettingsState())}syncColumnSettingsState(){const e=this.mergeColumnSettingsWithDefaults(this.columnSettingsState());const t=JSON.stringify(this.columnSettingsState());const n=JSON.stringify(e);if(t!==n)this.columnSettingsState.set(e);const a=JSON.stringify(this.columnSettingsDraft());if(this.openColumnSettingsDialog()&&a!==n)this.columnSettingsDraft.set(this.cloneColumnSettingsRows(e))}applyColumnSettingsState(e){const t=this.mergeColumnSettingsWithDefaults(e);this.columnSettingsState.set(t)}async persistColumnSettings(e){const t=this.columnSettingsMode();if(t==="localStorage"){this.saveColumnSettingsToLocalStorage(e);return}if(t==="dataSource")await this.saveColumnSettingsToDataSource(e)}async loadColumnSettingsFromDataSource(){const e=String(this.model()?.columnSettingsDataSourceName??"").trim();if(!e)return;try{const t=this.buildColumnSettingsRuntimeContext(this.columnSettingsState());const n=await C(this.dataSourceService.getData$(e,true,this.model(),t));const a=this.resolveColumnSettingsFromDataSourceResult(n);if(a.length===0)return;this.applyColumnSettingsState(a);this.ngxViewBuilderApi.setTableSettings(this.resolveTableSettingsIdentifier(),a,{tableName:this.resolveTableSettingsTableName(),elementName:this.resolveTableSettingsElementName(),source:"dataSource"})}catch{}}async saveColumnSettingsToDataSource(e){const t=String(this.model()?.saveColumnSettingsDataSourceName??"").trim()||String(this.model()?.columnSettingsDataSourceName??"").trim();if(!t)return;try{const n=this.buildColumnSettingsRuntimeContext(e);await C(this.dataSourceService.getData$(t,true,this.model(),n))}catch{}}async resetColumnSettingsInDataSource(){if(this.columnSettingsMode()!=="dataSource")return;const e=String(this.model()?.resetColumnSettingsDataSourceName??"").trim();if(!e)return;try{const t=this.buildColumnSettingsRuntimeContext(this.resolveDefaultColumnSettings());await C(this.dataSourceService.getData$(e,true,this.model(),t))}catch{}}buildColumnSettingsRuntimeContext(e){const t=this.buildHeaderActionRuntimeContext();return{...t,tableSettings:e,columnSettings:e,columns:e,value:e,table:{...t["table"],columnSettings:e}}}resolveColumnSettingsFromDataSourceResult(e){const t=String(this.model()?.columnSettingsDataSourcePath??"").trim();const n=t?p(e,t):e;if(Array.isArray(n))return this.normalizeColumnSettingsRows(n);if(n&&typeof n==="object"&&Array.isArray(n["settings"]))return this.normalizeColumnSettingsRows(n["settings"]);return[]}saveColumnSettingsToLocalStorage(e){if(typeof localStorage==="undefined")return;try{localStorage.setItem(this.resolveColumnSettingsStorageKey(),JSON.stringify(this.normalizeColumnSettingsRows(e)))}catch{}}loadColumnSettingsFromLocalStorage(){if(typeof localStorage==="undefined")return[];try{const e=localStorage.getItem(this.resolveColumnSettingsStorageKey());if(!e)return[];const t=JSON.parse(e);return this.normalizeColumnSettingsRows(t)}catch{return[]}}resolveHostTableSettings(){const e=this.resolveTableSettingsElementName();const t=this.resolveTableSettingsTableName();const n=this.ngxViewBuilderApi.getTableSettings(e)??this.ngxViewBuilderApi.getTableSettings(t)??[];return this.normalizeColumnSettingsRows(n)}matchesTableSettingsEvent(e){const t=this.resolveTableSettingsTableName();const n=this.resolveTableSettingsElementName();return String(e?.elementName??"").trim()===n||String(e?.tableName??"").trim()===t}initializeAppliedTableFilters(){const e=this.resolveHostTableFilters();if(e.length===0)return;this.applyDetailedFiltersState(e,false)}resolveHostTableFilters(){const e=this.resolveTableStateElementName();const t=this.resolveTableStateTableName();const n=this.ngxViewBuilderApi.getTableFilters(e)??this.ngxViewBuilderApi.getTableFilters(t)??[];return this.normalizeDetailedFilterPayload(n)}matchesTableFiltersEvent(e){const t=this.resolveTableStateTableName();const n=this.resolveTableStateElementName();return String(e?.elementName??"").trim()===n||String(e?.tableName??"").trim()===t}matchesTableSavedFiltersEvent(e){const t=this.resolveTableStateTableName();const n=this.resolveTableStateElementName();return String(e?.elementName??"").trim()===n||String(e?.tableName??"").trim()===t}mergeColumnSettingsWithDefaults(e){const t=this.resolveDefaultColumnSettings();const n=new Map(this.normalizeColumnSettingsRows(e).map(a=>[a.key,a]));return t.map((a,o)=>{const r=n.get(a.key);return{...a,label:r?.label||a.label,visible:r?.visible??a.visible,order:r?.order??o,width:r?.width??a.width}}).sort((a,o)=>a.order-o.order).map((a,o)=>({...a,order:o}))}normalizeColumnSettingsRows(e){if(!Array.isArray(e))return[];return e.map((t,n)=>{const a=String(t?.["key"]??"").trim();if(!a)return null;const o=String(t?.["width"]??"").trim();const r=Number(t?.["order"]??n);return{key:a,label:String(t?.["label"]??"").trim(),visible:t?.["visible"]!==false,order:Number.isFinite(r)?r:n,width:o}}).filter(t=>Boolean(t)).sort((t,n)=>t.order-n.order).map((t,n)=>({...t,order:n}))}cloneColumnSettingsRows(e){return this.normalizeColumnSettingsRows(e).map(t=>({...t}))}resolveDefaultColumnSettings(){return(Array.isArray(this.model()?.columnsConfig)?this.model().columnsConfig:[]).filter(e=>String(e?.key??"").trim().length>0&&e?.showInTable!==false).map((e,t)=>({key:String(e?.key??"").trim(),label:this.resolveColumnLabel(e),visible:true,order:t,width:String(e?.width??"").trim()}))}resolveTableSettingsIdentifier(){return this.resolveTableSettingsElementName()||this.resolveTableSettingsTableName()}resolveTableStateIdentifier(){return this.resolveTableStateElementName()||this.resolveTableStateTableName()}resolveTableStateElementName(){return this.resolveTableSettingsElementName()}resolveTableStateTableName(){return this.resolveTableSettingsTableName()}resolveTableSettingsElementName(){return String(this.model()?.name??"").trim()||"table"}resolveTableSettingsTableName(){return String(this.model()?.name??"").trim()||"table"}resolveColumnSettingsStorageKey(){const e=String(this.model()?.columnSettingsStorageKey??"").trim();if(e)return e;return`ngx-view-builder.table.column-settings.${this.resolveTableSettingsIdentifier()}`}applyDetailedFiltersState(e,t){this.detailedFilters.set(this.cloneDetailedFilters(e));this.openDetailedFilterMultiSelectId.set(null);this.openDetailedFilterDatePickerId.set(null);this.refreshDetailedFilterDataSourceOptions(true);if(!t)return;this.pageIndex.set(0);this.scheduleSearchReload(true)}emitTableFiltersChanged(e,t,n){this.ngxViewBuilderApi.setTableFilters(this.resolveTableStateIdentifier(),this.detailedFiltersAsApiPayload(e),{tableName:this.resolveTableStateTableName(),elementName:this.resolveTableStateElementName(),source:t,savedFilter:n??null})}detailedFiltersAsApiPayload(e){return this.cloneDetailedFilters(e).reduce((t,n)=>{const a=String(n?.key??"").trim();if(!a)return t;t.push({id:String(n?.id??D()).trim()||D(),key:a,operator:this.normalizeOperator(String(n?.operator??"")),value:H(n?.value??null)});return t},[])}toApiSavedFilterEntry(e){return{id:String(e?.id??D()).trim()||D(),name:String(e?.name??"").trim(),description:String(e?.description??"").trim(),code:String(e?.code??"").trim(),filters:this.detailedFiltersAsApiPayload(e?.filters??[])}}normalizeColumnSettingsWidthValue(e){const t=String(e??"").trim();if(!t)return"";const n=this.parseColumnSettingsWidthPixels(t);if(n===null)return"";return`${this.clampColumnSettingsWidthValue(n)}px`}parseColumnSettingsWidthPixels(e){const t=String(e??"").trim();if(!t)return null;const n=t.match(/-?\d+(\.\d+)?/)?.[0]??"";const a=Number(n);if(!Number.isFinite(a))return null;return Math.round(a)}clampColumnSettingsWidthValue(e){return Math.min(this.columnSettingsWidthMax,Math.max(this.columnSettingsWidthMin,Math.round(e)))}async loadSavedFilters(e=false){if(!this.savedFiltersEnabled()){this.savedFilters.set([]);return}this.savedFiltersLoading.set(true);try{if(this.savedFiltersMode()==="host"){const t=this.resolveHostSavedFilters();if(t.length>0)this.savedFilters.set(t);else{this.ngxViewBuilderApi.requestTableSavedFilters(String(this.model()?.name??"").trim()||"table",String(this.model()?.name??"").trim()||"table",this.savedFiltersAsApiPayload(this.savedFilters()));this.savedFilters.set([])}}else if(this.savedFiltersMode()==="dataSource"){const t=String(this.model()?.savedFiltersDataSourceName??"").trim();if(!t){this.savedFilters.set([]);return}const n=this.buildHeaderActionRuntimeContext();const a=await C(this.dataSourceService.getData$(t,e,this.model(),n));const o=this.resolveSavedFiltersFromResult(a);this.savedFilters.set(o);this.saveFiltersToLocalStorage(o)}else this.savedFilters.set(this.loadFiltersFromLocalStorage())}catch{this.savedFilters.set(this.loadFiltersFromLocalStorage())}finally{this.savedFiltersLoading.set(false)}}resolveSavedFiltersFromResult(e){const t=String(this.model()?.savedFiltersItemsPath??"").trim();const n=t?p(e,t):e;return(Array.isArray(n)?n:[]).map((a,o)=>this.normalizeSavedFilterEntry(a,o)).filter(a=>Boolean(a))}normalizeSavedFilterEntry(e,t){if(!e||typeof e!=="object")return null;const n=e;const a=String(this.model()?.savedFilterIdKey??"id").trim()||"id";const o=String(this.model()?.savedFilterNameKey??"name").trim()||"name";const r=String(this.model()?.savedFilterDescriptionKey??"description").trim()||"description";const i=String(this.model()?.savedFilterCodeKey??"code").trim()||"code";const s=String(this.model()?.savedFilterPayloadKey??"filters").trim()||"filters";const c=String(p(n,a)??D()??`saved-filter-${t+1}`).trim();const v=String(p(n,o)??"").trim();if(!v)return null;const m=String(p(n,r)??"").trim();const g=String(p(n,i)??"").trim();const f=p(n,s);const x=this.normalizeSavedFilterPayload(f);return{id:c||`saved-filter-${t+1}`,name:v,description:m,code:g,filters:x}}normalizeSavedFilterPayload(e){if(!Array.isArray(e))return[];const t=Array.isArray(this.model()?.columnsConfig)?this.model().columnsConfig:[];return e.map(n=>{if(!n||typeof n!=="object")return null;const a=n;const o=String(a["key"]??"").trim();if(!o)return null;const r=t.find(c=>String(c?.key??"").trim()===o);const i=this.resolveColumnType(r);const s=this.resolveColumnFilterControlType(r,i);return{id:String(a["id"]??D()).trim()||D(),key:o,operator:this.normalizeOperator(String(a["operator"]??"")),value:this.normalizeFilterValue(i,a["value"],s,r),type:i,controlType:s,options:this.resolveColumnFilterOptions(r),column:r}}).filter(n=>Boolean(n))}normalizeDetailedFilterPayload(e){return this.normalizeSavedFilterPayload(e)}cloneDetailedFilters(e){return e.map(t=>({...t,options:Array.isArray(t?.options)?[...t.options]:[],column:t?.column?{...t.column}:void 0}))}async persistSavedFilterToDataSource(e){if(this.savedFiltersMode()==="host"){const a=[e,...this.savedFilters().filter(o=>o.id!==e.id)];this.ngxViewBuilderApi.setTableSavedFilters(String(this.model()?.name??"").trim()||"table",this.savedFiltersAsApiPayload(a),{tableName:String(this.model()?.name??"").trim()||"table",elementName:String(this.model()?.name??"").trim()||"table",source:"user"});return}const t=String(this.model()?.saveFilterDataSourceName??"").trim();if(!t)return;const n={...this.buildHeaderActionRuntimeContext(),savedFilter:e,filter:e,value:e,table:{...this.buildHeaderActionRuntimeContext()["table"],savedFilter:e}};await C(this.dataSourceService.getData$(t,true,this.model(),n))}async deleteSavedFilterFromDataSource(e){if(this.savedFiltersMode()==="host"){const a=this.savedFilters().filter(o=>o.id!==e.id);this.ngxViewBuilderApi.setTableSavedFilters(String(this.model()?.name??"").trim()||"table",this.savedFiltersAsApiPayload(a),{tableName:String(this.model()?.name??"").trim()||"table",elementName:String(this.model()?.name??"").trim()||"table",source:"user"});return}const t=String(this.model()?.deleteFilterDataSourceName??"").trim();if(!t)return;const n={...this.buildHeaderActionRuntimeContext(),savedFilter:e,filter:e,value:e,table:{...this.buildHeaderActionRuntimeContext()["table"],savedFilter:e}};await C(this.dataSourceService.getData$(t,true,this.model(),n))}saveFiltersToLocalStorage(e){if(typeof localStorage==="undefined")return;try{localStorage.setItem(this.resolveSavedFilterStorageKey(),JSON.stringify(e))}catch{}}loadFiltersFromLocalStorage(){if(typeof localStorage==="undefined")return[];try{const e=localStorage.getItem(this.resolveSavedFilterStorageKey());if(!e)return[];const t=JSON.parse(e);if(!Array.isArray(t))return[];return t.map((n,a)=>this.normalizeSavedFilterEntry(n,a)).filter(n=>Boolean(n))}catch{return[]}}resolveSavedFilterStorageKey(){return`ngx-view-builder.table.saved-filters.${String(this.model()?.name??"").trim()||"table"}`}resolveHostSavedFilters(){const e=String(this.model()?.name??"").trim()||"table";return this.normalizeSavedFiltersFromApi(this.ngxViewBuilderApi.getTableSavedFilters(e)??[])}normalizeSavedFiltersFromApi(e){return(Array.isArray(e)?e:[]).map((t,n)=>this.normalizeSavedFilterEntry({id:t?.id,name:t?.name,description:t?.description,code:t?.code,filters:t?.filters},n)).filter(t=>Boolean(t))}savedFiltersAsApiPayload(e){return e.map(t=>({id:String(t?.id??"").trim(),name:String(t?.name??"").trim(),description:String(t?.description??"").trim(),code:String(t?.code??"").trim(),filters:this.cloneDetailedFilters(t?.filters??[])}))}isActionVisible(e,t,n){if(!this.isActionAllowedByVisibilityPath(e,t))return false;return this.isActionConditionVisible(e,n)}isActionConditionVisible(e,t){const n=String(e?.condition??"").trim();if(!n)return true;try{const a=this.normalizeConditionExpression(n);const o=this.expressionService.applyContextToExpression(a,this.model()).trim();if(!o)return true;const r=this.expressionService.runPropertyConditionSync(t,o);return Boolean(r)}catch{return false}}isActionAllowedByVisibilityPath(e,t){const n=String(this.model()?.rowActionVisibilityPath??"").trim();if(!n)return true;const a=p(t,n);const o=this.extractActionVisibilityTokens(a);if(o.length===0)return false;const r=[String(e?.id??""),String(e?.type??""),String(e?.label??"")].map(i=>i.trim().toUpperCase()).filter(i=>i.length>0);if(r.length===0)return false;return r.some(i=>o.includes(i))}extractActionVisibilityTokens(e){if(Array.isArray(e))return e.map(t=>String(t??"").trim().toUpperCase()).filter(t=>t.length>0);if(typeof e==="string"){const t=e.trim();if(!t)return[];return t.split(",").map(n=>n.trim().toUpperCase()).filter(n=>n.length>0)}if(e===null||e===void 0)return[];return[String(e).trim().toUpperCase()].filter(t=>t.length>0)}isColumnHiddenByCondition(e,t,n,a,o){const r=String(e?.visibleIf??"").trim();if(!r)return false;const i=this.normalizeConditionExpression(r);if(!i)return false;const s=Array.isArray(a)&&a.length>0?a[0]:null;const c=String(this.model()?.name??"").trim();const v={...n??{},column:e,columnIndex:t,table:{name:c,column:e,columnIndex:t,rows:a,rowCount:Array.isArray(a)?a.length:0,selectedKeys:Array.isArray(o)?o:[],selectedCount:Array.isArray(o)?o.length:0}};if(s&&typeof s==="object"){v["row"]=s;v["item"]=s;v["value"]=this.resolveCellValue(s,e)}try{return!Boolean(this.expressionService.runPropertyConditionSync(v,i))}catch{return false}}normalizeConditionExpression(e){return String(e??"").replace(/\{([^}]+)\}/g,(t,n)=>String(n??"").trim()).trim()}resolveDynamicLabelText(e){const t=String(e??"");if(!t.includes("{"))return t;return t.replace(/\{([^}]+)\}/g,(n,a)=>{const o=String(a??"").trim();if(!o)return"";const r=this.dataService.getValue(o);if(r!==void 0)return this.stringifyDynamicLabelValue(r);try{const i=this.expressionService.applyContextToExpression(o,this.model()).trim();if(!i)return"";const s=this.expressionService.runPropertyConditionSync(this.dataService.getData()??{},i);return this.stringifyDynamicLabelValue(s)}catch{return""}})}stringifyDynamicLabelValue(e){if(e===null||e===void 0)return"";if(Array.isArray(e)){const t=e.filter(n=>n===null||n===void 0||typeof n==="string"||typeof n==="number"||typeof n==="boolean");if(t.length===e.length)return t.map(n=>String(n??"")).join(", ");try{return JSON.stringify(e)}catch{return""}}if(typeof e==="object")try{return JSON.stringify(e)}catch{return""}return String(e)}buildSelectionRuntimeContext(){const e=this.resolveSelectionState();return{selectedKeys:e.selectedKeys,selectedItems:e.selectedItems,selectedRows:e.selectedRows,selectedCount:e.selectedRows.length,table:{name:String(this.model()?.name??"").trim(),selectedKeys:e.selectedKeys,selectedItems:e.selectedItems,selectedRows:e.selectedRows,selectedCount:e.selectedRows.length}}}resolveSelectionState(){const e=Array.from(new Set(this.selectedRowKeys()));const t=new Set(e);const n=this.rows().filter((a,o)=>t.has(this.resolveRowSelectionKey(a,o)));return{selectedKeys:e,selectedRows:n,selectedItems:this.buildSelectedItems(n,e)}}buildSelectedItems(e,t){const n=String(this.model()?.selectionItemTemplate??"");if(!n.trim())return e;return e.map((a,o)=>this.resolveSelectionItemFromRow(a,o,e,t,n))}resolveSelectionItemFromRow(e,t,n,a,o){const r=String(this.model()?.selectionKey??"id").trim()||"id";const i=p(e,r);const s=n.length;const c={...this.dataService.getData()??{},row:e,item:e,value:i,rowIndex:t,selectedRows:n,selectedKeys:a,selectedCount:s,table:{name:String(this.model()?.name??"").trim(),selectedRows:n,selectedKeys:a,selectedCount:s}};return this.resolveSelectionTemplateValue(o,c,e)}resolveSelectionTemplateValue(e,t,n){const a=String(e??"").trim();if(!a)return n;const o=this.extractSelectionTemplatePlaceholderPath(a);if(o)return this.resolveSelectionTemplatePathValue(o,t);if(this.isSelectionTemplatePath(a))return this.resolveSelectionTemplatePathValue(a,t);const r=this.parseSelectionTemplateJson(a);if(r!==void 0)return this.resolveSelectionTemplateStructure(r,t);return this.interpolateSelectionTemplateText(a,t)}resolveSelectionTemplateStructure(e,t){if(typeof e==="string"){const n=e.trim();const a=this.extractSelectionTemplatePlaceholderPath(n);if(a)return this.resolveSelectionTemplatePathValue(a,t);return this.interpolateSelectionTemplateText(e,t)}if(Array.isArray(e))return e.map(n=>this.resolveSelectionTemplateStructure(n,t));if(e&&typeof e==="object")return Object.fromEntries(Object.entries(e).map(([n,a])=>[n,this.resolveSelectionTemplateStructure(a,t)]));return e}interpolateSelectionTemplateText(e,t){return String(e??"").replace(/\{([^{}]+)\}/g,(n,a)=>this.stringifySelectionTemplateValue(this.resolveSelectionTemplatePathValue(String(a??"").trim(),t)))}resolveSelectionTemplatePathValue(e,t){const n=String(e??"").trim();if(!n)return null;const a=p(t,n);return a===void 0?null:a}extractSelectionTemplatePlaceholderPath(e){const t=String(e??"").trim().match(/^\{\s*([A-Za-z_$][\w$]*(?:\[[^\]]+\]|\.[A-Za-z_$][\w$]*)*)\s*\}$/);return String(t?.[1]??"").trim()||null}isSelectionTemplatePath(e){return/^(?:row|item|value|selectedRows|selectedKeys|selectedCount|table|__table)(?:\[[^\]]+\]|\.[A-Za-z_$][\w$]*)*$/.test(String(e??"").trim())}parseSelectionTemplateJson(e){const t=String(e??"").trim();if(!t||!/^(?:\{|\[|"|-?\d|true$|false$|null$)/i.test(t))return;try{return JSON.parse(t)}catch{return}}stringifySelectionTemplateValue(e){if(e===null||e===void 0)return"";if(typeof e==="string"||typeof e==="number"||typeof e==="boolean"||typeof e==="bigint")return String(e);try{return JSON.stringify(e)}catch{return String(e)}}resolveHeaderActionDropdownOptionValue(e,t){const n=String(e?.id??"").trim();if(n)return`id:${n}`;return`index:${t}`}runHeaderDropdownActionByValue(e){const t=String(e??"").trim();if(!t){this.headerActionDropdownValue.set("");return}const n=this.headerActionDropdownOptions().find(o=>String(o?.value??"").trim()===t);if(!n?.action){this.headerActionDropdownValue.set("");return}const a=this.buildHeaderActionRuntimeContext();this.runTableAction(n.action,a);this.headerActionDropdownValue.set("")}async runTableAction(e,t){const n=await this.actionService.runAction(this.model(),e,t);if(n&&String(e?.type??"").trim()==="dataSource"&&this.coerceBooleanValue(e?.reloadCurrentElementAfterSuccess))this.reloadCurrentTableData();return n}reloadCurrentTableData(){this.loadTableData(true);this.reloadExpandedDataForCurrentRow()}resolveColumnCellActionOptionValue(e,t){return`id:${String(e?.id??t).trim()}`}resolveExpandedRowActionOptionValue(e,t){return`id:${String(e?.id??t).trim()}`}buildHeaderMenuRuntimeContext(e){return{...this.buildHeaderActionRuntimeContext(),selectedItem:e.item,headerMenuItem:e.item,menuItem:e.item,item:e.item,value:e.value}}resolveHeaderMenuOptions(){if(!this.headerMenuEnabled())return[];const e=this.resolveHeaderMenuSource();if(!Array.isArray(e))return[];const t=String(this.model()?.headerMenuLabelKey??"label").trim()||"label";const n=String(this.model()?.headerMenuValueKey??"value").trim()||"value";return e.map((a,o)=>this.normalizeHeaderMenuOption(a,o,t,n)).filter(a=>Boolean(a))}resolveHeaderMenuSource(){const e=this.headerMenuDataSourceOptions();if(Array.isArray(e)&&e.length>0)return e;const t=Array.isArray(this.model()?.headerMenuOptions)?this.model().headerMenuOptions:[];if(t.length>0)return t;const n=String(this.model()?.headerMenuItemsPath??"").trim();if(!n)return[];const a=this.dataService.buildRuntimeContext();const o=p(a,n);if(Array.isArray(o))return o;try{const r=this.normalizeConditionExpression(n);const i=this.expressionService.applyContextToExpression(r,this.model()).trim();if(!i)return[];const s=this.expressionService.runPropertyConditionSync(a,i);return Array.isArray(s)?s:[]}catch{return[]}}normalizeHeaderMenuOption(e,t,n,a){if(e===null||e===void 0)return null;if(typeof e==="object"&&!Array.isArray(e)){const r=e;const i=String(p(r,n)??p(r,a)??`Item ${t+1}`).trim();const s=String(p(r,a)??p(r,n)??t).trim();if(!i||!s)return null;return{label:i,value:s,item:r}}const o=String(e).trim();if(!o)return null;return{label:o,value:o,item:{label:o,value:o}}}resolveSuggestedActionIcon(e){const t=`${String(e?.label??"")} ${String(e?.type??"")}`.trim().toLowerCase();if(!t)return null;if(t.includes("view")||t.includes("preview")||t.includes("perziur")||t.includes("rody"))return"visibility";if(t.includes("delete")||t.includes("remove")||t.includes("trint")||t.includes("salin"))return"delete";if(t.includes("copy")||t.includes("kopij"))return"content_copy";if(t.includes("edit")||t.includes("update")||t.includes("redag")||t.includes("tais"))return"edit";if(t.includes("export")||t.includes("download"))return"ios_share";if(t.includes("add")||t.includes("create")||t.includes("prid"))return"add";return null}insertHeaderCenterElementName(e,t){const n=String(e??"").trim();if(!n)return;const a=this.headerCenterElementNames().filter(r=>r!==n);const o=Number.isFinite(t)?Math.max(0,Math.min(Number(t),a.length)):a.length;a.splice(o,0,n);this.model().headerCenterElements=a}resolveHeaderCenterInsertIndex(e){const t=this.headerCenterElementNames();if(t.length===0)return 0;const n=e.target?.closest("[data-nvb-header-center-name]");if(!n)return t.length;const a=String(n.getAttribute("data-nvb-header-center-name")??"").trim();const o=t.indexOf(a);if(o<0)return t.length;const r=n.getBoundingClientRect();const i=r.left+r.width/2;return e.clientX<i?o:o+1}resolveHeaderCenterDropIntent(e){const t=this.parseHeaderCenterTransferPayload(e);if(!t)return{accepted:false,type:null,existingElementName:null,sourceModel:null};const n=String(t["name"]??"").trim();const a=n?this.structureService.getElement(n):null;const o=t["templateElement"];const r=o&&typeof o==="object"&&!Array.isArray(o)?o:null;const i=String(a?.type??r?.["type"]??t["type"]??"").trim();if(!i||!this.isHeaderCenterAllowedType(i))return{accepted:false,type:null,existingElementName:null,sourceModel:null};if(n&&!a)return{accepted:false,type:null,existingElementName:null,sourceModel:null};if(n&&String(this.model()?.name??"").trim()===n)return{accepted:false,type:null,existingElementName:null,sourceModel:null};if(n&&ut.has(i))return{accepted:false,type:null,existingElementName:null,sourceModel:null};if(this.hasUnsupportedHeaderCenterSegments(t))return{accepted:false,type:null,existingElementName:null,sourceModel:null};const s=n?null:r&&r["type"]?r:null;return{accepted:true,type:i,existingElementName:n||null,sourceModel:s}}hasUnsupportedHeaderCenterSegments(e){const t=e["segmentRows"];if(Array.isArray(t)&&t.length>0)return true;const n=e["segmentTabRows"];if(n&&typeof n==="object"){if(Object.values(n).some(o=>Array.isArray(o)&&o.length>0))return true}const a=e["segmentElements"];if(a&&typeof a==="object"){if(Object.keys(a).length>1)return true}return false}parseHeaderCenterTransferPayload(e){const t=this.readHeaderCenterTransferPayload(e?.dataTransfer??null);if(!t)return null;try{const n=JSON.parse(t);return n&&typeof n==="object"&&!Array.isArray(n)?n:null}catch{return null}}readHeaderCenterTransferPayload(e){if(!e)return"";for(const t of["application/json","text/plain","text"]){const n=String(e.getData(t)??"").trim();if(n)return n}return""}initHeaderCenterExtensions(){const e=this.ngxViewBuilderApi.getTableHeaderCenterExtensions();if(e.length===0)return;const t=[];for(const n of e)if(!Z.has(n.type)){Z.add(n.type);t.push({type:n.type,labelKey:`element.${n.type}`,fallbackLabel:n.label})}if(t.length>0)this.headerCenterAddOptions=[...this.headerCenterAddOptions,...t]}isHeaderCenterAllowedType(e){const t=String(e??"").trim();return Boolean(t)&&Z.has(t)}createHeaderCenterElement(e,t){const n=String(e??"").trim();if(!n||!this.isHeaderCenterAllowedType(n))return null;const a=this.structureService.getNextElementName(n);const o=t?this.cloneHeaderCenterSourceModel(t):{};o["name"]=a;o["type"]=n;const r=String(o["label"]??"").trim();o["label"]=t?r:"";if(!t)o["description"]="";if(!Object.prototype.hasOwnProperty.call(o,"value"))o["value"]=null;delete o["parentElement"];delete o["isTemplateElement"];delete o["template"];delete o["columns"];delete o["headerCenterElements"];const i=this.structureService.modelService.createModel(n,o);i.name=a;i.type=n;i.label=String(i.label??"").trim();if(!t)i.description=String(i.description??"").trim();return i}focusHeaderCenterElement(e){this.elementFocusService.setFocus(e);queueMicrotask(()=>{this.elementFocusService.setFocus(e)})}cloneHeaderCenterSourceModel(e){return F(e)}syncSelectionContext(){const e=`__table.${String(this.model()?.name??"table").trim()||"table"}`;if(!this.selectionEnabled()){this.dataService.setValue(`${e}.selectedItems`,[]);this.dataService.setValue(`${e}.selectedKeys`,[]);this.dataService.setValue(`${e}.selectedRows`,[]);this.dataService.setValue(`${e}.selectedCount`,0);this.dataService.setValue("__table.selectedItems",[]);this.dataService.setValue("__table.selectedKeys",[]);this.dataService.setValue("__table.selectedRows",[]);this.dataService.setValue("__table.selectedCount",0);this.syncSelectedRowContext();return}const t=this.resolveSelectionState();this.dataService.setValue(`${e}.selectedItems`,t.selectedItems);this.dataService.setValue(`${e}.selectedKeys`,t.selectedKeys);this.dataService.setValue(`${e}.selectedRows`,t.selectedRows);this.dataService.setValue(`${e}.selectedCount`,t.selectedRows.length);this.dataService.setValue("__table.selectedItems",t.selectedItems);this.dataService.setValue("__table.selectedKeys",t.selectedKeys);this.dataService.setValue("__table.selectedRows",t.selectedRows);this.dataService.setValue("__table.selectedCount",t.selectedRows.length);this.syncSelectedRowContext()}syncActiveRowContext(){const e=`__table.${String(this.model()?.name??"table").trim()||"table"}`;const t=this.activeRowKey();if(!t){this.dataService.setValue(`${e}.activeRowKey`,null);this.dataService.setValue(`${e}.activeRow`,null);this.dataService.setValue("__table.activeRowKey",null);this.dataService.setValue("__table.activeRow",null);this.syncSelectedRowContext();return}const n=this.rows().find((a,o)=>this.resolveRowSelectionKey(a,o)===t)??null;this.dataService.setValue(`${e}.activeRowKey`,t);this.dataService.setValue(`${e}.activeRow`,n);this.dataService.setValue("__table.activeRowKey",t);this.dataService.setValue("__table.activeRow",n);this.syncSelectedRowContext()}syncSelectedRowContext(){const e=`__table.${String(this.model()?.name??"table").trim()||"table"}`;const t=this.resolveSelectedRowKey();const n=this.rows();const a=t?n.findIndex((r,i)=>this.resolveRowSelectionKey(r,i)===t):-1;const o=a>=0?n[a]??null:null;[e,"__table"].forEach(r=>{this.dataService.setValue(`${r}.selectedRow`,o);this.dataService.setValue(`${r}.selectedRowKey`,o?t:null);this.dataService.setValue(`${r}.selectedRowIndex`,o?a:-1)})}resolveSelectedRowKey(){if(this.selectionEnabled()){const e=this.selectedRowKeys()[0];if(e)return e}return this.activeRowKey()??this.clickedRowKey()}static ɵfac=h.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:re,deps:[],target:h.ɵɵFactoryTarget.Component});static ɵcmp=h.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"22.2.1",type:re,isStandalone:true,selector:"table-element",inputs:{model:{classPropertyName:"model",publicName:"model",isSignal:true,isRequired:true,transformFunction:null}},host:{listeners:{"document:click":"closeActionMenu()","window:scroll":"onWindowScroll()","window:resize":"onWindowResize()"}},viewQueries:[{propertyName:"tableShellRef",first:true,predicate:["tableShellRef"],descendants:true,isSignal:true},{propertyName:"stickyHeaderRef",first:true,predicate:["stickyHeaderRef"],descendants:true,isSignal:true},{propertyName:"tableScrollerRef",first:true,predicate:["tableScrollerRef"],descendants:true,isSignal:true},{propertyName:"mainHeaderRowRef",first:true,predicate:["mainHeaderRowRef"],descendants:true,isSignal:true}],ngImport:h,template:"<element-wrapper [model]=\"model()\">\n @if (templateCss()) {\n <nvb-style-outlet\n [cssText]=\"templateCss()\"\n [renderInPlace]=\"true\"\n [styleKey]=\"styleOutletKey()\"\n ></nvb-style-outlet>\n }\n <div\n #tableShellRef\n class=\"nvb-table-shell\"\n [class.nvb-table-shell--editor]=\"isEditor()\"\n [class.nvb-table-shell--sticky-header]=\"stickyHeaderEnabled()\"\n [style.--nvb-table-sticky-header-offset]=\"stickyHeaderActiveOffset() + 'px'\"\n [attr.aria-busy]=\"loading()\"\n >\n @if (\n stickyHeaderEnabled() ||\n showToolbar() ||\n (detailedSearchEnabled() && showDetailedSearchPanel())\n ) {\n <div\n #stickyHeaderRef\n class=\"nvb-table-sticky-header\"\n [class.nvb-table-sticky-header--enabled]=\"stickyHeaderEnabled()\"\n [class.nvb-table-sticky-header--pinned]=\"stickyHeaderPinned()\"\n >\n @if (showToolbar()) {\n <div\n class=\"nvb-table-toolbar\"\n role=\"toolbar\"\n [class.nvb-table-toolbar--flat]=\"flatHeaderSurface()\"\n [attr.aria-label]=\"'table.toolbar.label' | uiT: 'Table actions'\"\n >\n <div class=\"nvb-table-toolbar__left\">\n @if (quickSearchEnabled()) {\n <div\n class=\"nvb-table-quick-search\"\n role=\"search\"\n [attr.aria-label]=\"'table.search.quick' | uiT: 'Quick search'\"\n >\n <button\n type=\"button\"\n class=\"nvb-table-quick-search__apply\"\n (click)=\"applyQuickSearch()\"\n [attr.data-testid]=\"tid('search-apply')\"\n [attr.aria-label]=\"'table.search.apply' | uiT: 'Search'\"\n >\n <span class=\"material-symbols-outlined\">search</span>\n </button>\n <input\n type=\"text\"\n [ngModel]=\"quickSearchDraft()\"\n (ngModelChange)=\"onQuickSearchValueChange($event)\"\n (keydown.enter)=\"applyQuickSearch(); $event.preventDefault()\"\n [attr.data-testid]=\"tid('search')\"\n [placeholder]=\"quickSearchPlaceholder() | uiT: quickSearchPlaceholder()\"\n [attr.aria-label]=\"quickSearchPlaceholder() | uiT: quickSearchPlaceholder()\"\n />\n @if (quickSearchDraft() || quickSearchTerm()) {\n <button\n type=\"button\"\n class=\"nvb-table-quick-search__clear\"\n (click)=\"clearQuickSearch()\"\n [attr.data-testid]=\"tid('search-clear')\"\n [attr.aria-label]=\"'table.search.clearQuick' | uiT: 'Clear quick search'\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n }\n </div>\n }\n\n @if (detailedSearchEnabled()) {\n <button\n type=\"button\"\n class=\"nvb-table-toolbar__button nvb-table-toolbar__button--detailed-toggle\"\n (click)=\"toggleDetailedSearch()\"\n [attr.data-testid]=\"tid('filters-toggle')\"\n [attr.aria-expanded]=\"showDetailedSearchPanel()\"\n >\n <span class=\"material-symbols-outlined\">tune</span>\n <span>\n {{\n showDetailedSearchPanel()\n ? ('table.search.hideDetailed' | uiT: 'Hide detailed search')\n : ('table.search.showDetailed' | uiT: 'Detailed search')\n }}\n </span>\n @if (detailedFiltersCount() > 0) {\n <span class=\"nvb-table-toolbar__badge\">{{ detailedFiltersCount() }}</span>\n }\n </button>\n }\n\n @if (showHeaderCenterInLeft()) {\n <ng-container [ngTemplateOutlet]=\"headerCenterControlsTemplate\"></ng-container>\n }\n\n @if (renderHeaderActionsAtStart()) {\n <ng-container [ngTemplateOutlet]=\"headerActionsTemplate\"></ng-container>\n }\n </div>\n\n @if (showHeaderCenterArea()) {\n <div\n class=\"nvb-table-toolbar__center\"\n [class.nvb-table-toolbar__center--controls-only]=\"\n !hasCustomHeaderTemplate() && showHeaderCenterInCenter()\n \"\n >\n @if (hasCustomHeaderTemplate()) {\n <div [attr.data-testid]=\"tid('header-template')\"\n class=\"nvb-table-toolbar__custom\"\n [attr.data-nvb-template-scope]=\"templateScopeId\"\n [innerHTML]=\"customHeaderTemplateHtml()\"\n (click)=\"onHeaderTemplateClick($event)\"\n ></div>\n }\n\n @if (showHeaderCenterInCenter()) {\n <ng-container [ngTemplateOutlet]=\"headerCenterControlsTemplate\"></ng-container>\n }\n\n @if (renderHeaderActionsAtCenter()) {\n <ng-container [ngTemplateOutlet]=\"headerActionsTemplate\"></ng-container>\n }\n </div>\n }\n\n <div class=\"nvb-table-toolbar__right\">\n @if (columnSettingsEnabled()) {\n <button [attr.data-testid]=\"tid('column-settings')\"\n type=\"button\"\n class=\"nvb-table-toolbar__button nvb-table-toolbar__button--icon-only\"\n (click)=\"openColumnSettings()\"\n [attr.aria-expanded]=\"openColumnSettingsDialog()\"\n [attr.aria-label]=\"'table.columns.settings.button' | uiT: 'Column settings'\"\n [attr.title]=\"'table.columns.settings.button' | uiT: 'Column settings'\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"settings\"></nvb-icon>\n </button>\n }\n\n @if (exportEnabled()) {\n <div class=\"nvb-table-export\">\n <button\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n [disabled]=\"exportBusy()\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"openExportDialog()\"\n (click)=\"toggleExportMenu($event)\"\n [attr.data-testid]=\"tid('export-open')\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"upload\"></nvb-icon>\n <span>{{ 'table.export.open' | uiT: 'Export' }}</span>\n </button>\n </div>\n }\n\n @if (showHeaderCenterInRight()) {\n <ng-container [ngTemplateOutlet]=\"headerCenterControlsTemplate\"></ng-container>\n }\n\n @if (renderHeaderActionsAtEnd()) {\n <ng-container [ngTemplateOutlet]=\"headerActionsTemplate\"></ng-container>\n }\n </div>\n </div>\n\n <ng-template #headerCenterControlsTemplate>\n <div\n class=\"nvb-table-toolbar__dropzone\"\n [class.nvb-table-toolbar__dropzone--left]=\"headerCenterElementsPosition() === 'left'\"\n [class.nvb-table-toolbar__dropzone--center]=\"headerCenterElementsPosition() === 'center'\"\n [class.nvb-table-toolbar__dropzone--right]=\"headerCenterElementsPosition() === 'right'\"\n >\n @if (isEditor()) {\n <div [attr.data-testid]=\"tid('header-add-element')\" class=\"nvb-table-toolbar__add-element\" (click)=\"$event.stopPropagation()\">\n <button [attr.data-testid]=\"tid('header-add-element-toggle')\"\n type=\"button\"\n class=\"nvb-table-toolbar__button nvb-table-toolbar__button--add-element\"\n (click)=\"toggleHeaderCenterAddMenu($event)\"\n [attr.aria-expanded]=\"headerCenterAddMenuOpen()\"\n [attr.aria-label]=\"'table.header.addElement' | uiT: 'Add element'\"\n [title]=\"'table.header.addElement' | uiT: 'Add element'\"\n >\n <span class=\"material-symbols-outlined\">add</span>\n </button>\n\n @if (headerCenterAddMenuOpen()) {\n <div\n class=\"nvb-table-toolbar__add-menu\"\n [style.top.px]=\"headerAddMenuPosition()?.top\"\n [style.left.px]=\"headerAddMenuPosition()?.left\"\n [style.max-height.px]=\"headerAddMenuPosition()?.maxHeight\"\n >\n @for (option of headerCenterAddOptions; track option.type; let tidIndex1 = $index) {\n <button [attr.data-testid]=\"tid('add-menu-item', tidIndex1)\"\n type=\"button\"\n class=\"nvb-table-toolbar__add-menu-item\"\n (click)=\"addHeaderCenterElementByType(option.type, $event)\"\n >\n {{ option.labelKey | uiT: option.fallbackLabel }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (hasHeaderCenterElements()) {\n <div class=\"nvb-table-toolbar__drop-items\">\n @for (headerElement of headerCenterElements(); track headerElement.name; let tidIndex2 = $index) {\n <div\n class=\"nvb-table-toolbar__drop-item\"\n [class.nvb-table-toolbar__drop-item--editor]=\"isEditor()\"\n [class.nvb-table-toolbar__drop-item--focused]=\"\n isHeaderCenterElementFocused(headerElement.name)\n \"\n [attr.data-nvb-header-center-name]=\"headerElement.name\"\n (mousedown)=\"focusHeaderCenterElementByName(headerElement.name, $event)\"\n >\n <runtime-lazy-element-outlet [model]=\"headerElement\" />\n @if (isEditor()) {\n <button [attr.data-testid]=\"tid('remove-center-element', tidIndex2)\"\n type=\"button\"\n class=\"nvb-table-toolbar__drop-remove\"\n (click)=\"removeHeaderCenterElement(headerElement.name, $event)\"\n [attr.aria-label]=\"\n 'table.header.removeCenterElement' | uiT: 'Remove center element'\n \"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n\n <ng-template #headerActionsTemplate>\n @if (visibleHeaderActions(); as headerActions) {\n @if (headerActions.length > 0) {\n @if (renderHeaderActionsAsDropdown()) {\n <nvb-select [testId]=\"tid('header-actions-select')\"\n class=\"nvb-table-toolbar__select\"\n [ngModel]=\"headerActionDropdownValue()\"\n (ngModelChange)=\"onHeaderActionDropdownChange($event)\"\n (blur)=\"onHeaderActionDropdownBlur()\"\n [attr.aria-label]=\"headerActionsDropdownPlaceholder()\"\n >\n <option value=\"\">{{ headerActionsDropdownPlaceholder() }}</option>\n @for (option of headerActionDropdownOptions(); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </nvb-select>\n } @else {\n <div class=\"nvb-table-toolbar__actions\">\n @for (action of headerActions; track action.id || $index; let tidIndex3 = $index) {\n <button [attr.data-testid]=\"tid('run-header-action', tidIndex3)\"\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n [class.nvb-table-toolbar__button--icon-only]=\"actionHidesText(action)\"\n [attr.title]=\"resolveActionLabel(action)\"\n [attr.aria-label]=\"resolveActionLabel(action)\"\n (click)=\"runHeaderAction(action, $event)\"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon class=\"nvb-table-action-icon\" [name]=\"actionIcon\"></nvb-icon>\n }\n @if (!actionHidesText(action)) {\n <span>{{ resolveActionLabel(action) }}</span>\n }\n </button>\n }\n </div>\n }\n }\n }\n </ng-template>\n }\n\n @if (detailedSearchEnabled() && showDetailedSearchPanel()) {\n <div class=\"nvb-table-detailed-search\" [attr.data-testid]=\"tid('filters')\">\n <div class=\"nvb-table-detailed-search__rows\">\n @for (filter of detailedFilters(); track filter.id; let filterIndex = $index) {\n <div\n class=\"nvb-table-detailed-search__row\"\n [attr.data-testid]=\"tid('filter', filterIndex)\"\n >\n <nvb-select\n [ngModel]=\"filter.key\"\n (ngModelChange)=\"updateDetailedFilterKey(filter.id, $event)\"\n [attr.data-testid]=\"tid('filter-field', filterIndex)\"\n [attr.aria-label]=\"'table.search.field' | uiT: 'Field'\"\n >\n @for (column of dataColumns(); track column.id || column.key) {\n <option [value]=\"column.key\">{{ resolveColumnLabel(column) }}</option>\n }\n </nvb-select>\n\n <nvb-select\n [ngModel]=\"filter.operator\"\n (ngModelChange)=\"updateDetailedFilterOperator(filter.id, $event)\"\n [attr.data-testid]=\"tid('filter-operator', filterIndex)\"\n [attr.aria-label]=\"'table.search.operator' | uiT: 'Operator'\"\n >\n @for (operator of getFilterOperators(filter); track operator.value) {\n <option [value]=\"operator.value\">\n {{ operator.label | uiT: operator.value }}\n </option>\n }\n </nvb-select>\n\n @if (isSelectFilter(filter)) {\n <nvb-select\n [ngModel]=\"filter.value\"\n (ngModelChange)=\"updateDetailedFilterValue(filter.id, $event)\"\n [attr.data-testid]=\"tid('filter-value', filterIndex)\"\n [attr.aria-label]=\"'table.search.value' | uiT: 'Value'\"\n >\n <option value=\"\">\n {{\n resolveDetailedFilterOptions(filter).length > 0\n ? ('table.search.value' | uiT: 'Value')\n : ('table.search.emptyOptions' | uiT: 'No options')\n }}\n </option>\n @for (option of resolveDetailedFilterOptions(filter); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </nvb-select>\n } @else if (isMultiSelectFilter(filter)) {\n <div [attr.data-testid]=\"tid('multi-select', filterIndex)\"\n class=\"nvb-table-detailed-search__multi-select\"\n (click)=\"$event.stopPropagation()\"\n >\n <button [attr.data-testid]=\"tid('value', filterIndex)\"\n type=\"button\"\n class=\"nvb-table-detailed-search__multi-select-trigger\"\n [attr.aria-label]=\"'table.search.value' | uiT: 'Value'\"\n [attr.aria-expanded]=\"isDetailedFilterMultiSelectOpen(filter.id)\"\n (click)=\"toggleDetailedFilterMultiSelectMenu(filter.id, $event)\"\n >\n @if (hasDetailedFilterSelectedOptions(filter)) {\n <span>{{ resolveDetailedFilterMultiSelectLabel(filter) }}</span>\n } @else {\n <span class=\"nvb-table-detailed-search__multi-select-placeholder\">{{\n resolveDetailedFilterOptions(filter).length > 0\n ? ('table.search.value' | uiT: 'Value')\n : ('table.search.emptyOptions' | uiT: 'No options')\n }}</span>\n }\n <span class=\"material-symbols-outlined\">\n {{\n isDetailedFilterMultiSelectOpen(filter.id)\n ? 'expand_less'\n : 'expand_more'\n }}\n </span>\n </button>\n\n @if (isDetailedFilterMultiSelectOpen(filter.id)) {\n <div class=\"nvb-table-detailed-search__multi-select-menu\">\n @if (resolveDetailedFilterOptions(filter).length === 0) {\n <div class=\"nvb-table-detailed-search__multi-select-empty\">\n {{ 'table.search.emptyOptions' | uiT: 'No options' }}\n </div>\n } @else {\n @for (\n option of resolveDetailedFilterOptions(filter);\n track option.value\n ; let tidIndex4 = $index) {\n <label class=\"nvb-table-detailed-search__multi-select-option\">\n <input [attr.data-testid]=\"tid('checkbox-input', filterIndex, tidIndex4)\"\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"isFilterOptionSelected(filter, option.value)\"\n (change)=\"\n onDetailedFilterMultiSelectOptionToggle(\n filter.id,\n option.value,\n $any($event.target).checked\n )\n \"\n />\n <span>{{ option.label }}</span>\n </label>\n }\n }\n </div>\n }\n </div>\n } @else if (isToggleFilter(filter)) {\n <label\n class=\"nvb-table-detailed-search__toggle nvb-table-interactive-control nvb-table-interactive-control--toggle nvb-toggle-switch\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input', filterIndex)\"\n type=\"checkbox\"\n class=\"nvb-toggle-switch__input\"\n [checked]=\"isToggleFilterValueTrue(filter)\"\n (change)=\"\n updateDetailedToggleFilterValue(\n filter.id,\n $any($event.target).checked\n )\n \"\n />\n <span class=\"nvb-toggle-switch__track\">\n <span class=\"nvb-toggle-switch__thumb\"></span>\n </span>\n <span>{{ filterValueAsString(filter.value) }}</span>\n </label>\n } @else if (isCheckboxFilter(filter) || isBooleanFilter(filter)) {\n <label class=\"nvb-table-detailed-search__boolean-toggle\">\n <input [attr.data-testid]=\"tid('checkbox-input-2', filterIndex)\"\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"isFilterValueTrue(filter)\"\n (change)=\"\n updateDetailedFilterValue(\n filter.id,\n $any($event.target).checked ? 'true' : 'false'\n )\n \"\n />\n <span>{{\n isFilterValueTrue(filter)\n ? ('table.search.boolean.true' | uiT: 'True')\n : ('table.search.boolean.false' | uiT: 'False')\n }}</span>\n </label>\n } @else if (isNumericFilter(filter)) {\n <input\n type=\"number\"\n [ngModel]=\"filter.value\"\n (ngModelChange)=\"updateDetailedFilterValue(filter.id, $event)\"\n [attr.data-testid]=\"tid('filter-value', filterIndex)\"\n [placeholder]=\"'table.search.value' | uiT: 'Value'\"\n [attr.aria-label]=\"'table.search.value' | uiT: 'Value'\"\n />\n } @else if (isDateFilter(filter)) {\n <div [attr.data-testid]=\"tid('date', filterIndex)\" class=\"nvb-table-detailed-search__date\" (click)=\"$event.stopPropagation()\">\n <button [attr.data-testid]=\"tid('value-2', filterIndex)\"\n type=\"button\"\n class=\"nvb-table-detailed-search__date-trigger\"\n [attr.aria-label]=\"'table.search.value' | uiT: 'Value'\"\n [attr.aria-expanded]=\"isDetailedFilterDatePickerOpen(filter.id)\"\n (click)=\"toggleDetailedFilterDatePicker(filter, $event)\"\n >\n @if (resolveDetailedFilterDateLabel(filter)) {\n <span>{{ resolveDetailedFilterDateLabel(filter) }}</span>\n } @else {\n <span class=\"nvb-table-detailed-search__date-placeholder\">0000-00-00</span>\n }\n <span class=\"material-symbols-outlined\">calendar_month</span>\n </button>\n\n @if (isDetailedFilterDatePickerOpen(filter.id)) {\n <div class=\"nvb-table-detailed-search__date-menu\">\n <div class=\"nvb-table-detailed-search__date-header\">\n <button [attr.data-testid]=\"tid('previous-detailed-filter-date-month', filterIndex)\" type=\"button\" (click)=\"previousDetailedFilterDateMonth($event)\">\n <span class=\"material-symbols-outlined\">chevron_left</span>\n </button>\n <span>{{ resolveDetailedFilterDateMonthLabel() }}</span>\n <button [attr.data-testid]=\"tid('next-detailed-filter-date-month', filterIndex)\" type=\"button\" (click)=\"nextDetailedFilterDateMonth($event)\">\n <span class=\"material-symbols-outlined\">chevron_right</span>\n </button>\n </div>\n\n <div class=\"nvb-table-detailed-search__date-weekdays\">\n @for (\n weekday of resolveDetailedFilterDateWeekdays();\n track weekday + $index\n ) {\n <span>{{ weekday }}</span>\n }\n </div>\n\n <div class=\"nvb-table-detailed-search__date-days\">\n @for (day of resolveDetailedFilterDateDays(filter); track day.key; let tidIndex5 = $index) {\n <button [attr.data-testid]=\"tid('date-day', filterIndex, tidIndex5)\"\n type=\"button\"\n class=\"nvb-table-detailed-search__date-day\"\n [class.nvb-table-detailed-search__date-day--outside]=\"day.outsideMonth\"\n [class.nvb-table-detailed-search__date-day--today]=\"day.isToday\"\n [class.nvb-table-detailed-search__date-day--selected]=\"day.isSelected\"\n (click)=\"selectDetailedFilterDate(filter.id, day.iso, $event)\"\n >\n {{ day.day }}\n </button>\n }\n </div>\n\n <div class=\"nvb-table-detailed-search__date-actions\">\n <button [attr.data-testid]=\"tid('clear-detailed-filter-date', filterIndex)\"\n type=\"button\"\n (click)=\"clearDetailedFilterDate(filter.id, $event)\"\n >\n {{ 'datePicker.clear' | uiT: 'Isvalyti' }}\n </button>\n </div>\n </div>\n }\n </div>\n } @else if (isDateTimeFilter(filter)) {\n <input\n type=\"datetime-local\"\n [ngModel]=\"filter.value\"\n (ngModelChange)=\"updateDetailedFilterValue(filter.id, $event)\"\n [attr.data-testid]=\"tid('filter-value', filterIndex)\"\n [attr.aria-label]=\"'table.search.value' | uiT: 'Value'\"\n />\n } @else {\n <input\n type=\"text\"\n [ngModel]=\"filter.value\"\n (ngModelChange)=\"updateDetailedFilterValue(filter.id, $event)\"\n [attr.data-testid]=\"tid('filter-value', filterIndex)\"\n [placeholder]=\"'table.search.value' | uiT: 'Value'\"\n [attr.aria-label]=\"'table.search.value' | uiT: 'Value'\"\n />\n }\n\n <button\n type=\"button\"\n class=\"nvb-table-detailed-search__remove\"\n (click)=\"removeDetailedFilter(filter.id)\"\n [attr.data-testid]=\"tid('filter-remove', filterIndex)\"\n [attr.aria-label]=\"'table.search.removeFilter' | uiT: 'Remove filter'\"\n >\n <span class=\"material-symbols-outlined\">delete</span>\n </button>\n </div>\n }\n </div>\n\n <div class=\"nvb-table-detailed-search__actions\">\n <button\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n (click)=\"addDetailedFilter()\"\n [attr.data-testid]=\"tid('filter-add')\"\n >\n <span class=\"material-symbols-outlined\">add</span>\n <span>{{ 'table.search.addFilter' | uiT: 'Add filter' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n (click)=\"clearDetailedSearch()\"\n [attr.data-testid]=\"tid('filters-clear')\"\n >\n <span class=\"material-symbols-outlined\">ink_eraser</span>\n <span>{{ 'table.search.clear' | uiT: 'Clear' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"nvb-table-toolbar__button nvb-table-toolbar__button--primary\"\n (click)=\"applyDetailedSearch()\"\n [attr.data-testid]=\"tid('filters-apply')\"\n >\n <span class=\"material-symbols-outlined\">check</span>\n <span>{{ 'table.search.apply' | uiT: 'Apply' }}</span>\n </button>\n @if (savedFiltersEnabled()) {\n <button [attr.data-testid]=\"tid('open-saved-filters')\" type=\"button\" class=\"nvb-table-toolbar__button\" (click)=\"openSavedFilters()\">\n <span class=\"material-symbols-outlined\">bookmark</span>\n <span>{{ 'table.search.saved' | uiT: 'Saved filters' }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n @if (stickyHeaderCloneVisible()) {\n <div class=\"nvb-table-sticky-clone\">\n <div class=\"nvb-table-sticky-clone__viewport\">\n <table\n class=\"nvb-table nvb-table-sticky-clone__table\"\n [class.nvb-table--grid]=\"tableStyle() === 'grid'\"\n [class.nvb-table--striped]=\"tableStyle() === 'striped'\"\n [style.width.px]=\"stickyHeaderTableWidth() || null\"\n [style.transform]=\"'translateX(' + -stickyHeaderScrollLeft() + 'px)'\"\n >\n <thead>\n <tr class=\"nvb-table-sticky-clone__row\">\n @if (showExpandChevronColumn()) {\n <th\n class=\"nvb-expand-column\"\n [style.width.px]=\"stickyHeaderCellWidthAt(0)\"\n [style.min-width.px]=\"stickyHeaderCellWidthAt(0)\"\n ></th>\n }\n @if (selectionEnabled()) {\n <th\n class=\"nvb-select-column\"\n [style.width.px]=\"\n stickyHeaderCellWidthAt(showExpandChevronColumn() ? 1 : 0)\n \"\n [style.min-width.px]=\"\n stickyHeaderCellWidthAt(showExpandChevronColumn() ? 1 : 0)\n \"\n >\n <input [attr.data-testid]=\"tid('sticky-select-all')\"\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"allVisibleSelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectAllVisible($event)\"\n [attr.aria-label]=\"\n model().selectAllLabel || ('table.selectAll' | uiT: 'Select all')\n \"\n />\n </th>\n }\n\n @for (\n column of dataColumns();\n track column.id || column.key;\n let columnIndex = $index\n ) {\n <th [attr.data-testid]=\"tid('column-header', columnIndex)\"\n [class]=\"columnAlignClass(column)\"\n [class.nvb-sortable]=\"column.sortable\"\n [class.nvb-sorted-active]=\"isSortedColumn(column)\"\n [style.width.px]=\"\n stickyHeaderCellWidthAt(stickyHeaderDataColumnStartIndex() + columnIndex)\n \"\n [style.min-width.px]=\"\n stickyHeaderCellWidthAt(stickyHeaderDataColumnStartIndex() + columnIndex)\n \"\n (click)=\"onColumnHeaderClick(column, columnIndex, $event)\"\n >\n @if (showColumnHeaderLabel(column)) {\n <span>{{ resolveColumnLabel(column) }}</span>\n }\n @if (column.sortable) {\n <span\n class=\"material-symbols-outlined nvb-sort-icon\"\n [class.nvb-sort-icon--active]=\"isSortedColumn(column)\"\n >\n {{ sortIndicator(column) }}\n </span>\n }\n </th>\n }\n\n @if (hasRowActions()) {\n <th\n class=\"nvb-action-column\"\n [style.width.px]=\"stickyHeaderCellWidthAt(stickyHeaderActionColumnIndex())\"\n [style.min-width.px]=\"\n stickyHeaderCellWidthAt(stickyHeaderActionColumnIndex())\n \"\n >\n <div class=\"nvb-action-header\">\n @if (showActionsHeaderLabel()) {\n <span class=\"nvb-action-header__label\">{{\n model().actionsLabel || ('table.actions' | uiT: 'Actions')\n }}</span>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n </table>\n </div>\n </div>\n }\n </div>\n }\n\n <div\n class=\"nvb-table-frame\"\n [class.nvb-table-frame--with-toolbar]=\"showToolbar() && !flatHeaderSurface()\"\n [class.nvb-table-frame--with-paginator]=\"model().paginator && !flatFooterSurface()\"\n [class.nvb-table-frame--with-detail-panel]=\"activeExpandedPanelContext() !== null\"\n >\n <div\n #tableScrollerRef\n class=\"nvb-table-frame__scroller\"\n [class.nvb-table-frame__scroller--virtual]=\"virtualScrollEnabled()\"\n [style.max-height.px]=\"virtualScrollEnabled() ? virtualScrollViewportHeight() : null\"\n (scroll)=\"onTableScroll($event)\"\n >\n <table\n class=\"nvb-table\"\n [class.nvb-table--auto-stack]=\"model().responsiveMode === 'auto'\"\n [class.nvb-table--force-stack]=\"model().responsiveMode === 'stack'\"\n [class.nvb-table--grid]=\"tableStyle() === 'grid'\"\n [class.nvb-table--striped]=\"tableStyle() === 'striped'\"\n [class.nvb-table--row-hover]=\"rowHoverEnabled()\"\n [class.nvb-table--sticky-header]=\"stickyHeaderEnabled()\"\n [class.nvb-table--virtual-scroll]=\"virtualScrollEnabled()\"\n [attr.data-testid]=\"tid('root')\"\n >\n <thead>\n <tr #mainHeaderRowRef>\n @if (showExpandChevronColumn()) {\n <th class=\"nvb-expand-column\"></th>\n }\n @if (selectionEnabled()) {\n <th class=\"nvb-select-column\">\n <input\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"allVisibleSelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectAllVisible($event)\"\n [attr.data-testid]=\"tid('select-all')\"\n [attr.aria-label]=\"\n model().selectAllLabel || ('table.selectAll' | uiT: 'Select all')\n \"\n />\n </th>\n }\n\n @for (\n column of dataColumns();\n track column.id || column.key;\n let columnIndex = $index\n ) {\n <th\n [class]=\"columnAlignClass(column)\"\n [class.nvb-sortable]=\"column.sortable\"\n [class.nvb-column-focused]=\"isColumnFocused(column, columnIndex)\"\n [class.nvb-sorted-active]=\"isSortedColumn(column)\"\n [style.width]=\"columnWidthStyle(column)\"\n [tabIndex]=\"isEditor() ? 0 : -1\"\n (focus)=\"onColumnHeaderFocus(column, columnIndex)\"\n (click)=\"onColumnHeaderClick(column, columnIndex, $event)\"\n [attr.data-testid]=\"tid('header', columnTestToken(column, columnIndex))\"\n >\n @if (showColumnHeaderLabel(column)) {\n <span>{{ resolveColumnLabel(column) }}</span>\n }\n @if (column.sortable) {\n <span\n class=\"material-symbols-outlined nvb-sort-icon\"\n [class.nvb-sort-icon--active]=\"isSortedColumn(column)\"\n >\n {{ sortIndicator(column) }}\n </span>\n }\n </th>\n }\n @if (hasRowActions()) {\n <th class=\"nvb-action-column\">\n <div class=\"nvb-action-header\">\n @if (showActionsHeaderLabel()) {\n <span class=\"nvb-action-header__label\">{{\n model().actionsLabel || ('table.actions' | uiT: 'Actions')\n }}</span>\n }\n\n @if (hasSelectionActions() && selectedRowsCount() > 0) {\n @if (visibleSelectionActions(); as selectionActions) {\n @if (selectionActions.length > 0) {\n <div class=\"nvb-selection-actions\">\n <button [attr.data-testid]=\"tid('selection-actions-toggle')\"\n type=\"button\"\n class=\"nvb-selection-actions__toggle\"\n (click)=\"toggleSelectionActionMenu(selectionActions.length, $event)\"\n [attr.aria-label]=\"\n selectionActionsLabel() | uiT: selectionActionsLabel()\n \"\n >\n <span class=\"material-symbols-outlined\">checklist</span>\n <span class=\"nvb-selection-actions__count\">{{\n selectedRowsCount()\n }}</span>\n </button>\n\n @if (openSelectionActionMenu()) {\n <div [attr.data-testid]=\"tid('selection-actions-menu')\"\n class=\"nvb-selection-actions__menu\"\n [class.nvb-selection-actions__menu--top]=\"\n selectionActionMenuPosition() === 'top'\n \"\n [ngStyle]=\"selectionActionMenuStyle()\"\n (click)=\"$event.stopPropagation()\"\n >\n @for (action of selectionActions; track action.id || $index; let tidIndex6 = $index) {\n <button [attr.data-testid]=\"tid('run-selection-action', tidIndex6)\"\n type=\"button\"\n (click)=\"runSelectionAction(action, $event)\"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon\n class=\"nvb-table-action-icon\"\n [name]=\"actionIcon\"\n ></nvb-icon>\n }\n <span>{{ resolveActionLabel(action) }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n }\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialSkeleton()) {\n @for (rowIndex of initialSkeletonRows(); track rowIndex) {\n <tr\n class=\"nvb-table-skeleton__row\"\n aria-hidden=\"true\"\n [attr.data-testid]=\"tid('skeleton-row', rowIndex)\"\n >\n @if (showExpandChevronColumn()) {\n <td class=\"nvb-expand-cell\">\n <span class=\"nvb-table-skeleton__dot\"></span>\n </td>\n }\n @if (selectionEnabled()) {\n <td class=\"nvb-select-cell\">\n <span class=\"nvb-table-skeleton__dot\"></span>\n </td>\n }\n @for (\n column of dataColumns();\n track column.id || column.key;\n let columnIndex = $index\n ) {\n <td [class]=\"columnAlignClass(column)\">\n <span\n class=\"nvb-table-skeleton__line\"\n [style.width]=\"initialSkeletonCellWidth(rowIndex, columnIndex)\"\n ></span>\n </td>\n }\n @if (hasRowActions()) {\n <td class=\"nvb-action-cell\">\n <span class=\"nvb-table-skeleton__dot nvb-table-skeleton__dot--action\"></span>\n </td>\n }\n </tr>\n }\n } @else {\n @if (!loading() && visibleRows().length === 0) {\n <tr>\n <td\n class=\"nvb-empty-cell\"\n [attr.data-testid]=\"tid('empty')\"\n [attr.colspan]=\"\n dataColumns().length +\n (hasRowActions() ? 1 : 0) +\n (selectionEnabled() ? 1 : 0) +\n (showExpandChevronColumn() ? 1 : 0)\n \"\n >\n {{ model().emptyMessage || ('table.empty' | uiT: 'No data') }}\n </td>\n </tr>\n @if (expandedUsesInline() && editorExpandedPreviewContext(); as expandedContext) {\n <tr\n class=\"nvb-table-expanded-inline-row nvb-table-expanded-inline-row--preview\"\n [attr.data-row-key]=\"expandedContext.key\"\n >\n <td\n class=\"nvb-table-expanded-inline-row__cell\"\n [attr.colspan]=\"expandedInlineColspan()\"\n >\n <div class=\"nvb-table-expanded-inline-row__content\">\n <ng-container\n [ngTemplateOutlet]=\"expandedContentTemplate\"\n [ngTemplateOutletContext]=\"{ expandedContext: expandedContext }\"\n />\n </div>\n </td>\n </tr>\n }\n }\n\n @if (virtualScrollEnabled() && virtualTopSpacerHeight() > 0) {\n <tr class=\"nvb-table-virtual-spacer-row\" aria-hidden=\"true\">\n <td\n class=\"nvb-table-virtual-spacer-cell\"\n [attr.colspan]=\"expandedInlineColspan()\"\n [style.height.px]=\"virtualTopSpacerHeight()\"\n ></td>\n </tr>\n }\n\n @for (\n renderedRow of renderedRows();\n track rowTrackKey(renderedRow.row, renderedRow.visibleIndex)\n ) {\n @let row = renderedRow.row;\n @let rowIndex = renderedRow.visibleIndex;\n <tr\n [class.nvb-table__row--active]=\"isRowActive(row, rowIndex)\"\n [class.nvb-table__row--expanded]=\"isRowExpanded(row, rowIndex)\"\n [class.nvb-table__row--editing]=\"isInlineEditRow(row, rowIndex)\"\n (click)=\"onRowClick(row, rowIndex, $event)\"\n (dblclick)=\"onRowDoubleClick(row, rowIndex, $event)\"\n [attr.data-testid]=\"tid('row', rowIndex)\"\n >\n @if (showExpandChevronColumn()) {\n <td class=\"nvb-expand-cell\">\n @if (showExpandToggle(row, rowIndex)) {\n <button\n type=\"button\"\n class=\"nvb-expand-toggle\"\n [class.nvb-expand-toggle--expanded]=\"isRowExpanded(row, rowIndex)\"\n (click)=\"toggleRowExpand(row, rowIndex, $event)\"\n [attr.data-testid]=\"tid('expand', rowIndex)\"\n [attr.aria-label]=\"resolveExpandToggleLabel(row, rowIndex)\"\n [attr.aria-expanded]=\"isRowExpanded(row, rowIndex)\"\n >\n <span class=\"material-symbols-outlined\">{{\n resolveExpandToggleIcon(row, rowIndex)\n }}</span>\n </button>\n }\n </td>\n }\n @if (selectionEnabled()) {\n <td\n class=\"nvb-select-cell\"\n [attr.data-label]=\"model().selectLabel || ('table.select' | uiT: 'Select')\"\n >\n <input\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"isRowSelected(row, rowIndex)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRowSelection(row, rowIndex, $event)\"\n [attr.data-testid]=\"tid('select', rowIndex)\"\n [attr.aria-label]=\"\n model().selectRowLabel || ('table.selectRow' | uiT: 'Select row')\n \"\n />\n </td>\n }\n\n @if (rowTemplateEnabled()) {\n <td\n class=\"nvb-table-row-template-cell\"\n data-label=\"\"\n [attr.colspan]=\"rowTemplateColspan()\"\n >\n <div [attr.data-testid]=\"tid('template-content', rowIndex)\"\n class=\"nvb-table-row-template-host\"\n [attr.data-nvb-template-scope]=\"templateScopeId\"\n [innerHTML]=\"resolveRowTemplateHtml(row, rowIndex) || ''\"\n (click)=\"onTemplateContentClick($event, row, row)\"\n ></div>\n </td>\n } @else {\n @for (\n column of dataColumns();\n track column.id || column.key;\n let cellColumnIndex = $index\n ) {\n <td\n [attr.data-label]=\"resolveColumnDataLabel(column)\"\n [class]=\"columnAlignClass(column)\"\n [attr.data-testid]=\"\n tid('cell', rowIndex, columnTestToken(column, cellColumnIndex))\n \"\n >\n <div class=\"nvb-table-cell-content\">\n <div class=\"nvb-table-cell-content__value\">\n @if (isInlineEditRow(row, rowIndex) && isInlineEditableColumn(column)) {\n @switch (resolveInlineEditorType(column)) {\n @case ('textarea') {\n <textarea [attr.data-testid]=\"tid('textarea', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-inline-edit nvb-table-inline-edit--textarea\"\n rows=\"2\"\n [ngModel]=\"resolveInlineEditorValue(column)\"\n (ngModelChange)=\"updateInlineEditValue(column, $event)\"\n (click)=\"$event.stopPropagation()\"\n [placeholder]=\"resolveInlineEditorPlaceholder(column)\"\n ></textarea>\n }\n @case ('number') {\n <input [attr.data-testid]=\"tid('number-input', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-inline-edit\"\n type=\"number\"\n [ngModel]=\"resolveInlineEditorValue(column)\"\n (ngModelChange)=\"updateInlineEditValue(column, $event)\"\n (click)=\"$event.stopPropagation()\"\n [placeholder]=\"resolveInlineEditorPlaceholder(column)\"\n />\n }\n @case ('date') {\n <input [attr.data-testid]=\"tid('date-input', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-inline-edit\"\n type=\"date\"\n [ngModel]=\"resolveInlineEditorValue(column)\"\n (ngModelChange)=\"updateInlineEditValue(column, $event)\"\n (click)=\"$event.stopPropagation()\"\n [placeholder]=\"resolveInlineEditorPlaceholder(column)\"\n />\n }\n @case ('checkbox') {\n <label [attr.data-testid]=\"tid('label', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-interactive-control nvb-table-interactive-control--checkbox nvb-single-checkbox\"\n (click)=\"$event.stopPropagation()\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input', rowIndex, cellColumnIndex)\"\n class=\"nvb-single-checkbox__input nvb-control__checkbox-input\"\n type=\"checkbox\"\n [checked]=\"!!resolveInlineEditorValue(column)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"\n updateInlineEditValue(\n column,\n $any($event.target).checked,\n $event\n )\n \"\n />\n </label>\n }\n @case ('toggle') {\n <label [attr.data-testid]=\"tid('label-2', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-interactive-control nvb-table-interactive-control--toggle nvb-toggle-switch\"\n (click)=\"$event.stopPropagation()\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input-2', rowIndex, cellColumnIndex)\"\n class=\"nvb-toggle-switch__input\"\n type=\"checkbox\"\n [checked]=\"!!resolveInlineEditorValue(column)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"\n updateInlineEditValue(\n column,\n $any($event.target).checked,\n $event\n )\n \"\n />\n <span class=\"nvb-toggle-switch__track\">\n <span class=\"nvb-toggle-switch__thumb\"></span>\n </span>\n </label>\n }\n @case ('select') {\n <select [attr.data-testid]=\"tid('select', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-inline-edit\"\n [ngModel]=\"resolveInlineEditorValue(column)\"\n (ngModelChange)=\"updateInlineEditValue(column, $event)\"\n (click)=\"$event.stopPropagation()\"\n >\n <option [ngValue]=\"null\">\n {{\n resolveInlineEditorPlaceholder(column) ||\n ('table.inlineEdit.select' | uiT: 'Select')\n }}\n </option>\n @for (\n option of resolveInlineSelectOptions(column);\n track $index\n ) {\n <option [ngValue]=\"option.rawValue\">\n {{ option.label }}\n </option>\n }\n </select>\n }\n @default {\n <input [attr.data-testid]=\"tid('text-input', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-inline-edit\"\n type=\"text\"\n [ngModel]=\"resolveInlineEditorValue(column)\"\n (ngModelChange)=\"updateInlineEditValue(column, $event)\"\n (click)=\"$event.stopPropagation()\"\n [placeholder]=\"resolveInlineEditorPlaceholder(column)\"\n />\n }\n }\n } @else if (isToggleSwitchColumn(column)) {\n <label [attr.data-testid]=\"tid('label-3', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-interactive-control nvb-table-interactive-control--toggle nvb-toggle-switch\"\n [class.nvb-toggle-switch--disabled]=\"\n !isInteractiveColumnEnabled(row, column)\n \"\n (click)=\"$event.stopPropagation()\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input-3', rowIndex, cellColumnIndex)\"\n class=\"nvb-toggle-switch__input\"\n type=\"checkbox\"\n [checked]=\"resolveInteractiveColumnChecked(row, column)\"\n [disabled]=\"!isInteractiveColumnEnabled(row, column)\"\n [attr.aria-label]=\"resolveInteractiveColumnAriaLabel(column)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"onInteractiveColumnChange(row, column, $event)\"\n />\n <span class=\"nvb-toggle-switch__track\">\n <span class=\"nvb-toggle-switch__thumb\"></span>\n </span>\n </label>\n } @else if (isSingleCheckboxColumn(column)) {\n <label [attr.data-testid]=\"tid('label-4', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-interactive-control nvb-table-interactive-control--checkbox nvb-single-checkbox\"\n [class.nvb-single-checkbox--disabled]=\"\n !isInteractiveColumnEnabled(row, column)\n \"\n (click)=\"$event.stopPropagation()\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input-4', rowIndex, cellColumnIndex)\"\n class=\"nvb-single-checkbox__input nvb-control__checkbox-input\"\n type=\"checkbox\"\n [checked]=\"resolveInteractiveColumnChecked(row, column)\"\n [disabled]=\"!isInteractiveColumnEnabled(row, column)\"\n [attr.aria-label]=\"resolveInteractiveColumnAriaLabel(column)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"onInteractiveColumnChange(row, column, $event)\"\n />\n </label>\n } @else if (isElementColumn(column)) {\n @if (\n getCellElementModel(row, rowIndex, column, cellColumnIndex);\n as cellElement\n ) {\n <div [attr.data-testid]=\"tid('cell-element', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-cell-element\"\n (click)=\"onCellElementPointerEvent(column, $event)\"\n (dblclick)=\"onCellElementPointerEvent(column, $event)\"\n >\n <!-- Tracking the model itself makes the control belong to\n its row: swapping in another row's model rebuilds it\n instead of leaving the previous row's state on screen. -->\n @for (cellModel of [cellElement]; track cellModel) {\n <runtime-lazy-element-outlet [model]=\"cellModel\" />\n }\n </div>\n }\n } @else if (resolveStatusBadge(row, column); as statusBadge) {\n <span\n class=\"nvb-status-pill\"\n [class]=\"'nvb-status-pill nvb-status-pill--' + statusBadge.tone\"\n [class.nvb-status-pill--rounded]=\"statusBadge.rounded\"\n >\n @if (statusBadge.icon) {\n <nvb-icon\n class=\"nvb-status-pill__icon\"\n [name]=\"statusBadge.icon\"\n ></nvb-icon>\n }\n {{ statusBadge.label }}\n </span>\n } @else if (resolveCellHtml(row, column); as cellHtml) {\n <div [attr.data-testid]=\"tid('template-content', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-template-host\"\n [attr.data-nvb-template-scope]=\"templateScopeId\"\n [innerHTML]=\"cellHtml\"\n (click)=\"\n onTemplateContentClick($event, row, resolveCellValue(row, column))\n \"\n ></div>\n } @else {\n {{ resolveCellText(row, column) }}\n }\n </div>\n\n @if (!isInteractiveColumn(column)) {\n @if (visibleColumnCellActions(row, column); as columnActions) {\n @if (columnActions.length > 0) {\n <div [attr.data-testid]=\"tid('cell-actions', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-cell-actions\"\n [class.nvb-table-cell-actions--icon]=\"\n columnCellActionsUseIconButtons(column)\n \"\n (click)=\"$event.stopPropagation()\"\n >\n @if (columnCellActionsUseDropdown(column)) {\n <nvb-select [testId]=\"tid('select-2', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-cell-actions__select\"\n (change)=\"onColumnCellActionSelect(row, column, $event)\"\n >\n <option value=\"\">\n {{ resolveColumnCellActionsPlaceholder(column) }}\n </option>\n @for (action of columnActions; track action.id || $index) {\n <option [value]=\"'id:' + (action.id || $index)\">\n {{ resolveActionLabel(action) }}\n </option>\n }\n </nvb-select>\n } @else {\n @for (action of columnActions; track action.id || $index; let tidIndex7 = $index) {\n <button [attr.data-testid]=\"tid('run-column-cell-action', rowIndex, cellColumnIndex, tidIndex7)\"\n type=\"button\"\n class=\"nvb-table-cell-actions__button\"\n [class.nvb-table-cell-actions__button--icon-only]=\"\n columnCellActionsUseIconButtons(column) ||\n actionHidesText(action)\n \"\n [attr.title]=\"resolveActionLabel(action)\"\n [attr.aria-label]=\"resolveActionLabel(action)\"\n (click)=\"runColumnCellAction(action, row, $event, column)\"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon\n class=\"nvb-table-action-icon\"\n [name]=\"actionIcon\"\n ></nvb-icon>\n }\n @if (\n actionRendersText(\n action,\n columnCellActionsUseButtons(column)\n )\n ) {\n <span>{{ resolveActionLabel(action) }}</span>\n }\n </button>\n }\n }\n </div>\n }\n }\n }\n </div>\n </td>\n }\n }\n\n @if (hasRowActions()) {\n <td\n class=\"nvb-action-cell\"\n [attr.data-label]=\"model().actionsLabel || ('table.actions' | uiT: 'Actions')\"\n >\n @if (visibleRowActions(row); as rowActions) {\n @let rowEditing = isInlineEditRow(row, rowIndex);\n @let inlineActionsEnabled =\n inlineEditEnabled() && hasInlineEditableColumns();\n @if (inlineActionsEnabled || rowActions.length > 0) {\n <div class=\"nvb-row-actions nvb-row-actions--inline\">\n @if (inlineActionsEnabled) {\n @if (rowEditing) {\n <button [attr.data-testid]=\"tid('inline-save', rowIndex)\"\n type=\"button\"\n class=\"nvb-row-actions__inline-button\"\n [disabled]=\"isInlineEditBusy(row, rowIndex)\"\n (click)=\"saveInlineEdit(row, rowIndex, $event)\"\n >\n <span class=\"material-symbols-outlined\">save</span>\n <span>{{\n isInlineEditBusy(row, rowIndex)\n ? ('table.inlineEdit.saving' | uiT: 'Saving')\n : ('table.inlineEdit.save' | uiT: 'Save')\n }}</span>\n </button>\n <button [attr.data-testid]=\"tid('inline-cancel', rowIndex)\"\n type=\"button\"\n class=\"nvb-row-actions__inline-button\"\n [disabled]=\"isInlineEditBusy(row, rowIndex)\"\n (click)=\"cancelInlineEdit($event)\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n <span>{{ 'table.inlineEdit.cancel' | uiT: 'Cancel' }}</span>\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"nvb-row-actions__inline-button\"\n (click)=\"startInlineEdit(row, rowIndex, $event)\"\n [attr.data-testid]=\"tid('row-edit', rowIndex)\"\n >\n <span class=\"material-symbols-outlined\">edit</span>\n <span>{{ 'table.inlineEdit.edit' | uiT: 'Edit' }}</span>\n </button>\n }\n }\n\n @if (!rowEditing && rowActions.length > 0) {\n @if (rowActionsUseDropdown()) {\n <div class=\"nvb-row-actions\">\n <button\n type=\"button\"\n class=\"nvb-row-actions__toggle\"\n [class.nvb-row-actions__toggle--borderless]=\"\n rowActionsUseBorderlessDropdownToggle()\n \"\n (click)=\"toggleActionMenu(rowIndex, rowActions.length, $event)\"\n [attr.data-testid]=\"tid('row-actions', rowIndex)\"\n [attr.aria-label]=\"\n model().actionsLabel || ('table.actions' | uiT: 'Actions')\n \"\n >\n <span class=\"material-symbols-outlined\">more_vert</span>\n </button>\n\n @if (openActionMenuRow() === rowIndex) {\n <div [attr.data-testid]=\"tid('menu', rowIndex)\"\n class=\"nvb-row-actions__menu\"\n [class.nvb-row-actions__menu--top]=\"\n rowActionMenuPosition() === 'top'\n \"\n [ngStyle]=\"rowActionMenuStyle()\"\n (click)=\"$event.stopPropagation()\"\n >\n @for (\n action of rowActions;\n track action.id || $index;\n let actionIndex = $index\n ) {\n <button\n type=\"button\"\n (click)=\"runRowAction(action, row, $event)\"\n [attr.data-testid]=\"\n tid(\n 'row-action',\n rowIndex,\n actionTestToken(action, actionIndex)\n )\n \"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon\n class=\"nvb-table-action-icon\"\n [name]=\"actionIcon\"\n ></nvb-icon>\n }\n <span>{{ resolveActionLabel(action) }}</span>\n </button>\n }\n </div>\n }\n </div>\n } @else {\n @for (\n action of rowActions;\n track action.id || $index;\n let actionIndex = $index\n ) {\n <button\n type=\"button\"\n class=\"nvb-row-actions__inline-button\"\n [class.nvb-row-actions__inline-button--icon-only]=\"\n rowActionsUseIconButtons() || actionHidesText(action)\n \"\n [attr.title]=\"resolveActionLabel(action)\"\n [attr.aria-label]=\"resolveActionLabel(action)\"\n (click)=\"runRowAction(action, row, $event)\"\n [attr.data-testid]=\"\n tid('row-action', rowIndex, actionTestToken(action, actionIndex))\n \"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon\n class=\"nvb-table-action-icon\"\n [name]=\"actionIcon\"\n ></nvb-icon>\n }\n @if (actionRendersText(action, rowActionsUseButtons())) {\n <span>{{ resolveActionLabel(action) }}</span>\n }\n </button>\n }\n }\n }\n </div>\n } @else {\n <span class=\"nvb-row-actions__empty\">-</span>\n }\n }\n </td>\n }\n </tr>\n @if (expandedUsesInline() && isRowExpanded(row, rowIndex)) {\n <tr\n class=\"nvb-table-expanded-inline-row\"\n [attr.data-row-key]=\"resolveRowExpansionKey(row, rowIndex)\"\n >\n <td\n class=\"nvb-table-expanded-inline-row__cell\"\n [attr.colspan]=\"expandedInlineColspan()\"\n >\n <div class=\"nvb-table-expanded-inline-row__content\">\n <ng-container\n [ngTemplateOutlet]=\"expandedContentTemplate\"\n [ngTemplateOutletContext]=\"{\n expandedContext: {\n key: resolveRowExpansionKey(row, rowIndex),\n row: row,\n rowIndex: rowIndex,\n },\n }\"\n />\n </div>\n </td>\n </tr>\n }\n @if (\n expandedUsesInline() &&\n isEditor() &&\n rowIndex === 0 &&\n !isRowExpanded(row, rowIndex) &&\n editorExpandedPreviewContext();\n as expandedContext\n ) {\n <tr\n class=\"nvb-table-expanded-inline-row nvb-table-expanded-inline-row--preview\"\n [attr.data-row-key]=\"expandedContext.key\"\n >\n <td\n class=\"nvb-table-expanded-inline-row__cell\"\n [attr.colspan]=\"expandedInlineColspan()\"\n >\n <div class=\"nvb-table-expanded-inline-row__content\">\n <ng-container\n [ngTemplateOutlet]=\"expandedContentTemplate\"\n [ngTemplateOutletContext]=\"{ expandedContext: expandedContext }\"\n />\n </div>\n </td>\n </tr>\n }\n }\n\n @if (virtualScrollEnabled() && virtualBottomSpacerHeight() > 0) {\n <tr class=\"nvb-table-virtual-spacer-row\" aria-hidden=\"true\">\n <td\n class=\"nvb-table-virtual-spacer-cell\"\n [attr.colspan]=\"expandedInlineColspan()\"\n [style.height.px]=\"virtualBottomSpacerHeight()\"\n ></td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n <ng-template #expandedContentTemplate let-expandedContext=\"expandedContext\">\n @if (\n expansionEnabled() && isExpandedRowsLoading(expandedContext.row, expandedContext.rowIndex)\n ) {\n <div class=\"nvb-expanded-row__loading\">\n {{ resolveExpandedLoadingMessage() | uiT: 'Loading details...' }}\n </div>\n } @else if (\n resolveExpandedRowsError(expandedContext.row, expandedContext.rowIndex);\n as expandedError\n ) {\n <div class=\"nvb-expanded-row__error\">\n {{ expandedError | uiT: 'Failed to load details.' }}\n </div>\n } @else if (\n expansionEnabled() &&\n resolveExpandedTemplateHtml(expandedContext.row, expandedContext.rowIndex);\n as expandedTemplateHtml\n ) {\n <div [attr.data-testid]=\"tid('expanded-template')\"\n class=\"nvb-expanded-row__template\"\n [attr.data-nvb-template-scope]=\"templateScopeId\"\n [innerHTML]=\"expandedTemplateHtml\"\n (click)=\"\n onTemplateContentClick(\n $event,\n expandedContext.row,\n resolveExpandedRows(expandedContext.row, expandedContext.rowIndex),\n expandedContext.row\n )\n \"\n ></div>\n } @else if (\n expansionEnabled() &&\n shouldRenderExpandedNestedTable(expandedContext.row, expandedContext.rowIndex)\n ) {\n @let expandedRows = resolveExpandedRows(expandedContext.row, expandedContext.rowIndex);\n <table class=\"nvb-nested-table\">\n <thead>\n <tr>\n @for (\n column of expandedDataColumns();\n track column.id || column.key;\n let columnIndex = $index\n ) {\n <th [attr.data-testid]=\"tid('expanded-column-header', columnIndex)\"\n [class]=\"columnAlignClass(column)\"\n [class.nvb-column-focused]=\"isExpandedColumnFocused(column, columnIndex)\"\n [class.nvb-nested-table__header--focusable]=\"isEditor()\"\n [style.width]=\"columnWidthStyle(column)\"\n [tabIndex]=\"isEditor() ? 0 : -1\"\n (focus)=\"onExpandedColumnHeaderFocus(column, columnIndex)\"\n (click)=\"onExpandedColumnHeaderClick(column, columnIndex, $event)\"\n >\n @if (showColumnHeaderLabel(column)) {\n {{ resolveColumnLabel(column) }}\n }\n </th>\n }\n @if (hasExpandedRowActions()) {\n <th class=\"nvb-action-column\">\n @if (showActionsHeaderLabel()) {\n {{ model().actionsLabel || ('table.actions' | uiT: 'Actions') }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (expandedRow of expandedRows; track $index; let tidIndex8 = $index) {\n <tr>\n @for (column of expandedDataColumns(); track column.id || column.key; let tidIndex9 = $index) {\n <td\n [attr.data-label]=\"resolveColumnDataLabel(column)\"\n [class]=\"columnAlignClass(column)\"\n >\n <div class=\"nvb-table-cell-content\">\n <div class=\"nvb-table-cell-content__value\">\n @if (isToggleSwitchColumn(column)) {\n <label [attr.data-testid]=\"tid('label', tidIndex8, tidIndex9)\"\n class=\"nvb-table-interactive-control nvb-table-interactive-control--toggle nvb-toggle-switch\"\n [class.nvb-toggle-switch--disabled]=\"\n !isInteractiveColumnEnabled(\n expandedRow,\n column,\n expandedContext.row\n )\n \"\n (click)=\"$event.stopPropagation()\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input', tidIndex8, tidIndex9)\"\n class=\"nvb-toggle-switch__input\"\n type=\"checkbox\"\n [checked]=\"\n resolveInteractiveColumnChecked(\n expandedRow,\n column,\n expandedContext.row\n )\n \"\n [disabled]=\"\n !isInteractiveColumnEnabled(\n expandedRow,\n column,\n expandedContext.row\n )\n \"\n [attr.aria-label]=\"resolveInteractiveColumnAriaLabel(column)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"\n onInteractiveColumnChange(\n expandedRow,\n column,\n $event,\n expandedContext.row\n )\n \"\n />\n <span class=\"nvb-toggle-switch__track\">\n <span class=\"nvb-toggle-switch__thumb\"></span>\n </span>\n </label>\n } @else if (isSingleCheckboxColumn(column)) {\n <label [attr.data-testid]=\"tid('label-2', tidIndex8, tidIndex9)\"\n class=\"nvb-table-interactive-control nvb-table-interactive-control--checkbox nvb-single-checkbox\"\n [class.nvb-single-checkbox--disabled]=\"\n !isInteractiveColumnEnabled(\n expandedRow,\n column,\n expandedContext.row\n )\n \"\n (click)=\"$event.stopPropagation()\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input-2', tidIndex8, tidIndex9)\"\n class=\"nvb-single-checkbox__input nvb-control__checkbox-input\"\n type=\"checkbox\"\n [checked]=\"\n resolveInteractiveColumnChecked(\n expandedRow,\n column,\n expandedContext.row\n )\n \"\n [disabled]=\"\n !isInteractiveColumnEnabled(\n expandedRow,\n column,\n expandedContext.row\n )\n \"\n [attr.aria-label]=\"resolveInteractiveColumnAriaLabel(column)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"\n onInteractiveColumnChange(\n expandedRow,\n column,\n $event,\n expandedContext.row\n )\n \"\n />\n </label>\n } @else if (\n resolveStatusBadge(expandedRow, column);\n as expandedStatusBadge\n ) {\n <span\n class=\"nvb-status-pill\"\n [class]=\"'nvb-status-pill nvb-status-pill--' + expandedStatusBadge.tone\"\n [class.nvb-status-pill--rounded]=\"expandedStatusBadge.rounded\"\n >\n @if (expandedStatusBadge.icon) {\n <nvb-icon\n class=\"nvb-status-pill__icon\"\n [name]=\"expandedStatusBadge.icon\"\n ></nvb-icon>\n }\n {{ expandedStatusBadge.label }}\n </span>\n } @else if (resolveCellHtml(expandedRow, column); as expandedCellHtml) {\n <div [attr.data-testid]=\"tid('template-content', tidIndex8, tidIndex9)\"\n class=\"nvb-table-template-host\"\n [attr.data-nvb-template-scope]=\"templateScopeId\"\n [innerHTML]=\"expandedCellHtml\"\n (click)=\"\n onTemplateContentClick(\n $event,\n expandedRow,\n resolveCellValue(expandedRow, column),\n expandedContext.row\n )\n \"\n ></div>\n } @else {\n {{ resolveCellText(expandedRow, column) }}\n }\n </div>\n\n @if (!isInteractiveColumn(column)) {\n @if (\n visibleColumnCellActions(expandedRow, column, expandedContext.row);\n as columnActions\n ) {\n @if (columnActions.length > 0) {\n <div [attr.data-testid]=\"tid('div', tidIndex8, tidIndex9)\"\n class=\"nvb-table-cell-actions\"\n [class.nvb-table-cell-actions--icon]=\"\n columnCellActionsUseIconButtons(column)\n \"\n (click)=\"$event.stopPropagation()\"\n >\n @if (columnCellActionsUseDropdown(column)) {\n <nvb-select [testId]=\"tid('select', tidIndex8, tidIndex9)\"\n class=\"nvb-table-cell-actions__select\"\n (change)=\"\n onColumnCellActionSelect(\n expandedRow,\n column,\n $event,\n expandedContext.row\n )\n \"\n >\n <option value=\"\">\n {{ resolveColumnCellActionsPlaceholder(column) }}\n </option>\n @for (action of columnActions; track action.id || $index) {\n <option [value]=\"'id:' + (action.id || $index)\">\n {{ resolveActionLabel(action) }}\n </option>\n }\n </nvb-select>\n } @else {\n @for (action of columnActions; track action.id || $index; let tidIndex10 = $index) {\n <button [attr.data-testid]=\"tid('run-column-cell-action', tidIndex8, tidIndex9, tidIndex10)\"\n type=\"button\"\n class=\"nvb-table-cell-actions__button\"\n [class.nvb-table-cell-actions__button--icon-only]=\"\n columnCellActionsUseIconButtons(column) ||\n actionHidesText(action)\n \"\n [attr.title]=\"resolveActionLabel(action)\"\n [attr.aria-label]=\"resolveActionLabel(action)\"\n (click)=\"\n runColumnCellAction(\n action,\n expandedRow,\n $event,\n column,\n expandedContext.row\n )\n \"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon\n class=\"nvb-table-action-icon\"\n [name]=\"actionIcon\"\n ></nvb-icon>\n }\n @if (\n actionRendersText(\n action,\n columnCellActionsUseButtons(column)\n )\n ) {\n <span>{{ resolveActionLabel(action) }}</span>\n }\n </button>\n }\n }\n </div>\n }\n }\n }\n </div>\n </td>\n }\n @if (hasExpandedRowActions()) {\n <td class=\"nvb-action-cell\">\n @if (\n visibleExpandedRowActions(expandedContext.row, expandedRow);\n as expandedActions\n ) {\n @if (expandedActions.length > 0) {\n @if (rowActionsUseDropdown()) {\n <nvb-select [testId]=\"tid('select', tidIndex8)\"\n class=\"nvb-table-cell-actions__select\"\n (change)=\"\n onExpandedRowActionSelect(expandedContext.row, expandedRow, $event)\n \"\n >\n <option value=\"\">\n {{ resolveExpandedRowActionsPlaceholder() }}\n </option>\n @for (action of expandedActions; track action.id || $index) {\n <option [value]=\"'id:' + (action.id || $index)\">\n {{ resolveActionLabel(action) }}\n </option>\n }\n </nvb-select>\n } @else {\n <div\n class=\"nvb-expanded-row__actions\"\n [class.nvb-table-cell-actions--icon]=\"rowActionsUseIconButtons()\"\n >\n @for (action of expandedActions; track action.id || $index; let tidIndex11 = $index) {\n <button [attr.data-testid]=\"tid('action', tidIndex8, tidIndex11)\"\n type=\"button\"\n class=\"nvb-expanded-row__action\"\n [class.nvb-expanded-row__action--icon-only]=\"\n rowActionsUseIconButtons() || actionHidesText(action)\n \"\n [attr.title]=\"resolveActionLabel(action)\"\n [attr.aria-label]=\"resolveActionLabel(action)\"\n (click)=\"\n runExpandedRowAction(\n action,\n expandedContext.row,\n expandedRow,\n $event\n )\n \"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon\n class=\"nvb-table-action-icon\"\n [name]=\"actionIcon\"\n ></nvb-icon>\n }\n @if (actionRendersText(action, rowActionsUseButtons())) {\n <span>{{ resolveActionLabel(action) }}</span>\n }\n </button>\n }\n </div>\n }\n } @else {\n <span class=\"nvb-row-actions__empty\">-</span>\n }\n }\n </td>\n }\n </tr>\n }\n @if (isEditor() && expandedContext.rowIndex < 0 && expandedRows.length === 0) {\n <tr class=\"nvb-nested-table__placeholder-row\" aria-hidden=\"true\">\n @for (column of expandedDataColumns(); track column.id || column.key) {\n <td [class]=\"columnAlignClass(column)\"> </td>\n }\n @if (hasExpandedRowActions()) {\n <td class=\"nvb-action-cell\"> </td>\n }\n </tr>\n }\n </tbody>\n </table>\n } @else if (detailColumns().length > 0) {\n <div class=\"nvb-expanded-row__details\">\n @for (\n column of detailColumns();\n track column.id || column.key;\n let detailColumnIndex = $index\n ) {\n <div class=\"nvb-expanded-row__detail-item\">\n <div class=\"nvb-expanded-row__detail-label\">{{ resolveDetailLabel(column) }}</div>\n <div class=\"nvb-expanded-row__detail-value\">\n @if (isElementColumn(column)) {\n @if (\n getCellElementModel(\n expandedContext.row,\n expandedContext.rowIndex,\n column,\n detailColumnIndex,\n 'detail'\n );\n as detailCellElement\n ) {\n <div class=\"nvb-table-cell-element\">\n <!-- Same row identity as a table cell: selecting another row must\n rebuild the control, not reuse the previous row's state. -->\n @for (detailModel of [detailCellElement]; track detailModel) {\n <runtime-lazy-element-outlet [model]=\"detailModel\" />\n }\n </div>\n }\n } @else if (\n resolveStatusBadge(expandedContext.row, column);\n as detailStatusBadge\n ) {\n <span\n class=\"nvb-status-pill\"\n [class]=\"'nvb-status-pill nvb-status-pill--' + detailStatusBadge.tone\"\n [class.nvb-status-pill--rounded]=\"detailStatusBadge.rounded\"\n >\n @if (detailStatusBadge.icon) {\n <nvb-icon\n class=\"nvb-status-pill__icon\"\n [name]=\"detailStatusBadge.icon\"\n ></nvb-icon>\n }\n {{ detailStatusBadge.label }}\n </span>\n } @else if (resolveCellHtml(expandedContext.row, column); as detailCellHtml) {\n <div [attr.data-testid]=\"tid('template-content', detailColumnIndex)\"\n class=\"nvb-table-template-host\"\n [attr.data-nvb-template-scope]=\"templateScopeId\"\n [innerHTML]=\"detailCellHtml\"\n (click)=\"\n onTemplateContentClick(\n $event,\n expandedContext.row,\n resolveCellValue(expandedContext.row, column),\n expandedContext.row\n )\n \"\n ></div>\n } @else {\n {{ resolveCellText(expandedContext.row, column) }}\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"nvb-expanded-row__empty\">\n {{ resolveExpandedEmptyMessage() | uiT: 'No nested rows' }}\n </div>\n }\n </ng-template>\n\n @if (expandedUsesSidePanel() && activeExpandedPanelContext(); as expandedContext) {\n <aside class=\"nvb-table-detail-panel\" [attr.data-row-key]=\"expandedContext.key\">\n <div class=\"nvb-table-detail-panel__header\">\n <strong class=\"nvb-table-detail-panel__title\">{{\n resolveDetailsPanelTitle() | uiT: 'Detailed info'\n }}</strong>\n <button [attr.data-testid]=\"tid('close-details')\"\n type=\"button\"\n class=\"nvb-table-detail-panel__close\"\n (click)=\"closeExpandedRowPanel($event)\"\n [attr.aria-label]=\"'table.closeDetails' | uiT: 'Close details'\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n </div>\n\n <ng-container\n [ngTemplateOutlet]=\"expandedContentTemplate\"\n [ngTemplateOutletContext]=\"{ expandedContext: expandedContext }\"\n />\n </aside>\n }\n </div>\n\n @if (model().paginator) {\n <div\n class=\"nvb-table-paginator\"\n role=\"navigation\"\n [attr.aria-label]=\"'table.pagination.label' | uiT: 'Table pagination'\"\n [class.nvb-table-paginator--flat]=\"flatFooterSurface()\"\n [class.nvb-table-paginator--compact]=\"paginatorStyle() === 'compact'\"\n [class.nvb-table-paginator--segmented]=\"paginatorStyle() === 'segmented'\"\n [class.nvb-table-paginator--align-start]=\"paginatorAlign() === 'start'\"\n [class.nvb-table-paginator--align-center]=\"paginatorAlign() === 'center'\"\n [attr.data-testid]=\"tid('paginator')\"\n >\n <div class=\"nvb-table-paginator__content\">\n <div class=\"nvb-table-paginator__controls\">\n @if (showFirstLastPaginator()) {\n <button\n type=\"button\"\n class=\"nvb-table-paginator__nav nvb-table-paginator__nav--icon\"\n (click)=\"firstPage()\"\n [attr.data-testid]=\"tid('page-first')\"\n [disabled]=\"pageIndex() <= 0\"\n [attr.aria-label]=\"'table.pagination.first' | uiT: 'First page'\"\n >\n @if (paginatorStyle() === 'default') {\n <span class=\"material-symbols-outlined\">first_page</span>\n } @else {\n <span class=\"material-symbols-outlined\">keyboard_double_arrow_left</span>\n }\n </button>\n }\n\n @if (showPrevNextPaginator()) {\n <button\n type=\"button\"\n class=\"nvb-table-paginator__nav\"\n [class.nvb-table-paginator__nav--icon]=\"useIconOnlyPaginatorNav()\"\n (click)=\"previousPage()\"\n [attr.data-testid]=\"tid('page-prev')\"\n [disabled]=\"pageIndex() <= 0\"\n [attr.aria-label]=\"'table.prev' | uiT: 'Prev'\"\n >\n @if (useIconOnlyPaginatorNav()) {\n <span class=\"material-symbols-outlined\">chevron_left</span>\n } @else {\n {{ model().prevLabel || ('table.prev' | uiT: 'Prev') }}\n }\n </button>\n }\n\n @if (showNumericPaginator()) {\n <div class=\"nvb-table-paginator__pages\">\n @for (page of visiblePageNumbers(); track page) {\n <button\n type=\"button\"\n class=\"nvb-table-paginator__page\"\n [class.nvb-table-paginator__page--active]=\"page === pageIndex()\"\n (click)=\"goToPage(page)\"\n [attr.data-testid]=\"tid('page', page)\"\n [disabled]=\"page === pageIndex()\"\n [attr.aria-label]=\"'Page ' + (page + 1)\"\n [attr.aria-current]=\"page === pageIndex() ? 'page' : null\"\n >\n {{ page + 1 }}\n </button>\n }\n </div>\n }\n\n @if (showPrevNextPaginator()) {\n <button\n type=\"button\"\n class=\"nvb-table-paginator__nav\"\n [class.nvb-table-paginator__nav--icon]=\"useIconOnlyPaginatorNav()\"\n (click)=\"nextPage()\"\n [attr.data-testid]=\"tid('page-next')\"\n [disabled]=\"pageIndex() >= totalPages() - 1\"\n [attr.aria-label]=\"'table.next' | uiT: 'Next'\"\n >\n @if (useIconOnlyPaginatorNav()) {\n <span class=\"material-symbols-outlined\">chevron_right</span>\n } @else {\n {{ model().nextLabel || ('table.next' | uiT: 'Next') }}\n }\n </button>\n }\n\n @if (showFirstLastPaginator()) {\n <button\n type=\"button\"\n class=\"nvb-table-paginator__nav nvb-table-paginator__nav--icon\"\n (click)=\"lastPage()\"\n [attr.data-testid]=\"tid('page-last')\"\n [disabled]=\"pageIndex() >= totalPages() - 1\"\n [attr.aria-label]=\"'table.pagination.last' | uiT: 'Last page'\"\n >\n @if (paginatorStyle() === 'default') {\n <span class=\"material-symbols-outlined\">last_page</span>\n } @else {\n <span class=\"material-symbols-outlined\">keyboard_double_arrow_right</span>\n }\n </button>\n }\n </div>\n\n @if (showPageMeta()) {\n <span class=\"nvb-table-paginator__meta\">{{ pageMeta() }}</span>\n }\n </div>\n\n @if (showPageSizeSelector()) {\n <div class=\"nvb-table-paginator__size\">\n <nvb-select\n class=\"nvb-table-paginator__size-select\"\n [ngModel]=\"pageSize()\"\n (ngModelChange)=\"setPageSize($event)\"\n [attr.data-testid]=\"tid('page-size')\"\n [attr.aria-label]=\"'table.pagination.pageSize' | uiT: 'Rows per page'\"\n >\n @for (size of pageSizeOptions(); track size) {\n <option [ngValue]=\"size\">{{ size }}</option>\n }\n </nvb-select>\n </div>\n }\n </div>\n }\n\n @if (openExportDialog()) {\n <div [attr.data-testid]=\"tid('export-dialog-backdrop')\" class=\"nvb-table-dialog-backdrop\" (click)=\"closeExportSelectionDialog()\"></div>\n <section\n class=\"nvb-table-dialog nvb-table-export-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"table-export-dialog-title\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onExportDialogKeydown($event)\"\n [attr.data-testid]=\"tid('export-dialog')\"\n >\n <header class=\"nvb-table-dialog__header\">\n <h4 id=\"table-export-dialog-title\">\n {{ 'table.export.dialog.heading' | uiT: 'Export' }}\n @if (model().label) {\n <span class=\"nvb-table-export-dialog__subject\">{{ model().label }}</span>\n }\n </h4>\n <button [attr.data-testid]=\"tid('export-dialog-close')\"\n type=\"button\"\n class=\"nvb-table-dialog__close\"\n (click)=\"closeExportSelectionDialog()\"\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\n >\n <nvb-icon name=\"close\"></nvb-icon>\n </button>\n </header>\n\n <div class=\"nvb-table-dialog__body nvb-table-export-dialog__body\">\n <fieldset class=\"nvb-table-export-dialog__group\">\n <legend class=\"nvb-table-export-dialog__legend\">\n {{ 'table.export.format' | uiT: 'Format' }}\n </legend>\n <div class=\"nvb-table-export-dialog__formats\" role=\"radiogroup\">\n @for (option of exportFormatOptions; track option.value) {\n <button\n type=\"button\"\n role=\"radio\"\n class=\"nvb-table-export-dialog__format\"\n [class.nvb-table-export-dialog__format--active]=\"exportFormat() === option.value\"\n [attr.aria-checked]=\"exportFormat() === option.value\"\n (click)=\"setExportFormat(option.value)\"\n [attr.data-testid]=\"tid('export-format-' + option.value)\"\n >\n <nvb-icon [name]=\"option.icon\" class=\"nvb-table-export-dialog__format-icon\"></nvb-icon>\n <span class=\"nvb-table-export-dialog__format-text\">\n <strong>{{ option.labelKey | uiT: option.label }}</strong>\n <small>{{ option.hintKey | uiT: option.hint }}</small>\n </span>\n <span class=\"nvb-table-export-dialog__check\" aria-hidden=\"true\">\n <nvb-icon name=\"check\"></nvb-icon>\n </span>\n </button>\n }\n </div>\n </fieldset>\n\n <fieldset class=\"nvb-table-export-dialog__group\">\n <legend class=\"nvb-table-export-dialog__legend\">\n {{ 'table.export.rows' | uiT: 'Rows' }}\n </legend>\n <div class=\"nvb-table-export-dialog__scopes\" role=\"radiogroup\">\n @if (exportSelectedCount() > 0) {\n <label class=\"nvb-table-export-dialog__scope\">\n <input\n type=\"radio\"\n name=\"nvb-table-export-scope\"\n [checked]=\"exportScope() === 'selected'\"\n (change)=\"setExportScope('selected')\"\n [attr.data-testid]=\"tid('export-scope-selected')\"\n />\n <span class=\"nvb-table-export-dialog__scope-text\">\n {{ 'table.export.scope.selected' | uiT: 'Selected rows' }}\n </span>\n <span class=\"nvb-table-export-dialog__count\">{{ exportSelectedCount() }}</span>\n </label>\n }\n <label class=\"nvb-table-export-dialog__scope\">\n <input\n type=\"radio\"\n name=\"nvb-table-export-scope\"\n [checked]=\"exportScope() === 'all'\"\n (change)=\"setExportScope('all')\"\n [attr.data-testid]=\"tid('export-scope-all')\"\n />\n <span class=\"nvb-table-export-dialog__scope-text\">\n {{\n exportHasFilters()\n ? ('table.export.scope.allFiltered' | uiT: 'All rows matching search and filters')\n : ('table.export.scope.allRows' | uiT: 'All rows')\n }}\n @if (model().lazyLoad) {\n <small>{{\n 'table.export.scope.allLazyHint' | uiT: 'Every page, loaded from the server'\n }}</small>\n }\n </span>\n <span class=\"nvb-table-export-dialog__count\">{{ exportAllCount() }}</span>\n </label>\n <label class=\"nvb-table-export-dialog__scope\">\n <input\n type=\"radio\"\n name=\"nvb-table-export-scope\"\n [checked]=\"exportScope() === 'current'\"\n (change)=\"setExportScope('current')\"\n [attr.data-testid]=\"tid('export-scope-current')\"\n />\n <span class=\"nvb-table-export-dialog__scope-text\">\n {{ 'table.export.scope.currentPage' | uiT: 'Current page only' }}\n </span>\n <span class=\"nvb-table-export-dialog__count\">{{ exportCurrentCount() }}</span>\n </label>\n </div>\n </fieldset>\n\n @if (exportUsesColumnPicker()) {\n <fieldset class=\"nvb-table-export-dialog__group\">\n <legend class=\"nvb-table-export-dialog__legend nvb-table-export-dialog__legend--row\">\n <span>\n {{ 'table.export.columns' | uiT: 'Columns' }}\n <span class=\"nvb-table-export-dialog__muted\">\n {{ selectedExportColumns().length }} / {{ exportColumns().length }}\n </span>\n </span>\n <button [attr.data-testid]=\"tid('export-select-all')\"\n type=\"button\"\n class=\"nvb-table-export-dialog__link\"\n (click)=\"selectAllExportColumns(!allExportColumnsSelected())\"\n >\n {{\n allExportColumnsSelected()\n ? ('table.export.columns.none' | uiT: 'Clear all')\n : ('table.export.columns.selectAll' | uiT: 'Select all')\n }}\n </button>\n </legend>\n <div class=\"nvb-table-export-dialog__columns\">\n @for (column of exportColumns(); track column.id || column.key; let tidIndex12 = $index) {\n <label class=\"nvb-table-export-dialog__column\">\n <input [attr.data-testid]=\"tid('checkbox-input', tidIndex12)\"\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"isExportColumnSelected(column)\"\n (change)=\"onExportColumnSelectionChange(column, $event)\"\n />\n <span>{{ resolveColumnLabel(column) }}</span>\n </label>\n }\n </div>\n </fieldset>\n }\n\n <fieldset class=\"nvb-table-export-dialog__group\">\n <legend class=\"nvb-table-export-dialog__legend\">\n {{ 'table.export.fileName' | uiT: 'File name' }}\n </legend>\n <div class=\"nvb-table-export-dialog__filename\">\n <input\n type=\"text\"\n class=\"nvb-control__text-input\"\n [value]=\"exportFileNameDraft()\"\n (input)=\"onExportFileNameInput($any($event.target).value)\"\n [attr.aria-label]=\"'table.export.fileName' | uiT: 'File name'\"\n spellcheck=\"false\"\n [attr.data-testid]=\"tid('export-file-name')\"\n />\n <span class=\"nvb-table-export-dialog__extension\">.{{ exportExtension() }}</span>\n </div>\n </fieldset>\n </div>\n\n <footer class=\"nvb-table-export-dialog__footer\">\n <span class=\"nvb-table-export-dialog__summary\" aria-live=\"polite\">\n @if (exportUsesColumnPicker() && selectedExportColumns().length === 0) {\n {{ 'table.export.noColumns' | uiT: 'Choose at least one column.' }}\n } @else if (exportRowCount() === 0) {\n {{ 'table.export.noRows' | uiT: 'There are no rows to export.' }}\n }\n </span>\n <button [attr.data-testid]=\"tid('export-dialog-cancel')\"\n type=\"button\"\n class=\"nvb-table-export-dialog__button\"\n (click)=\"closeExportSelectionDialog()\"\n >\n {{ 'common.cancel' | uiT: 'Cancel' }}\n </button>\n <button\n type=\"button\"\n class=\"nvb-table-export-dialog__button nvb-table-export-dialog__button--primary\"\n [disabled]=\"\n exportBusy() ||\n exportRowCount() === 0 ||\n (exportUsesColumnPicker() && selectedExportColumns().length === 0)\n \"\n (click)=\"confirmExport($event)\"\n [attr.data-testid]=\"tid('export-confirm')\"\n >\n @if (exportBusy()) {\n <span class=\"nvb-table-export-dialog__spinner\" aria-hidden=\"true\"></span>\n {{ 'table.export.preparing' | uiT: 'Preparing...' }}\n } @else {\n {{\n (exportRowCount() === 1\n ? ('table.export.confirmOne' | uiT: 'Export 1 row')\n : ('table.export.confirmMany' | uiT: 'Export {count} rows')\n ).replace('{count}', '' + exportRowCount())\n }}\n }\n </button>\n </footer>\n </section>\n }\n\n @if (openColumnSettingsDialog()) {\n <div [attr.data-testid]=\"tid('column-settings-backdrop')\" class=\"nvb-table-dialog-backdrop\" (click)=\"closeColumnSettings()\"></div>\n <section [attr.data-testid]=\"tid('column-settings-dialog')\"\n class=\"nvb-table-dialog nvb-table-dialog--column-settings\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"table-column-settings-dialog-title\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"nvb-table-dialog__header\">\n <h4 id=\"table-column-settings-dialog-title\">\n {{ columnSettingsDialogTitle() | uiT: 'Columns settings' }}\n </h4>\n <button [attr.data-testid]=\"tid('column-settings-close')\"\n type=\"button\"\n class=\"nvb-table-dialog__close\"\n (click)=\"closeColumnSettings()\"\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"close\"></nvb-icon>\n </button>\n </header>\n\n <div class=\"nvb-table-dialog__body\">\n <div class=\"nvb-table-column-settings\">\n <div class=\"nvb-table-column-settings__actions\">\n <button [attr.data-testid]=\"tid('show-all-column-settings')\" type=\"button\" class=\"nvb-table-toolbar__button\" (click)=\"showAllColumnSettings()\">\n <nvb-icon class=\"nvb-table-action-icon\" name=\"visibility\"></nvb-icon>\n <span>{{ 'table.columns.settings.showAll' | uiT: 'Show all' }}</span>\n </button>\n <button [attr.data-testid]=\"tid('reset-column-settings')\" type=\"button\" class=\"nvb-table-toolbar__button\" (click)=\"resetColumnSettings()\">\n <nvb-icon class=\"nvb-table-action-icon\" name=\"restart_alt\"></nvb-icon>\n <span>{{ 'table.columns.settings.reset' | uiT: 'Reset' }}</span>\n </button>\n </div>\n\n <div\n class=\"nvb-table-column-settings__list\"\n cdkDropList\n [cdkDropListData]=\"columnSettingsDraft()\"\n (cdkDropListDropped)=\"reorderColumnSettingsRows($event)\"\n >\n @for (column of columnSettingsDraft(); track column.key; let tidIndex13 = $index) {\n <article class=\"nvb-table-column-settings__item\" cdkDrag>\n <button [attr.data-testid]=\"tid('reorder', tidIndex13)\"\n type=\"button\"\n class=\"nvb-table-column-settings__drag\"\n cdkDragHandle\n [attr.aria-label]=\"'table.columns.settings.reorder' | uiT: 'Reorder column'\"\n [attr.title]=\"'table.columns.settings.reorder' | uiT: 'Reorder column'\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"drag_indicator\"></nvb-icon>\n </button>\n <div class=\"nvb-table-column-settings__content\">\n <label class=\"nvb-table-column-settings__toggle\">\n <input [attr.data-testid]=\"tid('checkbox-input', tidIndex13)\"\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"column.visible\"\n (change)=\"\n setColumnSettingsVisibility(column.key, $any($event.target).checked)\n \"\n />\n <span>{{ column.label || column.key }}</span>\n </label>\n\n <label class=\"nvb-table-column-settings__width\">\n <div class=\"nvb-table-column-settings__width-header\">\n <span>{{ 'table.columns.settings.width' | uiT: 'Plotis' }}</span>\n <div class=\"nvb-table-column-settings__width-meta\">\n <button [attr.data-testid]=\"tid('width-reset', tidIndex13)\"\n type=\"button\"\n class=\"nvb-table-column-settings__width-reset\"\n [class.nvb-table-column-settings__width-reset--active]=\"\n !hasColumnSettingsCustomWidth(column)\n \"\n (click)=\"resetColumnSettingsWidth(column.key)\"\n >\n {{ 'table.columns.settings.auto' | uiT: 'Automatinis' }}\n </button>\n <span class=\"nvb-table-column-settings__width-value\">\n {{ resolveColumnSettingsWidthDisplay(column) }}\n </span>\n </div>\n </div>\n\n <div class=\"nvb-table-column-settings__width-range\">\n <input [attr.data-testid]=\"tid('range-input', tidIndex13)\"\n type=\"range\"\n [min]=\"columnSettingsWidthMin\"\n [max]=\"columnSettingsWidthMax\"\n [step]=\"columnSettingsWidthStep\"\n [value]=\"resolveColumnSettingsWidthSliderValue(column)\"\n (click)=\"$event.stopPropagation()\"\n (input)=\"setColumnSettingsWidth(column.key, $any($event.target).value)\"\n />\n </div>\n </label>\n </div>\n\n <div class=\"nvb-table-column-settings__order\">\n <button [attr.data-testid]=\"tid('move-up', tidIndex13)\"\n type=\"button\"\n class=\"nvb-table-column-settings__move\"\n [disabled]=\"isColumnSettingsRowFirst(column.key)\"\n (click)=\"moveColumnSettingsRow(column.key, -1)\"\n [attr.aria-label]=\"'table.columns.settings.moveUp' | uiT: 'Move up'\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"arrow_upward\"></nvb-icon>\n </button>\n <button [attr.data-testid]=\"tid('move-down', tidIndex13)\"\n type=\"button\"\n class=\"nvb-table-column-settings__move\"\n [disabled]=\"isColumnSettingsRowLast(column.key)\"\n (click)=\"moveColumnSettingsRow(column.key, 1)\"\n [attr.aria-label]=\"'table.columns.settings.moveDown' | uiT: 'Move down'\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"arrow_downward\"></nvb-icon>\n </button>\n </div>\n </article>\n }\n </div>\n </div>\n </div>\n\n <footer class=\"nvb-table-dialog__footer\">\n <button [attr.data-testid]=\"tid('column-settings-cancel')\" type=\"button\" class=\"nvb-table-toolbar__button\" (click)=\"closeColumnSettings()\">\n {{ 'table.columns.settings.cancel' | uiT: 'Cancel' }}\n </button>\n @if (showColumnSettingsSaveAction()) {\n <button [attr.data-testid]=\"tid('save-column-settings')\"\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n (click)=\"saveColumnSettings($event)\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"save\"></nvb-icon>\n <span>{{ 'table.columns.settings.save' | uiT: 'Save settings' }}</span>\n </button>\n }\n <button [attr.data-testid]=\"tid('apply-column-settings')\"\n type=\"button\"\n class=\"nvb-table-toolbar__button nvb-table-toolbar__button--primary\"\n (click)=\"applyColumnSettings($event)\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"save\"></nvb-icon>\n <span>{{ 'table.columns.settings.apply' | uiT: 'Apply settings' }}</span>\n </button>\n </footer>\n </section>\n }\n\n @if (openSavedFiltersDialog()) {\n <div [attr.data-testid]=\"tid('close-saved-filters')\" class=\"nvb-table-dialog-backdrop\" (click)=\"closeSavedFilters()\"></div>\n <section [attr.data-testid]=\"tid('saved-filters-dialog')\"\n class=\"nvb-table-dialog nvb-table-dialog--filters\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"table-saved-filters-dialog-title\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"nvb-table-dialog__header\">\n <h4 id=\"table-saved-filters-dialog-title\">\n {{ 'table.filters.dialog.title' | uiT: 'Saved filters' }}\n </h4>\n <button [attr.data-testid]=\"tid('saved-filters-close')\"\n type=\"button\"\n class=\"nvb-table-dialog__close\"\n (click)=\"closeSavedFilters()\"\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n </header>\n\n <div class=\"nvb-table-dialog__tabs\" role=\"tablist\">\n <button [attr.data-testid]=\"tid('saved-filters-tab-create')\"\n type=\"button\"\n class=\"nvb-table-dialog__tab\"\n role=\"tab\"\n [class.nvb-table-dialog__tab--active]=\"savedFilterDialogTab() === 'create'\"\n [attr.aria-selected]=\"savedFilterDialogTab() === 'create'\"\n (click)=\"setSavedFilterDialogTab('create')\"\n >\n {{ 'table.filters.dialog.new' | uiT: 'Create new' }}\n </button>\n <button [attr.data-testid]=\"tid('saved-filters-tab-list')\"\n type=\"button\"\n class=\"nvb-table-dialog__tab\"\n role=\"tab\"\n [class.nvb-table-dialog__tab--active]=\"savedFilterDialogTab() === 'list'\"\n [attr.aria-selected]=\"savedFilterDialogTab() === 'list'\"\n (click)=\"setSavedFilterDialogTab('list')\"\n >\n {{ 'table.filters.dialog.list' | uiT: 'Filter list' }}\n </button>\n </div>\n\n <div class=\"nvb-table-dialog__body\">\n @if (savedFilterDialogTab() === 'create') {\n <div class=\"nvb-table-filter-form\">\n <label class=\"nvb-table-filter-form__row\">\n <span>{{ 'table.filters.name' | uiT: 'Name' }}</span>\n <input [attr.data-testid]=\"tid('saved-filter-name')\"\n type=\"text\"\n [ngModel]=\"savedFilterName()\"\n (ngModelChange)=\"savedFilterName.set($event)\"\n />\n </label>\n\n <label class=\"nvb-table-filter-form__row\">\n <span>{{ 'table.filters.description' | uiT: 'Description' }}</span>\n <input [attr.data-testid]=\"tid('saved-filter-description')\"\n type=\"text\"\n [ngModel]=\"savedFilterDescription()\"\n (ngModelChange)=\"savedFilterDescription.set($event)\"\n />\n </label>\n\n <label class=\"nvb-table-filter-form__row\">\n <span>{{ 'table.filters.code' | uiT: 'Code' }}</span>\n <input [attr.data-testid]=\"tid('saved-filter-search')\"\n type=\"text\"\n [ngModel]=\"savedFilterCode()\"\n (ngModelChange)=\"savedFilterCode.set($event)\"\n />\n </label>\n </div>\n } @else {\n <div class=\"nvb-table-filter-list\">\n @if (savedFiltersLoading()) {\n <div class=\"nvb-table-filter-list__empty\">\n {{ 'table.filters.loading' | uiT: 'Loading...' }}\n </div>\n } @else if (savedFilters().length === 0) {\n <div class=\"nvb-table-filter-list__empty\">\n {{ 'table.filters.empty' | uiT: 'No saved filters' }}\n </div>\n } @else {\n @for (savedFilter of savedFilters(); track savedFilter.id; let tidIndex14 = $index) {\n <article class=\"nvb-table-filter-list__item\">\n <div class=\"nvb-table-filter-list__meta\">\n <strong>{{ savedFilter.name }}</strong>\n @if (savedFilter.description) {\n <span>{{ savedFilter.description }}</span>\n }\n @if (savedFilter.code) {\n <small>{{ savedFilter.code }}</small>\n }\n </div>\n <div class=\"nvb-table-filter-list__actions\">\n <button [attr.data-testid]=\"tid('apply-saved-filter', tidIndex14)\"\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n (click)=\"applySavedFilter(savedFilter, $event)\"\n >\n {{ 'table.filters.apply' | uiT: 'Apply' }}\n </button>\n <button [attr.data-testid]=\"tid('delete-saved-filter', tidIndex14)\"\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n (click)=\"deleteSavedFilter(savedFilter, $event)\"\n >\n {{ 'table.filters.delete' | uiT: 'Delete' }}\n </button>\n </div>\n </article>\n }\n }\n </div>\n }\n </div>\n\n @if (savedFilterDialogTab() === 'create') {\n <footer class=\"nvb-table-dialog__footer nvb-table-dialog__footer--single\">\n <button [attr.data-testid]=\"tid('save-current-filter')\"\n type=\"button\"\n class=\"nvb-table-toolbar__button nvb-table-toolbar__button--primary\"\n [disabled]=\"savedFilterBusy() || !savedFilterName().trim()\"\n (click)=\"saveCurrentFilter($event)\"\n >\n <span class=\"material-symbols-outlined\">save</span>\n <span>{{ 'table.filters.save' | uiT: 'Save filter' }}</span>\n </button>\n </footer>\n }\n </section>\n }\n </div>\n</element-wrapper>\n",styles:["@charset \"UTF-8\";:host{display:block;width:100%}.nvb-table-shell{--nvb-table-control-height: 32px;--nvb-table-control-radius: var(--nvb-control-radius, var(--nvb-radius-sm));--nvb-table-control-font-size: 13px;--nvb-table-control-padding-x: 10px;--nvb-table-surface-border: color-mix( in oklab, var(--nvb-color-neutral-300) 78%, var(--nvb-color-surface-mix-target, white) );--nvb-table-surface-border-strong: color-mix( in oklab, var(--nvb-color-neutral-300) 92%, var(--nvb-color-surface-mix-target, white) );--nvb-table-surface-radius: var(--nvb-table-radius, var(--nvb-card-radius, var(--nvb-radius-md, var(--nvb-radius-sm))));--nvb-table-sticky-header-offset: 0px;position:relative;background:transparent;container-type:inline-size;display:flex;flex-direction:column;gap:0;font-family:var(--nvb-font-family)}.nvb-table-shell--editor .nvb-table-toolbar{z-index:1}.nvb-table-shell--editor .nvb-table-quick-search,.nvb-table-shell--editor .nvb-table-toolbar__button--detailed-toggle,.nvb-table-shell--editor .nvb-table-export,.nvb-table-shell--editor .nvb-table-header-menu,.nvb-table-shell--editor .nvb-table-header-actions,.nvb-table-shell--editor .nvb-table-detailed-search{pointer-events:none}.nvb-table-shell--editor .nvb-table-toolbar__add-element,.nvb-table-shell--editor .nvb-table-toolbar__drop-item--editor{pointer-events:auto}.nvb-table-sticky-header{display:flex;flex-direction:column;gap:0}.nvb-table-sticky-header--enabled{position:sticky;top:0;z-index:38}.nvb-table-sticky-header--enabled.nvb-table-sticky-header--pinned{background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-8)}.nvb-table-sticky-header--enabled.nvb-table-sticky-header--pinned .nvb-table-toolbar--flat{background:var(--nvb-color-neutral-000)}.nvb-table-sticky-clone{position:absolute;inset-inline:0;top:100%;z-index:37;pointer-events:none}.nvb-table-sticky-clone__viewport{overflow:hidden;background:var(--nvb-color-neutral-000);border:1px solid var(--nvb-table-surface-border);border-top:none;box-shadow:var(--nvb-shadow-8)}.nvb-table-sticky-clone__table{margin:0;width:max-content;min-width:100%;transform:translate(0)}.nvb-table-sticky-clone__table thead th{position:static;top:auto;z-index:auto}.nvb-table-sticky-clone__row th{cursor:default}.nvb-table-sticky-clone__row th.nvb-sortable{cursor:pointer}.nvb-table-frame{border:1px solid var(--nvb-table-surface-border);border-radius:var(--nvb-table-surface-radius);overflow:hidden;background:var(--nvb-color-neutral-000);display:flex;align-items:stretch;box-shadow:0 1px 2px color-mix(in oklab,var(--nvb-color-neutral-900) 4%,transparent),inset 0 1px color-mix(in oklab,var(--nvb-color-neutral-000) 84%,transparent)}.nvb-table-frame__scroller{flex:1 1 auto;min-width:0;width:100%;overflow-x:auto;overflow-y:hidden}.nvb-table-frame__scroller--virtual{overflow-y:auto;overscroll-behavior:contain}.nvb-table-frame--with-toolbar{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.nvb-table-frame--with-paginator{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.nvb-table-toolbar{display:flex;position:relative;z-index:32;justify-content:space-between;align-items:center;gap:8px;padding:8px;border:1px solid var(--nvb-table-surface-border);border-bottom:none;border-top-left-radius:var(--nvb-table-surface-radius);border-top-right-radius:var(--nvb-table-surface-radius);background:color-mix(in oklab,var(--nvb-color-neutral-050) 52%,var(--nvb-color-neutral-000));flex-wrap:wrap}.nvb-table-toolbar--flat{padding:0 0 8px;border:none;border-radius:0;background:transparent}.nvb-table-toolbar__left,.nvb-table-toolbar__center,.nvb-table-toolbar__right{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.nvb-table-toolbar__center{flex:1 1 260px;min-width:180px}.nvb-table-toolbar__center--controls-only{justify-content:flex-end}.nvb-table-toolbar__right{justify-content:flex-end;flex:0 0 auto;margin-left:auto}.nvb-table-toolbar__actions{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}.nvb-table-toolbar__button,.nvb-table-export__action,.nvb-table-cell-actions__button,.nvb-row-actions__inline-button,.nvb-row-actions__toggle,.nvb-selection-actions__toggle,.nvb-table-detailed-search__remove,.nvb-table-quick-search__apply,.nvb-table-quick-search__clear,.nvb-table-detailed-search__multi-select-trigger,.nvb-table-detailed-search__date-trigger,.nvb-table-detailed-search__date-header>button,.nvb-table-detailed-search__date-actions>button{font-family:var(--nvb-font-family);font-size:var(--nvb-table-control-font-size);font-weight:var(--nvb-control-font-weight, 500);line-height:1.3;transition:border-color .16s ease,background-color .16s ease,color .16s ease,box-shadow .16s ease;outline:0}.nvb-table-toolbar__button:focus-visible,.nvb-table-export__action:focus-visible,.nvb-table-cell-actions__button:focus-visible,.nvb-row-actions__inline-button:focus-visible,.nvb-row-actions__toggle:focus-visible,.nvb-selection-actions__toggle:focus-visible,.nvb-table-detailed-search__remove:focus-visible,.nvb-table-quick-search__apply:focus-visible,.nvb-table-quick-search__clear:focus-visible,.nvb-table-detailed-search__multi-select-trigger:focus-visible,.nvb-table-detailed-search__date-trigger:focus-visible,.nvb-table-detailed-search__date-header>button:focus-visible,.nvb-table-detailed-search__date-actions>button:focus-visible{border-color:var(--nvb-input-focus-border-color, var(--nvb-color-primary-500));box-shadow:var(--nvb-focus-ring)}.nvb-table-toolbar,.nvb-table-detailed-search,.nvb-table-paginator{--nvb-input-height: var(--nvb-table-control-height);--nvb-input-radius: var(--nvb-table-control-radius);--nvb-select-trigger-border-color: var(--nvb-table-surface-border-strong);--nvb-select-trigger-padding-inline-start: var(--nvb-table-control-padding-x);--nvb-select-trigger-padding-inline-end: 26px;--nvb-select-arrow-inset-inline-end: 9px;--nvb-select-menu-border: var(--nvb-table-surface-border-strong);--nvb-select-menu-radius: var(--nvb-table-control-radius);--nvb-select-option-min-height: 28px;--nvb-select-option-padding-block: 5px;font-size:var(--nvb-table-control-font-size)}.nvb-table-toolbar__button{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-table-surface-border-strong));background:var(--nvb-control-button-bg, var(--nvb-color-neutral-000));color:var(--nvb-control-button-text-color, var(--nvb-color-neutral-700));border-radius:var(--nvb-table-control-radius);min-height:var(--nvb-table-control-height);padding:0 var(--nvb-table-control-padding-x);display:inline-flex;align-items:center;gap:6px;cursor:pointer;box-shadow:0 1px 1px color-mix(in oklab,var(--nvb-color-neutral-900) 3%,transparent)}.nvb-table-toolbar__button:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-table-toolbar__button--header-action{transition:background-color .16s ease,border-color .16s ease,color .16s ease,box-shadow .16s ease}.nvb-table-toolbar__button--outlined.nvb-table-toolbar__button--tone-neutral{border-color:var(--nvb-color-neutral-300);background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-700)}.nvb-table-toolbar__button--outlined.nvb-table-toolbar__button--tone-neutral:hover{background:var(--nvb-color-neutral-100)}.nvb-table-toolbar__button--outlined.nvb-table-toolbar__button--tone-primary{border-color:var(--nvb-color-primary-300);background:var(--nvb-color-neutral-000);color:var(--nvb-color-primary-700)}.nvb-table-toolbar__button--outlined.nvb-table-toolbar__button--tone-primary:hover{background:var(--nvb-color-primary-050);border-color:var(--nvb-color-primary-400)}.nvb-table-toolbar__button--outlined.nvb-table-toolbar__button--tone-risk{border-color:var(--nvb-color-risk-300);background:var(--nvb-color-neutral-000);color:var(--nvb-color-risk-700)}.nvb-table-toolbar__button--outlined.nvb-table-toolbar__button--tone-risk:hover{background:var(--nvb-color-risk-050);border-color:var(--nvb-color-risk-400)}.nvb-table-toolbar__button--filled.nvb-table-toolbar__button--tone-neutral{border-color:var(--nvb-color-neutral-700);background:var(--nvb-color-neutral-700);color:var(--nvb-color-neutral-000)}.nvb-table-toolbar__button--filled.nvb-table-toolbar__button--tone-neutral:hover{border-color:var(--nvb-color-neutral-800);background:var(--nvb-color-neutral-800)}.nvb-table-toolbar__button--filled.nvb-table-toolbar__button--tone-primary{border-color:var(--nvb-color-primary-500);background:var(--nvb-color-primary-500);color:var(--nvb-color-neutral-000)}.nvb-table-toolbar__button--filled.nvb-table-toolbar__button--tone-primary:hover{border-color:var(--nvb-color-primary-600);background:var(--nvb-color-primary-600)}.nvb-table-toolbar__button--filled.nvb-table-toolbar__button--tone-risk{border-color:var(--nvb-color-risk-500);background:var(--nvb-color-risk-500);color:var(--nvb-color-neutral-000)}.nvb-table-toolbar__button--filled.nvb-table-toolbar__button--tone-risk:hover{border-color:var(--nvb-color-risk-600);background:var(--nvb-color-risk-600)}.nvb-table-toolbar__button--text{border-color:transparent;background:transparent;box-shadow:none}.nvb-table-toolbar__button--text.nvb-table-toolbar__button--tone-neutral{color:var(--nvb-color-neutral-700)}.nvb-table-toolbar__button--text.nvb-table-toolbar__button--tone-neutral:hover{background:var(--nvb-color-neutral-100)}.nvb-table-toolbar__button--text.nvb-table-toolbar__button--tone-primary{color:var(--nvb-color-primary-700)}.nvb-table-toolbar__button--text.nvb-table-toolbar__button--tone-primary:hover{background:var(--nvb-color-primary-050)}.nvb-table-toolbar__button--text.nvb-table-toolbar__button--tone-risk{color:var(--nvb-color-risk-700)}.nvb-table-toolbar__button--text.nvb-table-toolbar__button--tone-risk:hover{background:var(--nvb-color-risk-050)}.nvb-table-toolbar__button:disabled{opacity:.55;cursor:not-allowed;box-shadow:none}.nvb-table-toolbar__button span.material-symbols-outlined{font-size:16px;line-height:1}.nvb-table-action-icon{font-size:16px}.nvb-table-toolbar__button--primary{background:var(--nvb-color-primary-500);border-color:var(--nvb-color-primary-500);color:var(--nvb-color-neutral-000)}.nvb-table-toolbar__button--primary:hover{background:var(--nvb-color-primary-600);border-color:var(--nvb-color-primary-600)}.nvb-table-toolbar__button--icon-only{width:var(--nvb-table-control-height);min-width:var(--nvb-table-control-height);padding:0;justify-content:center}.nvb-table-toolbar__badge{min-width:16px;height:16px;border-radius:var(--nvb-radius-full);background:var(--nvb-color-primary-500);color:var(--nvb-color-neutral-000);display:inline-flex;align-items:center;justify-content:center;font-size:10px;padding:0 4px}.nvb-table-toolbar__custom{display:flex;align-items:center;gap:6px;width:100%;min-width:0}.nvb-table-toolbar__dropzone{position:relative;z-index:24;width:auto;max-width:100%;flex:0 1 auto;min-width:0;min-height:var(--nvb-table-control-height);display:flex;align-items:center;gap:6px;overflow:visible}.nvb-table-toolbar__dropzone--center{width:100%;flex:1 1 auto}.nvb-table-toolbar__center--controls-only .nvb-table-toolbar__dropzone--center{width:auto;flex:0 0 auto}.nvb-table-toolbar__add-element{position:relative;display:inline-flex;align-items:center;max-width:none}.nvb-table-toolbar__button--add-element{width:32px;min-width:32px;height:32px;min-height:32px;padding:0;justify-content:center}.nvb-table-toolbar__button--add-element span{font-size:16px}.nvb-table-toolbar__add-menu{position:fixed;top:0;left:0;width:220px;max-height:280px;overflow:auto;border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-8);padding:4px;z-index:var(--nvb-floating-overlay-z-index, 2147483000)}.nvb-table-toolbar__add-menu-item{width:100%;border:none;background:transparent;border-radius:var(--nvb-radius-md);padding:8px 10px;text-align:left;color:var(--nvb-color-neutral-700);font-size:13px;cursor:pointer}.nvb-table-toolbar__add-menu-item:hover{background:color-mix(in oklab,var(--nvb-color-primary-050) 70%,var(--nvb-color-surface-mix-target, white))}.nvb-table-toolbar__drop-items{width:auto;flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:8px;flex-wrap:wrap;overflow:visible}.nvb-table-toolbar__center--controls-only .nvb-table-toolbar__drop-items{flex:0 0 auto}.nvb-table-toolbar__drop-item{position:relative;min-width:0;max-width:none;flex:0 0 auto;border:none;border-radius:0;background:transparent;padding:0}.nvb-table-toolbar__drop-item runtime-lazy-element-outlet{display:block;width:auto;min-width:0}.nvb-table-toolbar__drop-item--editor{cursor:pointer;padding:5px 27px 5px 5px}.nvb-table-toolbar__drop-item--editor .nvb-table-toolbar__drop-remove{right:5px}.nvb-table-toolbar__drop-item--focused{border-radius:var(--nvb-table-control-radius);background:color-mix(in oklab,var(--nvb-color-primary-500) 10%,var(--nvb-color-surface-mix-target, white));box-shadow:inset 0 0 0 1px color-mix(in oklab,var(--nvb-color-primary-500) 46%,transparent)}.nvb-table-toolbar__drop-item--editor runtime-lazy-element-outlet{pointer-events:none}.nvb-table-toolbar__drop-remove{position:absolute;top:50%;right:0;transform:translateY(-50%);width:18px;min-width:18px;height:18px;border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-radius-md);background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-500);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.nvb-table-toolbar__drop-remove span{font-size:14px}.nvb-table-toolbar__drop-remove:hover{border-color:var(--nvb-color-risk-300);color:var(--nvb-color-risk-600);background:var(--nvb-color-risk-050)}.nvb-table-toolbar__drop-placeholder{width:100%;font-size:12px;color:var(--nvb-color-neutral-500);padding:2px 4px 4px}.nvb-table-toolbar__drop-item ::ng-deep .nvb-field{gap:0}.nvb-table-toolbar__drop-item ::ng-deep .nvb-field__text-warpper{display:none}.nvb-table-toolbar__drop-item ::ng-deep .nvb-field__description{display:none}.nvb-table-header-actions{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}.nvb-table-header-menu{min-width:220px;display:inline-flex;align-items:center}.nvb-table-header-menu--actions{min-width:min(300px,100%)}.nvb-table-header-menu__select{width:100%}.nvb-table-quick-search{min-width:216px;border:var(--nvb-input-border-width, 1px) solid var(--nvb-input-border-color, var(--nvb-table-surface-border-strong));background:var(--nvb-input-bg, var(--nvb-color-neutral-000));border-radius:var(--nvb-table-control-radius);min-height:var(--nvb-table-control-height);display:inline-flex;align-items:center;padding:0 5px;gap:2px;transition:border-color .16s ease,box-shadow .16s ease,background-color .16s ease}.nvb-table-quick-search:focus-within{border-color:var(--nvb-input-focus-border-color, var(--nvb-color-primary-500));box-shadow:var(--nvb-focus-ring)}.nvb-table-quick-search input{border:none;outline:none;background:transparent;width:100%;min-height:calc(var(--nvb-table-control-height) - 2px);font-family:var(--nvb-font-family);font-size:var(--nvb-table-control-font-size);color:var(--nvb-input-text-color, var(--nvb-color-neutral-700));padding:0 5px}.nvb-table-quick-search input:focus{outline:none;box-shadow:none}.nvb-table-quick-search input::placeholder{color:var(--nvb-input-placeholder-color, var(--nvb-color-neutral-500))}.nvb-table-quick-search__clear,.nvb-table-quick-search__apply{width:24px;min-width:24px;height:24px;border:1px solid transparent;border-radius:var(--nvb-table-control-radius);background:transparent;color:var(--nvb-color-neutral-500);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.nvb-table-quick-search__apply span{font-size:16px}.nvb-table-quick-search__apply:hover{background:var(--nvb-color-neutral-100)}.nvb-table-quick-search__clear span{font-size:16px}.nvb-table-quick-search__clear:hover{background:var(--nvb-color-neutral-100)}.nvb-table-export{position:relative;display:inline-flex;align-items:center;justify-content:flex-end}.nvb-table-export__chevron{font-size:16px}.nvb-table-export__menu{position:fixed;z-index:var(--nvb-floating-overlay-z-index, 2147483000);top:0;left:0;min-width:268px;border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-8);padding:8px;display:flex;flex-direction:column;gap:8px}.nvb-table-export__menu--top{transform:translateY(calc(-100% - 6px))}.nvb-table-export__scope{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--nvb-color-neutral-700)}.nvb-table-export__scope input{width:16px;height:16px}.nvb-table-export__actions{display:flex;align-items:center;flex-wrap:wrap;gap:6px}.nvb-table-export__action{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-table-surface-border-strong));border-radius:var(--nvb-table-control-radius);background:var(--nvb-control-button-bg, var(--nvb-color-neutral-000));color:var(--nvb-control-button-text-color, var(--nvb-color-neutral-700));min-height:var(--nvb-table-control-height);width:auto;padding:0 var(--nvb-table-control-padding-x);display:inline-flex;align-items:center;gap:6px;white-space:nowrap;cursor:pointer}.nvb-table-export__action span.material-symbols-outlined{font-size:16px}.nvb-table-export__action:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-table-export__action:disabled{opacity:.55;cursor:not-allowed}.nvb-table-detailed-search{border:1px solid var(--nvb-table-surface-border);border-radius:var(--nvb-table-surface-radius);background:var(--nvb-color-neutral-000);padding:8px;display:flex;flex-direction:column;gap:8px;margin-bottom:8px;box-shadow:0 1px 2px color-mix(in oklab,var(--nvb-color-neutral-900) 4%,transparent)}.nvb-table-detailed-search__rows{display:flex;flex-direction:column;gap:8px}.nvb-table-detailed-search__row{display:grid;grid-template-columns:minmax(220px,1fr) minmax(220px,1fr) minmax(220px,1fr) auto;gap:8px;align-items:stretch}.nvb-table-detailed-search__row select,.nvb-table-detailed-search__row input:not([type=checkbox]):not([type=radio]){border:var(--nvb-input-border-width, 1px) solid var(--nvb-input-border-color, var(--nvb-table-surface-border-strong));border-radius:var(--nvb-table-control-radius);background:var(--nvb-input-bg, var(--nvb-color-neutral-000));color:var(--nvb-input-text-color, var(--nvb-color-neutral-700));min-height:var(--nvb-table-control-height);font-size:var(--nvb-table-control-font-size);font-family:var(--nvb-font-family);padding:0 var(--nvb-table-control-padding-x);width:100%;min-width:0;line-height:1.3;transition:border-color .16s ease,box-shadow .16s ease,background-color .16s ease}.nvb-table-detailed-search__row select:focus,.nvb-table-detailed-search__row input:not([type=checkbox]):not([type=radio]):focus{border-color:var(--nvb-input-focus-border-color, var(--nvb-color-primary-500));box-shadow:var(--nvb-focus-ring);outline:0}.nvb-table-detailed-search__row>*{min-width:0}.nvb-table-detailed-search__boolean-toggle{border:var(--nvb-input-border-width, 1px) solid var(--nvb-input-border-color, var(--nvb-table-surface-border-strong));border-radius:var(--nvb-table-control-radius);background:var(--nvb-input-bg, var(--nvb-color-neutral-000));color:var(--nvb-input-text-color, var(--nvb-color-neutral-700));min-height:var(--nvb-table-control-height);display:inline-flex;align-items:center;gap:8px;padding:0 var(--nvb-table-control-padding-x);font-size:var(--nvb-table-control-font-size);font-family:var(--nvb-font-family);-webkit-user-select:none;user-select:none}.nvb-table-detailed-search__boolean-toggle .nvb-control__checkbox-input{margin:0}.nvb-table-detailed-search__remove{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-table-surface-border-strong));border-radius:var(--nvb-table-control-radius);background:var(--nvb-control-button-bg, var(--nvb-color-neutral-000));color:var(--nvb-color-risk-600);width:var(--nvb-table-control-height);min-width:var(--nvb-table-control-height);height:var(--nvb-table-control-height);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;align-self:stretch}.nvb-table-detailed-search__remove span{font-size:16px}.nvb-table-detailed-search__remove:hover{background:var(--nvb-color-risk-050);border-color:var(--nvb-color-risk-300)}.nvb-table-detailed-search__actions{display:flex;justify-content:flex-end;align-items:center;gap:8px;flex-wrap:wrap}.nvb-table-detailed-search__multi-select{position:relative;min-width:0}.nvb-table-detailed-search__multi-select-trigger{border:var(--nvb-input-border-width, 1px) solid var(--nvb-input-border-color, var(--nvb-table-surface-border-strong));border-radius:var(--nvb-table-control-radius);background:var(--nvb-input-bg, var(--nvb-color-neutral-000));color:var(--nvb-input-text-color, var(--nvb-color-neutral-700));min-height:var(--nvb-table-control-height);width:100%;padding:0 var(--nvb-table-control-padding-x);display:inline-flex;align-items:center;justify-content:space-between;gap:8px;text-align:left;cursor:pointer}.nvb-table-detailed-search__multi-select-trigger:hover{background:color-mix(in oklab,var(--nvb-input-bg, white) 88%,var(--nvb-color-neutral-050))}.nvb-table-detailed-search__multi-select-trigger:focus-visible{background:var(--nvb-input-bg, var(--nvb-color-neutral-000))}.nvb-table-detailed-search__multi-select-trigger span.material-symbols-outlined{font-size:16px;color:var(--nvb-color-neutral-500)}.nvb-table-detailed-search__multi-select-placeholder{color:var(--nvb-color-neutral-500)}.nvb-table-detailed-search__multi-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-8);max-height:240px;overflow:auto;z-index:var(--nvb-floating-overlay-z-index, 2147483000);padding:6px;display:flex;flex-direction:column;gap:2px}.nvb-table-detailed-search__multi-select-option{border-radius:var(--nvb-control-radius);min-height:32px;padding:6px 8px;display:inline-flex;align-items:center;gap:8px;cursor:pointer;color:var(--nvb-color-neutral-700);font-size:13px}.nvb-table-detailed-search__multi-select-option:hover{background:var(--nvb-color-neutral-100)}.nvb-table-detailed-search__multi-select-empty{color:var(--nvb-color-neutral-500);font-size:12px;padding:8px}.nvb-table-detailed-search__date{position:relative;min-width:0}.nvb-table-detailed-search__date-trigger{border:var(--nvb-input-border-width, 1px) solid var(--nvb-input-border-color, var(--nvb-table-surface-border-strong));border-radius:var(--nvb-table-control-radius);background:var(--nvb-input-bg, var(--nvb-color-neutral-000));color:var(--nvb-input-text-color, var(--nvb-color-neutral-700));min-height:var(--nvb-table-control-height);width:100%;padding:0 var(--nvb-table-control-padding-x);display:inline-flex;align-items:center;justify-content:space-between;gap:8px;text-align:left;cursor:pointer}.nvb-table-detailed-search__date-trigger:hover{background:color-mix(in oklab,var(--nvb-input-bg, white) 88%,var(--nvb-color-neutral-050))}.nvb-table-detailed-search__date-trigger:focus-visible{background:var(--nvb-input-bg, var(--nvb-color-neutral-000))}.nvb-table-detailed-search__date-trigger span.material-symbols-outlined{font-size:16px;color:var(--nvb-color-neutral-500)}.nvb-table-detailed-search__date-placeholder{color:var(--nvb-color-neutral-500)}.nvb-table-detailed-search__date-menu{position:absolute;top:calc(100% + 4px);left:0;border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-8);width:280px;max-width:min(92vw,320px);z-index:var(--nvb-floating-overlay-z-index, 2147483000);padding:8px;display:flex;flex-direction:column;gap:8px}.nvb-table-detailed-search__date-header{display:flex;align-items:center;justify-content:space-between;gap:8px}.nvb-table-detailed-search__date-header>span{font-size:13px;font-weight:600;color:var(--nvb-color-neutral-700);text-transform:capitalize}.nvb-table-detailed-search__date-header>button{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-color-neutral-300));background:var(--nvb-control-button-bg, var(--nvb-color-neutral-050));color:var(--nvb-control-button-text-color, var(--nvb-color-primary-700));border-radius:var(--nvb-control-radius);width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.nvb-table-detailed-search__date-header>button:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-table-detailed-search__date-weekdays{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px}.nvb-table-detailed-search__date-weekdays>span{text-align:center;font-size:11px;color:var(--nvb-color-neutral-500);text-transform:uppercase}.nvb-table-detailed-search__date-days{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px}.nvb-table-detailed-search__date-day{border:1px solid transparent;border-radius:var(--nvb-radius-md);background:transparent;color:var(--nvb-color-neutral-700);min-height:30px;font-size:12px;cursor:pointer}.nvb-table-detailed-search__date-day:hover{background:var(--nvb-color-neutral-100)}.nvb-table-detailed-search__date-day--outside{color:var(--nvb-color-neutral-400)}.nvb-table-detailed-search__date-day--today{border-color:var(--nvb-color-primary-300)}.nvb-table-detailed-search__date-day--selected{background:var(--nvb-color-primary-500);color:var(--nvb-color-neutral-000)}.nvb-table-detailed-search__date-actions{display:flex;justify-content:flex-end}.nvb-table-detailed-search__date-actions>button{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-color-neutral-300));border-radius:var(--nvb-radius-md);background:var(--nvb-control-button-bg, var(--nvb-color-neutral-050));color:var(--nvb-control-button-text-color, var(--nvb-color-primary-700));min-height:30px;padding:0 10px;cursor:pointer}.nvb-table-detailed-search__date-actions>button:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-table{width:100%;border-collapse:collapse;table-layout:auto;background:var(--nvb-color-neutral-000)}.nvb-table th,.nvb-table td{border-bottom:1px solid var(--nvb-table-surface-border);padding:7px 10px;font-size:13px;line-height:18px;vertical-align:middle}.nvb-table-cell-content{display:flex;flex-direction:column;gap:6px;min-width:0}.nvb-table-cell-content__value{min-width:0;word-break:break-word}.nvb-table-interactive-control{display:inline-flex;align-items:center;justify-content:flex-start;min-height:24px;cursor:pointer}.nvb-table-interactive-control--toggle.nvb-toggle-switch,.nvb-table-interactive-control--checkbox.nvb-single-checkbox{gap:0;min-height:24px}.nvb-table-interactive-control--toggle.nvb-toggle-switch--disabled,.nvb-table-interactive-control--checkbox.nvb-single-checkbox--disabled{opacity:.6;cursor:not-allowed}.nvb-table-interactive-control--checkbox .nvb-single-checkbox__input{margin:0}.nvb-table-interactive-control--toggle .nvb-toggle-switch__input{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.nvb-table-interactive-control--toggle .nvb-toggle-switch__track{position:relative;width:36px;height:20px;border-radius:var(--nvb-radius-full);border:1px solid var(--nvb-color-neutral-300);background:var(--nvb-color-neutral-100);transition:border-color .16s ease,background-color .16s ease}.nvb-table-interactive-control--toggle .nvb-toggle-switch__thumb{position:absolute;top:1px;left:1px;width:16px;height:16px;border-radius:var(--nvb-radius-full);background:var(--nvb-color-neutral-000);box-shadow:0 1px 3px #0003;transition:transform .16s ease}.nvb-table-interactive-control--toggle .nvb-toggle-switch__input:checked+.nvb-toggle-switch__track{border-color:var(--nvb-color-primary-500);background:var(--nvb-color-primary-500)}.nvb-table-interactive-control--toggle .nvb-toggle-switch__input:checked+.nvb-toggle-switch__track .nvb-toggle-switch__thumb{transform:translate(16px)}.nvb-table-template-host{display:block;min-width:0}.nvb-table-cell-element{display:block;min-width:0;width:100%}.nvb-table-row-template-cell{min-width:0}.nvb-table-row-template-host{display:block;width:100%;min-width:0}.nvb-table-cell-actions{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}.nvb-table-cell-actions__select{min-width:170px}.nvb-table-cell-actions__button{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-table-surface-border-strong));background:var(--nvb-control-button-bg, var(--nvb-color-neutral-000));color:var(--nvb-control-button-text-color, var(--nvb-color-neutral-700));border-radius:var(--nvb-table-control-radius);min-height:var(--nvb-table-control-height);padding:0 var(--nvb-table-control-padding-x);display:inline-flex;align-items:center;gap:6px;cursor:pointer}.nvb-table-cell-actions__button:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-table-cell-actions__button--icon-only{width:var(--nvb-table-control-height);min-width:var(--nvb-table-control-height);padding:0;justify-content:center}.nvb-table-cell-actions__button span.material-symbols-outlined{font-size:16px}.nvb-table-frame:not(.nvb-table-frame--with-paginator) .nvb-table>tbody>tr:last-child>td{border-bottom:0}.nvb-table th{background:color-mix(in oklab,var(--nvb-color-neutral-050) 34%,var(--nvb-color-neutral-000));color:var(--nvb-color-neutral-800);font-size:12px;font-weight:600;letter-spacing:.01em;white-space:nowrap}.nvb-table--sticky-header.nvb-table--virtual-scroll thead th{position:sticky;top:var(--nvb-table-sticky-header-offset, 0px);z-index:26;background-clip:padding-box}.nvb-table-frame--with-toolbar .nvb-table thead th{border-top:1px solid var(--nvb-table-surface-border)}.nvb-table th.nvb-sorted-active{color:var(--nvb-color-primary-700);background:color-mix(in oklab,var(--nvb-color-primary-500) 7%,var(--nvb-color-surface-mix-target, white))}.nvb-table th.nvb-column-focused,.nvb-nested-table th.nvb-column-focused{position:relative}.nvb-table th.nvb-column-focused:after,.nvb-nested-table th.nvb-column-focused:after{content:\"\";position:absolute;inset:0;border:2px solid var(--nvb-color-primary-500);pointer-events:none}.nvb-table-frame:not(.nvb-table-frame--with-toolbar) .nvb-table thead tr:first-child th.nvb-column-focused:first-child:after{border-top-left-radius:calc(var(--nvb-table-surface-radius) - 1px)}.nvb-table-frame:not(.nvb-table-frame--with-toolbar) .nvb-table thead tr:first-child th.nvb-column-focused:last-child:after{border-top-right-radius:calc(var(--nvb-table-surface-radius) - 1px)}.nvb-table th.nvb-column-focused{background:color-mix(in oklab,var(--nvb-color-primary-050) 75%,var(--nvb-color-surface-mix-target, white))}.nvb-table th.nvb-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.nvb-table th.nvb-sortable:hover{background:color-mix(in oklab,var(--nvb-color-neutral-100) 80%,var(--nvb-color-surface-mix-target, white))}.nvb-sort-icon{font-size:16px;margin-left:4px;vertical-align:middle;color:var(--nvb-color-neutral-500)}.nvb-sort-icon--active{color:var(--nvb-color-primary-600)}.nvb-align-left{text-align:left}.nvb-align-center{text-align:center}.nvb-align-right{text-align:right}.nvb-empty-cell{text-align:center;color:var(--nvb-color-neutral-500);padding:14px 10px}.nvb-action-column,.nvb-action-cell{min-width:56px;width:auto;text-align:right}.nvb-action-header{display:inline-flex;align-items:center;justify-content:flex-end;gap:6px;width:100%;position:relative}.nvb-action-header__label{display:inline-flex;align-items:center;gap:4px}.nvb-expand-column,.nvb-expand-cell{width:32px;min-width:32px;text-align:center}.nvb-expand-toggle{border:1px solid color-mix(in oklab,var(--nvb-color-neutral-300) 82%,transparent);background:color-mix(in oklab,var(--nvb-color-neutral-000) 96%,var(--nvb-color-primary-050) 4%);border-radius:var(--nvb-button-radius, var(--nvb-control-radius, var(--nvb-radius-sm)));width:28px;min-width:28px;height:28px;display:inline-flex;justify-content:center;align-items:center;cursor:pointer;transition:background-color .16s ease,border-color .16s ease,color .16s ease,box-shadow .16s ease;color:var(--nvb-color-neutral-600);box-shadow:0 1px 2px #0000000a}.nvb-expand-toggle:hover{border-color:color-mix(in oklab,var(--nvb-color-primary-300) 70%,transparent);background:color-mix(in oklab,var(--nvb-color-primary-050) 92%,white);color:var(--nvb-color-primary-700)}.nvb-expand-toggle span{font-size:16px;transition:transform .16s ease}.nvb-expand-toggle--expanded span{transform:rotate(90deg)}.nvb-expand-toggle--expanded{border-color:color-mix(in oklab,var(--nvb-color-primary-300) 78%,transparent);background:color-mix(in oklab,var(--nvb-color-primary-050) 88%,white);color:var(--nvb-color-primary-700)}.nvb-select-column,.nvb-select-cell{width:42px;text-align:center}.nvb-select-column input,.nvb-select-cell input{width:16px;min-width:16px;height:16px;min-height:16px;cursor:pointer}.nvb-row-actions{position:relative;display:inline-flex;justify-content:flex-end}.nvb-row-actions--inline{gap:6px;flex-wrap:wrap}.nvb-row-actions__inline-button{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-table-surface-border-strong));background:var(--nvb-control-button-bg, var(--nvb-color-neutral-000));color:var(--nvb-control-button-text-color, var(--nvb-color-neutral-700));border-radius:var(--nvb-table-control-radius);min-height:var(--nvb-table-control-height);padding:0 var(--nvb-table-control-padding-x);display:inline-flex;justify-content:center;align-items:center;gap:6px;cursor:pointer}.nvb-row-actions__inline-button:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-row-actions__inline-button:disabled,.nvb-row-actions__toggle:disabled{opacity:.65;cursor:wait}.nvb-row-actions__inline-button--icon-only{width:var(--nvb-table-control-height);min-width:var(--nvb-table-control-height);padding:0}.nvb-row-actions__inline-button span.material-symbols-outlined{font-size:16px}.nvb-row-actions__toggle{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-table-surface-border-strong));background:var(--nvb-control-button-bg, var(--nvb-color-neutral-000));color:var(--nvb-control-button-text-color, var(--nvb-color-neutral-700));border-radius:var(--nvb-table-control-radius);width:var(--nvb-table-control-height);min-width:var(--nvb-table-control-height);height:var(--nvb-table-control-height);display:inline-flex;justify-content:center;align-items:center;cursor:pointer}.nvb-row-actions__toggle--borderless{border-color:transparent;background:transparent;color:var(--nvb-color-neutral-600);box-shadow:none}.nvb-row-actions__toggle span{font-size:16px}.nvb-row-actions__toggle:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-row-actions__toggle--borderless:hover{border-color:transparent;background:var(--nvb-color-neutral-100);color:var(--nvb-color-neutral-800)}.nvb-row-actions__menu{position:fixed;top:0;left:0;min-width:160px;z-index:var(--nvb-floating-overlay-z-index, 2147483000);background:var(--nvb-color-neutral-000);border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));box-shadow:var(--nvb-shadow-8);padding:4px;display:flex;flex-direction:column;gap:2px}.nvb-row-actions__menu--top{transform:translateY(calc(-100% - 6px))}.nvb-row-actions__menu button{width:100%;border:none;background:transparent;border-radius:var(--nvb-table-control-radius);display:flex;align-items:center;gap:6px;min-height:28px;padding:0 10px;text-align:left;cursor:pointer;color:var(--nvb-color-neutral-700);font-family:var(--nvb-font-family);font-size:var(--nvb-table-control-font-size);font-weight:var(--nvb-control-font-weight, 500)}.nvb-row-actions__menu button:hover{background:var(--nvb-color-neutral-100)}.nvb-row-actions__menu button span.material-symbols-outlined{font-size:16px}.nvb-row-actions__empty{font-size:11px;color:var(--nvb-color-neutral-400)}.nvb-table__row--editing>td{background:color-mix(in srgb,var(--nvb-color-primary-050) 72%,white)}.nvb-table-inline-edit{width:100%;min-height:34px;border:1px solid var(--nvb-color-primary-300);border-radius:var(--nvb-input-radius, var(--nvb-radius-md));background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-900);font:inherit;padding:6px 10px}.nvb-table-inline-edit--textarea{resize:vertical;min-height:72px}.nvb-table-inline-edit:focus{outline:0;border-color:var(--nvb-color-primary-500);box-shadow:var(--nvb-focus-ring)}.nvb-table-virtual-spacer-row td{padding:0;border:0;background:transparent}.nvb-table-virtual-spacer-cell{height:0}.nvb-selection-actions{position:relative;display:inline-flex;align-items:center}.nvb-selection-actions__toggle{min-width:var(--nvb-table-control-height);min-height:var(--nvb-table-control-height);border:1px solid var(--nvb-color-primary-300);border-radius:var(--nvb-table-control-radius);background:var(--nvb-color-primary-050);color:var(--nvb-color-primary-700);display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:0 var(--nvb-table-control-padding-x);cursor:pointer}.nvb-selection-actions__toggle span.material-symbols-outlined{font-size:16px}.nvb-selection-actions__count{min-width:16px;height:16px;border-radius:var(--nvb-radius-full);font-size:10px;font-weight:600;color:var(--nvb-color-neutral-000);background:var(--nvb-color-primary-600);display:inline-flex;align-items:center;justify-content:center;padding:0 4px}.nvb-selection-actions__menu{position:fixed;top:0;left:0;min-width:190px;z-index:var(--nvb-floating-overlay-z-index, 2147483000);background:var(--nvb-color-neutral-000);border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));box-shadow:var(--nvb-shadow-8);padding:4px;display:flex;flex-direction:column;gap:2px}.nvb-selection-actions__menu--top{transform:translateY(calc(-100% - 6px))}.nvb-selection-actions__menu button{width:100%;border:none;background:transparent;border-radius:var(--nvb-table-control-radius);display:flex;align-items:center;gap:6px;min-height:28px;padding:0 10px;text-align:left;cursor:pointer;color:var(--nvb-color-neutral-700);font-family:var(--nvb-font-family);font-size:var(--nvb-table-control-font-size);font-weight:var(--nvb-control-font-weight, 500)}.nvb-selection-actions__menu button:hover{background:var(--nvb-color-neutral-100)}.nvb-selection-actions__menu button span.material-symbols-outlined{font-size:16px}.nvb-status-pill{display:inline-flex;align-items:center;justify-content:center;min-height:20px;gap:4px;border-radius:var(--nvb-table-control-radius);padding:2px 8px;font-size:11px;line-height:1.2;border:1px solid transparent}.nvb-status-pill--rounded{border-radius:var(--nvb-radius-full)}.nvb-status-pill__icon{font-size:14px}.nvb-status-pill--neutral{background:var(--nvb-color-neutral-100);color:var(--nvb-color-neutral-700);border-color:var(--nvb-color-neutral-300)}.nvb-status-pill--success{background:color-mix(in oklab,var(--nvb-color-success-500) 14%,var(--nvb-color-surface-mix-target, white));color:color-mix(in oklab,var(--nvb-color-success-500) 80%,black);border-color:color-mix(in oklab,var(--nvb-color-success-500) 28%,var(--nvb-color-surface-mix-target, white))}.nvb-status-pill--danger,.nvb-status-pill--risk{background:var(--nvb-color-risk-050);color:var(--nvb-color-risk-700);border-color:var(--nvb-color-risk-300)}.nvb-status-pill--warning{background:color-mix(in oklab,var(--nvb-color-warning-500) 18%,var(--nvb-color-surface-mix-target, white));color:color-mix(in oklab,var(--nvb-color-warning-500) 80%,black);border-color:color-mix(in oklab,var(--nvb-color-warning-500) 36%,var(--nvb-color-surface-mix-target, white))}.nvb-status-pill--info,.nvb-status-pill--primary{background:color-mix(in oklab,var(--nvb-color-primary-500) 14%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-primary-700);border-color:color-mix(in oklab,var(--nvb-color-primary-500) 30%,var(--nvb-color-surface-mix-target, white))}.nvb-table__row--expanded td{background:color-mix(in oklab,var(--nvb-color-primary-500) 6%,var(--nvb-color-surface-mix-target, white))}.nvb-table-expanded-inline-row__cell{padding:0!important;background:transparent}.nvb-table-expanded-inline-row__content{padding:12px;background:color-mix(in oklab,var(--nvb-color-primary-500) 4%,var(--nvb-color-surface-mix-target, white));border-top:1px solid var(--nvb-color-neutral-200)}.nvb-table-detail-panel{flex:0 0 clamp(260px,34%,420px);min-width:260px;max-width:420px;border-left:1px solid var(--nvb-color-neutral-200);background:color-mix(in oklab,var(--nvb-color-neutral-000) 94%,var(--nvb-color-surface-mix-target, white));padding:10px;display:flex;flex-direction:column;gap:10px;overflow:auto}.nvb-table-detail-panel__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.nvb-table-detail-panel__title{font-size:13px;color:var(--nvb-color-neutral-700)}.nvb-table-detail-panel__close{width:24px;min-width:24px;height:24px;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-md);background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-600);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.nvb-table-detail-panel__close span{font-size:16px}.nvb-table-detail-panel__close:hover{border-color:var(--nvb-color-neutral-400);background:color-mix(in oklab,var(--nvb-color-neutral-100) 88%,var(--nvb-color-surface-mix-target, white))}.nvb-expanded-row__template{color:var(--nvb-color-neutral-700);font-size:13px}.nvb-expanded-row__loading,.nvb-expanded-row__error,.nvb-expanded-row__empty{border:1px dashed var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-lg);background:var(--nvb-color-neutral-050);padding:10px 12px;font-size:12px}.nvb-expanded-row__loading,.nvb-expanded-row__empty{color:var(--nvb-color-neutral-500)}.nvb-expanded-row__error{color:var(--nvb-color-risk-700);border-color:var(--nvb-color-risk-300);background:var(--nvb-color-risk-050)}.nvb-expanded-row__details{display:grid;gap:8px;grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.nvb-expanded-row__detail-item{border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-radius-lg);background:var(--nvb-color-neutral-000);padding:8px;display:flex;flex-direction:column;gap:4px}.nvb-expanded-row__detail-label{font-size:11px;color:var(--nvb-color-neutral-500);font-weight:600}.nvb-expanded-row__detail-value{font-size:13px;color:var(--nvb-color-neutral-700);word-break:break-word}.nvb-nested-table{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-radius-md);overflow:hidden}.nvb-nested-table th,.nvb-nested-table td{border-bottom:1px solid var(--nvb-color-neutral-200);padding:6px 8px;font-size:12px}.nvb-nested-table th{background:var(--nvb-color-neutral-050);color:var(--nvb-color-neutral-700)}.nvb-nested-table th.nvb-column-focused{background:color-mix(in oklab,var(--nvb-color-primary-050) 75%,var(--nvb-color-surface-mix-target, white))}.nvb-nested-table__header--focusable{cursor:pointer}.nvb-nested-table__placeholder-row td{color:transparent;min-height:32px}.nvb-nested-table tr:last-child td{border-bottom:none}.nvb-expanded-row__actions{display:inline-flex;flex-wrap:wrap;justify-content:flex-end;gap:4px}.nvb-expanded-row__action{border:1px solid var(--nvb-color-neutral-300);background:#fff;border-radius:var(--nvb-radius-md);padding:4px 6px;display:inline-flex;align-items:center;gap:4px;color:var(--nvb-color-neutral-700);cursor:pointer;font-size:11px}.nvb-expanded-row__action--icon-only{width:var(--nvb-table-control-height);min-width:var(--nvb-table-control-height);height:var(--nvb-table-control-height);padding:0;justify-content:center}.nvb-expanded-row__action span.material-symbols-outlined{font-size:14px}.nvb-table-skeleton__row td{padding-top:10px;padding-bottom:10px}.nvb-table-skeleton__line{display:block;height:12px;border-radius:var(--nvb-radius-full);background:linear-gradient(90deg,color-mix(in oklab,var(--nvb-color-neutral-100) 92%,var(--nvb-color-surface-mix-target, white)),color-mix(in oklab,var(--nvb-color-neutral-200) 95%,var(--nvb-color-surface-mix-target, white)),color-mix(in oklab,var(--nvb-color-neutral-100) 92%,var(--nvb-color-surface-mix-target, white)));background-size:240% 100%;animation:table-loading-shimmer 1.05s ease-in-out infinite}.nvb-table-skeleton__dot{display:inline-block;width:16px;height:16px;border-radius:var(--nvb-radius-full);background:color-mix(in oklab,var(--nvb-color-neutral-200) 88%,var(--nvb-color-surface-mix-target, white));box-shadow:inset 0 0 0 1px color-mix(in oklab,var(--nvb-color-neutral-300) 75%,transparent)}.nvb-table-skeleton__dot--action{width:22px;height:22px;border-radius:var(--nvb-radius-lg)}.nvb-table-loading{position:absolute;inset:0;display:flex;flex-direction:column;gap:12px;justify-content:flex-start;align-items:stretch;padding:12px;font-size:13px;background:color-mix(in oklab,var(--nvb-color-neutral-000) 90%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);color:var(--nvb-color-neutral-700);z-index:5;animation:table-loading-fade .16s ease-out}.nvb-table-loading__skeleton{width:min(100%,980px);margin:0 auto;display:grid;gap:10px;padding:12px;border-radius:var(--nvb-radius-lg);border:1px solid color-mix(in oklab,var(--nvb-color-neutral-300) 72%,transparent);background:color-mix(in oklab,var(--nvb-color-neutral-000) 96%,transparent);box-shadow:0 1px color-mix(in oklab,var(--nvb-color-neutral-100) 80%,transparent),0 12px 24px color-mix(in oklab,var(--nvb-color-neutral-900) 8%,transparent)}.nvb-table-loading__row{height:16px;border-radius:var(--nvb-radius-full);background:linear-gradient(90deg,color-mix(in oklab,var(--nvb-color-neutral-100) 92%,var(--nvb-color-surface-mix-target, white)),color-mix(in oklab,var(--nvb-color-neutral-200) 95%,var(--nvb-color-surface-mix-target, white)),color-mix(in oklab,var(--nvb-color-neutral-100) 92%,var(--nvb-color-surface-mix-target, white)));background-size:240% 100%;animation:table-loading-shimmer 1.05s ease-in-out infinite}.nvb-table-loading__row:first-child{height:22px;width:96%;border-radius:var(--nvb-radius-lg)}.nvb-table-loading__row:nth-child(2){width:90%}.nvb-table-loading__row:nth-child(3){width:94%}.nvb-table-loading__row:nth-child(4){width:86%}.nvb-table-loading__row:nth-child(5){width:92%}.nvb-table-loading__label{align-self:center;font-size:11px;font-weight:500;letter-spacing:.02em;padding:4px 10px;border-radius:var(--nvb-radius-full);background:color-mix(in oklab,var(--nvb-color-neutral-050) 86%,transparent);border:1px solid color-mix(in oklab,var(--nvb-color-neutral-300) 66%,transparent);color:var(--nvb-color-neutral-600)}.nvb-table-paginator{display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:7px 10px;background:color-mix(in oklab,var(--nvb-color-neutral-050) 52%,var(--nvb-color-neutral-000));border:1px solid var(--nvb-table-surface-border);border-top:none;border-bottom-left-radius:var(--nvb-table-surface-radius);border-bottom-right-radius:var(--nvb-table-surface-radius);flex-wrap:wrap}.nvb-table-paginator__content,.nvb-table-paginator__controls{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0}.nvb-table-paginator--flat{padding:8px 0 0;border:none;border-radius:0;background:transparent}.nvb-table-paginator--align-start{justify-content:flex-start}.nvb-table-paginator--align-center{justify-content:center}.nvb-table-paginator__size{display:inline-flex;align-items:center;min-width:0;margin-inline-start:auto}.nvb-table-paginator--align-start .nvb-table-paginator__size,.nvb-table-paginator--align-center .nvb-table-paginator__size{margin-inline-start:0}.nvb-table-paginator__nav,.nvb-table-paginator__page{border:1px solid var(--nvb-table-surface-border-strong);background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-700);border-radius:var(--nvb-table-control-radius);min-width:var(--nvb-table-control-height);min-height:var(--nvb-table-control-height);padding:0 var(--nvb-table-control-padding-x);font-size:var(--nvb-table-control-font-size);cursor:pointer;transition:border-color .14s ease,background-color .14s ease,color .14s ease,box-shadow .14s ease;box-shadow:0 1px 1px color-mix(in oklab,var(--nvb-color-neutral-900) 3%,transparent)}.nvb-table-paginator__nav{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap}.nvb-table-paginator__nav:not(:disabled):hover,.nvb-table-paginator__page:not(:disabled):hover{border-color:var(--nvb-color-primary-300);background:color-mix(in oklab,var(--nvb-color-primary-500) 8%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-primary-700)}.nvb-table-paginator__nav--icon{min-width:var(--nvb-table-control-height);width:var(--nvb-table-control-height);padding:0}.nvb-table-paginator__nav--icon span{font-size:16px;color:inherit}.nvb-table-paginator__pages{display:inline-flex;align-items:center;gap:3px;flex-wrap:wrap}.nvb-table-paginator__size-select{width:84px;min-width:84px}.nvb-table-paginator__nav:disabled,.nvb-table-paginator__page:disabled{opacity:1;cursor:not-allowed;background:color-mix(in oklab,var(--nvb-color-neutral-100) 58%,var(--nvb-color-surface-mix-target, white));border-color:color-mix(in oklab,var(--nvb-color-neutral-300) 54%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-neutral-400);box-shadow:none}.nvb-table-paginator__page--active,.nvb-table-paginator__page--active:disabled{opacity:1;border-color:var(--nvb-color-primary-500);background:color-mix(in oklab,var(--nvb-color-primary-500) 12%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-primary-700);font-weight:600}.nvb-table-paginator__meta{font-size:12px;color:var(--nvb-color-neutral-600)}.nvb-table-paginator--compact{gap:10px;padding:8px 10px;background:var(--nvb-color-neutral-000)}.nvb-table-paginator--compact .nvb-table-paginator__content,.nvb-table-paginator--compact .nvb-table-paginator__controls,.nvb-table-paginator--compact .nvb-table-paginator__pages{gap:6px}.nvb-table-paginator--compact .nvb-table-paginator__nav,.nvb-table-paginator--compact .nvb-table-paginator__page{min-width:30px;min-height:30px;height:30px;padding:0 8px;border:1px solid transparent;border-radius:var(--nvb-radius-full);background:transparent;color:var(--nvb-color-neutral-600);box-shadow:none}.nvb-table-paginator--compact .nvb-table-paginator__nav--icon{width:30px;padding:0}.nvb-table-paginator--compact .nvb-table-paginator__nav:not(:disabled):hover,.nvb-table-paginator--compact .nvb-table-paginator__page:not(:disabled):hover{border-color:color-mix(in oklab,var(--nvb-color-neutral-300) 72%,transparent);background:color-mix(in oklab,var(--nvb-color-neutral-100) 78%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-neutral-900)}.nvb-table-paginator--compact .nvb-table-paginator__page--active,.nvb-table-paginator--compact .nvb-table-paginator__page--active:disabled{border-color:var(--nvb-color-neutral-950);background:var(--nvb-color-neutral-950);color:var(--nvb-color-neutral-000);font-weight:700}.nvb-table-paginator--compact .nvb-table-paginator__nav:disabled,.nvb-table-paginator--compact .nvb-table-paginator__page:disabled{opacity:.4;background:transparent;border-color:transparent;color:var(--nvb-color-neutral-400)}.nvb-table-paginator--compact .nvb-table-paginator__meta{padding:0 6px}.nvb-table-paginator--compact .nvb-table-paginator__size{margin-inline-start:auto}.nvb-table-paginator--compact .nvb-table-paginator__size-select{width:84px;min-width:84px}.nvb-table-paginator--segmented{gap:10px;padding:8px 10px;background:var(--nvb-color-neutral-000)}.nvb-table-paginator--segmented .nvb-table-paginator__content{gap:10px}.nvb-table-paginator--segmented .nvb-table-paginator__controls{gap:0;border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-table-control-radius);overflow:hidden;background:var(--nvb-color-neutral-000)}.nvb-table-paginator--segmented .nvb-table-paginator__pages{gap:0}.nvb-table-paginator--segmented .nvb-table-paginator__nav,.nvb-table-paginator--segmented .nvb-table-paginator__page{min-width:32px;min-height:32px;height:32px;padding:0 10px;border:none;border-radius:0;background:transparent;color:var(--nvb-color-neutral-700);box-shadow:none}.nvb-table-paginator--segmented .nvb-table-paginator__nav--icon{width:32px;padding:0}.nvb-table-paginator--segmented .nvb-table-paginator__nav+.nvb-table-paginator__nav,.nvb-table-paginator--segmented .nvb-table-paginator__nav+.nvb-table-paginator__pages,.nvb-table-paginator--segmented .nvb-table-paginator__pages+.nvb-table-paginator__nav,.nvb-table-paginator--segmented .nvb-table-paginator__pages+.nvb-table-paginator__pages,.nvb-table-paginator--segmented .nvb-table-paginator__page+.nvb-table-paginator__page{border-inline-start:1px solid color-mix(in oklab,var(--nvb-color-neutral-300) 86%,transparent)}.nvb-table-paginator--segmented .nvb-table-paginator__nav:not(:disabled):hover,.nvb-table-paginator--segmented .nvb-table-paginator__page:not(:disabled):hover{background:color-mix(in oklab,var(--nvb-color-primary-500) 10%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-primary-700)}.nvb-table-paginator--segmented .nvb-table-paginator__page--active,.nvb-table-paginator--segmented .nvb-table-paginator__page--active:disabled{background:var(--nvb-color-primary-600);color:var(--nvb-color-neutral-000);font-weight:700}.nvb-table-paginator--segmented .nvb-table-paginator__nav:disabled,.nvb-table-paginator--segmented .nvb-table-paginator__page:disabled{opacity:1;background:transparent;color:var(--nvb-color-neutral-400);border-color:transparent}.nvb-table-paginator--segmented .nvb-table-paginator__size-select{width:84px;min-width:84px}.nvb-table-paginator--compact.nvb-table-paginator--flat,.nvb-table-paginator--segmented.nvb-table-paginator--flat{padding:8px 0 0;border:none;border-radius:0;background:transparent}.nvb-table--grid th,.nvb-table--grid td{border-right:1px solid var(--nvb-table-surface-border)}.nvb-table--grid th:last-child,.nvb-table--grid td:last-child{border-right:none}.nvb-table--striped tbody tr:nth-child(2n){background:color-mix(in oklab,var(--nvb-color-neutral-050) 74%,var(--nvb-color-surface-mix-target, white))}.nvb-table--row-hover tbody>tr:not(.nvb-expanded-row):hover>td{background:color-mix(in oklab,var(--nvb-color-primary-500) 5%,var(--nvb-color-surface-mix-target, white))}.nvb-table__row--active>td{background:color-mix(in oklab,var(--nvb-color-primary-500) 8%,var(--nvb-color-surface-mix-target, white))}.nvb-table--force-stack thead{display:none}.nvb-table--force-stack,.nvb-table--force-stack tbody,.nvb-table--force-stack tr,.nvb-table--force-stack td{display:block;width:100%}.nvb-table--force-stack tr{display:block;width:100%;border-bottom:1px solid var(--nvb-color-neutral-200);padding:6px 0}.nvb-table--force-stack td{border:none;display:grid;grid-template-columns:minmax(110px,36%) 1fr;gap:8px;padding:6px 10px;text-align:left}.nvb-table--force-stack td:before{content:attr(data-label);font-size:11px;color:var(--nvb-color-neutral-500);font-weight:600}.nvb-table--force-stack .nvb-action-cell{justify-items:end}.nvb-table--force-stack .nvb-expand-cell,.nvb-table--force-stack .nvb-table-expanded-inline-row__cell{grid-template-columns:1fr}.nvb-table--force-stack .nvb-expand-cell:before,.nvb-table--force-stack .nvb-table-expanded-inline-row__cell:before,.nvb-table--force-stack .nvb-table-row-template-cell:before{content:none}.nvb-table--force-stack .nvb-expand-cell,.nvb-table--force-stack .nvb-table-row-template-cell{justify-items:start;grid-template-columns:1fr}.nvb-table--force-stack .nvb-table-expanded-inline-row__content{width:100%}.nvb-table-dialog-backdrop{position:fixed;inset:0;background:#0f172a5c;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);z-index:1500}.nvb-table-dialog{--nvb-floating-overlay-z-index: 1520;--nvb-page-margin-bottom: 0px;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(92vw,760px);max-height:84vh;display:flex;flex-direction:column;border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-dialog-radius);background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-16);z-index:1510;overflow:hidden;min-height:0;outline:0}.nvb-table-dialog--filters{width:min(92vw,680px)}.nvb-table-dialog--column-settings{width:min(92vw,620px)}.nvb-table-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 24px 12px;border-bottom:1px solid var(--nvb-color-neutral-200);flex-shrink:0}.nvb-table-dialog__header h4{margin:0;font-size:16px;line-height:22px;font-weight:600;color:var(--nvb-color-neutral-900)}.nvb-table-dialog__close{width:32px;height:32px;border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-control-radius);background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-600);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background-color .16s ease,border-color .16s ease,color .16s ease}.nvb-table-dialog__close:hover{background:var(--nvb-color-neutral-050);border-color:var(--nvb-color-neutral-400);color:var(--nvb-color-neutral-900)}.nvb-table-dialog__close:focus-visible{outline:0;box-shadow:var(--nvb-focus-ring)}.nvb-table-dialog__close span{font-size:18px}.nvb-table-dialog__body{padding:16px 24px;display:flex;flex-direction:column;gap:10px;overflow:auto;flex:1 1 auto;min-height:0}.nvb-table-dialog__select-all{display:inline-flex;align-items:center;gap:8px;font-size:12px;color:var(--nvb-color-neutral-700)}.nvb-table-dialog__footer{border-top:1px solid var(--nvb-color-neutral-200);padding:16px 24px 24px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;flex-shrink:0}.nvb-table-dialog__footer .nvb-table-export__action,.nvb-table-dialog__footer .nvb-table-toolbar__button{width:100%;justify-content:center}.nvb-table-dialog__footer--single{grid-template-columns:1fr}.nvb-table-dialog__tabs{display:flex;align-items:center;gap:4px;padding:0 24px;border-bottom:1px solid var(--nvb-color-neutral-200)}.nvb-table-dialog__tab{position:relative;min-height:40px;border:none;border-radius:0;background:transparent;color:var(--nvb-color-neutral-700);font-size:13px;line-height:20px;font-weight:600;padding:0 12px;cursor:pointer}.nvb-table-dialog__tab:hover{color:var(--nvb-color-neutral-900);background:color-mix(in oklab,var(--nvb-color-neutral-100) 72%,transparent)}.nvb-table-dialog__tab--active{color:var(--nvb-color-primary-700)}.nvb-table-dialog__tab--active:after{content:\"\";position:absolute;left:12px;right:12px;bottom:-1px;height:2px;border-radius:var(--nvb-radius-full);background:var(--nvb-color-primary-600)}.nvb-table-dialog__tab:focus-visible{outline:0;box-shadow:inset 0 0 0 2px var(--nvb-color-primary-500)}.nvb-table-export__columns{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:8px}.nvb-table-column-settings{display:flex;flex-direction:column;gap:10px}.nvb-table-column-settings__actions{display:flex;align-items:center;justify-content:flex-end;gap:6px;flex-wrap:wrap}.nvb-table-column-settings__list{display:flex;flex-direction:column;gap:6px;max-height:min(52vh,520px);overflow:auto;padding-right:2px}.nvb-table-column-settings__item{border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-radius-lg);padding:6px 8px;display:grid;grid-template-columns:32px minmax(0,1fr) auto;align-items:center;gap:8px;background:var(--nvb-color-neutral-000)}.nvb-table-column-settings__content{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) minmax(150px,180px);gap:10px;align-items:center}.nvb-table-column-settings__drag{width:32px;min-width:32px;height:32px;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-md);background:var(--nvb-color-neutral-050);color:var(--nvb-color-neutral-600);display:inline-flex;align-items:center;justify-content:center;cursor:grab;flex:0 0 auto}.nvb-table-column-settings__drag:hover{border-color:var(--nvb-color-primary-300);background:var(--nvb-color-primary-050);color:var(--nvb-color-primary-700)}.nvb-table-column-settings__drag:active{cursor:grabbing}.nvb-table-column-settings__list.cdk-drop-list-dragging .nvb-table-column-settings__item:not(.cdk-drag-placeholder){transition:transform .16s ease}.nvb-table-column-settings__item.cdk-drag-preview{box-sizing:border-box;background:var(--nvb-color-neutral-000);border:1px solid var(--nvb-color-primary-300);border-radius:var(--nvb-radius-lg);box-shadow:0 14px 28px #0f172a29}::ng-deep .nvb-table-column-settings__item.cdk-drag-preview .nvb-control__checkbox-input{width:16px;height:16px;margin:0;appearance:none;accent-color:var(--nvb-color-primary-600);border:1px solid var(--nvb-color-neutral-400);border-radius:var(--nvb-radius-sm);background-color:var(--nvb-color-neutral-000);background-repeat:no-repeat;background-position:center;background-size:12px 12px}::ng-deep .nvb-table-column-settings__item.cdk-drag-preview .nvb-control__checkbox-input:checked{border-color:var(--nvb-color-primary-600);background-color:var(--nvb-color-primary-600);background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M3.5 8.5 6.5 11.5 12.5 4.5'/%3E%3C/svg%3E\")}.nvb-table-column-settings__item.cdk-drag-placeholder{opacity:.35;border-style:dashed;background:var(--nvb-color-primary-050)}.nvb-table-column-settings__item.cdk-drag-animating{transition:transform .18s ease}.nvb-table-column-settings__toggle{display:inline-flex;align-items:center;gap:6px;min-width:0;flex:1 1 auto;font-size:12px;color:var(--nvb-color-neutral-800);font-weight:500}.nvb-table-column-settings__toggle .nvb-control__checkbox-input{width:16px;height:16px;margin:0;appearance:none;accent-color:var(--nvb-color-primary-600);border:1px solid var(--nvb-color-neutral-400);border-radius:var(--nvb-radius-sm);background-color:var(--nvb-color-neutral-000);background-repeat:no-repeat;background-position:center;background-size:12px 12px;cursor:pointer;transition:border-color .14s ease,background-color .14s ease,box-shadow .14s ease}.nvb-table-column-settings__toggle .nvb-control__checkbox-input:hover{border-color:var(--nvb-color-primary-500)}.nvb-table-column-settings__toggle .nvb-control__checkbox-input:focus-visible{outline:0;box-shadow:0 0 0 3px color-mix(in oklch,var(--nvb-color-primary-500) 20%,transparent)}.nvb-table-column-settings__toggle .nvb-control__checkbox-input:checked{border-color:var(--nvb-color-primary-600);background-color:var(--nvb-color-primary-600);background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M3.5 8.5 6.5 11.5 12.5 4.5'/%3E%3C/svg%3E\")}.nvb-table-column-settings__toggle span{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow-wrap:anywhere}.nvb-table-column-settings__width{display:flex;flex-direction:column;gap:6px;min-width:0}.nvb-table-column-settings__width-header{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.nvb-table-column-settings__width-header>span{font-size:11px;line-height:1.2;color:var(--nvb-color-neutral-600)}.nvb-table-column-settings__width-meta{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.nvb-table-column-settings__width-reset{min-height:24px;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-full);background:var(--nvb-color-neutral-050);color:var(--nvb-color-neutral-700);font:inherit;font-size:11px;padding:0 10px;cursor:pointer}.nvb-table-column-settings__width-reset:hover{border-color:var(--nvb-color-primary-300);background:var(--nvb-color-primary-050);color:var(--nvb-color-primary-700)}.nvb-table-column-settings__width-reset--active{border-color:var(--nvb-color-primary-300);background:var(--nvb-color-primary-100);color:var(--nvb-color-primary-800)}.nvb-table-column-settings__width-range{display:block}.nvb-table-column-settings__width-range input[type=range]{width:100%;margin:0;accent-color:var(--nvb-color-primary-600);cursor:pointer}.nvb-table-column-settings__width-value{min-width:92px;min-height:28px;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-md);background:var(--nvb-color-neutral-050);color:var(--nvb-color-neutral-800);display:inline-flex;align-items:center;justify-content:center;padding:0 10px;font-size:12px;font-weight:600}.nvb-table-column-settings__order{display:inline-flex;align-items:center;gap:4px;flex:0 0 auto}.nvb-table-column-settings__move{width:30px;height:30px;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-md);background:var(--nvb-color-neutral-050);color:var(--nvb-color-neutral-700);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.nvb-table-column-settings__move:hover:not(:disabled){border-color:var(--nvb-color-primary-300);background:var(--nvb-color-primary-050);color:var(--nvb-color-primary-700)}.nvb-table-column-settings__move:disabled{opacity:.5;cursor:not-allowed}@media(max-width:720px){.nvb-table-column-settings__content{grid-template-columns:minmax(0,1fr)}}.nvb-table-dialog--column-settings .nvb-table-dialog__footer{grid-template-columns:repeat(2,minmax(0,1fr))}.nvb-table-export__column{border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-radius-lg);padding:8px;display:inline-flex;align-items:center;gap:8px;font-size:12px;color:var(--nvb-color-neutral-700)}.nvb-table-filter-form{display:flex;flex-direction:column;gap:10px}.nvb-table-filter-form__row{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--nvb-color-neutral-700)}.nvb-table-filter-form__row input{border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-md);min-height:34px;padding:0 10px;font-size:12px;color:var(--nvb-color-neutral-700)}.nvb-table-filter-list{display:flex;flex-direction:column;gap:8px}.nvb-table-filter-list__item{border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-radius-lg);padding:10px;display:flex;justify-content:space-between;align-items:center;gap:10px}.nvb-table-filter-list__meta{min-width:0;display:flex;flex-direction:column;gap:2px}.nvb-table-filter-list__meta strong{font-size:13px;color:var(--nvb-color-neutral-800)}.nvb-table-filter-list__meta span,.nvb-table-filter-list__meta small{font-size:11px;color:var(--nvb-color-neutral-600)}.nvb-table-filter-list__actions{display:inline-flex;align-items:center;gap:6px}.nvb-table-filter-list__empty{font-size:12px;color:var(--nvb-color-neutral-500);padding:6px 0}@keyframes table-loading-fade{0%{opacity:0}to{opacity:1}}@keyframes table-loading-shimmer{0%{background-position:100% 0}to{background-position:-100% 0}}@container (max-width: 768px){.nvb-table-sticky-clone{display:none}.nvb-table-toolbar{flex-direction:column;align-items:stretch}.nvb-table-toolbar__left,.nvb-table-toolbar__center,.nvb-table-toolbar__right{width:100%;justify-content:flex-start;flex:0 0 auto}.nvb-table-toolbar__center{min-width:0}.nvb-table-toolbar__center--controls-only{justify-content:flex-start}.nvb-table-toolbar__right{margin-left:0}.nvb-table-toolbar__dropzone--center{flex:0 0 auto}.nvb-table-toolbar__drop-item{min-width:0;max-width:none;width:100%;flex-basis:100%}.nvb-table-toolbar__add-menu{position:static;width:100%;min-width:0;max-height:220px;margin-top:6px;box-shadow:none}.nvb-table-toolbar__button--detailed-toggle{width:100%;justify-content:space-between}.nvb-table-quick-search,.nvb-table-export{width:100%}.nvb-table-header-menu{width:100%;min-width:0}.nvb-table-export>.nvb-table-toolbar__button{width:100%;justify-content:space-between}.nvb-table-export__menu{left:0;right:auto;width:min(100%,280px)}.nvb-table-detailed-search__row{grid-template-columns:1fr}.nvb-table-detailed-search__remove,.nvb-table-detailed-search__actions{width:100%}.nvb-table-detailed-search__actions .nvb-table-toolbar__button{width:100%;justify-content:center}.nvb-table-cell-actions{width:100%}.nvb-table-frame{flex-direction:column}.nvb-table-detail-panel{width:100%;min-width:0;max-width:none;border-left:none;border-top:1px solid var(--nvb-color-neutral-200)}.nvb-table-cell-actions__select{width:100%;min-width:0}.nvb-table-dialog{width:min(94vw,720px);max-height:88vh}.nvb-table-dialog__footer{grid-template-columns:1fr}.nvb-table-filter-list__item{flex-direction:column;align-items:stretch}.nvb-table-filter-list__actions{width:100%}.nvb-table-filter-list__actions .nvb-table-toolbar__button{flex:1 1 0;justify-content:center}.nvb-table--auto-stack thead{display:none}.nvb-table--auto-stack,.nvb-table--auto-stack tbody,.nvb-table--auto-stack tr,.nvb-table--auto-stack td{display:block;width:100%}.nvb-table--auto-stack tr{border-bottom:1px solid var(--nvb-color-neutral-200);padding:6px 0}.nvb-table--auto-stack td{border:none;display:grid;grid-template-columns:minmax(110px,36%) 1fr;gap:8px;padding:6px 10px;text-align:left}.nvb-table--auto-stack td:before{content:attr(data-label);font-size:11px;color:var(--nvb-color-neutral-500);font-weight:600}.nvb-table--auto-stack .nvb-action-cell{justify-items:end}.nvb-table--auto-stack .nvb-expand-cell,.nvb-table--auto-stack .nvb-table-expanded-inline-row__cell{grid-template-columns:1fr}.nvb-table--auto-stack .nvb-expand-cell:before,.nvb-table--auto-stack .nvb-table-expanded-inline-row__cell:before,.nvb-table--auto-stack .nvb-table-row-template-cell:before{content:none}.nvb-table--auto-stack .nvb-expand-cell,.nvb-table--auto-stack .nvb-table-row-template-cell{justify-items:start;grid-template-columns:1fr}.nvb-table--auto-stack .nvb-table-expanded-inline-row__content{width:100%}}.nvb-table-export-dialog{width:min(92vw,560px)}.nvb-table-export-dialog .nvb-table-dialog__close nvb-icon{width:18px;height:18px;display:inline-flex}.nvb-table-export-dialog__subject{margin-left:6px;color:var(--nvb-color-neutral-500);font-weight:400}.nvb-table-export-dialog__body{gap:20px;padding:20px 24px}.nvb-table-export-dialog__group{margin:0;padding:0;border:0;min-width:0;display:flex;flex-direction:column;gap:8px}.nvb-table-export-dialog__legend{padding:0;margin-bottom:8px;font-size:12px;font-weight:600;color:var(--nvb-color-neutral-700)}.nvb-table-export-dialog__legend--row{width:100%;display:flex;align-items:center;justify-content:space-between}.nvb-table-export-dialog__muted{margin-left:4px;color:var(--nvb-color-neutral-500);font-weight:400;font-variant-numeric:tabular-nums}.nvb-table-export-dialog__formats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.nvb-table-export-dialog__format{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:8px;padding:12px;border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-control-radius, var(--nvb-radius-md));background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-800);font:inherit;text-align:left;cursor:pointer;transition:border-color .14s ease,background-color .14s ease,box-shadow .14s ease}.nvb-table-export-dialog__format:hover{border-color:var(--nvb-color-neutral-400)}.nvb-table-export-dialog__format--active,.nvb-table-export-dialog__format--active:hover{border-color:var(--nvb-color-primary-500);background:var(--nvb-color-primary-050);box-shadow:inset 0 0 0 1px var(--nvb-color-primary-500)}.nvb-table-export-dialog__format:focus-visible,.nvb-table-export-dialog__link:focus-visible,.nvb-table-export-dialog__button:focus-visible{outline:0;box-shadow:var(--nvb-focus-ring)}.nvb-table-export-dialog__format-icon{width:20px;height:20px;display:inline-flex;color:var(--nvb-color-neutral-600)}.nvb-table-export-dialog__format--active .nvb-table-export-dialog__format-icon{color:var(--nvb-color-primary-600)}.nvb-table-export-dialog__format-text{display:flex;flex-direction:column;gap:2px;min-width:0}.nvb-table-export-dialog__format-text strong{font-size:13px;font-weight:600;color:var(--nvb-color-neutral-900)}.nvb-table-export-dialog__format-text small{font-size:11px;line-height:1.35;color:var(--nvb-color-neutral-600)}.nvb-table-export-dialog__check{position:absolute;top:10px;right:10px;width:18px;height:18px;border-radius:var(--nvb-radius-full);display:inline-flex;align-items:center;justify-content:center;background:var(--nvb-color-primary-600);color:var(--nvb-color-neutral-000);opacity:0;transform:scale(.8);transition:opacity .14s ease,transform .14s ease}.nvb-table-export-dialog__check nvb-icon{width:12px;height:12px;display:inline-flex}.nvb-table-export-dialog__format--active .nvb-table-export-dialog__check{opacity:1;transform:none}.nvb-table-export-dialog__scopes{display:flex;flex-direction:column;border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-control-radius, var(--nvb-radius-md));overflow:hidden}.nvb-table-export-dialog__scope{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;padding:10px 12px;font-size:13px;color:var(--nvb-color-neutral-800);cursor:pointer}.nvb-table-export-dialog__scope+.nvb-table-export-dialog__scope{border-top:1px solid var(--nvb-color-neutral-200)}.nvb-table-export-dialog__scope:hover{background:var(--nvb-color-neutral-050)}.nvb-table-export-dialog__scope:has(input:checked){background:var(--nvb-color-primary-050)}.nvb-table-export-dialog__scope input{appearance:none;-webkit-appearance:none;flex:0 0 auto;margin:0;width:16px;height:16px;border:1.5px solid var(--nvb-color-neutral-400);border-radius:var(--nvb-radius-full);background:var(--nvb-color-neutral-000);cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease}.nvb-table-export-dialog__scope input:checked{border-color:var(--nvb-color-primary-600);box-shadow:inset 0 0 0 3px var(--nvb-color-neutral-000);background:var(--nvb-color-primary-600)}.nvb-table-export-dialog__scope input:focus-visible{outline:0;box-shadow:inset 0 0 0 3px var(--nvb-color-neutral-000),var(--nvb-focus-ring)}.nvb-table-export-dialog__scope-text{display:flex;flex-direction:column;gap:1px}.nvb-table-export-dialog__scope-text small{font-size:11px;color:var(--nvb-color-neutral-500)}.nvb-table-export-dialog__count{min-width:28px;padding:1px 8px;border-radius:var(--nvb-radius-full);background:var(--nvb-color-neutral-100);color:var(--nvb-color-neutral-700);font-size:12px;font-weight:600;text-align:center;font-variant-numeric:tabular-nums}.nvb-table-export-dialog__link{padding:0;border:0;background:none;color:var(--nvb-color-primary-600);font:inherit;font-size:12px;font-weight:500;cursor:pointer}.nvb-table-export-dialog__link:hover{text-decoration:underline}.nvb-table-export-dialog__columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2px 12px;max-height:220px;overflow:auto}.nvb-table-export-dialog__column{display:flex;align-items:center;gap:8px;min-width:0;padding:5px 4px;border-radius:var(--nvb-radius-sm);font-size:13px;color:var(--nvb-color-neutral-800);cursor:pointer}.nvb-table-export-dialog__column:hover{background:var(--nvb-color-neutral-050)}.nvb-table-export-dialog__column span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nvb-table-export-dialog__filename{display:flex;align-items:stretch}.nvb-table-export-dialog__filename input{flex:1 1 auto;min-width:0;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.nvb-table-export-dialog__extension{display:inline-flex;align-items:center;padding:0 12px;border:1px solid var(--nvb-color-neutral-300);border-left:0;border-radius:0 var(--nvb-control-radius, var(--nvb-radius-md)) var(--nvb-control-radius, var(--nvb-radius-md)) 0;background:var(--nvb-color-neutral-050);color:var(--nvb-color-neutral-600);font-size:13px}.nvb-table-export-dialog__footer{display:flex;align-items:center;gap:8px;padding:14px 24px 18px;border-top:1px solid var(--nvb-color-neutral-200);flex-shrink:0}.nvb-table-export-dialog__summary{margin-right:auto;font-size:12px;color:var(--nvb-color-neutral-600)}.nvb-table-export-dialog__button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:var(--nvb-input-height, 38px);padding:0 16px;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-control-radius, var(--nvb-radius-md));background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-800);font:inherit;font-size:13px;font-weight:600;cursor:pointer;white-space:nowrap}.nvb-table-export-dialog__button:hover:not(:disabled){background:var(--nvb-color-neutral-050)}.nvb-table-export-dialog__button--primary{min-width:140px;border-color:var(--nvb-color-primary-600);background:var(--nvb-color-primary-600);color:var(--nvb-color-neutral-000)}.nvb-table-export-dialog__button--primary:hover:not(:disabled){border-color:var(--nvb-color-primary-700);background:var(--nvb-color-primary-700)}.nvb-table-export-dialog__button:disabled{opacity:.5;cursor:not-allowed}.nvb-table-export-dialog__spinner{width:14px;height:14px;border:2px solid currentColor;border-right-color:transparent;border-radius:var(--nvb-radius-full);animation:nvb-table-export-spin .7s linear infinite}@keyframes nvb-table-export-spin{to{transform:rotate(360deg)}}@media(max-width:560px){.nvb-table-export-dialog__formats{grid-template-columns:minmax(0,1fr)}.nvb-table-export-dialog__format{flex-direction:row;align-items:center}.nvb-table-export-dialog__columns{grid-template-columns:minmax(0,1fr)}}@media(prefers-reduced-motion:reduce){.nvb-table-export-dialog__spinner{animation-duration:2s}}\n"],dependencies:[{kind:"component",type:pe,selector:"nvb-select",inputs:["value","disabled","required","filterable","filterThreshold","allowCustomValue","placeholder","testId"],outputs:["valueChange","change","focus","blur"]},{kind:"component",type:ue,selector:"nvb-icon",inputs:["name","svg","ariaLabel"]},{kind:"ngmodule",type:_e},{kind:"directive",type:fe.NgTemplateOutlet,selector:"[ngTemplateOutlet]",inputs:["ngTemplateOutletContext","ngTemplateOutlet","ngTemplateOutletInjector"]},{kind:"directive",type:fe.NgStyle,selector:"[ngStyle]",inputs:["ngStyle"]},{kind:"directive",type:De,selector:"[cdkDropList], cdk-drop-list",inputs:["cdkDropListConnectedTo","cdkDropListData","cdkDropListOrientation","id","cdkDropListLockAxis","cdkDropListDisabled","cdkDropListSortingDisabled","cdkDropListEnterPredicate","cdkDropListSortPredicate","cdkDropListAutoScrollDisabled","cdkDropListAutoScrollStep","cdkDropListElementContainer","cdkDropListHasAnchor"],outputs:["cdkDropListDropped","cdkDropListEntered","cdkDropListExited","cdkDropListSorted"],exportAs:["cdkDropList"]},{kind:"directive",type:ke,selector:"[cdkDrag]",inputs:["cdkDragData","cdkDragLockAxis","cdkDragRootElement","cdkDragBoundary","cdkDragStartDelay","cdkDragFreeDragPosition","cdkDragDisabled","cdkDragConstrainPosition","cdkDragPreviewClass","cdkDragPreviewContainer","cdkDragScale"],outputs:["cdkDragStarted","cdkDragReleased","cdkDragEnded","cdkDragEntered","cdkDragExited","cdkDragDropped","cdkDragMoved"],exportAs:["cdkDrag"]},{kind:"directive",type:Ce,selector:"[cdkDragHandle]",inputs:["cdkDragHandleDisabled"]},{kind:"ngmodule",type:Se},{kind:"directive",type:T.NgSelectOption,selector:"option",inputs:["ngValue","value"]},{kind:"directive",type:T.ɵNgSelectMultipleOption,selector:"option",inputs:["ngValue","value"]},{kind:"directive",type:T.DefaultValueAccessor,selector:"input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]"},{kind:"directive",type:T.NumberValueAccessor,selector:"input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]"},{kind:"directive",type:T.SelectControlValueAccessor,selector:"select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]",inputs:["compareWith"]},{kind:"directive",type:T.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:T.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]},{kind:"component",type:ve,selector:"element-wrapper",inputs:["model","controlIdInput","labelForInput","groupRole","showTextWrapperInput"],exportAs:["elementWrapper"]},{kind:"component",type:V,selector:"runtime-lazy-element-outlet",inputs:["model"]},{kind:"component",type:me,selector:"nvb-style-outlet",inputs:["cssText","renderInPlace","styleKey"]},{kind:"pipe",type:se,name:"uiT"}],changeDetection:h.ChangeDetectionStrategy.OnPush})};h.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"22.2.1",ngImport:h,type:ee,decorators:[{type:ge,args:[{selector:"table-element",changeDetection:he.OnPush,standalone:true,imports:[pe,ue,_e,De,ke,Ce,Se,ve,se,V,me],template:"<element-wrapper [model]=\"model()\">\n @if (templateCss()) {\n <nvb-style-outlet\n [cssText]=\"templateCss()\"\n [renderInPlace]=\"true\"\n [styleKey]=\"styleOutletKey()\"\n ></nvb-style-outlet>\n }\n <div\n #tableShellRef\n class=\"nvb-table-shell\"\n [class.nvb-table-shell--editor]=\"isEditor()\"\n [class.nvb-table-shell--sticky-header]=\"stickyHeaderEnabled()\"\n [style.--nvb-table-sticky-header-offset]=\"stickyHeaderActiveOffset() + 'px'\"\n [attr.aria-busy]=\"loading()\"\n >\n @if (\n stickyHeaderEnabled() ||\n showToolbar() ||\n (detailedSearchEnabled() && showDetailedSearchPanel())\n ) {\n <div\n #stickyHeaderRef\n class=\"nvb-table-sticky-header\"\n [class.nvb-table-sticky-header--enabled]=\"stickyHeaderEnabled()\"\n [class.nvb-table-sticky-header--pinned]=\"stickyHeaderPinned()\"\n >\n @if (showToolbar()) {\n <div\n class=\"nvb-table-toolbar\"\n role=\"toolbar\"\n [class.nvb-table-toolbar--flat]=\"flatHeaderSurface()\"\n [attr.aria-label]=\"'table.toolbar.label' | uiT: 'Table actions'\"\n >\n <div class=\"nvb-table-toolbar__left\">\n @if (quickSearchEnabled()) {\n <div\n class=\"nvb-table-quick-search\"\n role=\"search\"\n [attr.aria-label]=\"'table.search.quick' | uiT: 'Quick search'\"\n >\n <button\n type=\"button\"\n class=\"nvb-table-quick-search__apply\"\n (click)=\"applyQuickSearch()\"\n [attr.data-testid]=\"tid('search-apply')\"\n [attr.aria-label]=\"'table.search.apply' | uiT: 'Search'\"\n >\n <span class=\"material-symbols-outlined\">search</span>\n </button>\n <input\n type=\"text\"\n [ngModel]=\"quickSearchDraft()\"\n (ngModelChange)=\"onQuickSearchValueChange($event)\"\n (keydown.enter)=\"applyQuickSearch(); $event.preventDefault()\"\n [attr.data-testid]=\"tid('search')\"\n [placeholder]=\"quickSearchPlaceholder() | uiT: quickSearchPlaceholder()\"\n [attr.aria-label]=\"quickSearchPlaceholder() | uiT: quickSearchPlaceholder()\"\n />\n @if (quickSearchDraft() || quickSearchTerm()) {\n <button\n type=\"button\"\n class=\"nvb-table-quick-search__clear\"\n (click)=\"clearQuickSearch()\"\n [attr.data-testid]=\"tid('search-clear')\"\n [attr.aria-label]=\"'table.search.clearQuick' | uiT: 'Clear quick search'\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n }\n </div>\n }\n\n @if (detailedSearchEnabled()) {\n <button\n type=\"button\"\n class=\"nvb-table-toolbar__button nvb-table-toolbar__button--detailed-toggle\"\n (click)=\"toggleDetailedSearch()\"\n [attr.data-testid]=\"tid('filters-toggle')\"\n [attr.aria-expanded]=\"showDetailedSearchPanel()\"\n >\n <span class=\"material-symbols-outlined\">tune</span>\n <span>\n {{\n showDetailedSearchPanel()\n ? ('table.search.hideDetailed' | uiT: 'Hide detailed search')\n : ('table.search.showDetailed' | uiT: 'Detailed search')\n }}\n </span>\n @if (detailedFiltersCount() > 0) {\n <span class=\"nvb-table-toolbar__badge\">{{ detailedFiltersCount() }}</span>\n }\n </button>\n }\n\n @if (showHeaderCenterInLeft()) {\n <ng-container [ngTemplateOutlet]=\"headerCenterControlsTemplate\"></ng-container>\n }\n\n @if (renderHeaderActionsAtStart()) {\n <ng-container [ngTemplateOutlet]=\"headerActionsTemplate\"></ng-container>\n }\n </div>\n\n @if (showHeaderCenterArea()) {\n <div\n class=\"nvb-table-toolbar__center\"\n [class.nvb-table-toolbar__center--controls-only]=\"\n !hasCustomHeaderTemplate() && showHeaderCenterInCenter()\n \"\n >\n @if (hasCustomHeaderTemplate()) {\n <div [attr.data-testid]=\"tid('header-template')\"\n class=\"nvb-table-toolbar__custom\"\n [attr.data-nvb-template-scope]=\"templateScopeId\"\n [innerHTML]=\"customHeaderTemplateHtml()\"\n (click)=\"onHeaderTemplateClick($event)\"\n ></div>\n }\n\n @if (showHeaderCenterInCenter()) {\n <ng-container [ngTemplateOutlet]=\"headerCenterControlsTemplate\"></ng-container>\n }\n\n @if (renderHeaderActionsAtCenter()) {\n <ng-container [ngTemplateOutlet]=\"headerActionsTemplate\"></ng-container>\n }\n </div>\n }\n\n <div class=\"nvb-table-toolbar__right\">\n @if (columnSettingsEnabled()) {\n <button [attr.data-testid]=\"tid('column-settings')\"\n type=\"button\"\n class=\"nvb-table-toolbar__button nvb-table-toolbar__button--icon-only\"\n (click)=\"openColumnSettings()\"\n [attr.aria-expanded]=\"openColumnSettingsDialog()\"\n [attr.aria-label]=\"'table.columns.settings.button' | uiT: 'Column settings'\"\n [attr.title]=\"'table.columns.settings.button' | uiT: 'Column settings'\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"settings\"></nvb-icon>\n </button>\n }\n\n @if (exportEnabled()) {\n <div class=\"nvb-table-export\">\n <button\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n [disabled]=\"exportBusy()\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"openExportDialog()\"\n (click)=\"toggleExportMenu($event)\"\n [attr.data-testid]=\"tid('export-open')\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"upload\"></nvb-icon>\n <span>{{ 'table.export.open' | uiT: 'Export' }}</span>\n </button>\n </div>\n }\n\n @if (showHeaderCenterInRight()) {\n <ng-container [ngTemplateOutlet]=\"headerCenterControlsTemplate\"></ng-container>\n }\n\n @if (renderHeaderActionsAtEnd()) {\n <ng-container [ngTemplateOutlet]=\"headerActionsTemplate\"></ng-container>\n }\n </div>\n </div>\n\n <ng-template #headerCenterControlsTemplate>\n <div\n class=\"nvb-table-toolbar__dropzone\"\n [class.nvb-table-toolbar__dropzone--left]=\"headerCenterElementsPosition() === 'left'\"\n [class.nvb-table-toolbar__dropzone--center]=\"headerCenterElementsPosition() === 'center'\"\n [class.nvb-table-toolbar__dropzone--right]=\"headerCenterElementsPosition() === 'right'\"\n >\n @if (isEditor()) {\n <div [attr.data-testid]=\"tid('header-add-element')\" class=\"nvb-table-toolbar__add-element\" (click)=\"$event.stopPropagation()\">\n <button [attr.data-testid]=\"tid('header-add-element-toggle')\"\n type=\"button\"\n class=\"nvb-table-toolbar__button nvb-table-toolbar__button--add-element\"\n (click)=\"toggleHeaderCenterAddMenu($event)\"\n [attr.aria-expanded]=\"headerCenterAddMenuOpen()\"\n [attr.aria-label]=\"'table.header.addElement' | uiT: 'Add element'\"\n [title]=\"'table.header.addElement' | uiT: 'Add element'\"\n >\n <span class=\"material-symbols-outlined\">add</span>\n </button>\n\n @if (headerCenterAddMenuOpen()) {\n <div\n class=\"nvb-table-toolbar__add-menu\"\n [style.top.px]=\"headerAddMenuPosition()?.top\"\n [style.left.px]=\"headerAddMenuPosition()?.left\"\n [style.max-height.px]=\"headerAddMenuPosition()?.maxHeight\"\n >\n @for (option of headerCenterAddOptions; track option.type; let tidIndex1 = $index) {\n <button [attr.data-testid]=\"tid('add-menu-item', tidIndex1)\"\n type=\"button\"\n class=\"nvb-table-toolbar__add-menu-item\"\n (click)=\"addHeaderCenterElementByType(option.type, $event)\"\n >\n {{ option.labelKey | uiT: option.fallbackLabel }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (hasHeaderCenterElements()) {\n <div class=\"nvb-table-toolbar__drop-items\">\n @for (headerElement of headerCenterElements(); track headerElement.name; let tidIndex2 = $index) {\n <div\n class=\"nvb-table-toolbar__drop-item\"\n [class.nvb-table-toolbar__drop-item--editor]=\"isEditor()\"\n [class.nvb-table-toolbar__drop-item--focused]=\"\n isHeaderCenterElementFocused(headerElement.name)\n \"\n [attr.data-nvb-header-center-name]=\"headerElement.name\"\n (mousedown)=\"focusHeaderCenterElementByName(headerElement.name, $event)\"\n >\n <runtime-lazy-element-outlet [model]=\"headerElement\" />\n @if (isEditor()) {\n <button [attr.data-testid]=\"tid('remove-center-element', tidIndex2)\"\n type=\"button\"\n class=\"nvb-table-toolbar__drop-remove\"\n (click)=\"removeHeaderCenterElement(headerElement.name, $event)\"\n [attr.aria-label]=\"\n 'table.header.removeCenterElement' | uiT: 'Remove center element'\n \"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n\n <ng-template #headerActionsTemplate>\n @if (visibleHeaderActions(); as headerActions) {\n @if (headerActions.length > 0) {\n @if (renderHeaderActionsAsDropdown()) {\n <nvb-select [testId]=\"tid('header-actions-select')\"\n class=\"nvb-table-toolbar__select\"\n [ngModel]=\"headerActionDropdownValue()\"\n (ngModelChange)=\"onHeaderActionDropdownChange($event)\"\n (blur)=\"onHeaderActionDropdownBlur()\"\n [attr.aria-label]=\"headerActionsDropdownPlaceholder()\"\n >\n <option value=\"\">{{ headerActionsDropdownPlaceholder() }}</option>\n @for (option of headerActionDropdownOptions(); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </nvb-select>\n } @else {\n <div class=\"nvb-table-toolbar__actions\">\n @for (action of headerActions; track action.id || $index; let tidIndex3 = $index) {\n <button [attr.data-testid]=\"tid('run-header-action', tidIndex3)\"\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n [class.nvb-table-toolbar__button--icon-only]=\"actionHidesText(action)\"\n [attr.title]=\"resolveActionLabel(action)\"\n [attr.aria-label]=\"resolveActionLabel(action)\"\n (click)=\"runHeaderAction(action, $event)\"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon class=\"nvb-table-action-icon\" [name]=\"actionIcon\"></nvb-icon>\n }\n @if (!actionHidesText(action)) {\n <span>{{ resolveActionLabel(action) }}</span>\n }\n </button>\n }\n </div>\n }\n }\n }\n </ng-template>\n }\n\n @if (detailedSearchEnabled() && showDetailedSearchPanel()) {\n <div class=\"nvb-table-detailed-search\" [attr.data-testid]=\"tid('filters')\">\n <div class=\"nvb-table-detailed-search__rows\">\n @for (filter of detailedFilters(); track filter.id; let filterIndex = $index) {\n <div\n class=\"nvb-table-detailed-search__row\"\n [attr.data-testid]=\"tid('filter', filterIndex)\"\n >\n <nvb-select\n [ngModel]=\"filter.key\"\n (ngModelChange)=\"updateDetailedFilterKey(filter.id, $event)\"\n [attr.data-testid]=\"tid('filter-field', filterIndex)\"\n [attr.aria-label]=\"'table.search.field' | uiT: 'Field'\"\n >\n @for (column of dataColumns(); track column.id || column.key) {\n <option [value]=\"column.key\">{{ resolveColumnLabel(column) }}</option>\n }\n </nvb-select>\n\n <nvb-select\n [ngModel]=\"filter.operator\"\n (ngModelChange)=\"updateDetailedFilterOperator(filter.id, $event)\"\n [attr.data-testid]=\"tid('filter-operator', filterIndex)\"\n [attr.aria-label]=\"'table.search.operator' | uiT: 'Operator'\"\n >\n @for (operator of getFilterOperators(filter); track operator.value) {\n <option [value]=\"operator.value\">\n {{ operator.label | uiT: operator.value }}\n </option>\n }\n </nvb-select>\n\n @if (isSelectFilter(filter)) {\n <nvb-select\n [ngModel]=\"filter.value\"\n (ngModelChange)=\"updateDetailedFilterValue(filter.id, $event)\"\n [attr.data-testid]=\"tid('filter-value', filterIndex)\"\n [attr.aria-label]=\"'table.search.value' | uiT: 'Value'\"\n >\n <option value=\"\">\n {{\n resolveDetailedFilterOptions(filter).length > 0\n ? ('table.search.value' | uiT: 'Value')\n : ('table.search.emptyOptions' | uiT: 'No options')\n }}\n </option>\n @for (option of resolveDetailedFilterOptions(filter); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </nvb-select>\n } @else if (isMultiSelectFilter(filter)) {\n <div [attr.data-testid]=\"tid('multi-select', filterIndex)\"\n class=\"nvb-table-detailed-search__multi-select\"\n (click)=\"$event.stopPropagation()\"\n >\n <button [attr.data-testid]=\"tid('value', filterIndex)\"\n type=\"button\"\n class=\"nvb-table-detailed-search__multi-select-trigger\"\n [attr.aria-label]=\"'table.search.value' | uiT: 'Value'\"\n [attr.aria-expanded]=\"isDetailedFilterMultiSelectOpen(filter.id)\"\n (click)=\"toggleDetailedFilterMultiSelectMenu(filter.id, $event)\"\n >\n @if (hasDetailedFilterSelectedOptions(filter)) {\n <span>{{ resolveDetailedFilterMultiSelectLabel(filter) }}</span>\n } @else {\n <span class=\"nvb-table-detailed-search__multi-select-placeholder\">{{\n resolveDetailedFilterOptions(filter).length > 0\n ? ('table.search.value' | uiT: 'Value')\n : ('table.search.emptyOptions' | uiT: 'No options')\n }}</span>\n }\n <span class=\"material-symbols-outlined\">\n {{\n isDetailedFilterMultiSelectOpen(filter.id)\n ? 'expand_less'\n : 'expand_more'\n }}\n </span>\n </button>\n\n @if (isDetailedFilterMultiSelectOpen(filter.id)) {\n <div class=\"nvb-table-detailed-search__multi-select-menu\">\n @if (resolveDetailedFilterOptions(filter).length === 0) {\n <div class=\"nvb-table-detailed-search__multi-select-empty\">\n {{ 'table.search.emptyOptions' | uiT: 'No options' }}\n </div>\n } @else {\n @for (\n option of resolveDetailedFilterOptions(filter);\n track option.value\n ; let tidIndex4 = $index) {\n <label class=\"nvb-table-detailed-search__multi-select-option\">\n <input [attr.data-testid]=\"tid('checkbox-input', filterIndex, tidIndex4)\"\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"isFilterOptionSelected(filter, option.value)\"\n (change)=\"\n onDetailedFilterMultiSelectOptionToggle(\n filter.id,\n option.value,\n $any($event.target).checked\n )\n \"\n />\n <span>{{ option.label }}</span>\n </label>\n }\n }\n </div>\n }\n </div>\n } @else if (isToggleFilter(filter)) {\n <label\n class=\"nvb-table-detailed-search__toggle nvb-table-interactive-control nvb-table-interactive-control--toggle nvb-toggle-switch\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input', filterIndex)\"\n type=\"checkbox\"\n class=\"nvb-toggle-switch__input\"\n [checked]=\"isToggleFilterValueTrue(filter)\"\n (change)=\"\n updateDetailedToggleFilterValue(\n filter.id,\n $any($event.target).checked\n )\n \"\n />\n <span class=\"nvb-toggle-switch__track\">\n <span class=\"nvb-toggle-switch__thumb\"></span>\n </span>\n <span>{{ filterValueAsString(filter.value) }}</span>\n </label>\n } @else if (isCheckboxFilter(filter) || isBooleanFilter(filter)) {\n <label class=\"nvb-table-detailed-search__boolean-toggle\">\n <input [attr.data-testid]=\"tid('checkbox-input-2', filterIndex)\"\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"isFilterValueTrue(filter)\"\n (change)=\"\n updateDetailedFilterValue(\n filter.id,\n $any($event.target).checked ? 'true' : 'false'\n )\n \"\n />\n <span>{{\n isFilterValueTrue(filter)\n ? ('table.search.boolean.true' | uiT: 'True')\n : ('table.search.boolean.false' | uiT: 'False')\n }}</span>\n </label>\n } @else if (isNumericFilter(filter)) {\n <input\n type=\"number\"\n [ngModel]=\"filter.value\"\n (ngModelChange)=\"updateDetailedFilterValue(filter.id, $event)\"\n [attr.data-testid]=\"tid('filter-value', filterIndex)\"\n [placeholder]=\"'table.search.value' | uiT: 'Value'\"\n [attr.aria-label]=\"'table.search.value' | uiT: 'Value'\"\n />\n } @else if (isDateFilter(filter)) {\n <div [attr.data-testid]=\"tid('date', filterIndex)\" class=\"nvb-table-detailed-search__date\" (click)=\"$event.stopPropagation()\">\n <button [attr.data-testid]=\"tid('value-2', filterIndex)\"\n type=\"button\"\n class=\"nvb-table-detailed-search__date-trigger\"\n [attr.aria-label]=\"'table.search.value' | uiT: 'Value'\"\n [attr.aria-expanded]=\"isDetailedFilterDatePickerOpen(filter.id)\"\n (click)=\"toggleDetailedFilterDatePicker(filter, $event)\"\n >\n @if (resolveDetailedFilterDateLabel(filter)) {\n <span>{{ resolveDetailedFilterDateLabel(filter) }}</span>\n } @else {\n <span class=\"nvb-table-detailed-search__date-placeholder\">0000-00-00</span>\n }\n <span class=\"material-symbols-outlined\">calendar_month</span>\n </button>\n\n @if (isDetailedFilterDatePickerOpen(filter.id)) {\n <div class=\"nvb-table-detailed-search__date-menu\">\n <div class=\"nvb-table-detailed-search__date-header\">\n <button [attr.data-testid]=\"tid('previous-detailed-filter-date-month', filterIndex)\" type=\"button\" (click)=\"previousDetailedFilterDateMonth($event)\">\n <span class=\"material-symbols-outlined\">chevron_left</span>\n </button>\n <span>{{ resolveDetailedFilterDateMonthLabel() }}</span>\n <button [attr.data-testid]=\"tid('next-detailed-filter-date-month', filterIndex)\" type=\"button\" (click)=\"nextDetailedFilterDateMonth($event)\">\n <span class=\"material-symbols-outlined\">chevron_right</span>\n </button>\n </div>\n\n <div class=\"nvb-table-detailed-search__date-weekdays\">\n @for (\n weekday of resolveDetailedFilterDateWeekdays();\n track weekday + $index\n ) {\n <span>{{ weekday }}</span>\n }\n </div>\n\n <div class=\"nvb-table-detailed-search__date-days\">\n @for (day of resolveDetailedFilterDateDays(filter); track day.key; let tidIndex5 = $index) {\n <button [attr.data-testid]=\"tid('date-day', filterIndex, tidIndex5)\"\n type=\"button\"\n class=\"nvb-table-detailed-search__date-day\"\n [class.nvb-table-detailed-search__date-day--outside]=\"day.outsideMonth\"\n [class.nvb-table-detailed-search__date-day--today]=\"day.isToday\"\n [class.nvb-table-detailed-search__date-day--selected]=\"day.isSelected\"\n (click)=\"selectDetailedFilterDate(filter.id, day.iso, $event)\"\n >\n {{ day.day }}\n </button>\n }\n </div>\n\n <div class=\"nvb-table-detailed-search__date-actions\">\n <button [attr.data-testid]=\"tid('clear-detailed-filter-date', filterIndex)\"\n type=\"button\"\n (click)=\"clearDetailedFilterDate(filter.id, $event)\"\n >\n {{ 'datePicker.clear' | uiT: 'Isvalyti' }}\n </button>\n </div>\n </div>\n }\n </div>\n } @else if (isDateTimeFilter(filter)) {\n <input\n type=\"datetime-local\"\n [ngModel]=\"filter.value\"\n (ngModelChange)=\"updateDetailedFilterValue(filter.id, $event)\"\n [attr.data-testid]=\"tid('filter-value', filterIndex)\"\n [attr.aria-label]=\"'table.search.value' | uiT: 'Value'\"\n />\n } @else {\n <input\n type=\"text\"\n [ngModel]=\"filter.value\"\n (ngModelChange)=\"updateDetailedFilterValue(filter.id, $event)\"\n [attr.data-testid]=\"tid('filter-value', filterIndex)\"\n [placeholder]=\"'table.search.value' | uiT: 'Value'\"\n [attr.aria-label]=\"'table.search.value' | uiT: 'Value'\"\n />\n }\n\n <button\n type=\"button\"\n class=\"nvb-table-detailed-search__remove\"\n (click)=\"removeDetailedFilter(filter.id)\"\n [attr.data-testid]=\"tid('filter-remove', filterIndex)\"\n [attr.aria-label]=\"'table.search.removeFilter' | uiT: 'Remove filter'\"\n >\n <span class=\"material-symbols-outlined\">delete</span>\n </button>\n </div>\n }\n </div>\n\n <div class=\"nvb-table-detailed-search__actions\">\n <button\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n (click)=\"addDetailedFilter()\"\n [attr.data-testid]=\"tid('filter-add')\"\n >\n <span class=\"material-symbols-outlined\">add</span>\n <span>{{ 'table.search.addFilter' | uiT: 'Add filter' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n (click)=\"clearDetailedSearch()\"\n [attr.data-testid]=\"tid('filters-clear')\"\n >\n <span class=\"material-symbols-outlined\">ink_eraser</span>\n <span>{{ 'table.search.clear' | uiT: 'Clear' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"nvb-table-toolbar__button nvb-table-toolbar__button--primary\"\n (click)=\"applyDetailedSearch()\"\n [attr.data-testid]=\"tid('filters-apply')\"\n >\n <span class=\"material-symbols-outlined\">check</span>\n <span>{{ 'table.search.apply' | uiT: 'Apply' }}</span>\n </button>\n @if (savedFiltersEnabled()) {\n <button [attr.data-testid]=\"tid('open-saved-filters')\" type=\"button\" class=\"nvb-table-toolbar__button\" (click)=\"openSavedFilters()\">\n <span class=\"material-symbols-outlined\">bookmark</span>\n <span>{{ 'table.search.saved' | uiT: 'Saved filters' }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n @if (stickyHeaderCloneVisible()) {\n <div class=\"nvb-table-sticky-clone\">\n <div class=\"nvb-table-sticky-clone__viewport\">\n <table\n class=\"nvb-table nvb-table-sticky-clone__table\"\n [class.nvb-table--grid]=\"tableStyle() === 'grid'\"\n [class.nvb-table--striped]=\"tableStyle() === 'striped'\"\n [style.width.px]=\"stickyHeaderTableWidth() || null\"\n [style.transform]=\"'translateX(' + -stickyHeaderScrollLeft() + 'px)'\"\n >\n <thead>\n <tr class=\"nvb-table-sticky-clone__row\">\n @if (showExpandChevronColumn()) {\n <th\n class=\"nvb-expand-column\"\n [style.width.px]=\"stickyHeaderCellWidthAt(0)\"\n [style.min-width.px]=\"stickyHeaderCellWidthAt(0)\"\n ></th>\n }\n @if (selectionEnabled()) {\n <th\n class=\"nvb-select-column\"\n [style.width.px]=\"\n stickyHeaderCellWidthAt(showExpandChevronColumn() ? 1 : 0)\n \"\n [style.min-width.px]=\"\n stickyHeaderCellWidthAt(showExpandChevronColumn() ? 1 : 0)\n \"\n >\n <input [attr.data-testid]=\"tid('sticky-select-all')\"\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"allVisibleSelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectAllVisible($event)\"\n [attr.aria-label]=\"\n model().selectAllLabel || ('table.selectAll' | uiT: 'Select all')\n \"\n />\n </th>\n }\n\n @for (\n column of dataColumns();\n track column.id || column.key;\n let columnIndex = $index\n ) {\n <th [attr.data-testid]=\"tid('column-header', columnIndex)\"\n [class]=\"columnAlignClass(column)\"\n [class.nvb-sortable]=\"column.sortable\"\n [class.nvb-sorted-active]=\"isSortedColumn(column)\"\n [style.width.px]=\"\n stickyHeaderCellWidthAt(stickyHeaderDataColumnStartIndex() + columnIndex)\n \"\n [style.min-width.px]=\"\n stickyHeaderCellWidthAt(stickyHeaderDataColumnStartIndex() + columnIndex)\n \"\n (click)=\"onColumnHeaderClick(column, columnIndex, $event)\"\n >\n @if (showColumnHeaderLabel(column)) {\n <span>{{ resolveColumnLabel(column) }}</span>\n }\n @if (column.sortable) {\n <span\n class=\"material-symbols-outlined nvb-sort-icon\"\n [class.nvb-sort-icon--active]=\"isSortedColumn(column)\"\n >\n {{ sortIndicator(column) }}\n </span>\n }\n </th>\n }\n\n @if (hasRowActions()) {\n <th\n class=\"nvb-action-column\"\n [style.width.px]=\"stickyHeaderCellWidthAt(stickyHeaderActionColumnIndex())\"\n [style.min-width.px]=\"\n stickyHeaderCellWidthAt(stickyHeaderActionColumnIndex())\n \"\n >\n <div class=\"nvb-action-header\">\n @if (showActionsHeaderLabel()) {\n <span class=\"nvb-action-header__label\">{{\n model().actionsLabel || ('table.actions' | uiT: 'Actions')\n }}</span>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n </table>\n </div>\n </div>\n }\n </div>\n }\n\n <div\n class=\"nvb-table-frame\"\n [class.nvb-table-frame--with-toolbar]=\"showToolbar() && !flatHeaderSurface()\"\n [class.nvb-table-frame--with-paginator]=\"model().paginator && !flatFooterSurface()\"\n [class.nvb-table-frame--with-detail-panel]=\"activeExpandedPanelContext() !== null\"\n >\n <div\n #tableScrollerRef\n class=\"nvb-table-frame__scroller\"\n [class.nvb-table-frame__scroller--virtual]=\"virtualScrollEnabled()\"\n [style.max-height.px]=\"virtualScrollEnabled() ? virtualScrollViewportHeight() : null\"\n (scroll)=\"onTableScroll($event)\"\n >\n <table\n class=\"nvb-table\"\n [class.nvb-table--auto-stack]=\"model().responsiveMode === 'auto'\"\n [class.nvb-table--force-stack]=\"model().responsiveMode === 'stack'\"\n [class.nvb-table--grid]=\"tableStyle() === 'grid'\"\n [class.nvb-table--striped]=\"tableStyle() === 'striped'\"\n [class.nvb-table--row-hover]=\"rowHoverEnabled()\"\n [class.nvb-table--sticky-header]=\"stickyHeaderEnabled()\"\n [class.nvb-table--virtual-scroll]=\"virtualScrollEnabled()\"\n [attr.data-testid]=\"tid('root')\"\n >\n <thead>\n <tr #mainHeaderRowRef>\n @if (showExpandChevronColumn()) {\n <th class=\"nvb-expand-column\"></th>\n }\n @if (selectionEnabled()) {\n <th class=\"nvb-select-column\">\n <input\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"allVisibleSelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectAllVisible($event)\"\n [attr.data-testid]=\"tid('select-all')\"\n [attr.aria-label]=\"\n model().selectAllLabel || ('table.selectAll' | uiT: 'Select all')\n \"\n />\n </th>\n }\n\n @for (\n column of dataColumns();\n track column.id || column.key;\n let columnIndex = $index\n ) {\n <th\n [class]=\"columnAlignClass(column)\"\n [class.nvb-sortable]=\"column.sortable\"\n [class.nvb-column-focused]=\"isColumnFocused(column, columnIndex)\"\n [class.nvb-sorted-active]=\"isSortedColumn(column)\"\n [style.width]=\"columnWidthStyle(column)\"\n [tabIndex]=\"isEditor() ? 0 : -1\"\n (focus)=\"onColumnHeaderFocus(column, columnIndex)\"\n (click)=\"onColumnHeaderClick(column, columnIndex, $event)\"\n [attr.data-testid]=\"tid('header', columnTestToken(column, columnIndex))\"\n >\n @if (showColumnHeaderLabel(column)) {\n <span>{{ resolveColumnLabel(column) }}</span>\n }\n @if (column.sortable) {\n <span\n class=\"material-symbols-outlined nvb-sort-icon\"\n [class.nvb-sort-icon--active]=\"isSortedColumn(column)\"\n >\n {{ sortIndicator(column) }}\n </span>\n }\n </th>\n }\n @if (hasRowActions()) {\n <th class=\"nvb-action-column\">\n <div class=\"nvb-action-header\">\n @if (showActionsHeaderLabel()) {\n <span class=\"nvb-action-header__label\">{{\n model().actionsLabel || ('table.actions' | uiT: 'Actions')\n }}</span>\n }\n\n @if (hasSelectionActions() && selectedRowsCount() > 0) {\n @if (visibleSelectionActions(); as selectionActions) {\n @if (selectionActions.length > 0) {\n <div class=\"nvb-selection-actions\">\n <button [attr.data-testid]=\"tid('selection-actions-toggle')\"\n type=\"button\"\n class=\"nvb-selection-actions__toggle\"\n (click)=\"toggleSelectionActionMenu(selectionActions.length, $event)\"\n [attr.aria-label]=\"\n selectionActionsLabel() | uiT: selectionActionsLabel()\n \"\n >\n <span class=\"material-symbols-outlined\">checklist</span>\n <span class=\"nvb-selection-actions__count\">{{\n selectedRowsCount()\n }}</span>\n </button>\n\n @if (openSelectionActionMenu()) {\n <div [attr.data-testid]=\"tid('selection-actions-menu')\"\n class=\"nvb-selection-actions__menu\"\n [class.nvb-selection-actions__menu--top]=\"\n selectionActionMenuPosition() === 'top'\n \"\n [ngStyle]=\"selectionActionMenuStyle()\"\n (click)=\"$event.stopPropagation()\"\n >\n @for (action of selectionActions; track action.id || $index; let tidIndex6 = $index) {\n <button [attr.data-testid]=\"tid('run-selection-action', tidIndex6)\"\n type=\"button\"\n (click)=\"runSelectionAction(action, $event)\"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon\n class=\"nvb-table-action-icon\"\n [name]=\"actionIcon\"\n ></nvb-icon>\n }\n <span>{{ resolveActionLabel(action) }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n }\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialSkeleton()) {\n @for (rowIndex of initialSkeletonRows(); track rowIndex) {\n <tr\n class=\"nvb-table-skeleton__row\"\n aria-hidden=\"true\"\n [attr.data-testid]=\"tid('skeleton-row', rowIndex)\"\n >\n @if (showExpandChevronColumn()) {\n <td class=\"nvb-expand-cell\">\n <span class=\"nvb-table-skeleton__dot\"></span>\n </td>\n }\n @if (selectionEnabled()) {\n <td class=\"nvb-select-cell\">\n <span class=\"nvb-table-skeleton__dot\"></span>\n </td>\n }\n @for (\n column of dataColumns();\n track column.id || column.key;\n let columnIndex = $index\n ) {\n <td [class]=\"columnAlignClass(column)\">\n <span\n class=\"nvb-table-skeleton__line\"\n [style.width]=\"initialSkeletonCellWidth(rowIndex, columnIndex)\"\n ></span>\n </td>\n }\n @if (hasRowActions()) {\n <td class=\"nvb-action-cell\">\n <span class=\"nvb-table-skeleton__dot nvb-table-skeleton__dot--action\"></span>\n </td>\n }\n </tr>\n }\n } @else {\n @if (!loading() && visibleRows().length === 0) {\n <tr>\n <td\n class=\"nvb-empty-cell\"\n [attr.data-testid]=\"tid('empty')\"\n [attr.colspan]=\"\n dataColumns().length +\n (hasRowActions() ? 1 : 0) +\n (selectionEnabled() ? 1 : 0) +\n (showExpandChevronColumn() ? 1 : 0)\n \"\n >\n {{ model().emptyMessage || ('table.empty' | uiT: 'No data') }}\n </td>\n </tr>\n @if (expandedUsesInline() && editorExpandedPreviewContext(); as expandedContext) {\n <tr\n class=\"nvb-table-expanded-inline-row nvb-table-expanded-inline-row--preview\"\n [attr.data-row-key]=\"expandedContext.key\"\n >\n <td\n class=\"nvb-table-expanded-inline-row__cell\"\n [attr.colspan]=\"expandedInlineColspan()\"\n >\n <div class=\"nvb-table-expanded-inline-row__content\">\n <ng-container\n [ngTemplateOutlet]=\"expandedContentTemplate\"\n [ngTemplateOutletContext]=\"{ expandedContext: expandedContext }\"\n />\n </div>\n </td>\n </tr>\n }\n }\n\n @if (virtualScrollEnabled() && virtualTopSpacerHeight() > 0) {\n <tr class=\"nvb-table-virtual-spacer-row\" aria-hidden=\"true\">\n <td\n class=\"nvb-table-virtual-spacer-cell\"\n [attr.colspan]=\"expandedInlineColspan()\"\n [style.height.px]=\"virtualTopSpacerHeight()\"\n ></td>\n </tr>\n }\n\n @for (\n renderedRow of renderedRows();\n track rowTrackKey(renderedRow.row, renderedRow.visibleIndex)\n ) {\n @let row = renderedRow.row;\n @let rowIndex = renderedRow.visibleIndex;\n <tr\n [class.nvb-table__row--active]=\"isRowActive(row, rowIndex)\"\n [class.nvb-table__row--expanded]=\"isRowExpanded(row, rowIndex)\"\n [class.nvb-table__row--editing]=\"isInlineEditRow(row, rowIndex)\"\n (click)=\"onRowClick(row, rowIndex, $event)\"\n (dblclick)=\"onRowDoubleClick(row, rowIndex, $event)\"\n [attr.data-testid]=\"tid('row', rowIndex)\"\n >\n @if (showExpandChevronColumn()) {\n <td class=\"nvb-expand-cell\">\n @if (showExpandToggle(row, rowIndex)) {\n <button\n type=\"button\"\n class=\"nvb-expand-toggle\"\n [class.nvb-expand-toggle--expanded]=\"isRowExpanded(row, rowIndex)\"\n (click)=\"toggleRowExpand(row, rowIndex, $event)\"\n [attr.data-testid]=\"tid('expand', rowIndex)\"\n [attr.aria-label]=\"resolveExpandToggleLabel(row, rowIndex)\"\n [attr.aria-expanded]=\"isRowExpanded(row, rowIndex)\"\n >\n <span class=\"material-symbols-outlined\">{{\n resolveExpandToggleIcon(row, rowIndex)\n }}</span>\n </button>\n }\n </td>\n }\n @if (selectionEnabled()) {\n <td\n class=\"nvb-select-cell\"\n [attr.data-label]=\"model().selectLabel || ('table.select' | uiT: 'Select')\"\n >\n <input\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"isRowSelected(row, rowIndex)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRowSelection(row, rowIndex, $event)\"\n [attr.data-testid]=\"tid('select', rowIndex)\"\n [attr.aria-label]=\"\n model().selectRowLabel || ('table.selectRow' | uiT: 'Select row')\n \"\n />\n </td>\n }\n\n @if (rowTemplateEnabled()) {\n <td\n class=\"nvb-table-row-template-cell\"\n data-label=\"\"\n [attr.colspan]=\"rowTemplateColspan()\"\n >\n <div [attr.data-testid]=\"tid('template-content', rowIndex)\"\n class=\"nvb-table-row-template-host\"\n [attr.data-nvb-template-scope]=\"templateScopeId\"\n [innerHTML]=\"resolveRowTemplateHtml(row, rowIndex) || ''\"\n (click)=\"onTemplateContentClick($event, row, row)\"\n ></div>\n </td>\n } @else {\n @for (\n column of dataColumns();\n track column.id || column.key;\n let cellColumnIndex = $index\n ) {\n <td\n [attr.data-label]=\"resolveColumnDataLabel(column)\"\n [class]=\"columnAlignClass(column)\"\n [attr.data-testid]=\"\n tid('cell', rowIndex, columnTestToken(column, cellColumnIndex))\n \"\n >\n <div class=\"nvb-table-cell-content\">\n <div class=\"nvb-table-cell-content__value\">\n @if (isInlineEditRow(row, rowIndex) && isInlineEditableColumn(column)) {\n @switch (resolveInlineEditorType(column)) {\n @case ('textarea') {\n <textarea [attr.data-testid]=\"tid('textarea', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-inline-edit nvb-table-inline-edit--textarea\"\n rows=\"2\"\n [ngModel]=\"resolveInlineEditorValue(column)\"\n (ngModelChange)=\"updateInlineEditValue(column, $event)\"\n (click)=\"$event.stopPropagation()\"\n [placeholder]=\"resolveInlineEditorPlaceholder(column)\"\n ></textarea>\n }\n @case ('number') {\n <input [attr.data-testid]=\"tid('number-input', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-inline-edit\"\n type=\"number\"\n [ngModel]=\"resolveInlineEditorValue(column)\"\n (ngModelChange)=\"updateInlineEditValue(column, $event)\"\n (click)=\"$event.stopPropagation()\"\n [placeholder]=\"resolveInlineEditorPlaceholder(column)\"\n />\n }\n @case ('date') {\n <input [attr.data-testid]=\"tid('date-input', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-inline-edit\"\n type=\"date\"\n [ngModel]=\"resolveInlineEditorValue(column)\"\n (ngModelChange)=\"updateInlineEditValue(column, $event)\"\n (click)=\"$event.stopPropagation()\"\n [placeholder]=\"resolveInlineEditorPlaceholder(column)\"\n />\n }\n @case ('checkbox') {\n <label [attr.data-testid]=\"tid('label', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-interactive-control nvb-table-interactive-control--checkbox nvb-single-checkbox\"\n (click)=\"$event.stopPropagation()\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input', rowIndex, cellColumnIndex)\"\n class=\"nvb-single-checkbox__input nvb-control__checkbox-input\"\n type=\"checkbox\"\n [checked]=\"!!resolveInlineEditorValue(column)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"\n updateInlineEditValue(\n column,\n $any($event.target).checked,\n $event\n )\n \"\n />\n </label>\n }\n @case ('toggle') {\n <label [attr.data-testid]=\"tid('label-2', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-interactive-control nvb-table-interactive-control--toggle nvb-toggle-switch\"\n (click)=\"$event.stopPropagation()\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input-2', rowIndex, cellColumnIndex)\"\n class=\"nvb-toggle-switch__input\"\n type=\"checkbox\"\n [checked]=\"!!resolveInlineEditorValue(column)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"\n updateInlineEditValue(\n column,\n $any($event.target).checked,\n $event\n )\n \"\n />\n <span class=\"nvb-toggle-switch__track\">\n <span class=\"nvb-toggle-switch__thumb\"></span>\n </span>\n </label>\n }\n @case ('select') {\n <select [attr.data-testid]=\"tid('select', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-inline-edit\"\n [ngModel]=\"resolveInlineEditorValue(column)\"\n (ngModelChange)=\"updateInlineEditValue(column, $event)\"\n (click)=\"$event.stopPropagation()\"\n >\n <option [ngValue]=\"null\">\n {{\n resolveInlineEditorPlaceholder(column) ||\n ('table.inlineEdit.select' | uiT: 'Select')\n }}\n </option>\n @for (\n option of resolveInlineSelectOptions(column);\n track $index\n ) {\n <option [ngValue]=\"option.rawValue\">\n {{ option.label }}\n </option>\n }\n </select>\n }\n @default {\n <input [attr.data-testid]=\"tid('text-input', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-inline-edit\"\n type=\"text\"\n [ngModel]=\"resolveInlineEditorValue(column)\"\n (ngModelChange)=\"updateInlineEditValue(column, $event)\"\n (click)=\"$event.stopPropagation()\"\n [placeholder]=\"resolveInlineEditorPlaceholder(column)\"\n />\n }\n }\n } @else if (isToggleSwitchColumn(column)) {\n <label [attr.data-testid]=\"tid('label-3', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-interactive-control nvb-table-interactive-control--toggle nvb-toggle-switch\"\n [class.nvb-toggle-switch--disabled]=\"\n !isInteractiveColumnEnabled(row, column)\n \"\n (click)=\"$event.stopPropagation()\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input-3', rowIndex, cellColumnIndex)\"\n class=\"nvb-toggle-switch__input\"\n type=\"checkbox\"\n [checked]=\"resolveInteractiveColumnChecked(row, column)\"\n [disabled]=\"!isInteractiveColumnEnabled(row, column)\"\n [attr.aria-label]=\"resolveInteractiveColumnAriaLabel(column)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"onInteractiveColumnChange(row, column, $event)\"\n />\n <span class=\"nvb-toggle-switch__track\">\n <span class=\"nvb-toggle-switch__thumb\"></span>\n </span>\n </label>\n } @else if (isSingleCheckboxColumn(column)) {\n <label [attr.data-testid]=\"tid('label-4', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-interactive-control nvb-table-interactive-control--checkbox nvb-single-checkbox\"\n [class.nvb-single-checkbox--disabled]=\"\n !isInteractiveColumnEnabled(row, column)\n \"\n (click)=\"$event.stopPropagation()\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input-4', rowIndex, cellColumnIndex)\"\n class=\"nvb-single-checkbox__input nvb-control__checkbox-input\"\n type=\"checkbox\"\n [checked]=\"resolveInteractiveColumnChecked(row, column)\"\n [disabled]=\"!isInteractiveColumnEnabled(row, column)\"\n [attr.aria-label]=\"resolveInteractiveColumnAriaLabel(column)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"onInteractiveColumnChange(row, column, $event)\"\n />\n </label>\n } @else if (isElementColumn(column)) {\n @if (\n getCellElementModel(row, rowIndex, column, cellColumnIndex);\n as cellElement\n ) {\n <div [attr.data-testid]=\"tid('cell-element', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-cell-element\"\n (click)=\"onCellElementPointerEvent(column, $event)\"\n (dblclick)=\"onCellElementPointerEvent(column, $event)\"\n >\n <!-- Tracking the model itself makes the control belong to\n its row: swapping in another row's model rebuilds it\n instead of leaving the previous row's state on screen. -->\n @for (cellModel of [cellElement]; track cellModel) {\n <runtime-lazy-element-outlet [model]=\"cellModel\" />\n }\n </div>\n }\n } @else if (resolveStatusBadge(row, column); as statusBadge) {\n <span\n class=\"nvb-status-pill\"\n [class]=\"'nvb-status-pill nvb-status-pill--' + statusBadge.tone\"\n [class.nvb-status-pill--rounded]=\"statusBadge.rounded\"\n >\n @if (statusBadge.icon) {\n <nvb-icon\n class=\"nvb-status-pill__icon\"\n [name]=\"statusBadge.icon\"\n ></nvb-icon>\n }\n {{ statusBadge.label }}\n </span>\n } @else if (resolveCellHtml(row, column); as cellHtml) {\n <div [attr.data-testid]=\"tid('template-content', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-template-host\"\n [attr.data-nvb-template-scope]=\"templateScopeId\"\n [innerHTML]=\"cellHtml\"\n (click)=\"\n onTemplateContentClick($event, row, resolveCellValue(row, column))\n \"\n ></div>\n } @else {\n {{ resolveCellText(row, column) }}\n }\n </div>\n\n @if (!isInteractiveColumn(column)) {\n @if (visibleColumnCellActions(row, column); as columnActions) {\n @if (columnActions.length > 0) {\n <div [attr.data-testid]=\"tid('cell-actions', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-cell-actions\"\n [class.nvb-table-cell-actions--icon]=\"\n columnCellActionsUseIconButtons(column)\n \"\n (click)=\"$event.stopPropagation()\"\n >\n @if (columnCellActionsUseDropdown(column)) {\n <nvb-select [testId]=\"tid('select-2', rowIndex, cellColumnIndex)\"\n class=\"nvb-table-cell-actions__select\"\n (change)=\"onColumnCellActionSelect(row, column, $event)\"\n >\n <option value=\"\">\n {{ resolveColumnCellActionsPlaceholder(column) }}\n </option>\n @for (action of columnActions; track action.id || $index) {\n <option [value]=\"'id:' + (action.id || $index)\">\n {{ resolveActionLabel(action) }}\n </option>\n }\n </nvb-select>\n } @else {\n @for (action of columnActions; track action.id || $index; let tidIndex7 = $index) {\n <button [attr.data-testid]=\"tid('run-column-cell-action', rowIndex, cellColumnIndex, tidIndex7)\"\n type=\"button\"\n class=\"nvb-table-cell-actions__button\"\n [class.nvb-table-cell-actions__button--icon-only]=\"\n columnCellActionsUseIconButtons(column) ||\n actionHidesText(action)\n \"\n [attr.title]=\"resolveActionLabel(action)\"\n [attr.aria-label]=\"resolveActionLabel(action)\"\n (click)=\"runColumnCellAction(action, row, $event, column)\"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon\n class=\"nvb-table-action-icon\"\n [name]=\"actionIcon\"\n ></nvb-icon>\n }\n @if (\n actionRendersText(\n action,\n columnCellActionsUseButtons(column)\n )\n ) {\n <span>{{ resolveActionLabel(action) }}</span>\n }\n </button>\n }\n }\n </div>\n }\n }\n }\n </div>\n </td>\n }\n }\n\n @if (hasRowActions()) {\n <td\n class=\"nvb-action-cell\"\n [attr.data-label]=\"model().actionsLabel || ('table.actions' | uiT: 'Actions')\"\n >\n @if (visibleRowActions(row); as rowActions) {\n @let rowEditing = isInlineEditRow(row, rowIndex);\n @let inlineActionsEnabled =\n inlineEditEnabled() && hasInlineEditableColumns();\n @if (inlineActionsEnabled || rowActions.length > 0) {\n <div class=\"nvb-row-actions nvb-row-actions--inline\">\n @if (inlineActionsEnabled) {\n @if (rowEditing) {\n <button [attr.data-testid]=\"tid('inline-save', rowIndex)\"\n type=\"button\"\n class=\"nvb-row-actions__inline-button\"\n [disabled]=\"isInlineEditBusy(row, rowIndex)\"\n (click)=\"saveInlineEdit(row, rowIndex, $event)\"\n >\n <span class=\"material-symbols-outlined\">save</span>\n <span>{{\n isInlineEditBusy(row, rowIndex)\n ? ('table.inlineEdit.saving' | uiT: 'Saving')\n : ('table.inlineEdit.save' | uiT: 'Save')\n }}</span>\n </button>\n <button [attr.data-testid]=\"tid('inline-cancel', rowIndex)\"\n type=\"button\"\n class=\"nvb-row-actions__inline-button\"\n [disabled]=\"isInlineEditBusy(row, rowIndex)\"\n (click)=\"cancelInlineEdit($event)\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n <span>{{ 'table.inlineEdit.cancel' | uiT: 'Cancel' }}</span>\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"nvb-row-actions__inline-button\"\n (click)=\"startInlineEdit(row, rowIndex, $event)\"\n [attr.data-testid]=\"tid('row-edit', rowIndex)\"\n >\n <span class=\"material-symbols-outlined\">edit</span>\n <span>{{ 'table.inlineEdit.edit' | uiT: 'Edit' }}</span>\n </button>\n }\n }\n\n @if (!rowEditing && rowActions.length > 0) {\n @if (rowActionsUseDropdown()) {\n <div class=\"nvb-row-actions\">\n <button\n type=\"button\"\n class=\"nvb-row-actions__toggle\"\n [class.nvb-row-actions__toggle--borderless]=\"\n rowActionsUseBorderlessDropdownToggle()\n \"\n (click)=\"toggleActionMenu(rowIndex, rowActions.length, $event)\"\n [attr.data-testid]=\"tid('row-actions', rowIndex)\"\n [attr.aria-label]=\"\n model().actionsLabel || ('table.actions' | uiT: 'Actions')\n \"\n >\n <span class=\"material-symbols-outlined\">more_vert</span>\n </button>\n\n @if (openActionMenuRow() === rowIndex) {\n <div [attr.data-testid]=\"tid('menu', rowIndex)\"\n class=\"nvb-row-actions__menu\"\n [class.nvb-row-actions__menu--top]=\"\n rowActionMenuPosition() === 'top'\n \"\n [ngStyle]=\"rowActionMenuStyle()\"\n (click)=\"$event.stopPropagation()\"\n >\n @for (\n action of rowActions;\n track action.id || $index;\n let actionIndex = $index\n ) {\n <button\n type=\"button\"\n (click)=\"runRowAction(action, row, $event)\"\n [attr.data-testid]=\"\n tid(\n 'row-action',\n rowIndex,\n actionTestToken(action, actionIndex)\n )\n \"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon\n class=\"nvb-table-action-icon\"\n [name]=\"actionIcon\"\n ></nvb-icon>\n }\n <span>{{ resolveActionLabel(action) }}</span>\n </button>\n }\n </div>\n }\n </div>\n } @else {\n @for (\n action of rowActions;\n track action.id || $index;\n let actionIndex = $index\n ) {\n <button\n type=\"button\"\n class=\"nvb-row-actions__inline-button\"\n [class.nvb-row-actions__inline-button--icon-only]=\"\n rowActionsUseIconButtons() || actionHidesText(action)\n \"\n [attr.title]=\"resolveActionLabel(action)\"\n [attr.aria-label]=\"resolveActionLabel(action)\"\n (click)=\"runRowAction(action, row, $event)\"\n [attr.data-testid]=\"\n tid('row-action', rowIndex, actionTestToken(action, actionIndex))\n \"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon\n class=\"nvb-table-action-icon\"\n [name]=\"actionIcon\"\n ></nvb-icon>\n }\n @if (actionRendersText(action, rowActionsUseButtons())) {\n <span>{{ resolveActionLabel(action) }}</span>\n }\n </button>\n }\n }\n }\n </div>\n } @else {\n <span class=\"nvb-row-actions__empty\">-</span>\n }\n }\n </td>\n }\n </tr>\n @if (expandedUsesInline() && isRowExpanded(row, rowIndex)) {\n <tr\n class=\"nvb-table-expanded-inline-row\"\n [attr.data-row-key]=\"resolveRowExpansionKey(row, rowIndex)\"\n >\n <td\n class=\"nvb-table-expanded-inline-row__cell\"\n [attr.colspan]=\"expandedInlineColspan()\"\n >\n <div class=\"nvb-table-expanded-inline-row__content\">\n <ng-container\n [ngTemplateOutlet]=\"expandedContentTemplate\"\n [ngTemplateOutletContext]=\"{\n expandedContext: {\n key: resolveRowExpansionKey(row, rowIndex),\n row: row,\n rowIndex: rowIndex,\n },\n }\"\n />\n </div>\n </td>\n </tr>\n }\n @if (\n expandedUsesInline() &&\n isEditor() &&\n rowIndex === 0 &&\n !isRowExpanded(row, rowIndex) &&\n editorExpandedPreviewContext();\n as expandedContext\n ) {\n <tr\n class=\"nvb-table-expanded-inline-row nvb-table-expanded-inline-row--preview\"\n [attr.data-row-key]=\"expandedContext.key\"\n >\n <td\n class=\"nvb-table-expanded-inline-row__cell\"\n [attr.colspan]=\"expandedInlineColspan()\"\n >\n <div class=\"nvb-table-expanded-inline-row__content\">\n <ng-container\n [ngTemplateOutlet]=\"expandedContentTemplate\"\n [ngTemplateOutletContext]=\"{ expandedContext: expandedContext }\"\n />\n </div>\n </td>\n </tr>\n }\n }\n\n @if (virtualScrollEnabled() && virtualBottomSpacerHeight() > 0) {\n <tr class=\"nvb-table-virtual-spacer-row\" aria-hidden=\"true\">\n <td\n class=\"nvb-table-virtual-spacer-cell\"\n [attr.colspan]=\"expandedInlineColspan()\"\n [style.height.px]=\"virtualBottomSpacerHeight()\"\n ></td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n <ng-template #expandedContentTemplate let-expandedContext=\"expandedContext\">\n @if (\n expansionEnabled() && isExpandedRowsLoading(expandedContext.row, expandedContext.rowIndex)\n ) {\n <div class=\"nvb-expanded-row__loading\">\n {{ resolveExpandedLoadingMessage() | uiT: 'Loading details...' }}\n </div>\n } @else if (\n resolveExpandedRowsError(expandedContext.row, expandedContext.rowIndex);\n as expandedError\n ) {\n <div class=\"nvb-expanded-row__error\">\n {{ expandedError | uiT: 'Failed to load details.' }}\n </div>\n } @else if (\n expansionEnabled() &&\n resolveExpandedTemplateHtml(expandedContext.row, expandedContext.rowIndex);\n as expandedTemplateHtml\n ) {\n <div [attr.data-testid]=\"tid('expanded-template')\"\n class=\"nvb-expanded-row__template\"\n [attr.data-nvb-template-scope]=\"templateScopeId\"\n [innerHTML]=\"expandedTemplateHtml\"\n (click)=\"\n onTemplateContentClick(\n $event,\n expandedContext.row,\n resolveExpandedRows(expandedContext.row, expandedContext.rowIndex),\n expandedContext.row\n )\n \"\n ></div>\n } @else if (\n expansionEnabled() &&\n shouldRenderExpandedNestedTable(expandedContext.row, expandedContext.rowIndex)\n ) {\n @let expandedRows = resolveExpandedRows(expandedContext.row, expandedContext.rowIndex);\n <table class=\"nvb-nested-table\">\n <thead>\n <tr>\n @for (\n column of expandedDataColumns();\n track column.id || column.key;\n let columnIndex = $index\n ) {\n <th [attr.data-testid]=\"tid('expanded-column-header', columnIndex)\"\n [class]=\"columnAlignClass(column)\"\n [class.nvb-column-focused]=\"isExpandedColumnFocused(column, columnIndex)\"\n [class.nvb-nested-table__header--focusable]=\"isEditor()\"\n [style.width]=\"columnWidthStyle(column)\"\n [tabIndex]=\"isEditor() ? 0 : -1\"\n (focus)=\"onExpandedColumnHeaderFocus(column, columnIndex)\"\n (click)=\"onExpandedColumnHeaderClick(column, columnIndex, $event)\"\n >\n @if (showColumnHeaderLabel(column)) {\n {{ resolveColumnLabel(column) }}\n }\n </th>\n }\n @if (hasExpandedRowActions()) {\n <th class=\"nvb-action-column\">\n @if (showActionsHeaderLabel()) {\n {{ model().actionsLabel || ('table.actions' | uiT: 'Actions') }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (expandedRow of expandedRows; track $index; let tidIndex8 = $index) {\n <tr>\n @for (column of expandedDataColumns(); track column.id || column.key; let tidIndex9 = $index) {\n <td\n [attr.data-label]=\"resolveColumnDataLabel(column)\"\n [class]=\"columnAlignClass(column)\"\n >\n <div class=\"nvb-table-cell-content\">\n <div class=\"nvb-table-cell-content__value\">\n @if (isToggleSwitchColumn(column)) {\n <label [attr.data-testid]=\"tid('label', tidIndex8, tidIndex9)\"\n class=\"nvb-table-interactive-control nvb-table-interactive-control--toggle nvb-toggle-switch\"\n [class.nvb-toggle-switch--disabled]=\"\n !isInteractiveColumnEnabled(\n expandedRow,\n column,\n expandedContext.row\n )\n \"\n (click)=\"$event.stopPropagation()\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input', tidIndex8, tidIndex9)\"\n class=\"nvb-toggle-switch__input\"\n type=\"checkbox\"\n [checked]=\"\n resolveInteractiveColumnChecked(\n expandedRow,\n column,\n expandedContext.row\n )\n \"\n [disabled]=\"\n !isInteractiveColumnEnabled(\n expandedRow,\n column,\n expandedContext.row\n )\n \"\n [attr.aria-label]=\"resolveInteractiveColumnAriaLabel(column)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"\n onInteractiveColumnChange(\n expandedRow,\n column,\n $event,\n expandedContext.row\n )\n \"\n />\n <span class=\"nvb-toggle-switch__track\">\n <span class=\"nvb-toggle-switch__thumb\"></span>\n </span>\n </label>\n } @else if (isSingleCheckboxColumn(column)) {\n <label [attr.data-testid]=\"tid('label-2', tidIndex8, tidIndex9)\"\n class=\"nvb-table-interactive-control nvb-table-interactive-control--checkbox nvb-single-checkbox\"\n [class.nvb-single-checkbox--disabled]=\"\n !isInteractiveColumnEnabled(\n expandedRow,\n column,\n expandedContext.row\n )\n \"\n (click)=\"$event.stopPropagation()\"\n >\n <input [attr.data-testid]=\"tid('checkbox-input-2', tidIndex8, tidIndex9)\"\n class=\"nvb-single-checkbox__input nvb-control__checkbox-input\"\n type=\"checkbox\"\n [checked]=\"\n resolveInteractiveColumnChecked(\n expandedRow,\n column,\n expandedContext.row\n )\n \"\n [disabled]=\"\n !isInteractiveColumnEnabled(\n expandedRow,\n column,\n expandedContext.row\n )\n \"\n [attr.aria-label]=\"resolveInteractiveColumnAriaLabel(column)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"\n onInteractiveColumnChange(\n expandedRow,\n column,\n $event,\n expandedContext.row\n )\n \"\n />\n </label>\n } @else if (\n resolveStatusBadge(expandedRow, column);\n as expandedStatusBadge\n ) {\n <span\n class=\"nvb-status-pill\"\n [class]=\"'nvb-status-pill nvb-status-pill--' + expandedStatusBadge.tone\"\n [class.nvb-status-pill--rounded]=\"expandedStatusBadge.rounded\"\n >\n @if (expandedStatusBadge.icon) {\n <nvb-icon\n class=\"nvb-status-pill__icon\"\n [name]=\"expandedStatusBadge.icon\"\n ></nvb-icon>\n }\n {{ expandedStatusBadge.label }}\n </span>\n } @else if (resolveCellHtml(expandedRow, column); as expandedCellHtml) {\n <div [attr.data-testid]=\"tid('template-content', tidIndex8, tidIndex9)\"\n class=\"nvb-table-template-host\"\n [attr.data-nvb-template-scope]=\"templateScopeId\"\n [innerHTML]=\"expandedCellHtml\"\n (click)=\"\n onTemplateContentClick(\n $event,\n expandedRow,\n resolveCellValue(expandedRow, column),\n expandedContext.row\n )\n \"\n ></div>\n } @else {\n {{ resolveCellText(expandedRow, column) }}\n }\n </div>\n\n @if (!isInteractiveColumn(column)) {\n @if (\n visibleColumnCellActions(expandedRow, column, expandedContext.row);\n as columnActions\n ) {\n @if (columnActions.length > 0) {\n <div [attr.data-testid]=\"tid('div', tidIndex8, tidIndex9)\"\n class=\"nvb-table-cell-actions\"\n [class.nvb-table-cell-actions--icon]=\"\n columnCellActionsUseIconButtons(column)\n \"\n (click)=\"$event.stopPropagation()\"\n >\n @if (columnCellActionsUseDropdown(column)) {\n <nvb-select [testId]=\"tid('select', tidIndex8, tidIndex9)\"\n class=\"nvb-table-cell-actions__select\"\n (change)=\"\n onColumnCellActionSelect(\n expandedRow,\n column,\n $event,\n expandedContext.row\n )\n \"\n >\n <option value=\"\">\n {{ resolveColumnCellActionsPlaceholder(column) }}\n </option>\n @for (action of columnActions; track action.id || $index) {\n <option [value]=\"'id:' + (action.id || $index)\">\n {{ resolveActionLabel(action) }}\n </option>\n }\n </nvb-select>\n } @else {\n @for (action of columnActions; track action.id || $index; let tidIndex10 = $index) {\n <button [attr.data-testid]=\"tid('run-column-cell-action', tidIndex8, tidIndex9, tidIndex10)\"\n type=\"button\"\n class=\"nvb-table-cell-actions__button\"\n [class.nvb-table-cell-actions__button--icon-only]=\"\n columnCellActionsUseIconButtons(column) ||\n actionHidesText(action)\n \"\n [attr.title]=\"resolveActionLabel(action)\"\n [attr.aria-label]=\"resolveActionLabel(action)\"\n (click)=\"\n runColumnCellAction(\n action,\n expandedRow,\n $event,\n column,\n expandedContext.row\n )\n \"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon\n class=\"nvb-table-action-icon\"\n [name]=\"actionIcon\"\n ></nvb-icon>\n }\n @if (\n actionRendersText(\n action,\n columnCellActionsUseButtons(column)\n )\n ) {\n <span>{{ resolveActionLabel(action) }}</span>\n }\n </button>\n }\n }\n </div>\n }\n }\n }\n </div>\n </td>\n }\n @if (hasExpandedRowActions()) {\n <td class=\"nvb-action-cell\">\n @if (\n visibleExpandedRowActions(expandedContext.row, expandedRow);\n as expandedActions\n ) {\n @if (expandedActions.length > 0) {\n @if (rowActionsUseDropdown()) {\n <nvb-select [testId]=\"tid('select', tidIndex8)\"\n class=\"nvb-table-cell-actions__select\"\n (change)=\"\n onExpandedRowActionSelect(expandedContext.row, expandedRow, $event)\n \"\n >\n <option value=\"\">\n {{ resolveExpandedRowActionsPlaceholder() }}\n </option>\n @for (action of expandedActions; track action.id || $index) {\n <option [value]=\"'id:' + (action.id || $index)\">\n {{ resolveActionLabel(action) }}\n </option>\n }\n </nvb-select>\n } @else {\n <div\n class=\"nvb-expanded-row__actions\"\n [class.nvb-table-cell-actions--icon]=\"rowActionsUseIconButtons()\"\n >\n @for (action of expandedActions; track action.id || $index; let tidIndex11 = $index) {\n <button [attr.data-testid]=\"tid('action', tidIndex8, tidIndex11)\"\n type=\"button\"\n class=\"nvb-expanded-row__action\"\n [class.nvb-expanded-row__action--icon-only]=\"\n rowActionsUseIconButtons() || actionHidesText(action)\n \"\n [attr.title]=\"resolveActionLabel(action)\"\n [attr.aria-label]=\"resolveActionLabel(action)\"\n (click)=\"\n runExpandedRowAction(\n action,\n expandedContext.row,\n expandedRow,\n $event\n )\n \"\n >\n @if (resolveActionIcon(action); as actionIcon) {\n <nvb-icon\n class=\"nvb-table-action-icon\"\n [name]=\"actionIcon\"\n ></nvb-icon>\n }\n @if (actionRendersText(action, rowActionsUseButtons())) {\n <span>{{ resolveActionLabel(action) }}</span>\n }\n </button>\n }\n </div>\n }\n } @else {\n <span class=\"nvb-row-actions__empty\">-</span>\n }\n }\n </td>\n }\n </tr>\n }\n @if (isEditor() && expandedContext.rowIndex < 0 && expandedRows.length === 0) {\n <tr class=\"nvb-nested-table__placeholder-row\" aria-hidden=\"true\">\n @for (column of expandedDataColumns(); track column.id || column.key) {\n <td [class]=\"columnAlignClass(column)\"> </td>\n }\n @if (hasExpandedRowActions()) {\n <td class=\"nvb-action-cell\"> </td>\n }\n </tr>\n }\n </tbody>\n </table>\n } @else if (detailColumns().length > 0) {\n <div class=\"nvb-expanded-row__details\">\n @for (\n column of detailColumns();\n track column.id || column.key;\n let detailColumnIndex = $index\n ) {\n <div class=\"nvb-expanded-row__detail-item\">\n <div class=\"nvb-expanded-row__detail-label\">{{ resolveDetailLabel(column) }}</div>\n <div class=\"nvb-expanded-row__detail-value\">\n @if (isElementColumn(column)) {\n @if (\n getCellElementModel(\n expandedContext.row,\n expandedContext.rowIndex,\n column,\n detailColumnIndex,\n 'detail'\n );\n as detailCellElement\n ) {\n <div class=\"nvb-table-cell-element\">\n <!-- Same row identity as a table cell: selecting another row must\n rebuild the control, not reuse the previous row's state. -->\n @for (detailModel of [detailCellElement]; track detailModel) {\n <runtime-lazy-element-outlet [model]=\"detailModel\" />\n }\n </div>\n }\n } @else if (\n resolveStatusBadge(expandedContext.row, column);\n as detailStatusBadge\n ) {\n <span\n class=\"nvb-status-pill\"\n [class]=\"'nvb-status-pill nvb-status-pill--' + detailStatusBadge.tone\"\n [class.nvb-status-pill--rounded]=\"detailStatusBadge.rounded\"\n >\n @if (detailStatusBadge.icon) {\n <nvb-icon\n class=\"nvb-status-pill__icon\"\n [name]=\"detailStatusBadge.icon\"\n ></nvb-icon>\n }\n {{ detailStatusBadge.label }}\n </span>\n } @else if (resolveCellHtml(expandedContext.row, column); as detailCellHtml) {\n <div [attr.data-testid]=\"tid('template-content', detailColumnIndex)\"\n class=\"nvb-table-template-host\"\n [attr.data-nvb-template-scope]=\"templateScopeId\"\n [innerHTML]=\"detailCellHtml\"\n (click)=\"\n onTemplateContentClick(\n $event,\n expandedContext.row,\n resolveCellValue(expandedContext.row, column),\n expandedContext.row\n )\n \"\n ></div>\n } @else {\n {{ resolveCellText(expandedContext.row, column) }}\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"nvb-expanded-row__empty\">\n {{ resolveExpandedEmptyMessage() | uiT: 'No nested rows' }}\n </div>\n }\n </ng-template>\n\n @if (expandedUsesSidePanel() && activeExpandedPanelContext(); as expandedContext) {\n <aside class=\"nvb-table-detail-panel\" [attr.data-row-key]=\"expandedContext.key\">\n <div class=\"nvb-table-detail-panel__header\">\n <strong class=\"nvb-table-detail-panel__title\">{{\n resolveDetailsPanelTitle() | uiT: 'Detailed info'\n }}</strong>\n <button [attr.data-testid]=\"tid('close-details')\"\n type=\"button\"\n class=\"nvb-table-detail-panel__close\"\n (click)=\"closeExpandedRowPanel($event)\"\n [attr.aria-label]=\"'table.closeDetails' | uiT: 'Close details'\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n </div>\n\n <ng-container\n [ngTemplateOutlet]=\"expandedContentTemplate\"\n [ngTemplateOutletContext]=\"{ expandedContext: expandedContext }\"\n />\n </aside>\n }\n </div>\n\n @if (model().paginator) {\n <div\n class=\"nvb-table-paginator\"\n role=\"navigation\"\n [attr.aria-label]=\"'table.pagination.label' | uiT: 'Table pagination'\"\n [class.nvb-table-paginator--flat]=\"flatFooterSurface()\"\n [class.nvb-table-paginator--compact]=\"paginatorStyle() === 'compact'\"\n [class.nvb-table-paginator--segmented]=\"paginatorStyle() === 'segmented'\"\n [class.nvb-table-paginator--align-start]=\"paginatorAlign() === 'start'\"\n [class.nvb-table-paginator--align-center]=\"paginatorAlign() === 'center'\"\n [attr.data-testid]=\"tid('paginator')\"\n >\n <div class=\"nvb-table-paginator__content\">\n <div class=\"nvb-table-paginator__controls\">\n @if (showFirstLastPaginator()) {\n <button\n type=\"button\"\n class=\"nvb-table-paginator__nav nvb-table-paginator__nav--icon\"\n (click)=\"firstPage()\"\n [attr.data-testid]=\"tid('page-first')\"\n [disabled]=\"pageIndex() <= 0\"\n [attr.aria-label]=\"'table.pagination.first' | uiT: 'First page'\"\n >\n @if (paginatorStyle() === 'default') {\n <span class=\"material-symbols-outlined\">first_page</span>\n } @else {\n <span class=\"material-symbols-outlined\">keyboard_double_arrow_left</span>\n }\n </button>\n }\n\n @if (showPrevNextPaginator()) {\n <button\n type=\"button\"\n class=\"nvb-table-paginator__nav\"\n [class.nvb-table-paginator__nav--icon]=\"useIconOnlyPaginatorNav()\"\n (click)=\"previousPage()\"\n [attr.data-testid]=\"tid('page-prev')\"\n [disabled]=\"pageIndex() <= 0\"\n [attr.aria-label]=\"'table.prev' | uiT: 'Prev'\"\n >\n @if (useIconOnlyPaginatorNav()) {\n <span class=\"material-symbols-outlined\">chevron_left</span>\n } @else {\n {{ model().prevLabel || ('table.prev' | uiT: 'Prev') }}\n }\n </button>\n }\n\n @if (showNumericPaginator()) {\n <div class=\"nvb-table-paginator__pages\">\n @for (page of visiblePageNumbers(); track page) {\n <button\n type=\"button\"\n class=\"nvb-table-paginator__page\"\n [class.nvb-table-paginator__page--active]=\"page === pageIndex()\"\n (click)=\"goToPage(page)\"\n [attr.data-testid]=\"tid('page', page)\"\n [disabled]=\"page === pageIndex()\"\n [attr.aria-label]=\"'Page ' + (page + 1)\"\n [attr.aria-current]=\"page === pageIndex() ? 'page' : null\"\n >\n {{ page + 1 }}\n </button>\n }\n </div>\n }\n\n @if (showPrevNextPaginator()) {\n <button\n type=\"button\"\n class=\"nvb-table-paginator__nav\"\n [class.nvb-table-paginator__nav--icon]=\"useIconOnlyPaginatorNav()\"\n (click)=\"nextPage()\"\n [attr.data-testid]=\"tid('page-next')\"\n [disabled]=\"pageIndex() >= totalPages() - 1\"\n [attr.aria-label]=\"'table.next' | uiT: 'Next'\"\n >\n @if (useIconOnlyPaginatorNav()) {\n <span class=\"material-symbols-outlined\">chevron_right</span>\n } @else {\n {{ model().nextLabel || ('table.next' | uiT: 'Next') }}\n }\n </button>\n }\n\n @if (showFirstLastPaginator()) {\n <button\n type=\"button\"\n class=\"nvb-table-paginator__nav nvb-table-paginator__nav--icon\"\n (click)=\"lastPage()\"\n [attr.data-testid]=\"tid('page-last')\"\n [disabled]=\"pageIndex() >= totalPages() - 1\"\n [attr.aria-label]=\"'table.pagination.last' | uiT: 'Last page'\"\n >\n @if (paginatorStyle() === 'default') {\n <span class=\"material-symbols-outlined\">last_page</span>\n } @else {\n <span class=\"material-symbols-outlined\">keyboard_double_arrow_right</span>\n }\n </button>\n }\n </div>\n\n @if (showPageMeta()) {\n <span class=\"nvb-table-paginator__meta\">{{ pageMeta() }}</span>\n }\n </div>\n\n @if (showPageSizeSelector()) {\n <div class=\"nvb-table-paginator__size\">\n <nvb-select\n class=\"nvb-table-paginator__size-select\"\n [ngModel]=\"pageSize()\"\n (ngModelChange)=\"setPageSize($event)\"\n [attr.data-testid]=\"tid('page-size')\"\n [attr.aria-label]=\"'table.pagination.pageSize' | uiT: 'Rows per page'\"\n >\n @for (size of pageSizeOptions(); track size) {\n <option [ngValue]=\"size\">{{ size }}</option>\n }\n </nvb-select>\n </div>\n }\n </div>\n }\n\n @if (openExportDialog()) {\n <div [attr.data-testid]=\"tid('export-dialog-backdrop')\" class=\"nvb-table-dialog-backdrop\" (click)=\"closeExportSelectionDialog()\"></div>\n <section\n class=\"nvb-table-dialog nvb-table-export-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"table-export-dialog-title\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onExportDialogKeydown($event)\"\n [attr.data-testid]=\"tid('export-dialog')\"\n >\n <header class=\"nvb-table-dialog__header\">\n <h4 id=\"table-export-dialog-title\">\n {{ 'table.export.dialog.heading' | uiT: 'Export' }}\n @if (model().label) {\n <span class=\"nvb-table-export-dialog__subject\">{{ model().label }}</span>\n }\n </h4>\n <button [attr.data-testid]=\"tid('export-dialog-close')\"\n type=\"button\"\n class=\"nvb-table-dialog__close\"\n (click)=\"closeExportSelectionDialog()\"\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\n >\n <nvb-icon name=\"close\"></nvb-icon>\n </button>\n </header>\n\n <div class=\"nvb-table-dialog__body nvb-table-export-dialog__body\">\n <fieldset class=\"nvb-table-export-dialog__group\">\n <legend class=\"nvb-table-export-dialog__legend\">\n {{ 'table.export.format' | uiT: 'Format' }}\n </legend>\n <div class=\"nvb-table-export-dialog__formats\" role=\"radiogroup\">\n @for (option of exportFormatOptions; track option.value) {\n <button\n type=\"button\"\n role=\"radio\"\n class=\"nvb-table-export-dialog__format\"\n [class.nvb-table-export-dialog__format--active]=\"exportFormat() === option.value\"\n [attr.aria-checked]=\"exportFormat() === option.value\"\n (click)=\"setExportFormat(option.value)\"\n [attr.data-testid]=\"tid('export-format-' + option.value)\"\n >\n <nvb-icon [name]=\"option.icon\" class=\"nvb-table-export-dialog__format-icon\"></nvb-icon>\n <span class=\"nvb-table-export-dialog__format-text\">\n <strong>{{ option.labelKey | uiT: option.label }}</strong>\n <small>{{ option.hintKey | uiT: option.hint }}</small>\n </span>\n <span class=\"nvb-table-export-dialog__check\" aria-hidden=\"true\">\n <nvb-icon name=\"check\"></nvb-icon>\n </span>\n </button>\n }\n </div>\n </fieldset>\n\n <fieldset class=\"nvb-table-export-dialog__group\">\n <legend class=\"nvb-table-export-dialog__legend\">\n {{ 'table.export.rows' | uiT: 'Rows' }}\n </legend>\n <div class=\"nvb-table-export-dialog__scopes\" role=\"radiogroup\">\n @if (exportSelectedCount() > 0) {\n <label class=\"nvb-table-export-dialog__scope\">\n <input\n type=\"radio\"\n name=\"nvb-table-export-scope\"\n [checked]=\"exportScope() === 'selected'\"\n (change)=\"setExportScope('selected')\"\n [attr.data-testid]=\"tid('export-scope-selected')\"\n />\n <span class=\"nvb-table-export-dialog__scope-text\">\n {{ 'table.export.scope.selected' | uiT: 'Selected rows' }}\n </span>\n <span class=\"nvb-table-export-dialog__count\">{{ exportSelectedCount() }}</span>\n </label>\n }\n <label class=\"nvb-table-export-dialog__scope\">\n <input\n type=\"radio\"\n name=\"nvb-table-export-scope\"\n [checked]=\"exportScope() === 'all'\"\n (change)=\"setExportScope('all')\"\n [attr.data-testid]=\"tid('export-scope-all')\"\n />\n <span class=\"nvb-table-export-dialog__scope-text\">\n {{\n exportHasFilters()\n ? ('table.export.scope.allFiltered' | uiT: 'All rows matching search and filters')\n : ('table.export.scope.allRows' | uiT: 'All rows')\n }}\n @if (model().lazyLoad) {\n <small>{{\n 'table.export.scope.allLazyHint' | uiT: 'Every page, loaded from the server'\n }}</small>\n }\n </span>\n <span class=\"nvb-table-export-dialog__count\">{{ exportAllCount() }}</span>\n </label>\n <label class=\"nvb-table-export-dialog__scope\">\n <input\n type=\"radio\"\n name=\"nvb-table-export-scope\"\n [checked]=\"exportScope() === 'current'\"\n (change)=\"setExportScope('current')\"\n [attr.data-testid]=\"tid('export-scope-current')\"\n />\n <span class=\"nvb-table-export-dialog__scope-text\">\n {{ 'table.export.scope.currentPage' | uiT: 'Current page only' }}\n </span>\n <span class=\"nvb-table-export-dialog__count\">{{ exportCurrentCount() }}</span>\n </label>\n </div>\n </fieldset>\n\n @if (exportUsesColumnPicker()) {\n <fieldset class=\"nvb-table-export-dialog__group\">\n <legend class=\"nvb-table-export-dialog__legend nvb-table-export-dialog__legend--row\">\n <span>\n {{ 'table.export.columns' | uiT: 'Columns' }}\n <span class=\"nvb-table-export-dialog__muted\">\n {{ selectedExportColumns().length }} / {{ exportColumns().length }}\n </span>\n </span>\n <button [attr.data-testid]=\"tid('export-select-all')\"\n type=\"button\"\n class=\"nvb-table-export-dialog__link\"\n (click)=\"selectAllExportColumns(!allExportColumnsSelected())\"\n >\n {{\n allExportColumnsSelected()\n ? ('table.export.columns.none' | uiT: 'Clear all')\n : ('table.export.columns.selectAll' | uiT: 'Select all')\n }}\n </button>\n </legend>\n <div class=\"nvb-table-export-dialog__columns\">\n @for (column of exportColumns(); track column.id || column.key; let tidIndex12 = $index) {\n <label class=\"nvb-table-export-dialog__column\">\n <input [attr.data-testid]=\"tid('checkbox-input', tidIndex12)\"\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"isExportColumnSelected(column)\"\n (change)=\"onExportColumnSelectionChange(column, $event)\"\n />\n <span>{{ resolveColumnLabel(column) }}</span>\n </label>\n }\n </div>\n </fieldset>\n }\n\n <fieldset class=\"nvb-table-export-dialog__group\">\n <legend class=\"nvb-table-export-dialog__legend\">\n {{ 'table.export.fileName' | uiT: 'File name' }}\n </legend>\n <div class=\"nvb-table-export-dialog__filename\">\n <input\n type=\"text\"\n class=\"nvb-control__text-input\"\n [value]=\"exportFileNameDraft()\"\n (input)=\"onExportFileNameInput($any($event.target).value)\"\n [attr.aria-label]=\"'table.export.fileName' | uiT: 'File name'\"\n spellcheck=\"false\"\n [attr.data-testid]=\"tid('export-file-name')\"\n />\n <span class=\"nvb-table-export-dialog__extension\">.{{ exportExtension() }}</span>\n </div>\n </fieldset>\n </div>\n\n <footer class=\"nvb-table-export-dialog__footer\">\n <span class=\"nvb-table-export-dialog__summary\" aria-live=\"polite\">\n @if (exportUsesColumnPicker() && selectedExportColumns().length === 0) {\n {{ 'table.export.noColumns' | uiT: 'Choose at least one column.' }}\n } @else if (exportRowCount() === 0) {\n {{ 'table.export.noRows' | uiT: 'There are no rows to export.' }}\n }\n </span>\n <button [attr.data-testid]=\"tid('export-dialog-cancel')\"\n type=\"button\"\n class=\"nvb-table-export-dialog__button\"\n (click)=\"closeExportSelectionDialog()\"\n >\n {{ 'common.cancel' | uiT: 'Cancel' }}\n </button>\n <button\n type=\"button\"\n class=\"nvb-table-export-dialog__button nvb-table-export-dialog__button--primary\"\n [disabled]=\"\n exportBusy() ||\n exportRowCount() === 0 ||\n (exportUsesColumnPicker() && selectedExportColumns().length === 0)\n \"\n (click)=\"confirmExport($event)\"\n [attr.data-testid]=\"tid('export-confirm')\"\n >\n @if (exportBusy()) {\n <span class=\"nvb-table-export-dialog__spinner\" aria-hidden=\"true\"></span>\n {{ 'table.export.preparing' | uiT: 'Preparing...' }}\n } @else {\n {{\n (exportRowCount() === 1\n ? ('table.export.confirmOne' | uiT: 'Export 1 row')\n : ('table.export.confirmMany' | uiT: 'Export {count} rows')\n ).replace('{count}', '' + exportRowCount())\n }}\n }\n </button>\n </footer>\n </section>\n }\n\n @if (openColumnSettingsDialog()) {\n <div [attr.data-testid]=\"tid('column-settings-backdrop')\" class=\"nvb-table-dialog-backdrop\" (click)=\"closeColumnSettings()\"></div>\n <section [attr.data-testid]=\"tid('column-settings-dialog')\"\n class=\"nvb-table-dialog nvb-table-dialog--column-settings\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"table-column-settings-dialog-title\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"nvb-table-dialog__header\">\n <h4 id=\"table-column-settings-dialog-title\">\n {{ columnSettingsDialogTitle() | uiT: 'Columns settings' }}\n </h4>\n <button [attr.data-testid]=\"tid('column-settings-close')\"\n type=\"button\"\n class=\"nvb-table-dialog__close\"\n (click)=\"closeColumnSettings()\"\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"close\"></nvb-icon>\n </button>\n </header>\n\n <div class=\"nvb-table-dialog__body\">\n <div class=\"nvb-table-column-settings\">\n <div class=\"nvb-table-column-settings__actions\">\n <button [attr.data-testid]=\"tid('show-all-column-settings')\" type=\"button\" class=\"nvb-table-toolbar__button\" (click)=\"showAllColumnSettings()\">\n <nvb-icon class=\"nvb-table-action-icon\" name=\"visibility\"></nvb-icon>\n <span>{{ 'table.columns.settings.showAll' | uiT: 'Show all' }}</span>\n </button>\n <button [attr.data-testid]=\"tid('reset-column-settings')\" type=\"button\" class=\"nvb-table-toolbar__button\" (click)=\"resetColumnSettings()\">\n <nvb-icon class=\"nvb-table-action-icon\" name=\"restart_alt\"></nvb-icon>\n <span>{{ 'table.columns.settings.reset' | uiT: 'Reset' }}</span>\n </button>\n </div>\n\n <div\n class=\"nvb-table-column-settings__list\"\n cdkDropList\n [cdkDropListData]=\"columnSettingsDraft()\"\n (cdkDropListDropped)=\"reorderColumnSettingsRows($event)\"\n >\n @for (column of columnSettingsDraft(); track column.key; let tidIndex13 = $index) {\n <article class=\"nvb-table-column-settings__item\" cdkDrag>\n <button [attr.data-testid]=\"tid('reorder', tidIndex13)\"\n type=\"button\"\n class=\"nvb-table-column-settings__drag\"\n cdkDragHandle\n [attr.aria-label]=\"'table.columns.settings.reorder' | uiT: 'Reorder column'\"\n [attr.title]=\"'table.columns.settings.reorder' | uiT: 'Reorder column'\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"drag_indicator\"></nvb-icon>\n </button>\n <div class=\"nvb-table-column-settings__content\">\n <label class=\"nvb-table-column-settings__toggle\">\n <input [attr.data-testid]=\"tid('checkbox-input', tidIndex13)\"\n type=\"checkbox\"\n class=\"nvb-control__checkbox-input\"\n [checked]=\"column.visible\"\n (change)=\"\n setColumnSettingsVisibility(column.key, $any($event.target).checked)\n \"\n />\n <span>{{ column.label || column.key }}</span>\n </label>\n\n <label class=\"nvb-table-column-settings__width\">\n <div class=\"nvb-table-column-settings__width-header\">\n <span>{{ 'table.columns.settings.width' | uiT: 'Plotis' }}</span>\n <div class=\"nvb-table-column-settings__width-meta\">\n <button [attr.data-testid]=\"tid('width-reset', tidIndex13)\"\n type=\"button\"\n class=\"nvb-table-column-settings__width-reset\"\n [class.nvb-table-column-settings__width-reset--active]=\"\n !hasColumnSettingsCustomWidth(column)\n \"\n (click)=\"resetColumnSettingsWidth(column.key)\"\n >\n {{ 'table.columns.settings.auto' | uiT: 'Automatinis' }}\n </button>\n <span class=\"nvb-table-column-settings__width-value\">\n {{ resolveColumnSettingsWidthDisplay(column) }}\n </span>\n </div>\n </div>\n\n <div class=\"nvb-table-column-settings__width-range\">\n <input [attr.data-testid]=\"tid('range-input', tidIndex13)\"\n type=\"range\"\n [min]=\"columnSettingsWidthMin\"\n [max]=\"columnSettingsWidthMax\"\n [step]=\"columnSettingsWidthStep\"\n [value]=\"resolveColumnSettingsWidthSliderValue(column)\"\n (click)=\"$event.stopPropagation()\"\n (input)=\"setColumnSettingsWidth(column.key, $any($event.target).value)\"\n />\n </div>\n </label>\n </div>\n\n <div class=\"nvb-table-column-settings__order\">\n <button [attr.data-testid]=\"tid('move-up', tidIndex13)\"\n type=\"button\"\n class=\"nvb-table-column-settings__move\"\n [disabled]=\"isColumnSettingsRowFirst(column.key)\"\n (click)=\"moveColumnSettingsRow(column.key, -1)\"\n [attr.aria-label]=\"'table.columns.settings.moveUp' | uiT: 'Move up'\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"arrow_upward\"></nvb-icon>\n </button>\n <button [attr.data-testid]=\"tid('move-down', tidIndex13)\"\n type=\"button\"\n class=\"nvb-table-column-settings__move\"\n [disabled]=\"isColumnSettingsRowLast(column.key)\"\n (click)=\"moveColumnSettingsRow(column.key, 1)\"\n [attr.aria-label]=\"'table.columns.settings.moveDown' | uiT: 'Move down'\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"arrow_downward\"></nvb-icon>\n </button>\n </div>\n </article>\n }\n </div>\n </div>\n </div>\n\n <footer class=\"nvb-table-dialog__footer\">\n <button [attr.data-testid]=\"tid('column-settings-cancel')\" type=\"button\" class=\"nvb-table-toolbar__button\" (click)=\"closeColumnSettings()\">\n {{ 'table.columns.settings.cancel' | uiT: 'Cancel' }}\n </button>\n @if (showColumnSettingsSaveAction()) {\n <button [attr.data-testid]=\"tid('save-column-settings')\"\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n (click)=\"saveColumnSettings($event)\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"save\"></nvb-icon>\n <span>{{ 'table.columns.settings.save' | uiT: 'Save settings' }}</span>\n </button>\n }\n <button [attr.data-testid]=\"tid('apply-column-settings')\"\n type=\"button\"\n class=\"nvb-table-toolbar__button nvb-table-toolbar__button--primary\"\n (click)=\"applyColumnSettings($event)\"\n >\n <nvb-icon class=\"nvb-table-action-icon\" name=\"save\"></nvb-icon>\n <span>{{ 'table.columns.settings.apply' | uiT: 'Apply settings' }}</span>\n </button>\n </footer>\n </section>\n }\n\n @if (openSavedFiltersDialog()) {\n <div [attr.data-testid]=\"tid('close-saved-filters')\" class=\"nvb-table-dialog-backdrop\" (click)=\"closeSavedFilters()\"></div>\n <section [attr.data-testid]=\"tid('saved-filters-dialog')\"\n class=\"nvb-table-dialog nvb-table-dialog--filters\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"table-saved-filters-dialog-title\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"nvb-table-dialog__header\">\n <h4 id=\"table-saved-filters-dialog-title\">\n {{ 'table.filters.dialog.title' | uiT: 'Saved filters' }}\n </h4>\n <button [attr.data-testid]=\"tid('saved-filters-close')\"\n type=\"button\"\n class=\"nvb-table-dialog__close\"\n (click)=\"closeSavedFilters()\"\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n </header>\n\n <div class=\"nvb-table-dialog__tabs\" role=\"tablist\">\n <button [attr.data-testid]=\"tid('saved-filters-tab-create')\"\n type=\"button\"\n class=\"nvb-table-dialog__tab\"\n role=\"tab\"\n [class.nvb-table-dialog__tab--active]=\"savedFilterDialogTab() === 'create'\"\n [attr.aria-selected]=\"savedFilterDialogTab() === 'create'\"\n (click)=\"setSavedFilterDialogTab('create')\"\n >\n {{ 'table.filters.dialog.new' | uiT: 'Create new' }}\n </button>\n <button [attr.data-testid]=\"tid('saved-filters-tab-list')\"\n type=\"button\"\n class=\"nvb-table-dialog__tab\"\n role=\"tab\"\n [class.nvb-table-dialog__tab--active]=\"savedFilterDialogTab() === 'list'\"\n [attr.aria-selected]=\"savedFilterDialogTab() === 'list'\"\n (click)=\"setSavedFilterDialogTab('list')\"\n >\n {{ 'table.filters.dialog.list' | uiT: 'Filter list' }}\n </button>\n </div>\n\n <div class=\"nvb-table-dialog__body\">\n @if (savedFilterDialogTab() === 'create') {\n <div class=\"nvb-table-filter-form\">\n <label class=\"nvb-table-filter-form__row\">\n <span>{{ 'table.filters.name' | uiT: 'Name' }}</span>\n <input [attr.data-testid]=\"tid('saved-filter-name')\"\n type=\"text\"\n [ngModel]=\"savedFilterName()\"\n (ngModelChange)=\"savedFilterName.set($event)\"\n />\n </label>\n\n <label class=\"nvb-table-filter-form__row\">\n <span>{{ 'table.filters.description' | uiT: 'Description' }}</span>\n <input [attr.data-testid]=\"tid('saved-filter-description')\"\n type=\"text\"\n [ngModel]=\"savedFilterDescription()\"\n (ngModelChange)=\"savedFilterDescription.set($event)\"\n />\n </label>\n\n <label class=\"nvb-table-filter-form__row\">\n <span>{{ 'table.filters.code' | uiT: 'Code' }}</span>\n <input [attr.data-testid]=\"tid('saved-filter-search')\"\n type=\"text\"\n [ngModel]=\"savedFilterCode()\"\n (ngModelChange)=\"savedFilterCode.set($event)\"\n />\n </label>\n </div>\n } @else {\n <div class=\"nvb-table-filter-list\">\n @if (savedFiltersLoading()) {\n <div class=\"nvb-table-filter-list__empty\">\n {{ 'table.filters.loading' | uiT: 'Loading...' }}\n </div>\n } @else if (savedFilters().length === 0) {\n <div class=\"nvb-table-filter-list__empty\">\n {{ 'table.filters.empty' | uiT: 'No saved filters' }}\n </div>\n } @else {\n @for (savedFilter of savedFilters(); track savedFilter.id; let tidIndex14 = $index) {\n <article class=\"nvb-table-filter-list__item\">\n <div class=\"nvb-table-filter-list__meta\">\n <strong>{{ savedFilter.name }}</strong>\n @if (savedFilter.description) {\n <span>{{ savedFilter.description }}</span>\n }\n @if (savedFilter.code) {\n <small>{{ savedFilter.code }}</small>\n }\n </div>\n <div class=\"nvb-table-filter-list__actions\">\n <button [attr.data-testid]=\"tid('apply-saved-filter', tidIndex14)\"\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n (click)=\"applySavedFilter(savedFilter, $event)\"\n >\n {{ 'table.filters.apply' | uiT: 'Apply' }}\n </button>\n <button [attr.data-testid]=\"tid('delete-saved-filter', tidIndex14)\"\n type=\"button\"\n class=\"nvb-table-toolbar__button\"\n (click)=\"deleteSavedFilter(savedFilter, $event)\"\n >\n {{ 'table.filters.delete' | uiT: 'Delete' }}\n </button>\n </div>\n </article>\n }\n }\n </div>\n }\n </div>\n\n @if (savedFilterDialogTab() === 'create') {\n <footer class=\"nvb-table-dialog__footer nvb-table-dialog__footer--single\">\n <button [attr.data-testid]=\"tid('save-current-filter')\"\n type=\"button\"\n class=\"nvb-table-toolbar__button nvb-table-toolbar__button--primary\"\n [disabled]=\"savedFilterBusy() || !savedFilterName().trim()\"\n (click)=\"saveCurrentFilter($event)\"\n >\n <span class=\"material-symbols-outlined\">save</span>\n <span>{{ 'table.filters.save' | uiT: 'Save filter' }}</span>\n </button>\n </footer>\n }\n </section>\n }\n </div>\n</element-wrapper>\n",styles:["@charset \"UTF-8\";:host{display:block;width:100%}.nvb-table-shell{--nvb-table-control-height: 32px;--nvb-table-control-radius: var(--nvb-control-radius, var(--nvb-radius-sm));--nvb-table-control-font-size: 13px;--nvb-table-control-padding-x: 10px;--nvb-table-surface-border: color-mix( in oklab, var(--nvb-color-neutral-300) 78%, var(--nvb-color-surface-mix-target, white) );--nvb-table-surface-border-strong: color-mix( in oklab, var(--nvb-color-neutral-300) 92%, var(--nvb-color-surface-mix-target, white) );--nvb-table-surface-radius: var(--nvb-table-radius, var(--nvb-card-radius, var(--nvb-radius-md, var(--nvb-radius-sm))));--nvb-table-sticky-header-offset: 0px;position:relative;background:transparent;container-type:inline-size;display:flex;flex-direction:column;gap:0;font-family:var(--nvb-font-family)}.nvb-table-shell--editor .nvb-table-toolbar{z-index:1}.nvb-table-shell--editor .nvb-table-quick-search,.nvb-table-shell--editor .nvb-table-toolbar__button--detailed-toggle,.nvb-table-shell--editor .nvb-table-export,.nvb-table-shell--editor .nvb-table-header-menu,.nvb-table-shell--editor .nvb-table-header-actions,.nvb-table-shell--editor .nvb-table-detailed-search{pointer-events:none}.nvb-table-shell--editor .nvb-table-toolbar__add-element,.nvb-table-shell--editor .nvb-table-toolbar__drop-item--editor{pointer-events:auto}.nvb-table-sticky-header{display:flex;flex-direction:column;gap:0}.nvb-table-sticky-header--enabled{position:sticky;top:0;z-index:38}.nvb-table-sticky-header--enabled.nvb-table-sticky-header--pinned{background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-8)}.nvb-table-sticky-header--enabled.nvb-table-sticky-header--pinned .nvb-table-toolbar--flat{background:var(--nvb-color-neutral-000)}.nvb-table-sticky-clone{position:absolute;inset-inline:0;top:100%;z-index:37;pointer-events:none}.nvb-table-sticky-clone__viewport{overflow:hidden;background:var(--nvb-color-neutral-000);border:1px solid var(--nvb-table-surface-border);border-top:none;box-shadow:var(--nvb-shadow-8)}.nvb-table-sticky-clone__table{margin:0;width:max-content;min-width:100%;transform:translate(0)}.nvb-table-sticky-clone__table thead th{position:static;top:auto;z-index:auto}.nvb-table-sticky-clone__row th{cursor:default}.nvb-table-sticky-clone__row th.nvb-sortable{cursor:pointer}.nvb-table-frame{border:1px solid var(--nvb-table-surface-border);border-radius:var(--nvb-table-surface-radius);overflow:hidden;background:var(--nvb-color-neutral-000);display:flex;align-items:stretch;box-shadow:0 1px 2px color-mix(in oklab,var(--nvb-color-neutral-900) 4%,transparent),inset 0 1px color-mix(in oklab,var(--nvb-color-neutral-000) 84%,transparent)}.nvb-table-frame__scroller{flex:1 1 auto;min-width:0;width:100%;overflow-x:auto;overflow-y:hidden}.nvb-table-frame__scroller--virtual{overflow-y:auto;overscroll-behavior:contain}.nvb-table-frame--with-toolbar{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.nvb-table-frame--with-paginator{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.nvb-table-toolbar{display:flex;position:relative;z-index:32;justify-content:space-between;align-items:center;gap:8px;padding:8px;border:1px solid var(--nvb-table-surface-border);border-bottom:none;border-top-left-radius:var(--nvb-table-surface-radius);border-top-right-radius:var(--nvb-table-surface-radius);background:color-mix(in oklab,var(--nvb-color-neutral-050) 52%,var(--nvb-color-neutral-000));flex-wrap:wrap}.nvb-table-toolbar--flat{padding:0 0 8px;border:none;border-radius:0;background:transparent}.nvb-table-toolbar__left,.nvb-table-toolbar__center,.nvb-table-toolbar__right{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.nvb-table-toolbar__center{flex:1 1 260px;min-width:180px}.nvb-table-toolbar__center--controls-only{justify-content:flex-end}.nvb-table-toolbar__right{justify-content:flex-end;flex:0 0 auto;margin-left:auto}.nvb-table-toolbar__actions{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}.nvb-table-toolbar__button,.nvb-table-export__action,.nvb-table-cell-actions__button,.nvb-row-actions__inline-button,.nvb-row-actions__toggle,.nvb-selection-actions__toggle,.nvb-table-detailed-search__remove,.nvb-table-quick-search__apply,.nvb-table-quick-search__clear,.nvb-table-detailed-search__multi-select-trigger,.nvb-table-detailed-search__date-trigger,.nvb-table-detailed-search__date-header>button,.nvb-table-detailed-search__date-actions>button{font-family:var(--nvb-font-family);font-size:var(--nvb-table-control-font-size);font-weight:var(--nvb-control-font-weight, 500);line-height:1.3;transition:border-color .16s ease,background-color .16s ease,color .16s ease,box-shadow .16s ease;outline:0}.nvb-table-toolbar__button:focus-visible,.nvb-table-export__action:focus-visible,.nvb-table-cell-actions__button:focus-visible,.nvb-row-actions__inline-button:focus-visible,.nvb-row-actions__toggle:focus-visible,.nvb-selection-actions__toggle:focus-visible,.nvb-table-detailed-search__remove:focus-visible,.nvb-table-quick-search__apply:focus-visible,.nvb-table-quick-search__clear:focus-visible,.nvb-table-detailed-search__multi-select-trigger:focus-visible,.nvb-table-detailed-search__date-trigger:focus-visible,.nvb-table-detailed-search__date-header>button:focus-visible,.nvb-table-detailed-search__date-actions>button:focus-visible{border-color:var(--nvb-input-focus-border-color, var(--nvb-color-primary-500));box-shadow:var(--nvb-focus-ring)}.nvb-table-toolbar,.nvb-table-detailed-search,.nvb-table-paginator{--nvb-input-height: var(--nvb-table-control-height);--nvb-input-radius: var(--nvb-table-control-radius);--nvb-select-trigger-border-color: var(--nvb-table-surface-border-strong);--nvb-select-trigger-padding-inline-start: var(--nvb-table-control-padding-x);--nvb-select-trigger-padding-inline-end: 26px;--nvb-select-arrow-inset-inline-end: 9px;--nvb-select-menu-border: var(--nvb-table-surface-border-strong);--nvb-select-menu-radius: var(--nvb-table-control-radius);--nvb-select-option-min-height: 28px;--nvb-select-option-padding-block: 5px;font-size:var(--nvb-table-control-font-size)}.nvb-table-toolbar__button{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-table-surface-border-strong));background:var(--nvb-control-button-bg, var(--nvb-color-neutral-000));color:var(--nvb-control-button-text-color, var(--nvb-color-neutral-700));border-radius:var(--nvb-table-control-radius);min-height:var(--nvb-table-control-height);padding:0 var(--nvb-table-control-padding-x);display:inline-flex;align-items:center;gap:6px;cursor:pointer;box-shadow:0 1px 1px color-mix(in oklab,var(--nvb-color-neutral-900) 3%,transparent)}.nvb-table-toolbar__button:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-table-toolbar__button--header-action{transition:background-color .16s ease,border-color .16s ease,color .16s ease,box-shadow .16s ease}.nvb-table-toolbar__button--outlined.nvb-table-toolbar__button--tone-neutral{border-color:var(--nvb-color-neutral-300);background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-700)}.nvb-table-toolbar__button--outlined.nvb-table-toolbar__button--tone-neutral:hover{background:var(--nvb-color-neutral-100)}.nvb-table-toolbar__button--outlined.nvb-table-toolbar__button--tone-primary{border-color:var(--nvb-color-primary-300);background:var(--nvb-color-neutral-000);color:var(--nvb-color-primary-700)}.nvb-table-toolbar__button--outlined.nvb-table-toolbar__button--tone-primary:hover{background:var(--nvb-color-primary-050);border-color:var(--nvb-color-primary-400)}.nvb-table-toolbar__button--outlined.nvb-table-toolbar__button--tone-risk{border-color:var(--nvb-color-risk-300);background:var(--nvb-color-neutral-000);color:var(--nvb-color-risk-700)}.nvb-table-toolbar__button--outlined.nvb-table-toolbar__button--tone-risk:hover{background:var(--nvb-color-risk-050);border-color:var(--nvb-color-risk-400)}.nvb-table-toolbar__button--filled.nvb-table-toolbar__button--tone-neutral{border-color:var(--nvb-color-neutral-700);background:var(--nvb-color-neutral-700);color:var(--nvb-color-neutral-000)}.nvb-table-toolbar__button--filled.nvb-table-toolbar__button--tone-neutral:hover{border-color:var(--nvb-color-neutral-800);background:var(--nvb-color-neutral-800)}.nvb-table-toolbar__button--filled.nvb-table-toolbar__button--tone-primary{border-color:var(--nvb-color-primary-500);background:var(--nvb-color-primary-500);color:var(--nvb-color-neutral-000)}.nvb-table-toolbar__button--filled.nvb-table-toolbar__button--tone-primary:hover{border-color:var(--nvb-color-primary-600);background:var(--nvb-color-primary-600)}.nvb-table-toolbar__button--filled.nvb-table-toolbar__button--tone-risk{border-color:var(--nvb-color-risk-500);background:var(--nvb-color-risk-500);color:var(--nvb-color-neutral-000)}.nvb-table-toolbar__button--filled.nvb-table-toolbar__button--tone-risk:hover{border-color:var(--nvb-color-risk-600);background:var(--nvb-color-risk-600)}.nvb-table-toolbar__button--text{border-color:transparent;background:transparent;box-shadow:none}.nvb-table-toolbar__button--text.nvb-table-toolbar__button--tone-neutral{color:var(--nvb-color-neutral-700)}.nvb-table-toolbar__button--text.nvb-table-toolbar__button--tone-neutral:hover{background:var(--nvb-color-neutral-100)}.nvb-table-toolbar__button--text.nvb-table-toolbar__button--tone-primary{color:var(--nvb-color-primary-700)}.nvb-table-toolbar__button--text.nvb-table-toolbar__button--tone-primary:hover{background:var(--nvb-color-primary-050)}.nvb-table-toolbar__button--text.nvb-table-toolbar__button--tone-risk{color:var(--nvb-color-risk-700)}.nvb-table-toolbar__button--text.nvb-table-toolbar__button--tone-risk:hover{background:var(--nvb-color-risk-050)}.nvb-table-toolbar__button:disabled{opacity:.55;cursor:not-allowed;box-shadow:none}.nvb-table-toolbar__button span.material-symbols-outlined{font-size:16px;line-height:1}.nvb-table-action-icon{font-size:16px}.nvb-table-toolbar__button--primary{background:var(--nvb-color-primary-500);border-color:var(--nvb-color-primary-500);color:var(--nvb-color-neutral-000)}.nvb-table-toolbar__button--primary:hover{background:var(--nvb-color-primary-600);border-color:var(--nvb-color-primary-600)}.nvb-table-toolbar__button--icon-only{width:var(--nvb-table-control-height);min-width:var(--nvb-table-control-height);padding:0;justify-content:center}.nvb-table-toolbar__badge{min-width:16px;height:16px;border-radius:var(--nvb-radius-full);background:var(--nvb-color-primary-500);color:var(--nvb-color-neutral-000);display:inline-flex;align-items:center;justify-content:center;font-size:10px;padding:0 4px}.nvb-table-toolbar__custom{display:flex;align-items:center;gap:6px;width:100%;min-width:0}.nvb-table-toolbar__dropzone{position:relative;z-index:24;width:auto;max-width:100%;flex:0 1 auto;min-width:0;min-height:var(--nvb-table-control-height);display:flex;align-items:center;gap:6px;overflow:visible}.nvb-table-toolbar__dropzone--center{width:100%;flex:1 1 auto}.nvb-table-toolbar__center--controls-only .nvb-table-toolbar__dropzone--center{width:auto;flex:0 0 auto}.nvb-table-toolbar__add-element{position:relative;display:inline-flex;align-items:center;max-width:none}.nvb-table-toolbar__button--add-element{width:32px;min-width:32px;height:32px;min-height:32px;padding:0;justify-content:center}.nvb-table-toolbar__button--add-element span{font-size:16px}.nvb-table-toolbar__add-menu{position:fixed;top:0;left:0;width:220px;max-height:280px;overflow:auto;border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-8);padding:4px;z-index:var(--nvb-floating-overlay-z-index, 2147483000)}.nvb-table-toolbar__add-menu-item{width:100%;border:none;background:transparent;border-radius:var(--nvb-radius-md);padding:8px 10px;text-align:left;color:var(--nvb-color-neutral-700);font-size:13px;cursor:pointer}.nvb-table-toolbar__add-menu-item:hover{background:color-mix(in oklab,var(--nvb-color-primary-050) 70%,var(--nvb-color-surface-mix-target, white))}.nvb-table-toolbar__drop-items{width:auto;flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:8px;flex-wrap:wrap;overflow:visible}.nvb-table-toolbar__center--controls-only .nvb-table-toolbar__drop-items{flex:0 0 auto}.nvb-table-toolbar__drop-item{position:relative;min-width:0;max-width:none;flex:0 0 auto;border:none;border-radius:0;background:transparent;padding:0}.nvb-table-toolbar__drop-item runtime-lazy-element-outlet{display:block;width:auto;min-width:0}.nvb-table-toolbar__drop-item--editor{cursor:pointer;padding:5px 27px 5px 5px}.nvb-table-toolbar__drop-item--editor .nvb-table-toolbar__drop-remove{right:5px}.nvb-table-toolbar__drop-item--focused{border-radius:var(--nvb-table-control-radius);background:color-mix(in oklab,var(--nvb-color-primary-500) 10%,var(--nvb-color-surface-mix-target, white));box-shadow:inset 0 0 0 1px color-mix(in oklab,var(--nvb-color-primary-500) 46%,transparent)}.nvb-table-toolbar__drop-item--editor runtime-lazy-element-outlet{pointer-events:none}.nvb-table-toolbar__drop-remove{position:absolute;top:50%;right:0;transform:translateY(-50%);width:18px;min-width:18px;height:18px;border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-radius-md);background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-500);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.nvb-table-toolbar__drop-remove span{font-size:14px}.nvb-table-toolbar__drop-remove:hover{border-color:var(--nvb-color-risk-300);color:var(--nvb-color-risk-600);background:var(--nvb-color-risk-050)}.nvb-table-toolbar__drop-placeholder{width:100%;font-size:12px;color:var(--nvb-color-neutral-500);padding:2px 4px 4px}.nvb-table-toolbar__drop-item ::ng-deep .nvb-field{gap:0}.nvb-table-toolbar__drop-item ::ng-deep .nvb-field__text-warpper{display:none}.nvb-table-toolbar__drop-item ::ng-deep .nvb-field__description{display:none}.nvb-table-header-actions{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}.nvb-table-header-menu{min-width:220px;display:inline-flex;align-items:center}.nvb-table-header-menu--actions{min-width:min(300px,100%)}.nvb-table-header-menu__select{width:100%}.nvb-table-quick-search{min-width:216px;border:var(--nvb-input-border-width, 1px) solid var(--nvb-input-border-color, var(--nvb-table-surface-border-strong));background:var(--nvb-input-bg, var(--nvb-color-neutral-000));border-radius:var(--nvb-table-control-radius);min-height:var(--nvb-table-control-height);display:inline-flex;align-items:center;padding:0 5px;gap:2px;transition:border-color .16s ease,box-shadow .16s ease,background-color .16s ease}.nvb-table-quick-search:focus-within{border-color:var(--nvb-input-focus-border-color, var(--nvb-color-primary-500));box-shadow:var(--nvb-focus-ring)}.nvb-table-quick-search input{border:none;outline:none;background:transparent;width:100%;min-height:calc(var(--nvb-table-control-height) - 2px);font-family:var(--nvb-font-family);font-size:var(--nvb-table-control-font-size);color:var(--nvb-input-text-color, var(--nvb-color-neutral-700));padding:0 5px}.nvb-table-quick-search input:focus{outline:none;box-shadow:none}.nvb-table-quick-search input::placeholder{color:var(--nvb-input-placeholder-color, var(--nvb-color-neutral-500))}.nvb-table-quick-search__clear,.nvb-table-quick-search__apply{width:24px;min-width:24px;height:24px;border:1px solid transparent;border-radius:var(--nvb-table-control-radius);background:transparent;color:var(--nvb-color-neutral-500);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.nvb-table-quick-search__apply span{font-size:16px}.nvb-table-quick-search__apply:hover{background:var(--nvb-color-neutral-100)}.nvb-table-quick-search__clear span{font-size:16px}.nvb-table-quick-search__clear:hover{background:var(--nvb-color-neutral-100)}.nvb-table-export{position:relative;display:inline-flex;align-items:center;justify-content:flex-end}.nvb-table-export__chevron{font-size:16px}.nvb-table-export__menu{position:fixed;z-index:var(--nvb-floating-overlay-z-index, 2147483000);top:0;left:0;min-width:268px;border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-8);padding:8px;display:flex;flex-direction:column;gap:8px}.nvb-table-export__menu--top{transform:translateY(calc(-100% - 6px))}.nvb-table-export__scope{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--nvb-color-neutral-700)}.nvb-table-export__scope input{width:16px;height:16px}.nvb-table-export__actions{display:flex;align-items:center;flex-wrap:wrap;gap:6px}.nvb-table-export__action{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-table-surface-border-strong));border-radius:var(--nvb-table-control-radius);background:var(--nvb-control-button-bg, var(--nvb-color-neutral-000));color:var(--nvb-control-button-text-color, var(--nvb-color-neutral-700));min-height:var(--nvb-table-control-height);width:auto;padding:0 var(--nvb-table-control-padding-x);display:inline-flex;align-items:center;gap:6px;white-space:nowrap;cursor:pointer}.nvb-table-export__action span.material-symbols-outlined{font-size:16px}.nvb-table-export__action:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-table-export__action:disabled{opacity:.55;cursor:not-allowed}.nvb-table-detailed-search{border:1px solid var(--nvb-table-surface-border);border-radius:var(--nvb-table-surface-radius);background:var(--nvb-color-neutral-000);padding:8px;display:flex;flex-direction:column;gap:8px;margin-bottom:8px;box-shadow:0 1px 2px color-mix(in oklab,var(--nvb-color-neutral-900) 4%,transparent)}.nvb-table-detailed-search__rows{display:flex;flex-direction:column;gap:8px}.nvb-table-detailed-search__row{display:grid;grid-template-columns:minmax(220px,1fr) minmax(220px,1fr) minmax(220px,1fr) auto;gap:8px;align-items:stretch}.nvb-table-detailed-search__row select,.nvb-table-detailed-search__row input:not([type=checkbox]):not([type=radio]){border:var(--nvb-input-border-width, 1px) solid var(--nvb-input-border-color, var(--nvb-table-surface-border-strong));border-radius:var(--nvb-table-control-radius);background:var(--nvb-input-bg, var(--nvb-color-neutral-000));color:var(--nvb-input-text-color, var(--nvb-color-neutral-700));min-height:var(--nvb-table-control-height);font-size:var(--nvb-table-control-font-size);font-family:var(--nvb-font-family);padding:0 var(--nvb-table-control-padding-x);width:100%;min-width:0;line-height:1.3;transition:border-color .16s ease,box-shadow .16s ease,background-color .16s ease}.nvb-table-detailed-search__row select:focus,.nvb-table-detailed-search__row input:not([type=checkbox]):not([type=radio]):focus{border-color:var(--nvb-input-focus-border-color, var(--nvb-color-primary-500));box-shadow:var(--nvb-focus-ring);outline:0}.nvb-table-detailed-search__row>*{min-width:0}.nvb-table-detailed-search__boolean-toggle{border:var(--nvb-input-border-width, 1px) solid var(--nvb-input-border-color, var(--nvb-table-surface-border-strong));border-radius:var(--nvb-table-control-radius);background:var(--nvb-input-bg, var(--nvb-color-neutral-000));color:var(--nvb-input-text-color, var(--nvb-color-neutral-700));min-height:var(--nvb-table-control-height);display:inline-flex;align-items:center;gap:8px;padding:0 var(--nvb-table-control-padding-x);font-size:var(--nvb-table-control-font-size);font-family:var(--nvb-font-family);-webkit-user-select:none;user-select:none}.nvb-table-detailed-search__boolean-toggle .nvb-control__checkbox-input{margin:0}.nvb-table-detailed-search__remove{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-table-surface-border-strong));border-radius:var(--nvb-table-control-radius);background:var(--nvb-control-button-bg, var(--nvb-color-neutral-000));color:var(--nvb-color-risk-600);width:var(--nvb-table-control-height);min-width:var(--nvb-table-control-height);height:var(--nvb-table-control-height);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;align-self:stretch}.nvb-table-detailed-search__remove span{font-size:16px}.nvb-table-detailed-search__remove:hover{background:var(--nvb-color-risk-050);border-color:var(--nvb-color-risk-300)}.nvb-table-detailed-search__actions{display:flex;justify-content:flex-end;align-items:center;gap:8px;flex-wrap:wrap}.nvb-table-detailed-search__multi-select{position:relative;min-width:0}.nvb-table-detailed-search__multi-select-trigger{border:var(--nvb-input-border-width, 1px) solid var(--nvb-input-border-color, var(--nvb-table-surface-border-strong));border-radius:var(--nvb-table-control-radius);background:var(--nvb-input-bg, var(--nvb-color-neutral-000));color:var(--nvb-input-text-color, var(--nvb-color-neutral-700));min-height:var(--nvb-table-control-height);width:100%;padding:0 var(--nvb-table-control-padding-x);display:inline-flex;align-items:center;justify-content:space-between;gap:8px;text-align:left;cursor:pointer}.nvb-table-detailed-search__multi-select-trigger:hover{background:color-mix(in oklab,var(--nvb-input-bg, white) 88%,var(--nvb-color-neutral-050))}.nvb-table-detailed-search__multi-select-trigger:focus-visible{background:var(--nvb-input-bg, var(--nvb-color-neutral-000))}.nvb-table-detailed-search__multi-select-trigger span.material-symbols-outlined{font-size:16px;color:var(--nvb-color-neutral-500)}.nvb-table-detailed-search__multi-select-placeholder{color:var(--nvb-color-neutral-500)}.nvb-table-detailed-search__multi-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-8);max-height:240px;overflow:auto;z-index:var(--nvb-floating-overlay-z-index, 2147483000);padding:6px;display:flex;flex-direction:column;gap:2px}.nvb-table-detailed-search__multi-select-option{border-radius:var(--nvb-control-radius);min-height:32px;padding:6px 8px;display:inline-flex;align-items:center;gap:8px;cursor:pointer;color:var(--nvb-color-neutral-700);font-size:13px}.nvb-table-detailed-search__multi-select-option:hover{background:var(--nvb-color-neutral-100)}.nvb-table-detailed-search__multi-select-empty{color:var(--nvb-color-neutral-500);font-size:12px;padding:8px}.nvb-table-detailed-search__date{position:relative;min-width:0}.nvb-table-detailed-search__date-trigger{border:var(--nvb-input-border-width, 1px) solid var(--nvb-input-border-color, var(--nvb-table-surface-border-strong));border-radius:var(--nvb-table-control-radius);background:var(--nvb-input-bg, var(--nvb-color-neutral-000));color:var(--nvb-input-text-color, var(--nvb-color-neutral-700));min-height:var(--nvb-table-control-height);width:100%;padding:0 var(--nvb-table-control-padding-x);display:inline-flex;align-items:center;justify-content:space-between;gap:8px;text-align:left;cursor:pointer}.nvb-table-detailed-search__date-trigger:hover{background:color-mix(in oklab,var(--nvb-input-bg, white) 88%,var(--nvb-color-neutral-050))}.nvb-table-detailed-search__date-trigger:focus-visible{background:var(--nvb-input-bg, var(--nvb-color-neutral-000))}.nvb-table-detailed-search__date-trigger span.material-symbols-outlined{font-size:16px;color:var(--nvb-color-neutral-500)}.nvb-table-detailed-search__date-placeholder{color:var(--nvb-color-neutral-500)}.nvb-table-detailed-search__date-menu{position:absolute;top:calc(100% + 4px);left:0;border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-8);width:280px;max-width:min(92vw,320px);z-index:var(--nvb-floating-overlay-z-index, 2147483000);padding:8px;display:flex;flex-direction:column;gap:8px}.nvb-table-detailed-search__date-header{display:flex;align-items:center;justify-content:space-between;gap:8px}.nvb-table-detailed-search__date-header>span{font-size:13px;font-weight:600;color:var(--nvb-color-neutral-700);text-transform:capitalize}.nvb-table-detailed-search__date-header>button{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-color-neutral-300));background:var(--nvb-control-button-bg, var(--nvb-color-neutral-050));color:var(--nvb-control-button-text-color, var(--nvb-color-primary-700));border-radius:var(--nvb-control-radius);width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.nvb-table-detailed-search__date-header>button:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-table-detailed-search__date-weekdays{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px}.nvb-table-detailed-search__date-weekdays>span{text-align:center;font-size:11px;color:var(--nvb-color-neutral-500);text-transform:uppercase}.nvb-table-detailed-search__date-days{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px}.nvb-table-detailed-search__date-day{border:1px solid transparent;border-radius:var(--nvb-radius-md);background:transparent;color:var(--nvb-color-neutral-700);min-height:30px;font-size:12px;cursor:pointer}.nvb-table-detailed-search__date-day:hover{background:var(--nvb-color-neutral-100)}.nvb-table-detailed-search__date-day--outside{color:var(--nvb-color-neutral-400)}.nvb-table-detailed-search__date-day--today{border-color:var(--nvb-color-primary-300)}.nvb-table-detailed-search__date-day--selected{background:var(--nvb-color-primary-500);color:var(--nvb-color-neutral-000)}.nvb-table-detailed-search__date-actions{display:flex;justify-content:flex-end}.nvb-table-detailed-search__date-actions>button{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-color-neutral-300));border-radius:var(--nvb-radius-md);background:var(--nvb-control-button-bg, var(--nvb-color-neutral-050));color:var(--nvb-control-button-text-color, var(--nvb-color-primary-700));min-height:30px;padding:0 10px;cursor:pointer}.nvb-table-detailed-search__date-actions>button:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-table{width:100%;border-collapse:collapse;table-layout:auto;background:var(--nvb-color-neutral-000)}.nvb-table th,.nvb-table td{border-bottom:1px solid var(--nvb-table-surface-border);padding:7px 10px;font-size:13px;line-height:18px;vertical-align:middle}.nvb-table-cell-content{display:flex;flex-direction:column;gap:6px;min-width:0}.nvb-table-cell-content__value{min-width:0;word-break:break-word}.nvb-table-interactive-control{display:inline-flex;align-items:center;justify-content:flex-start;min-height:24px;cursor:pointer}.nvb-table-interactive-control--toggle.nvb-toggle-switch,.nvb-table-interactive-control--checkbox.nvb-single-checkbox{gap:0;min-height:24px}.nvb-table-interactive-control--toggle.nvb-toggle-switch--disabled,.nvb-table-interactive-control--checkbox.nvb-single-checkbox--disabled{opacity:.6;cursor:not-allowed}.nvb-table-interactive-control--checkbox .nvb-single-checkbox__input{margin:0}.nvb-table-interactive-control--toggle .nvb-toggle-switch__input{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.nvb-table-interactive-control--toggle .nvb-toggle-switch__track{position:relative;width:36px;height:20px;border-radius:var(--nvb-radius-full);border:1px solid var(--nvb-color-neutral-300);background:var(--nvb-color-neutral-100);transition:border-color .16s ease,background-color .16s ease}.nvb-table-interactive-control--toggle .nvb-toggle-switch__thumb{position:absolute;top:1px;left:1px;width:16px;height:16px;border-radius:var(--nvb-radius-full);background:var(--nvb-color-neutral-000);box-shadow:0 1px 3px #0003;transition:transform .16s ease}.nvb-table-interactive-control--toggle .nvb-toggle-switch__input:checked+.nvb-toggle-switch__track{border-color:var(--nvb-color-primary-500);background:var(--nvb-color-primary-500)}.nvb-table-interactive-control--toggle .nvb-toggle-switch__input:checked+.nvb-toggle-switch__track .nvb-toggle-switch__thumb{transform:translate(16px)}.nvb-table-template-host{display:block;min-width:0}.nvb-table-cell-element{display:block;min-width:0;width:100%}.nvb-table-row-template-cell{min-width:0}.nvb-table-row-template-host{display:block;width:100%;min-width:0}.nvb-table-cell-actions{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}.nvb-table-cell-actions__select{min-width:170px}.nvb-table-cell-actions__button{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-table-surface-border-strong));background:var(--nvb-control-button-bg, var(--nvb-color-neutral-000));color:var(--nvb-control-button-text-color, var(--nvb-color-neutral-700));border-radius:var(--nvb-table-control-radius);min-height:var(--nvb-table-control-height);padding:0 var(--nvb-table-control-padding-x);display:inline-flex;align-items:center;gap:6px;cursor:pointer}.nvb-table-cell-actions__button:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-table-cell-actions__button--icon-only{width:var(--nvb-table-control-height);min-width:var(--nvb-table-control-height);padding:0;justify-content:center}.nvb-table-cell-actions__button span.material-symbols-outlined{font-size:16px}.nvb-table-frame:not(.nvb-table-frame--with-paginator) .nvb-table>tbody>tr:last-child>td{border-bottom:0}.nvb-table th{background:color-mix(in oklab,var(--nvb-color-neutral-050) 34%,var(--nvb-color-neutral-000));color:var(--nvb-color-neutral-800);font-size:12px;font-weight:600;letter-spacing:.01em;white-space:nowrap}.nvb-table--sticky-header.nvb-table--virtual-scroll thead th{position:sticky;top:var(--nvb-table-sticky-header-offset, 0px);z-index:26;background-clip:padding-box}.nvb-table-frame--with-toolbar .nvb-table thead th{border-top:1px solid var(--nvb-table-surface-border)}.nvb-table th.nvb-sorted-active{color:var(--nvb-color-primary-700);background:color-mix(in oklab,var(--nvb-color-primary-500) 7%,var(--nvb-color-surface-mix-target, white))}.nvb-table th.nvb-column-focused,.nvb-nested-table th.nvb-column-focused{position:relative}.nvb-table th.nvb-column-focused:after,.nvb-nested-table th.nvb-column-focused:after{content:\"\";position:absolute;inset:0;border:2px solid var(--nvb-color-primary-500);pointer-events:none}.nvb-table-frame:not(.nvb-table-frame--with-toolbar) .nvb-table thead tr:first-child th.nvb-column-focused:first-child:after{border-top-left-radius:calc(var(--nvb-table-surface-radius) - 1px)}.nvb-table-frame:not(.nvb-table-frame--with-toolbar) .nvb-table thead tr:first-child th.nvb-column-focused:last-child:after{border-top-right-radius:calc(var(--nvb-table-surface-radius) - 1px)}.nvb-table th.nvb-column-focused{background:color-mix(in oklab,var(--nvb-color-primary-050) 75%,var(--nvb-color-surface-mix-target, white))}.nvb-table th.nvb-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.nvb-table th.nvb-sortable:hover{background:color-mix(in oklab,var(--nvb-color-neutral-100) 80%,var(--nvb-color-surface-mix-target, white))}.nvb-sort-icon{font-size:16px;margin-left:4px;vertical-align:middle;color:var(--nvb-color-neutral-500)}.nvb-sort-icon--active{color:var(--nvb-color-primary-600)}.nvb-align-left{text-align:left}.nvb-align-center{text-align:center}.nvb-align-right{text-align:right}.nvb-empty-cell{text-align:center;color:var(--nvb-color-neutral-500);padding:14px 10px}.nvb-action-column,.nvb-action-cell{min-width:56px;width:auto;text-align:right}.nvb-action-header{display:inline-flex;align-items:center;justify-content:flex-end;gap:6px;width:100%;position:relative}.nvb-action-header__label{display:inline-flex;align-items:center;gap:4px}.nvb-expand-column,.nvb-expand-cell{width:32px;min-width:32px;text-align:center}.nvb-expand-toggle{border:1px solid color-mix(in oklab,var(--nvb-color-neutral-300) 82%,transparent);background:color-mix(in oklab,var(--nvb-color-neutral-000) 96%,var(--nvb-color-primary-050) 4%);border-radius:var(--nvb-button-radius, var(--nvb-control-radius, var(--nvb-radius-sm)));width:28px;min-width:28px;height:28px;display:inline-flex;justify-content:center;align-items:center;cursor:pointer;transition:background-color .16s ease,border-color .16s ease,color .16s ease,box-shadow .16s ease;color:var(--nvb-color-neutral-600);box-shadow:0 1px 2px #0000000a}.nvb-expand-toggle:hover{border-color:color-mix(in oklab,var(--nvb-color-primary-300) 70%,transparent);background:color-mix(in oklab,var(--nvb-color-primary-050) 92%,white);color:var(--nvb-color-primary-700)}.nvb-expand-toggle span{font-size:16px;transition:transform .16s ease}.nvb-expand-toggle--expanded span{transform:rotate(90deg)}.nvb-expand-toggle--expanded{border-color:color-mix(in oklab,var(--nvb-color-primary-300) 78%,transparent);background:color-mix(in oklab,var(--nvb-color-primary-050) 88%,white);color:var(--nvb-color-primary-700)}.nvb-select-column,.nvb-select-cell{width:42px;text-align:center}.nvb-select-column input,.nvb-select-cell input{width:16px;min-width:16px;height:16px;min-height:16px;cursor:pointer}.nvb-row-actions{position:relative;display:inline-flex;justify-content:flex-end}.nvb-row-actions--inline{gap:6px;flex-wrap:wrap}.nvb-row-actions__inline-button{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-table-surface-border-strong));background:var(--nvb-control-button-bg, var(--nvb-color-neutral-000));color:var(--nvb-control-button-text-color, var(--nvb-color-neutral-700));border-radius:var(--nvb-table-control-radius);min-height:var(--nvb-table-control-height);padding:0 var(--nvb-table-control-padding-x);display:inline-flex;justify-content:center;align-items:center;gap:6px;cursor:pointer}.nvb-row-actions__inline-button:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-row-actions__inline-button:disabled,.nvb-row-actions__toggle:disabled{opacity:.65;cursor:wait}.nvb-row-actions__inline-button--icon-only{width:var(--nvb-table-control-height);min-width:var(--nvb-table-control-height);padding:0}.nvb-row-actions__inline-button span.material-symbols-outlined{font-size:16px}.nvb-row-actions__toggle{border:var(--nvb-control-button-border-width, 1px) solid var(--nvb-control-button-border-color, var(--nvb-table-surface-border-strong));background:var(--nvb-control-button-bg, var(--nvb-color-neutral-000));color:var(--nvb-control-button-text-color, var(--nvb-color-neutral-700));border-radius:var(--nvb-table-control-radius);width:var(--nvb-table-control-height);min-width:var(--nvb-table-control-height);height:var(--nvb-table-control-height);display:inline-flex;justify-content:center;align-items:center;cursor:pointer}.nvb-row-actions__toggle--borderless{border-color:transparent;background:transparent;color:var(--nvb-color-neutral-600);box-shadow:none}.nvb-row-actions__toggle span{font-size:16px}.nvb-row-actions__toggle:hover{border-color:var(--nvb-control-button-hover-border-color, var(--nvb-color-primary-300));background:var(--nvb-control-button-hover-bg, var(--nvb-color-primary-050));color:var(--nvb-control-button-hover-text-color, var(--nvb-color-primary-800))}.nvb-row-actions__toggle--borderless:hover{border-color:transparent;background:var(--nvb-color-neutral-100);color:var(--nvb-color-neutral-800)}.nvb-row-actions__menu{position:fixed;top:0;left:0;min-width:160px;z-index:var(--nvb-floating-overlay-z-index, 2147483000);background:var(--nvb-color-neutral-000);border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));box-shadow:var(--nvb-shadow-8);padding:4px;display:flex;flex-direction:column;gap:2px}.nvb-row-actions__menu--top{transform:translateY(calc(-100% - 6px))}.nvb-row-actions__menu button{width:100%;border:none;background:transparent;border-radius:var(--nvb-table-control-radius);display:flex;align-items:center;gap:6px;min-height:28px;padding:0 10px;text-align:left;cursor:pointer;color:var(--nvb-color-neutral-700);font-family:var(--nvb-font-family);font-size:var(--nvb-table-control-font-size);font-weight:var(--nvb-control-font-weight, 500)}.nvb-row-actions__menu button:hover{background:var(--nvb-color-neutral-100)}.nvb-row-actions__menu button span.material-symbols-outlined{font-size:16px}.nvb-row-actions__empty{font-size:11px;color:var(--nvb-color-neutral-400)}.nvb-table__row--editing>td{background:color-mix(in srgb,var(--nvb-color-primary-050) 72%,white)}.nvb-table-inline-edit{width:100%;min-height:34px;border:1px solid var(--nvb-color-primary-300);border-radius:var(--nvb-input-radius, var(--nvb-radius-md));background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-900);font:inherit;padding:6px 10px}.nvb-table-inline-edit--textarea{resize:vertical;min-height:72px}.nvb-table-inline-edit:focus{outline:0;border-color:var(--nvb-color-primary-500);box-shadow:var(--nvb-focus-ring)}.nvb-table-virtual-spacer-row td{padding:0;border:0;background:transparent}.nvb-table-virtual-spacer-cell{height:0}.nvb-selection-actions{position:relative;display:inline-flex;align-items:center}.nvb-selection-actions__toggle{min-width:var(--nvb-table-control-height);min-height:var(--nvb-table-control-height);border:1px solid var(--nvb-color-primary-300);border-radius:var(--nvb-table-control-radius);background:var(--nvb-color-primary-050);color:var(--nvb-color-primary-700);display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:0 var(--nvb-table-control-padding-x);cursor:pointer}.nvb-selection-actions__toggle span.material-symbols-outlined{font-size:16px}.nvb-selection-actions__count{min-width:16px;height:16px;border-radius:var(--nvb-radius-full);font-size:10px;font-weight:600;color:var(--nvb-color-neutral-000);background:var(--nvb-color-primary-600);display:inline-flex;align-items:center;justify-content:center;padding:0 4px}.nvb-selection-actions__menu{position:fixed;top:0;left:0;min-width:190px;z-index:var(--nvb-floating-overlay-z-index, 2147483000);background:var(--nvb-color-neutral-000);border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));box-shadow:var(--nvb-shadow-8);padding:4px;display:flex;flex-direction:column;gap:2px}.nvb-selection-actions__menu--top{transform:translateY(calc(-100% - 6px))}.nvb-selection-actions__menu button{width:100%;border:none;background:transparent;border-radius:var(--nvb-table-control-radius);display:flex;align-items:center;gap:6px;min-height:28px;padding:0 10px;text-align:left;cursor:pointer;color:var(--nvb-color-neutral-700);font-family:var(--nvb-font-family);font-size:var(--nvb-table-control-font-size);font-weight:var(--nvb-control-font-weight, 500)}.nvb-selection-actions__menu button:hover{background:var(--nvb-color-neutral-100)}.nvb-selection-actions__menu button span.material-symbols-outlined{font-size:16px}.nvb-status-pill{display:inline-flex;align-items:center;justify-content:center;min-height:20px;gap:4px;border-radius:var(--nvb-table-control-radius);padding:2px 8px;font-size:11px;line-height:1.2;border:1px solid transparent}.nvb-status-pill--rounded{border-radius:var(--nvb-radius-full)}.nvb-status-pill__icon{font-size:14px}.nvb-status-pill--neutral{background:var(--nvb-color-neutral-100);color:var(--nvb-color-neutral-700);border-color:var(--nvb-color-neutral-300)}.nvb-status-pill--success{background:color-mix(in oklab,var(--nvb-color-success-500) 14%,var(--nvb-color-surface-mix-target, white));color:color-mix(in oklab,var(--nvb-color-success-500) 80%,black);border-color:color-mix(in oklab,var(--nvb-color-success-500) 28%,var(--nvb-color-surface-mix-target, white))}.nvb-status-pill--danger,.nvb-status-pill--risk{background:var(--nvb-color-risk-050);color:var(--nvb-color-risk-700);border-color:var(--nvb-color-risk-300)}.nvb-status-pill--warning{background:color-mix(in oklab,var(--nvb-color-warning-500) 18%,var(--nvb-color-surface-mix-target, white));color:color-mix(in oklab,var(--nvb-color-warning-500) 80%,black);border-color:color-mix(in oklab,var(--nvb-color-warning-500) 36%,var(--nvb-color-surface-mix-target, white))}.nvb-status-pill--info,.nvb-status-pill--primary{background:color-mix(in oklab,var(--nvb-color-primary-500) 14%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-primary-700);border-color:color-mix(in oklab,var(--nvb-color-primary-500) 30%,var(--nvb-color-surface-mix-target, white))}.nvb-table__row--expanded td{background:color-mix(in oklab,var(--nvb-color-primary-500) 6%,var(--nvb-color-surface-mix-target, white))}.nvb-table-expanded-inline-row__cell{padding:0!important;background:transparent}.nvb-table-expanded-inline-row__content{padding:12px;background:color-mix(in oklab,var(--nvb-color-primary-500) 4%,var(--nvb-color-surface-mix-target, white));border-top:1px solid var(--nvb-color-neutral-200)}.nvb-table-detail-panel{flex:0 0 clamp(260px,34%,420px);min-width:260px;max-width:420px;border-left:1px solid var(--nvb-color-neutral-200);background:color-mix(in oklab,var(--nvb-color-neutral-000) 94%,var(--nvb-color-surface-mix-target, white));padding:10px;display:flex;flex-direction:column;gap:10px;overflow:auto}.nvb-table-detail-panel__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.nvb-table-detail-panel__title{font-size:13px;color:var(--nvb-color-neutral-700)}.nvb-table-detail-panel__close{width:24px;min-width:24px;height:24px;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-md);background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-600);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.nvb-table-detail-panel__close span{font-size:16px}.nvb-table-detail-panel__close:hover{border-color:var(--nvb-color-neutral-400);background:color-mix(in oklab,var(--nvb-color-neutral-100) 88%,var(--nvb-color-surface-mix-target, white))}.nvb-expanded-row__template{color:var(--nvb-color-neutral-700);font-size:13px}.nvb-expanded-row__loading,.nvb-expanded-row__error,.nvb-expanded-row__empty{border:1px dashed var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-lg);background:var(--nvb-color-neutral-050);padding:10px 12px;font-size:12px}.nvb-expanded-row__loading,.nvb-expanded-row__empty{color:var(--nvb-color-neutral-500)}.nvb-expanded-row__error{color:var(--nvb-color-risk-700);border-color:var(--nvb-color-risk-300);background:var(--nvb-color-risk-050)}.nvb-expanded-row__details{display:grid;gap:8px;grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.nvb-expanded-row__detail-item{border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-radius-lg);background:var(--nvb-color-neutral-000);padding:8px;display:flex;flex-direction:column;gap:4px}.nvb-expanded-row__detail-label{font-size:11px;color:var(--nvb-color-neutral-500);font-weight:600}.nvb-expanded-row__detail-value{font-size:13px;color:var(--nvb-color-neutral-700);word-break:break-word}.nvb-nested-table{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-radius-md);overflow:hidden}.nvb-nested-table th,.nvb-nested-table td{border-bottom:1px solid var(--nvb-color-neutral-200);padding:6px 8px;font-size:12px}.nvb-nested-table th{background:var(--nvb-color-neutral-050);color:var(--nvb-color-neutral-700)}.nvb-nested-table th.nvb-column-focused{background:color-mix(in oklab,var(--nvb-color-primary-050) 75%,var(--nvb-color-surface-mix-target, white))}.nvb-nested-table__header--focusable{cursor:pointer}.nvb-nested-table__placeholder-row td{color:transparent;min-height:32px}.nvb-nested-table tr:last-child td{border-bottom:none}.nvb-expanded-row__actions{display:inline-flex;flex-wrap:wrap;justify-content:flex-end;gap:4px}.nvb-expanded-row__action{border:1px solid var(--nvb-color-neutral-300);background:#fff;border-radius:var(--nvb-radius-md);padding:4px 6px;display:inline-flex;align-items:center;gap:4px;color:var(--nvb-color-neutral-700);cursor:pointer;font-size:11px}.nvb-expanded-row__action--icon-only{width:var(--nvb-table-control-height);min-width:var(--nvb-table-control-height);height:var(--nvb-table-control-height);padding:0;justify-content:center}.nvb-expanded-row__action span.material-symbols-outlined{font-size:14px}.nvb-table-skeleton__row td{padding-top:10px;padding-bottom:10px}.nvb-table-skeleton__line{display:block;height:12px;border-radius:var(--nvb-radius-full);background:linear-gradient(90deg,color-mix(in oklab,var(--nvb-color-neutral-100) 92%,var(--nvb-color-surface-mix-target, white)),color-mix(in oklab,var(--nvb-color-neutral-200) 95%,var(--nvb-color-surface-mix-target, white)),color-mix(in oklab,var(--nvb-color-neutral-100) 92%,var(--nvb-color-surface-mix-target, white)));background-size:240% 100%;animation:table-loading-shimmer 1.05s ease-in-out infinite}.nvb-table-skeleton__dot{display:inline-block;width:16px;height:16px;border-radius:var(--nvb-radius-full);background:color-mix(in oklab,var(--nvb-color-neutral-200) 88%,var(--nvb-color-surface-mix-target, white));box-shadow:inset 0 0 0 1px color-mix(in oklab,var(--nvb-color-neutral-300) 75%,transparent)}.nvb-table-skeleton__dot--action{width:22px;height:22px;border-radius:var(--nvb-radius-lg)}.nvb-table-loading{position:absolute;inset:0;display:flex;flex-direction:column;gap:12px;justify-content:flex-start;align-items:stretch;padding:12px;font-size:13px;background:color-mix(in oklab,var(--nvb-color-neutral-000) 90%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);color:var(--nvb-color-neutral-700);z-index:5;animation:table-loading-fade .16s ease-out}.nvb-table-loading__skeleton{width:min(100%,980px);margin:0 auto;display:grid;gap:10px;padding:12px;border-radius:var(--nvb-radius-lg);border:1px solid color-mix(in oklab,var(--nvb-color-neutral-300) 72%,transparent);background:color-mix(in oklab,var(--nvb-color-neutral-000) 96%,transparent);box-shadow:0 1px color-mix(in oklab,var(--nvb-color-neutral-100) 80%,transparent),0 12px 24px color-mix(in oklab,var(--nvb-color-neutral-900) 8%,transparent)}.nvb-table-loading__row{height:16px;border-radius:var(--nvb-radius-full);background:linear-gradient(90deg,color-mix(in oklab,var(--nvb-color-neutral-100) 92%,var(--nvb-color-surface-mix-target, white)),color-mix(in oklab,var(--nvb-color-neutral-200) 95%,var(--nvb-color-surface-mix-target, white)),color-mix(in oklab,var(--nvb-color-neutral-100) 92%,var(--nvb-color-surface-mix-target, white)));background-size:240% 100%;animation:table-loading-shimmer 1.05s ease-in-out infinite}.nvb-table-loading__row:first-child{height:22px;width:96%;border-radius:var(--nvb-radius-lg)}.nvb-table-loading__row:nth-child(2){width:90%}.nvb-table-loading__row:nth-child(3){width:94%}.nvb-table-loading__row:nth-child(4){width:86%}.nvb-table-loading__row:nth-child(5){width:92%}.nvb-table-loading__label{align-self:center;font-size:11px;font-weight:500;letter-spacing:.02em;padding:4px 10px;border-radius:var(--nvb-radius-full);background:color-mix(in oklab,var(--nvb-color-neutral-050) 86%,transparent);border:1px solid color-mix(in oklab,var(--nvb-color-neutral-300) 66%,transparent);color:var(--nvb-color-neutral-600)}.nvb-table-paginator{display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:7px 10px;background:color-mix(in oklab,var(--nvb-color-neutral-050) 52%,var(--nvb-color-neutral-000));border:1px solid var(--nvb-table-surface-border);border-top:none;border-bottom-left-radius:var(--nvb-table-surface-radius);border-bottom-right-radius:var(--nvb-table-surface-radius);flex-wrap:wrap}.nvb-table-paginator__content,.nvb-table-paginator__controls{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0}.nvb-table-paginator--flat{padding:8px 0 0;border:none;border-radius:0;background:transparent}.nvb-table-paginator--align-start{justify-content:flex-start}.nvb-table-paginator--align-center{justify-content:center}.nvb-table-paginator__size{display:inline-flex;align-items:center;min-width:0;margin-inline-start:auto}.nvb-table-paginator--align-start .nvb-table-paginator__size,.nvb-table-paginator--align-center .nvb-table-paginator__size{margin-inline-start:0}.nvb-table-paginator__nav,.nvb-table-paginator__page{border:1px solid var(--nvb-table-surface-border-strong);background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-700);border-radius:var(--nvb-table-control-radius);min-width:var(--nvb-table-control-height);min-height:var(--nvb-table-control-height);padding:0 var(--nvb-table-control-padding-x);font-size:var(--nvb-table-control-font-size);cursor:pointer;transition:border-color .14s ease,background-color .14s ease,color .14s ease,box-shadow .14s ease;box-shadow:0 1px 1px color-mix(in oklab,var(--nvb-color-neutral-900) 3%,transparent)}.nvb-table-paginator__nav{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap}.nvb-table-paginator__nav:not(:disabled):hover,.nvb-table-paginator__page:not(:disabled):hover{border-color:var(--nvb-color-primary-300);background:color-mix(in oklab,var(--nvb-color-primary-500) 8%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-primary-700)}.nvb-table-paginator__nav--icon{min-width:var(--nvb-table-control-height);width:var(--nvb-table-control-height);padding:0}.nvb-table-paginator__nav--icon span{font-size:16px;color:inherit}.nvb-table-paginator__pages{display:inline-flex;align-items:center;gap:3px;flex-wrap:wrap}.nvb-table-paginator__size-select{width:84px;min-width:84px}.nvb-table-paginator__nav:disabled,.nvb-table-paginator__page:disabled{opacity:1;cursor:not-allowed;background:color-mix(in oklab,var(--nvb-color-neutral-100) 58%,var(--nvb-color-surface-mix-target, white));border-color:color-mix(in oklab,var(--nvb-color-neutral-300) 54%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-neutral-400);box-shadow:none}.nvb-table-paginator__page--active,.nvb-table-paginator__page--active:disabled{opacity:1;border-color:var(--nvb-color-primary-500);background:color-mix(in oklab,var(--nvb-color-primary-500) 12%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-primary-700);font-weight:600}.nvb-table-paginator__meta{font-size:12px;color:var(--nvb-color-neutral-600)}.nvb-table-paginator--compact{gap:10px;padding:8px 10px;background:var(--nvb-color-neutral-000)}.nvb-table-paginator--compact .nvb-table-paginator__content,.nvb-table-paginator--compact .nvb-table-paginator__controls,.nvb-table-paginator--compact .nvb-table-paginator__pages{gap:6px}.nvb-table-paginator--compact .nvb-table-paginator__nav,.nvb-table-paginator--compact .nvb-table-paginator__page{min-width:30px;min-height:30px;height:30px;padding:0 8px;border:1px solid transparent;border-radius:var(--nvb-radius-full);background:transparent;color:var(--nvb-color-neutral-600);box-shadow:none}.nvb-table-paginator--compact .nvb-table-paginator__nav--icon{width:30px;padding:0}.nvb-table-paginator--compact .nvb-table-paginator__nav:not(:disabled):hover,.nvb-table-paginator--compact .nvb-table-paginator__page:not(:disabled):hover{border-color:color-mix(in oklab,var(--nvb-color-neutral-300) 72%,transparent);background:color-mix(in oklab,var(--nvb-color-neutral-100) 78%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-neutral-900)}.nvb-table-paginator--compact .nvb-table-paginator__page--active,.nvb-table-paginator--compact .nvb-table-paginator__page--active:disabled{border-color:var(--nvb-color-neutral-950);background:var(--nvb-color-neutral-950);color:var(--nvb-color-neutral-000);font-weight:700}.nvb-table-paginator--compact .nvb-table-paginator__nav:disabled,.nvb-table-paginator--compact .nvb-table-paginator__page:disabled{opacity:.4;background:transparent;border-color:transparent;color:var(--nvb-color-neutral-400)}.nvb-table-paginator--compact .nvb-table-paginator__meta{padding:0 6px}.nvb-table-paginator--compact .nvb-table-paginator__size{margin-inline-start:auto}.nvb-table-paginator--compact .nvb-table-paginator__size-select{width:84px;min-width:84px}.nvb-table-paginator--segmented{gap:10px;padding:8px 10px;background:var(--nvb-color-neutral-000)}.nvb-table-paginator--segmented .nvb-table-paginator__content{gap:10px}.nvb-table-paginator--segmented .nvb-table-paginator__controls{gap:0;border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-table-control-radius);overflow:hidden;background:var(--nvb-color-neutral-000)}.nvb-table-paginator--segmented .nvb-table-paginator__pages{gap:0}.nvb-table-paginator--segmented .nvb-table-paginator__nav,.nvb-table-paginator--segmented .nvb-table-paginator__page{min-width:32px;min-height:32px;height:32px;padding:0 10px;border:none;border-radius:0;background:transparent;color:var(--nvb-color-neutral-700);box-shadow:none}.nvb-table-paginator--segmented .nvb-table-paginator__nav--icon{width:32px;padding:0}.nvb-table-paginator--segmented .nvb-table-paginator__nav+.nvb-table-paginator__nav,.nvb-table-paginator--segmented .nvb-table-paginator__nav+.nvb-table-paginator__pages,.nvb-table-paginator--segmented .nvb-table-paginator__pages+.nvb-table-paginator__nav,.nvb-table-paginator--segmented .nvb-table-paginator__pages+.nvb-table-paginator__pages,.nvb-table-paginator--segmented .nvb-table-paginator__page+.nvb-table-paginator__page{border-inline-start:1px solid color-mix(in oklab,var(--nvb-color-neutral-300) 86%,transparent)}.nvb-table-paginator--segmented .nvb-table-paginator__nav:not(:disabled):hover,.nvb-table-paginator--segmented .nvb-table-paginator__page:not(:disabled):hover{background:color-mix(in oklab,var(--nvb-color-primary-500) 10%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-primary-700)}.nvb-table-paginator--segmented .nvb-table-paginator__page--active,.nvb-table-paginator--segmented .nvb-table-paginator__page--active:disabled{background:var(--nvb-color-primary-600);color:var(--nvb-color-neutral-000);font-weight:700}.nvb-table-paginator--segmented .nvb-table-paginator__nav:disabled,.nvb-table-paginator--segmented .nvb-table-paginator__page:disabled{opacity:1;background:transparent;color:var(--nvb-color-neutral-400);border-color:transparent}.nvb-table-paginator--segmented .nvb-table-paginator__size-select{width:84px;min-width:84px}.nvb-table-paginator--compact.nvb-table-paginator--flat,.nvb-table-paginator--segmented.nvb-table-paginator--flat{padding:8px 0 0;border:none;border-radius:0;background:transparent}.nvb-table--grid th,.nvb-table--grid td{border-right:1px solid var(--nvb-table-surface-border)}.nvb-table--grid th:last-child,.nvb-table--grid td:last-child{border-right:none}.nvb-table--striped tbody tr:nth-child(2n){background:color-mix(in oklab,var(--nvb-color-neutral-050) 74%,var(--nvb-color-surface-mix-target, white))}.nvb-table--row-hover tbody>tr:not(.nvb-expanded-row):hover>td{background:color-mix(in oklab,var(--nvb-color-primary-500) 5%,var(--nvb-color-surface-mix-target, white))}.nvb-table__row--active>td{background:color-mix(in oklab,var(--nvb-color-primary-500) 8%,var(--nvb-color-surface-mix-target, white))}.nvb-table--force-stack thead{display:none}.nvb-table--force-stack,.nvb-table--force-stack tbody,.nvb-table--force-stack tr,.nvb-table--force-stack td{display:block;width:100%}.nvb-table--force-stack tr{display:block;width:100%;border-bottom:1px solid var(--nvb-color-neutral-200);padding:6px 0}.nvb-table--force-stack td{border:none;display:grid;grid-template-columns:minmax(110px,36%) 1fr;gap:8px;padding:6px 10px;text-align:left}.nvb-table--force-stack td:before{content:attr(data-label);font-size:11px;color:var(--nvb-color-neutral-500);font-weight:600}.nvb-table--force-stack .nvb-action-cell{justify-items:end}.nvb-table--force-stack .nvb-expand-cell,.nvb-table--force-stack .nvb-table-expanded-inline-row__cell{grid-template-columns:1fr}.nvb-table--force-stack .nvb-expand-cell:before,.nvb-table--force-stack .nvb-table-expanded-inline-row__cell:before,.nvb-table--force-stack .nvb-table-row-template-cell:before{content:none}.nvb-table--force-stack .nvb-expand-cell,.nvb-table--force-stack .nvb-table-row-template-cell{justify-items:start;grid-template-columns:1fr}.nvb-table--force-stack .nvb-table-expanded-inline-row__content{width:100%}.nvb-table-dialog-backdrop{position:fixed;inset:0;background:#0f172a5c;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);z-index:1500}.nvb-table-dialog{--nvb-floating-overlay-z-index: 1520;--nvb-page-margin-bottom: 0px;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(92vw,760px);max-height:84vh;display:flex;flex-direction:column;border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-dialog-radius);background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-16);z-index:1510;overflow:hidden;min-height:0;outline:0}.nvb-table-dialog--filters{width:min(92vw,680px)}.nvb-table-dialog--column-settings{width:min(92vw,620px)}.nvb-table-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 24px 12px;border-bottom:1px solid var(--nvb-color-neutral-200);flex-shrink:0}.nvb-table-dialog__header h4{margin:0;font-size:16px;line-height:22px;font-weight:600;color:var(--nvb-color-neutral-900)}.nvb-table-dialog__close{width:32px;height:32px;border:1px solid var(--nvb-table-surface-border-strong);border-radius:var(--nvb-control-radius);background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-600);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background-color .16s ease,border-color .16s ease,color .16s ease}.nvb-table-dialog__close:hover{background:var(--nvb-color-neutral-050);border-color:var(--nvb-color-neutral-400);color:var(--nvb-color-neutral-900)}.nvb-table-dialog__close:focus-visible{outline:0;box-shadow:var(--nvb-focus-ring)}.nvb-table-dialog__close span{font-size:18px}.nvb-table-dialog__body{padding:16px 24px;display:flex;flex-direction:column;gap:10px;overflow:auto;flex:1 1 auto;min-height:0}.nvb-table-dialog__select-all{display:inline-flex;align-items:center;gap:8px;font-size:12px;color:var(--nvb-color-neutral-700)}.nvb-table-dialog__footer{border-top:1px solid var(--nvb-color-neutral-200);padding:16px 24px 24px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;flex-shrink:0}.nvb-table-dialog__footer .nvb-table-export__action,.nvb-table-dialog__footer .nvb-table-toolbar__button{width:100%;justify-content:center}.nvb-table-dialog__footer--single{grid-template-columns:1fr}.nvb-table-dialog__tabs{display:flex;align-items:center;gap:4px;padding:0 24px;border-bottom:1px solid var(--nvb-color-neutral-200)}.nvb-table-dialog__tab{position:relative;min-height:40px;border:none;border-radius:0;background:transparent;color:var(--nvb-color-neutral-700);font-size:13px;line-height:20px;font-weight:600;padding:0 12px;cursor:pointer}.nvb-table-dialog__tab:hover{color:var(--nvb-color-neutral-900);background:color-mix(in oklab,var(--nvb-color-neutral-100) 72%,transparent)}.nvb-table-dialog__tab--active{color:var(--nvb-color-primary-700)}.nvb-table-dialog__tab--active:after{content:\"\";position:absolute;left:12px;right:12px;bottom:-1px;height:2px;border-radius:var(--nvb-radius-full);background:var(--nvb-color-primary-600)}.nvb-table-dialog__tab:focus-visible{outline:0;box-shadow:inset 0 0 0 2px var(--nvb-color-primary-500)}.nvb-table-export__columns{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:8px}.nvb-table-column-settings{display:flex;flex-direction:column;gap:10px}.nvb-table-column-settings__actions{display:flex;align-items:center;justify-content:flex-end;gap:6px;flex-wrap:wrap}.nvb-table-column-settings__list{display:flex;flex-direction:column;gap:6px;max-height:min(52vh,520px);overflow:auto;padding-right:2px}.nvb-table-column-settings__item{border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-radius-lg);padding:6px 8px;display:grid;grid-template-columns:32px minmax(0,1fr) auto;align-items:center;gap:8px;background:var(--nvb-color-neutral-000)}.nvb-table-column-settings__content{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) minmax(150px,180px);gap:10px;align-items:center}.nvb-table-column-settings__drag{width:32px;min-width:32px;height:32px;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-md);background:var(--nvb-color-neutral-050);color:var(--nvb-color-neutral-600);display:inline-flex;align-items:center;justify-content:center;cursor:grab;flex:0 0 auto}.nvb-table-column-settings__drag:hover{border-color:var(--nvb-color-primary-300);background:var(--nvb-color-primary-050);color:var(--nvb-color-primary-700)}.nvb-table-column-settings__drag:active{cursor:grabbing}.nvb-table-column-settings__list.cdk-drop-list-dragging .nvb-table-column-settings__item:not(.cdk-drag-placeholder){transition:transform .16s ease}.nvb-table-column-settings__item.cdk-drag-preview{box-sizing:border-box;background:var(--nvb-color-neutral-000);border:1px solid var(--nvb-color-primary-300);border-radius:var(--nvb-radius-lg);box-shadow:0 14px 28px #0f172a29}::ng-deep .nvb-table-column-settings__item.cdk-drag-preview .nvb-control__checkbox-input{width:16px;height:16px;margin:0;appearance:none;accent-color:var(--nvb-color-primary-600);border:1px solid var(--nvb-color-neutral-400);border-radius:var(--nvb-radius-sm);background-color:var(--nvb-color-neutral-000);background-repeat:no-repeat;background-position:center;background-size:12px 12px}::ng-deep .nvb-table-column-settings__item.cdk-drag-preview .nvb-control__checkbox-input:checked{border-color:var(--nvb-color-primary-600);background-color:var(--nvb-color-primary-600);background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M3.5 8.5 6.5 11.5 12.5 4.5'/%3E%3C/svg%3E\")}.nvb-table-column-settings__item.cdk-drag-placeholder{opacity:.35;border-style:dashed;background:var(--nvb-color-primary-050)}.nvb-table-column-settings__item.cdk-drag-animating{transition:transform .18s ease}.nvb-table-column-settings__toggle{display:inline-flex;align-items:center;gap:6px;min-width:0;flex:1 1 auto;font-size:12px;color:var(--nvb-color-neutral-800);font-weight:500}.nvb-table-column-settings__toggle .nvb-control__checkbox-input{width:16px;height:16px;margin:0;appearance:none;accent-color:var(--nvb-color-primary-600);border:1px solid var(--nvb-color-neutral-400);border-radius:var(--nvb-radius-sm);background-color:var(--nvb-color-neutral-000);background-repeat:no-repeat;background-position:center;background-size:12px 12px;cursor:pointer;transition:border-color .14s ease,background-color .14s ease,box-shadow .14s ease}.nvb-table-column-settings__toggle .nvb-control__checkbox-input:hover{border-color:var(--nvb-color-primary-500)}.nvb-table-column-settings__toggle .nvb-control__checkbox-input:focus-visible{outline:0;box-shadow:0 0 0 3px color-mix(in oklch,var(--nvb-color-primary-500) 20%,transparent)}.nvb-table-column-settings__toggle .nvb-control__checkbox-input:checked{border-color:var(--nvb-color-primary-600);background-color:var(--nvb-color-primary-600);background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M3.5 8.5 6.5 11.5 12.5 4.5'/%3E%3C/svg%3E\")}.nvb-table-column-settings__toggle span{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow-wrap:anywhere}.nvb-table-column-settings__width{display:flex;flex-direction:column;gap:6px;min-width:0}.nvb-table-column-settings__width-header{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.nvb-table-column-settings__width-header>span{font-size:11px;line-height:1.2;color:var(--nvb-color-neutral-600)}.nvb-table-column-settings__width-meta{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.nvb-table-column-settings__width-reset{min-height:24px;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-full);background:var(--nvb-color-neutral-050);color:var(--nvb-color-neutral-700);font:inherit;font-size:11px;padding:0 10px;cursor:pointer}.nvb-table-column-settings__width-reset:hover{border-color:var(--nvb-color-primary-300);background:var(--nvb-color-primary-050);color:var(--nvb-color-primary-700)}.nvb-table-column-settings__width-reset--active{border-color:var(--nvb-color-primary-300);background:var(--nvb-color-primary-100);color:var(--nvb-color-primary-800)}.nvb-table-column-settings__width-range{display:block}.nvb-table-column-settings__width-range input[type=range]{width:100%;margin:0;accent-color:var(--nvb-color-primary-600);cursor:pointer}.nvb-table-column-settings__width-value{min-width:92px;min-height:28px;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-md);background:var(--nvb-color-neutral-050);color:var(--nvb-color-neutral-800);display:inline-flex;align-items:center;justify-content:center;padding:0 10px;font-size:12px;font-weight:600}.nvb-table-column-settings__order{display:inline-flex;align-items:center;gap:4px;flex:0 0 auto}.nvb-table-column-settings__move{width:30px;height:30px;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-md);background:var(--nvb-color-neutral-050);color:var(--nvb-color-neutral-700);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.nvb-table-column-settings__move:hover:not(:disabled){border-color:var(--nvb-color-primary-300);background:var(--nvb-color-primary-050);color:var(--nvb-color-primary-700)}.nvb-table-column-settings__move:disabled{opacity:.5;cursor:not-allowed}@media(max-width:720px){.nvb-table-column-settings__content{grid-template-columns:minmax(0,1fr)}}.nvb-table-dialog--column-settings .nvb-table-dialog__footer{grid-template-columns:repeat(2,minmax(0,1fr))}.nvb-table-export__column{border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-radius-lg);padding:8px;display:inline-flex;align-items:center;gap:8px;font-size:12px;color:var(--nvb-color-neutral-700)}.nvb-table-filter-form{display:flex;flex-direction:column;gap:10px}.nvb-table-filter-form__row{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--nvb-color-neutral-700)}.nvb-table-filter-form__row input{border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-radius-md);min-height:34px;padding:0 10px;font-size:12px;color:var(--nvb-color-neutral-700)}.nvb-table-filter-list{display:flex;flex-direction:column;gap:8px}.nvb-table-filter-list__item{border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-radius-lg);padding:10px;display:flex;justify-content:space-between;align-items:center;gap:10px}.nvb-table-filter-list__meta{min-width:0;display:flex;flex-direction:column;gap:2px}.nvb-table-filter-list__meta strong{font-size:13px;color:var(--nvb-color-neutral-800)}.nvb-table-filter-list__meta span,.nvb-table-filter-list__meta small{font-size:11px;color:var(--nvb-color-neutral-600)}.nvb-table-filter-list__actions{display:inline-flex;align-items:center;gap:6px}.nvb-table-filter-list__empty{font-size:12px;color:var(--nvb-color-neutral-500);padding:6px 0}@keyframes table-loading-fade{0%{opacity:0}to{opacity:1}}@keyframes table-loading-shimmer{0%{background-position:100% 0}to{background-position:-100% 0}}@container (max-width: 768px){.nvb-table-sticky-clone{display:none}.nvb-table-toolbar{flex-direction:column;align-items:stretch}.nvb-table-toolbar__left,.nvb-table-toolbar__center,.nvb-table-toolbar__right{width:100%;justify-content:flex-start;flex:0 0 auto}.nvb-table-toolbar__center{min-width:0}.nvb-table-toolbar__center--controls-only{justify-content:flex-start}.nvb-table-toolbar__right{margin-left:0}.nvb-table-toolbar__dropzone--center{flex:0 0 auto}.nvb-table-toolbar__drop-item{min-width:0;max-width:none;width:100%;flex-basis:100%}.nvb-table-toolbar__add-menu{position:static;width:100%;min-width:0;max-height:220px;margin-top:6px;box-shadow:none}.nvb-table-toolbar__button--detailed-toggle{width:100%;justify-content:space-between}.nvb-table-quick-search,.nvb-table-export{width:100%}.nvb-table-header-menu{width:100%;min-width:0}.nvb-table-export>.nvb-table-toolbar__button{width:100%;justify-content:space-between}.nvb-table-export__menu{left:0;right:auto;width:min(100%,280px)}.nvb-table-detailed-search__row{grid-template-columns:1fr}.nvb-table-detailed-search__remove,.nvb-table-detailed-search__actions{width:100%}.nvb-table-detailed-search__actions .nvb-table-toolbar__button{width:100%;justify-content:center}.nvb-table-cell-actions{width:100%}.nvb-table-frame{flex-direction:column}.nvb-table-detail-panel{width:100%;min-width:0;max-width:none;border-left:none;border-top:1px solid var(--nvb-color-neutral-200)}.nvb-table-cell-actions__select{width:100%;min-width:0}.nvb-table-dialog{width:min(94vw,720px);max-height:88vh}.nvb-table-dialog__footer{grid-template-columns:1fr}.nvb-table-filter-list__item{flex-direction:column;align-items:stretch}.nvb-table-filter-list__actions{width:100%}.nvb-table-filter-list__actions .nvb-table-toolbar__button{flex:1 1 0;justify-content:center}.nvb-table--auto-stack thead{display:none}.nvb-table--auto-stack,.nvb-table--auto-stack tbody,.nvb-table--auto-stack tr,.nvb-table--auto-stack td{display:block;width:100%}.nvb-table--auto-stack tr{border-bottom:1px solid var(--nvb-color-neutral-200);padding:6px 0}.nvb-table--auto-stack td{border:none;display:grid;grid-template-columns:minmax(110px,36%) 1fr;gap:8px;padding:6px 10px;text-align:left}.nvb-table--auto-stack td:before{content:attr(data-label);font-size:11px;color:var(--nvb-color-neutral-500);font-weight:600}.nvb-table--auto-stack .nvb-action-cell{justify-items:end}.nvb-table--auto-stack .nvb-expand-cell,.nvb-table--auto-stack .nvb-table-expanded-inline-row__cell{grid-template-columns:1fr}.nvb-table--auto-stack .nvb-expand-cell:before,.nvb-table--auto-stack .nvb-table-expanded-inline-row__cell:before,.nvb-table--auto-stack .nvb-table-row-template-cell:before{content:none}.nvb-table--auto-stack .nvb-expand-cell,.nvb-table--auto-stack .nvb-table-row-template-cell{justify-items:start;grid-template-columns:1fr}.nvb-table--auto-stack .nvb-table-expanded-inline-row__content{width:100%}}.nvb-table-export-dialog{width:min(92vw,560px)}.nvb-table-export-dialog .nvb-table-dialog__close nvb-icon{width:18px;height:18px;display:inline-flex}.nvb-table-export-dialog__subject{margin-left:6px;color:var(--nvb-color-neutral-500);font-weight:400}.nvb-table-export-dialog__body{gap:20px;padding:20px 24px}.nvb-table-export-dialog__group{margin:0;padding:0;border:0;min-width:0;display:flex;flex-direction:column;gap:8px}.nvb-table-export-dialog__legend{padding:0;margin-bottom:8px;font-size:12px;font-weight:600;color:var(--nvb-color-neutral-700)}.nvb-table-export-dialog__legend--row{width:100%;display:flex;align-items:center;justify-content:space-between}.nvb-table-export-dialog__muted{margin-left:4px;color:var(--nvb-color-neutral-500);font-weight:400;font-variant-numeric:tabular-nums}.nvb-table-export-dialog__formats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.nvb-table-export-dialog__format{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:8px;padding:12px;border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-control-radius, var(--nvb-radius-md));background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-800);font:inherit;text-align:left;cursor:pointer;transition:border-color .14s ease,background-color .14s ease,box-shadow .14s ease}.nvb-table-export-dialog__format:hover{border-color:var(--nvb-color-neutral-400)}.nvb-table-export-dialog__format--active,.nvb-table-export-dialog__format--active:hover{border-color:var(--nvb-color-primary-500);background:var(--nvb-color-primary-050);box-shadow:inset 0 0 0 1px var(--nvb-color-primary-500)}.nvb-table-export-dialog__format:focus-visible,.nvb-table-export-dialog__link:focus-visible,.nvb-table-export-dialog__button:focus-visible{outline:0;box-shadow:var(--nvb-focus-ring)}.nvb-table-export-dialog__format-icon{width:20px;height:20px;display:inline-flex;color:var(--nvb-color-neutral-600)}.nvb-table-export-dialog__format--active .nvb-table-export-dialog__format-icon{color:var(--nvb-color-primary-600)}.nvb-table-export-dialog__format-text{display:flex;flex-direction:column;gap:2px;min-width:0}.nvb-table-export-dialog__format-text strong{font-size:13px;font-weight:600;color:var(--nvb-color-neutral-900)}.nvb-table-export-dialog__format-text small{font-size:11px;line-height:1.35;color:var(--nvb-color-neutral-600)}.nvb-table-export-dialog__check{position:absolute;top:10px;right:10px;width:18px;height:18px;border-radius:var(--nvb-radius-full);display:inline-flex;align-items:center;justify-content:center;background:var(--nvb-color-primary-600);color:var(--nvb-color-neutral-000);opacity:0;transform:scale(.8);transition:opacity .14s ease,transform .14s ease}.nvb-table-export-dialog__check nvb-icon{width:12px;height:12px;display:inline-flex}.nvb-table-export-dialog__format--active .nvb-table-export-dialog__check{opacity:1;transform:none}.nvb-table-export-dialog__scopes{display:flex;flex-direction:column;border:1px solid var(--nvb-color-neutral-200);border-radius:var(--nvb-control-radius, var(--nvb-radius-md));overflow:hidden}.nvb-table-export-dialog__scope{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;padding:10px 12px;font-size:13px;color:var(--nvb-color-neutral-800);cursor:pointer}.nvb-table-export-dialog__scope+.nvb-table-export-dialog__scope{border-top:1px solid var(--nvb-color-neutral-200)}.nvb-table-export-dialog__scope:hover{background:var(--nvb-color-neutral-050)}.nvb-table-export-dialog__scope:has(input:checked){background:var(--nvb-color-primary-050)}.nvb-table-export-dialog__scope input{appearance:none;-webkit-appearance:none;flex:0 0 auto;margin:0;width:16px;height:16px;border:1.5px solid var(--nvb-color-neutral-400);border-radius:var(--nvb-radius-full);background:var(--nvb-color-neutral-000);cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease}.nvb-table-export-dialog__scope input:checked{border-color:var(--nvb-color-primary-600);box-shadow:inset 0 0 0 3px var(--nvb-color-neutral-000);background:var(--nvb-color-primary-600)}.nvb-table-export-dialog__scope input:focus-visible{outline:0;box-shadow:inset 0 0 0 3px var(--nvb-color-neutral-000),var(--nvb-focus-ring)}.nvb-table-export-dialog__scope-text{display:flex;flex-direction:column;gap:1px}.nvb-table-export-dialog__scope-text small{font-size:11px;color:var(--nvb-color-neutral-500)}.nvb-table-export-dialog__count{min-width:28px;padding:1px 8px;border-radius:var(--nvb-radius-full);background:var(--nvb-color-neutral-100);color:var(--nvb-color-neutral-700);font-size:12px;font-weight:600;text-align:center;font-variant-numeric:tabular-nums}.nvb-table-export-dialog__link{padding:0;border:0;background:none;color:var(--nvb-color-primary-600);font:inherit;font-size:12px;font-weight:500;cursor:pointer}.nvb-table-export-dialog__link:hover{text-decoration:underline}.nvb-table-export-dialog__columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2px 12px;max-height:220px;overflow:auto}.nvb-table-export-dialog__column{display:flex;align-items:center;gap:8px;min-width:0;padding:5px 4px;border-radius:var(--nvb-radius-sm);font-size:13px;color:var(--nvb-color-neutral-800);cursor:pointer}.nvb-table-export-dialog__column:hover{background:var(--nvb-color-neutral-050)}.nvb-table-export-dialog__column span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nvb-table-export-dialog__filename{display:flex;align-items:stretch}.nvb-table-export-dialog__filename input{flex:1 1 auto;min-width:0;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.nvb-table-export-dialog__extension{display:inline-flex;align-items:center;padding:0 12px;border:1px solid var(--nvb-color-neutral-300);border-left:0;border-radius:0 var(--nvb-control-radius, var(--nvb-radius-md)) var(--nvb-control-radius, var(--nvb-radius-md)) 0;background:var(--nvb-color-neutral-050);color:var(--nvb-color-neutral-600);font-size:13px}.nvb-table-export-dialog__footer{display:flex;align-items:center;gap:8px;padding:14px 24px 18px;border-top:1px solid var(--nvb-color-neutral-200);flex-shrink:0}.nvb-table-export-dialog__summary{margin-right:auto;font-size:12px;color:var(--nvb-color-neutral-600)}.nvb-table-export-dialog__button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:var(--nvb-input-height, 38px);padding:0 16px;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-control-radius, var(--nvb-radius-md));background:var(--nvb-color-neutral-000);color:var(--nvb-color-neutral-800);font:inherit;font-size:13px;font-weight:600;cursor:pointer;white-space:nowrap}.nvb-table-export-dialog__button:hover:not(:disabled){background:var(--nvb-color-neutral-050)}.nvb-table-export-dialog__button--primary{min-width:140px;border-color:var(--nvb-color-primary-600);background:var(--nvb-color-primary-600);color:var(--nvb-color-neutral-000)}.nvb-table-export-dialog__button--primary:hover:not(:disabled){border-color:var(--nvb-color-primary-700);background:var(--nvb-color-primary-700)}.nvb-table-export-dialog__button:disabled{opacity:.5;cursor:not-allowed}.nvb-table-export-dialog__spinner{width:14px;height:14px;border:2px solid currentColor;border-right-color:transparent;border-radius:var(--nvb-radius-full);animation:nvb-table-export-spin .7s linear infinite}@keyframes nvb-table-export-spin{to{transform:rotate(360deg)}}@media(max-width:560px){.nvb-table-export-dialog__formats{grid-template-columns:minmax(0,1fr)}.nvb-table-export-dialog__format{flex-direction:row;align-items:center}.nvb-table-export-dialog__columns{grid-template-columns:minmax(0,1fr)}}@media(prefers-reduced-motion:reduce){.nvb-table-export-dialog__spinner{animation-duration:2s}}\n"]}]}],propDecorators:{model:[{type:h.Input,args:[{isSignal:true,alias:"model",required:true}]}],tableShellRef:[{type:h.ViewChild,args:["tableShellRef",{isSignal:true}]}],stickyHeaderRef:[{type:h.ViewChild,args:["stickyHeaderRef",{isSignal:true}]}],tableScrollerRef:[{type:h.ViewChild,args:["tableScrollerRef",{isSignal:true}]}],mainHeaderRowRef:[{type:h.ViewChild,args:["mainHeaderRowRef",{isSignal:true}]}],closeActionMenu:[{type:K,args:["document:click"]}],onWindowScroll:[{type:K,args:["window:scroll"]}],onWindowResize:[{type:K,args:["window:resize"]}]}});export{G as a,Te as i,V as n,W as o,Y as r,z as s,ee as t};
|