@gardev/components 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # ArdevWine
2
+
3
+ This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 21.1.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
8
+
9
+ ```bash
10
+ ng generate component component-name
11
+ ```
12
+
13
+ For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
14
+
15
+ ```bash
16
+ ng generate --help
17
+ ```
18
+
19
+ ## Building
20
+
21
+ To build the library, run:
22
+
23
+ ```bash
24
+ ng build @ardev/components
25
+ ```
26
+
27
+ This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
28
+
29
+ ### Publishing the Library
30
+
31
+ Once the project is built, you can publish your library by following these steps:
32
+
33
+ 1. Navigate to the `dist` directory:
34
+ ```bash
35
+ cd dist/@ardev/components
36
+ ```
37
+
38
+ 2. Run the `npm publish` command to publish your library to the npm registry:
39
+ ```bash
40
+ npm publish
41
+ ```
42
+
43
+ ## Running unit tests
44
+
45
+ To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
46
+
47
+ ```bash
48
+ ng test
49
+ ```
50
+
51
+ ## Running end-to-end tests
52
+
53
+ For end-to-end (e2e) testing, run:
54
+
55
+ ```bash
56
+ ng e2e
57
+ ```
58
+
59
+ Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
60
+
61
+ ## Additional Resources
62
+
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.
@@ -0,0 +1,575 @@
1
+ import * as i0 from '@angular/core';
2
+ import { ViewChild, Input, Component, EventEmitter, ElementRef, Output, ViewChildren, HostListener, inject, ViewContainerRef, Injectable } from '@angular/core';
3
+ import * as THREE from 'three';
4
+ import { SVGLoader } from 'three/examples/jsm/Addons.js';
5
+ import * as i1 from '@angular/common';
6
+ import { NgForOf, NgClass, NgStyle, CommonModule } from '@angular/common';
7
+ import { Overlay } from '@angular/cdk/overlay';
8
+ import { TemplatePortal } from '@angular/cdk/portal';
9
+
10
+ class BottleComponent {
11
+ color = '#868132';
12
+ wineColor = '#fff6f5';
13
+ container;
14
+ scene;
15
+ camera;
16
+ renderer;
17
+ glassMaterial;
18
+ liquidMaterial;
19
+ foilMaterial;
20
+ ngAfterViewInit() {
21
+ this.glassMaterial = new THREE.MeshPhysicalMaterial({
22
+ color: new THREE.Color(this.color),
23
+ metalness: 0,
24
+ roughness: 0,
25
+ transmission: 1,
26
+ thickness: 0,
27
+ ior: 1.5,
28
+ clearcoat: 1.0,
29
+ clearcoatRoughness: 0.05,
30
+ opacity: 1,
31
+ side: THREE.FrontSide,
32
+ transparent: true,
33
+ depthWrite: false,
34
+ envMapIntensity: 2.5
35
+ });
36
+ this.liquidMaterial = new THREE.MeshPhysicalMaterial({
37
+ color: new THREE.Color('#e2d744'),
38
+ metalness: 0.4,
39
+ // roughness: 0.25,
40
+ transmission: 0.2,
41
+ thickness: 0.4,
42
+ ior: 1.5,
43
+ clearcoat: 1.0,
44
+ clearcoatRoughness: 0.05,
45
+ transparent: true,
46
+ opacity: 0.8,
47
+ depthWrite: false, // 🔑 el líquid SÍ escriu profunditat
48
+ side: THREE.BackSide,
49
+ // envMapIntensity: 1.2,
50
+ });
51
+ this.foilMaterial = new THREE.MeshPhysicalMaterial({
52
+ color: 0x156289,
53
+ metalness: 0.25,
54
+ roughness: 0.3,
55
+ side: THREE.DoubleSide
56
+ });
57
+ this.createSceneAndLighting();
58
+ this.loadModelFromSVGFile();
59
+ this.animate();
60
+ }
61
+ animate = () => {
62
+ requestAnimationFrame(this.animate);
63
+ if (this.camera) {
64
+ const t = Date.now() * 0.0002;
65
+ this.camera.position.x = Math.sin(t) * 50;
66
+ this.camera.position.z = Math.cos(t) * 50;
67
+ this.camera.lookAt(0, 0, 0);
68
+ }
69
+ this.renderer.shadowMap.enabled = true;
70
+ this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;
71
+ this.renderer.render(this.scene, this.camera);
72
+ };
73
+ loadModelFromSVGFile() {
74
+ const loader = new SVGLoader();
75
+ loader.load('assets/bitmap.svg', (data) => {
76
+ const bottleGroup = new THREE.Group();
77
+ data.paths.forEach((path, index) => {
78
+ const shapes = SVGLoader.createShapes(path);
79
+ shapes.forEach((shape) => {
80
+ const points = shape.getPoints().map(p => new THREE.Vector2(p.x * 0.1, -p.y * 0.1));
81
+ const geometry = new THREE.LatheGeometry(points, 128); // més segments → més suau
82
+ geometry.computeVertexNormals(); // normals correctes
83
+ const material = (index === 0) ? this.glassMaterial :
84
+ (index === 1) ? this.liquidMaterial : this.foilMaterial;
85
+ const mesh = new THREE.Mesh(geometry, material);
86
+ const layerGroup = new THREE.Group();
87
+ layerGroup.add(mesh);
88
+ bottleGroup.add(layerGroup);
89
+ });
90
+ });
91
+ const box = new THREE.Box3().setFromObject(bottleGroup);
92
+ const center = box.getCenter(new THREE.Vector3());
93
+ bottleGroup.position.sub(center);
94
+ this.scene.add(bottleGroup);
95
+ });
96
+ }
97
+ createSceneAndLighting() {
98
+ this.scene = new THREE.Scene();
99
+ const width = this.container.nativeElement.clientWidth;
100
+ const height = this.container.nativeElement.clientHeight;
101
+ this.camera = new THREE.PerspectiveCamera(35, width / height, 0.1, 5000);
102
+ this.camera.position.set(30, 20, 50);
103
+ this.camera.lookAt(0, 0, 0);
104
+ this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
105
+ this.renderer.setSize(width, height);
106
+ this.renderer.toneMapping = THREE.ACESFilmicToneMapping; // millora realisme colors
107
+ this.container.nativeElement.appendChild(this.renderer.domElement);
108
+ const ambientLight = new THREE.AmbientLight(0xffffff, 0.3);
109
+ this.scene.add(ambientLight);
110
+ const directionalLight = new THREE.DirectionalLight(0xffffff, 1.0);
111
+ directionalLight.position.set(50, 80, 50);
112
+ directionalLight.castShadow = true;
113
+ directionalLight.shadow.mapSize.width = 2048;
114
+ directionalLight.shadow.mapSize.height = 2048;
115
+ directionalLight.shadow.radius = 4;
116
+ this.scene.add(directionalLight);
117
+ const backLight = new THREE.PointLight(0xffffff, 0.5);
118
+ backLight.position.set(-30, 40, -30);
119
+ this.scene.add(backLight);
120
+ const sideLight = new THREE.PointLight(0xffffff, 0.3);
121
+ sideLight.position.set(30, 10, -40);
122
+ this.scene.add(sideLight);
123
+ const textureLoader = new THREE.TextureLoader();
124
+ textureLoader.load('assets/environment-map.png', (texture) => {
125
+ texture.mapping = THREE.EquirectangularReflectionMapping;
126
+ this.scene.environment = texture;
127
+ //this.scene.background = texture;
128
+ });
129
+ }
130
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: BottleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
131
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.0", type: BottleComponent, isStandalone: true, selector: "app-bottle", inputs: { color: "color", wineColor: "wineColor" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }], ngImport: i0, template: "<div #container class=\"three-container\"></div>", styles: [".three-container{width:300px;height:600px}\n"] });
132
+ }
133
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: BottleComponent, decorators: [{
134
+ type: Component,
135
+ args: [{ selector: 'app-bottle', standalone: true, template: "<div #container class=\"three-container\"></div>", styles: [".three-container{width:300px;height:600px}\n"] }]
136
+ }], propDecorators: { color: [{
137
+ type: Input
138
+ }], wineColor: [{
139
+ type: Input
140
+ }], container: [{
141
+ type: ViewChild,
142
+ args: ['container', { static: true }]
143
+ }] } });
144
+
145
+ class CarousselMenuComponent {
146
+ length = 0;
147
+ buttons;
148
+ selectedIndex;
149
+ indexChange = new EventEmitter();
150
+ positions = [];
151
+ resetWidthId;
152
+ ngAfterViewInit() {
153
+ const btns = this.buttons.toArray();
154
+ const firstRight = btns[0]?.nativeElement.getBoundingClientRect().right ?? 0;
155
+ this.positions = btns.map(b => b.nativeElement.getBoundingClientRect().right - firstRight);
156
+ }
157
+ selectIndex(i) {
158
+ this.indexChange.emit(i);
159
+ const el = this.selectedIndex.nativeElement;
160
+ const x = this.positions[i] ?? 0;
161
+ el.style.transform = `translateX(${x}px)`;
162
+ const baseWidth = el.getBoundingClientRect().width;
163
+ el.style.width = `${baseWidth * 1.5}px`;
164
+ if (this.resetWidthId) {
165
+ clearTimeout(this.resetWidthId);
166
+ }
167
+ this.resetWidthId = window.setTimeout(() => {
168
+ el.style.width = `${baseWidth}px`;
169
+ }, 150);
170
+ }
171
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: CarousselMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
172
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.0", type: CarousselMenuComponent, isStandalone: true, selector: "ard-caroussel-menu", inputs: { length: "length" }, outputs: { indexChange: "indexChange" }, viewQueries: [{ propertyName: "selectedIndex", first: true, predicate: ["selectedIndex"], descendants: true }, { propertyName: "buttons", predicate: ["btn"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div style=\"display: flex; gap: 1rem;\">\r\n <button #btn *ngFor=\"let _ of [].constructor(length); let i = index\" (click)=\"selectIndex(i)\">\r\n </button>\r\n <div #selectedIndex id=\"selectedIndex\"></div>\r\n</div>", styles: ["button{width:calc(1rem - 4px);height:calc(1rem - 4px);background:#000;border:0;border-radius:1rem;z-index:1;margin:2px;cursor:pointer}#selectedIndex{width:1rem;height:1rem;background:#fff;border-radius:1rem;position:absolute;z-index:0;transition:transform .3s cubic-bezier(.35,0,.25,1),width .3s cubic-bezier(.35,0,.25,1);will-change:transform,width}\n"], dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
173
+ }
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: CarousselMenuComponent, decorators: [{
175
+ type: Component,
176
+ args: [{ selector: 'ard-caroussel-menu', standalone: true, imports: [NgForOf], template: "<div style=\"display: flex; gap: 1rem;\">\r\n <button #btn *ngFor=\"let _ of [].constructor(length); let i = index\" (click)=\"selectIndex(i)\">\r\n </button>\r\n <div #selectedIndex id=\"selectedIndex\"></div>\r\n</div>", styles: ["button{width:calc(1rem - 4px);height:calc(1rem - 4px);background:#000;border:0;border-radius:1rem;z-index:1;margin:2px;cursor:pointer}#selectedIndex{width:1rem;height:1rem;background:#fff;border-radius:1rem;position:absolute;z-index:0;transition:transform .3s cubic-bezier(.35,0,.25,1),width .3s cubic-bezier(.35,0,.25,1);will-change:transform,width}\n"] }]
177
+ }], propDecorators: { length: [{
178
+ type: Input
179
+ }], buttons: [{
180
+ type: ViewChildren,
181
+ args: ['btn', { read: ElementRef }]
182
+ }], selectedIndex: [{
183
+ type: ViewChild,
184
+ args: ['selectedIndex']
185
+ }], indexChange: [{
186
+ type: Output
187
+ }] } });
188
+
189
+ class CarousselComponent {
190
+ images = [];
191
+ index = 0;
192
+ next() {
193
+ this.index = (this.index + 1) % this.images.length;
194
+ }
195
+ goTo(i) {
196
+ this.index = i;
197
+ }
198
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: CarousselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
199
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.0", type: CarousselComponent, isStandalone: true, selector: "ard-caroussel", inputs: { images: "images" }, ngImport: i0, template: "<div style=\"position: relative; top: 0; width: 100%; height: 100%; overflow: hidden;\">\r\n <img *ngFor=\"let img of images; let i = index\" [src]=\"img\" [style.opacity]=\"i === index ? 1 : 0\" class=\"image\"\r\n alt=\"\">\r\n\r\n <div style=\"position: absolute; bottom: 10px; left: 50%; transform: translateX(-50%); display: flex; gap: 8px;\">\r\n <ard-caroussel-menu (indexChange)=\"goTo($event)\" [length]=\"images.length\"></ard-caroussel-menu>\r\n </div>\r\n</div>", styles: [".image{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;object-position:center;transition:opacity .5s ease-in-out}\n"], dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: CarousselMenuComponent, selector: "ard-caroussel-menu", inputs: ["length"], outputs: ["indexChange"] }] });
200
+ }
201
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: CarousselComponent, decorators: [{
202
+ type: Component,
203
+ args: [{ selector: 'ard-caroussel', imports: [NgForOf, CarousselMenuComponent], template: "<div style=\"position: relative; top: 0; width: 100%; height: 100%; overflow: hidden;\">\r\n <img *ngFor=\"let img of images; let i = index\" [src]=\"img\" [style.opacity]=\"i === index ? 1 : 0\" class=\"image\"\r\n alt=\"\">\r\n\r\n <div style=\"position: absolute; bottom: 10px; left: 50%; transform: translateX(-50%); display: flex; gap: 8px;\">\r\n <ard-caroussel-menu (indexChange)=\"goTo($event)\" [length]=\"images.length\"></ard-caroussel-menu>\r\n </div>\r\n</div>", styles: [".image{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;object-position:center;transition:opacity .5s ease-in-out}\n"] }]
204
+ }], propDecorators: { images: [{
205
+ type: Input
206
+ }] } });
207
+
208
+ class CronogramComponent {
209
+ wrapper;
210
+ line;
211
+ children;
212
+ items = [
213
+ { date: 2000, content: 'Lorem ipsum dolor sit amet', image: 'lorem' },
214
+ { date: 2001, content: 'Lorem ipsum dolor sit amet', image: 'lorem' },
215
+ { date: 2002, content: 'Lorem ipsum dolor sit amet', image: 'lorem' }
216
+ ];
217
+ positionsY = [];
218
+ ngAfterViewInit() {
219
+ this.positionsY = this.children.map(i => i.nativeElement.getBoundingClientRect().y);
220
+ this.line.nativeElement.style.maxHeight = `${this.wrapper.nativeElement.getBoundingClientRect().height}px`;
221
+ }
222
+ lastScrollY = window.scrollY;
223
+ onScroll() {
224
+ const scrollPosition = window.scrollY;
225
+ if (scrollPosition > this.lastScrollY) {
226
+ this.onScrollDown(scrollPosition);
227
+ }
228
+ else if (scrollPosition < this.lastScrollY) {
229
+ this.onScrollUp(scrollPosition);
230
+ }
231
+ this.lastScrollY = scrollPosition;
232
+ this.line.nativeElement.style.height = `${this.visibleHeight(this.wrapper.nativeElement)}px`;
233
+ }
234
+ onScrollDown(scrollPosition) {
235
+ let index = this.positionsY.findIndex(pos => pos > scrollPosition - 100);
236
+ if (index === -1) {
237
+ index = this.positionsY.length;
238
+ }
239
+ this.children.forEach((child, i) => {
240
+ const el = child.nativeElement;
241
+ if (i < index) {
242
+ el.classList.remove("hidden");
243
+ el.classList.add("visible");
244
+ }
245
+ });
246
+ this.line.nativeElement.style.transition = 'height 1.2s';
247
+ }
248
+ onScrollUp(scrollPosition) {
249
+ let index = this.positionsY.findIndex(pos => pos > scrollPosition - 50);
250
+ if (index === -1) {
251
+ index = this.positionsY.length;
252
+ }
253
+ this.children.forEach((child, i) => {
254
+ const el = child.nativeElement;
255
+ if (i >= index) {
256
+ el.classList.add("hidden");
257
+ el.classList.remove("visible");
258
+ }
259
+ });
260
+ this.line.nativeElement.style.transition = 'height 0s';
261
+ }
262
+ visibleHeight(el) {
263
+ const rect = el.getBoundingClientRect();
264
+ const viewportHeight = window.innerHeight;
265
+ const topVisible = Math.max(rect.top, 0);
266
+ const bottomVisible = Math.min(rect.bottom, viewportHeight);
267
+ return Math.max(0, bottomVisible - topVisible);
268
+ }
269
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: CronogramComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
270
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: CronogramComponent, isStandalone: true, selector: "ard-cronogram", host: { listeners: { "window:scroll": "onScroll()" } }, viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, read: ElementRef }, { propertyName: "line", first: true, predicate: ["line"], descendants: true, read: ElementRef }, { propertyName: "children", predicate: ["CronogramContent"], descendants: true, read: ElementRef }], ngImport: i0, template: "<h4>cronogram.component.ts</h4>\r\n\r\n<p>\r\n en la vista mobile, estar\u00E0 tot en un mateix costat?\r\n</p>\r\n\r\n<div #wrapper>\r\n\r\n\r\n\r\n @for(day of items; track day.date; let i = $index;) {\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 0fr 1fr;\" class=\"general-container\" #CronogramContent>\r\n\r\n\r\n <div class=\"left-container\" [ngClass]=\"i % 2 == 0 ? 'odd' : 'even'\">\r\n @if(i % 2 === 0) {\r\n <h3>{{day.date}}</h3>\r\n <p>lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit\r\n amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet,</p>\r\n }\r\n </div>\r\n\r\n\r\n <div class=\"center\" style=\"height: 100%; display: flex; width: 1rem; flex-flow: column; position: relative\">\r\n <div class=\"bullet\" style=\"z-index: 2\">\r\n </div>\r\n\r\n @if (i == 0) {\r\n <div class=\"line\" #line>\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n <div class=\"right-container cronogram-content\" [ngClass]=\"i % 2 == 0 ? 'odd' : 'even'\">\r\n @if(i % 2 !== 0) {\r\n <h3>{{day.date}}</h3>\r\n <p>lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit\r\n amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet,</p>\r\n\r\n }\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>", styles: [".left-container.odd,.right-container.even{padding:0 1rem}.left-container,.right-container{padding:0 1rem;max-width:35ch}.general-container{transition:opacity .6s}.line{background:var(--color-text);width:100%;position:absolute;border-radius:1rem 1rem 0 0;animation-timing-function:ease-out;width:.4rem}.bullet{width:.4rem;min-height:.4rem;background:var(--color-text);outline:3px solid var(--color-text);border-radius:2rem;position:absolute}.hidden{opacity:0}.visible{opacity:1}.center{position:relative}.left-container{display:flex;justify-content:end;text-align:end;justify-self:end;flex-flow:column}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
271
+ }
272
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: CronogramComponent, decorators: [{
273
+ type: Component,
274
+ args: [{ selector: 'ard-cronogram', imports: [NgClass], template: "<h4>cronogram.component.ts</h4>\r\n\r\n<p>\r\n en la vista mobile, estar\u00E0 tot en un mateix costat?\r\n</p>\r\n\r\n<div #wrapper>\r\n\r\n\r\n\r\n @for(day of items; track day.date; let i = $index;) {\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 0fr 1fr;\" class=\"general-container\" #CronogramContent>\r\n\r\n\r\n <div class=\"left-container\" [ngClass]=\"i % 2 == 0 ? 'odd' : 'even'\">\r\n @if(i % 2 === 0) {\r\n <h3>{{day.date}}</h3>\r\n <p>lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit\r\n amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet,</p>\r\n }\r\n </div>\r\n\r\n\r\n <div class=\"center\" style=\"height: 100%; display: flex; width: 1rem; flex-flow: column; position: relative\">\r\n <div class=\"bullet\" style=\"z-index: 2\">\r\n </div>\r\n\r\n @if (i == 0) {\r\n <div class=\"line\" #line>\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n <div class=\"right-container cronogram-content\" [ngClass]=\"i % 2 == 0 ? 'odd' : 'even'\">\r\n @if(i % 2 !== 0) {\r\n <h3>{{day.date}}</h3>\r\n <p>lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit\r\n amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet,</p>\r\n\r\n }\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>", styles: [".left-container.odd,.right-container.even{padding:0 1rem}.left-container,.right-container{padding:0 1rem;max-width:35ch}.general-container{transition:opacity .6s}.line{background:var(--color-text);width:100%;position:absolute;border-radius:1rem 1rem 0 0;animation-timing-function:ease-out;width:.4rem}.bullet{width:.4rem;min-height:.4rem;background:var(--color-text);outline:3px solid var(--color-text);border-radius:2rem;position:absolute}.hidden{opacity:0}.visible{opacity:1}.center{position:relative}.left-container{display:flex;justify-content:end;text-align:end;justify-self:end;flex-flow:column}\n"] }]
275
+ }], propDecorators: { wrapper: [{
276
+ type: ViewChild,
277
+ args: ['wrapper', { read: ElementRef }]
278
+ }], line: [{
279
+ type: ViewChild,
280
+ args: ['line', { read: ElementRef }]
281
+ }], children: [{
282
+ type: ViewChildren,
283
+ args: ['CronogramContent', { read: ElementRef }]
284
+ }], onScroll: [{
285
+ type: HostListener,
286
+ args: ['window:scroll', []]
287
+ }] } });
288
+
289
+ class MenuComponent {
290
+ cdr;
291
+ justifySelf = 'end';
292
+ menu = [];
293
+ direction = 'horizontal';
294
+ menuContainer;
295
+ unorderedList;
296
+ constructor(cdr) {
297
+ this.cdr = cdr;
298
+ }
299
+ collapsed = false;
300
+ listWidth = 0;
301
+ ngAfterViewInit() {
302
+ setTimeout(() => {
303
+ this.getWidth();
304
+ });
305
+ }
306
+ getWidth() {
307
+ const containerWidth = this.menuContainer.nativeElement.getBoundingClientRect().width;
308
+ if (!this.collapsed)
309
+ this.listWidth = this.unorderedList?.nativeElement?.scrollWidth;
310
+ this.collapsed = containerWidth < this.listWidth;
311
+ this.cdr.detectChanges();
312
+ console.log(containerWidth, this.listWidth, this.collapsed);
313
+ }
314
+ //#region overlay
315
+ overlay = inject(Overlay);
316
+ overlayRef;
317
+ menuOverlay; // Template del menú
318
+ trigger; // Botó
319
+ toggleMenu() {
320
+ console.log('toggleMenu');
321
+ this.overlayRef ? this.closeMenu() : this.openMenu();
322
+ }
323
+ viewContainerRef = inject(ViewContainerRef);
324
+ openMenu() {
325
+ const positionStrategy = this.overlay
326
+ .position()
327
+ .flexibleConnectedTo(this.trigger)
328
+ .withPositions([
329
+ {
330
+ originX: 'start',
331
+ originY: 'bottom',
332
+ overlayX: 'start',
333
+ overlayY: 'top'
334
+ }
335
+ ]);
336
+ this.overlayRef = this.overlay.create({
337
+ positionStrategy,
338
+ hasBackdrop: true,
339
+ backdropClass: 'cdk-overlay-transparent-backdrop',
340
+ scrollStrategy: this.overlay.scrollStrategies.reposition()
341
+ });
342
+ this.overlayRef.backdropClick().subscribe(() => this.closeMenu());
343
+ const portal = new TemplatePortal(this.menuOverlay, this.viewContainerRef); // ✅ SI
344
+ this.overlayRef.attach(portal);
345
+ }
346
+ closeMenu() {
347
+ this.overlayRef?.dispose();
348
+ this.overlayRef = undefined;
349
+ }
350
+ action(value) {
351
+ console.log(value);
352
+ this.closeMenu();
353
+ }
354
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: MenuComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
355
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: MenuComponent, isStandalone: true, selector: "ard-menu", inputs: { justifySelf: "justifySelf", menu: "menu", direction: "direction" }, host: { listeners: { "window:resize": "getWidth()" } }, viewQueries: [{ propertyName: "menuContainer", first: true, predicate: ["menuContainer"], descendants: true }, { propertyName: "unorderedList", first: true, predicate: ["unorderedList"], descendants: true }, { propertyName: "menuOverlay", first: true, predicate: ["menuOverlay"], descendants: true }, { propertyName: "trigger", first: true, predicate: ["overlayTrigger"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div #menuContainer id=\"menu-container\">\r\n @if(!collapsed) {\r\n <ul #unorderedList [style.flexFlow]=\"direction == 'horizontal' ? 'row' : 'column'\"\r\n [style.justifySelf]=\"justifySelf\">\r\n @for (i of menu; track i.label) {\r\n <li><a [href]=\"i.path\">{{i.label}}</a></li>\r\n }\r\n </ul>\r\n } @else {\r\n <button #overlayTrigger [style.justifySelf]=\"justifySelf\" (click)=\"toggleMenu()\">Menu</button>\r\n\r\n <ng-template #menuOverlay>\r\n <div id=\"dropdown\">\r\n @for (i of menu; track i.label) {\r\n <li><a [href]=\"i.path\">{{i.label}}</a></li>\r\n }\r\n </div>\r\n </ng-template>\r\n }\r\n\r\n</div>", styles: ["ul{list-style-type:none;display:flex;margin:0;padding:0}a{color:var(--menu-text);text-decoration:none;font-weight:400}a:hover{text-decoration:underline}button{display:flex;justify-self:end}li:after{content:\"\";margin-left:1rem}#menu-container{width:100%;height:100%;overflow:hidden}:host{width:100%;overflow:hidden}#dropdown{background:#fff;border-radius:1rem;border:1px solid black;padding:1rem;margin:0 1rem}#dropdown li{list-style-type:none}\n"] });
356
+ }
357
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: MenuComponent, decorators: [{
358
+ type: Component,
359
+ args: [{ selector: 'ard-menu', template: "<div #menuContainer id=\"menu-container\">\r\n @if(!collapsed) {\r\n <ul #unorderedList [style.flexFlow]=\"direction == 'horizontal' ? 'row' : 'column'\"\r\n [style.justifySelf]=\"justifySelf\">\r\n @for (i of menu; track i.label) {\r\n <li><a [href]=\"i.path\">{{i.label}}</a></li>\r\n }\r\n </ul>\r\n } @else {\r\n <button #overlayTrigger [style.justifySelf]=\"justifySelf\" (click)=\"toggleMenu()\">Menu</button>\r\n\r\n <ng-template #menuOverlay>\r\n <div id=\"dropdown\">\r\n @for (i of menu; track i.label) {\r\n <li><a [href]=\"i.path\">{{i.label}}</a></li>\r\n }\r\n </div>\r\n </ng-template>\r\n }\r\n\r\n</div>", styles: ["ul{list-style-type:none;display:flex;margin:0;padding:0}a{color:var(--menu-text);text-decoration:none;font-weight:400}a:hover{text-decoration:underline}button{display:flex;justify-self:end}li:after{content:\"\";margin-left:1rem}#menu-container{width:100%;height:100%;overflow:hidden}:host{width:100%;overflow:hidden}#dropdown{background:#fff;border-radius:1rem;border:1px solid black;padding:1rem;margin:0 1rem}#dropdown li{list-style-type:none}\n"] }]
360
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { justifySelf: [{
361
+ type: Input
362
+ }], menu: [{
363
+ type: Input
364
+ }], direction: [{
365
+ type: Input
366
+ }], menuContainer: [{
367
+ type: ViewChild,
368
+ args: ['menuContainer']
369
+ }], unorderedList: [{
370
+ type: ViewChild,
371
+ args: ['unorderedList']
372
+ }], getWidth: [{
373
+ type: HostListener,
374
+ args: ['window:resize']
375
+ }], menuOverlay: [{
376
+ type: ViewChild,
377
+ args: ['menuOverlay']
378
+ }], trigger: [{
379
+ type: ViewChild,
380
+ args: ['overlayTrigger', { read: ElementRef }]
381
+ }] } });
382
+
383
+ class NavbarComponent {
384
+ nav;
385
+ navFiller;
386
+ navContent;
387
+ onScrollCallback;
388
+ type = 'regular';
389
+ sticky = true;
390
+ navHeight = '100vhh';
391
+ lastScrollY = 0;
392
+ initialNavHeight;
393
+ ngAfterViewInit() {
394
+ this.initialNavHeight = this.navFiller.nativeElement.offsetHeight;
395
+ }
396
+ onScroll() {
397
+ if (this.type == 'hero')
398
+ this.nav.nativeElement.style.height = `calc(${this.navHeight} - ${window.scrollY}px)`;
399
+ if (this.sticky == 'onScrollUp') {
400
+ this.nav.nativeElement.style.minHeight = window.scrollY < this.lastScrollY
401
+ ? this.navContent.nativeElement.clientHeight + 'px'
402
+ : '0px';
403
+ this.lastScrollY = window.scrollY;
404
+ }
405
+ let navScrollRatio = window.scrollY / (this.initialNavHeight - 100); //100: alçada temptativa del navbar
406
+ navScrollRatio > 1 - this.nav.nativeElement.offsetHeight ? this.nav.nativeElement.style.transition = 'min-height 0.3s ease' : this.nav.nativeElement.style.transition = 'min-height 0s ease';
407
+ if (this.onScrollCallback)
408
+ this.onScrollCallback(navScrollRatio);
409
+ }
410
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NavbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
411
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.0", type: NavbarComponent, isStandalone: true, selector: "ard-navbar", inputs: { onScrollCallback: "onScrollCallback", type: "type", sticky: "sticky", navHeight: "navHeight" }, host: { listeners: { "window:scroll": "onScroll()" } }, viewQueries: [{ propertyName: "nav", first: true, predicate: ["nav"], descendants: true }, { propertyName: "navFiller", first: true, predicate: ["navFiller"], descendants: true }, { propertyName: "navContent", first: true, predicate: ["navContent"], descendants: true }], ngImport: i0, template: "<div id=\"nav-container\" style=\"z-index: 1\">\r\n <nav #nav [style.height]=\"navHeight\" [style.minHeight]=\"sticky ? 'fit-content' : 0 \"\r\n [ngClass]=\"`nav_sticky--` + sticky\">\r\n <div #navContent id=\"nav-content\">\r\n <ng-content select=\"[navContent]\"></ng-content>\r\n </div>\r\n </nav>\r\n</div>\r\n<div #navFiller id=\"nav-filler\" [style.height]=\"navHeight\">\r\n</div>", styles: [":host{width:100%}#nav-container{height:0;position:sticky;top:0;will-change:transform,opacity}#nav-container nav{will-change:transform,opacity;position:relative;bottom:0;will-change:transform;display:flex;flex-flow:column;justify-content:end;align-items:center;border-bottom:1px solid grey}#nav-container nav #nav-content{will-change:transform,opacity;min-height:fit-content;display:flex;width:100%;justify-content:center;align-items:center;flex:1}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
412
+ }
413
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NavbarComponent, decorators: [{
414
+ type: Component,
415
+ args: [{ selector: 'ard-navbar', imports: [NgClass], standalone: true, template: "<div id=\"nav-container\" style=\"z-index: 1\">\r\n <nav #nav [style.height]=\"navHeight\" [style.minHeight]=\"sticky ? 'fit-content' : 0 \"\r\n [ngClass]=\"`nav_sticky--` + sticky\">\r\n <div #navContent id=\"nav-content\">\r\n <ng-content select=\"[navContent]\"></ng-content>\r\n </div>\r\n </nav>\r\n</div>\r\n<div #navFiller id=\"nav-filler\" [style.height]=\"navHeight\">\r\n</div>", styles: [":host{width:100%}#nav-container{height:0;position:sticky;top:0;will-change:transform,opacity}#nav-container nav{will-change:transform,opacity;position:relative;bottom:0;will-change:transform;display:flex;flex-flow:column;justify-content:end;align-items:center;border-bottom:1px solid grey}#nav-container nav #nav-content{will-change:transform,opacity;min-height:fit-content;display:flex;width:100%;justify-content:center;align-items:center;flex:1}\n"] }]
416
+ }], propDecorators: { nav: [{
417
+ type: ViewChild,
418
+ args: ['nav']
419
+ }], navFiller: [{
420
+ type: ViewChild,
421
+ args: ['navFiller']
422
+ }], navContent: [{
423
+ type: ViewChild,
424
+ args: ['navContent']
425
+ }], onScrollCallback: [{
426
+ type: Input
427
+ }], type: [{
428
+ type: Input
429
+ }], sticky: [{
430
+ type: Input
431
+ }], navHeight: [{
432
+ type: Input
433
+ }], onScroll: [{
434
+ type: HostListener,
435
+ args: ['window:scroll', []]
436
+ }] } });
437
+
438
+ class PageLayoutComponent {
439
+ headerBackground = '';
440
+ title = 'Lorem ipsum';
441
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: PageLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
442
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.0", type: PageLayoutComponent, isStandalone: true, selector: "ard-page-layout", inputs: { headerBackground: "headerBackground", title: "title" }, ngImport: i0, template: "<header class=\"page-header\" [ngStyle]=\"{\r\n 'background': headerBackground\r\n ? `linear-gradient(color-mix(in srgb, var(--color-bg) 40%, transparent), color-mix(in srgb, var(--color-bg) 40%, transparent)),\r\n url('${headerBackground}') center/cover no-repeat`\r\n : 'none'\r\n }\" style=\"position: relative\">\r\n <div class=\"layout_max-width\">\r\n <h1>\r\n {{title}}\r\n </h1>\r\n </div>\r\n <div class=\"custom-shape-divider-top-1770151990\" style=\"position: absolute; bottom: 0; height: 25px; width: 100%\">\r\n <svg data-name=\"Layer 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1200 120\" preserveAspectRatio=\"none\"\r\n style=\"height: 40px; width: 100%\">\r\n <path\r\n d=\"M985.66,92.83C906.67,72,823.78,31,743.84,14.19c-82.26-17.34-168.06-16.33-250.45.39-57.84,11.73-114,31.07-172,41.86A600.21,600.21,0,0,1,0,27.35V120H1200V95.8C1132.19,118.92,1055.71,111.31,985.66,92.83Z\"\r\n style=\"fill: var(--color-bg)\"></path>\r\n </svg>\r\n </div>\r\n</header>\r\n\r\n<main class=\"page-main\">\r\n <div class=\"layout_max-width\">\r\n <ng-content></ng-content>\r\n </div>\r\n</main>\r\n\r\n<section class=\"page-sections\">\r\n <div class=\"layout_max-width\">\r\n <ng-content select=\"[sections]\"></ng-content>\r\n </div>\r\n</section>", styles: [".page-header{height:66vh;background-size:cover;background-position:center;background-repeat:no-repeat;display:flex;align-items:center}.header-content{width:100%}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
443
+ }
444
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: PageLayoutComponent, decorators: [{
445
+ type: Component,
446
+ args: [{ selector: 'ard-page-layout', imports: [NgStyle,], template: "<header class=\"page-header\" [ngStyle]=\"{\r\n 'background': headerBackground\r\n ? `linear-gradient(color-mix(in srgb, var(--color-bg) 40%, transparent), color-mix(in srgb, var(--color-bg) 40%, transparent)),\r\n url('${headerBackground}') center/cover no-repeat`\r\n : 'none'\r\n }\" style=\"position: relative\">\r\n <div class=\"layout_max-width\">\r\n <h1>\r\n {{title}}\r\n </h1>\r\n </div>\r\n <div class=\"custom-shape-divider-top-1770151990\" style=\"position: absolute; bottom: 0; height: 25px; width: 100%\">\r\n <svg data-name=\"Layer 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1200 120\" preserveAspectRatio=\"none\"\r\n style=\"height: 40px; width: 100%\">\r\n <path\r\n d=\"M985.66,92.83C906.67,72,823.78,31,743.84,14.19c-82.26-17.34-168.06-16.33-250.45.39-57.84,11.73-114,31.07-172,41.86A600.21,600.21,0,0,1,0,27.35V120H1200V95.8C1132.19,118.92,1055.71,111.31,985.66,92.83Z\"\r\n style=\"fill: var(--color-bg)\"></path>\r\n </svg>\r\n </div>\r\n</header>\r\n\r\n<main class=\"page-main\">\r\n <div class=\"layout_max-width\">\r\n <ng-content></ng-content>\r\n </div>\r\n</main>\r\n\r\n<section class=\"page-sections\">\r\n <div class=\"layout_max-width\">\r\n <ng-content select=\"[sections]\"></ng-content>\r\n </div>\r\n</section>", styles: [".page-header{height:66vh;background-size:cover;background-position:center;background-repeat:no-repeat;display:flex;align-items:center}.header-content{width:100%}\n"] }]
447
+ }], propDecorators: { headerBackground: [{
448
+ type: Input
449
+ }], title: [{
450
+ type: Input
451
+ }] } });
452
+
453
+ class ScrollReactiveSectionComponent {
454
+ container;
455
+ content;
456
+ ngAfterViewInit() {
457
+ this.update();
458
+ }
459
+ update() {
460
+ const containerEl = this.container.nativeElement;
461
+ const contentEl = this.content.nativeElement;
462
+ const rect = containerEl.getBoundingClientRect();
463
+ const viewportHeight = window.innerHeight;
464
+ const visibleTop = Math.max(rect.top, 0);
465
+ const visibleBottom = Math.min(rect.bottom, viewportHeight);
466
+ const visibleHeight = Math.max(0, visibleBottom - visibleTop);
467
+ const maxHeight = containerEl.offsetHeight;
468
+ const height = Math.min(visibleHeight, maxHeight);
469
+ contentEl.style.height = `${height}px`;
470
+ }
471
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: ScrollReactiveSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
472
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.0", type: ScrollReactiveSectionComponent, isStandalone: true, selector: "ard-scroll-reactive-section", host: { listeners: { "window:scroll": "update()", "window:resize": "update()" } }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<div style=\"position: sticky; top:0; height: 0; z-index: 0;\">\r\n <div #content\r\n style=\"background: gray; display: flex; justify-content: center; align-items: center;overflow: hidden;\">\r\n <ng-content></ng-content>\r\n\r\n </div>\r\n</div>\r\n<div style=\"position: relative; height: 100vh; pointer-events: none;\" #container>\r\n\r\n</div>" });
473
+ }
474
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: ScrollReactiveSectionComponent, decorators: [{
475
+ type: Component,
476
+ args: [{ selector: 'ard-scroll-reactive-section', standalone: true, template: "<div style=\"position: sticky; top:0; height: 0; z-index: 0;\">\r\n <div #content\r\n style=\"background: gray; display: flex; justify-content: center; align-items: center;overflow: hidden;\">\r\n <ng-content></ng-content>\r\n\r\n </div>\r\n</div>\r\n<div style=\"position: relative; height: 100vh; pointer-events: none;\" #container>\r\n\r\n</div>" }]
477
+ }], propDecorators: { container: [{
478
+ type: ViewChild,
479
+ args: ['container']
480
+ }], content: [{
481
+ type: ViewChild,
482
+ args: ['content']
483
+ }], update: [{
484
+ type: HostListener,
485
+ args: ['window:scroll']
486
+ }, {
487
+ type: HostListener,
488
+ args: ['window:resize']
489
+ }] } });
490
+
491
+ class SectionComponent {
492
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: SectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
493
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.0", type: SectionComponent, isStandalone: true, selector: "ard-section", ngImport: i0, template: "<section class=\"layout_max-width\">\r\n <h2>Secci\u00F3</h2>\r\n <div style=\"display: flex;\">\r\n <!-- <app-bottle [color]=\"'#5b8940'\"></app-bottle> -->\r\n <!-- <app-bottle [color]=\"'#b4862a'\"></app-bottle>\r\n <app-bottle [color]=\"'#121e10'\"></app-bottle>\r\n <app-bottle [wineColor]=\"'#ffffff'\"></app-bottle> -->\r\n <!-- <app-bottle [color]=\"'#868132'\" [wineColor]=\"'#e2d744'\"></app-bottle> -->\r\n </div>\r\n</section>", styles: [""] });
494
+ }
495
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: SectionComponent, decorators: [{
496
+ type: Component,
497
+ args: [{ selector: 'ard-section', imports: [], standalone: true, template: "<section class=\"layout_max-width\">\r\n <h2>Secci\u00F3</h2>\r\n <div style=\"display: flex;\">\r\n <!-- <app-bottle [color]=\"'#5b8940'\"></app-bottle> -->\r\n <!-- <app-bottle [color]=\"'#b4862a'\"></app-bottle>\r\n <app-bottle [color]=\"'#121e10'\"></app-bottle>\r\n <app-bottle [wineColor]=\"'#ffffff'\"></app-bottle> -->\r\n <!-- <app-bottle [color]=\"'#868132'\" [wineColor]=\"'#e2d744'\"></app-bottle> -->\r\n </div>\r\n</section>" }]
498
+ }] });
499
+
500
+ class StackCaroussel {
501
+ images = [];
502
+ atmospheric = false;
503
+ animating = false;
504
+ getOffset(index) {
505
+ return {
506
+ transform: `translate(${index * 16}px, ${index * 16}px)`,
507
+ zIndex: this.images.length - index,
508
+ opacity: this.atmospheric
509
+ ? 1 - (this.images.length - index * 0.08)
510
+ : 1
511
+ };
512
+ }
513
+ rotateStack() {
514
+ if (this.animating || this.images.length === 0)
515
+ return;
516
+ this.animating = true;
517
+ const last = this.images[this.images.length - 1];
518
+ const rest = this.images.slice(0, this.images.length - 1);
519
+ // Fase 1
520
+ const el = document.querySelector('.img-last');
521
+ if (el) {
522
+ el.classList.add('move-out');
523
+ }
524
+ setTimeout(() => {
525
+ // Reordenem array
526
+ this.images = [last, ...rest];
527
+ setTimeout(() => {
528
+ this.animating = false;
529
+ }, 50);
530
+ }, 300);
531
+ }
532
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: StackCaroussel, deps: [], target: i0.ɵɵFactoryTarget.Component });
533
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.0", type: StackCaroussel, isStandalone: true, selector: "ard-stack-caroussel", inputs: { images: "images", atmospheric: "atmospheric" }, ngImport: i0, template: "<div class=\"stack-container\" (click)=\"rotateStack()\">\r\n <img *ngFor=\"let img of images; let i = index; let last = last\" [src]=\"img\" [ngStyle]=\"getOffset(i)\"\r\n [class.img-last]=\"last\" class=\"stack-image\" />\r\n</div>", styles: [":host{--anim-speed: .3s}.stack-container{position:relative;width:400px;height:400px;cursor:pointer}.stack-image{position:absolute;width:200px;height:200px;object-fit:cover;transition:transform var(--anim-speed) ease,opacity var(--anim-speed) ease}.stack-image.move-out{transform:translate(200px)!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
534
+ }
535
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: StackCaroussel, decorators: [{
536
+ type: Component,
537
+ args: [{ selector: 'ard-stack-caroussel', imports: [CommonModule], template: "<div class=\"stack-container\" (click)=\"rotateStack()\">\r\n <img *ngFor=\"let img of images; let i = index; let last = last\" [src]=\"img\" [ngStyle]=\"getOffset(i)\"\r\n [class.img-last]=\"last\" class=\"stack-image\" />\r\n</div>", styles: [":host{--anim-speed: .3s}.stack-container{position:relative;width:400px;height:400px;cursor:pointer}.stack-image{position:absolute;width:200px;height:200px;object-fit:cover;transition:transform var(--anim-speed) ease,opacity var(--anim-speed) ease}.stack-image.move-out{transform:translate(200px)!important}\n"] }]
538
+ }], propDecorators: { images: [{
539
+ type: Input
540
+ }], atmospheric: [{
541
+ type: Input
542
+ }] } });
543
+
544
+ class ThemeService {
545
+ ngOnInit() {
546
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
547
+ document.body.classList.toggle('dark', prefersDark);
548
+ }
549
+ toggle() {
550
+ document.body.classList.toggle('dark');
551
+ }
552
+ setDark() {
553
+ document.body.classList.add('dark');
554
+ }
555
+ setLight() {
556
+ document.body.classList.remove('dark');
557
+ }
558
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
559
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: ThemeService, providedIn: 'root' });
560
+ }
561
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: ThemeService, decorators: [{
562
+ type: Injectable,
563
+ args: [{ providedIn: 'root' }]
564
+ }] });
565
+
566
+ /*
567
+ * Public API Surface of @ardev/components
568
+ */
569
+
570
+ /**
571
+ * Generated bundle index. Do not edit.
572
+ */
573
+
574
+ export { BottleComponent, CarousselComponent, CronogramComponent, MenuComponent, NavbarComponent, PageLayoutComponent, ScrollReactiveSectionComponent, SectionComponent, StackCaroussel, ThemeService };
575
+ //# sourceMappingURL=ardev-components.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ardev-components.mjs","sources":["../../../../@ardev/components/src/lib/components/bottle/bottle.component.ts","../../../../@ardev/components/src/lib/components/bottle/bottle.component.html","../../../../@ardev/components/src/lib/components/caroussel/caroussel-menu/caroussel-menu.component.ts","../../../../@ardev/components/src/lib/components/caroussel/caroussel-menu/caroussel-menu.component.html","../../../../@ardev/components/src/lib/components/caroussel/caroussel.component.ts","../../../../@ardev/components/src/lib/components/caroussel/caroussel.component.html","../../../../@ardev/components/src/lib/components/cronogram/cronogram.component.ts","../../../../@ardev/components/src/lib/components/cronogram/cronogram.component.html","../../../../@ardev/components/src/lib/layouts/menu/menu.component.ts","../../../../@ardev/components/src/lib/layouts/menu/menu.component.html","../../../../@ardev/components/src/lib/layouts/navbar/navbar.component.ts","../../../../@ardev/components/src/lib/layouts/navbar/navbar.component.html","../../../../@ardev/components/src/lib/layouts/page-layout/page-layout.component.ts","../../../../@ardev/components/src/lib/layouts/page-layout/page-layout.component.html","../../../../@ardev/components/src/lib/layouts/scroll-reactive-section/scroll-reactive-section.component.ts","../../../../@ardev/components/src/lib/layouts/scroll-reactive-section/scroll-reactive-section.component.html","../../../../@ardev/components/src/lib/layouts/section/section.component.ts","../../../../@ardev/components/src/lib/layouts/section/section.component.html","../../../../@ardev/components/src/lib/components/stack-caroussel/stack-caroussel.ts","../../../../@ardev/components/src/lib/components/stack-caroussel/stack-caroussel.html","../../../../@ardev/components/src/lib/theme.service.ts","../../../../@ardev/components/src/public-api.ts","../../../../@ardev/components/src/ardev-components.ts"],"sourcesContent":["import { Component, ElementRef, AfterViewInit, ViewChild, Input } from '@angular/core';\r\nimport * as THREE from 'three';\r\nimport { SVGLoader } from 'three/examples/jsm/Addons.js';\r\n\r\n@Component({\r\n selector: 'app-bottle',\r\n standalone: true,\r\n templateUrl: './bottle.component.html',\r\n styleUrls: ['./bottle.component.css'],\r\n})\r\nexport class BottleComponent implements AfterViewInit {\r\n\r\n @Input() color: `#${string}` = '#868132';\r\n @Input() wineColor: `#${string}` = '#fff6f5';\r\n @ViewChild('container', { static: true }) container!: ElementRef<HTMLDivElement>;\r\n\r\n private scene!: THREE.Scene;\r\n private camera!: THREE.PerspectiveCamera;\r\n private renderer!: THREE.WebGLRenderer;\r\n\r\n private glassMaterial!: THREE.MeshPhysicalMaterial;\r\n private liquidMaterial!: THREE.MeshPhysicalMaterial;\r\n private foilMaterial!: THREE.MeshPhysicalMaterial;\r\n ngAfterViewInit() {\r\n this.glassMaterial = new THREE.MeshPhysicalMaterial({\r\n color: new THREE.Color(this.color),\r\n metalness: 0,\r\n roughness: 0,\r\n transmission: 1,\r\n thickness: 0,\r\n ior: 1.5,\r\n clearcoat: 1.0,\r\n clearcoatRoughness: 0.05,\r\n opacity: 1,\r\n side: THREE.FrontSide,\r\n transparent: true,\r\n depthWrite: false,\r\n envMapIntensity: 2.5\r\n });\r\n this.liquidMaterial = new THREE.MeshPhysicalMaterial({\r\n color: new THREE.Color('#e2d744'),\r\n metalness: 0.4,\r\n // roughness: 0.25,\r\n\r\n transmission: 0.2,\r\n thickness: 0.4,\r\n ior: 1.5,\r\n clearcoat: 1.0,\r\n clearcoatRoughness: 0.05,\r\n transparent: true,\r\n opacity: 0.8,\r\n\r\n depthWrite: false, // 🔑 el líquid SÍ escriu profunditat\r\n side: THREE.BackSide,\r\n // envMapIntensity: 1.2,\r\n });\r\n\r\n\r\n this.foilMaterial = new THREE.MeshPhysicalMaterial({\r\n color: 0x156289,\r\n metalness: 0.25,\r\n roughness: 0.3,\r\n side: THREE.DoubleSide\r\n });\r\n this.createSceneAndLighting();\r\n this.loadModelFromSVGFile();\r\n this.animate();\r\n }\r\n\r\n private animate = () => {\r\n requestAnimationFrame(this.animate);\r\n\r\n if (this.camera) {\r\n const t = Date.now() * 0.0002;\r\n this.camera.position.x = Math.sin(t) * 50;\r\n this.camera.position.z = Math.cos(t) * 50;\r\n this.camera.lookAt(0, 0, 0);\r\n }\r\n this.renderer.shadowMap.enabled = true;\r\n this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;\r\n\r\n this.renderer.render(this.scene, this.camera);\r\n };\r\n\r\n private loadModelFromSVGFile() {\r\n const loader = new SVGLoader();\r\n\r\n loader.load('assets/bitmap.svg', (data) => {\r\n const bottleGroup = new THREE.Group();\r\n\r\n data.paths.forEach((path, index) => {\r\n const shapes = SVGLoader.createShapes(path);\r\n\r\n shapes.forEach((shape) => {\r\n const points = shape.getPoints().map(p => new THREE.Vector2(p.x * 0.1, -p.y * 0.1));\r\n\r\n const geometry = new THREE.LatheGeometry(points, 128); // més segments → més suau\r\n geometry.computeVertexNormals(); // normals correctes\r\n\r\n const material = (index === 0) ? this.glassMaterial :\r\n (index === 1) ? this.liquidMaterial : this.foilMaterial\r\n\r\n\r\n const mesh = new THREE.Mesh(geometry, material);\r\n\r\n const layerGroup = new THREE.Group();\r\n layerGroup.add(mesh);\r\n bottleGroup.add(layerGroup);\r\n });\r\n });\r\n\r\n const box = new THREE.Box3().setFromObject(bottleGroup);\r\n const center = box.getCenter(new THREE.Vector3());\r\n bottleGroup.position.sub(center);\r\n\r\n this.scene.add(bottleGroup);\r\n });\r\n }\r\n\r\n private createSceneAndLighting() {\r\n this.scene = new THREE.Scene();\r\n\r\n const width = this.container.nativeElement.clientWidth;\r\n const height = this.container.nativeElement.clientHeight;\r\n\r\n this.camera = new THREE.PerspectiveCamera(35, width / height, 0.1, 5000);\r\n this.camera.position.set(30, 20, 50);\r\n this.camera.lookAt(0, 0, 0);\r\n\r\n this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\r\n this.renderer.setSize(width, height);\r\n this.renderer.toneMapping = THREE.ACESFilmicToneMapping; // millora realisme colors\r\n this.container.nativeElement.appendChild(this.renderer.domElement);\r\n\r\n const ambientLight = new THREE.AmbientLight(0xffffff, 0.3);\r\n this.scene.add(ambientLight);\r\n\r\n const directionalLight = new THREE.DirectionalLight(0xffffff, 1.0);\r\n directionalLight.position.set(50, 80, 50);\r\n directionalLight.castShadow = true;\r\n directionalLight.shadow.mapSize.width = 2048;\r\n directionalLight.shadow.mapSize.height = 2048;\r\n directionalLight.shadow.radius = 4;\r\n this.scene.add(directionalLight);\r\n\r\n const backLight = new THREE.PointLight(0xffffff, 0.5);\r\n backLight.position.set(-30, 40, -30);\r\n this.scene.add(backLight);\r\n\r\n const sideLight = new THREE.PointLight(0xffffff, 0.3);\r\n sideLight.position.set(30, 10, -40);\r\n this.scene.add(sideLight);\r\n\r\n const textureLoader = new THREE.TextureLoader();\r\n textureLoader.load('assets/environment-map.png', (texture) => {\r\n texture.mapping = THREE.EquirectangularReflectionMapping;\r\n this.scene.environment = texture;\r\n //this.scene.background = texture;\r\n });\r\n\r\n\r\n }\r\n\r\n}\r\n","<div #container class=\"three-container\"></div>","import {\r\n Component,\r\n ElementRef,\r\n QueryList,\r\n ViewChild,\r\n ViewChildren,\r\n Output,\r\n EventEmitter,\r\n Input,\r\n AfterViewInit\r\n} from '@angular/core';\r\nimport { NgForOf } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'ard-caroussel-menu',\r\n standalone: true,\r\n imports: [NgForOf],\r\n templateUrl: './caroussel-menu.component.html',\r\n styleUrls: ['./caroussel-menu.component.css'],\r\n})\r\nexport class CarousselMenuComponent implements AfterViewInit {\r\n @Input() length = 0;\r\n\r\n @ViewChildren('btn', { read: ElementRef })\r\n buttons!: QueryList<ElementRef<HTMLButtonElement>>;\r\n\r\n @ViewChild('selectedIndex')\r\n selectedIndex!: ElementRef<HTMLElement>;\r\n\r\n @Output() indexChange = new EventEmitter<number>();\r\n\r\n private positions: number[] = [];\r\n private resetWidthId?: number;\r\n\r\n ngAfterViewInit() {\r\n const btns = this.buttons.toArray();\r\n const firstRight = btns[0]?.nativeElement.getBoundingClientRect().right ?? 0;\r\n\r\n this.positions = btns.map(\r\n b => b.nativeElement.getBoundingClientRect().right - firstRight\r\n );\r\n }\r\n\r\n selectIndex(i: number) {\r\n this.indexChange.emit(i);\r\n\r\n const el = this.selectedIndex.nativeElement;\r\n const x = this.positions[i] ?? 0;\r\n\r\n el.style.transform = `translateX(${x}px)`;\r\n\r\n const baseWidth = el.getBoundingClientRect().width;\r\n el.style.width = `${baseWidth * 1.5}px`;\r\n\r\n if (this.resetWidthId) {\r\n clearTimeout(this.resetWidthId);\r\n }\r\n\r\n this.resetWidthId = window.setTimeout(() => {\r\n el.style.width = `${baseWidth}px`;\r\n }, 150);\r\n }\r\n}\r\n","<div style=\"display: flex; gap: 1rem;\">\r\n <button #btn *ngFor=\"let _ of [].constructor(length); let i = index\" (click)=\"selectIndex(i)\">\r\n </button>\r\n <div #selectedIndex id=\"selectedIndex\"></div>\r\n</div>","import { Component, Input } from '@angular/core';\r\nimport { NgForOf } from \"@angular/common\";\r\nimport { CarousselMenuComponent } from './caroussel-menu/caroussel-menu.component';\r\n\r\n@Component({\r\n selector: 'ard-caroussel',\r\n imports: [NgForOf, CarousselMenuComponent],\r\n templateUrl: './caroussel.component.html',\r\n styleUrl: './caroussel.component.css',\r\n})\r\nexport class CarousselComponent {\r\n @Input() images: string[] = [];\r\n\r\n index = 0;\r\n\r\n next() {\r\n this.index = (this.index + 1) % this.images.length;\r\n }\r\n\r\n goTo(i: number) {\r\n this.index = i;\r\n }\r\n\r\n}\r\n","<div style=\"position: relative; top: 0; width: 100%; height: 100%; overflow: hidden;\">\r\n <img *ngFor=\"let img of images; let i = index\" [src]=\"img\" [style.opacity]=\"i === index ? 1 : 0\" class=\"image\"\r\n alt=\"\">\r\n\r\n <div style=\"position: absolute; bottom: 10px; left: 50%; transform: translateX(-50%); display: flex; gap: 8px;\">\r\n <ard-caroussel-menu (indexChange)=\"goTo($event)\" [length]=\"images.length\"></ard-caroussel-menu>\r\n </div>\r\n</div>","import { Component, ElementRef, HostListener, QueryList, ViewChild, ViewChildren } from '@angular/core';\r\nimport { NgClass } from \"@angular/common\";\r\n\r\n@Component({\r\n selector: 'ard-cronogram',\r\n imports: [NgClass],\r\n templateUrl: './cronogram.component.html',\r\n styleUrl: './cronogram.component.css',\r\n})\r\nexport class CronogramComponent {\r\n @ViewChild('wrapper', { read: ElementRef }) wrapper!: ElementRef<HTMLElement>;\r\n @ViewChild('line', { read: ElementRef }) line!: ElementRef<HTMLElement>;\r\n\r\n @ViewChildren('CronogramContent', { read: ElementRef })\r\n children!: QueryList<ElementRef>;\r\n items = [\r\n { date: 2000, content: 'Lorem ipsum dolor sit amet', image: 'lorem' },\r\n { date: 2001, content: 'Lorem ipsum dolor sit amet', image: 'lorem' },\r\n { date: 2002, content: 'Lorem ipsum dolor sit amet', image: 'lorem' }\r\n ]\r\n\r\n positionsY: number[] = []\r\n\r\n ngAfterViewInit() {\r\n this.positionsY = this.children.map(i => i.nativeElement.getBoundingClientRect().y)\r\n\r\n this.line.nativeElement.style.maxHeight = `${this.wrapper.nativeElement.getBoundingClientRect().height}px`\r\n }\r\n\r\n lastScrollY = window.scrollY;\r\n\r\n @HostListener('window:scroll', [])\r\n onScroll() {\r\n const scrollPosition = window.scrollY;\r\n\r\n if (scrollPosition > this.lastScrollY) {\r\n this.onScrollDown(scrollPosition);\r\n } else if (scrollPosition < this.lastScrollY) {\r\n this.onScrollUp(scrollPosition);\r\n }\r\n\r\n this.lastScrollY = scrollPosition;\r\n\r\n this.line.nativeElement.style.height = `${this.visibleHeight(this.wrapper.nativeElement)}px`\r\n\r\n\r\n }\r\n onScrollDown(scrollPosition: number) {\r\n let index = this.positionsY.findIndex(pos => pos > scrollPosition - 100);\r\n\r\n if (index === -1) {\r\n index = this.positionsY.length;\r\n }\r\n\r\n this.children.forEach((child, i) => {\r\n const el = child.nativeElement as HTMLElement;\r\n\r\n if (i < index) {\r\n el.classList.remove(\"hidden\");\r\n el.classList.add(\"visible\");\r\n }\r\n });\r\n\r\n this.line.nativeElement.style.transition = 'height 1.2s';\r\n\r\n }\r\n onScrollUp(scrollPosition: number) {\r\n let index = this.positionsY.findIndex(pos => pos > scrollPosition - 50);\r\n\r\n if (index === -1) {\r\n index = this.positionsY.length;\r\n }\r\n\r\n this.children.forEach((child, i) => {\r\n const el = child.nativeElement as HTMLElement;\r\n\r\n if (i >= index) {\r\n el.classList.add(\"hidden\");\r\n el.classList.remove(\"visible\");\r\n }\r\n });\r\n\r\n this.line.nativeElement.style.transition = 'height 0s';\r\n\r\n }\r\n\r\n\r\n\r\n visibleHeight(el: HTMLElement) {\r\n const rect = el.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n\r\n const topVisible = Math.max(rect.top, 0);\r\n const bottomVisible = Math.min(rect.bottom, viewportHeight);\r\n\r\n return Math.max(0, bottomVisible - topVisible);\r\n }\r\n\r\n}\r\n","<h4>cronogram.component.ts</h4>\r\n\r\n<p>\r\n en la vista mobile, estarà tot en un mateix costat?\r\n</p>\r\n\r\n<div #wrapper>\r\n\r\n\r\n\r\n @for(day of items; track day.date; let i = $index;) {\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 0fr 1fr;\" class=\"general-container\" #CronogramContent>\r\n\r\n\r\n <div class=\"left-container\" [ngClass]=\"i % 2 == 0 ? 'odd' : 'even'\">\r\n @if(i % 2 === 0) {\r\n <h3>{{day.date}}</h3>\r\n <p>lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit\r\n amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet,</p>\r\n }\r\n </div>\r\n\r\n\r\n <div class=\"center\" style=\"height: 100%; display: flex; width: 1rem; flex-flow: column; position: relative\">\r\n <div class=\"bullet\" style=\"z-index: 2\">\r\n </div>\r\n\r\n @if (i == 0) {\r\n <div class=\"line\" #line>\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n <div class=\"right-container cronogram-content\" [ngClass]=\"i % 2 == 0 ? 'odd' : 'even'\">\r\n @if(i % 2 !== 0) {\r\n <h3>{{day.date}}</h3>\r\n <p>lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit\r\n amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet,</p>\r\n\r\n }\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>","import { Inject, Component, ElementRef, HostListener, Input, ViewChild, AfterViewInit, ChangeDetectorRef, inject, TemplateRef, ViewContainerRef } from '@angular/core';\r\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\n@Component({\r\n selector: 'ard-menu',\r\n templateUrl: './menu.component.html',\r\n styleUrl: './menu.component.css',\r\n})\r\nexport class MenuComponent implements AfterViewInit {\r\n\r\n @Input() justifySelf: 'center' | 'end' | 'start' = 'end';\r\n @Input() menu?: {\r\n path: string;\r\n label: string;\r\n }[] = [\r\n\r\n ];\r\n\r\n @Input() direction: 'horizontal' | 'vertical' = 'horizontal';\r\n\r\n @ViewChild('menuContainer') menuContainer!: ElementRef<HTMLElement>;\r\n @ViewChild('unorderedList') unorderedList!: ElementRef<HTMLElement>;\r\n\r\n constructor(private cdr: ChangeDetectorRef) { }\r\n\r\n collapsed = false;\r\n listWidth = 0;\r\n\r\n ngAfterViewInit() {\r\n setTimeout(() => {\r\n this.getWidth();\r\n });\r\n }\r\n\r\n @HostListener('window:resize')\r\n getWidth() {\r\n const containerWidth =\r\n this.menuContainer.nativeElement.getBoundingClientRect().width;\r\n\r\n if (!this.collapsed) this.listWidth = this.unorderedList?.nativeElement?.scrollWidth;\r\n\r\n this.collapsed = containerWidth < this.listWidth;\r\n this.cdr.detectChanges();\r\n console.log(containerWidth, this.listWidth, this.collapsed)\r\n }\r\n\r\n\r\n //#region overlay\r\n private overlay = inject(Overlay);\r\n private overlayRef?: OverlayRef;\r\n\r\n @ViewChild('menuOverlay') menuOverlay!: TemplateRef<any>; // Template del menú\r\n @ViewChild('overlayTrigger', { read: ElementRef }) trigger!: ElementRef; // Botó\r\n\r\n toggleMenu() {\r\n console.log('toggleMenu');\r\n this.overlayRef ? this.closeMenu() : this.openMenu();\r\n }\r\n private viewContainerRef = inject(ViewContainerRef);\r\n\r\n openMenu() {\r\n const positionStrategy = this.overlay\r\n .position()\r\n .flexibleConnectedTo(this.trigger)\r\n .withPositions([\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top'\r\n }\r\n ]);\r\n\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy,\r\n hasBackdrop: true,\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n scrollStrategy: this.overlay.scrollStrategies.reposition()\r\n });\r\n\r\n this.overlayRef.backdropClick().subscribe(() => this.closeMenu());\r\n\r\n const portal = new TemplatePortal(this.menuOverlay, this.viewContainerRef); // ✅ SI\r\n this.overlayRef.attach(portal);\r\n }\r\n\r\n closeMenu() {\r\n this.overlayRef?.dispose();\r\n this.overlayRef = undefined;\r\n }\r\n\r\n action(value: string) {\r\n console.log(value);\r\n this.closeMenu();\r\n }\r\n //#endregion overlay\r\n\r\n}\r\n","<div #menuContainer id=\"menu-container\">\r\n @if(!collapsed) {\r\n <ul #unorderedList [style.flexFlow]=\"direction == 'horizontal' ? 'row' : 'column'\"\r\n [style.justifySelf]=\"justifySelf\">\r\n @for (i of menu; track i.label) {\r\n <li><a [href]=\"i.path\">{{i.label}}</a></li>\r\n }\r\n </ul>\r\n } @else {\r\n <button #overlayTrigger [style.justifySelf]=\"justifySelf\" (click)=\"toggleMenu()\">Menu</button>\r\n\r\n <ng-template #menuOverlay>\r\n <div id=\"dropdown\">\r\n @for (i of menu; track i.label) {\r\n <li><a [href]=\"i.path\">{{i.label}}</a></li>\r\n }\r\n </div>\r\n </ng-template>\r\n }\r\n\r\n</div>","import { NgClass } from '@angular/common';\r\nimport { Component, ElementRef, HostListener, Input, ViewChild } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ard-navbar',\r\n imports: [NgClass],\r\n templateUrl: './navbar.component.html',\r\n styleUrl: './navbar.component.css',\r\n standalone: true,\r\n})\r\nexport class NavbarComponent {\r\n @ViewChild('nav') nav!: ElementRef<HTMLElement>;\r\n @ViewChild('navFiller') navFiller!: ElementRef<HTMLElement>;\r\n @ViewChild('navContent') navContent!: ElementRef<HTMLElement>;\r\n\r\n @Input() onScrollCallback?: (ratio: number) => void;\r\n @Input() type: 'hero' | 'regular' = 'regular'\r\n @Input() sticky: boolean | 'onScrollUp' = true;\r\n @Input() navHeight: CSSStyleDeclaration[\"height\"] = '100vhh'\r\n\r\n private lastScrollY: number = 0;\r\n private initialNavHeight!: number;\r\n\r\n ngAfterViewInit() {\r\n this.initialNavHeight = this.navFiller.nativeElement.offsetHeight\r\n }\r\n\r\n @HostListener('window:scroll', [])\r\n onScroll() {\r\n\r\n if (this.type == 'hero') this.nav!.nativeElement.style.height = `calc(${this.navHeight} - ${window.scrollY}px)`;\r\n\r\n if (this.sticky == 'onScrollUp') {\r\n this.nav.nativeElement.style.minHeight = window.scrollY < this.lastScrollY\r\n ? this.navContent.nativeElement.clientHeight + 'px'\r\n : '0px';\r\n this.lastScrollY = window.scrollY\r\n }\r\n\r\n let navScrollRatio = window.scrollY / (this.initialNavHeight - 100); //100: alçada temptativa del navbar\r\n navScrollRatio > 1 - this.nav.nativeElement.offsetHeight ? this.nav.nativeElement.style.transition = 'min-height 0.3s ease' : this.nav.nativeElement.style.transition = 'min-height 0s ease';\r\n\r\n if (this.onScrollCallback) this.onScrollCallback(navScrollRatio);\r\n\r\n }\r\n}\r\n","<div id=\"nav-container\" style=\"z-index: 1\">\r\n <nav #nav [style.height]=\"navHeight\" [style.minHeight]=\"sticky ? 'fit-content' : 0 \"\r\n [ngClass]=\"`nav_sticky--` + sticky\">\r\n <div #navContent id=\"nav-content\">\r\n <ng-content select=\"[navContent]\"></ng-content>\r\n </div>\r\n </nav>\r\n</div>\r\n<div #navFiller id=\"nav-filler\" [style.height]=\"navHeight\">\r\n</div>","import { NgStyle } from '@angular/common';\r\nimport { Component, Input, } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ard-page-layout',\r\n templateUrl: './page-layout.component.html',\r\n styleUrls: ['./page-layout.component.css'],\r\n imports: [NgStyle,]\r\n})\r\nexport class PageLayoutComponent {\r\n @Input() headerBackground?: string = '';\r\n @Input() title?: string = 'Lorem ipsum'\r\n}\r\n","<header class=\"page-header\" [ngStyle]=\"{\r\n 'background': headerBackground\r\n ? `linear-gradient(color-mix(in srgb, var(--color-bg) 40%, transparent), color-mix(in srgb, var(--color-bg) 40%, transparent)),\r\n url('${headerBackground}') center/cover no-repeat`\r\n : 'none'\r\n }\" style=\"position: relative\">\r\n <div class=\"layout_max-width\">\r\n <h1>\r\n {{title}}\r\n </h1>\r\n </div>\r\n <div class=\"custom-shape-divider-top-1770151990\" style=\"position: absolute; bottom: 0; height: 25px; width: 100%\">\r\n <svg data-name=\"Layer 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1200 120\" preserveAspectRatio=\"none\"\r\n style=\"height: 40px; width: 100%\">\r\n <path\r\n d=\"M985.66,92.83C906.67,72,823.78,31,743.84,14.19c-82.26-17.34-168.06-16.33-250.45.39-57.84,11.73-114,31.07-172,41.86A600.21,600.21,0,0,1,0,27.35V120H1200V95.8C1132.19,118.92,1055.71,111.31,985.66,92.83Z\"\r\n style=\"fill: var(--color-bg)\"></path>\r\n </svg>\r\n </div>\r\n</header>\r\n\r\n<main class=\"page-main\">\r\n <div class=\"layout_max-width\">\r\n <ng-content></ng-content>\r\n </div>\r\n</main>\r\n\r\n<section class=\"page-sections\">\r\n <div class=\"layout_max-width\">\r\n <ng-content select=\"[sections]\"></ng-content>\r\n </div>\r\n</section>","import {\r\n Component,\r\n ElementRef,\r\n ViewChild,\r\n AfterViewInit,\r\n HostListener\r\n} from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ard-scroll-reactive-section',\r\n standalone: true,\r\n templateUrl: './scroll-reactive-section.component.html',\r\n})\r\nexport class ScrollReactiveSectionComponent implements AfterViewInit {\r\n @ViewChild('container') container!: ElementRef<HTMLElement>;\r\n @ViewChild('content') content!: ElementRef<HTMLElement>;\r\n\r\n ngAfterViewInit() {\r\n this.update();\r\n }\r\n\r\n @HostListener('window:scroll')\r\n @HostListener('window:resize')\r\n update() {\r\n const containerEl = this.container.nativeElement;\r\n const contentEl = this.content.nativeElement;\r\n\r\n const rect = containerEl.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n\r\n const visibleTop = Math.max(rect.top, 0);\r\n const visibleBottom = Math.min(rect.bottom, viewportHeight);\r\n const visibleHeight = Math.max(0, visibleBottom - visibleTop);\r\n\r\n const maxHeight = containerEl.offsetHeight;\r\n const height = Math.min(visibleHeight, maxHeight);\r\n\r\n contentEl.style.height = `${height}px`;\r\n }\r\n}\r\n","<div style=\"position: sticky; top:0; height: 0; z-index: 0;\">\r\n <div #content\r\n style=\"background: gray; display: flex; justify-content: center; align-items: center;overflow: hidden;\">\r\n <ng-content></ng-content>\r\n\r\n </div>\r\n</div>\r\n<div style=\"position: relative; height: 100vh; pointer-events: none;\" #container>\r\n\r\n</div>","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ard-section',\r\n imports: [],\r\n templateUrl: './section.component.html',\r\n styleUrl: './section.component.css',\r\n standalone: true,\r\n})\r\nexport class SectionComponent {\r\n\r\n}\r\n","<section class=\"layout_max-width\">\r\n <h2>Secció</h2>\r\n <div style=\"display: flex;\">\r\n <!-- <app-bottle [color]=\"'#5b8940'\"></app-bottle> -->\r\n <!-- <app-bottle [color]=\"'#b4862a'\"></app-bottle>\r\n <app-bottle [color]=\"'#121e10'\"></app-bottle>\r\n <app-bottle [wineColor]=\"'#ffffff'\"></app-bottle> -->\r\n <!-- <app-bottle [color]=\"'#868132'\" [wineColor]=\"'#e2d744'\"></app-bottle> -->\r\n </div>\r\n</section>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ard-stack-caroussel',\r\n imports: [CommonModule],\r\n templateUrl: './stack-caroussel.html',\r\n styleUrl: './stack-caroussel.css',\r\n})\r\nexport class StackCaroussel {\r\n @Input() images: string[] = [];\r\n @Input() atmospheric = false;\r\n\r\n animating = false;\r\n\r\n getOffset(index: number) {\r\n return {\r\n transform: `translate(${index * 16}px, ${index * 16}px)`,\r\n zIndex: this.images.length - index,\r\n opacity: this.atmospheric\r\n ? 1 - (this.images.length - index * 0.08)\r\n : 1\r\n };\r\n }\r\n\r\n rotateStack() {\r\n if (this.animating || this.images.length === 0) return;\r\n\r\n this.animating = true;\r\n\r\n const last = this.images[this.images.length - 1];\r\n const rest = this.images.slice(0, this.images.length - 1);\r\n\r\n // Fase 1\r\n const el = document.querySelector('.img-last') as HTMLElement;\r\n if (el) {\r\n el.classList.add('move-out');\r\n }\r\n\r\n setTimeout(() => {\r\n // Reordenem array\r\n this.images = [last, ...rest];\r\n\r\n setTimeout(() => {\r\n this.animating = false;\r\n }, 50);\r\n\r\n }, 300);\r\n }\r\n}\r\n","<div class=\"stack-container\" (click)=\"rotateStack()\">\r\n <img *ngFor=\"let img of images; let i = index; let last = last\" [src]=\"img\" [ngStyle]=\"getOffset(i)\"\r\n [class.img-last]=\"last\" class=\"stack-image\" />\r\n</div>","import { Injectable } from \"@angular/core\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ThemeService {\r\n\r\n ngOnInit() {\r\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n document.body.classList.toggle('dark', prefersDark);\r\n\r\n }\r\n toggle() {\r\n document.body.classList.toggle('dark');\r\n }\r\n\r\n setDark() {\r\n document.body.classList.add('dark');\r\n }\r\n\r\n setLight() {\r\n document.body.classList.remove('dark');\r\n }\r\n}\r\n","/*\r\n * Public API Surface of @ardev/components\r\n */\r\n\r\nexport * from './lib/components/bottle/bottle.component';\r\nexport * from './lib/components/caroussel/caroussel.component';\r\nexport * from './lib/components/cronogram/cronogram.component';\r\nexport * from './lib/layouts/menu/menu.component';\r\nexport * from './lib/layouts/navbar/navbar.component';\r\nexport * from './lib/layouts/page-layout/page-layout.component';\r\nexport * from './lib/layouts/scroll-reactive-section/scroll-reactive-section.component'; // probablement esborrar\r\nexport * from './lib/layouts/section/section.component';\r\nexport * from './lib/components/stack-caroussel/stack-caroussel'\r\nexport * from './lib/theme.service'\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;MAUa,eAAe,CAAA;IAEjB,KAAK,GAAiB,SAAS;IAC/B,SAAS,GAAiB,SAAS;AACF,IAAA,SAAS;AAE3C,IAAA,KAAK;AACL,IAAA,MAAM;AACN,IAAA,QAAQ;AAER,IAAA,aAAa;AACb,IAAA,cAAc;AACd,IAAA,YAAY;IACpB,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,KAAK,CAAC,oBAAoB,CAAC;YAClD,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AAClC,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,YAAY,EAAE,CAAC;AACf,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,GAAG,EAAE,GAAG;AACR,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,kBAAkB,EAAE,IAAI;AACxB,YAAA,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,KAAK,CAAC,SAAS;AACrB,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,eAAe,EAAE;AAClB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,KAAK,CAAC,oBAAoB,CAAC;AACnD,YAAA,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;AACjC,YAAA,SAAS,EAAE,GAAG;;AAGd,YAAA,YAAY,EAAE,GAAG;AACjB,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,GAAG,EAAE,GAAG;AACR,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,kBAAkB,EAAE,IAAI;AACxB,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,OAAO,EAAE,GAAG;YAEZ,UAAU,EAAE,KAAK;YACjB,IAAI,EAAE,KAAK,CAAC,QAAQ;;AAErB,SAAA,CAAC;AAGF,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,KAAK,CAAC,oBAAoB,CAAC;AACjD,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,SAAS,EAAE,GAAG;YACd,IAAI,EAAE,KAAK,CAAC;AACb,SAAA,CAAC;QACF,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,oBAAoB,EAAE;QAC3B,IAAI,CAAC,OAAO,EAAE;IAChB;IAEQ,OAAO,GAAG,MAAK;AACrB,QAAA,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;AAEnC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM;AAC7B,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;AACzC,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;YACzC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7B;QACA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,GAAG,IAAI;QACtC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK,CAAC,gBAAgB;AAErD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;AAC/C,IAAA,CAAC;IAEO,oBAAoB,GAAA;AAC1B,QAAA,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE;QAE9B,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,IAAI,KAAI;AACxC,YAAA,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;YAErC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;gBACjC,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC;AAE3C,gBAAA,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACvB,oBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAEnF,oBAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACtD,oBAAA,QAAQ,CAAC,oBAAoB,EAAE,CAAC;AAEhC,oBAAA,MAAM,QAAQ,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa;AACjD,wBAAA,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY;oBAGzD,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAE/C,oBAAA,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,oBAAA,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,oBAAA,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;AAC7B,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;AAEF,YAAA,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC;AACvD,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;AACjD,YAAA,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;AAEhC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;AAC7B,QAAA,CAAC,CAAC;IACJ;IAEQ,sBAAsB,GAAA;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;QAE9B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,WAAW;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,YAAY;AAExD,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;AACxE,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAE3B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC,qBAAqB,CAAC;AACxD,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAElE,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC;AAC1D,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAE5B,MAAM,gBAAgB,GAAG,IAAI,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC;QAClE,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACzC,QAAA,gBAAgB,CAAC,UAAU,GAAG,IAAI;QAClC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI;QAC5C,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI;AAC7C,QAAA,gBAAgB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;AAClC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAEhC,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC;AACrD,QAAA,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACpC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;QAEzB,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC;AACrD,QAAA,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;AAEzB,QAAA,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,aAAa,EAAE;QAC/C,aAAa,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC,OAAO,KAAI;AAC3D,YAAA,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,gCAAgC;AACxD,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO;;AAElC,QAAA,CAAC,CAAC;IAGJ;uGAvJW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,gPCV5B,kDAA8C,EAAA,MAAA,EAAA,CAAA,8CAAA,CAAA,EAAA,CAAA;;2FDUjC,eAAe,EAAA,UAAA,EAAA,CAAA;kBAN3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,cACV,IAAI,EAAA,QAAA,EAAA,kDAAA,EAAA,MAAA,EAAA,CAAA,8CAAA,CAAA,EAAA;;sBAMf;;sBACA;;sBACA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;;MEM7B,sBAAsB,CAAA;IACxB,MAAM,GAAG,CAAC;AAGnB,IAAA,OAAO;AAGP,IAAA,aAAa;AAEH,IAAA,WAAW,GAAG,IAAI,YAAY,EAAU;IAE1C,SAAS,GAAa,EAAE;AACxB,IAAA,YAAY;IAEpB,eAAe,GAAA;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACnC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,IAAI,CAAC;QAE5E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,GAAG,UAAU,CAChE;IACH;AAEA,IAAA,WAAW,CAAC,CAAS,EAAA;AACnB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAExB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QAEhC,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,WAAA,EAAc,CAAC,KAAK;QAEzC,MAAM,SAAS,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC,KAAK;QAClD,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,SAAS,GAAG,GAAG,CAAA,EAAA,CAAI;AAEvC,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QACjC;QAEA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;YACzC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,SAAS,IAAI;QACnC,CAAC,EAAE,GAAG,CAAC;IACT;uGAzCW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,KAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAGJ,UAAU,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBzC,uOAIM,0ZDYM,OAAO,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIN,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,OAAO,CAAC,EAAA,QAAA,EAAA,uOAAA,EAAA,MAAA,EAAA,CAAA,kWAAA,CAAA,EAAA;;sBAKjB;;sBAEA,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;;sBAGxC,SAAS;uBAAC,eAAe;;sBAGzB;;;MEnBU,kBAAkB,CAAA;IACpB,MAAM,GAAa,EAAE;IAE9B,KAAK,GAAG,CAAC;IAET,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;IACpD;AAEA,IAAA,IAAI,CAAC,CAAS,EAAA;AACZ,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC;IAChB;uGAXW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECV/B,kfAOM,EAAA,MAAA,EAAA,CAAA,4IAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDDM,OAAO,mHAAE,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAI9B,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,OAAA,EAChB,CAAC,OAAO,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAAA,kfAAA,EAAA,MAAA,EAAA,CAAA,4IAAA,CAAA,EAAA;;sBAKzC;;;MEFU,kBAAkB,CAAA;AACe,IAAA,OAAO;AACV,IAAA,IAAI;AAG7C,IAAA,QAAQ;AACR,IAAA,KAAK,GAAG;QACN,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,4BAA4B,EAAE,KAAK,EAAE,OAAO,EAAE;QACrE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,4BAA4B,EAAE,KAAK,EAAE,OAAO,EAAE;QACrE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,4BAA4B,EAAE,KAAK,EAAE,OAAO;KACpE;IAED,UAAU,GAAa,EAAE;IAEzB,eAAe,GAAA;QACb,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;QAEnF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,MAAM,CAAA,EAAA,CAAI;IAC5G;AAEA,IAAA,WAAW,GAAG,MAAM,CAAC,OAAO;IAG5B,QAAQ,GAAA;AACN,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO;AAErC,QAAA,IAAI,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE;AACrC,YAAA,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;QACnC;AAAO,aAAA,IAAI,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE;AAC5C,YAAA,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QACjC;AAEA,QAAA,IAAI,CAAC,WAAW,GAAG,cAAc;QAEjC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA,EAAA,CAAI;IAG9F;AACA,IAAA,YAAY,CAAC,cAAsB,EAAA;AACjC,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,GAAG,cAAc,GAAG,GAAG,CAAC;AAExE,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AAChB,YAAA,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;QAChC;QAEA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;AACjC,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,aAA4B;AAE7C,YAAA,IAAI,CAAC,GAAG,KAAK,EAAE;AACb,gBAAA,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC7B,gBAAA,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;YAC7B;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa;IAE1D;AACA,IAAA,UAAU,CAAC,cAAsB,EAAA;AAC/B,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,GAAG,cAAc,GAAG,EAAE,CAAC;AAEvE,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AAChB,YAAA,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;QAChC;QAEA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;AACjC,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,aAA4B;AAE7C,YAAA,IAAI,CAAC,IAAI,KAAK,EAAE;AACd,gBAAA,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC1B,gBAAA,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;YAChC;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;IAExD;AAIA,IAAA,aAAa,CAAC,EAAe,EAAA;AAC3B,QAAA,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE;AACvC,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW;AAEzC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACxC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;QAE3D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC;IAChD;uGAvFW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,YAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EACC,UAAU,EAAA,EAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EACb,UAAU,0FAEK,UAAU,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECbtD,qhDA8CM,EAAA,MAAA,EAAA,CAAA,6lBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDzCM,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIN,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,OAAO,CAAC,EAAA,QAAA,EAAA,qhDAAA,EAAA,MAAA,EAAA,CAAA,6lBAAA,CAAA,EAAA;;sBAKjB,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;;sBACzC,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;;sBAEtC,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,kBAAkB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;;sBAkBrD,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,eAAe,EAAE,EAAE;;;MEvBtB,aAAa,CAAA;AAeJ,IAAA,GAAA;IAbX,WAAW,GAA+B,KAAK;IAC/C,IAAI,GAGP,EAEH;IAEM,SAAS,GAA8B,YAAY;AAEhC,IAAA,aAAa;AACb,IAAA,aAAa;AAEzC,IAAA,WAAA,CAAoB,GAAsB,EAAA;QAAtB,IAAA,CAAA,GAAG,GAAH,GAAG;IAAuB;IAE9C,SAAS,GAAG,KAAK;IACjB,SAAS,GAAG,CAAC;IAEb,eAAe,GAAA;QACb,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,QAAQ,EAAE;AACjB,QAAA,CAAC,CAAC;IACJ;IAGA,QAAQ,GAAA;AACN,QAAA,MAAM,cAAc,GAClB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK;QAEhE,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW;QAEpF,IAAI,CAAC,SAAS,GAAG,cAAc,GAAG,IAAI,CAAC,SAAS;AAChD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;IAC7D;;AAIQ,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,UAAU;IAEQ,WAAW,CAAoB;IACN,OAAO,CAAc;IAExE,UAAU,GAAA;AACR,QAAA,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;IACtD;AACQ,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAEnD,QAAQ,GAAA;AACN,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC3B,aAAA,QAAQ;AACR,aAAA,mBAAmB,CAAC,IAAI,CAAC,OAAO;AAChC,aAAA,aAAa,CAAC;AACb,YAAA;AACE,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE;AACX;AACF,SAAA,CAAC;QAEJ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACpC,gBAAgB;AAChB,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,aAAa,EAAE,kCAAkC;YACjD,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU;AACzD,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;AAEjE,QAAA,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;IAChC;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE;AAC1B,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;IAC7B;AAEA,IAAA,MAAM,CAAC,KAAa,EAAA;AAClB,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAClB,IAAI,CAAC,SAAS,EAAE;IAClB;uGAtFW,aAAa,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,YAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EA4Ca,UAAU,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpDjD,itBAoBM,EAAA,MAAA,EAAA,CAAA,icAAA,CAAA,EAAA,CAAA;;2FDZO,aAAa,EAAA,UAAA,EAAA,CAAA;kBALzB,SAAS;+BACE,UAAU,EAAA,QAAA,EAAA,itBAAA,EAAA,MAAA,EAAA,CAAA,icAAA,CAAA,EAAA;;sBAMnB;;sBACA;;sBAOA;;sBAEA,SAAS;uBAAC,eAAe;;sBACzB,SAAS;uBAAC,eAAe;;sBAazB,YAAY;uBAAC,eAAe;;sBAiB5B,SAAS;uBAAC,aAAa;;sBACvB,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,gBAAgB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;;;ME1CtC,eAAe,CAAA;AACR,IAAA,GAAG;AACG,IAAA,SAAS;AACR,IAAA,UAAU;AAE1B,IAAA,gBAAgB;IAChB,IAAI,GAAuB,SAAS;IACpC,MAAM,GAA2B,IAAI;IACrC,SAAS,GAAkC,QAAQ;IAEpD,WAAW,GAAW,CAAC;AACvB,IAAA,gBAAgB;IAExB,eAAe,GAAA;QACb,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,YAAY;IACnE;IAGA,QAAQ,GAAA;AAEN,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,GAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAC,SAAS,CAAA,GAAA,EAAM,MAAM,CAAC,OAAO,KAAK;AAE/G,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,YAAY,EAAE;AAC/B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;kBAC3D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,GAAG;kBAC7C,KAAK;AACT,YAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO;QACnC;AAEA,QAAA,IAAI,cAAc,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAC;AACpE,QAAA,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,sBAAsB,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,oBAAoB;QAE5L,IAAI,IAAI,CAAC,gBAAgB;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC;IAElE;uGAlCW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,YAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,KAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECV5B,qZASM,EAAA,MAAA,EAAA,CAAA,mcAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDJM,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAKN,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,OAAA,EACb,CAAC,OAAO,CAAC,cAGN,IAAI,EAAA,QAAA,EAAA,qZAAA,EAAA,MAAA,EAAA,CAAA,mcAAA,CAAA,EAAA;;sBAGf,SAAS;uBAAC,KAAK;;sBACf,SAAS;uBAAC,WAAW;;sBACrB,SAAS;uBAAC,YAAY;;sBAEtB;;sBACA;;sBACA;;sBACA;;sBASA,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,eAAe,EAAE,EAAE;;;MElBtB,mBAAmB,CAAA;IACrB,gBAAgB,GAAY,EAAE;IAC9B,KAAK,GAAY,aAAa;uGAF5B,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECThC,i4CA+BU,EAAA,MAAA,EAAA,CAAA,qKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxBE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEN,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;+BACE,iBAAiB,EAAA,OAAA,EAGlB,CAAC,OAAO,EAAE,EAAA,QAAA,EAAA,i4CAAA,EAAA,MAAA,EAAA,CAAA,qKAAA,CAAA,EAAA;;sBAGlB;;sBACA;;;MEEU,8BAA8B,CAAA;AACjB,IAAA,SAAS;AACX,IAAA,OAAO;IAE7B,eAAe,GAAA;QACb,IAAI,CAAC,MAAM,EAAE;IACf;IAIA,MAAM,GAAA;AACJ,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa;AAChD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;AAE5C,QAAA,MAAM,IAAI,GAAG,WAAW,CAAC,qBAAqB,EAAE;AAChD,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW;AAEzC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACxC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;AAC3D,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC;AAE7D,QAAA,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC;QAEjD,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,MAAM,IAAI;IACxC;uGAzBW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA9B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,uWCb3C,kXASM,EAAA,CAAA;;2FDIO,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAL1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6BAA6B,cAC3B,IAAI,EAAA,QAAA,EAAA,kXAAA,EAAA;;sBAIf,SAAS;uBAAC,WAAW;;sBACrB,SAAS;uBAAC,SAAS;;sBAMnB,YAAY;uBAAC,eAAe;;sBAC5B,YAAY;uBAAC,eAAe;;;MEblB,gBAAgB,CAAA;uGAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,uECT7B,0cASU,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FDAG,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;+BACE,aAAa,EAAA,OAAA,EACd,EAAE,EAAA,UAAA,EAGC,IAAI,EAAA,QAAA,EAAA,0cAAA,EAAA;;;MEEL,cAAc,CAAA;IAChB,MAAM,GAAa,EAAE;IACrB,WAAW,GAAG,KAAK;IAE5B,SAAS,GAAG,KAAK;AAEjB,IAAA,SAAS,CAAC,KAAa,EAAA;QACrB,OAAO;YACL,SAAS,EAAE,aAAa,KAAK,GAAG,EAAE,CAAA,IAAA,EAAO,KAAK,GAAG,EAAE,CAAA,GAAA,CAAK;AACxD,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK;YAClC,OAAO,EAAE,IAAI,CAAC;AACZ,kBAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI;AACxC,kBAAE;SACL;IACH;IAEA,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE;AAEhD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AAErB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAChD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;;QAGzD,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAgB;QAC7D,IAAI,EAAE,EAAE;AACN,YAAA,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;QAC9B;QAEA,UAAU,CAAC,MAAK;;YAEd,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;YAE7B,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK;YACxB,CAAC,EAAE,EAAE,CAAC;QAER,CAAC,EAAE,GAAG,CAAC;IACT;uGAvCW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECT3B,qPAGM,EAAA,MAAA,EAAA,CAAA,sTAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDEM,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIX,cAAc,EAAA,UAAA,EAAA,CAAA;kBAN1B,SAAS;+BACE,qBAAqB,EAAA,OAAA,EACtB,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,qPAAA,EAAA,MAAA,EAAA,CAAA,sTAAA,CAAA,EAAA;;sBAKtB;;sBACA;;;MERU,YAAY,CAAA;IAErB,QAAQ,GAAA;QACJ,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO;QAC7E,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;IAEvD;IACA,MAAM,GAAA;QACF,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;IAC1C;IAEA,OAAO,GAAA;QACH,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;IACvC;IAEA,QAAQ,GAAA;QACJ,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;IAC1C;uGAjBS,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cADC,MAAM,EAAA,CAAA;;2FACnB,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACFlC;;AAEG;;ACFH;;AAEG;;;;"}
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@gardev/components",
3
+ "version": "0.0.1",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "peerDependencies": {
8
+ "@angular/common": "^21.1.0",
9
+ "@angular/core": "^21.1.0"
10
+ },
11
+ "dependencies": {
12
+ "tslib": "^2.3.0"
13
+ },
14
+ "sideEffects": false,
15
+ "module": "fesm2022/ardev-components.mjs",
16
+ "typings": "types/ardev-components.d.ts",
17
+ "exports": {
18
+ "./package.json": {
19
+ "default": "./package.json"
20
+ },
21
+ ".": {
22
+ "types": "./types/ardev-components.d.ts",
23
+ "default": "./fesm2022/ardev-components.mjs"
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,139 @@
1
+ import * as i0 from '@angular/core';
2
+ import { AfterViewInit, ElementRef, QueryList, ChangeDetectorRef, TemplateRef } from '@angular/core';
3
+
4
+ declare class BottleComponent implements AfterViewInit {
5
+ color: `#${string}`;
6
+ wineColor: `#${string}`;
7
+ container: ElementRef<HTMLDivElement>;
8
+ private scene;
9
+ private camera;
10
+ private renderer;
11
+ private glassMaterial;
12
+ private liquidMaterial;
13
+ private foilMaterial;
14
+ ngAfterViewInit(): void;
15
+ private animate;
16
+ private loadModelFromSVGFile;
17
+ private createSceneAndLighting;
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<BottleComponent, never>;
19
+ static ɵcmp: i0.ɵɵComponentDeclaration<BottleComponent, "app-bottle", never, { "color": { "alias": "color"; "required": false; }; "wineColor": { "alias": "wineColor"; "required": false; }; }, {}, never, never, true, never>;
20
+ }
21
+
22
+ declare class CarousselComponent {
23
+ images: string[];
24
+ index: number;
25
+ next(): void;
26
+ goTo(i: number): void;
27
+ static ɵfac: i0.ɵɵFactoryDeclaration<CarousselComponent, never>;
28
+ static ɵcmp: i0.ɵɵComponentDeclaration<CarousselComponent, "ard-caroussel", never, { "images": { "alias": "images"; "required": false; }; }, {}, never, never, true, never>;
29
+ }
30
+
31
+ declare class CronogramComponent {
32
+ wrapper: ElementRef<HTMLElement>;
33
+ line: ElementRef<HTMLElement>;
34
+ children: QueryList<ElementRef>;
35
+ items: {
36
+ date: number;
37
+ content: string;
38
+ image: string;
39
+ }[];
40
+ positionsY: number[];
41
+ ngAfterViewInit(): void;
42
+ lastScrollY: number;
43
+ onScroll(): void;
44
+ onScrollDown(scrollPosition: number): void;
45
+ onScrollUp(scrollPosition: number): void;
46
+ visibleHeight(el: HTMLElement): number;
47
+ static ɵfac: i0.ɵɵFactoryDeclaration<CronogramComponent, never>;
48
+ static ɵcmp: i0.ɵɵComponentDeclaration<CronogramComponent, "ard-cronogram", never, {}, {}, never, never, true, never>;
49
+ }
50
+
51
+ declare class MenuComponent implements AfterViewInit {
52
+ private cdr;
53
+ justifySelf: 'center' | 'end' | 'start';
54
+ menu?: {
55
+ path: string;
56
+ label: string;
57
+ }[];
58
+ direction: 'horizontal' | 'vertical';
59
+ menuContainer: ElementRef<HTMLElement>;
60
+ unorderedList: ElementRef<HTMLElement>;
61
+ constructor(cdr: ChangeDetectorRef);
62
+ collapsed: boolean;
63
+ listWidth: number;
64
+ ngAfterViewInit(): void;
65
+ getWidth(): void;
66
+ private overlay;
67
+ private overlayRef?;
68
+ menuOverlay: TemplateRef<any>;
69
+ trigger: ElementRef;
70
+ toggleMenu(): void;
71
+ private viewContainerRef;
72
+ openMenu(): void;
73
+ closeMenu(): void;
74
+ action(value: string): void;
75
+ static ɵfac: i0.ɵɵFactoryDeclaration<MenuComponent, never>;
76
+ static ɵcmp: i0.ɵɵComponentDeclaration<MenuComponent, "ard-menu", never, { "justifySelf": { "alias": "justifySelf"; "required": false; }; "menu": { "alias": "menu"; "required": false; }; "direction": { "alias": "direction"; "required": false; }; }, {}, never, never, true, never>;
77
+ }
78
+
79
+ declare class NavbarComponent {
80
+ nav: ElementRef<HTMLElement>;
81
+ navFiller: ElementRef<HTMLElement>;
82
+ navContent: ElementRef<HTMLElement>;
83
+ onScrollCallback?: (ratio: number) => void;
84
+ type: 'hero' | 'regular';
85
+ sticky: boolean | 'onScrollUp';
86
+ navHeight: CSSStyleDeclaration["height"];
87
+ private lastScrollY;
88
+ private initialNavHeight;
89
+ ngAfterViewInit(): void;
90
+ onScroll(): void;
91
+ static ɵfac: i0.ɵɵFactoryDeclaration<NavbarComponent, never>;
92
+ static ɵcmp: i0.ɵɵComponentDeclaration<NavbarComponent, "ard-navbar", never, { "onScrollCallback": { "alias": "onScrollCallback"; "required": false; }; "type": { "alias": "type"; "required": false; }; "sticky": { "alias": "sticky"; "required": false; }; "navHeight": { "alias": "navHeight"; "required": false; }; }, {}, never, ["[navContent]"], true, never>;
93
+ }
94
+
95
+ declare class PageLayoutComponent {
96
+ headerBackground?: string;
97
+ title?: string;
98
+ static ɵfac: i0.ɵɵFactoryDeclaration<PageLayoutComponent, never>;
99
+ static ɵcmp: i0.ɵɵComponentDeclaration<PageLayoutComponent, "ard-page-layout", never, { "headerBackground": { "alias": "headerBackground"; "required": false; }; "title": { "alias": "title"; "required": false; }; }, {}, never, ["*", "[sections]"], true, never>;
100
+ }
101
+
102
+ declare class ScrollReactiveSectionComponent implements AfterViewInit {
103
+ container: ElementRef<HTMLElement>;
104
+ content: ElementRef<HTMLElement>;
105
+ ngAfterViewInit(): void;
106
+ update(): void;
107
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScrollReactiveSectionComponent, never>;
108
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScrollReactiveSectionComponent, "ard-scroll-reactive-section", never, {}, {}, never, ["*"], true, never>;
109
+ }
110
+
111
+ declare class SectionComponent {
112
+ static ɵfac: i0.ɵɵFactoryDeclaration<SectionComponent, never>;
113
+ static ɵcmp: i0.ɵɵComponentDeclaration<SectionComponent, "ard-section", never, {}, {}, never, never, true, never>;
114
+ }
115
+
116
+ declare class StackCaroussel {
117
+ images: string[];
118
+ atmospheric: boolean;
119
+ animating: boolean;
120
+ getOffset(index: number): {
121
+ transform: string;
122
+ zIndex: number;
123
+ opacity: number;
124
+ };
125
+ rotateStack(): void;
126
+ static ɵfac: i0.ɵɵFactoryDeclaration<StackCaroussel, never>;
127
+ static ɵcmp: i0.ɵɵComponentDeclaration<StackCaroussel, "ard-stack-caroussel", never, { "images": { "alias": "images"; "required": false; }; "atmospheric": { "alias": "atmospheric"; "required": false; }; }, {}, never, never, true, never>;
128
+ }
129
+
130
+ declare class ThemeService {
131
+ ngOnInit(): void;
132
+ toggle(): void;
133
+ setDark(): void;
134
+ setLight(): void;
135
+ static ɵfac: i0.ɵɵFactoryDeclaration<ThemeService, never>;
136
+ static ɵprov: i0.ɵɵInjectableDeclaration<ThemeService>;
137
+ }
138
+
139
+ export { BottleComponent, CarousselComponent, CronogramComponent, MenuComponent, NavbarComponent, PageLayoutComponent, ScrollReactiveSectionComponent, SectionComponent, StackCaroussel, ThemeService };