@neural-ui/core 1.7.6 → 1.8.1

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.
Files changed (77) hide show
  1. package/fesm2022/neural-ui-core-accordion.mjs +22 -8
  2. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
  3. package/fesm2022/neural-ui-core-alert.mjs +1 -1
  4. package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
  5. package/fesm2022/neural-ui-core-autocomplete.mjs +50 -9
  6. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
  7. package/fesm2022/neural-ui-core-button.mjs +1 -1
  8. package/fesm2022/neural-ui-core-button.mjs.map +1 -1
  9. package/fesm2022/neural-ui-core-calendar.mjs +26 -18
  10. package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
  11. package/fesm2022/neural-ui-core-command-palette.mjs +22 -8
  12. package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -1
  13. package/fesm2022/neural-ui-core-context-menu.mjs +24 -8
  14. package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
  15. package/fesm2022/neural-ui-core-empty-state.mjs +1 -1
  16. package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
  17. package/fesm2022/neural-ui-core-icon.mjs +9 -2
  18. package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
  19. package/fesm2022/neural-ui-core-inline-editor.mjs +5 -9
  20. package/fesm2022/neural-ui-core-inline-editor.mjs.map +1 -1
  21. package/fesm2022/neural-ui-core-input.mjs +1 -1
  22. package/fesm2022/neural-ui-core-input.mjs.map +1 -1
  23. package/fesm2022/neural-ui-core-listbox.mjs +50 -5
  24. package/fesm2022/neural-ui-core-listbox.mjs.map +1 -1
  25. package/fesm2022/neural-ui-core-menu.mjs +38 -16
  26. package/fesm2022/neural-ui-core-menu.mjs.map +1 -1
  27. package/fesm2022/neural-ui-core-modal.mjs +1 -1
  28. package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
  29. package/fesm2022/neural-ui-core-multiselect.mjs +67 -7
  30. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
  31. package/fesm2022/neural-ui-core-nav.mjs +1 -1
  32. package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
  33. package/fesm2022/neural-ui-core-pick-list.mjs +43 -16
  34. package/fesm2022/neural-ui-core-pick-list.mjs.map +1 -1
  35. package/fesm2022/neural-ui-core-select.mjs +64 -5
  36. package/fesm2022/neural-ui-core-select.mjs.map +1 -1
  37. package/fesm2022/neural-ui-core-sidebar.mjs +1 -1
  38. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
  39. package/fesm2022/neural-ui-core-split-button.mjs +22 -8
  40. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
  41. package/fesm2022/neural-ui-core-stats-card.mjs +1 -1
  42. package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
  43. package/fesm2022/neural-ui-core-table.mjs +1 -1
  44. package/fesm2022/neural-ui-core-table.mjs.map +1 -1
  45. package/fesm2022/neural-ui-core-tabs.mjs +22 -9
  46. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
  47. package/fesm2022/neural-ui-core-tags.mjs +40 -13
  48. package/fesm2022/neural-ui-core-tags.mjs.map +1 -1
  49. package/fesm2022/neural-ui-core-timeline.mjs +39 -10
  50. package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
  51. package/fesm2022/neural-ui-core-toast.mjs +1 -1
  52. package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
  53. package/fesm2022/neural-ui-core-toggle-button-group.mjs +27 -12
  54. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
  55. package/fesm2022/neural-ui-core-tree-select.mjs +86 -12
  56. package/fesm2022/neural-ui-core-tree-select.mjs.map +1 -1
  57. package/fesm2022/neural-ui-core-tree.mjs +21 -6
  58. package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
  59. package/package.json +1 -1
  60. package/types/neural-ui-core-accordion.d.ts +16 -2
  61. package/types/neural-ui-core-autocomplete.d.ts +23 -2
  62. package/types/neural-ui-core-calendar.d.ts +18 -3
  63. package/types/neural-ui-core-command-palette.d.ts +24 -10
  64. package/types/neural-ui-core-context-menu.d.ts +17 -3
  65. package/types/neural-ui-core-icon.d.ts +5 -1
  66. package/types/neural-ui-core-listbox.d.ts +23 -2
  67. package/types/neural-ui-core-menu.d.ts +23 -3
  68. package/types/neural-ui-core-multiselect.d.ts +33 -2
  69. package/types/neural-ui-core-pick-list.d.ts +32 -3
  70. package/types/neural-ui-core-select.d.ts +30 -2
  71. package/types/neural-ui-core-split-button.d.ts +15 -3
  72. package/types/neural-ui-core-tabs.d.ts +16 -3
  73. package/types/neural-ui-core-tags.d.ts +35 -4
  74. package/types/neural-ui-core-timeline.d.ts +27 -2
  75. package/types/neural-ui-core-toggle-button-group.d.ts +18 -3
  76. package/types/neural-ui-core-tree-select.d.ts +51 -3
  77. package/types/neural-ui-core-tree.d.ts +18 -3
@@ -50,6 +50,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
50
50
  type: Directive,
51
51
  args: [{ selector: '[neuSelectSelected]', standalone: true }]
52
52
  }] });
53
+ /** Optional content slots for the select panel. */
54
+ class NeuSelectHeaderDirective {
55
+ templateRef = inject(TemplateRef);
56
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuSelectHeaderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
57
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuSelectHeaderDirective, isStandalone: true, selector: "[neuSelectHeader]", ngImport: i0 });
58
+ }
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuSelectHeaderDirective, decorators: [{
60
+ type: Directive,
61
+ args: [{ selector: '[neuSelectHeader]', standalone: true }]
62
+ }] });
63
+ class NeuSelectFooterDirective {
64
+ templateRef = inject(TemplateRef);
65
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuSelectFooterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
66
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuSelectFooterDirective, isStandalone: true, selector: "[neuSelectFooter]", ngImport: i0 });
67
+ }
68
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuSelectFooterDirective, decorators: [{
69
+ type: Directive,
70
+ args: [{ selector: '[neuSelectFooter]', standalone: true }]
71
+ }] });
72
+ class NeuSelectEmptyDirective {
73
+ templateRef = inject(TemplateRef);
74
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuSelectEmptyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
75
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuSelectEmptyDirective, isStandalone: true, selector: "[neuSelectEmpty]", ngImport: i0 });
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuSelectEmptyDirective, decorators: [{
78
+ type: Directive,
79
+ args: [{ selector: '[neuSelectEmpty]', standalone: true }]
80
+ }] });
81
+ class NeuSelectGroupDirective {
82
+ templateRef = inject(TemplateRef);
83
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuSelectGroupDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
84
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuSelectGroupDirective, isStandalone: true, selector: "[neuSelectGroup]", ngImport: i0 });
85
+ }
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuSelectGroupDirective, decorators: [{
87
+ type: Directive,
88
+ args: [{ selector: '[neuSelectGroup]', standalone: true }]
89
+ }] });
53
90
 
54
91
  let _neuSelectIdSeq = 0;
55
92
  /**
@@ -106,6 +143,10 @@ class NeuSelectComponent {
106
143
  itemTpl = contentChild(NeuSelectItemDirective, ...(ngDevMode ? [{ debugName: "itemTpl" }] : /* istanbul ignore next */ []));
107
144
  /** Template personalizado para el valor seleccionado en el trigger / Custom template for the selected value in the trigger */
108
145
  selectedItemTpl = contentChild(NeuSelectSelectedDirective, ...(ngDevMode ? [{ debugName: "selectedItemTpl" }] : /* istanbul ignore next */ []));
146
+ headerTpl = contentChild(NeuSelectHeaderDirective, ...(ngDevMode ? [{ debugName: "headerTpl" }] : /* istanbul ignore next */ []));
147
+ footerTpl = contentChild(NeuSelectFooterDirective, ...(ngDevMode ? [{ debugName: "footerTpl" }] : /* istanbul ignore next */ []));
148
+ emptyTpl = contentChild(NeuSelectEmptyDirective, ...(ngDevMode ? [{ debugName: "emptyTpl" }] : /* istanbul ignore next */ []));
149
+ groupTpl = contentChild(NeuSelectGroupDirective, ...(ngDevMode ? [{ debugName: "groupTpl" }] : /* istanbul ignore next */ []));
109
150
  /** Opciones del dropdown / Dropdown options */
110
151
  options = input([], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
111
152
  /** Texto del floating label / Floating label text */
@@ -212,6 +253,10 @@ class NeuSelectComponent {
212
253
  return this.options();
213
254
  return this.options().filter((o) => o.label.toLowerCase().includes(q));
214
255
  }, ...(ngDevMode ? [{ debugName: "filteredOptions" }] : /* istanbul ignore next */ []));
256
+ previousGroup(option) {
257
+ const index = this.filteredOptions().indexOf(option);
258
+ return index > 0 ? this.filteredOptions()[index - 1]?.group : undefined;
259
+ }
215
260
  selectedLabel = computed(() => this.options().find((o) => o.value === this._value())?.label ?? null, ...(ngDevMode ? [{ debugName: "selectedLabel" }] : /* istanbul ignore next */ []));
216
261
  _selectedOption = computed(() => this.options().find((o) => o.value === this._value()) ?? null, ...(ngDevMode ? [{ debugName: "_selectedOption" }] : /* istanbul ignore next */ []));
