catarina 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,63 +1,185 @@
1
- # Catarina
1
+ ## Catarina – Design System para Angular
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.3.0.
3
+ **Catarina** es una librería de componentes UI para Angular 20.3.x.
4
+ Incluye botones, iconos, controles de formulario, paneles y utilidades relacionadas con _theming_ e iconos.
4
5
 
5
- ## Code scaffolding
6
+ La librería está publicada con el nombre:
6
7
 
7
- Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
8
+ - **Paquete npm**: `catarina`
9
+ - **Versión**: `1.0.1`
8
10
 
9
- ```bash
10
- ng generate component component-name
11
- ```
11
+ ---
12
+
13
+ ## Requisitos
14
+
15
+ `catarina` declara las siguientes _peerDependencies_:
16
+
17
+ - `@angular/core`: `^20.3.0`
18
+ - `@angular/common`: `^20.3.0`
12
19
 
13
- For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
20
+ Y depende de:
21
+
22
+ - `tslib`: `^2.3.0`
23
+
24
+ ---
25
+
26
+ ## Instalación
27
+
28
+ En un proyecto Angular 20:
14
29
 
15
30
  ```bash
16
- ng generate --help
31
+ npm install catarina
17
32
  ```
18
33
 
19
- ## Building
34
+ También se puede instalar con `pnpm` o `yarn` usando el mismo nombre de paquete.
20
35
 
21
- To build the library, run:
36
+ ---
22
37
 
