valtech-components 2.0.713 → 2.0.714
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/esm2022/lib/components/organisms/cards-carousel/cards-carousel.component.mjs +63 -16
- package/esm2022/lib/components/organisms/cards-carousel/types.mjs +1 -1
- package/esm2022/lib/components/templates/simple/simple.component.mjs +7 -9
- package/esm2022/lib/services/auth/auth.service.mjs +33 -17
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +1 -12
- package/fesm2022/valtech-components.mjs +100 -1995
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/bottom-nav/bottom-nav.component.d.ts +1 -1
- package/lib/components/organisms/cards-carousel/cards-carousel.component.d.ts +12 -6
- package/lib/components/organisms/cards-carousel/types.d.ts +32 -3
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +0 -11
- package/esm2022/lib/components/molecules/participant-card/participant-card.component.mjs +0 -514
- package/esm2022/lib/components/molecules/participant-card/types.mjs +0 -21
- package/esm2022/lib/components/molecules/raffle-status-card/raffle-status-card.component.mjs +0 -476
- package/esm2022/lib/components/molecules/raffle-status-card/types.mjs +0 -23
- package/esm2022/lib/components/molecules/recap-card/recap-card.component.mjs +0 -78
- package/esm2022/lib/components/molecules/recap-card/types.mjs +0 -2
- package/esm2022/lib/components/molecules/ticket-grid/ticket-grid.component.mjs +0 -489
- package/esm2022/lib/components/molecules/ticket-grid/types.mjs +0 -11
- package/esm2022/lib/components/molecules/winner-display/types.mjs +0 -9
- package/esm2022/lib/components/molecules/winner-display/winner-display.component.mjs +0 -359
- package/esm2022/lib/components/templates/layout/layout.component.mjs +0 -19
- package/lib/components/molecules/participant-card/participant-card.component.d.ts +0 -34
- package/lib/components/molecules/participant-card/types.d.ts +0 -132
- package/lib/components/molecules/raffle-status-card/raffle-status-card.component.d.ts +0 -21
- package/lib/components/molecules/raffle-status-card/types.d.ts +0 -108
- package/lib/components/molecules/recap-card/recap-card.component.d.ts +0 -36
- package/lib/components/molecules/recap-card/types.d.ts +0 -30
- package/lib/components/molecules/ticket-grid/ticket-grid.component.d.ts +0 -40
- package/lib/components/molecules/ticket-grid/types.d.ts +0 -122
- package/lib/components/molecules/winner-display/types.d.ts +0 -103
- package/lib/components/molecules/winner-display/winner-display.component.d.ts +0 -36
- package/lib/components/templates/layout/layout.component.d.ts +0 -5
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, Input, Output, EventEmitter, inject, ElementRef, } from '@angular/core';
|
|
3
|
-
import { IonIcon } from '@ionic/angular/standalone';
|
|
4
|
-
import { addIcons } from 'ionicons';
|
|
5
|
-
import { trophyOutline, ticketOutline, giftOutline, locationOutline } from 'ionicons/icons';
|
|
6
|
-
import { AvatarComponent } from '../../atoms/avatar/avatar.component';
|
|
7
|
-
import { DEFAULT_WINNER_LABELS, } from './types';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
addIcons({ trophyOutline, ticketOutline, giftOutline, locationOutline });
|
|
10
|
-
/**
|
|
11
|
-
* val-winner-display
|
|
12
|
-
*
|
|
13
|
-
* A component for displaying raffle winners with celebration animations.
|
|
14
|
-
*
|
|
15
|
-
* @example Basic usage
|
|
16
|
-
* ```html
|
|
17
|
-
* <val-winner-display
|
|
18
|
-
* [props]="{
|
|
19
|
-
* winner: {
|
|
20
|
-
* name: 'Juan Pérez',
|
|
21
|
-
* ticketNumber: 42
|
|
22
|
-
* }
|
|
23
|
-
* }"
|
|
24
|
-
* ></val-winner-display>
|
|
25
|
-
* ```
|
|
26
|
-
*
|
|
27
|
-
* @example Full celebration mode
|
|
28
|
-
* ```html
|
|
29
|
-
* <val-winner-display
|
|
30
|
-
* [props]="{
|
|
31
|
-
* winner: {
|
|
32
|
-
* name: 'María García',
|
|
33
|
-
* ticketNumber: 156,
|
|
34
|
-
* prize: 'iPhone 15 Pro',
|
|
35
|
-
* prizeValue: 25000,
|
|
36
|
-
* location: 'CDMX, México',
|
|
37
|
-
* avatar: { image: 'avatar.jpg' }
|
|
38
|
-
* },
|
|
39
|
-
* mode: 'celebration',
|
|
40
|
-
* showConfetti: true,
|
|
41
|
-
* animation: 'zoom',
|
|
42
|
-
* color: 'warning'
|
|
43
|
-
* }"
|
|
44
|
-
* (animationComplete)="onReveal($event)"
|
|
45
|
-
* ></val-winner-display>
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
export class WinnerDisplayComponent {
|
|
49
|
-
constructor() {
|
|
50
|
-
this.animationComplete = new EventEmitter();
|
|
51
|
-
this.isAnimating = false;
|
|
52
|
-
this.isRevealed = false;
|
|
53
|
-
this.showConfetti = false;
|
|
54
|
-
this.confettiPieces = Array.from({ length: 50 }, (_, i) => i);
|
|
55
|
-
this.revealTimeout = null;
|
|
56
|
-
this.animationTimeout = null;
|
|
57
|
-
this.elementRef = inject(ElementRef);
|
|
58
|
-
}
|
|
59
|
-
ngOnInit() {
|
|
60
|
-
if (this.props.autoPlay !== false) {
|
|
61
|
-
this.startReveal();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
ngAfterViewInit() {
|
|
65
|
-
// Additional setup if needed
|
|
66
|
-
}
|
|
67
|
-
ngOnDestroy() {
|
|
68
|
-
if (this.revealTimeout)
|
|
69
|
-
clearTimeout(this.revealTimeout);
|
|
70
|
-
if (this.animationTimeout)
|
|
71
|
-
clearTimeout(this.animationTimeout);
|
|
72
|
-
}
|
|
73
|
-
startReveal() {
|
|
74
|
-
const delay = this.props.revealDelay || 0;
|
|
75
|
-
this.revealTimeout = setTimeout(() => {
|
|
76
|
-
this.isAnimating = true;
|
|
77
|
-
const animationDuration = this.props.animationDuration || 800;
|
|
78
|
-
this.animationTimeout = setTimeout(() => {
|
|
79
|
-
this.isAnimating = false;
|
|
80
|
-
this.isRevealed = true;
|
|
81
|
-
if (this.props.showConfetti) {
|
|
82
|
-
this.showConfetti = true;
|
|
83
|
-
}
|
|
84
|
-
this.animationComplete.emit({
|
|
85
|
-
animation: this.props.animation || 'fade',
|
|
86
|
-
winner: this.props.winner,
|
|
87
|
-
});
|
|
88
|
-
}, animationDuration);
|
|
89
|
-
}, delay);
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Manually trigger the reveal animation.
|
|
93
|
-
*/
|
|
94
|
-
reveal() {
|
|
95
|
-
this.isRevealed = false;
|
|
96
|
-
this.showConfetti = false;
|
|
97
|
-
this.startReveal();
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Reset to initial state.
|
|
101
|
-
*/
|
|
102
|
-
reset() {
|
|
103
|
-
this.isAnimating = false;
|
|
104
|
-
this.isRevealed = false;
|
|
105
|
-
this.showConfetti = false;
|
|
106
|
-
}
|
|
107
|
-
formatTicketNumber() {
|
|
108
|
-
const num = this.props.winner.ticketNumber;
|
|
109
|
-
if (this.props.numberPadding) {
|
|
110
|
-
return String(num).padStart(this.props.numberPadding, '0');
|
|
111
|
-
}
|
|
112
|
-
return String(num);
|
|
113
|
-
}
|
|
114
|
-
formatPrizeValue() {
|
|
115
|
-
if (!this.props.winner.prizeValue)
|
|
116
|
-
return '';
|
|
117
|
-
return `$${this.props.winner.prizeValue.toLocaleString('es-MX')}`;
|
|
118
|
-
}
|
|
119
|
-
getRandomX(index) {
|
|
120
|
-
return `${(index * 17) % 100}%`;
|
|
121
|
-
}
|
|
122
|
-
getRandomRotation(index) {
|
|
123
|
-
return `${(index * 37) % 360}deg`;
|
|
124
|
-
}
|
|
125
|
-
getWinnerLabel() {
|
|
126
|
-
return this.props.winnerLabel || DEFAULT_WINNER_LABELS.winner;
|
|
127
|
-
}
|
|
128
|
-
getTicketLabel() {
|
|
129
|
-
return this.props.ticketLabel || DEFAULT_WINNER_LABELS.ticket;
|
|
130
|
-
}
|
|
131
|
-
getPrizeLabel() {
|
|
132
|
-
return this.props.prizeLabel || DEFAULT_WINNER_LABELS.prize;
|
|
133
|
-
}
|
|
134
|
-
getColor() {
|
|
135
|
-
if (this.props.color) {
|
|
136
|
-
return `var(--ion-color-${this.props.color})`;
|
|
137
|
-
}
|
|
138
|
-
return 'var(--ion-color-warning)';
|
|
139
|
-
}
|
|
140
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WinnerDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
141
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: WinnerDisplayComponent, isStandalone: true, selector: "val-winner-display", inputs: { props: "props" }, outputs: { animationComplete: "animationComplete" }, ngImport: i0, template: `
|
|
142
|
-
<div
|
|
143
|
-
class="winner-display-container"
|
|
144
|
-
[class]="props.cssClass"
|
|
145
|
-
[class.mode-compact]="props.mode === 'compact'"
|
|
146
|
-
[class.mode-standard]="props.mode === 'standard' || !props.mode"
|
|
147
|
-
[class.mode-full]="props.mode === 'full'"
|
|
148
|
-
[class.mode-celebration]="props.mode === 'celebration'"
|
|
149
|
-
[class.size-small]="props.size === 'small'"
|
|
150
|
-
[class.size-medium]="props.size === 'medium' || !props.size"
|
|
151
|
-
[class.size-large]="props.size === 'large'"
|
|
152
|
-
[class.bg-solid]="props.background === 'solid' || !props.background"
|
|
153
|
-
[class.bg-gradient]="props.background === 'gradient'"
|
|
154
|
-
[class.bg-transparent]="props.background === 'transparent'"
|
|
155
|
-
[class.animating]="isAnimating"
|
|
156
|
-
[class.revealed]="isRevealed"
|
|
157
|
-
[class.animation-fade]="props.animation === 'fade'"
|
|
158
|
-
[class.animation-zoom]="props.animation === 'zoom'"
|
|
159
|
-
[class.animation-slide]="props.animation === 'slide'"
|
|
160
|
-
[class.animation-spotlight]="props.animation === 'spotlight'"
|
|
161
|
-
[style.--winner-color]="getColor()"
|
|
162
|
-
[style.--animation-duration]="(props.animationDuration || 800) + 'ms'"
|
|
163
|
-
>
|
|
164
|
-
<!-- Confetti overlay -->
|
|
165
|
-
@if (props.showConfetti && (props.mode === 'celebration' || props.mode === 'full')) {
|
|
166
|
-
<div class="confetti-container" [class.active]="showConfetti">
|
|
167
|
-
@for (i of confettiPieces; track i) {
|
|
168
|
-
<div
|
|
169
|
-
class="confetti-piece"
|
|
170
|
-
[style.--delay]="i * 0.1 + 's'"
|
|
171
|
-
[style.--x]="getRandomX(i)"
|
|
172
|
-
[style.--rotation]="getRandomRotation(i)"
|
|
173
|
-
></div>
|
|
174
|
-
}
|
|
175
|
-
</div>
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
<!-- Trophy icon -->
|
|
179
|
-
@if (props.showTrophy !== false) {
|
|
180
|
-
<div class="trophy-container">
|
|
181
|
-
<ion-icon name="trophy-outline" class="trophy-icon"></ion-icon>
|
|
182
|
-
</div>
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
<!-- Winner label -->
|
|
186
|
-
<div class="winner-label">{{ getWinnerLabel() }}</div>
|
|
187
|
-
|
|
188
|
-
<!-- Winner info -->
|
|
189
|
-
<div class="winner-info">
|
|
190
|
-
<!-- Avatar -->
|
|
191
|
-
@if (props.winner.avatar && (props.mode === 'full' || props.mode === 'celebration')) {
|
|
192
|
-
<val-avatar [props]="props.winner.avatar" class="winner-avatar"></val-avatar>
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
<!-- Name -->
|
|
196
|
-
<h2 class="winner-name">{{ props.winner.name }}</h2>
|
|
197
|
-
|
|
198
|
-
<!-- Location -->
|
|
199
|
-
@if (props.showLocation !== false && props.winner.location) {
|
|
200
|
-
<div class="winner-location">
|
|
201
|
-
<ion-icon name="location-outline"></ion-icon>
|
|
202
|
-
<span>{{ props.winner.location }}</span>
|
|
203
|
-
</div>
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
<!-- Ticket number -->
|
|
207
|
-
@if (props.showTicketNumber !== false) {
|
|
208
|
-
<div class="ticket-info">
|
|
209
|
-
<ion-icon name="ticket-outline"></ion-icon>
|
|
210
|
-
<span class="ticket-label">{{ getTicketLabel() }}</span>
|
|
211
|
-
<span class="ticket-number">{{ formatTicketNumber() }}</span>
|
|
212
|
-
</div>
|
|
213
|
-
}
|
|
214
|
-
</div>
|
|
215
|
-
|
|
216
|
-
<!-- Prize info -->
|
|
217
|
-
@if (props.showPrize !== false && props.winner.prize) {
|
|
218
|
-
<div class="prize-info">
|
|
219
|
-
@if (props.winner.prizeImage && (props.mode === 'full' || props.mode === 'celebration')) {
|
|
220
|
-
<div class="prize-image">
|
|
221
|
-
<img [src]="props.winner.prizeImage" [alt]="props.winner.prize" />
|
|
222
|
-
</div>
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
<div class="prize-details">
|
|
226
|
-
<div class="prize-header">
|
|
227
|
-
<ion-icon name="gift-outline"></ion-icon>
|
|
228
|
-
<span class="prize-label">{{ getPrizeLabel() }}</span>
|
|
229
|
-
</div>
|
|
230
|
-
<h3 class="prize-name">{{ props.winner.prize }}</h3>
|
|
231
|
-
|
|
232
|
-
@if (props.winner.prizeDescription) {
|
|
233
|
-
<p class="prize-description">{{ props.winner.prizeDescription }}</p>
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
@if (props.showPrizeValue !== false && props.winner.prizeValue) {
|
|
237
|
-
<div class="prize-value">
|
|
238
|
-
{{ formatPrizeValue() }}
|
|
239
|
-
</div>
|
|
240
|
-
}
|
|
241
|
-
</div>
|
|
242
|
-
</div>
|
|
243
|
-
}
|
|
244
|
-
</div>
|
|
245
|
-
`, isInline: true, styles: [":host{display:block}.winner-display-container{--winner-color: var(--ion-color-warning);--animation-duration: .8s;position:relative;display:flex;flex-direction:column;align-items:center;text-align:center;padding:32px 24px;border-radius:16px;overflow:hidden}.bg-solid{background:var(--ion-color-light);border:2px solid var(--winner-color)}.bg-gradient{background:linear-gradient(135deg,var(--ion-color-light) 0%,rgba(var(--ion-color-warning-rgb),.1) 100%);border:2px solid var(--winner-color)}.bg-transparent{background:transparent}.trophy-container{margin-bottom:16px}.trophy-icon{font-size:56px;color:var(--winner-color);filter:drop-shadow(0 4px 8px rgba(0,0,0,.1))}.winner-label{font-size:14px;font-weight:600;text-transform:uppercase;letter-spacing:2px;color:var(--winner-color);margin-bottom:8px}.winner-info{display:flex;flex-direction:column;align-items:center;gap:8px;margin-bottom:16px}.winner-avatar{margin-bottom:8px}.winner-name{font-size:28px;font-weight:700;color:var(--ion-color-dark);margin:0;line-height:1.2}.winner-location{display:flex;align-items:center;gap:4px;font-size:14px;color:var(--ion-color-medium-shade)}.winner-location ion-icon{font-size:16px}.ticket-info{display:flex;align-items:center;gap:8px;padding:8px 16px;background:rgba(var(--ion-color-dark-rgb),.05);border-radius:24px;margin-top:8px}.ticket-info ion-icon{font-size:20px;color:var(--winner-color)}.ticket-label{font-size:14px;color:var(--ion-color-medium-shade)}.ticket-number{font-size:18px;font-weight:700;color:var(--ion-color-dark);font-variant-numeric:tabular-nums}.prize-info{display:flex;flex-direction:column;align-items:center;gap:12px;padding:16px;background:var(--ion-color-light-shade);border-radius:12px;width:100%;max-width:400px}.prize-image{width:120px;height:120px;border-radius:8px;overflow:hidden;background:#fff;box-shadow:0 4px 12px #0000001a}.prize-image img{width:100%;height:100%;object-fit:cover}.prize-details{display:flex;flex-direction:column;align-items:center;gap:4px}.prize-header{display:flex;align-items:center;gap:4px;color:var(--ion-color-medium-shade);font-size:12px}.prize-header ion-icon{font-size:16px;color:var(--winner-color)}.prize-label{text-transform:uppercase;letter-spacing:1px}.prize-name{font-size:20px;font-weight:600;color:var(--ion-color-dark);margin:0}.prize-description{font-size:14px;color:var(--ion-color-medium-shade);margin:4px 0 0}.prize-value{font-size:24px;font-weight:700;color:var(--winner-color);margin-top:8px}.confetti-container{position:absolute;inset:0;pointer-events:none;overflow:hidden;opacity:0;transition:opacity .3s}.confetti-container.active{opacity:1}.confetti-piece{position:absolute;width:10px;height:10px;top:-20px;left:var(--x, 50%);background:var(--winner-color);opacity:0;animation:confetti-fall 3s ease-out var(--delay, 0s) forwards}.confetti-piece:nth-child(2n){background:var(--ion-color-primary);width:8px;height:12px}.confetti-piece:nth-child(3n){background:var(--ion-color-danger);border-radius:50%}.confetti-piece:nth-child(5n){background:var(--ion-color-success);width:6px;height:14px}@keyframes confetti-fall{0%{opacity:1;transform:translateY(0) rotate(0)}to{opacity:0;transform:translateY(400px) rotate(var(--rotation, 720deg))}}.animation-fade:not(.revealed) .winner-info,.animation-fade:not(.revealed) .prize-info{opacity:0}.animation-fade.animating .winner-info,.animation-fade.animating .prize-info{animation:fade-in var(--animation-duration) ease-out forwards}.animation-zoom:not(.revealed) .winner-info,.animation-zoom:not(.revealed) .prize-info{opacity:0;transform:scale(.5)}.animation-zoom.animating .winner-info,.animation-zoom.animating .prize-info{animation:zoom-in var(--animation-duration) cubic-bezier(.34,1.56,.64,1) forwards}.animation-slide:not(.revealed) .winner-info,.animation-slide:not(.revealed) .prize-info{opacity:0;transform:translateY(40px)}.animation-slide.animating .winner-info,.animation-slide.animating .prize-info{animation:slide-up var(--animation-duration) ease-out forwards}.animation-slide.animating .prize-info{animation-delay:.2s}.animation-spotlight:not(.revealed) .winner-info,.animation-spotlight:not(.revealed) .prize-info{opacity:0}.animation-spotlight:not(.revealed):before{content:\"\";position:absolute;top:50%;left:50%;width:0;height:0;background:radial-gradient(circle,rgba(255,255,255,.8) 0%,transparent 70%);border-radius:50%;transform:translate(-50%,-50%)}.animation-spotlight.animating:before{animation:spotlight var(--animation-duration) ease-out forwards}.animation-spotlight.animating .winner-info,.animation-spotlight.animating .prize-info{animation:fade-in calc(var(--animation-duration) * .5) ease-out calc(var(--animation-duration) * .5) forwards}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes zoom-in{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes slide-up{0%{opacity:0;transform:translateY(40px)}to{opacity:1;transform:translateY(0)}}@keyframes spotlight{0%{width:0;height:0}to{width:200%;height:200%}}.size-small{padding:20px 16px}.size-small .trophy-icon{font-size:40px}.size-small .winner-label{font-size:12px}.size-small .winner-name{font-size:20px}.size-small .ticket-number,.size-small .prize-name{font-size:16px}.size-small .prize-value{font-size:18px}.size-large{padding:48px 32px}.size-large .trophy-icon{font-size:80px}.size-large .winner-label{font-size:18px;letter-spacing:3px}.size-large .winner-name{font-size:40px}.size-large .ticket-number{font-size:24px}.size-large .prize-image{width:160px;height:160px}.size-large .prize-name{font-size:28px}.size-large .prize-value{font-size:32px}.mode-compact{padding:16px}.mode-compact .trophy-container,.mode-compact .prize-info{display:none}.mode-compact .winner-label{font-size:11px;margin-bottom:4px}.mode-compact .winner-name{font-size:18px}.mode-celebration .trophy-icon{animation:trophy-bounce 1s ease-in-out infinite}.mode-celebration.revealed .winner-name{animation:glow 2s ease-in-out infinite}@keyframes trophy-bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes glow{0%,to{text-shadow:0 0 10px rgba(var(--ion-color-warning-rgb),.3)}50%{text-shadow:0 0 20px rgba(var(--ion-color-warning-rgb),.6)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: AvatarComponent, selector: "val-avatar", inputs: ["preset", "props"], outputs: ["onClick"] }] }); }
|
|
246
|
-
}
|
|
247
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WinnerDisplayComponent, decorators: [{
|
|
248
|
-
type: Component,
|
|
249
|
-
args: [{ selector: 'val-winner-display', standalone: true, imports: [CommonModule, IonIcon, AvatarComponent], template: `
|
|
250
|
-
<div
|
|
251
|
-
class="winner-display-container"
|
|
252
|
-
[class]="props.cssClass"
|
|
253
|
-
[class.mode-compact]="props.mode === 'compact'"
|
|
254
|
-
[class.mode-standard]="props.mode === 'standard' || !props.mode"
|
|
255
|
-
[class.mode-full]="props.mode === 'full'"
|
|
256
|
-
[class.mode-celebration]="props.mode === 'celebration'"
|
|
257
|
-
[class.size-small]="props.size === 'small'"
|
|
258
|
-
[class.size-medium]="props.size === 'medium' || !props.size"
|
|
259
|
-
[class.size-large]="props.size === 'large'"
|
|
260
|
-
[class.bg-solid]="props.background === 'solid' || !props.background"
|
|
261
|
-
[class.bg-gradient]="props.background === 'gradient'"
|
|
262
|
-
[class.bg-transparent]="props.background === 'transparent'"
|
|
263
|
-
[class.animating]="isAnimating"
|
|
264
|
-
[class.revealed]="isRevealed"
|
|
265
|
-
[class.animation-fade]="props.animation === 'fade'"
|
|
266
|
-
[class.animation-zoom]="props.animation === 'zoom'"
|
|
267
|
-
[class.animation-slide]="props.animation === 'slide'"
|
|
268
|
-
[class.animation-spotlight]="props.animation === 'spotlight'"
|
|
269
|
-
[style.--winner-color]="getColor()"
|
|
270
|
-
[style.--animation-duration]="(props.animationDuration || 800) + 'ms'"
|
|
271
|
-
>
|
|
272
|
-
<!-- Confetti overlay -->
|
|
273
|
-
@if (props.showConfetti && (props.mode === 'celebration' || props.mode === 'full')) {
|
|
274
|
-
<div class="confetti-container" [class.active]="showConfetti">
|
|
275
|
-
@for (i of confettiPieces; track i) {
|
|
276
|
-
<div
|
|
277
|
-
class="confetti-piece"
|
|
278
|
-
[style.--delay]="i * 0.1 + 's'"
|
|
279
|
-
[style.--x]="getRandomX(i)"
|
|
280
|
-
[style.--rotation]="getRandomRotation(i)"
|
|
281
|
-
></div>
|
|
282
|
-
}
|
|
283
|
-
</div>
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
<!-- Trophy icon -->
|
|
287
|
-
@if (props.showTrophy !== false) {
|
|
288
|
-
<div class="trophy-container">
|
|
289
|
-
<ion-icon name="trophy-outline" class="trophy-icon"></ion-icon>
|
|
290
|
-
</div>
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
<!-- Winner label -->
|
|
294
|
-
<div class="winner-label">{{ getWinnerLabel() }}</div>
|
|
295
|
-
|
|
296
|
-
<!-- Winner info -->
|
|
297
|
-
<div class="winner-info">
|
|
298
|
-
<!-- Avatar -->
|
|
299
|
-
@if (props.winner.avatar && (props.mode === 'full' || props.mode === 'celebration')) {
|
|
300
|
-
<val-avatar [props]="props.winner.avatar" class="winner-avatar"></val-avatar>
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
<!-- Name -->
|
|
304
|
-
<h2 class="winner-name">{{ props.winner.name }}</h2>
|
|
305
|
-
|
|
306
|
-
<!-- Location -->
|
|
307
|
-
@if (props.showLocation !== false && props.winner.location) {
|
|
308
|
-
<div class="winner-location">
|
|
309
|
-
<ion-icon name="location-outline"></ion-icon>
|
|
310
|
-
<span>{{ props.winner.location }}</span>
|
|
311
|
-
</div>
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
<!-- Ticket number -->
|
|
315
|
-
@if (props.showTicketNumber !== false) {
|
|
316
|
-
<div class="ticket-info">
|
|
317
|
-
<ion-icon name="ticket-outline"></ion-icon>
|
|
318
|
-
<span class="ticket-label">{{ getTicketLabel() }}</span>
|
|
319
|
-
<span class="ticket-number">{{ formatTicketNumber() }}</span>
|
|
320
|
-
</div>
|
|
321
|
-
}
|
|
322
|
-
</div>
|
|
323
|
-
|
|
324
|
-
<!-- Prize info -->
|
|
325
|
-
@if (props.showPrize !== false && props.winner.prize) {
|
|
326
|
-
<div class="prize-info">
|
|
327
|
-
@if (props.winner.prizeImage && (props.mode === 'full' || props.mode === 'celebration')) {
|
|
328
|
-
<div class="prize-image">
|
|
329
|
-
<img [src]="props.winner.prizeImage" [alt]="props.winner.prize" />
|
|
330
|
-
</div>
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
<div class="prize-details">
|
|
334
|
-
<div class="prize-header">
|
|
335
|
-
<ion-icon name="gift-outline"></ion-icon>
|
|
336
|
-
<span class="prize-label">{{ getPrizeLabel() }}</span>
|
|
337
|
-
</div>
|
|
338
|
-
<h3 class="prize-name">{{ props.winner.prize }}</h3>
|
|
339
|
-
|
|
340
|
-
@if (props.winner.prizeDescription) {
|
|
341
|
-
<p class="prize-description">{{ props.winner.prizeDescription }}</p>
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
@if (props.showPrizeValue !== false && props.winner.prizeValue) {
|
|
345
|
-
<div class="prize-value">
|
|
346
|
-
{{ formatPrizeValue() }}
|
|
347
|
-
</div>
|
|
348
|
-
}
|
|
349
|
-
</div>
|
|
350
|
-
</div>
|
|
351
|
-
}
|
|
352
|
-
</div>
|
|
353
|
-
`, styles: [":host{display:block}.winner-display-container{--winner-color: var(--ion-color-warning);--animation-duration: .8s;position:relative;display:flex;flex-direction:column;align-items:center;text-align:center;padding:32px 24px;border-radius:16px;overflow:hidden}.bg-solid{background:var(--ion-color-light);border:2px solid var(--winner-color)}.bg-gradient{background:linear-gradient(135deg,var(--ion-color-light) 0%,rgba(var(--ion-color-warning-rgb),.1) 100%);border:2px solid var(--winner-color)}.bg-transparent{background:transparent}.trophy-container{margin-bottom:16px}.trophy-icon{font-size:56px;color:var(--winner-color);filter:drop-shadow(0 4px 8px rgba(0,0,0,.1))}.winner-label{font-size:14px;font-weight:600;text-transform:uppercase;letter-spacing:2px;color:var(--winner-color);margin-bottom:8px}.winner-info{display:flex;flex-direction:column;align-items:center;gap:8px;margin-bottom:16px}.winner-avatar{margin-bottom:8px}.winner-name{font-size:28px;font-weight:700;color:var(--ion-color-dark);margin:0;line-height:1.2}.winner-location{display:flex;align-items:center;gap:4px;font-size:14px;color:var(--ion-color-medium-shade)}.winner-location ion-icon{font-size:16px}.ticket-info{display:flex;align-items:center;gap:8px;padding:8px 16px;background:rgba(var(--ion-color-dark-rgb),.05);border-radius:24px;margin-top:8px}.ticket-info ion-icon{font-size:20px;color:var(--winner-color)}.ticket-label{font-size:14px;color:var(--ion-color-medium-shade)}.ticket-number{font-size:18px;font-weight:700;color:var(--ion-color-dark);font-variant-numeric:tabular-nums}.prize-info{display:flex;flex-direction:column;align-items:center;gap:12px;padding:16px;background:var(--ion-color-light-shade);border-radius:12px;width:100%;max-width:400px}.prize-image{width:120px;height:120px;border-radius:8px;overflow:hidden;background:#fff;box-shadow:0 4px 12px #0000001a}.prize-image img{width:100%;height:100%;object-fit:cover}.prize-details{display:flex;flex-direction:column;align-items:center;gap:4px}.prize-header{display:flex;align-items:center;gap:4px;color:var(--ion-color-medium-shade);font-size:12px}.prize-header ion-icon{font-size:16px;color:var(--winner-color)}.prize-label{text-transform:uppercase;letter-spacing:1px}.prize-name{font-size:20px;font-weight:600;color:var(--ion-color-dark);margin:0}.prize-description{font-size:14px;color:var(--ion-color-medium-shade);margin:4px 0 0}.prize-value{font-size:24px;font-weight:700;color:var(--winner-color);margin-top:8px}.confetti-container{position:absolute;inset:0;pointer-events:none;overflow:hidden;opacity:0;transition:opacity .3s}.confetti-container.active{opacity:1}.confetti-piece{position:absolute;width:10px;height:10px;top:-20px;left:var(--x, 50%);background:var(--winner-color);opacity:0;animation:confetti-fall 3s ease-out var(--delay, 0s) forwards}.confetti-piece:nth-child(2n){background:var(--ion-color-primary);width:8px;height:12px}.confetti-piece:nth-child(3n){background:var(--ion-color-danger);border-radius:50%}.confetti-piece:nth-child(5n){background:var(--ion-color-success);width:6px;height:14px}@keyframes confetti-fall{0%{opacity:1;transform:translateY(0) rotate(0)}to{opacity:0;transform:translateY(400px) rotate(var(--rotation, 720deg))}}.animation-fade:not(.revealed) .winner-info,.animation-fade:not(.revealed) .prize-info{opacity:0}.animation-fade.animating .winner-info,.animation-fade.animating .prize-info{animation:fade-in var(--animation-duration) ease-out forwards}.animation-zoom:not(.revealed) .winner-info,.animation-zoom:not(.revealed) .prize-info{opacity:0;transform:scale(.5)}.animation-zoom.animating .winner-info,.animation-zoom.animating .prize-info{animation:zoom-in var(--animation-duration) cubic-bezier(.34,1.56,.64,1) forwards}.animation-slide:not(.revealed) .winner-info,.animation-slide:not(.revealed) .prize-info{opacity:0;transform:translateY(40px)}.animation-slide.animating .winner-info,.animation-slide.animating .prize-info{animation:slide-up var(--animation-duration) ease-out forwards}.animation-slide.animating .prize-info{animation-delay:.2s}.animation-spotlight:not(.revealed) .winner-info,.animation-spotlight:not(.revealed) .prize-info{opacity:0}.animation-spotlight:not(.revealed):before{content:\"\";position:absolute;top:50%;left:50%;width:0;height:0;background:radial-gradient(circle,rgba(255,255,255,.8) 0%,transparent 70%);border-radius:50%;transform:translate(-50%,-50%)}.animation-spotlight.animating:before{animation:spotlight var(--animation-duration) ease-out forwards}.animation-spotlight.animating .winner-info,.animation-spotlight.animating .prize-info{animation:fade-in calc(var(--animation-duration) * .5) ease-out calc(var(--animation-duration) * .5) forwards}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes zoom-in{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes slide-up{0%{opacity:0;transform:translateY(40px)}to{opacity:1;transform:translateY(0)}}@keyframes spotlight{0%{width:0;height:0}to{width:200%;height:200%}}.size-small{padding:20px 16px}.size-small .trophy-icon{font-size:40px}.size-small .winner-label{font-size:12px}.size-small .winner-name{font-size:20px}.size-small .ticket-number,.size-small .prize-name{font-size:16px}.size-small .prize-value{font-size:18px}.size-large{padding:48px 32px}.size-large .trophy-icon{font-size:80px}.size-large .winner-label{font-size:18px;letter-spacing:3px}.size-large .winner-name{font-size:40px}.size-large .ticket-number{font-size:24px}.size-large .prize-image{width:160px;height:160px}.size-large .prize-name{font-size:28px}.size-large .prize-value{font-size:32px}.mode-compact{padding:16px}.mode-compact .trophy-container,.mode-compact .prize-info{display:none}.mode-compact .winner-label{font-size:11px;margin-bottom:4px}.mode-compact .winner-name{font-size:18px}.mode-celebration .trophy-icon{animation:trophy-bounce 1s ease-in-out infinite}.mode-celebration.revealed .winner-name{animation:glow 2s ease-in-out infinite}@keyframes trophy-bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes glow{0%,to{text-shadow:0 0 10px rgba(var(--ion-color-warning-rgb),.3)}50%{text-shadow:0 0 20px rgba(var(--ion-color-warning-rgb),.6)}}\n"] }]
|
|
354
|
-
}], propDecorators: { props: [{
|
|
355
|
-
type: Input
|
|
356
|
-
}], animationComplete: [{
|
|
357
|
-
type: Output
|
|
358
|
-
}] } });
|
|
359
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lubmVyLWRpc3BsYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy93aW5uZXItZGlzcGxheS93aW5uZXItZGlzcGxheS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osTUFBTSxFQUNOLFVBQVUsR0FFWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFHTCxxQkFBcUIsR0FDdEIsTUFBTSxTQUFTLENBQUM7O0FBRWpCLFFBQVEsQ0FBQyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7QUFpSHpFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUNHO0FBQ0gsTUFBTSxPQUFPLHNCQUFzQjtJQXJKbkM7UUF3Slksc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQStCLENBQUM7UUFFOUUsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixtQkFBYyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxF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ZSxDQUFDLFlBQ3ZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdHVDs4QkEwQ1EsS0FBSztzQkFBYixLQUFLO2dCQUVJLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIGluamVjdCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJb25JY29uIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IHRyb3BoeU91dGxpbmUsIHRpY2tldE91dGxpbmUsIGdpZnRPdXRsaW5lLCBsb2NhdGlvbk91dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5pbXBvcnQgeyBBdmF0YXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9hdmF0YXIvYXZhdGFyLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBXaW5uZXJEaXNwbGF5TWV0YWRhdGEsXG4gIFdpbm5lckRpc3BsYXlBbmltYXRpb25FdmVudCxcbiAgREVGQVVMVF9XSU5ORVJfTEFCRUxTLFxufSBmcm9tICcuL3R5cGVzJztcblxuYWRkSWNvbnMoeyB0cm9waHlPdXRsaW5lLCB0aWNrZXRPdXRsaW5lLCBnaWZ0T3V0bGluZSwgbG9jYXRpb25PdXRsaW5lIH0pO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtd2lubmVyLWRpc3BsYXknLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJb25JY29uLCBBdmF0YXJDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwid2lubmVyLWRpc3BsYXktY29udGFpbmVyXCJcbiAgICAgIFtjbGFzc109XCJwcm9wcy5jc3NDbGFzc1wiXG4gICAgICBbY2xhc3MubW9kZS1jb21wYWN0XT1cInByb3BzLm1vZGUgPT09ICdjb21wYWN0J1wiXG4gICAgICBbY2xhc3MubW9kZS1zdGFuZGFyZF09XCJwcm9wcy5tb2RlID09PSAnc3RhbmRhcmQnIHx8ICFwcm9wcy5tb2RlXCJcbiAgICAgIFtjbGFzcy5tb2RlLWZ1bGxdPVwicHJvcHMubW9kZSA9PT0gJ2Z1bGwnXCJcbiAgICAgIFtjbGFzcy5tb2RlLWNlbGVicmF0aW9uXT1cInByb3BzLm1vZGUgPT09ICdjZWxlYnJhdGlvbidcIlxuICAgICAgW2NsYXNzLnNpemUtc21hbGxdPVwicHJvcHMuc2l6ZSA9PT0gJ3NtYWxsJ1wiXG4gICAgICBbY2xhc3Muc2l6ZS1tZWRpdW1dPVwicHJvcHMuc2l6ZSA9PT0gJ21lZGl1bScgfHwgIXByb3BzLnNpemVcIlxuICAgICAgW2NsYXNzLnNpemUtbGFyZ2VdPVwicHJvcHMuc2l6ZSA9PT0gJ2xhcmdlJ1wiXG4gICAgICBbY2xhc3MuYmctc29saWRdPVwicHJvcHMuYmFja2dyb3VuZCA9PT0gJ3NvbGlkJyB8fCAhcHJvcHMuYmFja2dyb3VuZFwiXG4gICAgICBbY2xhc3MuYmctZ3JhZGllbnRdPVwicHJvcHMuYmFja2dyb3VuZCA9PT0gJ2dyYWRpZW50J1wiXG4gICAgICBbY2xhc3MuYmctdHJhbnNwYXJlbnRdPVwicHJvcHMuYmFja2dyb3VuZCA9PT0gJ3RyYW5zcGFyZW50J1wiXG4gICAgICBbY2xhc3MuYW5pbWF0aW5nXT1cImlzQW5pbWF0aW5nXCJcbiAgICAgIFtjbGFzcy5yZXZlYWxlZF09XCJpc1JldmVhbGVkXCJcbiAgICAgIFtjbGFzcy5hbmltYXRpb24tZmFkZV09XCJwcm9wcy5hbmltYXRpb24gPT09ICdmYWRlJ1wiXG4gICAgICBbY2xhc3MuYW5pbWF0aW9uLXpvb21dPVwicHJvcHMuYW5pbWF0aW9uID09PSAnem9vbSdcIlxuICAgICAgW2NsYXNzLmFuaW1hdGlvbi1zbGlkZV09XCJwcm9wcy5hbmltYXRpb24gPT09ICdzbGlkZSdcIlxuICAgICAgW2NsYXNzLmFuaW1hdGlvbi1zcG90bGlnaHRdPVwicHJvcHMuYW5pbWF0aW9uID09PSAnc3BvdGxpZ2h0J1wiXG4gICAgICBbc3R5bGUuLS13aW5uZXItY29sb3JdPVwiZ2V0Q29sb3IoKVwiXG4gICAgICBbc3R5bGUuLS1hbmltYXRpb24tZHVyYXRpb25dPVwiKHByb3BzLmFuaW1hdGlvbkR1cmF0aW9uIHx8IDgwMCkgKyAnbXMnXCJcbiAgICA+XG4gICAgICA8IS0tIENvbmZldHRpIG92ZXJsYXkgLS0+XG4gICAgICBAaWYgKHByb3BzLnNob3dDb25mZXR0aSAmJiAocHJvcHMubW9kZSA9PT0gJ2NlbGVicmF0aW9uJyB8fCBwcm9wcy5tb2RlID09PSAnZnVsbCcpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb25mZXR0aS1jb250YWluZXJcIiBbY2xhc3MuYWN0aXZlXT1cInNob3dDb25mZXR0aVwiPlxuICAgICAgICAgIEBmb3IgKGkgb2YgY29uZmV0dGlQaWVjZXM7IHRyYWNrIGkpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJjb25mZXR0aS1waWVjZVwiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLWRlbGF5XT1cImkgKiAwLjEgKyAncydcIlxuICAgICAgICAgICAgICBbc3R5bGUuLS14XT1cImdldFJhbmRvbVgoaSlcIlxuICAgICAgICAgICAgICBbc3R5bGUuLS1yb3RhdGlvbl09XCJnZXRSYW5kb21Sb3RhdGlvbihpKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBUcm9waHkgaWNvbiAtLT5cbiAgICAgIEBpZiAocHJvcHMuc2hvd1Ryb3BoeSAhPT0gZmFsc2UpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInRyb3BoeS1jb250YWluZXJcIj5cbiAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRyb3BoeS1vdXRsaW5lXCIgY2xhc3M9XCJ0cm9waHktaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8IS0tIFdpbm5lciBsYWJlbCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3aW5uZXItbGFiZWxcIj57eyBnZXRXaW5uZXJMYWJlbCgpIH19PC9kaXY+XG5cbiAgICAgIDwhLS0gV2lubmVyIGluZm8gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwid2lubmVyLWluZm9cIj5cbiAgICAgICAgPCEtLSBBdmF0YXIgLS0+XG4gICAgICAgIEBpZiAocHJvcHMud2lubmVyLmF2YXRhciAmJiAocHJvcHMubW9kZSA9PT0gJ2Z1bGwnIHx8IHByb3BzLm1vZGUgPT09ICdjZWxlYnJhdGlvbicpKSB7XG4gICAgICAgICAgPHZhbC1hdmF0YXIgW3Byb3BzXT1cInByb3BzLndpbm5lci5hdmF0YXJcIiBjbGFzcz1cIndpbm5lci1hdmF0YXJcIj48L3ZhbC1hdmF0YXI+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIE5hbWUgLS0+XG4gICAgICAgIDxoMiBjbGFzcz1cIndpbm5lci1uYW1lXCI+e3sgcHJvcHMud2lubmVyLm5hbWUgfX08L2gyPlxuXG4gICAgICAgIDwhLS0gTG9jYXRpb24gLS0+XG4gICAgICAgIEBpZiAocHJvcHMuc2hvd0xvY2F0aW9uICE9PSBmYWxzZSAmJiBwcm9wcy53aW5uZXIubG9jYXRpb24pIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lubmVyLWxvY2F0aW9uXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImxvY2F0aW9uLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3sgcHJvcHMud2lubmVyLmxvY2F0aW9uIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBUaWNrZXQgbnVtYmVyIC0tPlxuICAgICAgICBAaWYgKHByb3BzLnNob3dUaWNrZXROdW1iZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpY2tldC1pbmZvXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRpY2tldC1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGlja2V0LWxhYmVsXCI+e3sgZ2V0VGlja2V0TGFiZWwoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGlja2V0LW51bWJlclwiPnt7IGZvcm1hdFRpY2tldE51bWJlcigpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQcml6ZSBpbmZvIC0tPlxuICAgICAgQGlmIChwcm9wcy5zaG93UHJpemUgIT09IGZhbHNlICYmIHByb3BzLndpbm5lci5wcml6ZSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicHJpemUtaW5mb1wiPlxuICAgICAgICAgIEBpZiAocHJvcHMud2lubmVyLnByaXplSW1hZ2UgJiYgKHByb3BzLm1vZGUgPT09ICdmdWxsJyB8fCBwcm9wcy5tb2RlID09PSAnY2VsZWJyYXRpb24nKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByaXplLWltYWdlXCI+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJwcm9wcy53aW5uZXIucHJpemVJbWFnZVwiIFthbHRdPVwicHJvcHMud2lubmVyLnByaXplXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcml6ZS1kZXRhaWxzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJpemUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiZ2lmdC1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcml6ZS1sYWJlbFwiPnt7IGdldFByaXplTGFiZWwoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGgzIGNsYXNzPVwicHJpemUtbmFtZVwiPnt7IHByb3BzLndpbm5lci5wcml6ZSB9fTwvaDM+XG5cbiAgICAgICAgICAgIEBpZiAocHJvcHMud2lubmVyLnByaXplRGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwcml6ZS1kZXNjcmlwdGlvblwiPnt7IHByb3BzLndpbm5lci5wcml6ZURlc2NyaXB0aW9uIH19PC9wPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHByb3BzLnNob3dQcml6ZVZhbHVlICE9PSBmYWxzZSAmJiBwcm9wcy53aW5uZXIucHJpemVWYWx1ZSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJpemUtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICB7eyBmb3JtYXRQcml6ZVZhbHVlKCkgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi93aW5uZXItZGlzcGxheS5jb21wb25lbnQuc2NzcyddLFxufSlcbi8qKlxuICogdmFsLXdpbm5lci1kaXNwbGF5XG4gKlxuICogQSBjb21wb25lbnQgZm9yIGRpc3BsYXlpbmcgcmFmZmxlIHdpbm5lcnMgd2l0aCBjZWxlYnJhdGlvbiBhbmltYXRpb25zLlxuICpcbiAqIEBleGFtcGxlIEJhc2ljIHVzYWdlXG4gKiBgYGBodG1sXG4gKiA8dmFsLXdpbm5lci1kaXNwbGF5XG4gKiAgIFtwcm9wc109XCJ7XG4gKiAgICAgd2lubmVyOiB7XG4gKiAgICAgICBuYW1lOiAnSnVhbiBQw6lyZXonLFxuICogICAgICAgdGlja2V0TnVtYmVyOiA0MlxuICogICAgIH1cbiAqICAgfVwiXG4gKiA+PC92YWwtd2lubmVyLWRpc3BsYXk+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBGdWxsIGNlbGVicmF0aW9uIG1vZGVcbiAqIGBgYGh0bWxcbiAqIDx2YWwtd2lubmVyLWRpc3BsYXlcbiAqICAgW3Byb3BzXT1cIntcbiAqICAgICB3aW5uZXI6IHtcbiAqICAgICAgIG5hbWU6ICdNYXLDrWEgR2FyY8OtYScsXG4gKiAgICAgICB0aWNrZXROdW1iZXI6IDE1NixcbiAqICAgICAgIHByaXplOiAnaVBob25lIDE1IFBybycsXG4gKiAgICAgICBwcml6ZVZhbHVlOiAyNTAwMCxcbiAqICAgICAgIGxvY2F0aW9uOiAnQ0RNWCwgTcOpeGljbycsXG4gKiAgICAgICBhdmF0YXI6IHsgaW1hZ2U6ICdhdmF0YXIuanBnJyB9XG4gKiAgICAgfSxcbiAqICAgICBtb2RlOiAnY2VsZWJyYXRpb24nLFxuICogICAgIHNob3dDb25mZXR0aTogdHJ1ZSxcbiAqICAgICBhbmltYXRpb246ICd6b29tJyxcbiAqICAgICBjb2xvcjogJ3dhcm5pbmcnXG4gKiAgIH1cIlxuICogICAoYW5pbWF0aW9uQ29tcGxldGUpPVwib25SZXZlYWwoJGV2ZW50KVwiXG4gKiA+PC92YWwtd2lubmVyLWRpc3BsYXk+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFdpbm5lckRpc3BsYXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIHByb3BzOiBXaW5uZXJEaXNwbGF5TWV0YWRhdGE7XG5cbiAgQE91dHB1dCgpIGFuaW1hdGlvbkNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxXaW5uZXJEaXNwbGF5QW5pbWF0aW9uRXZlbnQ+KCk7XG5cbiAgaXNBbmltYXRpbmcgPSBmYWxzZTtcbiAgaXNSZXZlYWxlZCA9IGZhbHNlO1xuICBzaG93Q29uZmV0dGkgPSBmYWxzZTtcbiAgY29uZmV0dGlQaWVjZXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiA1MCB9LCAoXywgaSkgPT4gaSk7XG5cbiAgcHJpdmF0ZSByZXZlYWxUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFuaW1hdGlvblRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wcy5hdXRvUGxheSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuc3RhcnRSZXZlYWwoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gQWRkaXRpb25hbCBzZXR1cCBpZiBuZWVkZWRcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJldmVhbFRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLnJldmVhbFRpbWVvdXQpO1xuICAgIGlmICh0aGlzLmFuaW1hdGlvblRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLmFuaW1hdGlvblRpbWVvdXQpO1xuICB9XG5cbiAgc3RhcnRSZXZlYWwoKTogdm9pZCB7XG4gICAgY29uc3QgZGVsYXkgPSB0aGlzLnByb3BzLnJldmVhbERlbGF5IHx8IDA7XG5cbiAgICB0aGlzLnJldmVhbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuXG4gICAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMucHJvcHMuYW5pbWF0aW9uRHVyYXRpb24gfHwgODAwO1xuXG4gICAgICB0aGlzLmFuaW1hdGlvblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzUmV2ZWFsZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNob3dDb25mZXR0aSkge1xuICAgICAgICAgIHRoaXMuc2hvd0NvbmZldHRpID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uQ29tcGxldGUuZW1pdCh7XG4gICAgICAgICAgYW5pbWF0aW9uOiB0aGlzLnByb3BzLmFuaW1hdGlvbiB8fCAnZmFkZScsXG4gICAgICAgICAgd2lubmVyOiB0aGlzLnByb3BzLndpbm5lcixcbiAgICAgICAgfSk7XG4gICAgICB9LCBhbmltYXRpb25EdXJhdGlvbik7XG4gICAgfSwgZGVsYXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbnVhbGx5IHRyaWdnZXIgdGhlIHJldmVhbCBhbmltYXRpb24uXG4gICAqL1xuICByZXZlYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc1JldmVhbGVkID0gZmFsc2U7XG4gICAgdGhpcy5zaG93Q29uZmV0dGkgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0UmV2ZWFsKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdG8gaW5pdGlhbCBzdGF0ZS5cbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNBbmltYXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzUmV2ZWFsZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dDb25mZXR0aSA9IGZhbHNlO1xuICB9XG5cbiAgZm9ybWF0VGlja2V0TnVtYmVyKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbnVtID0gdGhpcy5wcm9wcy53aW5uZXIudGlja2V0TnVtYmVyO1xuICAgIGlmICh0aGlzLnByb3BzLm51bWJlclBhZGRpbmcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcobnVtKS5wYWRTdGFydCh0aGlzLnByb3BzLm51bWJlclBhZGRpbmcsICcwJyk7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcobnVtKTtcbiAgfVxuXG4gIGZvcm1hdFByaXplVmFsdWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucHJvcHMud2lubmVyLnByaXplVmFsdWUpIHJldHVybiAnJztcbiAgICByZXR1cm4gYCQke3RoaXMucHJvcHMud2lubmVyLnByaXplVmFsdWUudG9Mb2NhbGVTdHJpbmcoJ2VzLU1YJyl9YDtcbiAgfVxuXG4gIGdldFJhbmRvbVgoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAkeyhpbmRleCAqIDE3KSAlIDEwMH0lYDtcbiAgfVxuXG4gIGdldFJhbmRvbVJvdGF0aW9uKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHsoaW5kZXggKiAzNykgJSAzNjB9ZGVnYDtcbiAgfVxuXG4gIGdldFdpbm5lckxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMud2lubmVyTGFiZWwgfHwgREVGQVVMVF9XSU5ORVJfTEFCRUxTLndpbm5lcjtcbiAgfVxuXG4gIGdldFRpY2tldExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMudGlja2V0TGFiZWwgfHwgREVGQVVMVF9XSU5ORVJfTEFCRUxTLnRpY2tldDtcbiAgfVxuXG4gIGdldFByaXplTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5wcml6ZUxhYmVsIHx8IERFRkFVTFRfV0lOTkVSX0xBQkVMUy5wcml6ZTtcbiAgfVxuXG4gIGdldENvbG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucHJvcHMuY29sb3IpIHtcbiAgICAgIHJldHVybiBgdmFyKC0taW9uLWNvbG9yLSR7dGhpcy5wcm9wcy5jb2xvcn0pYDtcbiAgICB9XG4gICAgcmV0dXJuICd2YXIoLS1pb24tY29sb3Itd2FybmluZyknO1xuICB9XG59XG4iXX0=
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class LayoutComponent {
|
|
4
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: LayoutComponent, isStandalone: true, selector: "val-layout", ngImport: i0, template: `
|
|
6
|
-
<div class="layout-container">
|
|
7
|
-
<ng-content></ng-content>
|
|
8
|
-
</div>
|
|
9
|
-
`, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.layout-container{margin:0 auto;padding:0;width:100%;box-sizing:border-box;margin-bottom:1rem;padding-top:.5rem}@media (max-width: 768px){.layout-container{max-width:100%}}@media (min-width: 768px){.layout-container{margin:0 auto;max-width:33.75rem;margin-bottom:1.5rem}}@media (min-width: 1200px){.layout-container{margin:0 auto;max-width:45rem}}\n"] }); }
|
|
10
|
-
}
|
|
11
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LayoutComponent, decorators: [{
|
|
12
|
-
type: Component,
|
|
13
|
-
args: [{ selector: 'val-layout', standalone: true, imports: [], template: `
|
|
14
|
-
<div class="layout-container">
|
|
15
|
-
<ng-content></ng-content>
|
|
16
|
-
</div>
|
|
17
|
-
`, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.layout-container{margin:0 auto;padding:0;width:100%;box-sizing:border-box;margin-bottom:1rem;padding-top:.5rem}@media (max-width: 768px){.layout-container{max-width:100%}}@media (min-width: 768px){.layout-container{margin:0 auto;max-width:33.75rem;margin-bottom:1.5rem}}@media (min-width: 1200px){.layout-container{margin:0 auto;max-width:45rem}}\n"] }]
|
|
18
|
-
}] });
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy90ZW1wbGF0ZXMvbGF5b3V0L2xheW91dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFhMUMsTUFBTSxPQUFPLGVBQWU7K0dBQWYsZUFBZTttR0FBZixlQUFlLHNFQVBoQjs7OztHQUlUOzs0RkFHVSxlQUFlO2tCQVgzQixTQUFTOytCQUNFLFlBQVksY0FDVixJQUFJLFdBQ1AsRUFBRSxZQUNEOzs7O0dBSVQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWxheW91dCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtY29udGFpbmVyXCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsOiAnLi9sYXlvdXQuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBMYXlvdXRDb21wb25lbnQge31cbiJdfQ==
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from '@angular/core';
|
|
2
|
-
import { ParticipantCardMetadata, ParticipantCardClickEvent, ParticipantCardActionEvent, ParticipantTicket } from './types';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class ParticipantCardComponent {
|
|
5
|
-
props: ParticipantCardMetadata;
|
|
6
|
-
cardClick: EventEmitter<ParticipantCardClickEvent>;
|
|
7
|
-
actionClick: EventEmitter<ParticipantCardActionEvent>;
|
|
8
|
-
private i18n;
|
|
9
|
-
showAllTickets: boolean;
|
|
10
|
-
/** Get winner badge text */
|
|
11
|
-
getWinnerText(): string;
|
|
12
|
-
/** Get tickets count text */
|
|
13
|
-
getTicketsCountText(count: number): string;
|
|
14
|
-
/** Get more tickets text */
|
|
15
|
-
getMoreText(count: number): string;
|
|
16
|
-
/** Get notes label */
|
|
17
|
-
getNotesLabel(): string;
|
|
18
|
-
get ticketNumbers(): (number | ParticipantTicket)[];
|
|
19
|
-
get visibleTickets(): (number | ParticipantTicket)[];
|
|
20
|
-
get hiddenTicketsCount(): number;
|
|
21
|
-
formatTicketNumber(ticket: number | ParticipantTicket): string;
|
|
22
|
-
getTicketColor(ticket: number | ParticipantTicket): string;
|
|
23
|
-
isWinnerTicket(ticket: number | ParticipantTicket): boolean;
|
|
24
|
-
getPaymentStatusLabel(): string;
|
|
25
|
-
getPaymentStatusColor(): string;
|
|
26
|
-
getPaymentStatusIcon(): string;
|
|
27
|
-
formatCurrency(amount: number): string;
|
|
28
|
-
formatDate(date: Date | string): string;
|
|
29
|
-
toggleShowAllTickets(event: Event): void;
|
|
30
|
-
onCardClick(): void;
|
|
31
|
-
onActionsClick(event: Event): void;
|
|
32
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ParticipantCardComponent, never>;
|
|
33
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ParticipantCardComponent, "val-participant-card", never, { "props": { "alias": "props"; "required": false; }; }, { "cardClick": "cardClick"; "actionClick": "actionClick"; }, never, never, true, never>;
|
|
34
|
-
}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { Color } from '@ionic/core';
|
|
2
|
-
import { AvatarMetadata } from '../../atoms/avatar/types';
|
|
3
|
-
/**
|
|
4
|
-
* Participant payment status.
|
|
5
|
-
*/
|
|
6
|
-
export type ParticipantPaymentStatus = 'pending' | 'processing' | 'paid' | 'refunded' | 'failed';
|
|
7
|
-
/**
|
|
8
|
-
* Ticket info for participant.
|
|
9
|
-
*/
|
|
10
|
-
export interface ParticipantTicket {
|
|
11
|
-
/** Ticket number */
|
|
12
|
-
number: number;
|
|
13
|
-
/** Ticket status */
|
|
14
|
-
status: 'active' | 'reserved' | 'cancelled' | 'winner';
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Participant information.
|
|
18
|
-
*/
|
|
19
|
-
export interface ParticipantInfo {
|
|
20
|
-
/** Participant ID */
|
|
21
|
-
id: string | number;
|
|
22
|
-
/** Participant name */
|
|
23
|
-
name: string;
|
|
24
|
-
/** Participant email */
|
|
25
|
-
email?: string;
|
|
26
|
-
/** Participant phone */
|
|
27
|
-
phone?: string;
|
|
28
|
-
/** Avatar */
|
|
29
|
-
avatar?: AvatarMetadata;
|
|
30
|
-
/** Location */
|
|
31
|
-
location?: string;
|
|
32
|
-
/** Registration date */
|
|
33
|
-
registrationDate?: Date | string;
|
|
34
|
-
/** Tickets purchased */
|
|
35
|
-
tickets: ParticipantTicket[] | number[];
|
|
36
|
-
/** Payment status */
|
|
37
|
-
paymentStatus?: ParticipantPaymentStatus;
|
|
38
|
-
/** Total amount paid */
|
|
39
|
-
amountPaid?: number;
|
|
40
|
-
/** Notes */
|
|
41
|
-
notes?: string;
|
|
42
|
-
/** Is winner */
|
|
43
|
-
isWinner?: boolean;
|
|
44
|
-
/** Custom data */
|
|
45
|
-
customData?: Record<string, any>;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Metadata for the participant card component.
|
|
49
|
-
*/
|
|
50
|
-
export interface ParticipantCardMetadata {
|
|
51
|
-
/** Participant information */
|
|
52
|
-
participant: ParticipantInfo;
|
|
53
|
-
/** Card variant */
|
|
54
|
-
variant?: 'default' | 'compact' | 'detailed' | 'admin';
|
|
55
|
-
/** Size */
|
|
56
|
-
size?: 'small' | 'medium' | 'large';
|
|
57
|
-
/** Show avatar */
|
|
58
|
-
showAvatar?: boolean;
|
|
59
|
-
/** Show email */
|
|
60
|
-
showEmail?: boolean;
|
|
61
|
-
/** Show phone */
|
|
62
|
-
showPhone?: boolean;
|
|
63
|
-
/** Show tickets */
|
|
64
|
-
showTickets?: boolean;
|
|
65
|
-
/** Max tickets to show before collapsing */
|
|
66
|
-
maxTicketsVisible?: number;
|
|
67
|
-
/** Show payment status */
|
|
68
|
-
showPaymentStatus?: boolean;
|
|
69
|
-
/** Show amount */
|
|
70
|
-
showAmount?: boolean;
|
|
71
|
-
/** Show date */
|
|
72
|
-
showDate?: boolean;
|
|
73
|
-
/** Number padding for tickets */
|
|
74
|
-
numberPadding?: number;
|
|
75
|
-
/** Currency code */
|
|
76
|
-
currency?: string;
|
|
77
|
-
/** Currency symbol */
|
|
78
|
-
currencySymbol?: string;
|
|
79
|
-
/** Custom CSS class */
|
|
80
|
-
cssClass?: string;
|
|
81
|
-
/** Highlight if winner */
|
|
82
|
-
highlightWinner?: boolean;
|
|
83
|
-
/** Clickable card */
|
|
84
|
-
clickable?: boolean;
|
|
85
|
-
/** Show action menu */
|
|
86
|
-
showActions?: boolean;
|
|
87
|
-
/** Actions menu items */
|
|
88
|
-
actions?: ParticipantCardAction[];
|
|
89
|
-
/** Payment status labels */
|
|
90
|
-
paymentStatusLabels?: Partial<Record<ParticipantPaymentStatus, string>>;
|
|
91
|
-
/** Content class */
|
|
92
|
-
contentClass?: string;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Action item for participant card.
|
|
96
|
-
*/
|
|
97
|
-
export interface ParticipantCardAction {
|
|
98
|
-
/** Action ID */
|
|
99
|
-
id: string;
|
|
100
|
-
/** Action label */
|
|
101
|
-
label: string;
|
|
102
|
-
/** Action icon */
|
|
103
|
-
icon?: string;
|
|
104
|
-
/** Action color */
|
|
105
|
-
color?: Color;
|
|
106
|
-
/** Is destructive action */
|
|
107
|
-
destructive?: boolean;
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Event emitted when card is clicked.
|
|
111
|
-
*/
|
|
112
|
-
export interface ParticipantCardClickEvent {
|
|
113
|
-
/** Participant info */
|
|
114
|
-
participant: ParticipantInfo;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Event emitted when action is clicked.
|
|
118
|
-
*/
|
|
119
|
-
export interface ParticipantCardActionEvent {
|
|
120
|
-
/** Action ID */
|
|
121
|
-
actionId: string;
|
|
122
|
-
/** Participant info */
|
|
123
|
-
participant: ParticipantInfo;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Default payment status labels.
|
|
127
|
-
*/
|
|
128
|
-
export declare const DEFAULT_PAYMENT_STATUS_LABELS: Record<ParticipantPaymentStatus, string>;
|
|
129
|
-
/**
|
|
130
|
-
* Default payment status colors.
|
|
131
|
-
*/
|
|
132
|
-
export declare const DEFAULT_PAYMENT_STATUS_COLORS: Record<ParticipantPaymentStatus, Color>;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from '@angular/core';
|
|
2
|
-
import { RaffleStatusCardMetadata } from './types';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class RaffleStatusCardComponent {
|
|
5
|
-
props: RaffleStatusCardMetadata;
|
|
6
|
-
primaryActionClick: EventEmitter<void>;
|
|
7
|
-
secondaryActionClick: EventEmitter<void>;
|
|
8
|
-
get isActiveOrUpcoming(): boolean;
|
|
9
|
-
get progressPercentage(): number;
|
|
10
|
-
getStatusLabel(): string;
|
|
11
|
-
getStatusColor(): string;
|
|
12
|
-
getProgressColor(): string;
|
|
13
|
-
getTitle(): string;
|
|
14
|
-
getDescription(): string;
|
|
15
|
-
formatCurrency(amount: number): string;
|
|
16
|
-
formatDate(date: Date | string): string;
|
|
17
|
-
onPrimaryAction(): void;
|
|
18
|
-
onSecondaryAction(): void;
|
|
19
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<RaffleStatusCardComponent, never>;
|
|
20
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<RaffleStatusCardComponent, "val-raffle-status-card", never, { "props": { "alias": "props"; "required": false; }; }, { "primaryActionClick": "primaryActionClick"; "secondaryActionClick": "secondaryActionClick"; }, never, never, true, never>;
|
|
21
|
-
}
|