1import{C as Z,c as W,e as X,j as Y}from"./chunk-XS2CIZ4P.js";import{$b as y,Ac as h,Bc as A,Cb as M,Cc as k,Ea as P,Ga as F,Md as J,Qc as q,Rc as G,Rd as K,Tb as T,Vb as u,Wb as _,Xc as I,Zb as E,_b as V,ac as r,bc as c,bd as H,cc as m,gc as N,gd as R,hd as w,jb as s,jc as b,lc as C,nc as l,ra as x,sa as f,ta as v,ua as j,wc as L,xb as z,xc as B,yc as S}from"./chunk-7GTDZMJG.js";import{a as D,b as Q}from"./chunk-ZGVHDELW.js";var te=t=>({$implicit:t,level:0}),ne=(t,i)=>({$implicit:t,level:i}),U=(t,i)=>i.uuid;function oe(t,i){if(t&1){let e=b();r(0,"button",11),C("click",function(){x(e);let n=l();return f(n.onSearchChange(""))}),v(),r(1,"svg",12),m(2,"path",13),c()()}}function ie(t,i){t&1&&(r(0,"div",7),m(1,"div",14),r(2,"span"),h(3,"Loading categories..."),c()())}function re(t,i){t&1&&(r(0,"div",8)(1,"span"),h(2,"No categories available"),c()())}function ae(t,i){if(t&1&&(r(0,"div",8)(1,"span"),h(2),c()()),t&2){let e=l();s(2),k('No categories match "',e.searchQuery(),'"')}}function ce(t,i){t&1&&N(0)}function le(t,i){if(t&1&&M(0,ce,1,0,"ng-container",15),t&2){let e=i.$implicit;l(2);let o=L(12);y("ngTemplateOutlet",o)("ngTemplateOutletContext",q(2,te,e))}}function se(t,i){if(t&1&&(r(0,"div",9),E(1,le,1,4,"ng-container",null,U),c()),t&2){let e=l();s(),V(e.filteredCategories())}}function de(t,i){if(t&1){let e=b();r(0,"div",10)(1,"span",16),h(2),c(),r(3,"button",17),C("click",function(){x(e);let n=l();return f(n.clearAll())}),h(4,"Clear all"),c()()}if(t&2){let e=l();s(2),k("",e.selectedValues().length," category(ies) selected")}}function pe(t,i){if(t&1){let e=b();r(0,"button",26),C("click",function(){x(e);let n=l().$implicit,a=l();return f(a.toggleExpand(n.uuid))}),v(),r(1,"svg",27),m(2,"path",28),c()()}if(t&2){let e=l().$implicit,o=l();T("aria-expanded",o.isExpanded(e.uuid))("aria-label",o.isExpanded(e.uuid)?"Collapse "+e.name:"Expand "+e.name),s(),S("rotated",o.isExpanded(e.uuid))}}function ge(t,i){t&1&&m(0,"span",21)}function ue(t,i){t&1&&(v(),r(0,"svg",31),m(1,"path",32),c())}function _e(t,i){if(t&1){let e=b();r(0,"label",22)(1,"input",29),C("change",function(){x(e);let n=l().$implicit,a=l();return f(a.toggleSelect(n.uuid))}),c(),r(2,"span",30),u(3,ue,2,0,":svg:svg",31),c()()}if(t&2){let e=l().$implicit,o=l();s(),y("checked",o.isSelected(e.uuid)),T("aria-label","Select "+e.name),s(2),_(o.isSelected(e.uuid)?3:-1)}}function he(t,i){if(t&1&&(r(0,"span",24),h(1),c()),t&2){let e=l().$implicit;s(),A(e.children==null?null:e.children.length)}}function me(t,i){t&1&&N(0)}function Ce(t,i){if(t&1&&M(0,me,1,0,"ng-container",15),t&2){let e=i.$implicit,o=l(2).level;l();let n=L(12);y("ngTemplateOutlet",n)("ngTemplateOutletContext",G(2,ne,e,o+1))}}function xe(t,i){if(t&1&&(r(0,"div",25),E(1,Ce,1,5,"ng-container",null,U),c()),t&2){let e=l().$implicit;s(),V(e.children)}}function fe(t,i){if(t&1){let e=b();r(0,"div",18)(1,"div",19),u(2,pe,3,4,"button",20)(3,ge,1,0,"span",21),u(4,_e,4,3,"label",22),r(5,"span",23),C("click",function(){let n=x(e).$implicit,a=l();return f(a.hasChildren(n)?a.toggleExpand(n.uuid):a.toggleSelect(n.uuid))}),h(6),c(),u(7,he,2,1,"span",24),c(),u(8,xe,3,0,"div",25),c()}if(t&2){let e=i.$implicit,o=i.level,n=l();B("--level",o),s(),S("has-children",n.hasChildren(e))("expanded",n.isExpanded(e.uuid))("selectable",!n.hasChildren(e))("selected",n.isSelected(e.uuid)),s(),_(n.hasChildren(e)?2:3),s(2),_(n.hasChildren(e)?-1:4),s(),S("parent-label",n.hasChildren(e)),s(),k(" ",e.name," "),s(),_(n.hasChildren(e)?7:-1),s(),_(n.hasChildren(e)&&n.isExpanded(e.uuid)?8:-1)}}var Te=(()=>{class t{constructor(){this.categories=w.required(),this.selectedValues=w([]),this.isLoading=w(!1),this.valuesChange=R(),this.expandedNodes=P(new Set),this.searchQuery=P(""),this.filteredCategories=H(()=>{let e=this.searchQuery().toLowerCase().trim(),o=this.categories();return e?this.filterCategoriesBySearch(o,e):o}),this.searchExpandEffect=F(()=>{this.searchQuery()&&this.expandAllMatchingNodes()})}filterCategoriesBySearch(e,o){let n=[];for(let a of e){let p=a.name.toLowerCase().includes(o);if(this.hasChildren(a)){let d=this.filterCategoriesBySearch(a.children,o);(p||d.length>0)&&n.push(Q(D({},a),{children:d.length>0?d:a.children}))}else p&&n.push(a)}return n}expandAllMatchingNodes(){let e=this.searchQuery().toLowerCase().trim();if(!e)return;let o=new Set,n=(a,p=[])=>{let d=!1;for(let g of a){let $=g.name.toLowerCase().includes(e);if(this.hasChildren(g)){let O=[...p,g.uuid];
1(n(g.children,O)||$)&&(p.forEach(ee=>o.add(ee)),o.add(g.uuid),d=!0)}else $&&(p.forEach(O=>o.add(O)),d=!0)}return d};n(this.categories()),this.expandedNodes.set(o)}onSearchChange(e){this.searchQuery.set(e)}hasChildren(e){return!!(e.children&&e.children.length>0)}isExpanded(e){return this.expandedNodes().has(e)}isSelected(e){return this.selectedValues().includes(e)}toggleExpand(e){let o=new Set(this.expandedNodes());o.has(e)?o.delete(e):o.add(e),this.expandedNodes.set(o)}toggleSelect(e){let o=this.selectedValues(),n;this.isSelected(e)?n=o.filter(a=>a!==e):n=[...o,e],this.valuesChange.emit(n)}clearAll(){this.valuesChange.emit([])}expandParentsOfSelected(){let e=new Set(this.selectedValues()),o=new Set,n=(a,p=[])=>{for(let d of a)if(this.hasChildren(d)){let g=[...p,d.uuid];n(d.children,g)}else e.has(d.uuid)&&p.forEach(g=>o.add(g))};n(this.categories()),this.expandedNodes.set(o)}static{this.\u0275fac=function(o){return new(o||t)}}static{this.\u0275cmp=z({type:t,selectors:[["app-category-tree-select"]],inputs:{categories:[1,"categories"],selectedValues:[1,"selectedValues"],isLoading:[1,"isLoading"]},outputs:{valuesChange:"valuesChange"},decls:13,vars:4,consts:[["treeNode",""],[1,"category-tree-container"],[1,"search-wrapper"],["fill","none","stroke","currentColor","viewBox","0 0 24 24",1,"search-icon"],["stroke-linecap","round","stroke-linejoin","round","stroke-width","2","d","M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"],["type","text","placeholder","Search categories...",1,"search-input",3,"ngModelChange","ngModel"],["type","button","aria-label","Clear search",1,"clear-search-btn"],[1,"loading-state"],[1,"empty-state"],[1,"tree-wrapper"],[1,"selection-footer"],["type","button","aria-label","Clear search",1,"clear-search-btn",3,"click"],["fill","none","stroke","currentColor","viewBox","0 0 24 24"],["stroke-linecap","round","stroke-linejoin","round","stroke-width","2","d","M6 18L18 6M6 6l12 12"],[1,"spinner"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"count"],["type","button",1,"clear-btn",3,"click"],[1,"tree-node"],[1,"node-content"],["type","button",1,"toggle-btn"],[1,"toggle-spacer"],[1,"checkbox-wrapper"],[1,"node-label",3,"click"],[1,"child-count"],[1,"children-container"],["type","button",1,"toggle-btn",3,"click"],["fill","none","stroke","currentColor","viewBox","0 0 24 24",1,"toggle-icon"],["stroke-linecap","round","stroke-linejoin","round","stroke-width","2","d","M9 5l7 7-7 7"],["type","checkbox",3,"change","checked"],[1,"checkbox-custom"],["fill","none","stroke","currentColor","viewBox","0 0 24 24",1,"check-icon"],["stroke-linecap","round","stroke-linejoin","round","stroke-width","2","d","M5 13l4 4L19 7"]],template:function(o,n){o&1&&(r(0,"div",1)(1,"div",2),v(),r(2,"svg",3),m(3,"path",4),c(),j(),r(4,"input",5),C("ngModelChange",function(p){return n.onSearchChange(p)}),c(),u(5,oe,3,0,"button",6),c(),u(6,ie,4,0,"div",7)(7,re,3,0,"div",8)(8,ae,3,1,"div",8)(9,se,3,0,"div",9),u(10,de,5,1,"div",10),c(),M(11,fe,9,17,"ng-template",null,0,I)),o&2&&(s(4),y("ngModel",n.searchQuery()),s(),_(n.searchQuery()?5:-1),s(),_(n.isLoading()?6:n.categories().length===0?7:n.filteredCategories().length===0&&n.searchQuery()?8:9),s(4),_(n.selectedValues().length>0?10:-1))},dependencies:[K,J,Z,W,X,Y],styles:[".category-tree-container[_ngcontent-%COMP%]{border:1px solid var(--border);border-radius:8px;background:var(--background);overflow:hidden}.search-wrapper[_ngcontent-%COMP%]{position:relative;display:flex;align-items:center;padding:12px;border-bottom:1px solid var(--border);background:var(--muted)}.search-wrapper[_ngcontent-%COMP%] .search-icon[_ngcontent-%COMP%]{position:absolute;left:24px;width:16px;height:16px;color:var(--muted-foreground);pointer-events:none}.search-wrapper[_ngcontent-%COMP%] .search-input[_ngcontent-%COMP%]{width:100%;padding:8px 36px;border:1px solid var(--border);border-radius:6px;background:var(--background);font-family:var(--font-heebo);font-size:14px;color:var(--foreground);outline:none;transition:border-color .15s,box-shadow .15s}.search-wrapper[_ngcontent-%COMP%] .search-input[_ngcontent-%COMP%]::placeholder{color:var(--muted-foreground)}.search-wrapper[_ngcontent-%COMP%] .search-input[_ngcontent-%COMP%]:focus{border-color:var(--primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--primary) 20%,transparent)}.search-wrapper[_ngcontent-%COMP%] .clear-search-btn[_ngcontent-%COMP%]{position:absolute;right:24px;display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;background:transparent;color:var(--muted-foreground);cursor:pointer;border-radius:4px;transition:all .15s}.search-wrapper[_ngcontent-%COMP%] .clear-search-btn[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{width:14px;
1height:14px}.search-wrapper[_ngcontent-%COMP%] .clear-search-btn[_ngcontent-%COMP%]:hover{background:var(--border);color:var(--foreground)}.loading-state[_ngcontent-%COMP%], .empty-state[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;gap:12px;padding:32px;color:var(--muted-foreground);font-family:var(--font-heebo);font-size:14px}.loading-state[_ngcontent-%COMP%] .spinner[_ngcontent-%COMP%], .empty-state[_ngcontent-%COMP%] .spinner[_ngcontent-%COMP%]{width:20px;height:20px;border:2px solid var(--border);border-top-color:var(--primary);border-radius:50%;animation:_ngcontent-%COMP%_spin .8s linear infinite}@keyframes _ngcontent-%COMP%_spin{to{transform:rotate(360deg)}}.tree-wrapper[_ngcontent-%COMP%]{max-height:350px;overflow-y:auto;padding:8px 0}.tree-node[_ngcontent-%COMP%]{--indent: calc(var(--level, 0) * 20px)}.node-content[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:8px 12px 8px calc(12px + var(--indent));cursor:default;transition:background .15s}.node-content[_ngcontent-%COMP%]:hover{background:var(--muted)}.node-content.selectable[_ngcontent-%COMP%]{cursor:pointer}.node-content.selected[_ngcontent-%COMP%]{background:color-mix(in srgb,var(--primary) 10%,transparent)}.toggle-btn[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;background:transparent;color:var(--muted-foreground);cursor:pointer;border-radius:4px;flex-shrink:0;transition:all .15s}.toggle-btn[_ngcontent-%COMP%]:hover{background:var(--muted);color:var(--foreground)}.toggle-btn[_ngcontent-%COMP%] .toggle-icon[_ngcontent-%COMP%]{width:14px;height:14px;transition:transform .2s}.toggle-btn[_ngcontent-%COMP%] .toggle-icon.rotated[_ngcontent-%COMP%]{transform:rotate(90deg)}.toggle-spacer[_ngcontent-%COMP%]{width:20px;flex-shrink:0}.checkbox-wrapper[_ngcontent-%COMP%]{display:flex;align-items:center;cursor:pointer}.checkbox-wrapper[_ngcontent-%COMP%] input[type=checkbox][_ngcontent-%COMP%]{position:absolute;opacity:0;pointer-events:none}.checkbox-wrapper[_ngcontent-%COMP%] .checkbox-custom[_ngcontent-%COMP%]{width:18px;height:18px;border:2px solid var(--border);border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .15s;background:var(--background)}.checkbox-wrapper[_ngcontent-%COMP%] .checkbox-custom[_ngcontent-%COMP%] .check-icon[_ngcontent-%COMP%]{width:12px;height:12px;color:var(--primary-foreground)}.checkbox-wrapper[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-custom[_ngcontent-%COMP%]{background:var(--primary);border-color:var(--primary)}.checkbox-wrapper[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus-visible + .checkbox-custom[_ngcontent-%COMP%]{box-shadow:0 0 0 2px color-mix(in srgb,var(--primary) 30%,transparent)}.node-label[_ngcontent-%COMP%]{flex:1;font-family:var(--font-heebo);font-size:14px;color:var(--foreground);-webkit-user-select:none;user-select:none}.node-label.parent-label[_ngcontent-%COMP%]{font-weight:500;cursor:pointer}.child-count[_ngcontent-%COMP%]{padding:2px 8px;background:var(--muted);border-radius:12px;font-family:var(--font-heebo);font-size:12px;color:var(--muted-foreground)}.children-container[_ngcontent-%COMP%]{border-left:1px solid var(--border);margin-left:calc(12px + var(--indent) + 10px)}.selection-footer[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-top:1px solid var(--border);background:var(--muted)}.selection-footer[_ngcontent-%COMP%] .count[_ngcontent-%COMP%]{font-family:var(--font-heebo);font-size:13px;color:var(--muted-foreground)}.selection-footer[_ngcontent-%COMP%] .clear-btn[_ngcontent-%COMP%]{padding:4px 12px;border:none;background:transparent;color:var(--primary);font-family:var(--font-heebo);font-size:13px;cursor:pointer;border-radius:4px;transition:background .15s}.selection-footer[_ngcontent-%COMP%] .clear-btn[_ngcontent-%COMP%]:hover{background:color-mix(in srgb,var(--primary) 10%,transparent)}"],changeDetection:0})}}return t})();export{Te as a};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.