217
262
  resultsAnnouncement = computed(() => {
@@ -433,7 +478,7 @@ class NeuSelectComponent {
433
478
  useExisting: forwardRef(() => NeuSelectComponent),
434
479
  multi: true,
435
480
  },
436
- ], queries: [{ propertyName: "itemTpl", first: true, predicate: NeuSelectItemDirective, descendants: true, isSignal: true }, { propertyName: "selectedItemTpl", first: true, predicate: NeuSelectSelectedDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, isSignal: true }], ngImport: i0, template: `
481
+ ], queries: [{ propertyName: "itemTpl", first: true, predicate: NeuSelectItemDirective, descendants: true, isSignal: true }, { propertyName: "selectedItemTpl", first: true, predicate: NeuSelectSelectedDirective, descendants: true, isSignal: true }, { propertyName: "headerTpl", first: true, predicate: NeuSelectHeaderDirective, descendants: true, isSignal: true }, { propertyName: "footerTpl", first: true, predicate: NeuSelectFooterDirective, descendants: true, isSignal: true }, { propertyName: "emptyTpl", first: true, predicate: NeuSelectEmptyDirective, descendants: true, isSignal: true }, { propertyName: "groupTpl", first: true, predicate: NeuSelectGroupDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, isSignal: true }], ngImport: i0, template: `
437
482
  @if (!floatingLabel() && label()) {
438
483
  <label class="neu-select__static-label" [for]="_triggerId" (click)="focusTrigger()">{{
439
484
  label()
@@ -528,6 +573,7 @@ class NeuSelectComponent {
528
573
  stroke-linejoin="round"
529
574
  aria-hidden="true"
530
575
  >
576
+ @if (headerTpl()) { <ng-container [ngTemplateOutlet]="headerTpl()!.templateRef" /> }
531
577
  <polyline points="6 9 12 15 18 9" />
532
578
  </svg>
533
579
  </div>
@@ -629,6 +675,10 @@ class NeuSelectComponent {
629
675
  </cdk-virtual-scroll-viewport>
630
676
  } @else {
631
677
  @for (option of filteredOptions(); track option.value) {
678
+ @if (option.group && option.group !== previousGroup(option)) {
679
+ @if (groupTpl()) { <ng-container [ngTemplateOutlet]="groupTpl()!.templateRef" [ngTemplateOutletContext]="{ $implicit: option.group }" /> }
680
+ @else { <div class="neu-select__group">{{ option.group }}</div> }
681
+ }
632
682
  <ng-container
633
683
  [ngTemplateOutlet]="selectOptionTpl"
634
684
  [ngTemplateOutletContext]="{ $implicit: option }"
@@ -636,8 +686,10 @@ class NeuSelectComponent {
636
686
  }
637
687
  }
638
688
  @if (!loading() && filteredOptions().length === 0) {
639
- <div class="neu-select__empty">{{ noResultsMessage() }}</div>
689
+ @if (emptyTpl()) { <ng-container [ngTemplateOutlet]="emptyTpl()!.templateRef" /> }
690
+ @else { <div class="neu-select__empty">{{ noResultsMessage() }}</div> }
640
691
  }
692
+ @if (footerTpl()) { <ng-container [ngTemplateOutlet]="footerTpl()!.templateRef" /> }
641
693
  </div>
642
694
  </ng-template>
643
695
  <div class="neu-select__sr-status" aria-live="polite" aria-atomic="true">
@@ -761,6 +813,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
761
813
  stroke-linejoin="round"
762
814
  aria-hidden="true"
763
815
  >
816
+ @if (headerTpl()) { <ng-container [ngTemplateOutlet]="headerTpl()!.templateRef" /> }
764
817
  <polyline points="6 9 12 15 18 9" />
765
818
  </svg>
766
819
  </div>
@@ -862,6 +915,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
862
915
  </cdk-virtual-scroll-viewport>
863
916
  } @else {
864
917
  @for (option of filteredOptions(); track option.value) {
918
+ @if (option.group && option.group !== previousGroup(option)) {
919
+ @if (groupTpl()) { <ng-container [ngTemplateOutlet]="groupTpl()!.templateRef" [ngTemplateOutletContext]="{ $implicit: option.group }" /> }
920
+ @else { <div class="neu-select__group">{{ option.group }}</div> }
921
+ }
865
922
  <ng-container
866
923
  [ngTemplateOutlet]="selectOptionTpl"
867
924
  [ngTemplateOutletContext]="{ $implicit: option }"
@@ -869,8 +926,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
869
926
  }
870
927
  }
871
928
  @if (!loading() && filteredOptions().length === 0) {
872
- <div class="neu-select__empty">{{ noResultsMessage() }}</div>
929
+ @if (emptyTpl()) { <ng-container [ngTemplateOutlet]="emptyTpl()!.templateRef" /> }
930
+ @else { <div class="neu-select__empty">{{ noResultsMessage() }}</div> }
873
931
  }
932
+ @if (footerTpl()) { <ng-container [ngTemplateOutlet]="footerTpl()!.templateRef" /> }
874
933
  </div>
875
934
  </ng-template>
876
935
  <div class="neu-select__sr-status" aria-live="polite" aria-atomic="true">
@@ -887,11 +946,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
887
946
  <p class="neu-select__hint" [id]="_triggerId + '-hint'">{{ hint() }}</p>
888
947
  }
889
948
  `, styles: [".neu-select{position:relative;display:block}.neu-select--disabled{pointer-events:none}.neu-select--sm .neu-select__trigger{height:36px;font-size:var(--neu-text-sm)}.neu-select--lg .neu-select__trigger{height:56px}.neu-select__trigger{display:flex;align-items:center;width:100%;height:48px;padding:0 var(--neu-space-3);padding-right:36px;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);font-family:var(--neu-font-sans);font-size:var(--neu-text-base);color:var(--neu-text);cursor:pointer;text-align:left;outline:none;transition:border-color var(--neu-transition),box-shadow var(--neu-transition);position:relative}.neu-select__trigger:hover:not([aria-disabled=true]){border-color:var(--neu-border-hover)}.neu-select__trigger[aria-disabled=true]{cursor:not-allowed;background:var(--neu-surface-2)}.neu-select__trigger:focus-visible{border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-select--open .neu-select__trigger{border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f;border-bottom-left-radius:0;border-bottom-right-radius:0}.neu-select--open-above .neu-select__trigger{border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:var(--neu-radius);border-bottom-right-radius:var(--neu-radius)}.neu-select--error .neu-select__trigger{border-color:var(--neu-error)}.neu-select--error .neu-select__trigger:focus-visible{box-shadow:0 0 0 3px #ef44441f}.neu-select__label{position:absolute;left:var(--neu-space-3);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base);color:color-mix(in srgb,var(--neu-text) 68%,var(--neu-surface) 32%);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-6));transition:top var(--neu-transition),font-size var(--neu-transition),color var(--neu-transition),transform var(--neu-transition),padding var(--neu-transition),background var(--neu-transition)}.neu-select--open .neu-select__label,.neu-select--has-value .neu-select__label{top:0;transform:translateY(-50%);font-size:12px;font-weight:600;letter-spacing:.01em;background:var(--neu-surface);padding:0 4px;left:calc(var(--neu-space-3) - 4px)}.neu-select--open .neu-select__label{color:var(--neu-primary)}.neu-select--error .neu-select__label{color:var(--neu-error)}.neu-select--disabled .neu-select__label{background:var(--neu-surface-2)}.neu-select__value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.neu-select--no-float .neu-select__value{padding-top:0}.neu-select__placeholder{color:color-mix(in srgb,var(--neu-text) 62%,var(--neu-surface) 38%)}.neu-select:not(.neu-select--no-float):not(.neu-select--open) .neu-select__placeholder{visibility:hidden}.neu-select__chevron{position:absolute;right:var(--neu-space-3);top:50%;transform:translateY(-50%);width:18px;height:18px;color:var(--neu-text-muted);flex-shrink:0;transition:transform var(--neu-transition)}.neu-select--open .neu-select__chevron{transform:translateY(-50%) rotate(180deg);color:var(--neu-primary)}.neu-select__clear{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin-right:2px;padding:0;border:none;background:transparent;color:var(--neu-text-muted);cursor:pointer;border-radius:var(--neu-radius-sm);flex-shrink:0;transition:color var(--neu-transition),background var(--neu-transition)}.neu-select__clear svg{width:14px;height:14px}.neu-select__clear:hover{color:var(--neu-text);background:var(--neu-surface-3)}.neu-select__clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-select__panel{position:relative;z-index:var(--neu-z-dropdown);box-sizing:border-box;width:100%;background:var(--neu-surface);border:1.5px solid var(--neu-primary);border-top:none;border-bottom-left-radius:var(--neu-radius);border-bottom-right-radius:var(--neu-radius);box-shadow:var(--neu-shadow-lg);max-height:240px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--neu-surface-3) transparent;animation:neu-select-open .15s ease forwards}.neu-select__panel::-webkit-scrollbar{width:4px}.neu-select__panel::-webkit-scrollbar-thumb{background:var(--neu-surface-3);border-radius:99px}.neu-select__panel--above{border-top:1.5px solid var(--neu-primary);border-bottom:none;border-top-left-radius:var(--neu-radius);border-top-right-radius:var(--neu-radius);border-bottom-left-radius:0;border-bottom-right-radius:0}.neu-select__panel--virtual{overflow:visible}.neu-select__viewport{width:100%}@media(max-width:600px){.neu-select__panel{left:auto;right:0;width:min(max(100%,220px),100vw - 2rem);max-width:calc(100vw - 2rem)}}@keyframes neu-select-open{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-select__option{display:flex;align-items:center;gap:var(--neu-space-2);padding:var(--neu-space-3) var(--neu-space-4);min-height:var(--neu-select-option-height, 44px);box-sizing:border-box;font-size:var(--neu-text-sm);color:var(--neu-text);cursor:pointer;transition:background-color var(--neu-transition)}.neu-select__option:hover:not(.neu-select__option--disabled){background:var(--neu-primary-50);color:var(--neu-primary)}.neu-select__option--selected{color:var(--neu-primary);font-weight:600;background:var(--neu-primary-50)}.neu-select__option--disabled{opacity:.4;cursor:not-allowed}.neu-select__check{width:14px;height:14px;flex-shrink:0}.neu-select__error{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-error-text);font-family:var(--neu-font-sans)}.neu-select__hint{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-text-muted);font-family:var(--neu-font-sans)}.neu-select__sr-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.neu-select__static-label{display:block;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);margin-bottom:var(--neu-space-2)}.neu-select__search{padding:var(--neu-space-2);border-bottom:1px solid var(--neu-border);position:sticky;top:0;background:var(--neu-surface);z-index:1}.neu-select__search-input{width:100%;height:34px;padding:0 var(--neu-space-3);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius-sm);background:var(--neu-bg);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);color:var(--neu-text);outline:none;transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-select__search-input:focus{border-color:var(--neu-primary);box-shadow:0 0 0 2px #007aff1f}.neu-select__search-input::placeholder{color:var(--neu-text-disabled)}.neu-select__empty{padding:var(--neu-space-4);text-align:center;font-size:var(--neu-text-sm);color:var(--neu-text-disabled);font-family:var(--neu-font-sans)}\n"] }]
890
- }], ctorParameters: () => [], propDecorators: { _viewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkVirtualScrollViewport), { isSignal: true }] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuSelectItemDirective), { isSignal: true }] }], selectedItemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuSelectSelectedDirective), { isSignal: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], errorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessage", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], floatingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatingLabel", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingLabel", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollVisibleItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollVisibleItems", required: false }] }], noResultsMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultsMessage", required: false }] }], clearAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearAriaLabel", required: false }] }], urlParam: [{ type: i0.Input, args: [{ isSignal: true, alias: "urlParam", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }] } });
949
+ }], ctorParameters: () => [], propDecorators: { _viewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkVirtualScrollViewport), { isSignal: true }] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuSelectItemDirective), { isSignal: true }] }], selectedItemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuSelectSelectedDirective), { isSignal: true }] }], headerTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuSelectHeaderDirective), { isSignal: true }] }], footerTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuSelectFooterDirective), { isSignal: true }] }], emptyTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuSelectEmptyDirective), { isSignal: true }] }], groupTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuSelectGroupDirective), { isSignal: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], errorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessage", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], floatingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatingLabel", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingLabel", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollVisibleItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollVisibleItems", required: false }] }], noResultsMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultsMessage", required: false }] }], clearAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearAriaLabel", required: false }] }], urlParam: [{ type: i0.Input, args: [{ isSignal: true, alias: "urlParam", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }] } });
891
950
 
892
951
  /**
893
952
  * Generated bundle index. Do not edit.
894
953
  */
895
954
 
896
- export { NeuSelectComponent, NeuSelectItemDirective, NeuSelectSelectedDirective };
955
+ export { NeuSelectComponent, NeuSelectEmptyDirective, NeuSelectFooterDirective, NeuSelectGroupDirective, NeuSelectHeaderDirective, NeuSelectItemDirective, NeuSelectSelectedDirective };
897
956
  //# sourceMappingURL=neural-ui-core-select.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-select.mjs","sources":["../../../../projects/ui-core/select/neu-select.directives.ts","../../../../projects/ui-core/select/neu-select.component.ts","../../../../projects/ui-core/select/neural-ui-core-select.ts"],"sourcesContent":["import { Directive, TemplateRef, inject } from '@angular/core';\nimport { NeuSelectOption } from './neu-select.types';\n\n/**\n * Directiva para personalizar el template de cada ítem del dropdown.\n *\n * Uso:\n * ```html\n * <neu-select [options]=\"opts\" [formControl]=\"valueCtrl\">\n * <ng-template neuSelectItem let-item>\n * <span class=\"flag flag-{{ item.value }}\"></span>\n * {{ item.label }}\n * </ng-template>\n * </neu-select>\n * ```\n */\n@Directive({ selector: '[neuSelectItem]', standalone: true })\nexport class NeuSelectItemDirective {\n readonly templateRef = inject<TemplateRef<{ $implicit: NeuSelectOption }>>(TemplateRef);\n}\n\n/**\n * Directiva para personalizar el template del ítem seleccionado (trigger).\n *\n * Uso:\n * ```html\n * <neu-select [options]=\"opts\" [formControl]=\"valueCtrl\">\n * <ng-template neuSelectSelected let-item>\n * <strong>{{ item?.label }}</strong>\n * </ng-template>\n * </neu-select>\n * ```\n */\n@Directive({ selector: '[neuSelectSelected]', standalone: true })\nexport class NeuSelectSelectedDirective {\n readonly templateRef = inject<TemplateRef<{ $implicit: NeuSelectOption | null }>>(TemplateRef);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n PLATFORM_ID,\n Signal,\n ViewEncapsulation,\n computed,\n contentChild,\n effect,\n forwardRef,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { NeuUrlStateService } from '@neural-ui/core/url-state';\nimport { DOCUMENT, isPlatformBrowser, NgTemplateOutlet } from '@angular/common';\nimport {\n ConnectedOverlayPositionChange,\n ConnectedPosition,\n Overlay,\n OverlayModule,\n} from '@angular/cdk/overlay';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NeuSelectOption } from './neu-select.types';\nimport { NeuSelectItemDirective, NeuSelectSelectedDirective } from './neu-select.directives';\n\nexport type { NeuSelectOption } from './neu-select.types';\n\nlet _neuSelectIdSeq = 0;\n\n/**\n * NeuralUI Select Component\n *\n * Dropdown personalizado con soporte para ControlValueAccessor y Reactive Forms.\n * Puede usarse dentro de un FormGroup o con un FormControl standalone.\n * Cierra automáticamente al hacer clic fuera del componente.\n *\n * Uso:\n * readonly countryCtrl = new FormControl<string | null>(null);\n * <neu-select label=\"País\" [options]=\"paises\" [formControl]=\"countryCtrl\" />\n *\n * Uso standalone fuera de un formulario completo:\n * readonly sortCtrl = new FormControl<string | null>('name');\n * <neu-select label=\"Orden\" [options]=\"sortOptions\" [formControl]=\"sortCtrl\" />\n */\n@Component({\n selector: 'neu-select',\n imports: [NgTemplateOutlet, OverlayModule, ScrollingModule],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuSelectComponent),\n multi: true,\n },\n ],\n host: {\n '(keydown.escape)': 'close()',\n '(window:resize)': 'onWindowResize()',\n },\n template: `\n @if (!floatingLabel() && label()) {\n <label class=\"neu-select__static-label\" [for]=\"_triggerId\" (click)=\"focusTrigger()\">{{\n label()\n }}</label>\n }\n <div\n class=\"neu-select\"\n [class.neu-select--open]=\"isOpen()\"\n [class.neu-select--open-above]=\"isPanelAbove()\"\n [class.neu-select--disabled]=\"isDisabledFinal()\"\n [class.neu-select--error]=\"hasError()\"\n [class.neu-select--has-value]=\"!!_value()\"\n [class.neu-select--has-placeholder]=\"!!placeholder() && !_value()\"\n [class.neu-select--no-float]=\"!floatingLabel()\"\n [class.neu-select--sm]=\"size() === 'sm'\"\n [class.neu-select--lg]=\"size() === 'lg'\"\n [style.--neu-select-option-height]=\"virtualScrollItemSize() + 'px'\"\n >\n <!-- Trigger ------>\n <div\n cdkOverlayOrigin\n #selectOrigin=\"cdkOverlayOrigin\"\n class=\"neu-select__trigger\"\n [id]=\"_triggerId\"\n [attr.tabindex]=\"isDisabledFinal() ? '-1' : '0'\"\n [attr.role]=\"'combobox'\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen() ? 'true' : 'false'\"\n [attr.aria-controls]=\"_panelId\"\n [attr.aria-disabled]=\"isDisabledFinal() ? 'true' : null\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-activedescendant]=\"isOpen() && _value() ? 'neu-select-opt-' + _value() : null\"\n [attr.aria-label]=\"label() || placeholder() || null\"\n (click)=\"toggle()\"\n (keydown.arrowDown)=\"onTriggerKey($any($event))\"\n (keydown.arrowUp)=\"onTriggerKey($any($event))\"\n (keydown.enter)=\"onTriggerActionKey($any($event))\"\n (keydown.space)=\"onTriggerActionKey($any($event))\"\n >\n <!-- Floating label -->\n @if (floatingLabel() && label()) {\n <span class=\"neu-select__label\">{{ label() }}</span>\n }\n\n <span class=\"neu-select__value\">\n @if (selectedLabel()) {\n @if (selectedItemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"selectedItemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: _selectedOption() }\"\n />\n } @else {\n {{ selectedLabel() }}\n }\n } @else {\n <span class=\"neu-select__placeholder\">{{ placeholder() }}</span>\n }\n </span>\n\n <!-- Clear button -->\n @if (clearable() && !!_value() && !isDisabledFinal()) {\n <button\n class=\"neu-select__clear\"\n type=\"button\"\n aria-label=\"Limpiar selección\"\n [attr.aria-label]=\"clearAriaLabel()\"\n (click)=\"clearValue($event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n }\n\n <!-- Chevron -->\n <svg\n class=\"neu-select__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </div>\n\n <!-- Panel ------>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"selectOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayWidth]=\"panelPosition().width ?? ''\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"_viewportMargin\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n (positionChange)=\"onOverlayPositionChange($event)\"\n >\n <div\n class=\"neu-select__panel\"\n [class.neu-select__panel--above]=\"isPanelAbove()\"\n [class.neu-select__panel--virtual]=\"virtualScroll()\"\n role=\"listbox\"\n [id]=\"_panelId\"\n [attr.aria-label]=\"label()\"\n [style.width]=\"panelPosition().width\"\n [style.max-height]=\"panelPosition().maxHeight\"\n >\n <ng-template #selectOptionTpl let-option>\n <div\n class=\"neu-select__option\"\n [class.neu-select__option--selected]=\"option.value === _value()\"\n [class.neu-select__option--disabled]=\"option.disabled\"\n role=\"option\"\n [id]=\"'neu-select-opt-' + option.value\"\n [attr.aria-selected]=\"option.value === _value()\"\n [attr.aria-disabled]=\"option.disabled\"\n [attr.tabindex]=\"option.disabled ? null : '-1'\"\n (click)=\"selectOption(option)\"\n (keydown.enter)=\"selectOption(option)\"\n (keydown.space)=\"selectOption(option)\"\n (keydown.arrowDown)=\"focusOptionByIndex($any($event), option, 1)\"\n (keydown.arrowUp)=\"focusOptionByIndex($any($event), option, -1)\"\n >\n <!-- Checkmark en la seleccionada (siempre reserva el espacio) -->\n <svg\n class=\"neu-select__check\"\n [style.visibility]=\"option.value === _value() ? 'visible' : 'hidden'\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n } @else {\n {{ option.label }}\n }\n </div>\n </ng-template>\n\n @if (searchable()) {\n <div class=\"neu-select__search\">\n <input\n class=\"neu-select__search-input\"\n type=\"text\"\n [attr.aria-label]=\"'Search ' + label()\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchQuery()\"\n (input)=\"searchQuery.set($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n }\n @if (loading()) {\n <div class=\"neu-select__empty\" role=\"status\">{{ loadingLabel() }}</div>\n } @else if (virtualScroll()) {\n <cdk-virtual-scroll-viewport\n class=\"neu-select__viewport\"\n [itemSize]=\"virtualScrollItemSize()\"\n [style.height]=\"virtualViewportHeight()\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackByOptionValue\">\n <ng-container\n [ngTemplateOutlet]=\"selectOptionTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n } @else {\n @for (option of filteredOptions(); track option.value) {\n <ng-container\n [ngTemplateOutlet]=\"selectOptionTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n }\n }\n @if (!loading() && filteredOptions().length === 0) {\n <div class=\"neu-select__empty\">{{ noResultsMessage() }}</div>\n }\n </div>\n </ng-template>\n <div class=\"neu-select__sr-status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ resultsAnnouncement() }}\n </div>\n </div>\n\n <!-- Error / hint -->\n @if (hasError()) {\n <p class=\"neu-select__error\" [id]=\"_triggerId + '-error'\" role=\"alert\">\n {{ errorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-select__hint\" [id]=\"_triggerId + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-select.component.scss',\n})\nexport class NeuSelectComponent implements ControlValueAccessor {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _document = inject(DOCUMENT);\n private readonly _platformId = inject(PLATFORM_ID);\n private readonly _overlay = inject(Overlay);\n private readonly _urlState = inject(NeuUrlStateService);\n readonly _viewportMargin = 16;\n private readonly _panelMaxHeight = 240;\n private readonly _urlParamSignals = new Map<string, Signal<string | null>>();\n private readonly _viewport = viewChild(CdkVirtualScrollViewport);\n\n private _getUrlParamSignal(key: string): Signal<string | null> {\n let paramSignal = this._urlParamSignals.get(key);\n if (!paramSignal) {\n paramSignal = this._urlState.getParam(key);\n this._urlParamSignals.set(key, paramSignal);\n }\n return paramSignal;\n }\n\n constructor() {\n effect(() => {\n const param = this.urlParam();\n if (!param) return;\n const urlVal = this._getUrlParamSignal(param)();\n if (urlVal !== untracked(() => this._value())) {\n untracked(() => {\n this._value.set(urlVal);\n this._onChange(urlVal);\n });\n }\n });\n }\n /** @internal — ID \\u00fanico para asociar label con trigger */\n readonly _triggerId = `neu-select-trigger-${_neuSelectIdSeq++}`;\n readonly _panelId = `${this._triggerId}-panel`;\n /** Template personalizado para cada opción del dropdown / Custom template for each dropdown option */\n readonly itemTpl = contentChild(NeuSelectItemDirective);\n\n /** Template personalizado para el valor seleccionado en el trigger / Custom template for the selected value in the trigger */\n readonly selectedItemTpl = contentChild(NeuSelectSelectedDirective);\n /** Opciones del dropdown / Dropdown options */\n options = input<NeuSelectOption[]>([]);\n\n /** Texto del floating label / Floating label text */\n label = input<string>('');\n\n /** Placeholder cuando no hay selección / Placeholder when there is no selection */\n placeholder = input<string>('Seleccionar...');\n\n /** Mensaje de error / Error message */\n errorMessage = input<string>('');\n\n /** Texto de ayuda bajo el campo / Helper text below the field */\n hint = input<string>('');\n\n /** Deshabilita el select / Disables the select */\n disabled = input<boolean>(false);\n\n /** Muestra el label como flotante (true) o como label estático encima (false, por defecto) / Shows the label as floating (true) or static above (false, default) */\n floatingLabel = input<boolean>(false);\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n size = input<'sm' | 'md' | 'lg'>('md');\n /** Activa input de búsqueda/filtro en el panel / Activates the search/filter input in the panel */\n searchable = input<boolean>(false);\n\n /** Placeholder del input de búsqueda / Search input placeholder */\n searchPlaceholder = input<string>('Buscar...');\n\n /** Muestra estado de carga dentro del panel / Shows a loading state inside the panel */\n loading = input<boolean>(false);\n\n /** Texto del estado de carga / Loading state text */\n loadingLabel = input<string>('Loading...');\n\n /** Muestra un botón para limpiar la selección / Shows a button to clear the selection */\n clearable = input<boolean>(false);\n\n /** Habilita scroll virtual para listas largas / Enables virtual scrolling for large option lists */\n virtualScroll = input<boolean>(false);\n\n /** Número de opciones visibles en el viewport virtual / Number of visible options in the virtual viewport */\n virtualScrollVisibleItems = input<number>(8);\n\n /** Texto cuando no hay opciones tras filtrar / Text when no options remain after filtering */\n noResultsMessage = input<string>('Sin resultados');\n\n /** Aria-label del botón de limpiar / Aria-label for the clear button */\n clearAriaLabel = input<string>('Limpiar selección');\n\n /**\n * Sincroniza el valor seleccionado con este query param de la URL.\n * Al seleccionar una opción se añade `?{urlParam}=value` a la URL.\n * Pasar `null` (default) deshabilita la sincronización.\n */\n urlParam = input<string | null>(null);\n\n /**\n * Emite el objeto NeuSelectOption completo (incluyendo data) al seleccionar una opción.\n * Emite null al limpiar la selección.\n * El valor del formControl sigue siendo string.\n */\n readonly selectionChange = output<NeuSelectOption | null>();\n\n // Estado interno\n protected readonly _value = signal<string | null>(null);\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly overlayPositions: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -6,\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -6,\n },\n ];\n readonly overlayScrollStrategy = this._overlay.scrollStrategies.reposition();\n readonly panelPosition = signal<{\n position: string | null;\n top: string | null;\n bottom: string | null;\n left: string | null;\n width: string | null;\n maxHeight: string | null;\n }>({\n position: null,\n top: null,\n bottom: null,\n left: null,\n width: null,\n maxHeight: null,\n });\n readonly isPanelAbove = signal(false);\n\n readonly hasError = computed(() => !!this.errorMessage());\n\n readonly describedBy = computed(() => {\n if (this.hasError()) {\n return `${this._triggerId}-error`;\n }\n if (this.hint()) {\n return `${this._triggerId}-hint`;\n }\n return null;\n });\n\n readonly filteredOptions = computed(() => {\n const q = this.searchQuery().toLowerCase().trim();\n if (!q) return this.options();\n return this.options().filter((o) => o.label.toLowerCase().includes(q));\n });\n\n readonly selectedLabel = computed(\n () => this.options().find((o) => o.value === this._value())?.label ?? null,\n );\n\n readonly _selectedOption = computed(\n () => this.options().find((o) => o.value === this._value()) ?? null,\n );\n\n readonly resultsAnnouncement = computed(() => {\n if (!this.isOpen()) {\n return '';\n }\n\n const total = this.filteredOptions().length;\n if (!total) {\n return this.noResultsMessage();\n }\n\n return total === 1 ? '1 opción disponible' : `${total} opciones disponibles`;\n });\n\n readonly virtualScrollItemSize = computed(() => {\n switch (this.size()) {\n case 'sm':\n return 36;\n case 'lg':\n return 52;\n default:\n return 44;\n }\n });\n\n readonly virtualViewportHeight = computed(() => {\n const desiredHeight = this.virtualScrollVisibleItems() * this.virtualScrollItemSize();\n const panelMaxHeight = this.panelPosition().maxHeight;\n const searchOffset = this.searchable() ? 52 : 0;\n\n const parsedMaxHeight = panelMaxHeight\n ? Number.parseFloat(panelMaxHeight)\n : this._panelMaxHeight;\n if (Number.isNaN(parsedMaxHeight)) {\n return `${Math.min(desiredHeight, this._panelMaxHeight - searchOffset)}px`;\n }\n\n const effectivePanelMaxHeight = Math.min(this._panelMaxHeight, parsedMaxHeight);\n const availableHeight = Math.max(\n this.virtualScrollItemSize(),\n effectivePanelMaxHeight - searchOffset,\n );\n return `${Math.min(desiredHeight, availableHeight)}px`;\n });\n\n readonly trackByOptionValue = (_index: number, option: NeuSelectOption) => option.value;\n\n // CVA\n private _onChange: (v: string | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: string | null): void {\n this._value.set(val ?? null);\n }\n\n registerOnChange(fn: (v: string | null) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n private readonly _cvaDisabled = signal(false);\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n readonly isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled());\n\n toggle(): void {\n if (this.isDisabledFinal()) return;\n if (!this.isOpen()) {\n this.syncPanelPosition();\n this.isOpen.set(true);\n this.focusFirstOption();\n } else {\n this.isOpen.set(false);\n this.resetPanelPosition();\n }\n }\n\n close(): void {\n this.isOpen.set(false);\n this.searchQuery.set('');\n this.resetPanelPosition();\n this._onTouched();\n }\n\n /** Abre el panel y navega con flechas desde el trigger / Opens the panel and navigates with arrows from the trigger */\n onTriggerKey(event: Event): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n event.preventDefault();\n if (!this.isOpen()) {\n this.syncPanelPosition();\n this.isOpen.set(true);\n this.focusFirstOption();\n }\n }\n\n onTriggerActionKey(event: KeyboardEvent): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n event.preventDefault();\n this.toggle();\n }\n\n focusTrigger(): void {\n this.elementRef.nativeElement.querySelector<HTMLElement>('.neu-select__trigger')?.focus();\n }\n\n /** Navega entre opciones con flechas / Navigates between options with arrows */\n focusOptionByIndex(event: Event, current: NeuSelectOption, dir: 1 | -1): void {\n event.preventDefault();\n const opts = this.filteredOptions().filter((o) => !o.disabled);\n const idx = opts.findIndex((o) => o.value === current.value);\n const next = opts[(idx + dir + opts.length) % opts.length];\n if (next) {\n this.focusOption(next.value);\n }\n }\n\n clearValue(event: MouseEvent): void {\n event.stopPropagation();\n this._value.set(null);\n this._onChange(null);\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, null);\n this._onTouched();\n this.selectionChange.emit(null);\n this.close();\n }\n\n selectOption(option: NeuSelectOption): void {\n if (option.disabled) return;\n this._value.set(option.value);\n this._onChange(option.value);\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, option.value);\n this.selectionChange.emit(option);\n this.close();\n }\n\n onDocumentClick(event: MouseEvent): void {\n const target = event.target as Element | null;\n const isInsideHost = this.elementRef.nativeElement.contains(target);\n const isInsidePanel = !!target?.closest('.neu-select__panel');\n if (!isInsideHost && !isInsidePanel) {\n this.close();\n }\n }\n\n onWindowResize(): void {\n if (this.isOpen()) {\n this.syncPanelPosition();\n }\n }\n\n onWindowScroll(): void {\n if (this.isOpen()) {\n this.syncPanelPosition();\n }\n }\n\n private syncPanelPosition(): void {\n const trigger =\n this.elementRef.nativeElement.querySelector<HTMLElement>('.neu-select__trigger');\n if (!trigger) return;\n\n const triggerRect = trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 6;\n const width = Math.min(triggerRect.width, viewportWidth - this._viewportMargin * 2);\n const availableBelow = Math.max(\n 0,\n viewportHeight - this._viewportMargin - triggerRect.bottom - gap,\n );\n const availableAbove = Math.max(0, triggerRect.top - this._viewportMargin - gap);\n const openAbove = availableAbove > availableBelow && availableAbove >= 140;\n const maxHeight = Math.max(140, openAbove ? availableAbove : availableBelow);\n\n this.panelPosition.set({\n position: 'fixed',\n top: openAbove ? 'auto' : `${triggerRect.bottom + gap}px`,\n bottom: openAbove ? `${viewportHeight - triggerRect.top + gap}px` : 'auto',\n left: `${Math.min(Math.max(triggerRect.left, this._viewportMargin), viewportWidth - width - this._viewportMargin)}px`,\n width: `${width}px`,\n maxHeight: `${maxHeight}px`,\n });\n this.isPanelAbove.set(openAbove);\n\n if (this.virtualScroll()) {\n this._requestFrame(() => this._viewport()?.checkViewportSize());\n }\n }\n\n onOverlayPositionChange(event: ConnectedOverlayPositionChange): void {\n this.isPanelAbove.set(event.connectionPair.overlayY === 'bottom');\n }\n\n private focusFirstOption(): void {\n const firstEnabled = this.filteredOptions().find((option) => !option.disabled);\n if (!firstEnabled) {\n return;\n }\n\n this.focusOption(firstEnabled.value);\n }\n\n private focusOption(value: string): void {\n if (this.virtualScroll()) {\n const optionIndex = this.filteredOptions().findIndex((option) => option.value === value);\n if (optionIndex >= 0) {\n this._viewport()?.scrollToIndex(optionIndex, 'auto');\n this._viewport()?.checkViewportSize();\n }\n this._requestFrame(() => {\n const optionElement = this.elementRef.nativeElement.querySelector<HTMLElement>(\n `#neu-select-opt-${value}`,\n ) ?? this._document.getElementById(`neu-select-opt-${value}`);\n optionElement?.focus();\n });\n return;\n }\n\n const optionElement =\n this.elementRef.nativeElement.querySelector<HTMLElement>(`#neu-select-opt-${value}`) ??\n this._document.getElementById(`neu-select-opt-${value}`);\n optionElement?.focus();\n }\n\n private resetPanelPosition(): void {\n this.panelPosition.set({\n position: null,\n top: null,\n bottom: null,\n left: null,\n width: null,\n maxHeight: null,\n });\n this.isPanelAbove.set(false);\n }\n\n private _requestFrame(callback: FrameRequestCallback): void {\n if (isPlatformBrowser(this._platformId)) {\n requestAnimationFrame(callback);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-select.mjs","sources":["../../../../projects/ui-core/select/neu-select.directives.ts","../../../../projects/ui-core/select/neu-select.component.ts","../../../../projects/ui-core/select/neural-ui-core-select.ts"],"sourcesContent":["import { Directive, TemplateRef, inject } from '@angular/core';\nimport { NeuSelectOption } from './neu-select.types';\n\n/**\n * Directiva para personalizar el template de cada ítem del dropdown.\n *\n * Uso:\n * ```html\n * <neu-select [options]=\"opts\" [formControl]=\"valueCtrl\">\n * <ng-template neuSelectItem let-item>\n * <span class=\"flag flag-{{ item.value }}\"></span>\n * {{ item.label }}\n * </ng-template>\n * </neu-select>\n * ```\n */\n@Directive({ selector: '[neuSelectItem]', standalone: true })\nexport class NeuSelectItemDirective {\n readonly templateRef = inject<TemplateRef<{ $implicit: NeuSelectOption }>>(TemplateRef);\n}\n\n/**\n * Directiva para personalizar el template del ítem seleccionado (trigger).\n *\n * Uso:\n * ```html\n * <neu-select [options]=\"opts\" [formControl]=\"valueCtrl\">\n * <ng-template neuSelectSelected let-item>\n * <strong>{{ item?.label }}</strong>\n * </ng-template>\n * </neu-select>\n * ```\n */\n@Directive({ selector: '[neuSelectSelected]', standalone: true })\nexport class NeuSelectSelectedDirective {\n readonly templateRef = inject<TemplateRef<{ $implicit: NeuSelectOption | null }>>(TemplateRef);\n}\n\n/** Optional content slots for the select panel. */\n@Directive({ selector: '[neuSelectHeader]', standalone: true })\nexport class NeuSelectHeaderDirective { readonly templateRef = inject<TemplateRef<void>>(TemplateRef); }\n@Directive({ selector: '[neuSelectFooter]', standalone: true })\nexport class NeuSelectFooterDirective { readonly templateRef = inject<TemplateRef<void>>(TemplateRef); }\n@Directive({ selector: '[neuSelectEmpty]', standalone: true })\nexport class NeuSelectEmptyDirective { readonly templateRef = inject<TemplateRef<void>>(TemplateRef); }\n@Directive({ selector: '[neuSelectGroup]', standalone: true })\nexport class NeuSelectGroupDirective { readonly templateRef = inject<TemplateRef<{ $implicit: string }>>(TemplateRef); }\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n PLATFORM_ID,\n Signal,\n ViewEncapsulation,\n computed,\n contentChild,\n effect,\n forwardRef,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { NeuUrlStateService } from '@neural-ui/core/url-state';\nimport { DOCUMENT, isPlatformBrowser, NgTemplateOutlet } from '@angular/common';\nimport {\n ConnectedOverlayPositionChange,\n ConnectedPosition,\n Overlay,\n OverlayModule,\n} from '@angular/cdk/overlay';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NeuSelectOption } from './neu-select.types';\nimport { NeuSelectEmptyDirective, NeuSelectFooterDirective, NeuSelectGroupDirective, NeuSelectHeaderDirective, NeuSelectItemDirective, NeuSelectSelectedDirective } from './neu-select.directives';\n\nexport type { NeuSelectOption } from './neu-select.types';\n\nlet _neuSelectIdSeq = 0;\n\n/**\n * NeuralUI Select Component\n *\n * Dropdown personalizado con soporte para ControlValueAccessor y Reactive Forms.\n * Puede usarse dentro de un FormGroup o con un FormControl standalone.\n * Cierra automáticamente al hacer clic fuera del componente.\n *\n * Uso:\n * readonly countryCtrl = new FormControl<string | null>(null);\n * <neu-select label=\"País\" [options]=\"paises\" [formControl]=\"countryCtrl\" />\n *\n * Uso standalone fuera de un formulario completo:\n * readonly sortCtrl = new FormControl<string | null>('name');\n * <neu-select label=\"Orden\" [options]=\"sortOptions\" [formControl]=\"sortCtrl\" />\n */\n@Component({\n selector: 'neu-select',\n imports: [NgTemplateOutlet, OverlayModule, ScrollingModule],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuSelectComponent),\n multi: true,\n },\n ],\n host: {\n '(keydown.escape)': 'close()',\n '(window:resize)': 'onWindowResize()',\n },\n template: `\n @if (!floatingLabel() && label()) {\n <label class=\"neu-select__static-label\" [for]=\"_triggerId\" (click)=\"focusTrigger()\">{{\n label()\n }}</label>\n }\n <div\n class=\"neu-select\"\n [class.neu-select--open]=\"isOpen()\"\n [class.neu-select--open-above]=\"isPanelAbove()\"\n [class.neu-select--disabled]=\"isDisabledFinal()\"\n [class.neu-select--error]=\"hasError()\"\n [class.neu-select--has-value]=\"!!_value()\"\n [class.neu-select--has-placeholder]=\"!!placeholder() && !_value()\"\n [class.neu-select--no-float]=\"!floatingLabel()\"\n [class.neu-select--sm]=\"size() === 'sm'\"\n [class.neu-select--lg]=\"size() === 'lg'\"\n [style.--neu-select-option-height]=\"virtualScrollItemSize() + 'px'\"\n >\n <!-- Trigger ------>\n <div\n cdkOverlayOrigin\n #selectOrigin=\"cdkOverlayOrigin\"\n class=\"neu-select__trigger\"\n [id]=\"_triggerId\"\n [attr.tabindex]=\"isDisabledFinal() ? '-1' : '0'\"\n [attr.role]=\"'combobox'\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen() ? 'true' : 'false'\"\n [attr.aria-controls]=\"_panelId\"\n [attr.aria-disabled]=\"isDisabledFinal() ? 'true' : null\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-activedescendant]=\"isOpen() && _value() ? 'neu-select-opt-' + _value() : null\"\n [attr.aria-label]=\"label() || placeholder() || null\"\n (click)=\"toggle()\"\n (keydown.arrowDown)=\"onTriggerKey($any($event))\"\n (keydown.arrowUp)=\"onTriggerKey($any($event))\"\n (keydown.enter)=\"onTriggerActionKey($any($event))\"\n (keydown.space)=\"onTriggerActionKey($any($event))\"\n >\n <!-- Floating label -->\n @if (floatingLabel() && label()) {\n <span class=\"neu-select__label\">{{ label() }}</span>\n }\n\n <span class=\"neu-select__value\">\n @if (selectedLabel()) {\n @if (selectedItemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"selectedItemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: _selectedOption() }\"\n />\n } @else {\n {{ selectedLabel() }}\n }\n } @else {\n <span class=\"neu-select__placeholder\">{{ placeholder() }}</span>\n }\n </span>\n\n <!-- Clear button -->\n @if (clearable() && !!_value() && !isDisabledFinal()) {\n <button\n class=\"neu-select__clear\"\n type=\"button\"\n aria-label=\"Limpiar selección\"\n [attr.aria-label]=\"clearAriaLabel()\"\n (click)=\"clearValue($event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n }\n\n <!-- Chevron -->\n <svg\n class=\"neu-select__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n @if (headerTpl()) { <ng-container [ngTemplateOutlet]=\"headerTpl()!.templateRef\" /> }\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </div>\n\n <!-- Panel ------>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"selectOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayWidth]=\"panelPosition().width ?? ''\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"_viewportMargin\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n (positionChange)=\"onOverlayPositionChange($event)\"\n >\n <div\n class=\"neu-select__panel\"\n [class.neu-select__panel--above]=\"isPanelAbove()\"\n [class.neu-select__panel--virtual]=\"virtualScroll()\"\n role=\"listbox\"\n [id]=\"_panelId\"\n [attr.aria-label]=\"label()\"\n [style.width]=\"panelPosition().width\"\n [style.max-height]=\"panelPosition().maxHeight\"\n >\n <ng-template #selectOptionTpl let-option>\n <div\n class=\"neu-select__option\"\n [class.neu-select__option--selected]=\"option.value === _value()\"\n [class.neu-select__option--disabled]=\"option.disabled\"\n role=\"option\"\n [id]=\"'neu-select-opt-' + option.value\"\n [attr.aria-selected]=\"option.value === _value()\"\n [attr.aria-disabled]=\"option.disabled\"\n [attr.tabindex]=\"option.disabled ? null : '-1'\"\n (click)=\"selectOption(option)\"\n (keydown.enter)=\"selectOption(option)\"\n (keydown.space)=\"selectOption(option)\"\n (keydown.arrowDown)=\"focusOptionByIndex($any($event), option, 1)\"\n (keydown.arrowUp)=\"focusOptionByIndex($any($event), option, -1)\"\n >\n <!-- Checkmark en la seleccionada (siempre reserva el espacio) -->\n <svg\n class=\"neu-select__check\"\n [style.visibility]=\"option.value === _value() ? 'visible' : 'hidden'\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n } @else {\n {{ option.label }}\n }\n </div>\n </ng-template>\n\n @if (searchable()) {\n <div class=\"neu-select__search\">\n <input\n class=\"neu-select__search-input\"\n type=\"text\"\n [attr.aria-label]=\"'Search ' + label()\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchQuery()\"\n (input)=\"searchQuery.set($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n }\n @if (loading()) {\n <div class=\"neu-select__empty\" role=\"status\">{{ loadingLabel() }}</div>\n } @else if (virtualScroll()) {\n <cdk-virtual-scroll-viewport\n class=\"neu-select__viewport\"\n [itemSize]=\"virtualScrollItemSize()\"\n [style.height]=\"virtualViewportHeight()\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackByOptionValue\">\n <ng-container\n [ngTemplateOutlet]=\"selectOptionTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n } @else {\n @for (option of filteredOptions(); track option.value) {\n @if (option.group && option.group !== previousGroup(option)) {\n @if (groupTpl()) { <ng-container [ngTemplateOutlet]=\"groupTpl()!.templateRef\" [ngTemplateOutletContext]=\"{ $implicit: option.group }\" /> }\n @else { <div class=\"neu-select__group\">{{ option.group }}</div> }\n }\n <ng-container\n [ngTemplateOutlet]=\"selectOptionTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n }\n }\n @if (!loading() && filteredOptions().length === 0) {\n @if (emptyTpl()) { <ng-container [ngTemplateOutlet]=\"emptyTpl()!.templateRef\" /> }\n @else { <div class=\"neu-select__empty\">{{ noResultsMessage() }}</div> }\n }\n @if (footerTpl()) { <ng-container [ngTemplateOutlet]=\"footerTpl()!.templateRef\" /> }\n </div>\n </ng-template>\n <div class=\"neu-select__sr-status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ resultsAnnouncement() }}\n </div>\n </div>\n\n <!-- Error / hint -->\n @if (hasError()) {\n <p class=\"neu-select__error\" [id]=\"_triggerId + '-error'\" role=\"alert\">\n {{ errorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-select__hint\" [id]=\"_triggerId + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-select.component.scss',\n})\nexport class NeuSelectComponent implements ControlValueAccessor {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _document = inject(DOCUMENT);\n private readonly _platformId = inject(PLATFORM_ID);\n private readonly _overlay = inject(Overlay);\n private readonly _urlState = inject(NeuUrlStateService);\n readonly _viewportMargin = 16;\n private readonly _panelMaxHeight = 240;\n private readonly _urlParamSignals = new Map<string, Signal<string | null>>();\n private readonly _viewport = viewChild(CdkVirtualScrollViewport);\n\n private _getUrlParamSignal(key: string): Signal<string | null> {\n let paramSignal = this._urlParamSignals.get(key);\n if (!paramSignal) {\n paramSignal = this._urlState.getParam(key);\n this._urlParamSignals.set(key, paramSignal);\n }\n return paramSignal;\n }\n\n constructor() {\n effect(() => {\n const param = this.urlParam();\n if (!param) return;\n const urlVal = this._getUrlParamSignal(param)();\n if (urlVal !== untracked(() => this._value())) {\n untracked(() => {\n this._value.set(urlVal);\n this._onChange(urlVal);\n });\n }\n });\n }\n /** @internal — ID \\u00fanico para asociar label con trigger */\n readonly _triggerId = `neu-select-trigger-${_neuSelectIdSeq++}`;\n readonly _panelId = `${this._triggerId}-panel`;\n /** Template personalizado para cada opción del dropdown / Custom template for each dropdown option */\n readonly itemTpl = contentChild(NeuSelectItemDirective);\n\n /** Template personalizado para el valor seleccionado en el trigger / Custom template for the selected value in the trigger */\n readonly selectedItemTpl = contentChild(NeuSelectSelectedDirective);\n readonly headerTpl = contentChild(NeuSelectHeaderDirective);\n readonly footerTpl = contentChild(NeuSelectFooterDirective);\n readonly emptyTpl = contentChild(NeuSelectEmptyDirective);\n readonly groupTpl = contentChild(NeuSelectGroupDirective);\n /** Opciones del dropdown / Dropdown options */\n options = input<NeuSelectOption[]>([]);\n\n /** Texto del floating label / Floating label text */\n label = input<string>('');\n\n /** Placeholder cuando no hay selección / Placeholder when there is no selection */\n placeholder = input<string>('Seleccionar...');\n\n /** Mensaje de error / Error message */\n errorMessage = input<string>('');\n\n /** Texto de ayuda bajo el campo / Helper text below the field */\n hint = input<string>('');\n\n /** Deshabilita el select / Disables the select */\n disabled = input<boolean>(false);\n\n /** Muestra el label como flotante (true) o como label estático encima (false, por defecto) / Shows the label as floating (true) or static above (false, default) */\n floatingLabel = input<boolean>(false);\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n size = input<'sm' | 'md' | 'lg'>('md');\n /** Activa input de búsqueda/filtro en el panel / Activates the search/filter input in the panel */\n searchable = input<boolean>(false);\n\n /** Placeholder del input de búsqueda / Search input placeholder */\n searchPlaceholder = input<string>('Buscar...');\n\n /** Muestra estado de carga dentro del panel / Shows a loading state inside the panel */\n loading = input<boolean>(false);\n\n /** Texto del estado de carga / Loading state text */\n loadingLabel = input<string>('Loading...');\n\n /** Muestra un botón para limpiar la selección / Shows a button to clear the selection */\n clearable = input<boolean>(false);\n\n /** Habilita scroll virtual para listas largas / Enables virtual scrolling for large option lists */\n virtualScroll = input<boolean>(false);\n\n /** Número de opciones visibles en el viewport virtual / Number of visible options in the virtual viewport */\n virtualScrollVisibleItems = input<number>(8);\n\n /** Texto cuando no hay opciones tras filtrar / Text when no options remain after filtering */\n noResultsMessage = input<string>('Sin resultados');\n\n /** Aria-label del botón de limpiar / Aria-label for the clear button */\n clearAriaLabel = input<string>('Limpiar selección');\n\n /**\n * Sincroniza el valor seleccionado con este query param de la URL.\n * Al seleccionar una opción se añade `?{urlParam}=value` a la URL.\n * Pasar `null` (default) deshabilita la sincronización.\n */\n urlParam = input<string | null>(null);\n\n /**\n * Emite el objeto NeuSelectOption completo (incluyendo data) al seleccionar una opción.\n * Emite null al limpiar la selección.\n * El valor del formControl sigue siendo string.\n */\n readonly selectionChange = output<NeuSelectOption | null>();\n\n // Estado interno\n protected readonly _value = signal<string | null>(null);\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly overlayPositions: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -6,\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -6,\n },\n ];\n readonly overlayScrollStrategy = this._overlay.scrollStrategies.reposition();\n readonly panelPosition = signal<{\n position: string | null;\n top: string | null;\n bottom: string | null;\n left: string | null;\n width: string | null;\n maxHeight: string | null;\n }>({\n position: null,\n top: null,\n bottom: null,\n left: null,\n width: null,\n maxHeight: null,\n });\n readonly isPanelAbove = signal(false);\n\n readonly hasError = computed(() => !!this.errorMessage());\n\n readonly describedBy = computed(() => {\n if (this.hasError()) {\n return `${this._triggerId}-error`;\n }\n if (this.hint()) {\n return `${this._triggerId}-hint`;\n }\n return null;\n });\n\n readonly filteredOptions = computed(() => {\n const q = this.searchQuery().toLowerCase().trim();\n if (!q) return this.options();\n return this.options().filter((o) => o.label.toLowerCase().includes(q));\n });\n\n previousGroup(option: NeuSelectOption): string | undefined {\n const index = this.filteredOptions().indexOf(option);\n return index > 0 ? this.filteredOptions()[index - 1]?.group : undefined;\n }\n\n readonly selectedLabel = computed(\n () => this.options().find((o) => o.value === this._value())?.label ?? null,\n );\n\n readonly _selectedOption = computed(\n () => this.options().find((o) => o.value === this._value()) ?? null,\n );\n\n readonly resultsAnnouncement = computed(() => {\n if (!this.isOpen()) {\n return '';\n }\n\n const total = this.filteredOptions().length;\n if (!total) {\n return this.noResultsMessage();\n }\n\n return total === 1 ? '1 opción disponible' : `${total} opciones disponibles`;\n });\n\n readonly virtualScrollItemSize = computed(() => {\n switch (this.size()) {\n case 'sm':\n return 36;\n case 'lg':\n return 52;\n default:\n return 44;\n }\n });\n\n readonly virtualViewportHeight = computed(() => {\n const desiredHeight = this.virtualScrollVisibleItems() * this.virtualScrollItemSize();\n const panelMaxHeight = this.panelPosition().maxHeight;\n const searchOffset = this.searchable() ? 52 : 0;\n\n const parsedMaxHeight = panelMaxHeight\n ? Number.parseFloat(panelMaxHeight)\n : this._panelMaxHeight;\n if (Number.isNaN(parsedMaxHeight)) {\n return `${Math.min(desiredHeight, this._panelMaxHeight - searchOffset)}px`;\n }\n\n const effectivePanelMaxHeight = Math.min(this._panelMaxHeight, parsedMaxHeight);\n const availableHeight = Math.max(\n this.virtualScrollItemSize(),\n effectivePanelMaxHeight - searchOffset,\n );\n return `${Math.min(desiredHeight, availableHeight)}px`;\n });\n\n readonly trackByOptionValue = (_index: number, option: NeuSelectOption) => option.value;\n\n // CVA\n private _onChange: (v: string | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: string | null): void {\n this._value.set(val ?? null);\n }\n\n registerOnChange(fn: (v: string | null) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n private readonly _cvaDisabled = signal(false);\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n readonly isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled());\n\n toggle(): void {\n if (this.isDisabledFinal()) return;\n if (!this.isOpen()) {\n this.syncPanelPosition();\n this.isOpen.set(true);\n this.focusFirstOption();\n } else {\n this.isOpen.set(false);\n this.resetPanelPosition();\n }\n }\n\n close(): void {\n this.isOpen.set(false);\n this.searchQuery.set('');\n this.resetPanelPosition();\n this._onTouched();\n }\n\n /** Abre el panel y navega con flechas desde el trigger / Opens the panel and navigates with arrows from the trigger */\n onTriggerKey(event: Event): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n event.preventDefault();\n if (!this.isOpen()) {\n this.syncPanelPosition();\n this.isOpen.set(true);\n this.focusFirstOption();\n }\n }\n\n onTriggerActionKey(event: KeyboardEvent): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n event.preventDefault();\n this.toggle();\n }\n\n focusTrigger(): void {\n this.elementRef.nativeElement.querySelector<HTMLElement>('.neu-select__trigger')?.focus();\n }\n\n /** Navega entre opciones con flechas / Navigates between options with arrows */\n focusOptionByIndex(event: Event, current: NeuSelectOption, dir: 1 | -1): void {\n event.preventDefault();\n const opts = this.filteredOptions().filter((o) => !o.disabled);\n const idx = opts.findIndex((o) => o.value === current.value);\n const next = opts[(idx + dir + opts.length) % opts.length];\n if (next) {\n this.focusOption(next.value);\n }\n }\n\n clearValue(event: MouseEvent): void {\n event.stopPropagation();\n this._value.set(null);\n this._onChange(null);\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, null);\n this._onTouched();\n this.selectionChange.emit(null);\n this.close();\n }\n\n selectOption(option: NeuSelectOption): void {\n if (option.disabled) return;\n this._value.set(option.value);\n this._onChange(option.value);\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, option.value);\n this.selectionChange.emit(option);\n this.close();\n }\n\n onDocumentClick(event: MouseEvent): void {\n const target = event.target as Element | null;\n const isInsideHost = this.elementRef.nativeElement.contains(target);\n const isInsidePanel = !!target?.closest('.neu-select__panel');\n if (!isInsideHost && !isInsidePanel) {\n this.close();\n }\n }\n\n onWindowResize(): void {\n if (this.isOpen()) {\n this.syncPanelPosition();\n }\n }\n\n onWindowScroll(): void {\n if (this.isOpen()) {\n this.syncPanelPosition();\n }\n }\n\n private syncPanelPosition(): void {\n const trigger =\n this.elementRef.nativeElement.querySelector<HTMLElement>('.neu-select__trigger');\n if (!trigger) return;\n\n const triggerRect = trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 6;\n const width = Math.min(triggerRect.width, viewportWidth - this._viewportMargin * 2);\n const availableBelow = Math.max(\n 0,\n viewportHeight - this._viewportMargin - triggerRect.bottom - gap,\n );\n const availableAbove = Math.max(0, triggerRect.top - this._viewportMargin - gap);\n const openAbove = availableAbove > availableBelow && availableAbove >= 140;\n const maxHeight = Math.max(140, openAbove ? availableAbove : availableBelow);\n\n this.panelPosition.set({\n position: 'fixed',\n top: openAbove ? 'auto' : `${triggerRect.bottom + gap}px`,\n bottom: openAbove ? `${viewportHeight - triggerRect.top + gap}px` : 'auto',\n left: `${Math.min(Math.max(triggerRect.left, this._viewportMargin), viewportWidth - width - this._viewportMargin)}px`,\n width: `${width}px`,\n maxHeight: `${maxHeight}px`,\n });\n this.isPanelAbove.set(openAbove);\n\n if (this.virtualScroll()) {\n this._requestFrame(() => this._viewport()?.checkViewportSize());\n }\n }\n\n onOverlayPositionChange(event: ConnectedOverlayPositionChange): void {\n this.isPanelAbove.set(event.connectionPair.overlayY === 'bottom');\n }\n\n private focusFirstOption(): void {\n const firstEnabled = this.filteredOptions().find((option) => !option.disabled);\n if (!firstEnabled) {\n return;\n }\n\n this.focusOption(firstEnabled.value);\n }\n\n private focusOption(value: string): void {\n if (this.virtualScroll()) {\n const optionIndex = this.filteredOptions().findIndex((option) => option.value === value);\n if (optionIndex >= 0) {\n this._viewport()?.scrollToIndex(optionIndex, 'auto');\n this._viewport()?.checkViewportSize();\n }\n this._requestFrame(() => {\n const optionElement = this.elementRef.nativeElement.querySelector<HTMLElement>(\n `#neu-select-opt-${value}`,\n ) ?? this._document.getElementById(`neu-select-opt-${value}`);\n optionElement?.focus();\n });\n return;\n }\n\n const optionElement =\n this.elementRef.nativeElement.querySelector<HTMLElement>(`#neu-select-opt-${value}`) ??\n this._document.getElementById(`neu-select-opt-${value}`);\n optionElement?.focus();\n }\n\n private resetPanelPosition(): void {\n this.panelPosition.set({\n position: null,\n top: null,\n bottom: null,\n left: null,\n width: null,\n maxHeight: null,\n });\n this.isPanelAbove.set(false);\n }\n\n private _requestFrame(callback: FrameRequestCallback): void {\n if (isPlatformBrowser(this._platformId)) {\n requestAnimationFrame(callback);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;;;AAGA;;;;;;;;;;;;AAYG;MAEU,sBAAsB,CAAA;AACxB,IAAA,WAAW,GAAG,MAAM,CAA8C,WAAW,CAAC;wGAD5E,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,IAAI,EAAE;;AAK5D;;;;;;;;;;;AAWG;MAEU,0BAA0B,CAAA;AAC5B,IAAA,WAAW,GAAG,MAAM,CAAqD,WAAW,CAAC;wGADnF,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,QAAQ,EAAE,qBAAqB,EAAE,UAAU,EAAE,IAAI,EAAE;;AAKhE;MAEa,wBAAwB,CAAA;AAAY,IAAA,WAAW,GAAG,MAAM,CAAoB,WAAW,CAAC;wGAAxF,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,QAAQ,EAAE,mBAAmB,EAAE,UAAU,EAAE,IAAI,EAAE;;MAGjD,wBAAwB,CAAA;AAAY,IAAA,WAAW,GAAG,MAAM,CAAoB,WAAW,CAAC;wGAAxF,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,QAAQ,EAAE,mBAAmB,EAAE,UAAU,EAAE,IAAI,EAAE;;MAGjD,uBAAuB,CAAA;AAAY,IAAA,WAAW,GAAG,MAAM,CAAoB,WAAW,CAAC;wGAAvF,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,IAAI,EAAE;;MAGhD,uBAAuB,CAAA;AAAY,IAAA,WAAW,GAAG,MAAM,CAAqC,WAAW,CAAC;wGAAxG,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,IAAI,EAAE;;;ACZ7D,IAAI,eAAe,GAAG,CAAC;AAEvB;;;;;;;;;;;;;;AAcG;MAuPU,kBAAkB,CAAA;AACZ,IAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AACxD,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;AAC1B,IAAA,SAAS,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAC9C,eAAe,GAAG,EAAE;IACZ,eAAe,GAAG,GAAG;AACrB,IAAA,gBAAgB,GAAG,IAAI,GAAG,EAAiC;AAC3D,IAAA,SAAS,GAAG,SAAS,CAAC,wBAAwB,gFAAC;AAExD,IAAA,kBAAkB,CAAC,GAAW,EAAA;QACpC,IAAI,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC;QAChD,IAAI,CAAC,WAAW,EAAE;YAChB,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC1C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC;QAC7C;AACA,QAAA,OAAO,WAAW;IACpB;AAEA,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,YAAA,IAAI,CAAC,KAAK;gBAAE;YACZ,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC/C,YAAA,IAAI,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;gBAC7C,SAAS,CAAC,MAAK;AACb,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,oBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;AACxB,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;IACJ;;AAES,IAAA,UAAU,GAAG,CAAA,mBAAA,EAAsB,eAAe,EAAE,EAAE;AACtD,IAAA,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,UAAU,QAAQ;;AAErC,IAAA,OAAO,GAAG,YAAY,CAAC,sBAAsB,8EAAC;;AAG9C,IAAA,eAAe,GAAG,YAAY,CAAC,0BAA0B,sFAAC;AAC1D,IAAA,SAAS,GAAG,YAAY,CAAC,wBAAwB,gFAAC;AAClD,IAAA,SAAS,GAAG,YAAY,CAAC,wBAAwB,gFAAC;AAClD,IAAA,QAAQ,GAAG,YAAY,CAAC,uBAAuB,+EAAC;AAChD,IAAA,QAAQ,GAAG,YAAY,CAAC,uBAAuB,+EAAC;;AAEzD,IAAA,OAAO,GAAG,KAAK,CAAoB,EAAE,8EAAC;;AAGtC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;;AAGzB,IAAA,WAAW,GAAG,KAAK,CAAS,gBAAgB,kFAAC;;AAG7C,IAAA,YAAY,GAAG,KAAK,CAAS,EAAE,mFAAC;;AAGhC,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,2EAAC;;AAGxB,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;;AAGhC,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,oFAAC;;AAErC,IAAA,IAAI,GAAG,KAAK,CAAqB,IAAI,2EAAC;;AAEtC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;;AAGlC,IAAA,iBAAiB,GAAG,KAAK,CAAS,WAAW,wFAAC;;AAG9C,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;;AAG/B,IAAA,YAAY,GAAG,KAAK,CAAS,YAAY,mFAAC;;AAG1C,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;;AAGjC,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,oFAAC;;AAGrC,IAAA,yBAAyB,GAAG,KAAK,CAAS,CAAC,gGAAC;;AAG5C,IAAA,gBAAgB,GAAG,KAAK,CAAS,gBAAgB,uFAAC;;AAGlD,IAAA,cAAc,GAAG,KAAK,CAAS,mBAAmB,qFAAC;AAEnD;;;;AAIG;AACH,IAAA,QAAQ,GAAG,KAAK,CAAgB,IAAI,+EAAC;AAErC;;;;AAIG;IACM,eAAe,GAAG,MAAM,EAA0B;;AAGxC,IAAA,MAAM,GAAG,MAAM,CAAgB,IAAI,6EAAC;AAC9C,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;AACtB,IAAA,WAAW,GAAG,MAAM,CAAC,EAAE,kFAAC;AACxB,IAAA,gBAAgB,GAAwB;AAC/C,QAAA;AACE,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,CAAC,CAAC;AACZ,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,CAAC,CAAC;AACZ,SAAA;KACF;IACQ,qBAAqB,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE;IACnE,aAAa,GAAG,MAAM,CAO5B;AACD,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,GAAG,EAAE,IAAI;AACT,QAAA,MAAM,EAAE,IAAI;AACZ,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,SAAS,EAAE,IAAI;AAChB,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACO,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;AAE5B,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,+EAAC;AAEhD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,OAAO,CAAA,EAAG,IAAI,CAAC,UAAU,QAAQ;QACnC;AACA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACf,YAAA,OAAO,CAAA,EAAG,IAAI,CAAC,UAAU,OAAO;QAClC;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,kFAAC;AAEO,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACvC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;AACjD,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,OAAO,EAAE;QAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACxE,IAAA,CAAC,sFAAC;AAEF,IAAA,aAAa,CAAC,MAAuB,EAAA;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QACpD,OAAO,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,SAAS;IACzE;AAES,IAAA,aAAa,GAAG,QAAQ,CAC/B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,IAAI,oFAC3E;AAEQ,IAAA,eAAe,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,sFACpE;AAEQ,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;AAClB,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM;QAC3C,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE;QAChC;AAEA,QAAA,OAAO,KAAK,KAAK,CAAC,GAAG,qBAAqB,GAAG,CAAA,EAAG,KAAK,uBAAuB;AAC9E,IAAA,CAAC,0FAAC;AAEO,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,QAAQ,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,EAAE;AACX,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,EAAE;AACX,YAAA;AACE,gBAAA,OAAO,EAAE;;AAEf,IAAA,CAAC,4FAAC;AAEO,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;QAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,yBAAyB,EAAE,GAAG,IAAI,CAAC,qBAAqB,EAAE;QACrF,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,SAAS;AACrD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC;QAE/C,MAAM,eAAe,GAAG;AACtB,cAAE,MAAM,CAAC,UAAU,CAAC,cAAc;AAClC,cAAE,IAAI,CAAC,eAAe;AACxB,QAAA,IAAI,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE;AACjC,YAAA,OAAO,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC,IAAI;QAC5E;AAEA,QAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC;AAC/E,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAC9B,IAAI,CAAC,qBAAqB,EAAE,EAC5B,uBAAuB,GAAG,YAAY,CACvC;QACD,OAAO,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,CAAA,EAAA,CAAI;AACxD,IAAA,CAAC,4FAAC;IAEO,kBAAkB,GAAG,CAAC,MAAc,EAAE,MAAuB,KAAK,MAAM,CAAC,KAAK;;AAG/E,IAAA,SAAS,GAA+B,MAAK,EAAE,CAAC;AAChD,IAAA,UAAU,GAAe,MAAK,EAAE,CAAC;AAEzC,IAAA,UAAU,CAAC,GAAkB,EAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC;IAC9B;AAEA,IAAA,gBAAgB,CAAC,EAA8B,EAAA;AAC7C,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEiB,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;AAC7C,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;IACnC;AAES,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,sFAAC;IAEjF,MAAM,GAAA;QACJ,IAAI,IAAI,CAAC,eAAe,EAAE;YAAE;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;YAClB,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACrB,IAAI,CAAC,gBAAgB,EAAE;QACzB;aAAO;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACtB,IAAI,CAAC,kBAAkB,EAAE;QAC3B;IACF;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,UAAU,EAAE;IACnB;;AAGA,IAAA,YAAY,CAAC,KAAY,EAAA;QACvB,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE;YACxC;QACF;QACA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;YAClB,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACrB,IAAI,CAAC,gBAAgB,EAAE;QACzB;IACF;AAEA,IAAA,kBAAkB,CAAC,KAAoB,EAAA;QACrC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE;YACxC;QACF;QACA,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,MAAM,EAAE;IACf;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAc,sBAAsB,CAAC,EAAE,KAAK,EAAE;IAC3F;;AAGA,IAAA,kBAAkB,CAAC,KAAY,EAAE,OAAwB,EAAE,GAAW,EAAA;QACpE,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC9D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC;AAC5D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QAC1D,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B;IACF;AAEA,IAAA,UAAU,CAAC,KAAiB,EAAA;QAC1B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AACpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,QAAA,IAAI,KAAK;YAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;QAC/C,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE;IACd;AAEA,IAAA,YAAY,CAAC,MAAuB,EAAA;QAClC,IAAI,MAAM,CAAC,QAAQ;YAAE;QACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;AAC5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,QAAA,IAAI,KAAK;YAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;AACvD,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE;IACd;AAEA,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAwB;AAC7C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnE,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,CAAC;AAC7D,QAAA,IAAI,CAAC,YAAY,IAAI,CAAC,aAAa,EAAE;YACnC,IAAI,CAAC,KAAK,EAAE;QACd;IACF;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,iBAAiB,EAAE;QAC1B;IACF;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,iBAAiB,EAAE;QAC1B;IACF;IAEQ,iBAAiB,GAAA;AACvB,QAAA,MAAM,OAAO,GACX,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAc,sBAAsB,CAAC;AAClF,QAAA,IAAI,CAAC,OAAO;YAAE;AAEd,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,EAAE;AACnD,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU;AACvC,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW;QACzC,MAAM,GAAG,GAAG,CAAC;AACb,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QACnF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAC7B,CAAC,EACD,cAAc,GAAG,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CACjE;AACD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;QAChF,MAAM,SAAS,GAAG,cAAc,GAAG,cAAc,IAAI,cAAc,IAAI,GAAG;AAC1E,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,GAAG,cAAc,GAAG,cAAc,CAAC;AAE5E,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AACrB,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,GAAG,EAAE,SAAS,GAAG,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CAAA,EAAA,CAAI;AACzD,YAAA,MAAM,EAAE,SAAS,GAAG,GAAG,cAAc,GAAG,WAAW,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM;YAC1E,IAAI,EAAE,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,EAAE,aAAa,GAAG,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,CAAA,EAAA,CAAI;YACrH,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI;YACnB,SAAS,EAAE,CAAA,EAAG,SAAS,CAAA,EAAA,CAAI;AAC5B,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;AAEhC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,iBAAiB,EAAE,CAAC;QACjE;IACF;AAEA,IAAA,uBAAuB,CAAC,KAAqC,EAAA;AAC3D,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,KAAK,QAAQ,CAAC;IACnE;IAEQ,gBAAgB,GAAA;AACtB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC9E,IAAI,CAAC,YAAY,EAAE;YACjB;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;IACtC;AAEQ,IAAA,WAAW,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;AACxF,YAAA,IAAI,WAAW,IAAI,CAAC,EAAE;gBACpB,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC;AACpD,gBAAA,IAAI,CAAC,SAAS,EAAE,EAAE,iBAAiB,EAAE;YACvC;AACA,YAAA,IAAI,CAAC,aAAa,CAAC,MAAK;gBACtB,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAC/D,CAAA,gBAAA,EAAmB,KAAK,EAAE,CAC3B,IAAI,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAE,CAAC;gBAC7D,aAAa,EAAE,KAAK,EAAE;AACxB,YAAA,CAAC,CAAC;YACF;QACF;AAEA,QAAA,MAAM,aAAa,GACjB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAc,CAAA,gBAAA,EAAmB,KAAK,EAAE,CAAC;YACpF,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAE,CAAC;QAC1D,aAAa,EAAE,KAAK,EAAE;IACxB;IAEQ,kBAAkB,GAAA;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AACrB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,GAAG,EAAE,IAAI;AACT,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,SAAS,EAAE,IAAI;AAChB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B;AAEQ,IAAA,aAAa,CAAC,QAA8B,EAAA;AAClD,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YACvC,qBAAqB,CAAC,QAAQ,CAAC;QACjC;IACF;wGAzbW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,yBAAA,EAAA,EAAA,iBAAA,EAAA,2BAAA,EAAA,UAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,SAAA,EAjPlB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,kBAAkB,CAAC;AACjD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAgR+B,sBAAsB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAGd,0BAA0B,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAChC,wBAAwB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACxB,wBAAwB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACzB,uBAAuB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACvB,uBAAuB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAnCjB,wBAAwB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA/OrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmOT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,6mNAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAjPS,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,qEAAA,EAAA,MAAA,EAAA,CAAA,2BAAA,EAAA,8BAAA,EAAA,qCAAA,EAAA,4BAAA,EAAA,4BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,8BAAA,EAAA,kCAAA,EAAA,+BAAA,EAAA,mCAAA,EAAA,mCAAA,EAAA,yBAAA,EAAA,iCAAA,EAAA,sCAAA,EAAA,gCAAA,EAAA,iCAAA,EAAA,uCAAA,EAAA,kCAAA,EAAA,yBAAA,EAAA,wCAAA,EAAA,+BAAA,EAAA,+BAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,4DAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,gCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAoP/C,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAtP9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,WACb,CAAC,gBAAgB,EAAE,aAAa,EAAE,eAAe,CAAC,EAAA,aAAA,EAC5C,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,wBAAwB,CAAC;AACjD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,IAAA,EACK;AACJ,wBAAA,kBAAkB,EAAE,SAAS;AAC7B,wBAAA,iBAAiB,EAAE,kBAAkB;qBACtC,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmOT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,6mNAAA,CAAA,EAAA;qHAYsC,wBAAwB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MA4B/B,sBAAsB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAGd,0BAA0B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAChC,wBAAwB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MACxB,wBAAwB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MACzB,uBAAuB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MACvB,uBAAuB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,yBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACpV1D;;AAEG;;;;"}