23
- ```bash
24
- ng build catarina
38
+ ## API pública
39
+
40
+ El archivo `public-api.ts` expone los principales elementos del design system:
41
+
42
+ - **Componentes de diseño**:
43
+ - `Icon` (`cat-icon`)
44
+ - `Button` (`cat-button`)
45
+ - Paneles (`card`, `accordion`, `accordion-group`)
46
+ - **Componentes de formulario**:
47
+ - `cat-input`, `color-input`, `select-input`, `date-input`, `file-input`,
48
+ `password-input`, `range-input`, `text-area-input`, `time-input`
49
+ - **Overlays**:
50
+ - `dialog`
51
+ - **Servicios y directivas**:
52
+ - Directiva de arrastre (`drag`)
53
+ - Utilidades de _theming_
54
+ - **Tokens**:
55
+ - `ICON_PROVIDER`
56
+
57
+ Todos estos símbolos se importan directamente desde el paquete `catarina`.
58
+
59
+ ---
60
+
61
+ ## Configuración de iconos con `safirial-icons`
62
+
63
+ `catarina` utiliza el token `ICON_PROVIDER` para resolver las rutas de los iconos.
64
+ Este token se puede configurar usando las utilidades del paquete `safirial-icons`:
65
+
66
+ ```ts
67
+ // app.config.ts
68
+ import { ApplicationConfig } from '@angular/core';
69
+ import { provideHttpClient } from '@angular/common/http';
70
+ import { ICON_PROVIDER as CATARINA_ICON_PROVIDER } from 'catarina';
71
+ import { getIconPath } from 'safirial-icons';
72
+
73
+ const iconProviderConfig = {
74
+ getPath: getIconPath
75
+ };
76
+
77
+ export const appConfig: ApplicationConfig = {
78
+ providers: [
79
+ provideHttpClient(),
80
+ { provide: CATARINA_ICON_PROVIDER, useValue: iconProviderConfig }
81
+ ]
82
+ };
83
+ ```
84
+
85
+ Con esta configuración, los componentes de `catarina` que usan iconos resuelven las rutas desde `safirial-icons`.
86
+
87
+ ### Configuración de assets en `angular.json`
88
+
89
+ Además de configurar el `ICON_PROVIDER`, es necesario añadir la siguiente entrada en la sección `assets` de `angular.json` para que los archivos SVG de `safirial-icons` se copien al directorio de salida:
90
+
91
+ ```json
92
+ {
93
+ "projects": {
94
+ "tu-proyecto": {
95
+ "architect": {
96
+ "build": {
97
+ "options": {
98
+ "assets": [
99
+ "src/favicon.ico",
100
+ "src/assets",
101
+ {
102
+ "glob": "**/*.svg",
103
+ "input": "node_modules/safirial-icons/assets",
104
+ "output": "safirial-icons"
105
+ }
106
+ ]
107
+ }
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
25
113
  ```
26
114
 
27
- This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
115
+ Esta configuración copia todos los archivos SVG desde `node_modules/safirial-icons/assets` a la carpeta `safirial-icons` en el directorio de salida de la aplicación.
28
116
 
29
- ### Publishing the Library
117
+ ---
30
118
 
31
- Once the project is built, you can publish your library by following these steps:
119
+ ## Uso básico de componentes
32
120
 
33
- 1. Navigate to the `dist` directory:
34
- ```bash
35
- cd dist/catarina
36
- ```
121
+ Ejemplo de uso de `cat-button` e `Icon` dentro de un componente de aplicación:
37
122
 
38
- 2. Run the `npm publish` command to publish your library to the npm registry:
39
- ```bash
40
- npm publish
41
- ```
123
+ ```ts
124
+ // app.component.ts
125
+ import { Component } from '@angular/core';
126
+ import { Button as CatarinaButton, Icon as CatarinaIcon } from 'catarina';
42
127
 
43
- ## Running unit tests
128
+ @Component({
129
+ selector: 'app-root',
130
+ imports: [CatarinaButton, CatarinaIcon],
131
+ template: `
132
+ <cat-button variant="primary" size="md" iconLeft="home">
133
+ Botón Catarina
134
+ </cat-button>
135
+
136
+ <cat-icon name="sun" [size]="'32px'"></cat-icon>
137
+ `
138
+ })
139
+ export class AppComponent {}
140
+ ```
44
141
 
45
- To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
142
+ Los valores de `name` de los iconos deben coincidir con los nombres definidos en `iconList` del paquete `safirial-icons`.
143
+
144
+ ---
145
+
146
+ ## Construcción y publicación
147
+
148
+ Para compilar la librería desde el workspace:
46
149
 
47
150
  ```bash
48
- ng test
151
+ ng build catarina
49
152
  ```
50
153
 
51
- ## Running end-to-end tests
154
+ El resultado se genera en:
52
155
 
53
- For end-to-end (e2e) testing, run:
156
+ ```bash
157
+ dist/catarina
158
+ ```
159
+
160
+ Para publicar en npm (desde el workspace):
54
161
 
55
162
  ```bash
56
- ng e2e
163
+ ng build catarina
164
+ cd dist/catarina
165
+ npm publish
57
166
  ```
58
167
 
59
- Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
168
+ ---
169
+
170
+ ## Idioma / Language
171
+
172
+ Esta documentación está disponible en español. Para la versión en inglés, consulta [README.en.md](./README.en.md).
173
+
174
+ This documentation is available in Spanish. For the English version, see [README.en.md](./README.en.md).
175
+
176
+ ---
177
+
178
+ ## Nota sobre la documentación
60
179
 
61
- ## Additional Resources
180
+ Esta documentación fue generada usando **Cursor** con los siguientes parámetros:
62
181
 
63
- For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
182
+ - **Herramienta**: Cursor IDE
183
+ - **Modelo**: Auto (agente router de Cursor)
184
+ - **Idioma**: Español
185
+ - **Instrucciones**: Analizar todos los proyectos del workspace y actualizar la documentación para consumo, sin incluir errores, mejoras ni sugerencias, solo información factual sobre instalación, configuración y uso de las librerías.
@@ -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: [{
@@ -864,6 +864,284 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
864
864
  args: ['attr.data-card-class']
865
865
  }] } });
866
866
 
867
+ class Drawer {
868
+ closs = new EventEmitter();
869
+ handleKeyDown(event) {
870
+ this.clossOverlay();
871
+ }
872
+ side = 'left';
873
+ variant = 'surface';
874
+ customClass = '';
875
+ get dataCustomClass() {
876
+ return this.customClass;
877
+ }
878
+ get drawerClasses() {
879
+ return `${this.variant} ${this.side} ${this.customClass}`;
880
+ }
881
+ clossOverlay() {
882
+ this.closs.emit(false);
883
+ }
884
+ ;
885
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Drawer, deps: [], target: i0.ɵɵFactoryTarget.Component });
886
+ 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"] }] });
887
+ }
888
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Drawer, decorators: [{
889
+ type: Component,
890
+ 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"] }]
891
+ }], propDecorators: { closs: [{
892
+ type: Output
893
+ }], handleKeyDown: [{
894
+ type: HostListener,
895
+ args: ['window:keydown.escape', ['$event']]
896
+ }], side: [{
897
+ type: Input
898
+ }], variant: [{
899
+ type: Input
900
+ }], customClass: [{
901
+ type: Input
902
+ }], dataCustomClass: [{
903
+ type: HostBinding,
904
+ args: ['attr.data-drawer-class']
905
+ }] } });
906
+
907
+ class Menu {
908
+ variant = 'surface';
909
+ customClass = '';
910
+ get dataCustomClass() {
911
+ return this.customClass;
912
+ }
913
+ get menuClasses() {
914
+ return `${this.variant} ${this.customClass}`;
915
+ }
916
+ menuContainer;
917
+ menuContent;
918
+ dropdown;
919
+ platformId = inject(PLATFORM_ID);
920
+ resizeObserver;
921
+ mutationObserver;
922
+ showMoreButton = signal(false, ...(ngDevMode ? [{ debugName: "showMoreButton" }] : []));
923
+ isDropdownOpen = signal(false, ...(ngDevMode ? [{ debugName: "isDropdownOpen" }] : []));
924
+ overflowItems = signal([], ...(ngDevMode ? [{ debugName: "overflowItems" }] : []));
925
+ ngAfterViewInit() {
926
+ if (!isPlatformBrowser(this.platformId))
927
+ return;
928
+ setTimeout(() => {
929
+ this.checkOverflow();
930
+ this.setupObservers();
931
+ }, 0);
932
+ }
933
+ ngOnDestroy() {
934
+ this.resizeObserver?.disconnect();
935
+ this.mutationObserver?.disconnect();
936
+ if (isPlatformBrowser(this.platformId)) {
937
+ document.removeEventListener('click', this.handleOutsideClick);
938
+ }
939
+ }
940
+ setupObservers() {
941
+ if (!isPlatformBrowser(this.platformId))
942
+ return;
943
+ this.resizeObserver = new ResizeObserver(() => {
944
+ this.checkOverflow();
945
+ });
946
+ this.resizeObserver.observe(this.menuContainer.nativeElement);
947
+ this.mutationObserver = new MutationObserver(() => {
948
+ this.checkOverflow();
949
+ });
950
+ this.mutationObserver.observe(this.menuContent.nativeElement, {
951
+ childList: true,
952
+ subtree: true
953
+ });
954
+ document.addEventListener('click', this.handleOutsideClick);
955
+ }
956
+ handleOutsideClick = (event) => {
957
+ if (!this.isDropdownOpen())
958
+ return;
959
+ const target = event.target;
960
+ const clickedInside = this.menuContainer.nativeElement.contains(target) ||
961
+ this.dropdown?.nativeElement.contains(target);
962
+ if (!clickedInside) {
963
+ this.isDropdownOpen.set(false);
964
+ }
965
+ };
966
+ checkOverflow() {
967
+ // Si el dropdown está abierto, no recalcular (los elementos están en el dropdown)
968
+ // Solo actualizar el contenido del dropdown si es necesario
969
+ if (this.isDropdownOpen()) {
970
+ const overflowItems = this.overflowItems();
971
+ if (overflowItems.length > 0) {
972
+ this.showMoreButton.set(true);
973
+ setTimeout(() => {
974
+ this.waitForDropdownAndUpdate();
975
+ }, 0);
976
+ }
977
+ return;
978
+ }
979
+ const container = this.menuContent.nativeElement;
980
+ // Restaurar todos los elementos que puedan estar en el dropdown
981
+ this.restoreOverflowItems();
982
+ const items = Array.from(container.children);
983
+ if (items.length === 0) {
984
+ this.showMoreButton.set(false);
985
+ this.overflowItems.set([]);
986
+ return;
987
+ }
988
+ const menuItems = items.filter(item => !item.classList.contains('more-button'));
989
+ if (menuItems.length === 0) {
990
+ this.showMoreButton.set(false);
991
+ this.overflowItems.set([]);
992
+ return;
993
+ }
994
+ // Restaurar todos los elementos a su estado visible antes de calcular
995
+ menuItems.forEach(item => {
996
+ item.style.display = '';
997
+ });
998
+ // Forzar un reflow para obtener posiciones correctas
999
+ container.offsetHeight;
1000
+ // Detectar elementos en la primera fila vs elementos en filas adicionales
1001
+ const firstItemTop = menuItems[0]?.getBoundingClientRect().top;
1002
+ const firstRowItems = [];
1003
+ const overflowItems = [];
1004
+ menuItems.forEach(item => {
1005
+ const itemTop = item.getBoundingClientRect().top;
1006
+ // Tolerancia de 1px para manejar diferencias de redondeo
1007
+ if (Math.abs(itemTop - firstItemTop) <= 1) {
1008
+ firstRowItems.push(item);
1009
+ }
1010
+ else {
1011
+ overflowItems.push(item);
1012
+ }
1013
+ });
1014
+ // Si hay elementos en overflow, mostrar el botón More y ocultar los elementos overflow
1015
+ const needsMoreButton = overflowItems.length > 0;
1016
+ this.showMoreButton.set(needsMoreButton);
1017
+ // Ocultar elementos que están en la segunda fila o más
1018
+ overflowItems.forEach(item => {
1019
+ item.style.display = 'none';
1020
+ });
1021
+ // Mantener visibles solo los elementos de la primera fila
1022
+ firstRowItems.forEach(item => {
1023
+ item.style.display = '';
1024
+ });
1025
+ if (needsMoreButton) {
1026
+ this.overflowItems.set(overflowItems);
1027
+ }
1028
+ else {
1029
+ this.overflowItems.set([]);
1030
+ }
1031
+ }
1032
+ updateDropdownContent() {
1033
+ // Buscar el dropdown directamente en el DOM en lugar de usar ViewChild
1034
+ const menuWrapper = this.menuContainer.nativeElement.closest('.menu-wrapper');
1035
+ if (!menuWrapper) {
1036
+ return;
1037
+ }
1038
+ const dropdown = menuWrapper.querySelector('.dropdown');
1039
+ if (!dropdown) {
1040
+ return;
1041
+ }
1042
+ const dropdownContent = dropdown.querySelector('.dropdown-content');
1043
+ if (!dropdownContent) {
1044
+ return;
1045
+ }
1046
+ // Limpiar contenido previo - restaurar elementos que puedan estar ahí
1047
+ this.restoreOverflowItems();
1048
+ const overflowItems = this.overflowItems();
1049
+ if (overflowItems.length === 0) {
1050
+ return;
1051
+ }
1052
+ const menuContent = this.menuContent.nativeElement;
1053
+ overflowItems.forEach(item => {
1054
+ // Mover el elemento real al dropdown (preserva todos los event listeners de Angular)
1055
+ // El elemento ya está oculto (display: none), así que lo hacemos visible y lo movemos
1056
+ item.style.display = '';
1057
+ item.style.visibility = 'visible';
1058
+ item.style.opacity = '1';
1059
+ // Añadir un listener para cerrar el dropdown cuando se haga click
1060
+ const closeHandler = () => {
1061
+ this.isDropdownOpen.set(false);
1062
+ };
1063
+ // Buscar el botón dentro del elemento y añadir el listener
1064
+ const button = item.querySelector('button, cat-button, [role="button"]');
1065
+ if (button) {
1066
+ button.addEventListener('click', closeHandler, { once: true });
1067
+ }
1068
+ else {
1069
+ item.addEventListener('click', closeHandler, { once: true });
1070
+ }
1071
+ // Mover el elemento al dropdown
1072
+ dropdownContent.appendChild(item);
1073
+ });
1074
+ }
1075
+ restoreOverflowItems() {
1076
+ const overflowItems = this.overflowItems();
1077
+ const menuContent = this.menuContent.nativeElement;
1078
+ overflowItems.forEach(item => {
1079
+ // Si el elemento está en el dropdown, moverlo de vuelta al menu-content
1080
+ const dropdownContent = item.closest('.dropdown-content');
1081
+ if (dropdownContent && item.parentElement === dropdownContent) {
1082
+ // Ocultar el elemento y moverlo de vuelta al menu-content
1083
+ item.style.display = 'none';
1084
+ menuContent.appendChild(item);
1085
+ }
1086
+ });
1087
+ }
1088
+ toggleDropdown() {
1089
+ const newState = !this.isDropdownOpen();
1090
+ if (!newState) {
1091
+ // Si se está cerrando, restaurar los elementos a su posición original
1092
+ this.restoreOverflowItems();
1093
+ }
1094
+ this.isDropdownOpen.set(newState);
1095
+ if (newState) {
1096
+ // Recalcular overflow antes de abrir el dropdown
1097
+ setTimeout(() => {
1098
+ this.checkOverflow();
1099
+ // Esperar a que el dropdown esté en el DOM antes de actualizar
1100
+ this.waitForDropdownAndUpdate();
1101
+ }, 0);
1102
+ }
1103
+ }
1104
+ waitForDropdownAndUpdate() {
1105
+ // Intentar actualizar el dropdown, reintentando si no está disponible
1106
+ const maxAttempts = 20;
1107
+ let attempts = 0;
1108
+ const tryUpdate = () => {
1109
+ attempts++;
1110
+ const menuWrapper = this.menuContainer.nativeElement.closest('.menu-wrapper');
1111
+ const dropdown = menuWrapper?.querySelector('.dropdown');
1112
+ if (dropdown) {
1113
+ this.updateDropdownContent();
1114
+ }
1115
+ else if (attempts < maxAttempts) {
1116
+ setTimeout(tryUpdate, 10);
1117
+ }
1118
+ };
1119
+ tryUpdate();
1120
+ }
1121
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Menu, deps: [], target: i0.ɵɵFactoryTarget.Component });
1122
+ 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 \n class=\"more-button\"\n (click)=\"toggleDropdown()\"\n [attr.aria-expanded]=\"isDropdownOpen()\"\n type=\"button\">\n <span>More</span>\n <svg \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 16 16\" \n 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-2);color:var(--neutral-color-9);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-3)}.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"] });
1123
+ }
1124
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Menu, decorators: [{
1125
+ type: Component,
1126
+ args: [{ selector: 'cat-menu', imports: [], 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 \n class=\"more-button\"\n (click)=\"toggleDropdown()\"\n [attr.aria-expanded]=\"isDropdownOpen()\"\n type=\"button\">\n <span>More</span>\n <svg \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 16 16\" \n 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-2);color:var(--neutral-color-9);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-3)}.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"] }]
1127
+ }], propDecorators: { variant: [{
1128
+ type: Input
1129
+ }], customClass: [{
1130
+ type: Input
1131
+ }], dataCustomClass: [{
1132
+ type: HostBinding,
1133
+ args: ['attr.data-menu-class']
1134
+ }], menuContainer: [{
1135
+ type: ViewChild,
1136
+ args: ['menuContainer', { static: false }]
1137
+ }], menuContent: [{
1138
+ type: ViewChild,
1139
+ args: ['menuContent', { static: false }]
1140
+ }], dropdown: [{
1141
+ type: ViewChild,
1142
+ args: ['dropdown', { static: false }]
1143
+ }] } });
1144
+
867
1145
  class Theming {
868
1146
  //Light Theme = False
869
1147
  activeThemeSubject = new BehaviorSubject(false);
@@ -994,5 +1272,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
994
1272
  * Generated bundle index. Do not edit.
995
1273
  */
996
1274
 
997
- export { Accordion, AccordionGroup, Button, Card, CatInput, ColorInput, DateInput, Dialog, Drag, FileInput, ICON_PROVIDER, Icon, PasswordInput, RangeInput, SelectInput, TextAreaInput, Theming, TimeInput };
1275
+ export { Accordion, AccordionGroup, Button, Card, CatInput, ColorInput, DateInput, Dialog, Drag, Drawer, FileInput, ICON_PROVIDER, Icon, Menu, PasswordInput, RangeInput, SelectInput, TextAreaInput, Theming, TimeInput };
998
1276
  //# 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 } 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 { 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';\n\n@Component({\n selector: 'cat-menu',\n imports: [],\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 \n class=\"more-button\"\n (click)=\"toggleDropdown()\"\n [attr.aria-expanded]=\"isDropdownOpen()\"\n type=\"button\">\n <span>More</span>\n <svg \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 16 16\" \n 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 //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';\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
@@ -195,6 +195,46 @@ declare class Dialog {
195
195
  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
196
  }
197
197
 
198
+ declare class Drawer {
199
+ closs: EventEmitter<boolean>;
200
+ handleKeyDown(event: Event): void;
201
+ side: 'left' | 'right' | 'top' | 'bottom';
202
+ variant: 'surface' | 'elevated' | 'outlined';
203
+ customClass: string;
204
+ get dataCustomClass(): string;
205
+ get drawerClasses(): string;
206
+ clossOverlay(): void;
207
+ static ɵfac: i0.ɵɵFactoryDeclaration<Drawer, never>;
208
+ 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>;
209
+ }
210
+
211
+ declare class Menu implements AfterViewInit, OnDestroy {
212
+ variant: 'surface' | 'elevated' | 'outlined';
213
+ customClass: string;
214
+ get dataCustomClass(): string;
215
+ get menuClasses(): string;
216
+ menuContainer: ElementRef<HTMLDivElement>;
217
+ menuContent: ElementRef<HTMLDivElement>;
218
+ dropdown?: ElementRef<HTMLDivElement>;
219
+ private platformId;
220
+ private resizeObserver?;
221
+ private mutationObserver?;
222
+ showMoreButton: i0.WritableSignal<boolean>;
223
+ isDropdownOpen: i0.WritableSignal<boolean>;
224
+ overflowItems: i0.WritableSignal<HTMLElement[]>;
225
+ ngAfterViewInit(): void;
226
+ ngOnDestroy(): void;
227
+ private setupObservers;
228
+ private handleOutsideClick;
229
+ private checkOverflow;
230
+ private updateDropdownContent;
231
+ private restoreOverflowItems;
232
+ toggleDropdown(): void;
233
+ private waitForDropdownAndUpdate;
234
+ static ɵfac: i0.ɵɵFactoryDeclaration<Menu, never>;
235
+ static ɵcmp: i0.ɵɵComponentDeclaration<Menu, "cat-menu", never, { "variant": { "alias": "variant"; "required": false; }; "customClass": { "alias": "customClass"; "required": false; }; }, {}, never, ["*"], true, never>;
236
+ }
237
+
198
238
  declare class Drag implements AfterViewInit {
199
239
  private el;
200
240
  private renderer;
@@ -231,5 +271,5 @@ interface IconProvider {
231
271
  }
232
272
  declare const ICON_PROVIDER: InjectionToken<IconProvider>;
233
273
 
234
- export { Accordion, AccordionGroup, Button, Card, CatInput, ColorInput, DateInput, Dialog, Drag, FileInput, ICON_PROVIDER, Icon, PasswordInput, RangeInput, SelectInput, TextAreaInput, Theming, TimeInput };
274
+ export { Accordion, AccordionGroup, Button, Card, CatInput, ColorInput, DateInput, Dialog, Drag, Drawer, FileInput, ICON_PROVIDER, Icon, Menu, PasswordInput, RangeInput, SelectInput, TextAreaInput, Theming, TimeInput };
235
275
  export type { IconProvider };
package/package.json CHANGED
@@ -1,6 +1,24 @@
1
1
  {
2
2
  "name": "catarina",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
+ "description": "Angular 20.3.0 UI Design System, preview: https://jpcn-portfolio.vercel.app/catarina-preview",
5
+ "keywords": [
6
+ "angular",
7
+ "design-system",
8
+ "ui",
9
+ "components",
10
+ "hydenaky"
11
+ ],
12
+ "author": "hydenaky",
13
+ "license": "MIT",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/Hydenaky/library-workspace"
17
+ },
18
+ "bugs": {
19
+ "url": "https://github.com/Hydenaky/library-workspace/issues"
20
+ },
21
+ "homepage": "https://github.com/Hydenaky/library-workspace/blob/main/README.md",
4
22
  "peerDependencies": {
5
23
  "@angular/common": "^20.3.0",
6
24
  "@angular/core": "^20.3.0"