catarina 1.0.1 → 1.1.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.
@@ -32,7 +32,7 @@ class Icon {
32
32
  abortController;
33
33
  svgContent = signal('', ...(ngDevMode ? [{ debugName: "svgContent" }] : []));
34
34
  isLoading = signal(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
35
- size = '24px';
35
+ size = '1em';
36
36
  color = 'currentColor';
37
37
  ngOnDestroy() {
38
38
  this.abortController?.abort();
@@ -250,11 +250,11 @@ class Button {
250
250
  }
251
251
  }
252
252
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Button, deps: [], target: i0.ɵɵFactoryTarget.Component });
253
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: Button, isStandalone: true, selector: "cat-button", inputs: { variant: "variant", size: "size", disabled: "disabled", type: "type", iconLeft: "iconLeft", iconCenter: "iconCenter", iconRight: "iconRight", customClass: "customClass" }, outputs: { clicked: "clicked" }, host: { properties: { "attr.data-button-class": "this.dataCustomClass" } }, ngImport: i0, template: "<button [class]=\"buttonClasses\" [disabled]=\"disabled\" [type]=\"type\" (click)=\"handleClick($event)\">\n\n @if (iconLeft) {\n <cat-icon [name]=\"iconLeft\" [size]=\"iconSize\" class=\"icon-left\">\n </cat-icon>\n }\n\n <span class=\"button-content\">\n @if (iconCenter) {\n <cat-icon [name]=\"iconCenter\" [size]=\"iconSize\" class=\"icon-left\">\n </cat-icon>\n }\n <ng-content></ng-content>\n </span>\n\n @if (iconRight) {\n <cat-icon [name]=\"iconRight\" [size]=\"iconSize\" class=\"icon-right\">\n </cat-icon>\n }\n</button>", styles: ["button{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border:none;border-radius:18px;font-family:inherit;font-size:1rem;font-weight:500;cursor:pointer;transition:all .2s;white-space:nowrap}button:disabled{opacity:.5;cursor:not-allowed}.primary{background-color:var(--primary-color-0);color:#fff}.primary:hover:not(:disabled){background-color:#8a0000;background-color:var(--primary-color-1)}.secondary{background-color:var(--neutral-color-3);color:#fff}.secondary:hover:not(:disabled){background-color:var(--neutral-color-4)}.contrast{background-color:var(--neutral-color-9);color:var(--neutral-color-0)}.contrast:hover:not(:disabled){background-color:var(--neutral-color-8)}.outline{background-color:transparent;color:#a40000;border:2px solid #A40000}.outline:hover:not(:disabled){background-color:#a40000;color:#fff}.ghost{background-color:transparent;color:#a40000}.ghost:hover:not(:disabled){background-color:#a400001a}.sm{padding:.25rem .75rem;font-size:.875rem}.md{padding:.5rem 1rem;font-size:1rem}.lg{padding:.75rem 1.5rem;font-size:1.125rem}.icon-left,.icon-right,.icon-center{display:inline-flex}.button-content{display:inline-flex;align-items:center}\n"], dependencies: [{ kind: "component", type: Icon, selector: "cat-icon", inputs: ["size", "color", "name", "src"] }] });
253
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: Button, isStandalone: true, selector: "cat-button", inputs: { variant: "variant", size: "size", disabled: "disabled", type: "type", iconLeft: "iconLeft", iconCenter: "iconCenter", iconRight: "iconRight", customClass: "customClass" }, outputs: { clicked: "clicked" }, host: { properties: { "attr.data-button-class": "this.dataCustomClass" } }, ngImport: i0, template: "<button [class]=\"buttonClasses\" [disabled]=\"disabled\" [type]=\"type\" (click)=\"handleClick($event)\">\n\n @if (iconLeft) {\n <cat-icon [name]=\"iconLeft\" [size]=\"iconSize\" class=\"icon-left\">\n </cat-icon>\n }\n\n <span class=\"button-content\">\n @if (iconCenter) {\n <cat-icon [name]=\"iconCenter\" [size]=\"iconSize\" class=\"icon-left\">\n </cat-icon>\n }\n <ng-content></ng-content>\n </span>\n\n @if (iconRight) {\n <cat-icon [name]=\"iconRight\" [size]=\"iconSize\" class=\"icon-right\">\n </cat-icon>\n }\n</button>", styles: ["button{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border:none;border-radius:18px;font-family:inherit;font-size:1rem;font-weight:500;cursor:pointer;transition:all .2s;white-space:nowrap}button:disabled{opacity:.5;cursor:not-allowed}.primary{background-color:var(--primary-color-0);color:#fff}.primary:hover:not(:disabled){background-color:#8a0000;background-color:var(--primary-color-1)}.secondary{background-color:var(--neutral-color-0);color:var(--neutral-color-9)}.secondary:hover:not(:disabled){background-color:var(--neutral-color-1)}.contrast{background-color:var(--neutral-color-9);color:var(--neutral-color-0)}.contrast:hover:not(:disabled){background-color:var(--neutral-color-8)}.outline{background-color:transparent;color:#a40000;border:2px solid #A40000}.outline:hover:not(:disabled){background-color:#a40000;color:#fff}.ghost{background-color:transparent;color:#a40000}.ghost:hover:not(:disabled){background-color:#a400001a}.sm{padding:.25rem .75rem;font-size:.875rem}.md{padding:.5rem 1rem;font-size:1rem}.lg{padding:.75rem 1.5rem;font-size:1.125rem}.icon-left,.icon-right,.icon-center{display:inline-flex}.button-content{display:inline-flex;align-items:center}\n"], dependencies: [{ kind: "component", type: Icon, selector: "cat-icon", inputs: ["size", "color", "name", "src"] }] });
254
254
  }
255
255
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Button, decorators: [{
256
256
  type: Component,
257
- args: [{ selector: 'cat-button', imports: [Icon], template: "<button [class]=\"buttonClasses\" [disabled]=\"disabled\" [type]=\"type\" (click)=\"handleClick($event)\">\n\n @if (iconLeft) {\n <cat-icon [name]=\"iconLeft\" [size]=\"iconSize\" class=\"icon-left\">\n </cat-icon>\n }\n\n <span class=\"button-content\">\n @if (iconCenter) {\n <cat-icon [name]=\"iconCenter\" [size]=\"iconSize\" class=\"icon-left\">\n </cat-icon>\n }\n <ng-content></ng-content>\n </span>\n\n @if (iconRight) {\n <cat-icon [name]=\"iconRight\" [size]=\"iconSize\" class=\"icon-right\">\n </cat-icon>\n }\n</button>", styles: ["button{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border:none;border-radius:18px;font-family:inherit;font-size:1rem;font-weight:500;cursor:pointer;transition:all .2s;white-space:nowrap}button:disabled{opacity:.5;cursor:not-allowed}.primary{background-color:var(--primary-color-0);color:#fff}.primary:hover:not(:disabled){background-color:#8a0000;background-color:var(--primary-color-1)}.secondary{background-color:var(--neutral-color-3);color:#fff}.secondary:hover:not(:disabled){background-color:var(--neutral-color-4)}.contrast{background-color:var(--neutral-color-9);color:var(--neutral-color-0)}.contrast:hover:not(:disabled){background-color:var(--neutral-color-8)}.outline{background-color:transparent;color:#a40000;border:2px solid #A40000}.outline:hover:not(:disabled){background-color:#a40000;color:#fff}.ghost{background-color:transparent;color:#a40000}.ghost:hover:not(:disabled){background-color:#a400001a}.sm{padding:.25rem .75rem;font-size:.875rem}.md{padding:.5rem 1rem;font-size:1rem}.lg{padding:.75rem 1.5rem;font-size:1.125rem}.icon-left,.icon-right,.icon-center{display:inline-flex}.button-content{display:inline-flex;align-items:center}\n"] }]
257
+ args: [{ selector: 'cat-button', imports: [Icon], template: "<button [class]=\"buttonClasses\" [disabled]=\"disabled\" [type]=\"type\" (click)=\"handleClick($event)\">\n\n @if (iconLeft) {\n <cat-icon [name]=\"iconLeft\" [size]=\"iconSize\" class=\"icon-left\">\n </cat-icon>\n }\n\n <span class=\"button-content\">\n @if (iconCenter) {\n <cat-icon [name]=\"iconCenter\" [size]=\"iconSize\" class=\"icon-left\">\n </cat-icon>\n }\n <ng-content></ng-content>\n </span>\n\n @if (iconRight) {\n <cat-icon [name]=\"iconRight\" [size]=\"iconSize\" class=\"icon-right\">\n </cat-icon>\n }\n</button>", styles: ["button{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border:none;border-radius:18px;font-family:inherit;font-size:1rem;font-weight:500;cursor:pointer;transition:all .2s;white-space:nowrap}button:disabled{opacity:.5;cursor:not-allowed}.primary{background-color:var(--primary-color-0);color:#fff}.primary:hover:not(:disabled){background-color:#8a0000;background-color:var(--primary-color-1)}.secondary{background-color:var(--neutral-color-0);color:var(--neutral-color-9)}.secondary:hover:not(:disabled){background-color:var(--neutral-color-1)}.contrast{background-color:var(--neutral-color-9);color:var(--neutral-color-0)}.contrast:hover:not(:disabled){background-color:var(--neutral-color-8)}.outline{background-color:transparent;color:#a40000;border:2px solid #A40000}.outline:hover:not(:disabled){background-color:#a40000;color:#fff}.ghost{background-color:transparent;color:#a40000}.ghost:hover:not(:disabled){background-color:#a400001a}.sm{padding:.25rem .75rem;font-size:.875rem}.md{padding:.5rem 1rem;font-size:1rem}.lg{padding:.75rem 1.5rem;font-size:1.125rem}.icon-left,.icon-right,.icon-center{display:inline-flex}.button-content{display:inline-flex;align-items:center}\n"] }]
258
258
  }], propDecorators: { variant: [{
259
259
  type: Input
260
260
  }], size: [{
@@ -303,14 +303,14 @@ class Card {
303
303
  }
304
304
  */
305
305
  get cardClasses() {
306
- return `${this.variant} ${this.size} ${this.customClass}`;
306
+ return `cat-card ${this.variant} ${this.size} ${this.customClass}`;
307
307
  }
308
308
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Card, deps: [], target: i0.ɵɵFactoryTarget.Component });
309
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: Card, isStandalone: true, selector: "cat-card", inputs: { variant: "variant", size: "size", width: "width", customClass: "customClass" }, host: { properties: { "attr.data-card-variant": "this.dataVariant", "attr.data-card-size": "this.dataSize", "attr.data-card-class": "this.dataCustomClass" } }, ngImport: i0, template: "<section [class]=\"cardClasses\" [attr.data-class]=\"customClass\" [style]=\"`width: ${width};`\">\n <ng-content></ng-content>\n</section>", styles: ["section{min-width:7em;min-height:3em;height:auto;padding:8px;box-sizing:border-box;gap:.5rem;display:flex;flex-direction:column;border:none;border-radius:18px;font-family:inherit;font-size:1rem;font-weight:500;transition:all .2s}.surface{background-color:var(--element-color-4)}.elevated{background-color:var(--neutral-color-0)}.outlined{background-color:var(--element-color-3);border:1px solid var(--neutral-color-6)}.sm{padding:.25rem .75rem;font-size:.875rem}.md{padding:.5rem 1rem;font-size:1rem}.lg{padding:.75rem 1.5rem;font-size:1.125rem}\n"] });
309
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: Card, isStandalone: true, selector: "cat-card", inputs: { variant: "variant", size: "size", width: "width", customClass: "customClass" }, host: { properties: { "attr.data-card-variant": "this.dataVariant", "attr.data-card-size": "this.dataSize", "attr.data-card-class": "this.dataCustomClass" } }, ngImport: i0, template: "<section [class]=\"cardClasses\" [attr.data-class]=\"customClass\" [style]=\"`width: ${width};`\">\n <ng-content></ng-content>\n</section>", styles: [".cat-card{min-width:7em;min-height:3em;height:auto;padding:8px;box-sizing:border-box;gap:.5rem;display:flex;flex-direction:column;border:none;border-radius:18px;font-family:inherit;font-size:1rem;font-weight:500;transition:all .2s}.surface{background-color:var(--element-color-4)}.elevated{background-color:var(--neutral-color-0)}.outlined{background-color:var(--element-color-3);border:1px solid var(--neutral-color-6)}.sm{padding:.25rem .75rem;font-size:.875rem}.md{padding:.5rem 1rem;font-size:1rem}.lg{padding:.75rem 1.5rem;font-size:1.125rem}\n"] });
310
310
  }
311
311
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Card, decorators: [{
312
312
  type: Component,
313
- args: [{ selector: 'cat-card', template: "<section [class]=\"cardClasses\" [attr.data-class]=\"customClass\" [style]=\"`width: ${width};`\">\n <ng-content></ng-content>\n</section>", styles: ["section{min-width:7em;min-height:3em;height:auto;padding:8px;box-sizing:border-box;gap:.5rem;display:flex;flex-direction:column;border:none;border-radius:18px;font-family:inherit;font-size:1rem;font-weight:500;transition:all .2s}.surface{background-color:var(--element-color-4)}.elevated{background-color:var(--neutral-color-0)}.outlined{background-color:var(--element-color-3);border:1px solid var(--neutral-color-6)}.sm{padding:.25rem .75rem;font-size:.875rem}.md{padding:.5rem 1rem;font-size:1rem}.lg{padding:.75rem 1.5rem;font-size:1.125rem}\n"] }]
313
+ args: [{ selector: 'cat-card', template: "<section [class]=\"cardClasses\" [attr.data-class]=\"customClass\" [style]=\"`width: ${width};`\">\n <ng-content></ng-content>\n</section>", styles: [".cat-card{min-width:7em;min-height:3em;height:auto;padding:8px;box-sizing:border-box;gap:.5rem;display:flex;flex-direction:column;border:none;border-radius:18px;font-family:inherit;font-size:1rem;font-weight:500;transition:all .2s}.surface{background-color:var(--element-color-4)}.elevated{background-color:var(--neutral-color-0)}.outlined{background-color:var(--element-color-3);border:1px solid var(--neutral-color-6)}.sm{padding:.25rem .75rem;font-size:.875rem}.md{padding:.5rem 1rem;font-size:1rem}.lg{padding:.75rem 1.5rem;font-size:1.125rem}\n"] }]
314
314
  }], propDecorators: { variant: [{
315
315
  type: Input
316
316
  }], size: [{
@@ -615,12 +615,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
615
615
  class SelectInput {
616
616
  el;
617
617
  inputEl;
618
+ optionsContainer;
618
619
  transform; //This option basicly allow to the consumer put the options at the side where he wants
619
620
  options;
620
621
  placeholder = '';
621
622
  type = 'string';
622
623
  value = '';
623
624
  active = false;
625
+ isInsideMenu = false;
624
626
  variant = 'surface';
625
627
  scrolleable = false;
626
628
  customClass = '';
@@ -629,12 +631,72 @@ class SelectInput {
629
631
  outerClick(event) {
630
632
  if (!this.el.nativeElement.contains(event.target)) {
631
633
  this.active = false;
634
+ this.updateDropdownPosition();
632
635
  }
633
636
  }
634
637
  ;
638
+ updateDropdownPosition() {
639
+ if (!isPlatformBrowser(this.platformId))
640
+ return;
641
+ if (!this.isInsideMenu || !this.active || !this.optionsContainer) {
642
+ return;
643
+ }
644
+ // Calcular posición cuando está dentro del menú
645
+ const inputRect = this.inputEl.nativeElement.getBoundingClientRect();
646
+ const optionsEl = this.optionsContainer.nativeElement;
647
+ // Posicionar el dropdown debajo del input usando position fixed
648
+ optionsEl.style.position = 'fixed';
649
+ optionsEl.style.top = `${inputRect.bottom}px`;
650
+ optionsEl.style.left = `${inputRect.left}px`;
651
+ optionsEl.style.width = `${inputRect.width}px`;
652
+ optionsEl.style.zIndex = '1001';
653
+ }
654
+ toggleActive() {
655
+ this.active = !this.active;
656
+ if (this.active && this.isInsideMenu) {
657
+ // Esperar un tick para que el DOM se actualice
658
+ setTimeout(() => {
659
+ this.updateDropdownPosition();
660
+ }, 0);
661
+ }
662
+ }
635
663
  constructor(el) {
636
664
  this.el = el;
637
665
  }
666
+ platformId = inject(PLATFORM_ID);
667
+ scrollHandler;
668
+ resizeHandler;
669
+ ngAfterViewInit() {
670
+ if (!isPlatformBrowser(this.platformId))
671
+ return;
672
+ // Detectar si el select está dentro de un menú
673
+ this.isInsideMenu = !!this.el.nativeElement.closest('cat-menu');
674
+ // Añadir listeners para actualizar posición en scroll/resize
675
+ if (this.isInsideMenu) {
676
+ this.scrollHandler = () => {
677
+ if (this.active) {
678
+ this.updateDropdownPosition();
679
+ }
680
+ };
681
+ this.resizeHandler = () => {
682
+ if (this.active) {
683
+ this.updateDropdownPosition();
684
+ }
685
+ };
686
+ window.addEventListener('scroll', this.scrollHandler, true);
687
+ window.addEventListener('resize', this.resizeHandler);
688
+ }
689
+ }
690
+ ngOnDestroy() {
691
+ if (!isPlatformBrowser(this.platformId))
692
+ return;
693
+ if (this.scrollHandler) {
694
+ window.removeEventListener('scroll', this.scrollHandler, true);
695
+ }
696
+ if (this.resizeHandler) {
697
+ window.removeEventListener('resize', this.resizeHandler);
698
+ }
699
+ }
638
700
  onChange = (value) => { };
639
701
  onTouched = () => { };
640
702
  //Here starts the events from ControlValueAccesor
@@ -668,7 +730,7 @@ class SelectInput {
668
730
  provide: NG_VALUE_ACCESSOR,
669
731
  useExisting: forwardRef(() => SelectInput),
670
732
  multi: true
671
- }], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div>\n <input catInput [value]=\"value\" [type]=\"type\" readonly id=\"select\" (mousedown)=\"active =! active\" [placeholder]=\"placeholder\">\n <section role=\"listbox\" [class]=\"selectInputClass\" class=\"options\" [ngClass]=\"active ? 'options-active' : 'options.unactive'\" [style.transform]=\"transform\">\n @if (active) {\n <div role=\"option\"*ngFor=\"let option of options\" (mousedown)=\"choseValue(option)\">\n {{ option }}\n </div>\n }\n </section>\n</div>", styles: ["div{position:relative;display:inline-block}.options-active{background-color:var(--neutral-color-0);z-index:1;border-radius:18px;padding:8px;box-sizing:border-box;width:100%;position:absolute;display:flex;flex-direction:column;transition:.25s}.options-unactive{display:none;transition:.15s}.options>div{background-color:transparent;min-height:1em;padding-top:.5em;padding-left:.5em;padding-right:.8em;color:var(--neutral-color-9);box-sizing:border-box}.options>div:hover{background-color:var(--neutral-color-1)}.scrolleable{height:7em;overflow-y:auto}.scrolleable::-webkit-scrollbar{width:8px;height:8px}.scrolleable::-webkit-scrollbar-track{background:transparent}.scrolleable::-webkit-scrollbar-thumb{background:#888;border-radius:4px}.scrolleable::-webkit-scrollbar-thumb:hover{background:#555}.surface{background-color:var(--element-color-4)}.elevated{background-color:var(--neutral-color-0)}.outlined{background-color:var(--element-color-3);border:1px solid var(--neutral-color-6)}\n"], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: CatInput, selector: "[catInput]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
733
+ }], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["input"], descendants: true }, { propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true }], ngImport: i0, template: "<div>\n <input catInput #input [value]=\"value\" [type]=\"type\" readonly id=\"select\" (mousedown)=\"toggleActive()\" [placeholder]=\"placeholder\">\n <section #optionsContainer role=\"listbox\" [class]=\"selectInputClass\" class=\"options\" [ngClass]=\"active ? 'options-active' : 'options.unactive'\" [style.transform]=\"transform\">\n @if (active) {\n <div role=\"option\"*ngFor=\"let option of options\" (mousedown)=\"choseValue(option)\">\n {{ option }}\n </div>\n }\n </section>\n</div>", styles: ["div{position:relative;display:inline-block}.options-active{background-color:var(--neutral-color-0);z-index:1001;border-radius:18px;padding:8px;box-sizing:border-box;width:100%;position:absolute;display:flex;flex-direction:column;transition:.25s;isolation:isolate}.options-unactive{display:none;transition:.15s}.options>div{background-color:transparent;min-height:1em;padding-top:.5em;padding-left:.5em;padding-right:.8em;color:var(--neutral-color-9);box-sizing:border-box}.options>div:hover{background-color:var(--neutral-color-1)}.scrolleable{height:7em;overflow-y:auto}.scrolleable::-webkit-scrollbar{width:8px;height:8px}.scrolleable::-webkit-scrollbar-track{background:transparent}.scrolleable::-webkit-scrollbar-thumb{background:#888;border-radius:4px}.scrolleable::-webkit-scrollbar-thumb:hover{background:#555}.surface{background-color:var(--element-color-4)}.elevated{background-color:var(--neutral-color-0)}.outlined{background-color:var(--element-color-3);border:1px solid var(--neutral-color-6)}:host{position:relative;z-index:auto}:host-context(cat-menu) .options-active{position:fixed!important;z-index:1001!important;isolation:isolate}\n"], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: CatInput, selector: "[catInput]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
672
734
  }