@@ -251,7 +251,7 @@ class NeuSidebarComponent {
251
251
  <ng-content select="[neu-sidebar-footer]" />
252
252
  </div>
253
253
  </aside>
254
- `, isInline: true, styles: [".neu-sidebar__overlay{position:fixed;inset:0;background:var(--neu-overlay-bg-soft);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:var(--neu-z-overlay);opacity:0;pointer-events:none;transition:opacity var(--neu-transition-slow)}.neu-sidebar__overlay--visible{opacity:1;pointer-events:all}.neu-sidebar{position:fixed;top:0;left:0;height:100dvh;width:100%;background:var(--neu-sidebar-bg, var(--neu-surface));border-right:1px solid var(--neu-border);z-index:var(--neu-z-sidebar);display:flex;flex-direction:column;transform:translate(-100%);transition:transform var(--neu-transition-slow),box-shadow var(--neu-transition-slow);overflow:hidden}@media(min-width:400px){.neu-sidebar{width:var(--neu-sidebar-width, 260px)}}.neu-sidebar--open:not(.neu-sidebar--persistent):not(.neu-sidebar--right){transform:translate(0);box-shadow:var(--neu-shadow-lg)}.neu-sidebar--right{left:auto;right:0;border-right:none;border-left:1px solid var(--neu-border);transform:translate(100%)}.neu-sidebar--right.neu-sidebar--open:not(.neu-sidebar--persistent){transform:translate(0);box-shadow:var(--neu-shadow-lg)}.neu-sidebar--persistent{position:sticky;top:var(--neu-header-height);height:calc(100dvh - var(--neu-header-height));transform:none;box-shadow:none;border-right:1px solid var(--neu-border);flex-shrink:0;z-index:var(--neu-z-base)}.neu-sidebar__header{display:flex;align-items:center;justify-content:space-between;padding:0 var(--neu-space-5);min-height:var(--neu-header-height, 64px);border-bottom:1px solid var(--neu-border);flex-shrink:0}.neu-sidebar__title{font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);font-weight:700;letter-spacing:-.01em;color:var(--neu-text)}.neu-sidebar__close{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;background:transparent;border:1px solid transparent;border-radius:var(--neu-radius);color:var(--neu-text-muted);cursor:pointer;flex-shrink:0;transition:background-color var(--neu-transition),color var(--neu-transition),border-color var(--neu-transition)}.neu-sidebar__close:hover{background:var(--neu-surface-2);color:var(--neu-text);border-color:var(--neu-border)}.neu-sidebar__close:focus-visible{outline:none;box-shadow:var(--neu-focus-ring-strong)}.neu-sidebar__content{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--neu-space-3) 0;scrollbar-width:thin;scrollbar-color:var(--neu-surface-3) transparent}.neu-sidebar__content::-webkit-scrollbar{width:4px}.neu-sidebar__content::-webkit-scrollbar-track{background:transparent}.neu-sidebar__content::-webkit-scrollbar-thumb{background:var(--neu-surface-3);border-radius:var(--neu-radius-full)}.neu-sidebar__footer{padding:var(--neu-space-4) var(--neu-space-5);border-top:1px solid var(--neu-border);flex-shrink:0}.neu-sidebar__footer:empty{display:none}.neu-sidebar--collapsed{width:var(--neu-sidebar-collapsed-width, 60px)!important}.neu-sidebar--collapsed .neu-sidebar__header{flex-direction:column;justify-content:center;padding:0;min-height:var(--neu-header-height, 64px)}.neu-sidebar--collapsed .neu-sidebar__header .neu-sidebar__title{display:none}.neu-sidebar--collapsed .neu-sidebar__content{padding:var(--neu-space-2) 0}.neu-sidebar--collapsed a span:not([neu-sidebar-header]),.neu-sidebar--collapsed button span:not([neu-sidebar-header]){max-width:0;overflow:hidden;opacity:0;transition:max-width var(--neu-transition),opacity var(--neu-transition)}.neu-sidebar--collapsed .neu-sidebar__footer{padding:var(--neu-space-2) var(--neu-space-3);min-height:auto}.neu-sidebar--collapsed .neu-sidebar__footer span{display:none}.neu-sidebar--collapsed .neu-sidebar__close{width:40px;height:40px}\n"], dependencies: [{ kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "strokeWidth", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
254
+ `, isInline: true, styles: [".neu-sidebar__overlay{position:fixed;inset:0;background:var(--neu-overlay-bg-soft);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:var(--neu-z-overlay);opacity:0;pointer-events:none;transition:opacity var(--neu-transition-slow)}.neu-sidebar__overlay--visible{opacity:1;pointer-events:all}.neu-sidebar{position:fixed;top:0;left:0;height:100dvh;width:100%;background:var(--neu-sidebar-bg, var(--neu-surface));border-right:1px solid var(--neu-border);z-index:var(--neu-z-sidebar);display:flex;flex-direction:column;transform:translate(-100%);transition:transform var(--neu-transition-slow),box-shadow var(--neu-transition-slow);overflow:hidden}@media(min-width:400px){.neu-sidebar{width:var(--neu-sidebar-width, 260px)}}.neu-sidebar--open:not(.neu-sidebar--persistent):not(.neu-sidebar--right){transform:translate(0);box-shadow:var(--neu-shadow-lg)}.neu-sidebar--right{left:auto;right:0;border-right:none;border-left:1px solid var(--neu-border);transform:translate(100%)}.neu-sidebar--right.neu-sidebar--open:not(.neu-sidebar--persistent){transform:translate(0);box-shadow:var(--neu-shadow-lg)}.neu-sidebar--persistent{position:sticky;top:var(--neu-header-height);height:calc(100dvh - var(--neu-header-height));transform:none;box-shadow:none;border-right:1px solid var(--neu-border);flex-shrink:0;z-index:var(--neu-z-base)}.neu-sidebar__header{display:flex;align-items:center;justify-content:space-between;padding:0 var(--neu-space-5);min-height:var(--neu-header-height, 64px);border-bottom:1px solid var(--neu-border);flex-shrink:0}.neu-sidebar__title{font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);font-weight:700;letter-spacing:-.01em;color:var(--neu-text)}.neu-sidebar__close{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;background:transparent;border:1px solid transparent;border-radius:var(--neu-radius);color:var(--neu-text-muted);cursor:pointer;flex-shrink:0;transition:background-color var(--neu-transition),color var(--neu-transition),border-color var(--neu-transition)}.neu-sidebar__close:hover{background:var(--neu-surface-2);color:var(--neu-text);border-color:var(--neu-border)}.neu-sidebar__close:focus-visible{outline:none;box-shadow:var(--neu-focus-ring-strong)}.neu-sidebar__content{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--neu-space-3) 0;scrollbar-width:thin;scrollbar-color:var(--neu-surface-3) transparent}.neu-sidebar__content::-webkit-scrollbar{width:4px}.neu-sidebar__content::-webkit-scrollbar-track{background:transparent}.neu-sidebar__content::-webkit-scrollbar-thumb{background:var(--neu-surface-3);border-radius:var(--neu-radius-full)}.neu-sidebar__footer{padding:var(--neu-space-4) var(--neu-space-5);border-top:1px solid var(--neu-border);flex-shrink:0}.neu-sidebar__footer:empty{display:none}.neu-sidebar--collapsed{width:var(--neu-sidebar-collapsed-width, 60px)!important}.neu-sidebar--collapsed .neu-sidebar__header{flex-direction:column;justify-content:center;padding:0;min-height:var(--neu-header-height, 64px)}.neu-sidebar--collapsed .neu-sidebar__header .neu-sidebar__title{display:none}.neu-sidebar--collapsed .neu-sidebar__content{padding:var(--neu-space-2) 0}.neu-sidebar--collapsed a span:not([neu-sidebar-header]),.neu-sidebar--collapsed button span:not([neu-sidebar-header]){max-width:0;overflow:hidden;opacity:0;transition:max-width var(--neu-transition),opacity var(--neu-transition)}.neu-sidebar--collapsed .neu-sidebar__footer{padding:var(--neu-space-2) var(--neu-space-3);min-height:auto}.neu-sidebar--collapsed .neu-sidebar__footer span{display:none}.neu-sidebar--collapsed .neu-sidebar__close{width:40px;height:40px}\n"], dependencies: [{ kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "decorative", "ariaLabel", "strokeWidth", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
255
255
  }
256
256
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuSidebarComponent, decorators: [{
257
257
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-sidebar.mjs","sources":["../../../../projects/ui-core/sidebar/neu-sidebar.component.ts","../../../../projects/ui-core/sidebar/neural-ui-core-sidebar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n output,\n ElementRef,\n HostListener,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { NeuUrlStateService } from '@neural-ui/core/url-state';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\n\nlet overlayScrollLockCount = 0;\nlet previousHtmlOverflow = '';\nlet previousBodyOverflow = '';\n\nfunction lockDocumentScroll(document: Document): void {\n if (overlayScrollLockCount === 0) {\n previousHtmlOverflow = document.documentElement.style.overflow;\n previousBodyOverflow = document.body.style.overflow;\n document.documentElement.style.overflow = 'hidden';\n document.body.style.overflow = 'hidden';\n }\n\n overlayScrollLockCount += 1;\n}\n\nfunction unlockDocumentScroll(document: Document): void {\n if (overlayScrollLockCount === 0) {\n return;\n }\n\n overlayScrollLockCount -= 1;\n\n if (overlayScrollLockCount === 0) {\n document.documentElement.style.overflow = previousHtmlOverflow;\n document.body.style.overflow = previousBodyOverflow;\n }\n}\n\n/**\n * NeuralUI Sidebar Component\n *\n * El estado abierto/cerrado se gestiona automáticamente desde la URL / The open/closed state is automatically managed from the URL\n * via NeuUrlStateService (?menu=open por defecto). / via NeuUrlStateService (?menu=open by default).\n *\n * Modos:\n * - overlay (default): panel flotante sobre el contenido con backdrop / floating panel above content with backdrop\n * - persistent: sidebar fijo integrado en el layout (desktop) / fixed sidebar integrated in the layout (desktop)\n *\n * Uso:\n * <neu-sidebar urlParam=\"menu\" [persistent]=\"isDesktop()\">\n * <span neu-sidebar-header>Mi App</span>\n * <nav>...</nav>\n * <div neu-sidebar-footer>...</div>\n * </neu-sidebar>\n *\n * Abrir desde cualquier parte: / Open from anywhere:\n * inject(NeuUrlStateService).setParam('menu', 'open', false);\n */\n@Component({\n selector: 'neu-sidebar',\n imports: [NeuIconComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- Overlay de fondo — solo visible en modo overlay -->\n @if (!persistent()) {\n <div\n class=\"neu-sidebar__overlay\"\n [class.neu-sidebar__overlay--visible]=\"isOpen()\"\n (click)=\"close()\"\n aria-hidden=\"true\"\n ></div>\n }\n\n <!-- Panel lateral -->\n <aside\n class=\"neu-sidebar\"\n [class.neu-sidebar--open]=\"isOpen()\"\n [class.neu-sidebar--persistent]=\"persistent()\"\n [class.neu-sidebar--collapsed]=\"collapsed()\"\n [class.neu-sidebar--right]=\"side() === 'right'\"\n [attr.role]=\"persistent() ? 'navigation' : 'dialog'\"\n [attr.aria-modal]=\"persistent() ? null : 'true'\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-hidden]=\"!isOpen() && !persistent()\"\n [attr.inert]=\"!isOpen() && !persistent() ? '' : null\"\n >\n <!-- Cabecera -->\n @if (!hideHeader()) {\n <div class=\"neu-sidebar__header\">\n <div class=\"neu-sidebar__title\">\n <ng-content select=\"[neu-sidebar-header]\" />\n </div>\n @if (!persistent()) {\n <button\n class=\"neu-sidebar__close\"\n (click)=\"close()\"\n [attr.aria-label]=\"closeLabel()\"\n type=\"button\"\n >\n <neu-icon name=\"lucideX\" size=\"18px\" aria-hidden=\"true\" />\n </button>\n }\n </div>\n }\n\n <!-- Contenido -->\n <div class=\"neu-sidebar__content\">\n <ng-content />\n </div>\n\n <!-- Footer -->\n <div class=\"neu-sidebar__footer\">\n <ng-content select=\"[neu-sidebar-footer]\" />\n </div>\n </aside>\n `,\n styleUrl: './neu-sidebar.component.scss',\n})\nexport class NeuSidebarComponent {\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n private readonly urlState = inject(NeuUrlStateService);\n private readonly openParam = computed(() => this.urlState.getParam(this.urlParam()));\n private previousActiveElement: HTMLElement | null = null;\n\n /** Posición del sidebar: izquierda o derecha de la pantalla / Sidebar position: left or right of the screen */\n side = input<'left' | 'right'>('left');\n\n /** QueryParam que controla el estado. Default: 'menu' (?menu=open) / QueryParam that controls the state. Default: 'menu' (?menu=open) */\n urlParam = input<string>('menu');\n\n /**\n * Modo persistente: el sidebar está siempre visible como parte del layout.\n * Usar en desktop (≥768px). El overlay y el toggle por URL no aplican.\n */\n persistent = input<boolean>(false);\n\n /**\n * Ocultar la cabecera del sidebar. Útil cuando el header ya está en el layout\n * principal y el sidebar persistente no necesita su propio header.\n */\n hideHeader = input<boolean>(false);\n\n /** Etiqueta accesible para el <aside> / Accessible label for the <aside> */\n ariaLabel = input<string>('Menú de navegación');\n\n /** Etiqueta accesible para el botón cerrar / Accessible label for the close button */\n closeLabel = input<string>('Cerrar menú de navegación');\n /** Cierra el overlay al pulsar Escape / Closes the overlay when pressing Escape */\n closeOnEscape = input<boolean>(true);\n /** Devuelve el foco al elemento activo antes de abrir / Restores focus after close */\n restoreFocus = input<boolean>(true);\n\n /**\n * Modo colapsado: el sidebar muestra solo iconos (icon-only en desktop).\n * Útil para sidebars persistentes en modo compact / Collapsed mode: sidebar shows only icons.\n */\n collapsed = input<boolean>(false);\n\n /** Emite cuando el usuario cierra el sidebar (overlay click o botón) / Emits when the user closes the sidebar (overlay click or button) */\n closeRequested = output<void>();\n\n /** Emite cuando el estado collapsed cambia / Emits when collapsed state changes */\n collapsedChange = output<boolean>();\n\n /** Signal reactivo: true si el sidebar debe mostrarse / Reactive signal: true if the sidebar should be shown */\n readonly isOpen = computed(() => {\n if (this.persistent()) return true;\n return this.openParam()() === 'open';\n });\n\n constructor() {\n effect((onCleanup) => {\n const shouldLockScroll = !this.persistent() && this.isOpen();\n\n if (!shouldLockScroll) {\n return;\n }\n\n lockDocumentScroll(this.document);\n\n onCleanup(() => {\n unlockDocumentScroll(this.document);\n });\n });\n\n // Focus management: save previous element and move focus to sidebar when opening in drawer mode\n effect(() => {\n const isOpenNow = this.isOpen();\n const isPersistent = this.persistent();\n\n if (isPersistent) {\n return;\n }\n\n if (isOpenNow) {\n // Save the current active element\n this.previousActiveElement = this.document.activeElement as HTMLElement;\n\n // Move focus to first focusable element inside the sidebar\n this.focusFirstElement();\n } else if (\n this.restoreFocus() &&\n this.previousActiveElement &&\n this.previousActiveElement.focus\n ) {\n // Restore focus to the element that had it before opening\n setTimeout(() => {\n this.previousActiveElement?.focus();\n this.previousActiveElement = null;\n }, 0);\n }\n });\n }\n\n /** Abre el sidebar — añade ?{urlParam}=open a la URL / Opens the sidebar — adds ?{urlParam}=open to the URL */\n open(replaceUrl = false): void {\n this.urlState.setParam(this.urlParam(), 'open', replaceUrl);\n }\n\n /** Cierra el sidebar — elimina el parámetro de la URL / Closes the sidebar — removes the URL parameter */\n close(): void {\n this.urlState.setParam(this.urlParam(), null, true);\n this.closeRequested.emit();\n }\n\n /** Alterna el estado collapsed / Toggles collapsed state */\n toggleCollapsed(): void {\n const newState = !this.collapsed();\n this.collapsedChange.emit(newState);\n }\n\n /** Obtiene los elementos focusables dentro del sidebar / Gets focusable elements inside sidebar */\n private getFocusableElements(): HTMLElement[] {\n const focusableSelectors = [\n 'button',\n 'a[href]',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(',');\n\n const aside = this.elementRef.nativeElement.querySelector('aside.neu-sidebar');\n if (!aside) {\n return [];\n }\n\n return Array.from(aside.querySelectorAll(focusableSelectors)) as HTMLElement[];\n }\n\n /** Mueve el foco al primer elemento focusable / Moves focus to first focusable element */\n private focusFirstElement(): void {\n setTimeout(() => {\n const focusable = this.getFocusableElements();\n if (focusable.length > 0) {\n focusable[0].focus();\n }\n }, 0);\n }\n\n /** Focus trap: cicla entre elementos focusables con Tab/Shift+Tab / Focus trap cycling */\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (!this.isOpen() || this.persistent()) {\n return;\n }\n\n if (event.key === 'Escape' && this.closeOnEscape()) {\n event.preventDefault();\n this.close();\n return;\n }\n\n if (event.key !== 'Tab') {\n return;\n }\n\n const focusable = this.getFocusableElements();\n if (focusable.length === 0) {\n return;\n }\n\n const activeElement = this.document.activeElement as HTMLElement;\n const currentIndex = focusable.indexOf(activeElement);\n\n if (event.shiftKey) {\n // Shift+Tab — go to previous\n if (currentIndex <= 0) {\n event.preventDefault();\n focusable[focusable.length - 1].focus();\n }\n } else {\n // Tab — go to next\n if (currentIndex >= focusable.length - 1) {\n event.preventDefault();\n focusable[0].focus();\n }\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-sidebar.mjs","sources":["../../../../projects/ui-core/sidebar/neu-sidebar.component.ts","../../../../projects/ui-core/sidebar/neural-ui-core-sidebar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n output,\n ElementRef,\n HostListener,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { NeuUrlStateService } from '@neural-ui/core/url-state';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\n\nlet overlayScrollLockCount = 0;\nlet previousHtmlOverflow = '';\nlet previousBodyOverflow = '';\n\nfunction lockDocumentScroll(document: Document): void {\n if (overlayScrollLockCount === 0) {\n previousHtmlOverflow = document.documentElement.style.overflow;\n previousBodyOverflow = document.body.style.overflow;\n document.documentElement.style.overflow = 'hidden';\n document.body.style.overflow = 'hidden';\n }\n\n overlayScrollLockCount += 1;\n}\n\nfunction unlockDocumentScroll(document: Document): void {\n if (overlayScrollLockCount === 0) {\n return;\n }\n\n overlayScrollLockCount -= 1;\n\n if (overlayScrollLockCount === 0) {\n document.documentElement.style.overflow = previousHtmlOverflow;\n document.body.style.overflow = previousBodyOverflow;\n }\n}\n\n/**\n * NeuralUI Sidebar Component\n *\n * El estado abierto/cerrado se gestiona automáticamente desde la URL / The open/closed state is automatically managed from the URL\n * via NeuUrlStateService (?menu=open por defecto). / via NeuUrlStateService (?menu=open by default).\n *\n * Modos:\n * - overlay (default): panel flotante sobre el contenido con backdrop / floating panel above content with backdrop\n * - persistent: sidebar fijo integrado en el layout (desktop) / fixed sidebar integrated in the layout (desktop)\n *\n * Uso:\n * <neu-sidebar urlParam=\"menu\" [persistent]=\"isDesktop()\">\n * <span neu-sidebar-header>Mi App</span>\n * <nav>...</nav>\n * <div neu-sidebar-footer>...</div>\n * </neu-sidebar>\n *\n * Abrir desde cualquier parte: / Open from anywhere:\n * inject(NeuUrlStateService).setParam('menu', 'open', false);\n */\n@Component({\n selector: 'neu-sidebar',\n imports: [NeuIconComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- Overlay de fondo — solo visible en modo overlay -->\n @if (!persistent()) {\n <div\n class=\"neu-sidebar__overlay\"\n [class.neu-sidebar__overlay--visible]=\"isOpen()\"\n (click)=\"close()\"\n aria-hidden=\"true\"\n ></div>\n }\n\n <!-- Panel lateral -->\n <aside\n class=\"neu-sidebar\"\n [class.neu-sidebar--open]=\"isOpen()\"\n [class.neu-sidebar--persistent]=\"persistent()\"\n [class.neu-sidebar--collapsed]=\"collapsed()\"\n [class.neu-sidebar--right]=\"side() === 'right'\"\n [attr.role]=\"persistent() ? 'navigation' : 'dialog'\"\n [attr.aria-modal]=\"persistent() ? null : 'true'\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-hidden]=\"!isOpen() && !persistent()\"\n [attr.inert]=\"!isOpen() && !persistent() ? '' : null\"\n >\n <!-- Cabecera -->\n @if (!hideHeader()) {\n <div class=\"neu-sidebar__header\">\n <div class=\"neu-sidebar__title\">\n <ng-content select=\"[neu-sidebar-header]\" />\n </div>\n @if (!persistent()) {\n <button\n class=\"neu-sidebar__close\"\n (click)=\"close()\"\n [attr.aria-label]=\"closeLabel()\"\n type=\"button\"\n >\n <neu-icon name=\"lucideX\" size=\"18px\" aria-hidden=\"true\" />\n </button>\n }\n </div>\n }\n\n <!-- Contenido -->\n <div class=\"neu-sidebar__content\">\n <ng-content />\n </div>\n\n <!-- Footer -->\n <div class=\"neu-sidebar__footer\">\n <ng-content select=\"[neu-sidebar-footer]\" />\n </div>\n </aside>\n `,\n styleUrl: './neu-sidebar.component.scss',\n})\nexport class NeuSidebarComponent {\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n private readonly urlState = inject(NeuUrlStateService);\n private readonly openParam = computed(() => this.urlState.getParam(this.urlParam()));\n private previousActiveElement: HTMLElement | null = null;\n\n /** Posición del sidebar: izquierda o derecha de la pantalla / Sidebar position: left or right of the screen */\n side = input<'left' | 'right'>('left');\n\n /** QueryParam que controla el estado. Default: 'menu' (?menu=open) / QueryParam that controls the state. Default: 'menu' (?menu=open) */\n urlParam = input<string>('menu');\n\n /**\n * Modo persistente: el sidebar está siempre visible como parte del layout.\n * Usar en desktop (≥768px). El overlay y el toggle por URL no aplican.\n */\n persistent = input<boolean>(false);\n\n /**\n * Ocultar la cabecera del sidebar. Útil cuando el header ya está en el layout\n * principal y el sidebar persistente no necesita su propio header.\n */\n hideHeader = input<boolean>(false);\n\n /** Etiqueta accesible para el <aside> / Accessible label for the <aside> */\n ariaLabel = input<string>('Menú de navegación');\n\n /** Etiqueta accesible para el botón cerrar / Accessible label for the close button */\n closeLabel = input<string>('Cerrar menú de navegación');\n /** Cierra el overlay al pulsar Escape / Closes the overlay when pressing Escape */\n closeOnEscape = input<boolean>(true);\n /** Devuelve el foco al elemento activo antes de abrir / Restores focus after close */\n restoreFocus = input<boolean>(true);\n\n /**\n * Modo colapsado: el sidebar muestra solo iconos (icon-only en desktop).\n * Útil para sidebars persistentes en modo compact / Collapsed mode: sidebar shows only icons.\n */\n collapsed = input<boolean>(false);\n\n /** Emite cuando el usuario cierra el sidebar (overlay click o botón) / Emits when the user closes the sidebar (overlay click or button) */\n closeRequested = output<void>();\n\n /** Emite cuando el estado collapsed cambia / Emits when collapsed state changes */\n collapsedChange = output<boolean>();\n\n /** Signal reactivo: true si el sidebar debe mostrarse / Reactive signal: true if the sidebar should be shown */\n readonly isOpen = computed(() => {\n if (this.persistent()) return true;\n return this.openParam()() === 'open';\n });\n\n constructor() {\n effect((onCleanup) => {\n const shouldLockScroll = !this.persistent() && this.isOpen();\n\n if (!shouldLockScroll) {\n return;\n }\n\n lockDocumentScroll(this.document);\n\n onCleanup(() => {\n unlockDocumentScroll(this.document);\n });\n });\n\n // Focus management: save previous element and move focus to sidebar when opening in drawer mode\n effect(() => {\n const isOpenNow = this.isOpen();\n const isPersistent = this.persistent();\n\n if (isPersistent) {\n return;\n }\n\n if (isOpenNow) {\n // Save the current active element\n this.previousActiveElement = this.document.activeElement as HTMLElement;\n\n // Move focus to first focusable element inside the sidebar\n this.focusFirstElement();\n } else if (\n this.restoreFocus() &&\n this.previousActiveElement &&\n this.previousActiveElement.focus\n ) {\n // Restore focus to the element that had it before opening\n setTimeout(() => {\n this.previousActiveElement?.focus();\n this.previousActiveElement = null;\n }, 0);\n }\n });\n }\n\n /** Abre el sidebar — añade ?{urlParam}=open a la URL / Opens the sidebar — adds ?{urlParam}=open to the URL */\n open(replaceUrl = false): void {\n this.urlState.setParam(this.urlParam(), 'open', replaceUrl);\n }\n\n /** Cierra el sidebar — elimina el parámetro de la URL / Closes the sidebar — removes the URL parameter */\n close(): void {\n this.urlState.setParam(this.urlParam(), null, true);\n this.closeRequested.emit();\n }\n\n /** Alterna el estado collapsed / Toggles collapsed state */\n toggleCollapsed(): void {\n const newState = !this.collapsed();\n this.collapsedChange.emit(newState);\n }\n\n /** Obtiene los elementos focusables dentro del sidebar / Gets focusable elements inside sidebar */\n private getFocusableElements(): HTMLElement[] {\n const focusableSelectors = [\n 'button',\n 'a[href]',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(',');\n\n const aside = this.elementRef.nativeElement.querySelector('aside.neu-sidebar');\n if (!aside) {\n return [];\n }\n\n return Array.from(aside.querySelectorAll(focusableSelectors)) as HTMLElement[];\n }\n\n /** Mueve el foco al primer elemento focusable / Moves focus to first focusable element */\n private focusFirstElement(): void {\n setTimeout(() => {\n const focusable = this.getFocusableElements();\n if (focusable.length > 0) {\n focusable[0].focus();\n }\n }, 0);\n }\n\n /** Focus trap: cicla entre elementos focusables con Tab/Shift+Tab / Focus trap cycling */\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (!this.isOpen() || this.persistent()) {\n return;\n }\n\n if (event.key === 'Escape' && this.closeOnEscape()) {\n event.preventDefault();\n this.close();\n return;\n }\n\n if (event.key !== 'Tab') {\n return;\n }\n\n const focusable = this.getFocusableElements();\n if (focusable.length === 0) {\n return;\n }\n\n const activeElement = this.document.activeElement as HTMLElement;\n const currentIndex = focusable.indexOf(activeElement);\n\n if (event.shiftKey) {\n // Shift+Tab — go to previous\n if (currentIndex <= 0) {\n event.preventDefault();\n focusable[focusable.length - 1].focus();\n }\n } else {\n // Tab — go to next\n if (currentIndex >= focusable.length - 1) {\n event.preventDefault();\n focusable[0].focus();\n }\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}