673
735
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: SelectInput, decorators: [{
674
736
  type: Component,
@@ -680,10 +742,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
680
742
  provide: NG_VALUE_ACCESSOR,
681
743
  useExisting: forwardRef(() => SelectInput),
682
744
  multi: true
683
- }], template: "<div>\n <input catInput [value]=\"value\" [type]=\"type\" readonly id=\"select\" (mousedown)=\"active =! active\" [placeholder]=\"placeholder\">\n <section role=\"listbox\" [class]=\"selectInputClass\" class=\"options\" [ngClass]=\"active ? 'options-active' : 'options.unactive'\" [style.transform]=\"transform\">\n @if (active) {\n <div role=\"option\"*ngFor=\"let option of options\" (mousedown)=\"choseValue(option)\">\n {{ option }}\n </div>\n }\n </section>\n</div>", styles: ["div{position:relative;display:inline-block}.options-active{background-color:var(--neutral-color-0);z-index:1;border-radius:18px;padding:8px;box-sizing:border-box;width:100%;position:absolute;display:flex;flex-direction:column;transition:.25s}.options-unactive{display:none;transition:.15s}.options>div{background-color:transparent;min-height:1em;padding-top:.5em;padding-left:.5em;padding-right:.8em;color:var(--neutral-color-9);box-sizing:border-box}.options>div:hover{background-color:var(--neutral-color-1)}.scrolleable{height:7em;overflow-y:auto}.scrolleable::-webkit-scrollbar{width:8px;height:8px}.scrolleable::-webkit-scrollbar-track{background:transparent}.scrolleable::-webkit-scrollbar-thumb{background:#888;border-radius:4px}.scrolleable::-webkit-scrollbar-thumb:hover{background:#555}.surface{background-color:var(--element-color-4)}.elevated{background-color:var(--neutral-color-0)}.outlined{background-color:var(--element-color-3);border:1px solid var(--neutral-color-6)}\n"] }]
745
+ }], template: "<div>\n <input catInput #input [value]=\"value\" [type]=\"type\" readonly id=\"select\" (mousedown)=\"toggleActive()\" [placeholder]=\"placeholder\">\n <section #optionsContainer role=\"listbox\" [class]=\"selectInputClass\" class=\"options\" [ngClass]=\"active ? 'options-active' : 'options.unactive'\" [style.transform]=\"transform\">\n @if (active) {\n <div role=\"option\"*ngFor=\"let option of options\" (mousedown)=\"choseValue(option)\">\n {{ option }}\n </div>\n }\n </section>\n</div>", styles: ["div{position:relative;display:inline-block}.options-active{background-color:var(--neutral-color-0);z-index:1001;border-radius:18px;padding:8px;box-sizing:border-box;width:100%;position:absolute;display:flex;flex-direction:column;transition:.25s;isolation:isolate}.options-unactive{display:none;transition:.15s}.options>div{background-color:transparent;min-height:1em;padding-top:.5em;padding-left:.5em;padding-right:.8em;color:var(--neutral-color-9);box-sizing:border-box}.options>div:hover{background-color:var(--neutral-color-1)}.scrolleable{height:7em;overflow-y:auto}.scrolleable::-webkit-scrollbar{width:8px;height:8px}.scrolleable::-webkit-scrollbar-track{background:transparent}.scrolleable::-webkit-scrollbar-thumb{background:#888;border-radius:4px}.scrolleable::-webkit-scrollbar-thumb:hover{background:#555}.surface{background-color:var(--element-color-4)}.elevated{background-color:var(--neutral-color-0)}.outlined{background-color:var(--element-color-3);border:1px solid var(--neutral-color-6)}:host{position:relative;z-index:auto}:host-context(cat-menu) .options-active{position:fixed!important;z-index:1001!important;isolation:isolate}\n"] }]
684
746
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { inputEl: [{
685
747
  type: ViewChild,
686
748
  args: ['input']
749
+ }], optionsContainer: [{
750
+ type: ViewChild,
751
+ args: ['optionsContainer', { static: false }]
687
752
  }], transform: [{
688
753
  type: Input
689
754
  }], options: [{
@@ -864,6 +929,284 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
864
929
  args: ['attr.data-card-class']
865
930
  }] } });
866
931
 
932
+ class Drawer {
933
+ closs = new EventEmitter();
934
+ handleKeyDown(event) {
935
+ this.clossOverlay();
936
+ }
937
+ side = 'left';
938
+ variant = 'surface';
939
+ customClass = '';
940
+ get dataCustomClass() {
941
+ return this.customClass;
942
+ }
943
+ get drawerClasses() {
944
+ return `${this.variant} ${this.side} ${this.customClass}`;
945
+ }
946
+ clossOverlay() {
947
+ this.closs.emit(false);
948
+ }
949
+ ;
950
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Drawer, deps: [], target: i0.ɵɵFactoryTarget.Component });
951
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: Drawer, isStandalone: true, selector: "cat-drawer", inputs: { side: "side", variant: "variant", customClass: "customClass" }, outputs: { closs: "closs" }, host: { listeners: { "window:keydown.escape": "handleKeyDown($event)" }, properties: { "attr.data-drawer-class": "this.dataCustomClass" } }, ngImport: i0, template: "<style>\n .dialog-shadow {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.7);\n z-index: 999;\n }\n\n section {\n position: fixed;\n\n overflow: auto;\n\n box-sizing: border-box;\n padding: 0.25rem 0.75rem;\n z-index: 1000;\n transition: 250ms;\n\n user-select: none;\n }\n\n /* Variants */\n .surface {\n background-color: var(--element-color-4);\n }\n\n .elevated {\n background-color: var(--neutral-color-0);\n }\n\n .outlined {\n background-color: var(--element-color-3);\n border: 2px solid var(--neutral-color-9);\n }\n\n .close-button {\n position: absolute;\n }\n\n .left {\n width: 30em;\n height: 100vh;\n width: 30em;\n height: 100vh;\n left: 0;\n top: 0;\n\n & .close-button {\n right: .25rem;\n }\n }\n\n .right {\n width: 30em;\n height: 100vh;\n right: 0;\n top: 0;\n\n & .close-button {\n left: .25rem;\n }\n }\n\n .top {\n width: 100%;\n height: 20em;\n top: 0;\n left: 0;\n\n & .close-button {\n right: .25rem;\n }\n }\n\n .bottom {\n width: 100%;\n height: 20em;\n bottom: 0;\n left: 0;\n\n & .close-button {\n right: .25rem;\n }\n }\n\n @media screen and (orientation: portrait) {\n .top, .bottom {\n height: 70%;\n }\n }\n</style>\n<section [class]=\"drawerClasses\">\n <cat-button iconCenter=\"x-mark\" variant=\"contrast\" class=\"close-button\" (clicked)=\"clossOverlay()\"></cat-button>\n <ng-content></ng-content>\n</section>\n<div class=\"dialog-shadow\" (click)=\"clossOverlay()\">\n</div>", styles: ["", ".dialog-shadow{position:fixed;top:0;left:0;width:100%;height:100%;background:#000000b3;z-index:999}section{position:fixed;overflow:auto;box-sizing:border-box;padding:.25rem .75rem;z-index:1000;transition:.25s;-webkit-user-select:none;user-select:none}.surface{background-color:var(--element-color-4)}.elevated{background-color:var(--neutral-color-0)}.outlined{background-color:var(--element-color-3);border:2px solid var(--neutral-color-9)}.close-button{position:absolute}.left{width:30em;height:100vh;left:0;top:0}.left .close-button{right:.25rem}.right{width:30em;height:100vh;right:0;top:0}.right .close-button{left:.25rem}.top{width:100%;height:20em;top:0;left:0}.top .close-button{right:.25rem}.bottom{width:100%;height:20em;bottom:0;left:0}.bottom .close-button{right:.25rem}@media screen and (orientation: portrait){.top,.bottom{height:70%}}\n"], dependencies: [{ kind: "component", type: Button, selector: "cat-button", inputs: ["variant", "size", "disabled", "type", "iconLeft", "iconCenter", "iconRight", "customClass"], outputs: ["clicked"] }] });
952
+ }
953
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Drawer, decorators: [{
954
+ type: Component,
955
+ args: [{ selector: 'cat-drawer', imports: [Button], template: "<style>\n .dialog-shadow {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.7);\n z-index: 999;\n }\n\n section {\n position: fixed;\n\n overflow: auto;\n\n box-sizing: border-box;\n padding: 0.25rem 0.75rem;\n z-index: 1000;\n transition: 250ms;\n\n user-select: none;\n }\n\n /* Variants */\n .surface {\n background-color: var(--element-color-4);\n }\n\n .elevated {\n background-color: var(--neutral-color-0);\n }\n\n .outlined {\n background-color: var(--element-color-3);\n border: 2px solid var(--neutral-color-9);\n }\n\n .close-button {\n position: absolute;\n }\n\n .left {\n width: 30em;\n height: 100vh;\n width: 30em;\n height: 100vh;\n left: 0;\n top: 0;\n\n & .close-button {\n right: .25rem;\n }\n }\n\n .right {\n width: 30em;\n height: 100vh;\n right: 0;\n top: 0;\n\n & .close-button {\n left: .25rem;\n }\n }\n\n .top {\n width: 100%;\n height: 20em;\n top: 0;\n left: 0;\n\n & .close-button {\n right: .25rem;\n }\n }\n\n .bottom {\n width: 100%;\n height: 20em;\n bottom: 0;\n left: 0;\n\n & .close-button {\n right: .25rem;\n }\n }\n\n @media screen and (orientation: portrait) {\n .top, .bottom {\n height: 70%;\n }\n }\n</style>\n<section [class]=\"drawerClasses\">\n <cat-button iconCenter=\"x-mark\" variant=\"contrast\" class=\"close-button\" (clicked)=\"clossOverlay()\"></cat-button>\n <ng-content></ng-content>\n</section>\n<div class=\"dialog-shadow\" (click)=\"clossOverlay()\">\n</div>", styles: [".dialog-shadow{position:fixed;top:0;left:0;width:100%;height:100%;background:#000000b3;z-index:999}section{position:fixed;overflow:auto;box-sizing:border-box;padding:.25rem .75rem;z-index:1000;transition:.25s;-webkit-user-select:none;user-select:none}.surface{background-color:var(--element-color-4)}.elevated{background-color:var(--neutral-color-0)}.outlined{background-color:var(--element-color-3);border:2px solid var(--neutral-color-9)}.close-button{position:absolute}.left{width:30em;height:100vh;left:0;top:0}.left .close-button{right:.25rem}.right{width:30em;height:100vh;right:0;top:0}.right .close-button{left:.25rem}.top{width:100%;height:20em;top:0;left:0}.top .close-button{right:.25rem}.bottom{width:100%;height:20em;bottom:0;left:0}.bottom .close-button{right:.25rem}@media screen and (orientation: portrait){.top,.bottom{height:70%}}\n"] }]
956
+ }], propDecorators: { closs: [{
957
+ type: Output
958
+ }], handleKeyDown: [{
959
+ type: HostListener,
960
+ args: ['window:keydown.escape', ['$event']]
961
+ }], side: [{
962
+ type: Input
963
+ }], variant: [{
964
+ type: Input
965
+ }], customClass: [{
966
+ type: Input
967
+ }], dataCustomClass: [{
968
+ type: HostBinding,
969
+ args: ['attr.data-drawer-class']
970
+ }] } });
971
+
972
+ class Menu {
973
+ variant = 'surface';
974
+ customClass = '';
975
+ get dataCustomClass() {
976
+ return this.customClass;
977
+ }
978
+ get menuClasses() {
979
+ return `${this.variant} ${this.customClass}`;
980
+ }
981
+ menuContainer;
982
+ menuContent;
983
+ dropdown;
984
+ platformId = inject(PLATFORM_ID);
985
+ resizeObserver;
986
+ mutationObserver;
987
+ showMoreButton = signal(false, ...(ngDevMode ? [{ debugName: "showMoreButton" }] : []));
988
+ isDropdownOpen = signal(false, ...(ngDevMode ? [{ debugName: "isDropdownOpen" }] : []));
989
+ overflowItems = signal([], ...(ngDevMode ? [{ debugName: "overflowItems" }] : []));
990
+ ngAfterViewInit() {
991
+ if (!isPlatformBrowser(this.platformId))
992
+ return;
993
+ setTimeout(() => {
994
+ this.checkOverflow();
995
+ this.setupObservers();
996
+ }, 0);
997
+ }
998
+ ngOnDestroy() {
999
+ this.resizeObserver?.disconnect();
1000
+ this.mutationObserver?.disconnect();
1001
+ if (isPlatformBrowser(this.platformId)) {
1002
+ document.removeEventListener('click', this.handleOutsideClick);
1003
+ }
1004
+ }
1005
+ setupObservers() {
1006
+ if (!isPlatformBrowser(this.platformId))
1007
+ return;
1008
+ this.resizeObserver = new ResizeObserver(() => {
1009
+ this.checkOverflow();
1010
+ });
1011
+ this.resizeObserver.observe(this.menuContainer.nativeElement);
1012
+ this.mutationObserver = new MutationObserver(() => {
1013
+ this.checkOverflow();
1014
+ });
1015
+ this.mutationObserver.observe(this.menuContent.nativeElement, {
1016
+ childList: true,
1017
+ subtree: true
1018
+ });
1019
+ document.addEventListener('click', this.handleOutsideClick);
1020
+ }
1021
+ handleOutsideClick = (event) => {
1022
+ if (!this.isDropdownOpen())
1023
+ return;
1024
+ const target = event.target;
1025
+ const clickedInside = this.menuContainer.nativeElement.contains(target) ||
1026
+ this.dropdown?.nativeElement.contains(target);
1027
+ if (!clickedInside) {
1028
+ this.isDropdownOpen.set(false);
1029
+ }
1030
+ };
1031
+ checkOverflow() {
1032
+ // Si el dropdown está abierto, no recalcular (los elementos están en el dropdown)
1033
+ // Solo actualizar el contenido del dropdown si es necesario
1034
+ if (this.isDropdownOpen()) {
1035
+ const overflowItems = this.overflowItems();
1036
+ if (overflowItems.length > 0) {
1037
+ this.showMoreButton.set(true);
1038
+ setTimeout(() => {
1039
+ this.waitForDropdownAndUpdate();
1040
+ }, 0);
1041
+ }
1042
+ return;
1043
+ }
1044
+ const container = this.menuContent.nativeElement;
1045
+ // Restaurar todos los elementos que puedan estar en el dropdown
1046
+ this.restoreOverflowItems();
1047
+ const items = Array.from(container.children);
1048
+ if (items.length === 0) {
1049
+ this.showMoreButton.set(false);
1050
+ this.overflowItems.set([]);
1051
+ return;
1052
+ }
1053
+ const menuItems = items.filter(item => !item.classList.contains('more-button'));
1054
+ if (menuItems.length === 0) {
1055
+ this.showMoreButton.set(false);
1056
+ this.overflowItems.set([]);
1057
+ return;
1058
+ }
1059
+ // Restaurar todos los elementos a su estado visible antes de calcular
1060
+ menuItems.forEach(item => {
1061
+ item.style.display = '';
1062
+ });
1063
+ // Forzar un reflow para obtener posiciones correctas
1064
+ container.offsetHeight;
1065
+ // Detectar elementos en la primera fila vs elementos en filas adicionales
1066
+ const firstItemTop = menuItems[0]?.getBoundingClientRect().top;
1067
+ const firstRowItems = [];
1068
+ const overflowItems = [];
1069
+ menuItems.forEach(item => {
1070
+ const itemTop = item.getBoundingClientRect().top;
1071
+ // Tolerancia de 1px para manejar diferencias de redondeo
1072
+ if (Math.abs(itemTop - firstItemTop) <= 1) {
1073
+ firstRowItems.push(item);
1074
+ }
1075
+ else {
1076
+ overflowItems.push(item);
1077
+ }
1078
+ });
1079
+ // Si hay elementos en overflow, mostrar el botón More y ocultar los elementos overflow
1080
+ const needsMoreButton = overflowItems.length > 0;
1081
+ this.showMoreButton.set(needsMoreButton);
1082
+ // Ocultar elementos que están en la segunda fila o más
1083
+ overflowItems.forEach(item => {
1084
+ item.style.display = 'none';
1085
+ });
1086
+ // Mantener visibles solo los elementos de la primera fila
1087
+ firstRowItems.forEach(item => {
1088
+ item.style.display = '';
1089
+ });
1090
+ if (needsMoreButton) {
1091
+ this.overflowItems.set(overflowItems);
1092
+ }
1093
+ else {
1094
+ this.overflowItems.set([]);
1095
+ }
1096
+ }
1097
+ updateDropdownContent() {
1098
+ // Buscar el dropdown directamente en el DOM en lugar de usar ViewChild
1099
+ const menuWrapper = this.menuContainer.nativeElement.closest('.menu-wrapper');
1100
+ if (!menuWrapper) {
1101
+ return;
1102
+ }
1103
+ const dropdown = menuWrapper.querySelector('.dropdown');
1104
+ if (!dropdown) {
1105
+ return;
1106
+ }
1107
+ const dropdownContent = dropdown.querySelector('.dropdown-content');
1108
+ if (!dropdownContent) {
1109
+ return;
1110
+ }
1111
+ // Limpiar contenido previo - restaurar elementos que puedan estar ahí
1112
+ this.restoreOverflowItems();
1113
+ const overflowItems = this.overflowItems();
1114
+ if (overflowItems.length === 0) {
1115
+ return;
1116
+ }
1117
+ const menuContent = this.menuContent.nativeElement;
1118
+ overflowItems.forEach(item => {
1119
+ // Mover el elemento real al dropdown (preserva todos los event listeners de Angular)
1120
+ // El elemento ya está oculto (display: none), así que lo hacemos visible y lo movemos
1121
+ item.style.display = '';
1122
+ item.style.visibility = 'visible';
1123
+ item.style.opacity = '1';
1124
+ // Añadir un listener para cerrar el dropdown cuando se haga click
1125
+ const closeHandler = () => {
1126
+ this.isDropdownOpen.set(false);
1127
+ };
1128
+ // Buscar el botón dentro del elemento y añadir el listener
1129
+ const button = item.querySelector('button, cat-button, [role="button"]');
1130
+ if (button) {
1131
+ button.addEventListener('click', closeHandler, { once: true });
1132
+ }
1133
+ else {
1134
+ item.addEventListener('click', closeHandler, { once: true });
1135
+ }
1136
+ // Mover el elemento al dropdown
1137
+ dropdownContent.appendChild(item);
1138
+ });
1139
+ }
1140
+ restoreOverflowItems() {
1141
+ const overflowItems = this.overflowItems();
1142
+ const menuContent = this.menuContent.nativeElement;
1143
+ overflowItems.forEach(item => {
1144
+ // Si el elemento está en el dropdown, moverlo de vuelta al menu-content
1145
+ const dropdownContent = item.closest('.dropdown-content');
1146
+ if (dropdownContent && item.parentElement === dropdownContent) {
1147
+ // Ocultar el elemento y moverlo de vuelta al menu-content
1148
+ item.style.display = 'none';
1149
+ menuContent.appendChild(item);
1150
+ }
1151
+ });
1152
+ }
1153
+ toggleDropdown() {
1154
+ const newState = !this.isDropdownOpen();
1155
+ if (!newState) {
1156
+ // Si se está cerrando, restaurar los elementos a su posición original
1157
+ this.restoreOverflowItems();
1158
+ }
1159
+ this.isDropdownOpen.set(newState);
1160
+ if (newState) {
1161
+ // Recalcular overflow antes de abrir el dropdown
1162
+ setTimeout(() => {
1163
+ this.checkOverflow();
1164
+ // Esperar a que el dropdown esté en el DOM antes de actualizar
1165
+ this.waitForDropdownAndUpdate();
1166
+ }, 0);
1167
+ }
1168
+ }
1169
+ waitForDropdownAndUpdate() {
1170
+ // Intentar actualizar el dropdown, reintentando si no está disponible
1171
+ const maxAttempts = 20;
1172
+ let attempts = 0;
1173
+ const tryUpdate = () => {
1174
+ attempts++;
1175
+ const menuWrapper = this.menuContainer.nativeElement.closest('.menu-wrapper');
1176
+ const dropdown = menuWrapper?.querySelector('.dropdown');
1177
+ if (dropdown) {
1178
+ this.updateDropdownContent();
1179
+ }
1180
+ else if (attempts < maxAttempts) {
1181
+ setTimeout(tryUpdate, 10);
1182
+ }
1183
+ };
1184
+ tryUpdate();
1185
+ }
1186
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Menu, deps: [], target: i0.ɵɵFactoryTarget.Component });
1187
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: Menu, isStandalone: true, selector: "cat-menu", inputs: { variant: "variant", customClass: "customClass" }, host: { properties: { "attr.data-menu-class": "this.dataCustomClass" } }, viewQueries: [{ propertyName: "menuContainer", first: true, predicate: ["menuContainer"], descendants: true }, { propertyName: "menuContent", first: true, predicate: ["menuContent"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<div class=\"menu-wrapper\">\n <div class=\"menu\" #menuContainer>\n <div class=\"menu-content\" #menuContent>\n <ng-content></ng-content>\n </div>\n\n @if (showMoreButton()) {\n <button class=\"more-button\" (click)=\"toggleDropdown()\" [attr.aria-expanded]=\"isDropdownOpen()\" type=\"button\">\n <span>More</span>\n @if(isDropdownOpen()){\n <cat-icon size=\"16px\" name=\"chevron-arrow-up\"></cat-icon>\n } @else {\n <cat-icon size=\"16px\" name=\"chevron-arrow-down\"></cat-icon>\n }\n<!-- <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\"\n [style.transform]=\"isDropdownOpen() ? 'rotate(180deg)' : 'rotate(0deg)'\">\n <path d=\"M4 6l4 4 4-4z\" />\n </svg> -->\n </button>\n }\n </div>\n\n @if (showMoreButton() && isDropdownOpen()) {\n <div class=\"dropdown\" #dropdown>\n <div class=\"dropdown-content\">\n <!-- Aqu\u00ED se mover\u00E1n los elementos overflow -->\n </div>\n </div>\n }\n</div>", styles: [".menu-wrapper{position:relative;width:100%;box-sizing:border-box}.menu{height:auto;background-color:rgb(var(--element-color-4) / .7);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);margin:.75rem;padding:1.75rem 2.5rem;border-radius:52px;border:1px var(--neutral-color-7) solid;display:flex;gap:1em;align-items:center;position:relative;width:100%;box-sizing:border-box}.menu-content{display:flex;gap:1em;align-items:center;flex:1;flex-wrap:wrap;overflow:hidden;min-width:0}.more-button{display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border:none;border-radius:18px;background-color:var(--neutral-color-9);color:var(--neutral-color-0);cursor:pointer;font-size:1rem;font-weight:500;transition:all .2s;white-space:nowrap;flex-shrink:0;margin-left:auto}.more-button:hover{background-color:var(--neutral-color-8)}.more-button svg{transition:transform .2s}.dropdown{position:absolute;top:calc(100% - .75rem);right:.75rem;background-color:rgb(var(--element-color-4) / .95);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:24px;border:1px var(--neutral-color-7) solid;padding:1rem;min-width:200px;max-width:300px;box-shadow:0 8px 24px #00000026;z-index:1000;animation:dropdownSlide .2s ease-out}@keyframes dropdownSlide{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.dropdown-content{display:flex;flex-direction:column;gap:.5rem}.dropdown-content ::ng-deep cat-button,.dropdown-content ::ng-deep button{width:100%;justify-content:flex-start}@media (max-width: 640px){:host{max-width:100vw}.menu-wrapper{max-width:100vw}.menu{padding:1rem 1.5rem;margin:.5rem;max-width:calc(100vw - 1rem);width:calc(100% - 1rem)}.dropdown{right:.5rem;left:.5rem;max-width:none}}:host{display:block;width:100%;box-sizing:border-box}@media (min-width: 641px){:host{max-width:100%}.menu-wrapper{max-width:100%}.menu{max-width:calc(100% - 1.5rem)}}\n"], dependencies: [{ kind: "component", type: Icon, selector: "cat-icon", inputs: ["size", "color", "name", "src"] }] });
1188
+ }
1189
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Menu, decorators: [{
1190
+ type: Component,
1191
+ args: [{ selector: 'cat-menu', imports: [Icon], template: "<div class=\"menu-wrapper\">\n <div class=\"menu\" #menuContainer>\n <div class=\"menu-content\" #menuContent>\n <ng-content></ng-content>\n </div>\n\n @if (showMoreButton()) {\n <button class=\"more-button\" (click)=\"toggleDropdown()\" [attr.aria-expanded]=\"isDropdownOpen()\" type=\"button\">\n <span>More</span>\n @if(isDropdownOpen()){\n <cat-icon size=\"16px\" name=\"chevron-arrow-up\"></cat-icon>\n } @else {\n <cat-icon size=\"16px\" name=\"chevron-arrow-down\"></cat-icon>\n }\n<!-- <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\"\n [style.transform]=\"isDropdownOpen() ? 'rotate(180deg)' : 'rotate(0deg)'\">\n <path d=\"M4 6l4 4 4-4z\" />\n </svg> -->\n </button>\n }\n </div>\n\n @if (showMoreButton() && isDropdownOpen()) {\n <div class=\"dropdown\" #dropdown>\n <div class=\"dropdown-content\">\n <!-- Aqu\u00ED se mover\u00E1n los elementos overflow -->\n </div>\n </div>\n }\n</div>", styles: [".menu-wrapper{position:relative;width:100%;box-sizing:border-box}.menu{height:auto;background-color:rgb(var(--element-color-4) / .7);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);margin:.75rem;padding:1.75rem 2.5rem;border-radius:52px;border:1px var(--neutral-color-7) solid;display:flex;gap:1em;align-items:center;position:relative;width:100%;box-sizing:border-box}.menu-content{display:flex;gap:1em;align-items:center;flex:1;flex-wrap:wrap;overflow:hidden;min-width:0}.more-button{display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border:none;border-radius:18px;background-color:var(--neutral-color-9);color:var(--neutral-color-0);cursor:pointer;font-size:1rem;font-weight:500;transition:all .2s;white-space:nowrap;flex-shrink:0;margin-left:auto}.more-button:hover{background-color:var(--neutral-color-8)}.more-button svg{transition:transform .2s}.dropdown{position:absolute;top:calc(100% - .75rem);right:.75rem;background-color:rgb(var(--element-color-4) / .95);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:24px;border:1px var(--neutral-color-7) solid;padding:1rem;min-width:200px;max-width:300px;box-shadow:0 8px 24px #00000026;z-index:1000;animation:dropdownSlide .2s ease-out}@keyframes dropdownSlide{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.dropdown-content{display:flex;flex-direction:column;gap:.5rem}.dropdown-content ::ng-deep cat-button,.dropdown-content ::ng-deep button{width:100%;justify-content:flex-start}@media (max-width: 640px){:host{max-width:100vw}.menu-wrapper{max-width:100vw}.menu{padding:1rem 1.5rem;margin:.5rem;max-width:calc(100vw - 1rem);width:calc(100% - 1rem)}.dropdown{right:.5rem;left:.5rem;max-width:none}}:host{display:block;width:100%;box-sizing:border-box}@media (min-width: 641px){:host{max-width:100%}.menu-wrapper{max-width:100%}.menu{max-width:calc(100% - 1.5rem)}}\n"] }]
1192
+ }], propDecorators: { variant: [{
1193
+ type: Input
1194
+ }], customClass: [{
1195
+ type: Input
1196
+ }], dataCustomClass: [{
1197
+ type: HostBinding,
1198
+ args: ['attr.data-menu-class']
1199
+ }], menuContainer: [{
1200
+ type: ViewChild,
1201
+ args: ['menuContainer', { static: false }]
1202
+ }], menuContent: [{
1203
+ type: ViewChild,
1204
+ args: ['menuContent', { static: false }]
1205
+ }], dropdown: [{
1206
+ type: ViewChild,
1207
+ args: ['dropdown', { static: false }]
1208
+ }] } });
1209
+
867
1210
  class Theming {
868
1211
  //Light Theme = False
869
1212
  activeThemeSubject = new BehaviorSubject(false);
@@ -873,13 +1216,9 @@ class Theming {
873
1216
  allPalettes$ = this.allPalettesSubject.asObservable();
874
1217
  generatePalettes(color, dark) {
875
1218
  this.activeThemeSubject.next(dark);
876
- //Step 1: Calculate the Color
877
- const colors = this.hexToRgb(color);
878
- //Step 2: Get the Primary Palette (static, doesn't change with theme)
879
- const primaryColors = this.palette(colors, false, 4); // Always use light theme
880
- //Step 3: Calculate dynamic palettes (neutral and elements)
1219
+ const primaryColors = this.calculatePrimaryColor(color);
881
1220
  const dynamicPalettes = this.calculateDynamicPalettes(dark);
882
- //Step 4: Assign All Palettes to Local Variables
1221
+ //Assign All Palettes to Local Variables
883
1222
  let allPalettes = [primaryColors];
884
1223
  allPalettes = allPalettes.concat([dynamicPalettes.neutral]);
885
1224
  allPalettes = allPalettes.concat([dynamicPalettes.elements]);
@@ -888,6 +1227,20 @@ class Theming {
888
1227
  this.applyTheme(allPalettes);
889
1228
  return this.allPalettesSubject.value;
890
1229
  }
1230
+ calculatePrimaryColor(color) {
1231
+ //Step 1: Calculate the Color
1232
+ const colors = this.hexToRgb(color);
1233
+ //Step 2: Get the Primary Palette (static, doesn't change with theme)
1234
+ const primaryColors = this.palette(colors, false, 4); // Always use light theme
1235
+ const allPalettes = [
1236
+ primaryColors, // Keep primary (static)
1237
+ this.allPalettesSubject.value[1],
1238
+ this.allPalettesSubject.value[2]
1239
+ ];
1240
+ this.allPalettesSubject.next(allPalettes);
1241
+ this.applyTheme(allPalettes);
1242
+ return primaryColors;
1243
+ }
891
1244
  calculateDynamicPalettes(dark) {
892
1245
  const theme = dark;
893
1246
  const contrastTheme = !dark;
@@ -994,5 +1347,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
994
1347
  * Generated bundle index. Do not edit.
995
1348
  */
996
1349
 
997
- export { Accordion, AccordionGroup, Button, Card, CatInput, ColorInput, DateInput, Dialog, Drag, FileInput, ICON_PROVIDER, Icon, PasswordInput, RangeInput, SelectInput, TextAreaInput, Theming, TimeInput };
1350
+ export { Accordion, AccordionGroup, Button, Card, CatInput, ColorInput, DateInput, Dialog, Drag, Drawer, FileInput, ICON_PROVIDER, Icon, Menu, PasswordInput, RangeInput, SelectInput, TextAreaInput, Theming, TimeInput };
998
1351
  //# sourceMappingURL=catarina.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"catarina.mjs","sources":["../../../projects/catarina/src/lib/tokens/icon-provider.token.ts","../../../projects/catarina/src/lib/design-system/icon/icon.ts","../../../projects/catarina/src/lib/design-system/icon/icon.html","../../../projects/catarina/src/lib/design-system/button/button.ts","../../../projects/catarina/src/lib/design-system/button/button.html","../../../projects/catarina/src/lib/design-system/panels/card/card.ts","../../../projects/catarina/src/lib/design-system/panels/card/card.html","../../../projects/catarina/src/lib/design-system/panels/accordion/accordion.ts","../../../projects/catarina/src/lib/design-system/panels/accordion/accordion.html","../../../projects/catarina/src/lib/design-system/panels/accordion-group/accordion-group.ts","../../../projects/catarina/src/lib/design-system/panels/accordion-group/accordion-group.html","../../../projects/catarina/src/lib/design-system/form/cat-input/cat-input.ts","../../../projects/catarina/src/lib/design-system/form/color-input/color-input.ts","../../../projects/catarina/src/lib/design-system/form/color-input/color-input.html","../../../projects/catarina/src/lib/design-system/form/select-input/select-input.ts","../../../projects/catarina/src/lib/design-system/form/select-input/select-input.html","../../../projects/catarina/src/lib/design-system/form/date-input/date-input.ts","../../../projects/catarina/src/lib/design-system/form/date-input/date-input.html","../../../projects/catarina/src/lib/design-system/form/file-input/file-input.ts","../../../projects/catarina/src/lib/design-system/form/file-input/file-input.html","../../../projects/catarina/src/lib/design-system/form/password-input/password-input.ts","../../../projects/catarina/src/lib/design-system/form/password-input/password-input.html","../../../projects/catarina/src/lib/design-system/form/range-input/range-input.ts","../../../projects/catarina/src/lib/design-system/form/range-input/range-input.html","../../../projects/catarina/src/lib/design-system/form/text-area-input/text-area-input.ts","../../../projects/catarina/src/lib/design-system/form/text-area-input/text-area-input.html","../../../projects/catarina/src/lib/design-system/form/time-input/time-input.ts","../../../projects/catarina/src/lib/design-system/form/time-input/time-input.html","../../../projects/catarina/src/lib/directives/drag.ts","../../../projects/catarina/src/lib/design-system/overlays/dialog/dialog.ts","../../../projects/catarina/src/lib/design-system/overlays/dialog/dialog.html","../../../projects/catarina/src/lib/theming/theming.ts","../../../projects/catarina/src/public-api.ts","../../../projects/catarina/src/catarina.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface IconProvider {\n getPath(name: string): string;\n}\n\nexport const ICON_PROVIDER = new InjectionToken<IconProvider>('ICON_PROVIDER', {\n providedIn: 'root',\n factory: () => ({\n // Fallback por defecto si no se configura\n getPath: (name: string) => `icons/${name}.svg`\n })\n});\n","import { Component, Input, inject, signal, PLATFORM_ID, OnDestroy } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { isPlatformBrowser } from '@angular/common';\nimport { ICON_PROVIDER } from '../../tokens/icon-provider.token';\n\nconst ICON_NOT_FOUND_SVG = `\n<svg viewBox=\"0 0 24 24\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" \n aria-labelledby=\"placeholderIconTitle\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\">\n <title id=\"placeholderIconTitle\">Icon not found</title>\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\"> \n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\"></rect>\n <path stroke-linecap=\"round\" d=\"M21 21L3 3 21 21zM21 3L3 21 21 3z\"></path> \n </g>\n</svg>\n`;\n\n@Component({\n selector: 'cat-icon',\n imports: [],\n templateUrl: './icon.html',\n styleUrl: './icon.css',\n})\nexport class Icon implements OnDestroy {\n private sanitizer = inject(DomSanitizer);\n private platformId = inject(PLATFORM_ID);\n private iconProvider = inject(ICON_PROVIDER);\n\n private abortController?: AbortController;\n \n svgContent = signal<SafeHtml>('');\n isLoading = signal<boolean>(false);\n\n @Input() size = '24px';\n @Input() color = 'currentColor';\n\n ngOnDestroy() {\n this.abortController?.abort();\n }\n\n // Usar nombre (con provider)\n @Input() set name(iconName: string) {\n if (!iconName) return;\n\n const path = this.iconProvider.getPath(iconName);\n\n // Cancelar petición anterior si existe\n this.abortController?.abort();\n\n // Si el path es el fallback por defecto (icons/), no intentes cargarlo\n if (!path || path.startsWith('icons/')) {\n this.showPlaceholder();\n return;\n }\n\n this.loadSvg(path);\n }\n\n // Usar path directo\n @Input() set src(path: string) {\n if (!path) return;\n \n // Cancelar petición anterior si existe\n this.abortController?.abort();\n this.loadSvg(path);\n }\n\n private loadSvg(path: string) {\n // En SSR, mostrar placeholder inmediatamente\n if (!isPlatformBrowser(this.platformId)) {\n this.showPlaceholder();\n return;\n }\n\n // Limpiar contenido y mostrar estado de carga\n this.isLoading.set(true);\n this.svgContent.set('');\n\n // Crear nuevo AbortController para esta petición\n this.abortController = new AbortController();\n\n fetch(path, { \n signal: this.abortController.signal,\n mode: 'cors',\n cache: 'default'\n })\n .then(response => {\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n return response.text();\n })\n .then(svg => {\n // VALIDACIÓN CRÍTICA: Verificar que sea un SVG\n if (!this.isValidSvg(svg)) {\n console.error(`Invalid SVG received from ${path}. Response is not valid SVG.`);\n this.showPlaceholder();\n return;\n }\n\n const processed = this.processSvg(svg);\n if (processed) {\n this.svgContent.set(this.sanitizer.bypassSecurityTrustHtml(processed));\n } else {\n this.showPlaceholder();\n }\n })\n .catch((error) => {\n // Ignorar errores de abort (son esperados)\n if (error.name === 'AbortError') {\n return;\n }\n \n console.error(`Error loading icon from ${path}:`, error.message);\n this.showPlaceholder();\n })\n .finally(() => {\n this.isLoading.set(false);\n });\n }\n\n private showPlaceholder(): void {\n this.isLoading.set(false);\n const processed = this.processSvg(ICON_NOT_FOUND_SVG);\n if (processed) {\n this.svgContent.set(this.sanitizer.bypassSecurityTrustHtml(processed));\n }\n }\n\n private isValidSvg(content: string): boolean {\n // Validaciones estrictas para asegurar que sea SVG\n const trimmed = content.trim();\n \n // 1. Debe comenzar con <svg (ignorando espacios y declaraciones XML)\n const svgRegex = /^\\s*(<\\?xml[^>]*>\\s*)?<\\s*svg\\b/i;\n if (!svgRegex.test(trimmed)) {\n return false;\n }\n\n // 2. Debe terminar con </svg>\n if (!trimmed.includes('</svg>')) {\n return false;\n }\n\n // 3. No debe contener <html>, <head>, <body> (indicaría HTML completo)\n const htmlTags = ['<html', '<head', '<body', '<!DOCTYPE html'];\n for (const tag of htmlTags) {\n if (trimmed.toLowerCase().includes(tag.toLowerCase())) {\n return false;\n }\n }\n\n // 4. Tamaño razonable para un icono (máximo 100KB)\n if (content.length > 100 * 1024) {\n console.warn('SVG file is too large for an icon:', content.length, 'bytes');\n return false;\n }\n\n return true;\n }\n\n private processSvg(svg: string): string | null {\n // Validar antes de procesar\n if (!this.isValidSvg(svg)) {\n return null;\n }\n\n // En SSR, usar procesamiento simple con regex (no hay DOMParser)\n if (!isPlatformBrowser(this.platformId)) {\n return this.processSvgWithRegex(svg);\n }\n\n // En Browser, usar DOMParser para procesamiento robusto\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(svg, 'image/svg+xml');\n \n // Verificar que no haya errores de parseo\n const parserError = doc.querySelector('parsererror');\n if (parserError) {\n console.error('SVG parsing error:', parserError.textContent);\n return null;\n }\n\n const svgElement = doc.querySelector('svg');\n if (!svgElement) {\n return null;\n }\n\n // Verificar que sea realmente un elemento SVG\n if (svgElement.tagName.toLowerCase() !== 'svg') {\n return null;\n }\n\n // Modificar solo el elemento <svg> raíz\n svgElement.removeAttribute('width');\n svgElement.removeAttribute('height');\n\n // Cambiar fill y stroke solo si no son \"none\"\n const currentFill = svgElement.getAttribute('fill');\n if (currentFill && currentFill !== 'none') {\n svgElement.setAttribute('fill', 'currentColor');\n }\n\n const currentStroke = svgElement.getAttribute('stroke');\n if (currentStroke && currentStroke !== 'none') {\n svgElement.setAttribute('stroke', 'currentColor');\n }\n\n // Asegurar viewBox (requerido para escalado)\n if (!svgElement.hasAttribute('viewBox')) {\n svgElement.setAttribute('viewBox', '0 0 24 24');\n }\n\n // Serializar de vuelta a string\n return new XMLSerializer().serializeToString(svgElement);\n } catch (error) {\n console.error('Error processing SVG:', error);\n return null;\n }\n }\n\n private processSvgWithRegex(svg: string): string {\n // Procesamiento simple con regex para SSR (donde no hay DOMParser)\n let processed = svg;\n\n // Remover width y height solo del tag <svg> de apertura\n processed = processed.replace(/(<svg[^>]*?)\\s+width=\"[^\"]*\"/i, '$1');\n processed = processed.replace(/(<svg[^>]*?)\\s+height=\"[^\"]*\"/i, '$1');\n\n // Cambiar fill a currentColor si existe y no es \"none\"\n processed = processed.replace(\n /(<svg[^>]*?\\s+fill=\")(?!none)([^\"]*)(\")/i, \n '$1currentColor$3'\n );\n\n // Cambiar stroke a currentColor si existe y no es \"none\"\n processed = processed.replace(\n /(<svg[^>]*?\\s+stroke=\")(?!none)([^\"]*)(\")/i, \n '$1currentColor$3'\n );\n\n // Asegurar viewBox si no existe\n if (!/viewBox=/i.test(processed)) {\n processed = processed.replace(\n /(<svg[^>]*?)>/i, \n '$1 viewBox=\"0 0 24 24\">'\n );\n }\n\n return processed;\n }\n}","<span [innerHTML]=\"svgContent()\" [style.width]=\"size\" [style.height]=\"size\" [style.display]=\"'inline-flex'\"\n [style.color]=\"color\" class=\"cat-icon\">\n</span>","import { Component, Input, Output, EventEmitter, HostBinding } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Icon } from '../icon/icon';\n\n@Component({\n selector: 'cat-button',\n imports: [Icon],\n templateUrl: './button.html',\n styleUrl: './button.scss',\n})\nexport class Button {\n @Input() variant: 'primary' | 'secondary' | 'contrast' | 'outline' | 'ghost' = 'primary';\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\n @Input() disabled = false;\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\n @Input() iconLeft?: string;\n @Input() iconCenter?: string;\n @Input() iconRight?: string;\n @Input() customClass = '';\n\n @Output() clicked = new EventEmitter<MouseEvent>();\n\n get buttonClasses(): string {\n return `${this.variant} ${this.size} ${this.customClass}`;\n }\n\n get iconSize(): string {\n const sizes = { sm: '16px', md: '20px', lg: '24px' };\n return sizes[this.size];\n }\n\n @HostBinding('attr.data-button-class') get dataCustomClass() {\n return this.customClass;\n }\n\n handleClick(event: MouseEvent): void {\n if (!this.disabled) {\n this.clicked.emit(event);\n }\n }\n}\n","<button [class]=\"buttonClasses\" [disabled]=\"disabled\" [type]=\"type\" (click)=\"handleClick($event)\">\n\n @if (iconLeft) {\n <cat-icon [name]=\"iconLeft\" [size]=\"iconSize\" class=\"icon-left\">\n </cat-icon>\n }\n\n <span class=\"button-content\">\n @if (iconCenter) {\n <cat-icon [name]=\"iconCenter\" [size]=\"iconSize\" class=\"icon-left\">\n </cat-icon>\n }\n <ng-content></ng-content>\n </span>\n\n @if (iconRight) {\n <cat-icon [name]=\"iconRight\" [size]=\"iconSize\" class=\"icon-right\">\n </cat-icon>\n }\n</button>","import { Component, Input, HostBinding } from '@angular/core';\n\n@Component({\n selector: 'cat-card',\n templateUrl: './card.html',\n styleUrls: ['./card.css']\n})\nexport class Card {\n @Input() variant: 'surface' | 'outlined' | 'elevated' = 'surface';\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\n @Input() width: string = 'auto';\n @Input() customClass = '';\n\n // Exponer las clases como atributos de datos\n @HostBinding('attr.data-card-variant') get dataVariant() {\n return this.variant;\n }\n \n @HostBinding('attr.data-card-size') get dataSize() {\n return this.size;\n }\n \n @HostBinding('attr.data-card-class') get dataCustomClass() {\n return this.customClass;\n }\n\n /*// También exponer como CSS Custom Properties\n @HostBinding('style.--card-variant') get cssVariant() {\n return this.variant;\n }\n \n @HostBinding('style.--card-custom-class') get cssCustomClass() {\n return this.customClass;\n }\n*/\n get cardClasses(): string {\n return `${this.variant} ${this.size} ${this.customClass}`;\n }\n}","<section [class]=\"cardClasses\" [attr.data-class]=\"customClass\" [style]=\"`width: ${width};`\">\n <ng-content></ng-content>\n</section>","import { Component, ElementRef, EventEmitter, HostBinding, Input, Output, ViewChild } from '@angular/core';\nimport { Button as CButton } from '../../button/button';\nimport { NgClass, NgIf } from '@angular/common';\n\n@Component({\n selector: 'cat-accordion',\n imports: [CButton, NgClass, NgIf],\n templateUrl: './accordion.html',\n styleUrl: './accordion.css',\n})\nexport class Accordion {\n @Input() accordionId?: string;\n @Input() status: boolean = false;//false = unactive\n @Input() label: string = 'Accordion Name';\n\n @Input() disabled = false;\n @Input() customClass = '';\n @Input() width: string = 'auto';\n\n //Button Properties\n @Input() buttonVariant: 'primary' | 'secondary' | 'contrast' | 'outline' | 'ghost' = 'secondary';\n @Input() buttonSize: 'sm' | 'md' | 'lg' = 'md';\n @Input() iconLeft: boolean = false;\n @Input() iconCenter: boolean = false;\n @Input() iconRight: boolean = true;\n\n //Panel Properties\n @Input() scrolleable: boolean = false;\n @Input() variant: 'surface' | 'outlined' | 'elevated' = 'surface';\n\n @Output() updateAccordionGroupStatusOutput = new EventEmitter<string>();\n\n @ViewChild('buttonRef', { static: false }) buttonRef!: ElementRef;\n buttonWidth: number = 0;\n\n ngAfterViewInit() {\n // Obtener el ancho del botón después de renderizar\n setTimeout(() => {\n if (this.buttonRef) {\n const button = this.buttonRef.nativeElement.querySelector('button');\n if (button) {\n this.buttonWidth = button.offsetWidth;\n }\n }\n });\n }\n\n // Actualizar cuando cambie el label o otros inputs que afecten tamaño\n ngOnChanges() {\n if (this.buttonRef) {\n const button = this.buttonRef.nativeElement.querySelector('button');\n if (button) {\n this.buttonWidth = button.offsetWidth;\n }\n }\n }\n updateAccordionGroupStatus() {\n this.status = !this.status;\n this.updateAccordionGroupStatusOutput.emit(this.accordionId!);\n }\n\n forceStatus(newStatus: boolean): void {\n this.status = newStatus;\n };\n\n @HostBinding('attr.data-accordion-class') get dataCustomClass() {\n return this.customClass;\n }\n\n get panelClasses(): string {\n return `${this.variant} ${this.customClass} ${this.scrolleable ? 'scrolleable' : undefined}`;\n }\n}\n","<section class=\"accordion\" [style]=\"`width: ${width};`\">\n <div>\n <cat-button [iconLeft]=\"iconLeft ? (status ? 'minus' : 'plus') : undefined\"\n [iconCenter]=\"iconCenter ? (status ? 'minus' : 'plus') : undefined\"\n [iconRight]=\"iconRight && status ? 'minus' : 'plus'\" (clicked)=\"updateAccordionGroupStatus()\"\n [variant]=\"buttonVariant\" [size]=\"buttonSize\" customClass=\"accordion-button\" [disabled]=\"disabled\">\n {{label}}\n </cat-button>\n </div>\n <div [class]=\"panelClasses\" [ngClass]=\"status ? 'accordion-panel-active': 'accordion-panel-unactive'\">\n <ng-content *ngIf=\"status\"></ng-content>\n </div>\n</section>","import { Component, ContentChildren, HostBinding, Input, QueryList } from '@angular/core';\nimport { Accordion as CAccordion } from '../accordion/accordion';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'cat-accordion-group',\n imports: [],\n templateUrl: './accordion-group.html',\n styleUrl: './accordion-group.css',\n})\nexport class AccordionGroup {\n @Input() singleExpand: boolean = true;\n @Input() customClass: string = '';\n\n @ContentChildren(CAccordion) accordions!: QueryList<CAccordion>;\n\n accordionActiveId?: String;\n\n sub?: Subscription | null;\n\n ngAfterContentInit(): void {\n if (this.singleExpand) {\n this.accordions.forEach(acc => {\n this.sub = acc.updateAccordionGroupStatusOutput.subscribe(id => {\n this.handleOpen(id);\n });\n });\n }\n }\n\n handleOpen(id: string) {\n this.accordions.forEach(acc => acc.forceStatus(false));\n const target = this.accordions.find(acc => acc.accordionId === id);\n if (this.accordionActiveId === id) {\n target?.forceStatus(false);\n this.accordionActiveId = undefined;\n } else {\n target?.forceStatus(true);\n this.accordionActiveId = id;\n }\n }\n\n @HostBinding('attr.data-accordion-group-class') get dataCustomClass() {\n return this.customClass;\n }\n\n get accordionGroupClasses() {\n return `${this.customClass}`;\n }\n}\n","<style>\n section {\n width: 100%;\n }\n</style>\n<section [class]=\"accordionGroupClasses\">\n <ng-content></ng-content>\n</section>","import { Directive, ElementRef, Renderer2, OnInit, inject, Optional, Self, PLATFORM_ID } from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Directive({\n selector: '[catInput]',\n standalone: true,\n host: {\n '[class.cat-input]': 'true',\n '[class.md]': 'true',\n '[class.invalid]': 'isInvalid'\n }\n})\nexport class CatInput implements OnInit {\n private el = inject(ElementRef);\n private platformId = inject(PLATFORM_ID);\n @Optional() @Self() public control: NgControl | null = inject(NgControl, { optional: true, self: true });\n\n private static stylesInjected = false;\n\n ngOnInit(): void {\n if (this.el.nativeElement.tagName.toLowerCase() !== 'input') {\n console.warn('catInput directive can only be used on <input> elements');\n return;\n }\n\n // Inyectar estilos solo una vez\n if (!CatInput.stylesInjected && isPlatformBrowser(this.platformId)) {\n this.injectStyles();\n CatInput.stylesInjected = true;\n }\n }\n\n private injectStyles(): void {\n const style = document.createElement('style');\n style.textContent = `\n .cat-input {\n border: 1px solid var(--neutral-color-3);\n background-color: var(--neutral-color-0);\n color: var(--neutral-color-9);\n border-radius: 18px;\n outline: none;\n transition: all 0.2s;\n }\n\n .cat-input:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .cat-input::placeholder {\n color: var(--neutral-color-6);\n transition: font-size 0.2s;\n }\n\n .cat-input:focus::placeholder {\n font-size: 0.7em;\n }\n\n .cat-input:focus {\n border: 1px solid var(--neutral-color-9);\n }\n\n .cat-input.invalid,\n .cat-input.ng-invalid.ng-touched {\n border: 1px solid red;\n }\n\n .cat-input.ng-valid.ng-touched {\n border: 1px solid green;\n }\n\n .cat-input.md {\n padding: 0.5rem 1rem;\n font-size: 1rem;\n }\n\n .cat-input.sm {\n padding: 0.25rem 0.75rem;\n font-size: 0.875rem;\n }\n\n .cat-input.lg {\n padding: 0.75rem 1.5rem;\n font-size: 1.125rem;\n }\n `;\n document.head.appendChild(style);\n }\n\n get isInvalid(): boolean {\n return !!(this.control && this.control.invalid && this.control.touched);\n }\n}","import { Component, forwardRef, Input } from '@angular/core';\nimport { Icon as CIcon } from '../../icon/icon';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'cat-color-input',\n imports: [CIcon],\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ColorInput),\n multi: true\n }],\n templateUrl: './color-input.html',\n styleUrl: './color-input.css',\n})\nexport class ColorInput implements ControlValueAccessor {\n value: string = '#000000';\n @Input() icon?: boolean = false;\n @Input() size: string ='2em';\n\n private onChange = (value: any) => { };\n onTouched = () => { };\n\n onInput(event: Event) {\n const newValue = (event.target as HTMLInputElement).value;\n this.value = newValue;\n this.onChange(newValue); // informa al padre \n }\n\n // Métodos requeridos por ControlValueAccessor\n writeValue(value: any): void {\n this.value = value || '#000000';\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n\n this.onTouched = fn;\n }\n}\n","<style>\n div {\n position: relative;\n aspect-ratio: 1/1;\n }\n\n div:hover {\n cursor: grab;\n }\n input {\n width: 100%;\n aspect-ratio: 1/1;\n top: 0;\n left: 0;\n }\n cat-icon {\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n }\n</style>\n<!-- input-color.html -->\n<div [style]=\"`width: ${size};`\">\n <input type=\"color\" [style]=\"icon ? 'opacity: 0;' : 'opacity: 100%;'\" [value]=\"value\" (input)=\"onInput($event)\" (blur)=\"onTouched()\">\n @if (icon) {\n <cat-icon [style]=\"`height: ${size};`\" size=\"100%\" name=\"palette\"></cat-icon> \n }\n</div>","import { NgFor, NgClass } from '@angular/common';\nimport { Component, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, ViewChild } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CatInput } from \"../cat-input/cat-input\";\n\n@Component({\n selector: 'cat-select-input',\n imports: [\n NgFor,\n CatInput,\n NgClass\n ],\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectInput),\n multi: true\n }],\n templateUrl: './select-input.html',\n styleUrl: './select-input.css',\n})\nexport class SelectInput implements ControlValueAccessor {\n @ViewChild('input') inputEl!: ElementRef<HTMLElement>;\n\n @Input() transform?: string; //This option basicly allow to the consumer put the options at the side where he wants\n @Input() options?: string[];\n @Input() placeholder: string = '';\n @Input() type: 'string' | 'number' = 'string';\n\n value: string | number = '';\n active = false;\n\n @Input() variant: 'surface' | 'elevated' | 'outlined' = 'surface';\n @Input() scrolleable: boolean = false;\n @Input() customClass: string = '';\n\n //@Output() selected = new EventEmitter<string>();\n\n //Accesibility\n @HostListener('document:click', ['$event'])\n outerClick(event: Event) {\n if (!this.el.nativeElement.contains(event.target)) {\n this.active = false;\n }\n };\n\n constructor(\n private el: ElementRef,\n ) { }\n\n onChange = (value: any) => { };\n onTouched = () => { };\n\n //Here starts the events from ControlValueAccesor\n writeValue(value: any): void {\n this.value = value;\n };\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n //Here ends The events from ControlValueAccesor\n\n choseValue(option: any) {\n this.value = option;\n this.onChange(option);\n this.onTouched();\n this.active = false;\n //this.selected.emit(option);\n };\n\n @HostBinding('attr.data-select-input-class') get dataCustomClass() {\n return this.customClass;\n }\n\n get selectInputClass(): string {\n return `${this.variant} ${this.scrolleable ? 'scrolleable' : ''}`;\n }\n}\n","<div>\n <input catInput [value]=\"value\" [type]=\"type\" readonly id=\"select\" (mousedown)=\"active =! active\" [placeholder]=\"placeholder\">\n <section role=\"listbox\" [class]=\"selectInputClass\" class=\"options\" [ngClass]=\"active ? 'options-active' : 'options.unactive'\" [style.transform]=\"transform\">\n @if (active) {\n <div role=\"option\"*ngFor=\"let option of options\" (mousedown)=\"choseValue(option)\">\n {{ option }}\n </div>\n }\n </section>\n</div>","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-date-input',\n imports: [],\n templateUrl: './date-input.html',\n styleUrl: './date-input.css',\n})\nexport class DateInput {\n\n}\n","<p>date-input works!</p>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-file-input',\n imports: [],\n templateUrl: './file-input.html',\n styleUrl: './file-input.css',\n})\nexport class FileInput {\n\n}\n","<p>file-input works!</p>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-password-input',\n imports: [],\n templateUrl: './password-input.html',\n styleUrl: './password-input.css',\n})\nexport class PasswordInput {\n\n}\n","<p>password-input works!</p>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-range-input',\n imports: [],\n templateUrl: './range-input.html',\n styleUrl: './range-input.css',\n})\nexport class RangeInput {\n\n}\n","<p>range-input works!</p>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-text-area-input',\n imports: [],\n templateUrl: './text-area-input.html',\n styleUrl: './text-area-input.css',\n})\nexport class TextAreaInput {\n\n}\n","<p>text-area-input works!</p>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-time-input',\n imports: [],\n templateUrl: './time-input.html',\n styleUrl: './time-input.css',\n})\nexport class TimeInput {\n\n}\n","<p>time-input works!</p>\n","import { AfterViewInit, Directive, DOCUMENT, ElementRef, Inject, Renderer2 } from '@angular/core';\n\n@Directive({\n selector: '[CDrag]'\n})\nexport class Drag implements AfterViewInit {\n private offsetX = 0;\n private offsetY = 0;\n private dragging = false;\n\n constructor(\n private el: ElementRef,\n private renderer: Renderer2,\n @Inject(DOCUMENT) private document: Document\n ) { }\n\n ngAfterViewInit() {\n const el = this.el.nativeElement as HTMLElement;\n\n // Si el elemento no tiene position seteado, le ponemos absolute\n if (typeof window !== 'undefined') {\n const computedStyle = window.getComputedStyle(el);\n if (computedStyle.position === 'static') {\n this.renderer.setStyle(el, 'position', 'absolute');\n }\n }\n\n\n el.addEventListener('mousedown', (e: MouseEvent) => {\n this.dragging = true;\n this.offsetX = e.clientX - el.offsetLeft;\n this.offsetY = e.clientY - el.offsetTop;\n el.style.cursor = 'grabbing';\n });\n\n this.document.addEventListener('mousemove', (e: MouseEvent) => {\n if (this.dragging) {\n el.style.left = e.clientX - this.offsetX + 'px';\n el.style.top = e.clientY - this.offsetY + 'px';\n }\n });\n\n this.document.addEventListener('mouseup', () => {\n this.dragging = false;\n el.style.cursor = 'grab';\n });\n }\n\n}\n","import { Component, EventEmitter, HostBinding, HostListener, Input, Output } from '@angular/core';\nimport { Drag } from '../../../directives/drag';\n\n@Component({\n selector: 'cat-dialog',\n imports: [Drag],\n templateUrl: './dialog.html',\n styleUrl: './dialog.css',\n})\nexport class Dialog {\n @Output() closs = new EventEmitter<boolean>();\n @HostListener('window:keydown.escape', ['$event'])\n handleKeyDown(event: Event) {\n this.clossOverlay();\n }\n @Input() variant: 'surface' | 'outlined' | 'elevated' = 'surface';\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\n @Input() customClass = '';\n\n // Exponer las clases como atributos de datos\n @HostBinding('attr.data-card-variant') get dataVariant() {\n return this.variant;\n }\n\n @HostBinding('attr.data-card-size') get dataSize() {\n return this.size;\n }\n\n @HostBinding('attr.data-card-class') get dataCustomClass() {\n return this.customClass;\n }\n\n get dialogClasses(): string {\n return `${this.variant} ${this.size} ${this.customClass}`;\n }\n\n clossOverlay() {\n this.closs.emit(false);\n };\n}\n","<div class=\"dialog-shadow\" (click)=\"clossOverlay()\">\n</div>\n<section CDrag [class]=\"dialogClasses\">\n <ng-content></ng-content>\n</section>","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\ninterface RGB {\n red: number;\n green: number;\n blue: number;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Theming {\n //Light Theme = False\n private activeThemeSubject = new BehaviorSubject<boolean>(false);\n public activeTheme$ = this.activeThemeSubject.asObservable();\n\n //Palettes\n private allPalettesSubject = new BehaviorSubject<string[][]>([]);\n public allPalettes$ = this.allPalettesSubject.asObservable();\n\n generatePalettes(color: string, dark: boolean): string[][] {\n this.activeThemeSubject.next(dark);\n\n //Step 1: Calculate the Color\n const colors = this.hexToRgb(color);\n\n //Step 2: Get the Primary Palette (static, doesn't change with theme)\n const primaryColors: string[] = this.palette(colors, false, 4); // Always use light theme\n\n //Step 3: Calculate dynamic palettes (neutral and elements)\n const dynamicPalettes = this.calculateDynamicPalettes(dark);\n\n //Step 4: Assign All Palettes to Local Variables\n let allPalettes: string[][] = [primaryColors];\n\n allPalettes = allPalettes.concat([dynamicPalettes.neutral]);\n allPalettes = allPalettes.concat([dynamicPalettes.elements]);\n\n this.allPalettesSubject.next(allPalettes);\n\n //Apply theme\n this.applyTheme(allPalettes);\n \n return this.allPalettesSubject.value;\n }\n\n public calculateDynamicPalettes(dark: boolean): { neutral: string[], elements: string[] } {\n const theme: boolean = dark;\n const contrastTheme: boolean = !dark;\n this.activeThemeSubject.next(dark);\n\n\n // Calculate neutral colors (changes with theme)\n const neutralColors: string[] = contrastTheme\n ? this.palette({ red: 255, green: 255, blue: 255 }, false, 9)\n : this.palette({ red: 0, green: 0, blue: 0 }, true, 9);\n\n // Calculate element colors (changes with theme)\n const elementsColors: string[] = this.elementsColors(theme, 3, 40);\n\n // Update palettes array with dynamic values\n const allPalettes = [\n this.allPalettesSubject.value[0], // Keep primary (static)\n neutralColors,\n elementsColors\n ];\n\n this.allPalettesSubject.next(allPalettes);\n\n // Apply theme to CSS variables\n this.applyTheme(allPalettes);\n \n return {\n neutral: neutralColors,\n elements: elementsColors\n };\n }\n\n private palette(colors: { red: number, green: number, blue: number }, dark: boolean, steps: number) {\n //Palette\n const colorsReturn: string[] = [];\n\n const contrastTheme: boolean = !dark;\n const target = contrastTheme ? 0 : 255;\n\n const umbralR = (target - colors.red) / steps;\n const umbralG = (target - colors.green) / steps;\n const umbralB = (target - colors.blue) / steps;\n\n for (let i = 0; i <= steps; i++) {\n const r = Math.round(colors.red + umbralR * i);\n const g = Math.round(colors.green + umbralG * i);\n const b = Math.round(colors.blue + umbralB * i);\n\n colorsReturn.push(`rgb(${r}, ${g}, ${b})`);\n }\n return colorsReturn;\n };\n\n private elementsColors(theme: boolean, iteration: number, amplitude: number) {\n amplitude = amplitude / iteration;\n const colorsReturn: string[] = [];\n for (let i = 0; i < 5; i++) {\n let r = theme ? 0 + ((85 - 0) / (5 - 1) * i) : 0 + ((255 - 0) / (5 - 1) * i);\n let g = theme ? 0 + ((85 - 0) / (5 - 1) * i) : 0 + ((255 - 0) / (5 - 1) * i);\n let b = theme ? 0 + ((85 - 0) / (5 - 1) * i) : 0 + ((255 - 0) / (5 - 1) * i);\n\n if (i <= iteration && theme === false) {\n r = r + amplitude;\n g = g + amplitude;\n b = b + amplitude;\n } else if (theme === false) {\n r = r - amplitude;\n g = g - amplitude;\n b = b - amplitude;\n }\n colorsReturn.push(`rgb(${r}, ${g},${b})`);\n };\n return colorsReturn;\n };\n\n private applyTheme(palettes: string[][]): void {\n if (typeof document === 'undefined') return;\n\n const root = document.documentElement;\n const cssVars = [\n { prefix: '--primary-color-', index: 0 },\n { prefix: '--neutral-color-', index: 1 },\n { prefix: '--element-color-', index: 2 }\n ];\n\n cssVars.forEach(({ prefix, index }) => {\n palettes[index]?.forEach((color, i) => {\n root.style.setProperty(`${prefix}${i}`, color);\n });\n });\n }\n\n private hexToRgb(hex: string): RGB {\n const value = parseInt(hex.replace('#', ''), 16);\n return {\n red: (value >> 16) & 255,\n green: (value >> 8) & 255,\n blue: value & 255,\n };\n }\n}","/*\n * Public API Surface of catarina\n */\n\n// design-system\nexport * from './lib/design-system/icon/icon';\nexport * from './lib/design-system/button/button';\n\n// Panels\nexport * from './lib/design-system/panels/card/card';\nexport * from './lib/design-system/panels/accordion/accordion';\nexport * from './lib/design-system/panels/accordion-group/accordion-group';\n\n//form\nexport * from './lib/design-system/form/cat-input/cat-input';\nexport * from './lib/design-system/form/color-input/color-input';\nexport * from './lib/design-system/form/select-input/select-input';\n\n//Pending https://tecsify.com/blog/input-en-html/\nexport * from './lib/design-system/form/date-input/date-input';\nexport * from './lib/design-system/form/file-input/file-input';\nexport * from './lib/design-system/form/password-input/password-input';\nexport * from './lib/design-system/form/range-input/range-input';\nexport * from './lib/design-system/form/text-area-input/text-area-input';\nexport * from './lib/design-system/form/time-input/time-input';\n/*\nimage, search, telefono, reset, radio button, checkbox, button, email\n*/\n\n//Overlays\n//Pending\nexport * from './lib/design-system/overlays/dialog/dialog';\n\n\n/*Services and Directives */\n\nexport * from './lib/directives/drag';\nexport * from './lib/theming/theming';\n\n// Tokens\nexport * from './lib/tokens/icon-provider.token';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["CButton","CAccordion","CIcon"],"mappings":"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"}
1
+ {"version":3,"file":"catarina.mjs","sources":["../../../projects/catarina/src/lib/tokens/icon-provider.token.ts","../../../projects/catarina/src/lib/design-system/icon/icon.ts","../../../projects/catarina/src/lib/design-system/icon/icon.html","../../../projects/catarina/src/lib/design-system/button/button.ts","../../../projects/catarina/src/lib/design-system/button/button.html","../../../projects/catarina/src/lib/design-system/panels/card/card.ts","../../../projects/catarina/src/lib/design-system/panels/card/card.html","../../../projects/catarina/src/lib/design-system/panels/accordion/accordion.ts","../../../projects/catarina/src/lib/design-system/panels/accordion/accordion.html","../../../projects/catarina/src/lib/design-system/panels/accordion-group/accordion-group.ts","../../../projects/catarina/src/lib/design-system/panels/accordion-group/accordion-group.html","../../../projects/catarina/src/lib/design-system/form/cat-input/cat-input.ts","../../../projects/catarina/src/lib/design-system/form/color-input/color-input.ts","../../../projects/catarina/src/lib/design-system/form/color-input/color-input.html","../../../projects/catarina/src/lib/design-system/form/select-input/select-input.ts","../../../projects/catarina/src/lib/design-system/form/select-input/select-input.html","../../../projects/catarina/src/lib/design-system/form/date-input/date-input.ts","../../../projects/catarina/src/lib/design-system/form/date-input/date-input.html","../../../projects/catarina/src/lib/design-system/form/file-input/file-input.ts","../../../projects/catarina/src/lib/design-system/form/file-input/file-input.html","../../../projects/catarina/src/lib/design-system/form/password-input/password-input.ts","../../../projects/catarina/src/lib/design-system/form/password-input/password-input.html","../../../projects/catarina/src/lib/design-system/form/range-input/range-input.ts","../../../projects/catarina/src/lib/design-system/form/range-input/range-input.html","../../../projects/catarina/src/lib/design-system/form/text-area-input/text-area-input.ts","../../../projects/catarina/src/lib/design-system/form/text-area-input/text-area-input.html","../../../projects/catarina/src/lib/design-system/form/time-input/time-input.ts","../../../projects/catarina/src/lib/design-system/form/time-input/time-input.html","../../../projects/catarina/src/lib/directives/drag.ts","../../../projects/catarina/src/lib/design-system/overlays/dialog/dialog.ts","../../../projects/catarina/src/lib/design-system/overlays/dialog/dialog.html","../../../projects/catarina/src/lib/design-system/overlays/drawer/drawer.ts","../../../projects/catarina/src/lib/design-system/overlays/drawer/drawer.html","../../../projects/catarina/src/lib/design-system/overlays/menu/menu.ts","../../../projects/catarina/src/lib/design-system/overlays/menu/menu.html","../../../projects/catarina/src/lib/theming/theming.ts","../../../projects/catarina/src/public-api.ts","../../../projects/catarina/src/catarina.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface IconProvider {\n getPath(name: string): string;\n}\n\nexport const ICON_PROVIDER = new InjectionToken<IconProvider>('ICON_PROVIDER', {\n providedIn: 'root',\n factory: () => ({\n // Fallback por defecto si no se configura\n getPath: (name: string) => `icons/${name}.svg`\n })\n});\n","import { Component, Input, inject, signal, PLATFORM_ID, OnDestroy } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { isPlatformBrowser } from '@angular/common';\nimport { ICON_PROVIDER } from '../../tokens/icon-provider.token';\n\nconst ICON_NOT_FOUND_SVG = `\n<svg viewBox=\"0 0 24 24\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" \n aria-labelledby=\"placeholderIconTitle\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\">\n <title id=\"placeholderIconTitle\">Icon not found</title>\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\"> \n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\"></rect>\n <path stroke-linecap=\"round\" d=\"M21 21L3 3 21 21zM21 3L3 21 21 3z\"></path> \n </g>\n</svg>\n`;\n\n@Component({\n selector: 'cat-icon',\n imports: [],\n templateUrl: './icon.html',\n styleUrl: './icon.css',\n})\nexport class Icon implements OnDestroy {\n private sanitizer = inject(DomSanitizer);\n private platformId = inject(PLATFORM_ID);\n private iconProvider = inject(ICON_PROVIDER);\n\n private abortController?: AbortController;\n \n svgContent = signal<SafeHtml>('');\n isLoading = signal<boolean>(false);\n\n @Input() size: string = '1em';\n @Input() color = 'currentColor';\n\n ngOnDestroy() {\n this.abortController?.abort();\n }\n\n // Usar nombre (con provider)\n @Input() set name(iconName: string) {\n if (!iconName) return;\n\n const path = this.iconProvider.getPath(iconName);\n\n // Cancelar petición anterior si existe\n this.abortController?.abort();\n\n // Si el path es el fallback por defecto (icons/), no intentes cargarlo\n if (!path || path.startsWith('icons/')) {\n this.showPlaceholder();\n return;\n }\n\n this.loadSvg(path);\n }\n\n // Usar path directo\n @Input() set src(path: string) {\n if (!path) return;\n \n // Cancelar petición anterior si existe\n this.abortController?.abort();\n this.loadSvg(path);\n }\n\n private loadSvg(path: string) {\n // En SSR, mostrar placeholder inmediatamente\n if (!isPlatformBrowser(this.platformId)) {\n this.showPlaceholder();\n return;\n }\n\n // Limpiar contenido y mostrar estado de carga\n this.isLoading.set(true);\n this.svgContent.set('');\n\n // Crear nuevo AbortController para esta petición\n this.abortController = new AbortController();\n\n fetch(path, { \n signal: this.abortController.signal,\n mode: 'cors',\n cache: 'default'\n })\n .then(response => {\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n return response.text();\n })\n .then(svg => {\n // VALIDACIÓN CRÍTICA: Verificar que sea un SVG\n if (!this.isValidSvg(svg)) {\n console.error(`Invalid SVG received from ${path}. Response is not valid SVG.`);\n this.showPlaceholder();\n return;\n }\n\n const processed = this.processSvg(svg);\n if (processed) {\n this.svgContent.set(this.sanitizer.bypassSecurityTrustHtml(processed));\n } else {\n this.showPlaceholder();\n }\n })\n .catch((error) => {\n // Ignorar errores de abort (son esperados)\n if (error.name === 'AbortError') {\n return;\n }\n \n console.error(`Error loading icon from ${path}:`, error.message);\n this.showPlaceholder();\n })\n .finally(() => {\n this.isLoading.set(false);\n });\n }\n\n private showPlaceholder(): void {\n this.isLoading.set(false);\n const processed = this.processSvg(ICON_NOT_FOUND_SVG);\n if (processed) {\n this.svgContent.set(this.sanitizer.bypassSecurityTrustHtml(processed));\n }\n }\n\n private isValidSvg(content: string): boolean {\n // Validaciones estrictas para asegurar que sea SVG\n const trimmed = content.trim();\n \n // 1. Debe comenzar con <svg (ignorando espacios y declaraciones XML)\n const svgRegex = /^\\s*(<\\?xml[^>]*>\\s*)?<\\s*svg\\b/i;\n if (!svgRegex.test(trimmed)) {\n return false;\n }\n\n // 2. Debe terminar con </svg>\n if (!trimmed.includes('</svg>')) {\n return false;\n }\n\n // 3. No debe contener <html>, <head>, <body> (indicaría HTML completo)\n const htmlTags = ['<html', '<head', '<body', '<!DOCTYPE html'];\n for (const tag of htmlTags) {\n if (trimmed.toLowerCase().includes(tag.toLowerCase())) {\n return false;\n }\n }\n\n // 4. Tamaño razonable para un icono (máximo 100KB)\n if (content.length > 100 * 1024) {\n console.warn('SVG file is too large for an icon:', content.length, 'bytes');\n return false;\n }\n\n return true;\n }\n\n private processSvg(svg: string): string | null {\n // Validar antes de procesar\n if (!this.isValidSvg(svg)) {\n return null;\n }\n\n // En SSR, usar procesamiento simple con regex (no hay DOMParser)\n if (!isPlatformBrowser(this.platformId)) {\n return this.processSvgWithRegex(svg);\n }\n\n // En Browser, usar DOMParser para procesamiento robusto\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(svg, 'image/svg+xml');\n \n // Verificar que no haya errores de parseo\n const parserError = doc.querySelector('parsererror');\n if (parserError) {\n console.error('SVG parsing error:', parserError.textContent);\n return null;\n }\n\n const svgElement = doc.querySelector('svg');\n if (!svgElement) {\n return null;\n }\n\n // Verificar que sea realmente un elemento SVG\n if (svgElement.tagName.toLowerCase() !== 'svg') {\n return null;\n }\n\n // Modificar solo el elemento <svg> raíz\n svgElement.removeAttribute('width');\n svgElement.removeAttribute('height');\n\n // Cambiar fill y stroke solo si no son \"none\"\n const currentFill = svgElement.getAttribute('fill');\n if (currentFill && currentFill !== 'none') {\n svgElement.setAttribute('fill', 'currentColor');\n }\n\n const currentStroke = svgElement.getAttribute('stroke');\n if (currentStroke && currentStroke !== 'none') {\n svgElement.setAttribute('stroke', 'currentColor');\n }\n\n // Asegurar viewBox (requerido para escalado)\n if (!svgElement.hasAttribute('viewBox')) {\n svgElement.setAttribute('viewBox', '0 0 24 24');\n }\n\n // Serializar de vuelta a string\n return new XMLSerializer().serializeToString(svgElement);\n } catch (error) {\n console.error('Error processing SVG:', error);\n return null;\n }\n }\n\n private processSvgWithRegex(svg: string): string {\n // Procesamiento simple con regex para SSR (donde no hay DOMParser)\n let processed = svg;\n\n // Remover width y height solo del tag <svg> de apertura\n processed = processed.replace(/(<svg[^>]*?)\\s+width=\"[^\"]*\"/i, '$1');\n processed = processed.replace(/(<svg[^>]*?)\\s+height=\"[^\"]*\"/i, '$1');\n\n // Cambiar fill a currentColor si existe y no es \"none\"\n processed = processed.replace(\n /(<svg[^>]*?\\s+fill=\")(?!none)([^\"]*)(\")/i, \n '$1currentColor$3'\n );\n\n // Cambiar stroke a currentColor si existe y no es \"none\"\n processed = processed.replace(\n /(<svg[^>]*?\\s+stroke=\")(?!none)([^\"]*)(\")/i, \n '$1currentColor$3'\n );\n\n // Asegurar viewBox si no existe\n if (!/viewBox=/i.test(processed)) {\n processed = processed.replace(\n /(<svg[^>]*?)>/i, \n '$1 viewBox=\"0 0 24 24\">'\n );\n }\n\n return processed;\n }\n}","<span [innerHTML]=\"svgContent()\" [style.width]=\"size\" [style.height]=\"size\" [style.display]=\"'inline-flex'\"\n [style.color]=\"color\" class=\"cat-icon\">\n</span>","import { Component, Input, Output, EventEmitter, HostBinding } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Icon } from '../icon/icon';\n\n@Component({\n selector: 'cat-button',\n imports: [Icon],\n templateUrl: './button.html',\n styleUrl: './button.scss',\n})\nexport class Button {\n @Input() variant: 'primary' | 'secondary' | 'contrast' | 'outline' | 'ghost' = 'primary';\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\n @Input() disabled = false;\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\n @Input() iconLeft?: string;\n @Input() iconCenter?: string;\n @Input() iconRight?: string;\n @Input() customClass = '';\n\n @Output() clicked = new EventEmitter<MouseEvent>();\n\n get buttonClasses(): string {\n return `${this.variant} ${this.size} ${this.customClass}`;\n }\n\n get iconSize(): string {\n const sizes = { sm: '16px', md: '20px', lg: '24px' };\n return sizes[this.size];\n }\n\n @HostBinding('attr.data-button-class') get dataCustomClass() {\n return this.customClass;\n }\n\n handleClick(event: MouseEvent): void {\n if (!this.disabled) {\n this.clicked.emit(event);\n }\n }\n}\n","<button [class]=\"buttonClasses\" [disabled]=\"disabled\" [type]=\"type\" (click)=\"handleClick($event)\">\n\n @if (iconLeft) {\n <cat-icon [name]=\"iconLeft\" [size]=\"iconSize\" class=\"icon-left\">\n </cat-icon>\n }\n\n <span class=\"button-content\">\n @if (iconCenter) {\n <cat-icon [name]=\"iconCenter\" [size]=\"iconSize\" class=\"icon-left\">\n </cat-icon>\n }\n <ng-content></ng-content>\n </span>\n\n @if (iconRight) {\n <cat-icon [name]=\"iconRight\" [size]=\"iconSize\" class=\"icon-right\">\n </cat-icon>\n }\n</button>","import { Component, Input, HostBinding } from '@angular/core';\n\n@Component({\n selector: 'cat-card',\n templateUrl: './card.html',\n styleUrls: ['./card.css']\n})\nexport class Card {\n @Input() variant: 'surface' | 'outlined' | 'elevated' = 'surface';\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\n @Input() width: string = 'auto';\n @Input() customClass = '';\n\n // Exponer las clases como atributos de datos\n @HostBinding('attr.data-card-variant') get dataVariant() {\n return this.variant;\n }\n \n @HostBinding('attr.data-card-size') get dataSize() {\n return this.size;\n }\n \n @HostBinding('attr.data-card-class') get dataCustomClass() {\n return this.customClass;\n }\n\n /*// También exponer como CSS Custom Properties\n @HostBinding('style.--card-variant') get cssVariant() {\n return this.variant;\n }\n \n @HostBinding('style.--card-custom-class') get cssCustomClass() {\n return this.customClass;\n }\n*/\n get cardClasses(): string {\n return `cat-card ${this.variant} ${this.size} ${this.customClass}`;\n }\n}","<section [class]=\"cardClasses\" [attr.data-class]=\"customClass\" [style]=\"`width: ${width};`\">\n <ng-content></ng-content>\n</section>","import { Component, ElementRef, EventEmitter, HostBinding, Input, Output, ViewChild } from '@angular/core';\nimport { Button as CButton } from '../../button/button';\nimport { NgClass, NgIf } from '@angular/common';\n\n@Component({\n selector: 'cat-accordion',\n imports: [CButton, NgClass, NgIf],\n templateUrl: './accordion.html',\n styleUrl: './accordion.css',\n})\nexport class Accordion {\n @Input() accordionId?: string;\n @Input() status: boolean = false;//false = unactive\n @Input() label: string = 'Accordion Name';\n\n @Input() disabled = false;\n @Input() customClass = '';\n @Input() width: string = 'auto';\n\n //Button Properties\n @Input() buttonVariant: 'primary' | 'secondary' | 'contrast' | 'outline' | 'ghost' = 'secondary';\n @Input() buttonSize: 'sm' | 'md' | 'lg' = 'md';\n @Input() iconLeft: boolean = false;\n @Input() iconCenter: boolean = false;\n @Input() iconRight: boolean = true;\n\n //Panel Properties\n @Input() scrolleable: boolean = false;\n @Input() variant: 'surface' | 'outlined' | 'elevated' = 'surface';\n\n @Output() updateAccordionGroupStatusOutput = new EventEmitter<string>();\n\n @ViewChild('buttonRef', { static: false }) buttonRef!: ElementRef;\n buttonWidth: number = 0;\n\n ngAfterViewInit() {\n // Obtener el ancho del botón después de renderizar\n setTimeout(() => {\n if (this.buttonRef) {\n const button = this.buttonRef.nativeElement.querySelector('button');\n if (button) {\n this.buttonWidth = button.offsetWidth;\n }\n }\n });\n }\n\n // Actualizar cuando cambie el label o otros inputs que afecten tamaño\n ngOnChanges() {\n if (this.buttonRef) {\n const button = this.buttonRef.nativeElement.querySelector('button');\n if (button) {\n this.buttonWidth = button.offsetWidth;\n }\n }\n }\n updateAccordionGroupStatus() {\n this.status = !this.status;\n this.updateAccordionGroupStatusOutput.emit(this.accordionId!);\n }\n\n forceStatus(newStatus: boolean): void {\n this.status = newStatus;\n };\n\n @HostBinding('attr.data-accordion-class') get dataCustomClass() {\n return this.customClass;\n }\n\n get panelClasses(): string {\n return `${this.variant} ${this.customClass} ${this.scrolleable ? 'scrolleable' : undefined}`;\n }\n}\n","<section class=\"accordion\" [style]=\"`width: ${width};`\">\n <div>\n <cat-button [iconLeft]=\"iconLeft ? (status ? 'minus' : 'plus') : undefined\"\n [iconCenter]=\"iconCenter ? (status ? 'minus' : 'plus') : undefined\"\n [iconRight]=\"iconRight && status ? 'minus' : 'plus'\" (clicked)=\"updateAccordionGroupStatus()\"\n [variant]=\"buttonVariant\" [size]=\"buttonSize\" customClass=\"accordion-button\" [disabled]=\"disabled\">\n {{label}}\n </cat-button>\n </div>\n <div [class]=\"panelClasses\" [ngClass]=\"status ? 'accordion-panel-active': 'accordion-panel-unactive'\">\n <ng-content *ngIf=\"status\"></ng-content>\n </div>\n</section>","import { Component, ContentChildren, HostBinding, Input, QueryList } from '@angular/core';\nimport { Accordion as CAccordion } from '../accordion/accordion';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'cat-accordion-group',\n imports: [],\n templateUrl: './accordion-group.html',\n styleUrl: './accordion-group.css',\n})\nexport class AccordionGroup {\n @Input() singleExpand: boolean = true;\n @Input() customClass: string = '';\n\n @ContentChildren(CAccordion) accordions!: QueryList<CAccordion>;\n\n accordionActiveId?: String;\n\n sub?: Subscription | null;\n\n ngAfterContentInit(): void {\n if (this.singleExpand) {\n this.accordions.forEach(acc => {\n this.sub = acc.updateAccordionGroupStatusOutput.subscribe(id => {\n this.handleOpen(id);\n });\n });\n }\n }\n\n handleOpen(id: string) {\n this.accordions.forEach(acc => acc.forceStatus(false));\n const target = this.accordions.find(acc => acc.accordionId === id);\n if (this.accordionActiveId === id) {\n target?.forceStatus(false);\n this.accordionActiveId = undefined;\n } else {\n target?.forceStatus(true);\n this.accordionActiveId = id;\n }\n }\n\n @HostBinding('attr.data-accordion-group-class') get dataCustomClass() {\n return this.customClass;\n }\n\n get accordionGroupClasses() {\n return `${this.customClass}`;\n }\n}\n","<style>\n section {\n width: 100%;\n }\n</style>\n<section [class]=\"accordionGroupClasses\">\n <ng-content></ng-content>\n</section>","import { Directive, ElementRef, Renderer2, OnInit, inject, Optional, Self, PLATFORM_ID } from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Directive({\n selector: '[catInput]',\n standalone: true,\n host: {\n '[class.cat-input]': 'true',\n '[class.md]': 'true',\n '[class.invalid]': 'isInvalid'\n }\n})\nexport class CatInput implements OnInit {\n private el = inject(ElementRef);\n private platformId = inject(PLATFORM_ID);\n @Optional() @Self() public control: NgControl | null = inject(NgControl, { optional: true, self: true });\n\n private static stylesInjected = false;\n\n ngOnInit(): void {\n if (this.el.nativeElement.tagName.toLowerCase() !== 'input') {\n console.warn('catInput directive can only be used on <input> elements');\n return;\n }\n\n // Inyectar estilos solo una vez\n if (!CatInput.stylesInjected && isPlatformBrowser(this.platformId)) {\n this.injectStyles();\n CatInput.stylesInjected = true;\n }\n }\n\n private injectStyles(): void {\n const style = document.createElement('style');\n style.textContent = `\n .cat-input {\n border: 1px solid var(--neutral-color-3);\n background-color: var(--neutral-color-0);\n color: var(--neutral-color-9);\n border-radius: 18px;\n outline: none;\n transition: all 0.2s;\n }\n\n .cat-input:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .cat-input::placeholder {\n color: var(--neutral-color-6);\n transition: font-size 0.2s;\n }\n\n .cat-input:focus::placeholder {\n font-size: 0.7em;\n }\n\n .cat-input:focus {\n border: 1px solid var(--neutral-color-9);\n }\n\n .cat-input.invalid,\n .cat-input.ng-invalid.ng-touched {\n border: 1px solid red;\n }\n\n .cat-input.ng-valid.ng-touched {\n border: 1px solid green;\n }\n\n .cat-input.md {\n padding: 0.5rem 1rem;\n font-size: 1rem;\n }\n\n .cat-input.sm {\n padding: 0.25rem 0.75rem;\n font-size: 0.875rem;\n }\n\n .cat-input.lg {\n padding: 0.75rem 1.5rem;\n font-size: 1.125rem;\n }\n `;\n document.head.appendChild(style);\n }\n\n get isInvalid(): boolean {\n return !!(this.control && this.control.invalid && this.control.touched);\n }\n}","import { Component, forwardRef, Input } from '@angular/core';\nimport { Icon as CIcon } from '../../icon/icon';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'cat-color-input',\n imports: [CIcon],\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ColorInput),\n multi: true\n }],\n templateUrl: './color-input.html',\n styleUrl: './color-input.css',\n})\nexport class ColorInput implements ControlValueAccessor {\n value: string = '#000000';\n @Input() icon?: boolean = false;\n @Input() size: string ='2em';\n\n private onChange = (value: any) => { };\n onTouched = () => { };\n\n onInput(event: Event) {\n const newValue = (event.target as HTMLInputElement).value;\n this.value = newValue;\n this.onChange(newValue); // informa al padre \n }\n\n // Métodos requeridos por ControlValueAccessor\n writeValue(value: any): void {\n this.value = value || '#000000';\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n\n this.onTouched = fn;\n }\n}\n","<style>\n div {\n position: relative;\n aspect-ratio: 1/1;\n }\n\n div:hover {\n cursor: grab;\n }\n input {\n width: 100%;\n aspect-ratio: 1/1;\n top: 0;\n left: 0;\n }\n cat-icon {\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n }\n</style>\n<!-- input-color.html -->\n<div [style]=\"`width: ${size};`\">\n <input type=\"color\" [style]=\"icon ? 'opacity: 0;' : 'opacity: 100%;'\" [value]=\"value\" (input)=\"onInput($event)\" (blur)=\"onTouched()\">\n @if (icon) {\n <cat-icon [style]=\"`height: ${size};`\" size=\"100%\" name=\"palette\"></cat-icon> \n }\n</div>","import { NgFor, NgClass, isPlatformBrowser } from '@angular/common';\nimport { AfterViewInit, Component, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, OnDestroy, Output, PLATFORM_ID, inject, ViewChild } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CatInput } from \"../cat-input/cat-input\";\n\n@Component({\n selector: 'cat-select-input',\n imports: [\n NgFor,\n CatInput,\n NgClass\n ],\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectInput),\n multi: true\n }],\n templateUrl: './select-input.html',\n styleUrl: './select-input.css',\n})\nexport class SelectInput implements ControlValueAccessor, AfterViewInit, OnDestroy {\n @ViewChild('input') inputEl!: ElementRef<HTMLElement>;\n @ViewChild('optionsContainer', { static: false }) optionsContainer!: ElementRef<HTMLElement>;\n\n @Input() transform?: string; //This option basicly allow to the consumer put the options at the side where he wants\n @Input() options?: string[];\n @Input() placeholder: string = '';\n @Input() type: 'string' | 'number' = 'string';\n\n value: string | number = '';\n active = false;\n isInsideMenu = false;\n\n @Input() variant: 'surface' | 'elevated' | 'outlined' = 'surface';\n @Input() scrolleable: boolean = false;\n @Input() customClass: string = '';\n\n //@Output() selected = new EventEmitter<string>();\n\n //Accesibility\n @HostListener('document:click', ['$event'])\n outerClick(event: Event) {\n if (!this.el.nativeElement.contains(event.target)) {\n this.active = false;\n this.updateDropdownPosition();\n }\n };\n\n private updateDropdownPosition() {\n if (!isPlatformBrowser(this.platformId)) return;\n if (!this.isInsideMenu || !this.active || !this.optionsContainer) {\n return;\n }\n\n // Calcular posición cuando está dentro del menú\n const inputRect = this.inputEl.nativeElement.getBoundingClientRect();\n const optionsEl = this.optionsContainer.nativeElement;\n \n // Posicionar el dropdown debajo del input usando position fixed\n optionsEl.style.position = 'fixed';\n optionsEl.style.top = `${inputRect.bottom}px`;\n optionsEl.style.left = `${inputRect.left}px`;\n optionsEl.style.width = `${inputRect.width}px`;\n optionsEl.style.zIndex = '1001';\n }\n\n toggleActive() {\n this.active = !this.active;\n if (this.active && this.isInsideMenu) {\n // Esperar un tick para que el DOM se actualice\n setTimeout(() => {\n this.updateDropdownPosition();\n }, 0);\n }\n }\n\n constructor(\n private el: ElementRef,\n ) { }\n\n private platformId = inject(PLATFORM_ID);\n private scrollHandler?: () => void;\n private resizeHandler?: () => void;\n\n ngAfterViewInit() {\n if (!isPlatformBrowser(this.platformId)) return;\n \n // Detectar si el select está dentro de un menú\n this.isInsideMenu = !!this.el.nativeElement.closest('cat-menu');\n \n // Añadir listeners para actualizar posición en scroll/resize\n if (this.isInsideMenu) {\n this.scrollHandler = () => {\n if (this.active) {\n this.updateDropdownPosition();\n }\n };\n this.resizeHandler = () => {\n if (this.active) {\n this.updateDropdownPosition();\n }\n };\n \n window.addEventListener('scroll', this.scrollHandler, true);\n window.addEventListener('resize', this.resizeHandler);\n }\n }\n\n ngOnDestroy() {\n if (!isPlatformBrowser(this.platformId)) return;\n \n if (this.scrollHandler) {\n window.removeEventListener('scroll', this.scrollHandler, true);\n }\n if (this.resizeHandler) {\n window.removeEventListener('resize', this.resizeHandler);\n }\n }\n\n onChange = (value: any) => { };\n onTouched = () => { };\n\n //Here starts the events from ControlValueAccesor\n writeValue(value: any): void {\n this.value = value;\n };\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n //Here ends The events from ControlValueAccesor\n\n choseValue(option: any) {\n this.value = option;\n this.onChange(option);\n this.onTouched();\n this.active = false;\n //this.selected.emit(option);\n };\n\n @HostBinding('attr.data-select-input-class') get dataCustomClass() {\n return this.customClass;\n }\n\n get selectInputClass(): string {\n return `${this.variant} ${this.scrolleable ? 'scrolleable' : ''}`;\n }\n}\n","<div>\n <input catInput #input [value]=\"value\" [type]=\"type\" readonly id=\"select\" (mousedown)=\"toggleActive()\" [placeholder]=\"placeholder\">\n <section #optionsContainer role=\"listbox\" [class]=\"selectInputClass\" class=\"options\" [ngClass]=\"active ? 'options-active' : 'options.unactive'\" [style.transform]=\"transform\">\n @if (active) {\n <div role=\"option\"*ngFor=\"let option of options\" (mousedown)=\"choseValue(option)\">\n {{ option }}\n </div>\n }\n </section>\n</div>","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-date-input',\n imports: [],\n templateUrl: './date-input.html',\n styleUrl: './date-input.css',\n})\nexport class DateInput {\n\n}\n","<p>date-input works!</p>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-file-input',\n imports: [],\n templateUrl: './file-input.html',\n styleUrl: './file-input.css',\n})\nexport class FileInput {\n\n}\n","<p>file-input works!</p>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-password-input',\n imports: [],\n templateUrl: './password-input.html',\n styleUrl: './password-input.css',\n})\nexport class PasswordInput {\n\n}\n","<p>password-input works!</p>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-range-input',\n imports: [],\n templateUrl: './range-input.html',\n styleUrl: './range-input.css',\n})\nexport class RangeInput {\n\n}\n","<p>range-input works!</p>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-text-area-input',\n imports: [],\n templateUrl: './text-area-input.html',\n styleUrl: './text-area-input.css',\n})\nexport class TextAreaInput {\n\n}\n","<p>text-area-input works!</p>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-time-input',\n imports: [],\n templateUrl: './time-input.html',\n styleUrl: './time-input.css',\n})\nexport class TimeInput {\n\n}\n","<p>time-input works!</p>\n","import { AfterViewInit, Directive, DOCUMENT, ElementRef, Inject, Renderer2 } from '@angular/core';\n\n@Directive({\n selector: '[CDrag]'\n})\nexport class Drag implements AfterViewInit {\n private offsetX = 0;\n private offsetY = 0;\n private dragging = false;\n\n constructor(\n private el: ElementRef,\n private renderer: Renderer2,\n @Inject(DOCUMENT) private document: Document\n ) { }\n\n ngAfterViewInit() {\n const el = this.el.nativeElement as HTMLElement;\n\n // Si el elemento no tiene position seteado, le ponemos absolute\n if (typeof window !== 'undefined') {\n const computedStyle = window.getComputedStyle(el);\n if (computedStyle.position === 'static') {\n this.renderer.setStyle(el, 'position', 'absolute');\n }\n }\n\n\n el.addEventListener('mousedown', (e: MouseEvent) => {\n this.dragging = true;\n this.offsetX = e.clientX - el.offsetLeft;\n this.offsetY = e.clientY - el.offsetTop;\n el.style.cursor = 'grabbing';\n });\n\n this.document.addEventListener('mousemove', (e: MouseEvent) => {\n if (this.dragging) {\n el.style.left = e.clientX - this.offsetX + 'px';\n el.style.top = e.clientY - this.offsetY + 'px';\n }\n });\n\n this.document.addEventListener('mouseup', () => {\n this.dragging = false;\n el.style.cursor = 'grab';\n });\n }\n\n}\n","import { Component, EventEmitter, HostBinding, HostListener, Input, Output } from '@angular/core';\nimport { Drag } from '../../../directives/drag';\n\n@Component({\n selector: 'cat-dialog',\n imports: [Drag],\n templateUrl: './dialog.html',\n styleUrl: './dialog.css',\n})\nexport class Dialog {\n @Output() closs = new EventEmitter<boolean>();\n @HostListener('window:keydown.escape', ['$event'])\n handleKeyDown(event: Event) {\n this.clossOverlay();\n }\n @Input() variant: 'surface' | 'outlined' | 'elevated' = 'surface';\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\n @Input() customClass = '';\n\n // Exponer las clases como atributos de datos\n @HostBinding('attr.data-card-variant') get dataVariant() {\n return this.variant;\n }\n\n @HostBinding('attr.data-card-size') get dataSize() {\n return this.size;\n }\n\n @HostBinding('attr.data-card-class') get dataCustomClass() {\n return this.customClass;\n }\n\n get dialogClasses(): string {\n return `${this.variant} ${this.size} ${this.customClass}`;\n }\n\n clossOverlay() {\n this.closs.emit(false);\n };\n}\n","<div class=\"dialog-shadow\" (click)=\"clossOverlay()\">\n</div>\n<section CDrag [class]=\"dialogClasses\">\n <ng-content></ng-content>\n</section>","import { Component, EventEmitter, HostBinding, HostListener, Input, Output } from '@angular/core';\nimport { Button } from '../../button/button';\n\n@Component({\n selector: 'cat-drawer',\n imports: [Button],\n templateUrl: './drawer.html',\n styleUrl: './drawer.css',\n})\nexport class Drawer {\n @Output() closs = new EventEmitter<boolean>();\n @HostListener('window:keydown.escape', ['$event'])\n handleKeyDown(event: Event) {\n this.clossOverlay();\n }\n\n @Input() side: 'left' | 'right' | 'top' | 'bottom' = 'left';\n @Input() variant: 'surface' | 'elevated' | 'outlined' = 'surface';\n @Input() customClass: string = '';\n \n @HostBinding('attr.data-drawer-class') get dataCustomClass() {\n return this.customClass;\n }\n\n get drawerClasses(): string {\n return `${this.variant} ${this.side} ${this.customClass}`;\n }\n\n clossOverlay() {\n this.closs.emit(false);\n };\n}\n","<style>\n .dialog-shadow {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.7);\n z-index: 999;\n }\n\n section {\n position: fixed;\n\n overflow: auto;\n\n box-sizing: border-box;\n padding: 0.25rem 0.75rem;\n z-index: 1000;\n transition: 250ms;\n\n user-select: none;\n }\n\n /* Variants */\n .surface {\n background-color: var(--element-color-4);\n }\n\n .elevated {\n background-color: var(--neutral-color-0);\n }\n\n .outlined {\n background-color: var(--element-color-3);\n border: 2px solid var(--neutral-color-9);\n }\n\n .close-button {\n position: absolute;\n }\n\n .left {\n width: 30em;\n height: 100vh;\n width: 30em;\n height: 100vh;\n left: 0;\n top: 0;\n\n & .close-button {\n right: .25rem;\n }\n }\n\n .right {\n width: 30em;\n height: 100vh;\n right: 0;\n top: 0;\n\n & .close-button {\n left: .25rem;\n }\n }\n\n .top {\n width: 100%;\n height: 20em;\n top: 0;\n left: 0;\n\n & .close-button {\n right: .25rem;\n }\n }\n\n .bottom {\n width: 100%;\n height: 20em;\n bottom: 0;\n left: 0;\n\n & .close-button {\n right: .25rem;\n }\n }\n\n @media screen and (orientation: portrait) {\n .top, .bottom {\n height: 70%;\n }\n }\n</style>\n<section [class]=\"drawerClasses\">\n <cat-button iconCenter=\"x-mark\" variant=\"contrast\" class=\"close-button\" (clicked)=\"clossOverlay()\"></cat-button>\n <ng-content></ng-content>\n</section>\n<div class=\"dialog-shadow\" (click)=\"clossOverlay()\">\n</div>","import { isPlatformBrowser } from '@angular/common';\nimport { AfterViewInit, Component, ElementRef, HostBinding, inject, Input, OnDestroy, PLATFORM_ID, signal, ViewChild } from '@angular/core';\nimport { Icon } from '../../icon/icon';\n\n@Component({\n selector: 'cat-menu',\n imports: [Icon],\n templateUrl: './menu.html',\n styleUrl: './menu.css',\n})\nexport class Menu implements AfterViewInit, OnDestroy {\n @Input() variant: 'surface' | 'elevated' | 'outlined' = 'surface';\n @Input() customClass: string = '';\n\n @HostBinding('attr.data-menu-class') get dataCustomClass() {\n return this.customClass;\n }\n\n get menuClasses(): string {\n return `${this.variant} ${this.customClass}`;\n }\n\n @ViewChild('menuContainer', { static: false }) menuContainer!: ElementRef<HTMLDivElement>;\n @ViewChild('menuContent', { static: false }) menuContent!: ElementRef<HTMLDivElement>;\n @ViewChild('dropdown', { static: false }) dropdown?: ElementRef<HTMLDivElement>;\n\n private platformId = inject(PLATFORM_ID);\n private resizeObserver?: ResizeObserver;\n private mutationObserver?: MutationObserver;\n\n showMoreButton = signal(false);\n isDropdownOpen = signal(false);\n overflowItems = signal<HTMLElement[]>([]);\n\n ngAfterViewInit() {\n if (!isPlatformBrowser(this.platformId)) return;\n\n setTimeout(() => {\n this.checkOverflow();\n this.setupObservers();\n }, 0);\n }\n\n ngOnDestroy() {\n this.resizeObserver?.disconnect();\n this.mutationObserver?.disconnect();\n if (isPlatformBrowser(this.platformId)) {\n document.removeEventListener('click', this.handleOutsideClick);\n }\n }\n\n private setupObservers() {\n if (!isPlatformBrowser(this.platformId)) return;\n\n this.resizeObserver = new ResizeObserver(() => {\n this.checkOverflow();\n });\n this.resizeObserver.observe(this.menuContainer.nativeElement);\n\n this.mutationObserver = new MutationObserver(() => {\n this.checkOverflow();\n });\n this.mutationObserver.observe(this.menuContent.nativeElement, {\n childList: true,\n subtree: true\n });\n\n document.addEventListener('click', this.handleOutsideClick);\n }\n\n private handleOutsideClick = (event: MouseEvent) => {\n if (!this.isDropdownOpen()) return;\n\n const target = event.target as HTMLElement;\n const clickedInside = this.menuContainer.nativeElement.contains(target) ||\n this.dropdown?.nativeElement.contains(target);\n\n if (!clickedInside) {\n this.isDropdownOpen.set(false);\n }\n };\n\nprivate checkOverflow() {\n // Si el dropdown está abierto, no recalcular (los elementos están en el dropdown)\n // Solo actualizar el contenido del dropdown si es necesario\n if (this.isDropdownOpen()) {\n const overflowItems = this.overflowItems();\n if (overflowItems.length > 0) {\n this.showMoreButton.set(true);\n setTimeout(() => {\n this.waitForDropdownAndUpdate();\n }, 0);\n }\n return;\n }\n\n const container = this.menuContent.nativeElement;\n \n // Restaurar todos los elementos que puedan estar en el dropdown\n this.restoreOverflowItems();\n \n const items = Array.from(container.children) as HTMLElement[];\n\n if (items.length === 0) {\n this.showMoreButton.set(false);\n this.overflowItems.set([]);\n return;\n }\n\n const menuItems = items.filter(item =>\n !item.classList.contains('more-button')\n );\n\n if (menuItems.length === 0) {\n this.showMoreButton.set(false);\n this.overflowItems.set([]);\n return;\n }\n\n // Restaurar todos los elementos a su estado visible antes de calcular\n menuItems.forEach(item => {\n item.style.display = '';\n });\n\n // Forzar un reflow para obtener posiciones correctas\n container.offsetHeight;\n\n // Detectar elementos en la primera fila vs elementos en filas adicionales\n const firstItemTop = menuItems[0]?.getBoundingClientRect().top;\n const firstRowItems: HTMLElement[] = [];\n const overflowItems: HTMLElement[] = [];\n\n menuItems.forEach(item => {\n const itemTop = item.getBoundingClientRect().top;\n // Tolerancia de 1px para manejar diferencias de redondeo\n if (Math.abs(itemTop - firstItemTop) <= 1) {\n firstRowItems.push(item);\n } else {\n overflowItems.push(item);\n }\n });\n\n // Si hay elementos en overflow, mostrar el botón More y ocultar los elementos overflow\n const needsMoreButton = overflowItems.length > 0;\n this.showMoreButton.set(needsMoreButton);\n\n // Ocultar elementos que están en la segunda fila o más\n overflowItems.forEach(item => {\n item.style.display = 'none';\n });\n\n // Mantener visibles solo los elementos de la primera fila\n firstRowItems.forEach(item => {\n item.style.display = '';\n });\n\n if (needsMoreButton) {\n this.overflowItems.set(overflowItems);\n } else {\n this.overflowItems.set([]);\n }\n}\n\n private updateDropdownContent() {\n // Buscar el dropdown directamente en el DOM en lugar de usar ViewChild\n const menuWrapper = this.menuContainer.nativeElement.closest('.menu-wrapper');\n if (!menuWrapper) {\n return;\n }\n\n const dropdown = menuWrapper.querySelector('.dropdown') as HTMLElement;\n if (!dropdown) {\n return;\n }\n\n const dropdownContent = dropdown.querySelector('.dropdown-content');\n if (!dropdownContent) {\n return;\n }\n\n // Limpiar contenido previo - restaurar elementos que puedan estar ahí\n this.restoreOverflowItems();\n\n const overflowItems = this.overflowItems();\n \n if (overflowItems.length === 0) {\n return;\n }\n\n const menuContent = this.menuContent.nativeElement;\n\n overflowItems.forEach(item => {\n // Mover el elemento real al dropdown (preserva todos los event listeners de Angular)\n // El elemento ya está oculto (display: none), así que lo hacemos visible y lo movemos\n item.style.display = '';\n item.style.visibility = 'visible';\n item.style.opacity = '1';\n \n // Añadir un listener para cerrar el dropdown cuando se haga click\n const closeHandler = () => {\n this.isDropdownOpen.set(false);\n };\n \n // Buscar el botón dentro del elemento y añadir el listener\n const button = item.querySelector('button, cat-button, [role=\"button\"]') as HTMLElement;\n if (button) {\n button.addEventListener('click', closeHandler, { once: true });\n } else {\n item.addEventListener('click', closeHandler, { once: true });\n }\n \n // Mover el elemento al dropdown\n dropdownContent.appendChild(item);\n });\n }\n\n private restoreOverflowItems() {\n const overflowItems = this.overflowItems();\n const menuContent = this.menuContent.nativeElement;\n \n overflowItems.forEach(item => {\n // Si el elemento está en el dropdown, moverlo de vuelta al menu-content\n const dropdownContent = item.closest('.dropdown-content');\n if (dropdownContent && item.parentElement === dropdownContent) {\n // Ocultar el elemento y moverlo de vuelta al menu-content\n item.style.display = 'none';\n menuContent.appendChild(item);\n }\n });\n }\n\n toggleDropdown() {\n const newState = !this.isDropdownOpen();\n \n if (!newState) {\n // Si se está cerrando, restaurar los elementos a su posición original\n this.restoreOverflowItems();\n }\n \n this.isDropdownOpen.set(newState);\n\n if (newState) {\n // Recalcular overflow antes de abrir el dropdown\n setTimeout(() => {\n this.checkOverflow();\n // Esperar a que el dropdown esté en el DOM antes de actualizar\n this.waitForDropdownAndUpdate();\n }, 0);\n }\n }\n\n private waitForDropdownAndUpdate() {\n // Intentar actualizar el dropdown, reintentando si no está disponible\n const maxAttempts = 20;\n let attempts = 0;\n\n const tryUpdate = () => {\n attempts++;\n const menuWrapper = this.menuContainer.nativeElement.closest('.menu-wrapper');\n const dropdown = menuWrapper?.querySelector('.dropdown');\n \n if (dropdown) {\n this.updateDropdownContent();\n } else if (attempts < maxAttempts) {\n setTimeout(tryUpdate, 10);\n }\n };\n\n tryUpdate();\n }\n}","<div class=\"menu-wrapper\">\n <div class=\"menu\" #menuContainer>\n <div class=\"menu-content\" #menuContent>\n <ng-content></ng-content>\n </div>\n\n @if (showMoreButton()) {\n <button class=\"more-button\" (click)=\"toggleDropdown()\" [attr.aria-expanded]=\"isDropdownOpen()\" type=\"button\">\n <span>More</span>\n @if(isDropdownOpen()){\n <cat-icon size=\"16px\" name=\"chevron-arrow-up\"></cat-icon>\n } @else {\n <cat-icon size=\"16px\" name=\"chevron-arrow-down\"></cat-icon>\n }\n<!-- <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\"\n [style.transform]=\"isDropdownOpen() ? 'rotate(180deg)' : 'rotate(0deg)'\">\n <path d=\"M4 6l4 4 4-4z\" />\n </svg> -->\n </button>\n }\n </div>\n\n @if (showMoreButton() && isDropdownOpen()) {\n <div class=\"dropdown\" #dropdown>\n <div class=\"dropdown-content\">\n <!-- Aquí se moverán los elementos overflow -->\n </div>\n </div>\n }\n</div>","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\ninterface RGB {\n red: number;\n green: number;\n blue: number;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Theming {\n //Light Theme = False\n private activeThemeSubject = new BehaviorSubject<boolean>(false);\n public activeTheme$ = this.activeThemeSubject.asObservable();\n\n //Palettes\n private allPalettesSubject = new BehaviorSubject<string[][]>([]);\n public allPalettes$ = this.allPalettesSubject.asObservable();\n\n generatePalettes(color: string, dark: boolean): string[][] {\n this.activeThemeSubject.next(dark);\n\n const primaryColors = this.calculatePrimaryColor(color);\n\n const dynamicPalettes = this.calculateDynamicPalettes(dark);\n\n //Assign All Palettes to Local Variables\n let allPalettes: string[][] = [primaryColors];\n\n allPalettes = allPalettes.concat([dynamicPalettes.neutral]);\n allPalettes = allPalettes.concat([dynamicPalettes.elements]);\n\n this.allPalettesSubject.next(allPalettes);\n\n //Apply theme\n this.applyTheme(allPalettes);\n\n return this.allPalettesSubject.value;\n }\n\n public calculatePrimaryColor(color: string) {\n //Step 1: Calculate the Color\n const colors = this.hexToRgb(color);\n\n //Step 2: Get the Primary Palette (static, doesn't change with theme)\n const primaryColors: string[] = this.palette(colors, false, 4); // Always use light theme\n\n const allPalettes = [\n primaryColors, // Keep primary (static)\n this.allPalettesSubject.value[1],\n this.allPalettesSubject.value[2]\n ];\n\n this.allPalettesSubject.next(allPalettes);\n\n this.applyTheme(allPalettes);\n \n return primaryColors;\n }\n\n public calculateDynamicPalettes(dark: boolean): { neutral: string[], elements: string[] } {\n const theme: boolean = dark;\n const contrastTheme: boolean = !dark;\n this.activeThemeSubject.next(dark);\n\n\n // Calculate neutral colors (changes with theme)\n const neutralColors: string[] = contrastTheme\n ? this.palette({ red: 255, green: 255, blue: 255 }, false, 9)\n : this.palette({ red: 0, green: 0, blue: 0 }, true, 9);\n\n // Calculate element colors (changes with theme)\n const elementsColors: string[] = this.elementsColors(theme, 3, 40);\n\n // Update palettes array with dynamic values\n const allPalettes = [\n this.allPalettesSubject.value[0], // Keep primary (static)\n neutralColors,\n elementsColors\n ];\n\n this.allPalettesSubject.next(allPalettes);\n\n // Apply theme to CSS variables\n this.applyTheme(allPalettes);\n\n return {\n neutral: neutralColors,\n elements: elementsColors\n };\n }\n\n private palette(colors: { red: number, green: number, blue: number }, dark: boolean, steps: number) {\n //Palette\n const colorsReturn: string[] = [];\n\n const contrastTheme: boolean = !dark;\n const target = contrastTheme ? 0 : 255;\n\n const umbralR = (target - colors.red) / steps;\n const umbralG = (target - colors.green) / steps;\n const umbralB = (target - colors.blue) / steps;\n\n for (let i = 0; i <= steps; i++) {\n const r = Math.round(colors.red + umbralR * i);\n const g = Math.round(colors.green + umbralG * i);\n const b = Math.round(colors.blue + umbralB * i);\n\n colorsReturn.push(`rgb(${r}, ${g}, ${b})`);\n }\n return colorsReturn;\n };\n\n private elementsColors(theme: boolean, iteration: number, amplitude: number) {\n amplitude = amplitude / iteration;\n const colorsReturn: string[] = [];\n for (let i = 0; i < 5; i++) {\n let r = theme ? 0 + ((85 - 0) / (5 - 1) * i) : 0 + ((255 - 0) / (5 - 1) * i);\n let g = theme ? 0 + ((85 - 0) / (5 - 1) * i) : 0 + ((255 - 0) / (5 - 1) * i);\n let b = theme ? 0 + ((85 - 0) / (5 - 1) * i) : 0 + ((255 - 0) / (5 - 1) * i);\n\n if (i <= iteration && theme === false) {\n r = r + amplitude;\n g = g + amplitude;\n b = b + amplitude;\n } else if (theme === false) {\n r = r - amplitude;\n g = g - amplitude;\n b = b - amplitude;\n }\n colorsReturn.push(`rgb(${r}, ${g},${b})`);\n };\n return colorsReturn;\n };\n\n private applyTheme(palettes: string[][]): void {\n if (typeof document === 'undefined') return;\n\n const root = document.documentElement;\n const cssVars = [\n { prefix: '--primary-color-', index: 0 },\n { prefix: '--neutral-color-', index: 1 },\n { prefix: '--element-color-', index: 2 }\n ];\n\n cssVars.forEach(({ prefix, index }) => {\n palettes[index]?.forEach((color, i) => {\n root.style.setProperty(`${prefix}${i}`, color);\n });\n });\n }\n\n private hexToRgb(hex: string): RGB {\n const value = parseInt(hex.replace('#', ''), 16);\n return {\n red: (value >> 16) & 255,\n green: (value >> 8) & 255,\n blue: value & 255,\n };\n }\n}","/*\n * Public API Surface of catarina\n */\n\n// design-system\nexport * from './lib/design-system/icon/icon';\nexport * from './lib/design-system/button/button';\n\n// Panels\nexport * from './lib/design-system/panels/card/card';\nexport * from './lib/design-system/panels/accordion/accordion';\nexport * from './lib/design-system/panels/accordion-group/accordion-group';\n\n//form\nexport * from './lib/design-system/form/cat-input/cat-input';\nexport * from './lib/design-system/form/color-input/color-input';\nexport * from './lib/design-system/form/select-input/select-input';\n\n//Pending https://tecsify.com/blog/input-en-html/\nexport * from './lib/design-system/form/date-input/date-input';\nexport * from './lib/design-system/form/file-input/file-input';\nexport * from './lib/design-system/form/password-input/password-input';\nexport * from './lib/design-system/form/range-input/range-input';\nexport * from './lib/design-system/form/text-area-input/text-area-input';\nexport * from './lib/design-system/form/time-input/time-input';\n/*\nimage, search, telefono, reset, radio button, checkbox, button, email\n*/\n\n//Overlays\n//Pending\nexport * from './lib/design-system/overlays/dialog/dialog';\nexport * from './lib/design-system/overlays/drawer/drawer';\nexport * from './lib/design-system/overlays/menu/menu';\n\n\n/*Services and Directives */\n\nexport * from './lib/directives/drag';\nexport * from './lib/theming/theming';\n\n// Tokens\nexport * from './lib/tokens/icon-provider.token';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["CButton","CAccordion","CIcon"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -124,20 +124,29 @@ declare class ColorInput implements ControlValueAccessor {
124
124
  static ɵcmp: i0.ɵɵComponentDeclaration<ColorInput, "cat-color-input", never, { "icon": { "alias": "icon"; "required": false; }; "size": { "alias": "size"; "required": false; }; }, {}, never, never, true, never>;
125
125
  }
126
126
 
127
- declare class SelectInput implements ControlValueAccessor {
127
+ declare class SelectInput implements ControlValueAccessor, AfterViewInit, OnDestroy {
128
128
  private el;
129
129
  inputEl: ElementRef<HTMLElement>;
130
+ optionsContainer: ElementRef<HTMLElement>;
130
131
  transform?: string;
131
132
  options?: string[];
132
133
  placeholder: string;
133
134
  type: 'string' | 'number';
134
135
  value: string | number;
135
136
  active: boolean;
137
+ isInsideMenu: boolean;
136
138
  variant: 'surface' | 'elevated' | 'outlined';
137
139
  scrolleable: boolean;
138
140
  customClass: string;
139
141
  outerClick(event: Event): void;
142
+ private updateDropdownPosition;
143
+ toggleActive(): void;
140
144
  constructor(el: ElementRef);
145
+ private platformId;
146
+ private scrollHandler?;
147
+ private resizeHandler?;
148
+ ngAfterViewInit(): void;
149
+ ngOnDestroy(): void;
141
150
  onChange: (value: any) => void;
142
151
  onTouched: () => void;
143
152
  writeValue(value: any): void;
@@ -195,6 +204,46 @@ declare class Dialog {
195
204
  static ɵcmp: i0.ɵɵComponentDeclaration<Dialog, "cat-dialog", never, { "variant": { "alias": "variant"; "required": false; }; "size": { "alias": "size"; "required": false; }; "customClass": { "alias": "customClass"; "required": false; }; }, { "closs": "closs"; }, never, ["*"], true, never>;
196
205
  }
197
206
 
207
+ declare class Drawer {
208
+ closs: EventEmitter<boolean>;
209
+ handleKeyDown(event: Event): void;
210
+ side: 'left' | 'right' | 'top' | 'bottom';
211
+ variant: 'surface' | 'elevated' | 'outlined';
212
+ customClass: string;
213
+ get dataCustomClass(): string;
214
+ get drawerClasses(): string;
215
+ clossOverlay(): void;
216
+ static ɵfac: i0.ɵɵFactoryDeclaration<Drawer, never>;
217
+ static ɵcmp: i0.ɵɵComponentDeclaration<Drawer, "cat-drawer", never, { "side": { "alias": "side"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "customClass": { "alias": "customClass"; "required": false; }; }, { "closs": "closs"; }, never, ["*"], true, never>;
218
+ }
219
+
220
+ declare class Menu implements AfterViewInit, OnDestroy {
221
+ variant: 'surface' | 'elevated' | 'outlined';
222
+ customClass: string;
223
+ get dataCustomClass(): string;
224
+ get menuClasses(): string;
225
+ menuContainer: ElementRef<HTMLDivElement>;
226
+ menuContent: ElementRef<HTMLDivElement>;
227
+ dropdown?: ElementRef<HTMLDivElement>;
228
+ private platformId;
229
+ private resizeObserver?;
230
+ private mutationObserver?;
231
+ showMoreButton: i0.WritableSignal<boolean>;
232
+ isDropdownOpen: i0.WritableSignal<boolean>;
233
+ overflowItems: i0.WritableSignal<HTMLElement[]>;
234
+ ngAfterViewInit(): void;
235
+ ngOnDestroy(): void;
236
+ private setupObservers;
237
+ private handleOutsideClick;
238
+ private checkOverflow;
239
+ private updateDropdownContent;
240
+ private restoreOverflowItems;
241
+ toggleDropdown(): void;
242
+ private waitForDropdownAndUpdate;
243
+ static ɵfac: i0.ɵɵFactoryDeclaration<Menu, never>;
244
+ static ɵcmp: i0.ɵɵComponentDeclaration<Menu, "cat-menu", never, { "variant": { "alias": "variant"; "required": false; }; "customClass": { "alias": "customClass"; "required": false; }; }, {}, never, ["*"], true, never>;
245
+ }
246
+
198
247
  declare class Drag implements AfterViewInit {
199
248
  private el;
200
249
  private renderer;
@@ -214,6 +263,7 @@ declare class Theming {
214
263
  private allPalettesSubject;
215
264
  allPalettes$: rxjs.Observable<string[][]>;
216
265
  generatePalettes(color: string, dark: boolean): string[][];
266
+ calculatePrimaryColor(color: string): string[];
217
267
  calculateDynamicPalettes(dark: boolean): {
218
268
  neutral: string[];
219
269
  elements: string[];
@@ -231,5 +281,5 @@ interface IconProvider {
231
281
  }
232
282
  declare const ICON_PROVIDER: InjectionToken<IconProvider>;
233
283
 
234
- export { Accordion, AccordionGroup, Button, Card, CatInput, ColorInput, DateInput, Dialog, Drag, FileInput, ICON_PROVIDER, Icon, PasswordInput, RangeInput, SelectInput, TextAreaInput, Theming, TimeInput };
284
+ export { Accordion, AccordionGroup, Button, Card, CatInput, ColorInput, DateInput, Dialog, Drag, Drawer, FileInput, ICON_PROVIDER, Icon, Menu, PasswordInput, RangeInput, SelectInput, TextAreaInput, Theming, TimeInput };
235
285
  export type { IconProvider };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "catarina",
3
- "version": "1.0.1",
3
+ "version": "1.1.1",
4
4
  "description": "Angular 20.3.0 UI Design System, preview: https://jpcn-portfolio.vercel.app/catarina-preview",
5
5
  "keywords": [
6
6
  "angular",
@@ -9,7 +9,7 @@
9
9
  "components",
10
10
  "hydenaky"
11
11
  ],
12
- "author": "hydenaky",
12
+ "author": "Juan Pablo Cañon N. (Hydenaky)",
13
13
  "license": "MIT",
14
14
  "repository": {
15
15
  "type": "git",