ngx-brevo 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 +103 -0
- package/fesm2022/ngx-brevo.mjs +5113 -0
- package/fesm2022/ngx-brevo.mjs.map +1 -0
- package/package.json +33 -0
- package/types/ngx-brevo.d.ts +384 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-brevo.mjs","sources":["../../../projects/ngx-brevo/src/lib/core/tokens/email-ops.tokens.ts","../../../projects/ngx-brevo/src/lib/providers/brevo/brevo.provider.ts","../../../projects/ngx-brevo/src/lib/core/interfaces/auth-provider.interface.ts","../../../projects/ngx-brevo/src/lib/providers/auth/default-auth.provider.ts","../../../projects/ngx-brevo/src/lib/index.ts","../../../projects/ngx-brevo/src/lib/api/email.service.ts","../../../projects/ngx-brevo/src/lib/features/template-list/template-list.component.ts","../../../projects/ngx-brevo/src/lib/monaco/monaco-editor.component.ts","../../../projects/ngx-brevo/src/lib/core/services/db.service.ts","../../../projects/ngx-brevo/src/lib/state/editor.store.ts","../../../projects/ngx-brevo/src/lib/features/versioning/version-history.component.ts","../../../projects/ngx-brevo/src/lib/core/services/theme.service.ts","../../../projects/ngx-brevo/src/lib/features/template-editor/template-editor.component.ts","../../../projects/ngx-brevo/src/lib/state/bulk.store.ts","../../../projects/ngx-brevo/src/lib/features/bulk-operations/bulk-status-panel.component.ts","../../../projects/ngx-brevo/src/lib/features/bulk-operations/bulk-operations-dashboard.component.ts","../../../projects/ngx-brevo/src/lib/features/dashboard/stats.component.ts","../../../projects/ngx-brevo/src/lib/state/auth.store.ts","../../../projects/ngx-brevo/src/lib/core/constants/index.ts","../../../projects/ngx-brevo/src/lib/features/auth/login.component.ts","../../../projects/ngx-brevo/src/lib/features/settings/settings.component.ts","../../../projects/ngx-brevo/src/lib/features/profile/profile.component.ts","../../../projects/ngx-brevo/src/lib/features/infrastructure/infrastructure.component.ts","../../../projects/ngx-brevo/src/lib/features/activity/activity-log.component.ts","../../../projects/ngx-brevo/src/lib/features/logs/log-list.component.ts","../../../projects/ngx-brevo/src/lib/ngx-brevo-dashboard.component.ts","../../../projects/ngx-brevo/src/lib/state/template.store.ts","../../../projects/ngx-brevo/src/lib/core/interceptors/error.interceptor.ts","../../../projects/ngx-brevo/src/lib/core/services/loader.service.ts","../../../projects/ngx-brevo/src/lib/core/interceptors/loader.interceptor.ts","../../../projects/ngx-brevo/src/lib/core/components/loader/loader.component.ts","../../../projects/ngx-brevo/src/ngx-brevo.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { EmailProvider } from '../interfaces/email-provider.interface';\n\nexport const EMAIL_PROVIDER = new InjectionToken<EmailProvider>('EMAIL_PROVIDER');\n\nexport interface EmailOpsConfig {\n provider: 'brevo' | 'sendgrid' | 'resend' | 'ses';\n apiKey: string;\n}\n\nexport const EMAIL_OPS_CONFIG = new InjectionToken<EmailOpsConfig>('EMAIL_OPS_CONFIG');\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { firstValueFrom } from 'rxjs';\nimport { EmailProvider, EmailTemplate, TemplateUpdatePayload, AccountInfo, EmailStats } from '../../core/interfaces/email-provider.interface';\nimport { EMAIL_OPS_CONFIG } from '../../core/tokens/email-ops.tokens';\n\n@Injectable()\nexport class BrevoProvider implements EmailProvider {\n private http = inject(HttpClient);\n private config = inject(EMAIL_OPS_CONFIG);\n private templatesUrl = 'https://api.brevo.com/v3/smtp/templates';\n private accountUrl = 'https://api.brevo.com/v3/account';\n private statsUrl = 'https://api.brevo.com/v3/smtp/statistics/reports';\n private logsUrl = 'https://api.brevo.com/v3/smtp/statistics/events';\n private sendersUrl = 'https://api.brevo.com/v3/senders';\n private webhooksUrl = 'https://api.brevo.com/v3/webhooks';\n private domainsUrl = 'https://api.brevo.com/v3/senders/domains';\n private processesUrl = 'https://api.brevo.com/v3/processes';\n private usersUrl = 'https://api.brevo.com/v3/organization/invited/users';\n private activitiesUrl = 'https://api.brevo.com/v3/organization/activities';\n\n private get headers() {\n return new HttpHeaders({\n 'api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n });\n }\n\n async listTemplates(): Promise<EmailTemplate[]> {\n const response: any = await firstValueFrom(\n this.http.get(`${this.templatesUrl}?limit=100&offset=0`, { headers: this.headers })\n );\n return (response.templates || []).map((t: any) => this.mapToInternal(t));\n }\n\n async getTemplate(id: string | number): Promise<EmailTemplate> {\n const response: any = await firstValueFrom(\n this.http.get(`${this.templatesUrl}/${id}`, { headers: this.headers })\n );\n return this.mapToInternal(response);\n }\n\n async updateTemplate(id: string | number, payload: TemplateUpdatePayload): Promise<EmailTemplate> {\n await firstValueFrom(\n this.http.put(`${this.templatesUrl}/${id}`, this.mapToBrevo(payload), { headers: this.headers })\n );\n return this.getTemplate(id);\n }\n\n async createTemplate(payload: Partial<EmailTemplate>): Promise<EmailTemplate> {\n const response: any = await firstValueFrom(\n this.http.post(this.templatesUrl, this.mapToBrevo(payload), { headers: this.headers })\n );\n return this.getTemplate(response.id);\n }\n\n async deleteTemplate(id: string | number): Promise<void> {\n await firstValueFrom(\n this.http.delete(`${this.templatesUrl}/${id}`, { headers: this.headers })\n );\n }\n\n async sendTestEmail(id: string | number, email: string): Promise<void> {\n await firstValueFrom(\n this.http.post(`${this.templatesUrl}/${id}/sendTest`, { emailTo: [email] }, { headers: this.headers })\n );\n }\n\n async getAccountInfo(): Promise<AccountInfo> {\n const response: any = await firstValueFrom(\n this.http.get(this.accountUrl, { headers: this.headers })\n );\n return {\n email: response.email,\n firstName: response.firstName,\n lastName: response.lastName,\n companyName: response.companyName,\n plan: response.plan\n };\n }\n\n async getStatistics(startDate?: string, endDate?: string): Promise<EmailStats> {\n // Default to last 7 days if not provided\n if (!startDate) {\n const d = new Date();\n d.setDate(d.getDate() - 30);\n startDate = d.toISOString().split('T')[0];\n }\n if (!endDate) {\n endDate = new Date().toISOString().split('T')[0];\n }\n \n const response: any = await firstValueFrom(\n this.http.get(`${this.statsUrl}?startDate=${startDate}&endDate=${endDate}`, { headers: this.headers })\n );\n \n const reports = response.reports || [];\n return reports.reduce((acc: EmailStats, curr: any) => ({\n requests: acc.requests + (curr.requests || 0),\n delivered: acc.delivered + (curr.delivered || 0),\n opened: acc.opened + (curr.opens || 0),\n uniqueOpens: acc.uniqueOpens + (curr.uniqueOpens || 0),\n clicked: acc.clicked + (curr.clicks || 0),\n uniqueClicks: acc.uniqueClicks + (curr.uniqueClicks || 0),\n complaints: acc.complaints + (curr.spamReports || 0),\n hardBounces: acc.hardBounces + (curr.hardBounces || 0),\n softBounces: acc.softBounces + (curr.softBounces || 0),\n blocked: acc.blocked + (curr.blocked || 0),\n unsubscribed: acc.unsubscribed + (curr.unsubscribed || 0)\n }), { \n requests: 0, delivered: 0, opened: 0, uniqueOpens: 0, \n clicked: 0, uniqueClicks: 0, complaints: 0, hardBounces: 0, \n softBounces: 0, blocked: 0, unsubscribed: 0 \n });\n }\n\n async getSmtpLogs(limit: number = 50, offset: number = 0, event?: string): Promise<any[]> {\n let url = `${this.logsUrl}?limit=${limit}&offset=${offset}&sort=desc`;\n if (event) url += `&event=${event}`;\n \n const response: any = await firstValueFrom(\n this.http.get(url, { headers: this.headers })\n );\n return response.events || [];\n }\n\n async getSenders(): Promise<any[]> {\n const response: any = await firstValueFrom(\n this.http.get(this.sendersUrl, { headers: this.headers })\n );\n return response.senders || [];\n }\n\n async createSender(sender: any): Promise<any> {\n return firstValueFrom(\n this.http.post(this.sendersUrl, sender, { headers: this.headers })\n );\n }\n\n async getDomains(): Promise<any[]> {\n const response: any = await firstValueFrom(\n this.http.get(this.domainsUrl, { headers: this.headers })\n );\n return response.domains || [];\n }\n\n async getWebhooks(): Promise<any[]> {\n const response: any = await firstValueFrom(\n this.http.get(this.webhooksUrl, { headers: this.headers })\n );\n return response.webhooks || [];\n }\n\n async getProcesses(): Promise<any[]> {\n const response: any = await firstValueFrom(\n this.http.get(this.processesUrl, { headers: this.headers })\n );\n return response.processes || [];\n }\n\n async getUsers(): Promise<any[]> {\n const response: any = await firstValueFrom(\n this.http.get(this.usersUrl, { headers: this.headers })\n );\n return response.users || [];\n }\n\n async getOrganizationActivities(startDate?: string, endDate?: string, limit: number = 50): Promise<any[]> {\n let url = `${this.activitiesUrl}?limit=${limit}&offset=0`;\n if (startDate) url += `&startDate=${startDate}`;\n if (endDate) url += `&endDate=${endDate}`;\n \n const response: any = await firstValueFrom(\n this.http.get(url, { headers: this.headers })\n );\n return response.activities || [];\n }\n\n private mapToInternal(t: any): EmailTemplate {\n return {\n id: t.id,\n name: t.name,\n subject: t.subject,\n sender: t.sender,\n htmlContent: t.htmlContent,\n isActive: t.isActive,\n createdAt: t.createdAt,\n updatedAt: t.updatedAt,\n tags: t.tag ? [t.tag] : [],\n };\n }\n\n private mapToBrevo(p: any): any {\n const brevoPayload: any = {};\n if (p.name) brevoPayload.name = p.name;\n if (p.subject) brevoPayload.subject = p.subject;\n if (p.sender) brevoPayload.sender = p.sender;\n if (p.htmlContent) brevoPayload.htmlContent = p.htmlContent;\n if (p.isActive !== undefined) brevoPayload.isActive = p.isActive;\n return brevoPayload;\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface AuthCredentials {\n username?: string;\n password?: string;\n [key: string]: any;\n}\n\nexport interface AuthResponse {\n success: boolean;\n user?: any;\n error?: string;\n}\n\nexport interface AuthProvider {\n login(credentials: AuthCredentials): Promise<AuthResponse>;\n logout(): Promise<void>;\n isAuthenticated(): Promise<boolean>;\n}\n\nexport const AUTH_PROVIDER = new InjectionToken<AuthProvider>('AUTH_PROVIDER');\n\nexport interface AuthConfig {\n enabled: boolean;\n defaultCredentials?: {\n username: string;\n password: string;\n };\n}\n\nexport const AUTH_CONFIG = new InjectionToken<AuthConfig>('AUTH_CONFIG');\n","import { Injectable, inject } from '@angular/core';\nimport { AuthProvider, AuthCredentials, AuthResponse, AUTH_CONFIG } from '../../core/interfaces/auth-provider.interface';\n\n@Injectable()\nexport class DefaultAuthProvider implements AuthProvider {\n private config = inject(AUTH_CONFIG);\n\n async login(credentials: AuthCredentials): Promise<AuthResponse> {\n const { username, password } = credentials;\n const defaultCreds = this.config.defaultCredentials || { username: 'admin', password: 'password' };\n\n if (username === defaultCreds.username && password === defaultCreds.password) {\n return { success: true, user: { name: 'Admin User' } };\n }\n\n return { success: false, error: 'Invalid username or password' };\n }\n\n async logout(): Promise<void> {\n return Promise.resolve();\n }\n\n async isAuthenticated(): Promise<boolean> {\n return Promise.resolve(false); // Initial state\n }\n}\n","import { Provider } from '@angular/core';\nimport { EMAIL_OPS_CONFIG, EMAIL_PROVIDER, EmailOpsConfig } from './core/tokens/email-ops.tokens';\nimport { BrevoProvider } from './providers/brevo/brevo.provider';\nimport { AUTH_CONFIG, AUTH_PROVIDER, AuthConfig } from './core/interfaces/auth-provider.interface';\nimport { DefaultAuthProvider } from './providers/auth/default-auth.provider';\n\nexport interface EmailOpsRootConfig extends EmailOpsConfig {\n auth?: AuthConfig;\n}\n\nexport function provideEmailOps(config: EmailOpsRootConfig): Provider[] {\n const providers: Provider[] = [\n { provide: EMAIL_OPS_CONFIG, useValue: config },\n ];\n\n if (config.auth) {\n providers.push({ provide: AUTH_CONFIG, useValue: config.auth });\n providers.push({ provide: AUTH_PROVIDER, useClass: DefaultAuthProvider });\n }\n\n if (config.provider === 'brevo') {\n providers.push({ provide: EMAIL_PROVIDER, useClass: BrevoProvider });\n } else {\n throw new Error(`Provider ${config.provider} is not implemented yet.`);\n }\n\n return providers;\n}\n","import { Injectable, inject } from '@angular/core';\nimport { EMAIL_PROVIDER } from '../core/tokens/email-ops.tokens';\nimport { EmailTemplate, TemplateUpdatePayload, AccountInfo, EmailStats } from '../core/interfaces/email-provider.interface';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EmailService {\n private provider = inject(EMAIL_PROVIDER);\n\n async listTemplates() {\n return this.provider.listTemplates();\n }\n\n async getTemplate(id: string | number) {\n return this.provider.getTemplate(id);\n }\n\n async updateTemplate(id: string | number, payload: TemplateUpdatePayload) {\n return this.provider.updateTemplate(id, payload);\n }\n\n async createTemplate(payload: Partial<EmailTemplate>) {\n return this.provider.createTemplate(payload);\n }\n\n async deleteTemplate(id: string | number) {\n return this.provider.deleteTemplate(id);\n }\n\n async sendTestEmail(id: string | number, email: string) {\n return this.provider.sendTestEmail(id, email);\n }\n\n async getAccountInfo(): Promise<AccountInfo> {\n return this.provider.getAccountInfo();\n }\n\n async getStatistics(startDate?: string, endDate?: string): Promise<EmailStats> {\n return this.provider.getStatistics(startDate, endDate);\n }\n\n async getSmtpLogs(limit?: number, offset?: number, event?: string) {\n return this.provider.getSmtpLogs(limit, offset, event);\n }\n\n async getSenders() {\n return this.provider.getSenders();\n }\n\n async createSender(sender: any) {\n return this.provider.createSender(sender);\n }\n\n async getDomains() {\n return this.provider.getDomains();\n }\n\n async getWebhooks() {\n return this.provider.getWebhooks();\n }\n\n async getProcesses() {\n return this.provider.getProcesses();\n }\n\n async getUsers() {\n return this.provider.getUsers();\n }\n\n async getOrganizationActivities(startDate?: string, endDate?: string, limit?: number) {\n return this.provider.getOrganizationActivities(startDate, endDate, limit);\n }\n}\n","import { Component, OnInit, inject, signal, Output, EventEmitter, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { EmailService } from '../../api/email.service';\nimport { EmailTemplate } from '../../core/interfaces/email-provider.interface';\n\n// PrimeNG Imports\nimport { TableModule } from 'primeng/table';\nimport { ButtonModule } from 'primeng/button';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { TagModule } from 'primeng/tag';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { SkeletonModule } from 'primeng/skeleton';\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { CheckboxModule } from 'primeng/checkbox';\n\n@Component({\n selector: 'lib-template-list',\n standalone: true,\n imports: [\n CommonModule, \n FormsModule, \n TableModule, \n ButtonModule, \n InputTextModule, \n TagModule, \n TooltipModule, \n SkeletonModule,\n IconFieldModule,\n InputIconModule,\n CheckboxModule\n ],\n template: `\n <div class=\"max-w-[1400px] mx-auto animate-in fade-in slide-in-from-bottom-4 duration-700\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden\">\n <!-- Header -->\n <div class=\"p-8 border-b border-slate-50 dark:border-slate-800/50\">\n <div class=\"flex flex-col md:flex-row md:items-center justify-between gap-6\">\n <div>\n <div class=\"flex items-center gap-3 mb-2\">\n <div class=\"w-10 h-10 bg-blue-50 dark:bg-blue-900/30 rounded-xl flex items-center justify-center text-blue-600\">\n <i class=\"pi pi-envelope text-xl\"></i>\n </div>\n <h1 class=\"text-3xl font-black text-slate-900 dark:text-white tracking-tighter m-0\">Campaign Library</h1>\n </div>\n <p class=\"text-sm text-slate-500 dark:text-slate-400 font-bold m-0 uppercase tracking-widest ml-13\">\n <span class=\"text-blue-600 dark:text-blue-400\">{{ templates().length }}</span> total templates registered\n </p>\n </div>\n\n <div class=\"flex items-center gap-4\">\n <div class=\"relative w-full md:w-72 group\">\n <i class=\"pi pi-search absolute left-4 top-1/2 -translate-y-1/2 text-slate-400 group-focus-within:text-blue-600 transition-colors\"></i>\n <input \n type=\"text\" \n pInputText \n placeholder=\"Search templates...\" \n [(ngModel)]=\"searchQuery\" \n class=\"w-full bg-slate-100 dark:bg-slate-950 border-none rounded-2xl py-3 pl-12 pr-4 text-sm font-black text-slate-900 dark:text-white focus:ring-4 focus:ring-blue-500/10 transition-all outline-none\" \n />\n </div>\n <p-button label=\"New\" icon=\"pi pi-plus\" styleClass=\"bg-blue-600 border-none rounded-2xl font-black text-xs px-6 py-3 shadow-lg shadow-blue-500/20 hover:scale-105 transition-all\"></p-button>\n </div>\n </div>\n </div>\n\n <!-- Table -->\n <div class=\"p-2\">\n <p-table \n [value]=\"filteredTemplates()\" \n [paginator]=\"true\" \n [rows]=\"10\" \n [loading]=\"loading()\"\n styleClass=\"p-datatable-modern w-full\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"Showing {first} to {last} of {totalRecords}\"\n [rowsPerPageOptions]=\"[10, 25, 50]\">\n \n <ng-template pTemplate=\"header\">\n <tr class=\"border-b border-slate-50 dark:border-slate-800/50\">\n <th class=\"px-6 py-4\" style=\"width: 4rem\"><p-checkbox [binary]=\"true\" styleClass=\"scale-90\"></p-checkbox></th>\n <th pSortableColumn=\"name\" class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left cursor-pointer hover:text-blue-600 transition-colors\">\n Name <p-sortIcon field=\"name\"></p-sortIcon>\n </th>\n <th pSortableColumn=\"subject\" class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left cursor-pointer hover:text-blue-600 transition-colors\">\n Subject <p-sortIcon field=\"subject\"></p-sortIcon>\n </th>\n <th pSortableColumn=\"active\" class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left cursor-pointer hover:text-blue-600 transition-colors\" style=\"width: 10rem\">\n Status <p-sortIcon field=\"active\"></p-sortIcon>\n </th>\n <th pSortableColumn=\"modifiedAt\" class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left cursor-pointer hover:text-blue-600 transition-colors\" style=\"width: 12rem\">\n Last Modified <p-sortIcon field=\"modifiedAt\"></p-sortIcon>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-template>\n <tr class=\"group hover:bg-slate-50 dark:hover:bg-slate-800/40 transition-colors cursor-pointer border-b border-slate-50/50 dark:border-slate-800/30\" (click)=\"editTemplate.emit(template.id)\">\n <td class=\"px-6 py-5\"><p-checkbox [binary]=\"true\" (click)=\"$event.stopPropagation()\" styleClass=\"scale-90 opacity-40 group-hover:opacity-100 transition-opacity\"></p-checkbox></td>\n <td class=\"px-6 py-5\">\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight group-hover:text-blue-600 transition-colors\">{{ template.name }}</span>\n </td>\n <td class=\"px-6 py-5\">\n <span class=\"text-xs font-bold text-slate-500 dark:text-slate-400 line-clamp-1\">{{ template.subject || 'No subject defined' }}</span>\n </td>\n <td class=\"px-6 py-5\">\n <div class=\"inline-flex items-center gap-2 px-3 py-1 rounded-full text-[10px] font-black tracking-widest\" \n [ngClass]=\"template.active ? 'bg-emerald-50 dark:bg-emerald-950/30 text-emerald-600 dark:text-emerald-400' : 'bg-slate-100 dark:bg-slate-800 text-slate-500'\">\n <div class=\"w-1.5 h-1.5 rounded-full\" [ngClass]=\"template.active ? 'bg-emerald-500 animate-pulse' : 'bg-slate-400'\"></div>\n <span>{{ template.active ? 'ACTIVE' : 'DRAFT' }}</span>\n </div>\n </td>\n <td class=\"px-6 py-5\">\n <span class=\"text-xs font-bold text-slate-400 dark:text-slate-500\">{{ (template.createdAt | date:'mediumDate') || 'Oct 24, 2023' }}</span>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n @for (i of [1,2,3,4,5]; track i) {\n <tr class=\"border-b border-slate-50/50 dark:border-slate-800/30\">\n <td class=\"px-6 py-5\"><p-skeleton width=\"1.5rem\" height=\"1.5rem\" borderRadius=\"4px\"></p-skeleton></td>\n <td class=\"px-6 py-5\"><p-skeleton width=\"70%\" borderRadius=\"8px\"></p-skeleton></td>\n <td class=\"px-6 py-5\"><p-skeleton width=\"90%\" borderRadius=\"8px\"></p-skeleton></td>\n <td class=\"px-6 py-5\"><p-skeleton width=\"4rem\" height=\"1.5rem\" borderRadius=\"20px\"></p-skeleton></td>\n <td class=\"px-6 py-5\"><p-skeleton width=\"5rem\" borderRadius=\"8px\"></p-skeleton></td>\n </tr>\n }\n </ng-template>\n </p-table>\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; }\n :host ::ng-deep .p-paginator {\n background: transparent !important;\n border: none !important;\n padding: 2rem !important;\n justify-content: flex-end !important;\n font-family: 'Inter', sans-serif !important;\n }\n :host ::ng-deep .p-paginator .p-paginator-current {\n font-size: 11px !important;\n font-weight: 900 !important;\n text-transform: uppercase !important;\n letter-spacing: 0.1em !important;\n color: #94a3b8 !important;\n margin-right: auto !important;\n }\n :host ::ng-deep .p-paginator button {\n border-radius: 12px !important;\n min-width: 2.5rem !important;\n height: 2.5rem !important;\n font-weight: 800 !important;\n transition: all 0.2s !important;\n }\n :host ::ng-deep .p-paginator .p-highlight {\n background: #2563eb !important;\n color: white !important;\n box-shadow: 0 4px 12px rgba(37, 99, 235, 0.2) !important;\n }\n :host ::ng-deep .p-datatable-loading-overlay {\n background: rgba(255,255,255,0.7) !important;\n }\n .dark :host ::ng-deep .p-datatable-loading-overlay {\n background: rgba(15,23,42,0.7) !important;\n }\n `]\n})\nexport class TemplateListComponent implements OnInit {\n private emailService = inject(EmailService);\n @Output() editTemplate = new EventEmitter<string | number>();\n\n templates = signal<EmailTemplate[]>([]);\n loading = signal(true);\n searchQuery = '';\n\n filteredTemplates = computed(() => {\n const q = this.searchQuery.toLowerCase();\n return this.templates().filter(t => \n t.name.toLowerCase().includes(q) || \n (t.subject?.toLowerCase().includes(q))\n );\n });\n\n async ngOnInit() {\n this.loading.set(true);\n try {\n const data = await this.emailService.listTemplates();\n this.templates.set(data);\n } catch (e) {\n console.error('Failed to load templates', e);\n } finally {\n this.loading.set(false);\n }\n }\n}\n","import { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\n\ndeclare var monaco: any;\n\n@Component({\n selector: 'lib-monaco-editor',\n standalone: true,\n template: `<div #editorContainer class=\"editor-container\"></div>`,\n styles: [`\n .editor-container {\n width: 100%;\n height: 100%;\n border: 1px solid #eee;\n }\n `]\n})\nexport class MonacoEditorComponent implements OnInit, OnDestroy {\n @ViewChild('editorContainer', { static: true }) editorContainer!: ElementRef;\n \n @Input() value: string = '';\n @Input() language: string = 'html';\n @Output() valueChange = new EventEmitter<string>();\n\n private editor: any;\n\n ngOnInit() {\n this.initMonaco();\n }\n\n private initMonaco() {\n // Check if monaco is already loaded, otherwise load from CDN\n if (typeof monaco !== 'undefined') {\n this.createEditor();\n } else {\n const loader = document.createElement('script');\n loader.src = 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.44.0/min/vs/loader.min.js';\n loader.onload = () => {\n (window as any).require.config({ paths: { vs: 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.44.0/min/vs' } });\n (window as any).require(['vs/editor/editor.main'], () => {\n this.createEditor();\n });\n };\n document.body.appendChild(loader);\n }\n }\n\n private createEditor() {\n this.editor = monaco.editor.create(this.editorContainer.nativeElement, {\n value: this.value,\n language: this.language,\n theme: 'vs',\n automaticLayout: true,\n minimap: { enabled: false },\n fontSize: 13,\n lineHeight: 20,\n fontFamily: 'Menlo, Monaco, \"Courier New\", monospace',\n scrollBeyondLastLine: false,\n });\n\n this.editor.onDidChangeModelContent(() => {\n const newValue = this.editor.getValue();\n this.valueChange.emit(newValue);\n });\n }\n\n ngOnDestroy() {\n if (this.editor) {\n this.editor.dispose();\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport Dexie, { Table } from 'dexie';\n\nexport interface AppConfig {\n id?: number;\n provider: string;\n apiKey: string;\n autoSave: boolean;\n debug: boolean;\n lastUpdated: number;\n}\n\nexport interface TemplateVersion {\n id?: number;\n templateId: string | number;\n htmlContent: string;\n subject: string;\n version: number;\n timestamp: number;\n note?: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DbService extends Dexie {\n configs!: Table<AppConfig>;\n versions!: Table<TemplateVersion>;\n\n constructor() {\n super('NgxBrevoDB');\n this.version(1).stores({\n configs: '++id, provider',\n versions: '++id, templateId, version, timestamp'\n });\n }\n\n async getConfig(): Promise<AppConfig | undefined> {\n return await this.configs.toCollection().last();\n }\n\n async saveConfig(config: AppConfig): Promise<void> {\n await this.configs.clear();\n await this.configs.add({\n ...config,\n lastUpdated: Date.now()\n });\n }\n\n async addVersion(version: TemplateVersion): Promise<void> {\n await this.versions.add(version);\n }\n\n async getVersions(templateId: string | number): Promise<TemplateVersion[]> {\n return await this.versions\n .where('templateId')\n .equals(templateId)\n .reverse()\n .sortBy('timestamp');\n }\n}\n","import { Injectable, signal, computed, inject } from '@angular/core';\nimport { EmailTemplate } from '../core/interfaces/email-provider.interface';\nimport { EmailService } from '../api/email.service';\nimport { DbService } from '../core/services/db.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EditorStore {\n private emailService = inject(EmailService);\n private db = inject(DbService);\n\n // State\n private _activeTemplate = signal<EmailTemplate | null>(null);\n private _view = signal<'code' | 'preview'>('code');\n private _previewMode = signal<'desktop' | 'mobile'>('desktop');\n private _saving = signal<boolean>(false);\n\n // Selectors\n activeTemplate = computed(() => this._activeTemplate());\n view = computed(() => this._view());\n previewMode = computed(() => this._previewMode());\n saving = computed(() => this._saving());\n\n detectedVariables = computed(() => {\n const html = this._activeTemplate()?.htmlContent || '';\n const regex = /\\{\\{\\s*([\\w.]+)\\s*\\}\\}/g;\n const vars = new Set<string>();\n let match;\n while ((match = regex.exec(html)) !== null) {\n vars.add(match[1]);\n }\n return Array.from(vars);\n });\n\n // Actions\n async loadTemplate(id: string | number) {\n const data = await this.emailService.getTemplate(id);\n this._activeTemplate.set(data);\n }\n\n updateHtml(html: string) {\n this._activeTemplate.update(t => t ? { ...t, htmlContent: html } : null);\n }\n\n updateFields(fields: Partial<EmailTemplate>) {\n this._activeTemplate.update(t => t ? { ...t, ...fields } : null);\n }\n\n setView(view: 'code' | 'preview') {\n this._view.set(view);\n }\n\n setPreviewMode(mode: 'desktop' | 'mobile') {\n this._previewMode.set(mode);\n }\n\n async save() {\n const t = this._activeTemplate();\n if (!t) return;\n \n this._saving.set(true);\n try {\n // Save to provider\n await this.emailService.updateTemplate(t.id, t);\n \n // Save version to local DB\n await this.db.addVersion({\n templateId: t.id,\n htmlContent: t.htmlContent,\n subject: t.subject,\n version: Date.now(), // Use timestamp as version for now\n timestamp: Date.now()\n });\n \n } finally {\n this._saving.set(false);\n }\n }\n}\n","import { Component, Input, OnInit, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DbService, TemplateVersion } from '../../core/services/db.service';\nimport { EditorStore } from '../../state/editor.store';\n\n// PrimeNG Imports\nimport { TimelineModule } from 'primeng/timeline';\nimport { ButtonModule } from 'primeng/button';\nimport { CardModule } from 'primeng/card';\nimport { TagModule } from 'primeng/tag';\n\n@Component({\n selector: 'lib-version-history',\n standalone: true,\n imports: [CommonModule, TimelineModule, ButtonModule, CardModule, TagModule],\n template: `\n <div class=\"version-container mt-4\">\n <h3 class=\"text-xs font-bold uppercase tracking-widest text-500 mb-3 px-2\">Local Version History</h3>\n \n @if (versions().length > 0) {\n <p-timeline [value]=\"versions()\" styleClass=\"w-full\">\n <ng-template pTemplate=\"content\" let-v>\n <div class=\"flex flex-column mb-4 cursor-pointer hover:surface-100 p-2 border-round transition-colors\" (click)=\"restore(v)\">\n <div class=\"flex align-items-center gap-2 mb-1\">\n <p-tag [value]=\"'v' + (v.timestamp | date:'HH:mm')\" severity=\"info\" [rounded]=\"true\"></p-tag>\n <span class=\"text-[10px] text-500 font-bold uppercase\">{{ v.timestamp | date:'MMM d' }}</span>\n </div>\n <div class=\"text-[11px] text-700 italic truncate max-w-[150px] pl-1\">\n {{ v.subject }}\n </div>\n </div>\n </ng-template>\n </p-timeline>\n } @else {\n <div class=\"text-center p-4 border-2 border-dashed border-round surface-border\">\n <p class=\"text-xs text-500\">No local versions yet. Save changes to create an archive.</p>\n </div>\n }\n </div>\n `,\n styles: [`\n :host ::ng-deep .p-timeline-event-content {\n padding: 0 1rem;\n }\n :host ::ng-deep .p-timeline-event-opposite {\n display: none;\n }\n `]\n})\nexport class VersionHistoryComponent implements OnInit {\n @Input() templateId!: string | number;\n \n private db = inject(DbService);\n private store = inject(EditorStore);\n \n versions = signal<TemplateVersion[]>([]);\n\n async ngOnInit() {\n await this.loadVersions();\n }\n\n async loadVersions() {\n const data = await this.db.getVersions(this.templateId);\n this.versions.set(data);\n }\n\n restore(version: TemplateVersion) {\n if (confirm('Restore this version to the editor? (Current unsaved changes will be lost)')) {\n this.store.updateHtml(version.htmlContent);\n this.store.updateFields({ subject: version.subject });\n }\n }\n}\n","import { Injectable, signal, effect, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeService {\n private platformId = inject(PLATFORM_ID);\n \n // Prefer dark mode by default as requested\n theme = signal<'light' | 'dark'>('dark');\n\n constructor() {\n if (isPlatformBrowser(this.platformId)) {\n // Load saved theme if exists, otherwise default to dark\n const saved = localStorage.getItem('theme') as 'light' | 'dark';\n if (saved) {\n this.theme.set(saved);\n }\n \n // Update DOM on change\n effect(() => {\n const current = this.theme();\n localStorage.setItem('theme', current);\n if (current === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n });\n }\n }\n\n toggle() {\n this.theme.update(t => t === 'dark' ? 'light' : 'dark');\n }\n}\n","import { Component, Input, OnInit, inject, HostListener, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { FormsModule } from '@angular/forms';\nimport { MonacoEditorComponent } from '../../monaco/monaco-editor.component';\nimport { EditorStore } from '../../state/editor.store';\nimport { VersionHistoryComponent } from '../versioning/version-history.component';\nimport { EmailService } from '../../api/email.service';\nimport { ThemeService } from '../../core/services/theme.service';\n\n// PrimeNG v18+ Imports\nimport { SplitterModule } from 'primeng/splitter';\nimport { PanelModule } from 'primeng/panel';\nimport { ButtonModule } from 'primeng/button';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { DividerModule } from 'primeng/divider';\nimport { SelectButtonModule } from 'primeng/selectbutton';\nimport { TabsModule } from 'primeng/tabs';\n\n@Component({\n selector: 'lib-template-editor',\n standalone: true,\n imports: [\n CommonModule, \n FormsModule, \n MonacoEditorComponent, \n VersionHistoryComponent,\n SplitterModule,\n PanelModule,\n ButtonModule,\n InputTextModule,\n DividerModule,\n SelectButtonModule,\n TabsModule\n ],\n template: `\n @if (store.activeTemplate(); as t) {\n <div \n class=\"flex flex-col border border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-900 shadow-sm animate-in fade-in duration-500\"\n [class.h-screen]=\"mobileMode()\"\n [class.h-[calc(100vh-12rem)]]=\"!mobileMode()\"\n [class.rounded-3xl]=\"!mobileMode()\"\n [class.overflow-hidden]=\"true\"\n >\n \n <!-- Mobile Header Controls -->\n @if (mobileMode()) {\n <div class=\"p-4 bg-slate-50 dark:bg-slate-950 flex justify-between items-center border-b border-slate-200 dark:border-slate-800\">\n <p-selectButton \n [options]=\"mobileViewOptions\" \n [(ngModel)]=\"activeMobileTab\" \n optionLabel=\"label\" \n optionValue=\"value\"\n styleClass=\"p-selectbutton-sm rounded-xl\"\n ></p-selectButton>\n <p-button icon=\"pi pi-save\" (click)=\"save()\" [loading]=\"store.saving()\" styleClass=\"rounded-xl\"></p-button>\n </div>\n }\n\n @if (!mobileMode()) {\n <p-splitter [panelSizes]=\"[28, 72]\" [style]=\"{ height: '100%' }\" styleClass=\"border-none dark:bg-slate-900\">\n <!-- Left: Config Sidebar -->\n <ng-template pTemplate>\n <ng-container *ngTemplateOutlet=\"configSidebar\"></ng-container>\n </ng-template>\n\n <!-- Right: Editor & Preview -->\n <ng-template pTemplate>\n <ng-container *ngTemplateOutlet=\"workspaceArea\"></ng-container>\n </ng-template>\n </p-splitter>\n } @else {\n <div class=\"flex-1 overflow-hidden\">\n @if (activeMobileTab() === 'config') {\n <div class=\"h-full overflow-auto custom-scrollbar\">\n <ng-container *ngTemplateOutlet=\"configSidebar\"></ng-container>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"workspaceArea\"></ng-container>\n }\n </div>\n }\n\n <!-- Reusable Templates -->\n <ng-template #configSidebar>\n <div class=\"bg-slate-50 dark:bg-slate-950/50 p-6 overflow-y-auto w-full h-full custom-scrollbar flex flex-col gap-6\">\n <p-panel header=\"Campaign Identity\" [toggleable]=\"true\" styleClass=\"outreach-panel\">\n <div class=\"flex flex-col gap-5 pt-2\">\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest ml-1\">Template Name</label>\n <input pInputText type=\"text\" [ngModel]=\"t.name\" (ngModelChange)=\"updateFields({name: $event})\" class=\"w-full px-4 py-3 bg-white dark:bg-slate-900 border-slate-200 dark:border-slate-800 rounded-xl font-bold text-sm\" />\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest ml-1\">Subject Line</label>\n <input pInputText type=\"text\" [ngModel]=\"t.subject\" (ngModelChange)=\"updateFields({subject: $event})\" class=\"w-full px-4 py-3 bg-white dark:bg-slate-900 border-slate-200 dark:border-slate-800 rounded-xl font-bold text-sm\" />\n </div>\n </div>\n </p-panel>\n\n <p-panel header=\"Sender Protocol\" [toggleable]=\"true\" styleClass=\"outreach-panel\">\n <div class=\"flex flex-col gap-4 pt-2\">\n <input pInputText type=\"text\" [ngModel]=\"t.sender.name\" (ngModelChange)=\"updateSender('name', $event)\" placeholder=\"Sender Name\" class=\"w-full px-4 py-3 bg-white dark:bg-slate-900 border-slate-200 dark:border-slate-800 rounded-xl font-bold text-sm\" />\n <input pInputText type=\"email\" [ngModel]=\"t.sender.email\" (ngModelChange)=\"updateSender('email', $event)\" placeholder=\"Sender Email\" class=\"w-full px-4 py-3 bg-white dark:bg-slate-900 border-slate-200 dark:border-slate-800 rounded-xl font-bold text-sm\" />\n </div>\n </p-panel>\n\n <p-panel header=\"Dynamic Tokens\" [toggleable]=\"true\" styleClass=\"outreach-panel\">\n <div class=\"flex flex-wrap gap-2 pt-2\">\n @for (v of store.detectedVariables(); track v) {\n <span class=\"inline-flex items-center px-3 py-1.5 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg text-[10px] font-black font-mono text-blue-600 dark:text-blue-400 shadow-sm\">\n {{ '{{' }} {{ v }} {{ '}}' }}\n </span>\n } @empty {\n <div class=\"text-[10px] font-black text-slate-400 dark:text-slate-600 uppercase tracking-widest\">No tokens detected</div>\n }\n </div>\n </p-panel>\n\n <div class=\"mt-auto pt-6 sticky bottom-0 bg-slate-50 dark:bg-slate-950 py-4 border-t border-slate-200 dark:border-slate-800\">\n <p-button label=\"Commit Changes\" icon=\"pi pi-save\" [loading]=\"store.saving()\" (click)=\"save()\" styleClass=\"w-full py-4 rounded-2xl font-black bg-blue-600 hover:bg-blue-700 border-none shadow-xl shadow-blue-500/20 transition-all\"></p-button>\n <p-button label=\"Send Test Blast\" icon=\"pi pi-send\" [text]=\"true\" (click)=\"sendTest()\" styleClass=\"w-full mt-3 font-black text-xs text-slate-500 dark:text-slate-400 hover:bg-slate-200/50 dark:hover:bg-slate-800 rounded-xl transition-all\"></p-button>\n </div>\n\n <lib-version-history [templateId]=\"t.id\"></lib-version-history>\n </div>\n </ng-template>\n\n <ng-template #workspaceArea>\n <div class=\"flex-1 flex flex-col h-full bg-white dark:bg-slate-900 overflow-hidden\">\n <div class=\"flex items-center justify-center p-3 border-b border-slate-100 dark:border-slate-800 shrink-0\">\n <p-selectButton \n [options]=\"viewOptions\" \n [ngModel]=\"store.view()\" \n (ngModelChange)=\"store.setView($event)\" \n optionLabel=\"label\" \n optionValue=\"value\"\n styleClass=\"p-selectbutton-sm rounded-xl\"\n ></p-selectButton>\n </div>\n\n <div class=\"flex-1 overflow-hidden relative\">\n @if (store.view() === 'code') {\n <lib-monaco-editor \n [value]=\"t.htmlContent\"\n (valueChange)=\"store.updateHtml($event)\"\n ></lib-monaco-editor>\n } @else {\n <div class=\"h-full bg-slate-100 dark:bg-slate-950 p-6 md:p-10 flex flex-col items-center overflow-y-auto custom-scrollbar\">\n <div class=\"flex items-center gap-3 mb-8 bg-white dark:bg-slate-900 p-1.5 rounded-2xl border border-slate-200 dark:border-slate-800 shadow-xl shrink-0 transition-transform hover:scale-105\">\n <p-selectButton \n [options]=\"deviceOptions\" \n [ngModel]=\"store.previewMode()\" \n (ngModelChange)=\"store.setPreviewMode($event)\" \n optionLabel=\"icon\" \n optionValue=\"value\"\n styleClass=\"rounded-xl border-none\"\n >\n <ng-template let-item pTemplate=\"item\">\n <i [class]=\"item.icon\" class=\"text-lg\"></i>\n </ng-template>\n </p-selectButton>\n </div>\n\n <div \n class=\"bg-white shadow-2xl rounded-2xl overflow-hidden transition-all duration-500 ring-1 ring-slate-200 dark:ring-slate-800\"\n [style.width]=\"store.previewMode() === 'desktop' ? '100%' : '375px'\"\n [style.max-width]=\"store.previewMode() === 'desktop' ? '1000px' : '375px'\"\n [style.min-height]=\"store.previewMode() === 'desktop' ? '800px' : '667px'\"\n >\n <iframe [srcdoc]=\"processedHtml()\" class=\"w-full h-full border-none\"></iframe>\n </div>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n :host ::ng-deep .outreach-panel .p-panel-header {\n background: transparent !important;\n border: none !important;\n padding: 0 0 0.75rem 0 !important;\n }\n :host ::ng-deep .outreach-panel .p-panel-title {\n font-size: 11px !important;\n font-weight: 900 !important;\n text-transform: uppercase !important;\n letter-spacing: 0.12em !important;\n color: #94a3b8 !important;\n }\n :host ::ng-deep .outreach-panel .p-panel-content {\n background: transparent !important;\n border: none !important;\n padding: 0 !important;\n }\n .custom-scrollbar::-webkit-scrollbar { width: 4px; }\n .custom-scrollbar::-webkit-scrollbar-track { background: transparent; }\n .custom-scrollbar::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.1); border-radius: 10px; }\n .dark .custom-scrollbar::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); }\n `]\n})\nexport class TemplateEditorComponent implements OnInit {\n @Input() templateId!: string | number;\n \n store = inject(EditorStore);\n private emailService = inject(EmailService);\n private themeService = inject(ThemeService);\n private sanitizer = inject(DomSanitizer);\n\n mobileMode = signal(false);\n activeMobileTab = signal<'config' | 'editor'>('editor');\n\n processedHtml = computed<SafeHtml>(() => {\n const t = this.store.activeTemplate();\n if (!t) return '';\n \n let html = t.htmlContent || '';\n const theme = this.themeService.theme();\n \n const tailwindScript = `<script src=\"https://cdn.tailwindcss.com\"></script>`;\n const themeStyles = `\n <style>\n :root {\n --primary: 240 5.9% 10%;\n --primary-foreground: 0 0% 98%;\n --background: 0 0% 100%;\n --foreground: 240 10% 3.9%;\n --border: 240 5.9% 90%;\n }\n .dark {\n --primary: 0 0% 98%;\n --primary-foreground: 240 5.9% 10%;\n --background: 240 10% 3.9%;\n --foreground: 0 0% 98%;\n --border: 240 3.7% 15.9%;\n }\n /* Ensure the preview background matches the theme */\n html.${theme} body { \n background-color: ${theme === 'dark' ? '#020617' : '#ffffff'} !important; \n }\n * { transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease; }\n </style>\n `;\n\n // If it's a full document, we inject our theme support into the head\n if (html.toLowerCase().includes('<html')) {\n let augmented = html;\n \n // Inject theme class into <html> tag\n if (augmented.toLowerCase().includes('<html')) {\n augmented = augmented.replace(/<html([^>]*)>/i, (match, p1) => {\n if (p1.includes('class=')) {\n return match.replace(/class=[\"']([^\"']*)[\"']/i, `class=\"$1 ${theme}\"`);\n }\n return `<html${p1} class=\"${theme}\">`;\n });\n }\n\n // Inject scripts and styles into <head>\n if (augmented.toLowerCase().includes('</head>')) {\n augmented = augmented.replace('</head>', `${tailwindScript}${themeStyles}</head>`);\n } else {\n // Fallback if no head exists\n augmented = themeStyles + tailwindScript + augmented;\n }\n\n return this.sanitizer.bypassSecurityTrustHtml(augmented);\n }\n\n // Otherwise, wrap snippet with Tailwind and proper theme support\n const snippet = `\n <!DOCTYPE html>\n <html class=\"${theme}\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n ${tailwindScript}\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n <script>\n tailwind.config = {\n darkMode: 'class',\n theme: {\n extend: {\n fontFamily: {\n sans: ['Inter', 'sans-serif'],\n },\n }\n }\n }\n </script>\n ${themeStyles}\n <style>\n body { \n font-family: 'Inter', sans-serif; \n margin: 0; \n padding: 0; \n background-color: hsl(var(--background));\n color: hsl(var(--foreground));\n min-height: 100vh;\n }\n </style>\n </head>\n <body class=\"bg-white dark:bg-slate-950\">\n <div class=\"p-8\">\n ${html}\n </div>\n </body>\n </html>\n `;\n return this.sanitizer.bypassSecurityTrustHtml(snippet);\n });\n\n viewOptions = [\n { label: 'Edit HTML', value: 'code' },\n { label: 'Live Preview', value: 'preview' }\n ];\n\n mobileViewOptions = [\n { label: 'Settings', value: 'config' },\n { label: 'Editor', value: 'editor' }\n ];\n\n deviceOptions = [\n { icon: 'pi pi-desktop', value: 'desktop' },\n { icon: 'pi pi-mobile', value: 'mobile' }\n ];\n\n constructor() {\n this.checkBreakpoint();\n }\n\n @HostListener('window:resize')\n onResize() {\n this.checkBreakpoint();\n }\n\n checkBreakpoint() {\n this.mobileMode.set(window.innerWidth <= 991);\n }\n\n async ngOnInit() {\n if (this.templateId) {\n await this.store.loadTemplate(this.templateId);\n }\n }\n\n updateFields(fields: any) {\n this.store.updateFields(fields);\n }\n\n updateSender(field: 'name' | 'email', value: string) {\n const current = this.store.activeTemplate()?.sender || { name: '', email: '' };\n this.store.updateFields({\n sender: { ...current, [field]: value }\n });\n }\n\n async save() {\n await this.store.save();\n }\n\n async sendTest() {\n const id = this.store.activeTemplate()?.id;\n if (!id) return;\n const email = prompt('Enter test recipient email:');\n if (email) {\n await this.emailService.sendTestEmail(id, email);\n }\n }\n}\n","import { Injectable, signal, computed, inject } from '@angular/core';\nimport { EmailService } from '../api/email.service';\n\nexport interface BulkJob {\n id: string;\n type: string;\n total: number;\n current: number;\n status: 'idle' | 'running' | 'paused' | 'completed' | 'failed';\n results: { id: string | number; success: boolean; error?: string }[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BulkStore {\n private emailService = inject(EmailService);\n\n // State\n private _activeJob = signal<BulkJob | null>(null);\n\n // Selectors\n activeJob = computed(() => this._activeJob());\n\n // Actions\n async runBulkOperation(type: string, templateIds: (string | number)[], config: any) {\n const jobId = Math.random().toString(36).substring(7);\n const job: BulkJob = {\n id: jobId,\n type,\n total: templateIds.length,\n current: 0,\n status: 'running',\n results: []\n };\n\n this._activeJob.set(job);\n\n for (const id of templateIds) {\n if (this._activeJob()?.status === 'failed') break; // User cancelled or fatal error\n\n try {\n await this.executeOperation(type, id, config);\n this.updateJobProgress(id, true);\n } catch (e: any) {\n this.updateJobProgress(id, false, e.message);\n }\n }\n\n this._activeJob.update(j => j ? { ...j, status: 'completed' } : null);\n }\n\n private async executeOperation(type: string, id: string | number, config: any) {\n switch (type) {\n case 'subject_replace':\n const template = await this.emailService.getTemplate(id);\n const newSubject = template.subject.replace(config.find, config.replace);\n await this.emailService.updateTemplate(id, { subject: newSubject });\n break;\n case 'sender_update':\n await this.emailService.updateTemplate(id, { sender: config.sender });\n break;\n case 'toggle_status':\n await this.emailService.updateTemplate(id, { isActive: config.isActive });\n break;\n // Add more as needed\n default:\n throw new Error(`Unknown bulk operation: ${type}`);\n }\n }\n\n private updateJobProgress(id: string | number, success: boolean, error?: string) {\n this._activeJob.update(job => {\n if (!job) return null;\n return {\n ...job,\n current: job.current + 1,\n results: [...job.results, { id, success, error }]\n };\n });\n }\n\n cancelJob() {\n this._activeJob.update(j => j ? { ...j, status: 'failed' } : null);\n }\n\n clearJob() {\n this._activeJob.set(null);\n }\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BulkStore } from '../../state/bulk.store';\n\n// PrimeNG Imports\nimport { ProgressBarModule } from 'primeng/progressbar';\nimport { ButtonModule } from 'primeng/button';\nimport { ScrollPanelModule } from 'primeng/scrollpanel';\n\n@Component({\n selector: 'lib-bulk-status-panel',\n standalone: true,\n imports: [CommonModule, ProgressBarModule, ButtonModule, ScrollPanelModule],\n template: `\n @if (job(); as j) {\n <div \n class=\"fixed bottom-8 right-8 z-[1000] w-[420px] bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-[28px] shadow-2xl overflow-hidden transition-all duration-500 animate-in slide-in-from-right-8\"\n [class.h-[450px]]=\"expanded()\"\n [class.h-[84px]]=\"!expanded()\"\n >\n <!-- Header -->\n <div class=\"p-5 flex items-center justify-between cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-800/50 transition-colors\" (click)=\"toggleExpand()\">\n <div class=\"flex items-center gap-4\">\n <div class=\"w-10 h-10 bg-blue-600 rounded-xl flex items-center justify-center text-white shadow-lg shadow-blue-500/20\">\n <i class=\"pi pi-bolt font-black\"></i>\n </div>\n <div class=\"flex flex-col\">\n <span class=\"text-[10px] font-black text-slate-900 dark:text-white uppercase tracking-[0.2em]\">{{ j.type.replace('_', ' ') }}</span>\n <span class=\"text-[9px] font-black text-blue-600 dark:text-blue-400 uppercase tracking-widest mt-0.5\">{{ j.status }}</span>\n </div>\n </div>\n \n <div class=\"flex-1 px-6\">\n <p-progressBar [value]=\"(j.current / j.total) * 100\" [showValue]=\"false\" styleClass=\"h-1.5 rounded-full bg-slate-100 dark:bg-slate-800\"></p-progressBar>\n </div>\n\n <div class=\"flex items-center gap-3\">\n <span class=\"text-xs font-black font-mono text-slate-500 dark:text-slate-400 tracking-tighter\">{{ j.current }}/{{ j.total }}</span>\n <p-button icon=\"pi pi-times\" [text]=\"true\" (click)=\"clear($event)\" styleClass=\"w-8 h-8 rounded-full hover:bg-slate-200 dark:hover:bg-slate-800\"></p-button>\n </div>\n </div>\n\n @if (expanded()) {\n <div class=\"flex flex-col h-[366px] bg-slate-50/50 dark:bg-slate-950/30 border-t border-slate-100 dark:border-slate-800\">\n <div class=\"flex items-center justify-between px-6 py-3 border-b border-slate-100 dark:border-slate-800\">\n <span class=\"text-[9px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-[0.2em]\">Live Execution Stream</span>\n <p-button label=\"Abort Node\" severity=\"danger\" [text]=\"true\" (click)=\"cancel($event)\" styleClass=\"text-[9px] font-black px-3 py-1 rounded-lg hover:bg-rose-50 dark:hover:bg-rose-900/20\"></p-button>\n </div>\n\n <p-scrollPanel styleClass=\"flex-1 px-4 py-2 custom-scroll\">\n <div class=\"flex flex-col gap-4 p-2\">\n @for (res of j.results; track res.id) {\n <div class=\"flex items-start gap-4 p-4 bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-2xl shadow-sm transition-transform hover:scale-[1.02]\">\n <div class=\"mt-1\">\n <i \n [class]=\"res.success ? 'pi pi-check-circle text-emerald-500' : 'pi pi-exclamation-circle text-rose-500'\" \n class=\"text-lg\"\n ></i>\n </div>\n <div class=\"flex flex-col gap-1.5\">\n <span class=\"text-[11px] font-black text-slate-900 dark:text-white tracking-tight uppercase\">Template #{{ res.id }}</span>\n <p class=\"text-[11px] font-bold text-slate-500 dark:text-slate-400 leading-relaxed m-0\">\n {{ res.success ? 'System successfully propagated changes to this node.' : 'Propogation failure: ' + res.error }}\n </p>\n </div>\n </div>\n }\n @if (j.results.length === 0) {\n <div class=\"flex flex-col items-center justify-center py-20 opacity-30\">\n <i class=\"pi pi-bolt text-4xl mb-4\"></i>\n <span class=\"text-[10px] font-black uppercase tracking-widest text-center\">Awaiting execution data...</span>\n </div>\n }\n </div>\n </p-scrollPanel>\n </div>\n }\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n :host ::ng-deep .p-progressbar-value { background: #2563eb !important; border-radius: 999px; }\n :host ::ng-deep .custom-scroll .p-scrollpanel-bar { background: rgba(37, 99, 235, 0.1) !important; border-radius: 999px; }\n `]\n})\nexport class BulkStatusPanelComponent {\n private store = inject(BulkStore);\n job = this.store.activeJob;\n expanded = signal(false);\n\n toggleExpand() {\n this.expanded.update(v => !v);\n }\n\n cancel(event: Event) {\n event.stopPropagation();\n if (confirm('Cancel current bulk operation?')) {\n this.store.cancelJob();\n }\n }\n\n clear(event: Event) {\n event.stopPropagation();\n this.store.clearJob();\n }\n}\n","import { Component, inject, signal, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BulkStore } from '../../state/bulk.store';\n\n// PrimeNG Imports\nimport { CardModule } from 'primeng/card';\nimport { ButtonModule } from 'primeng/button';\nimport { TagModule } from 'primeng/tag';\nimport { DividerModule } from 'primeng/divider';\nimport { TooltipModule } from 'primeng/tooltip';\n\n@Component({\n selector: 'lib-bulk-operations-dashboard',\n standalone: true,\n imports: [\n CommonModule, \n CardModule, \n ButtonModule, \n TagModule, \n DividerModule,\n TooltipModule\n ],\n template: `\n <div class=\"max-w-[1400px] mx-auto flex flex-col gap-8 animate-in fade-in slide-in-from-bottom-4 duration-700\">\n \n <!-- Header Section -->\n <div class=\"flex flex-col md:flex-row items-center justify-between gap-6\">\n <div>\n <h1 class=\"text-4xl font-black text-slate-900 dark:text-white m-0 tracking-tighter\">Bulk Operations</h1>\n <p class=\"text-slate-500 dark:text-slate-400 font-medium mt-2\">Automate library-wide updates with precision and scale</p>\n </div>\n <p-button label=\"Job History\" icon=\"pi pi-history\" [outlined]=\"true\" styleClass=\"px-8 py-3 rounded-2xl font-black text-xs border-slate-200 dark:border-slate-700 hover:bg-slate-50 dark:hover:bg-slate-800 transition-all\"></p-button>\n </div>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-8\">\n @for (op of operations; track op.id) {\n <div class=\"group h-full\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] p-8 shadow-sm hover:shadow-2xl hover:-translate-y-2 transition-all duration-500 h-full flex flex-col\">\n <div class=\"flex items-center gap-4 mb-6\">\n <div class=\"w-14 h-14 rounded-2xl flex items-center justify-center transition-transform group-hover:rotate-12\" [ngClass]=\"op.iconBg\">\n <i class=\"pi {{ op.icon }} {{ op.iconColor }} text-2xl\"></i>\n </div>\n <div>\n <h3 class=\"text-lg font-black text-slate-900 dark:text-white tracking-tight m-0\">{{ op.title }}</h3>\n <span class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-[0.2em]\">{{ op.category }}</span>\n </div>\n </div>\n\n <p class=\"text-sm font-bold text-slate-500 dark:text-slate-400 leading-relaxed mb-8 flex-1\">\n {{ op.description }}\n </p>\n\n <div class=\"p-5 bg-slate-50 dark:bg-slate-950 border border-dashed border-slate-200 dark:border-slate-800 rounded-2xl mb-8\">\n <div class=\"text-[9px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest mb-3\">Logic Transformation</div>\n <div class=\"flex items-center gap-3\">\n <span class=\"text-xs font-mono font-black text-slate-600 dark:text-slate-400\">{{ op.exampleFrom }}</span>\n <i class=\"pi pi-arrow-right text-[10px] text-blue-600\"></i>\n <span class=\"text-xs font-mono font-black text-blue-600 dark:text-blue-400\">{{ op.exampleTo }}</span>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between pt-6 border-t border-slate-50 dark:border-slate-800/50\">\n <div class=\"flex gap-2\">\n @for (tag of op.tags; track tag) {\n <span class=\"px-2 py-1 bg-slate-100 dark:bg-slate-800 text-[9px] font-black text-slate-500 dark:text-slate-400 rounded-md uppercase tracking-wider\">{{ tag }}</span>\n }\n </div>\n <p-button label=\"Trigger\" [text]=\"true\" icon=\"pi pi-chevron-right\" iconPos=\"right\" (click)=\"navigateToLibrary()\" styleClass=\"p-button-sm font-black text-xs hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-xl px-4 py-2 transition-all\"></p-button>\n </div>\n </div>\n </div>\n }\n\n <!-- Empty/Info State -->\n <div class=\"md:col-span-2 xl:col-span-3 mt-4\">\n <div class=\"bg-slate-50 dark:bg-slate-950 p-12 rounded-[40px] border-2 border-dashed border-slate-200 dark:border-slate-800/50 flex flex-col items-center text-center\">\n <div class=\"w-20 h-20 bg-blue-600 rounded-full flex items-center justify-center mb-8 shadow-2xl shadow-blue-500/40 animate-bounce\">\n <i class=\"pi pi-info-circle text-3xl text-white\"></i>\n </div>\n <h2 class=\"text-2xl font-black text-slate-900 dark:text-white mb-4 tracking-tighter\">Operational Workflow</h2>\n <p class=\"text-sm font-bold text-slate-500 dark:text-slate-400 max-w-lg leading-relaxed mb-10\">\n To trigger a bulk operation, navigate to the <span class=\"text-blue-600\">Template Library</span>, select the templates you wish to modify, and click the <b>\"Run Bulk\"</b> button in the table toolbar.\n </p>\n <p-button label=\"Navigate to Library\" icon=\"pi pi-envelope\" (click)=\"navigateToLibrary()\" styleClass=\"px-10 py-4 bg-blue-600 hover:bg-blue-700 border-none rounded-2xl font-black text-xs shadow-2xl shadow-blue-500/30 transition-all active:scale-95\"></p-button>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; }\n `]\n})\nexport class BulkOperationsDashboardComponent {\n @Output() navigateTo = new EventEmitter<'list'>();\n\n operations = [\n {\n id: 'subject_replace',\n title: 'Subject Sanitizer',\n category: 'Content',\n description: 'Perform powerful find-and-replace operations on subject lines across your entire library. Ideal for removing draft markers or updating seasonal branding.',\n icon: 'pi-pencil',\n iconBg: 'bg-blue-50 dark:bg-blue-900/30',\n iconColor: 'text-blue-600 dark:text-blue-400',\n exampleFrom: '[DRAFT] Winter Sale',\n exampleTo: '[FINAL] Winter Sale 2024',\n tags: ['REGEX', 'TEXT']\n },\n {\n id: 'sender_update',\n title: 'Sender Migration',\n category: 'Infrastructure',\n description: 'Switch template senders instantly. Useful when migrating campaigns between different verified nodes or departments.',\n icon: 'pi-send',\n iconBg: 'bg-purple-50 dark:bg-purple-900/30',\n iconColor: 'text-purple-600 dark:text-purple-400',\n exampleFrom: 'support@old.com',\n exampleTo: 'help@outreachly.io',\n tags: ['SENDER', 'NODE']\n },\n {\n id: 'toggle_status',\n title: 'Status Propagation',\n category: 'Lifecycle',\n description: 'Synchronize the operational state of multiple templates. Activate new campaigns or archive old ones in a single batch.',\n icon: 'pi-power-off',\n iconBg: 'bg-emerald-50 dark:bg-emerald-950/30',\n iconColor: 'text-emerald-600 dark:text-emerald-400',\n exampleFrom: 'Status: DRAFT',\n exampleTo: 'Status: ACTIVE',\n tags: ['API', 'LIFECYCLE']\n },\n {\n id: 'variable_rename',\n title: 'Variable Refactor',\n category: 'Logic',\n description: 'Update dynamic variable syntax across templates to match your latest CRM schema. Prevents broken personalization tags.',\n icon: 'pi-code',\n iconBg: 'bg-amber-50 dark:bg-amber-900/30',\n iconColor: 'text-amber-600 dark:text-amber-400',\n exampleFrom: '{{ user_name }}',\n exampleTo: '{{ first_name }}',\n tags: ['CRM', 'DYNAMIC']\n }\n ];\n\n navigateToLibrary() {\n this.navigateTo.emit('list');\n }\n}\n","import { Component, OnInit, inject, signal, computed, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { EmailService } from '../../api/email.service';\nimport { SmtpLog, EmailStats, OrganizationActivity, EmailTemplate, AccountInfo } from '../../core/interfaces/email-provider.interface';\n\n// PrimeNG Imports\nimport { CardModule } from 'primeng/card';\nimport { ChartModule } from 'primeng/chart';\nimport { TableModule } from 'primeng/table';\nimport { ButtonModule } from 'primeng/button';\nimport { SkeletonModule } from 'primeng/skeleton';\nimport { TagModule } from 'primeng/tag';\nimport { SelectModule } from 'primeng/select';\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { TooltipModule } from 'primeng/tooltip';\n\n@Component({\n selector: 'lib-stats',\n standalone: true,\n imports: [\n CommonModule, \n FormsModule,\n CardModule, \n ChartModule, \n TableModule, \n ButtonModule, \n SkeletonModule, \n TagModule, \n SelectModule,\n IconFieldModule,\n InputIconModule,\n InputTextModule,\n TooltipModule\n ],\n template: `\n <div class=\"flex flex-col gap-8 animate-in fade-in slide-in-from-bottom-4 duration-700\">\n <!-- Header Row -->\n <div class=\"flex flex-col sm:flex-row items-start sm:items-end justify-between gap-4\">\n <div>\n <h1 class=\"text-4xl font-black text-slate-900 dark:text-white tracking-tighter m-0\">Overview</h1>\n <p class=\"text-slate-500 dark:text-slate-400 mt-1 font-medium\">Track your marketing performance for the last 30 days.</p>\n </div>\n <div class=\"flex items-center gap-3\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-xl px-4 py-2.5 flex items-center gap-3 text-sm font-bold text-slate-600 dark:text-slate-300 shadow-sm\">\n <i class=\"pi pi-calendar text-blue-600\"></i>\n <span>Oct 24 - Nov 23, 2023</span>\n </div>\n <p-select [options]=\"periods\" [(ngModel)]=\"selectedPeriod\" optionLabel=\"label\" (onChange)=\"refresh()\" styleClass=\"rounded-xl border-slate-200 dark:border-slate-800 dark:bg-slate-900 font-bold text-sm\"></p-select>\n </div>\n </div>\n\n <!-- Metric Cards Grid -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6\">\n @if (loading()) {\n @for (i of [1,2,3,4]; track i) {\n <div class=\"bg-white dark:bg-slate-900 p-6 rounded-3xl border border-slate-100 dark:border-slate-800 shadow-sm\"><p-skeleton height=\"8rem\" borderRadius=\"16px\"></p-skeleton></div>\n }\n } @else {\n @for (m of displayMetrics(); track m.label) {\n <div class=\"bg-white dark:bg-slate-900 p-6 rounded-3xl border border-slate-100 dark:border-slate-800 shadow-sm hover:shadow-xl hover:-translate-y-1 transition-all duration-300 group\">\n <div class=\"flex justify-between items-start mb-4\">\n <span class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-[0.2em]\">{{ m.label }}</span>\n <div class=\"w-10 h-10 rounded-xl flex items-center justify-center transition-transform group-hover:rotate-12\" [ngClass]=\"m.bg\">\n <i class=\"pi {{ m.icon }}\" [ngClass]=\"m.color\"></i>\n </div>\n </div>\n <div class=\"text-4xl font-black text-slate-900 dark:text-white tracking-tighter mb-3\">{{ m.value }}</div>\n <div class=\"flex items-center gap-2\">\n <i class=\"pi {{ m.trend >= 0 ? 'pi-chart-line' : 'pi-chart-bar' }}\" [ngClass]=\"m.trend >= 0 ? 'text-emerald-500' : 'text-rose-500'\"></i>\n <span class=\"text-xs font-black\" [ngClass]=\"m.trend >= 0 ? 'text-emerald-500' : 'text-rose-500'\">\n {{ m.trend >= 0 ? '+' : '' }}{{ m.trend }}%\n </span>\n <span class=\"text-xs font-bold text-slate-400 dark:text-slate-500\">vs last month</span>\n </div>\n </div>\n }\n }\n </div>\n \n <!-- Template Inventory Row -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-6 -mt-2\">\n <div class=\"bg-slate-50 dark:bg-slate-900/40 p-4 rounded-2xl border border-slate-100 dark:border-slate-800/50 flex items-center gap-4\">\n <div class=\"w-10 h-10 rounded-xl bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center\">\n <i class=\"pi pi-clone text-blue-600\"></i>\n </div>\n <div>\n <div class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest\">Total Templates</div>\n <div class=\"text-xl font-black text-slate-900 dark:text-white\">{{ templateStats().total }}</div>\n </div>\n </div>\n <div class=\"bg-slate-50 dark:bg-slate-900/40 p-4 rounded-2xl border border-slate-100 dark:border-slate-800/50 flex items-center gap-4\">\n <div class=\"w-10 h-10 rounded-xl bg-emerald-100 dark:bg-emerald-900/30 flex items-center justify-center\">\n <i class=\"pi pi-check text-emerald-600\"></i>\n </div>\n <div>\n <div class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest\">Active</div>\n <div class=\"text-xl font-black text-slate-900 dark:text-white\">{{ templateStats().active }}</div>\n </div>\n </div>\n <div class=\"bg-slate-50 dark:bg-slate-900/40 p-4 rounded-2xl border border-slate-100 dark:border-slate-800/50 flex items-center gap-4\">\n <div class=\"w-10 h-10 rounded-xl bg-slate-200 dark:bg-slate-800 flex items-center justify-center\">\n <i class=\"pi pi-pencil text-slate-600\"></i>\n </div>\n <div>\n <div class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest\">Drafts</div>\n <div class=\"text-xl font-black text-slate-900 dark:text-white\">{{ templateStats().drafts }}</div>\n </div>\n </div>\n @if (templateStats().lastModified; as last) {\n <div class=\"bg-blue-600 p-4 rounded-2xl border border-blue-500 shadow-lg shadow-blue-500/20 flex items-center gap-4 group cursor-pointer overflow-hidden relative\" (click)=\"navigateTo.emit({tab: 'editor', id: last.id})\">\n <div class=\"absolute -right-2 -bottom-2 opacity-10 group-hover:scale-125 transition-transform\">\n <i class=\"pi pi-history text-6xl text-white\"></i>\n </div>\n <div class=\"z-10\">\n <div class=\"text-[10px] font-black text-blue-200 uppercase tracking-widest\">Last Modified</div>\n <div class=\"text-sm font-black text-white truncate max-w-[150px]\">{{ last.name }}</div>\n <div class=\"text-[9px] font-bold text-blue-100/70\">{{ last.updatedAt | date:'short' }}</div>\n </div>\n </div>\n }\n </div>\n\n <!-- Charts Area -->\n <div class=\"grid grid-cols-1 xl:grid-cols-3 gap-8\">\n <div class=\"xl:col-span-2\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden\">\n <div class=\"p-6 flex items-center justify-between border-b border-slate-50 dark:border-slate-800/50\">\n <h3 class=\"text-lg font-black text-slate-900 dark:text-white tracking-tight\">Email Performance</h3>\n <p-button icon=\"pi pi-sync\" [text]=\"true\" severity=\"secondary\" (click)=\"refresh()\" styleClass=\"hover:bg-slate-100 dark:hover:bg-slate-800 rounded-lg transition-colors\"></p-button>\n </div>\n <div class=\"p-8\">\n @if (loading()) { <p-skeleton height=\"300px\"></p-skeleton> }\n @else { <p-chart type=\"bar\" [data]=\"barData\" [options]=\"barOptions\" height=\"320px\"></p-chart> }\n </div>\n </div>\n </div>\n\n <div class=\"xl:col-span-1\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden h-full\">\n <div class=\"p-6 border-b border-slate-50 dark:border-slate-800/50\">\n <h3 class=\"text-lg font-black text-slate-900 dark:text-white tracking-tight\">Engagement</h3>\n </div>\n <div class=\"p-8 flex flex-col items-center\">\n <div class=\"relative w-full max-w-[240px] aspect-square flex items-center justify-center\">\n @if (loading()) { <p-skeleton shape=\"circle\" size=\"200px\"></p-skeleton> }\n @else {\n <p-chart type=\"doughnut\" [data]=\"donutData\" [options]=\"donutOptions\" class=\"w-full\"></p-chart>\n <div class=\"absolute flex flex-col items-center justify-center text-center pointer-events-none\">\n <div class=\"text-4xl font-black text-slate-900 dark:text-white leading-none tracking-tighter\">{{ openRate() }}%</div>\n <div class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest mt-1\">Open Rate</div>\n </div>\n }\n </div>\n \n <div class=\"w-full grid grid-cols-1 gap-4 mt-10\">\n <div class=\"flex items-center justify-between p-3 bg-slate-50 dark:bg-slate-800/50 rounded-2xl\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-2.5 h-2.5 rounded-full bg-blue-600\"></div>\n <span class=\"text-sm font-bold text-slate-600 dark:text-slate-400\">Delivered</span>\n </div>\n <span class=\"text-sm font-black text-slate-900 dark:text-white\">{{ stats()?.delivered || 0 }}</span>\n </div>\n <div class=\"flex items-center justify-between p-3 bg-slate-50 dark:bg-slate-800/50 rounded-2xl\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-2.5 h-2.5 rounded-full bg-indigo-200 dark:bg-indigo-600\"></div>\n <span class=\"text-sm font-bold text-slate-600 dark:text-slate-400\">Unique Opens</span>\n </div>\n <span class=\"text-sm font-black text-slate-900 dark:text-white\">{{ stats()?.uniqueOpens || 0 }}</span>\n </div>\n <div class=\"flex items-center justify-between p-3 bg-slate-50 dark:bg-slate-800/50 rounded-2xl\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-2.5 h-2.5 rounded-full bg-rose-200 dark:bg-rose-600\"></div>\n <span class=\"text-sm font-bold text-slate-600 dark:text-slate-400\">Bounces</span>\n </div>\n <span class=\"text-sm font-black text-slate-900 dark:text-white\">{{ (stats()?.hardBounces || 0) + (stats()?.softBounces || 0) }}</span>\n </div>\n <div class=\"flex items-center justify-between p-3 bg-slate-50 dark:bg-slate-800/50 rounded-2xl\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-2.5 h-2.5 rounded-full bg-slate-200 dark:bg-slate-700\"></div>\n <span class=\"text-sm font-bold text-slate-600 dark:text-slate-400\">Unsubscribed</span>\n </div>\n <span class=\"text-sm font-black text-slate-900 dark:text-white\">{{ stats()?.unsubscribed || 0 }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Bottom Tables Section -->\n <div class=\"grid grid-cols-1 xl:grid-cols-3 gap-8\">\n <div class=\"xl:col-span-2\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden\">\n <div class=\"p-6 flex items-center justify-between border-b border-slate-50 dark:border-slate-800/50\">\n <h3 class=\"text-lg font-black text-slate-900 dark:text-white tracking-tight\">Recent Campaigns</h3>\n <p-button label=\"View All\" [text]=\"true\" styleClass=\"text-xs font-black hover:bg-slate-100 dark:hover:bg-slate-800 px-4 py-2 rounded-lg transition-colors\" (click)=\"navigateTo.emit('list')\"></p-button>\n </div>\n <div class=\"p-2\">\n <p-table [value]=\"templates()\" [loading]=\"loading()\" [rows]=\"5\" styleClass=\"p-datatable-sm w-full\">\n <ng-template pTemplate=\"header\">\n <tr class=\"border-b border-slate-50 dark:border-slate-800/50\">\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Template Name</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Status</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Created At</th>\n <th class=\"px-6 py-4 text-right\"></th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-t>\n <tr class=\"group hover:bg-slate-50 dark:hover:bg-slate-800/40 transition-colors\">\n <td class=\"px-6 py-4\">\n <div class=\"flex flex-col\">\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">{{ t.name }}</span>\n <span class=\"text-xs font-bold text-slate-400 dark:text-slate-500 truncate max-w-[200px]\">{{ t.subject }}</span>\n </div>\n </td>\n <td class=\"px-6 py-4\">\n <div class=\"inline-flex items-center gap-2 px-3 py-1 rounded-full text-[10px] font-black tracking-widest transition-colors\" \n [ngClass]=\"t.isActive ? 'bg-emerald-50 dark:bg-emerald-950/30 text-emerald-600 dark:text-emerald-400' : 'bg-slate-100 dark:bg-slate-800 text-slate-500'\">\n <div class=\"w-1.5 h-1.5 rounded-full\" [ngClass]=\"t.isActive ? 'bg-emerald-500' : 'bg-slate-400'\"></div>\n <span>{{ t.isActive ? 'ACTIVE' : 'DRAFT' }}</span>\n </div>\n </td>\n <td class=\"px-6 py-4\"><span class=\"text-xs font-bold text-slate-500 dark:text-slate-400\">{{ t.createdAt | date:'mediumDate' }}</span></td>\n <td class=\"px-6 py-4 text-right\">\n <p-button icon=\"pi pi-pencil\" [text]=\"true\" severity=\"secondary\" (click)=\"navigateTo.emit({tab: 'editor', id: t.id})\" styleClass=\"hover:bg-blue-50 dark:hover:bg-blue-900/20 hover:text-blue-600 dark:hover:text-blue-400 rounded-lg transition-all\"></p-button>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n </div>\n\n <div class=\"xl:col-span-1\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden h-full flex flex-col\">\n <div class=\"p-6 border-b border-slate-50 dark:border-slate-800/50\">\n <h3 class=\"text-lg font-black text-slate-900 dark:text-white tracking-tight\">Organization Activity</h3>\n </div>\n <div class=\"p-8 flex-1\">\n <div class=\"flex flex-col gap-10\">\n @if (loadingActivities()) {\n @for (i of [1,2,3,4]; track i) { <p-skeleton height=\"3.5rem\" borderRadius=\"16px\"></p-skeleton> }\n } @else {\n @for (a of activities(); track a.id; let last = $last) {\n <div class=\"flex gap-5 relative group\">\n @if (!last) {\n <div class=\"absolute left-[1.125rem] top-10 bottom-[-2.5rem] w-px bg-slate-100 dark:bg-slate-800 group-hover:bg-blue-200 dark:group-hover:bg-blue-900 transition-colors\"></div>\n }\n <div class=\"w-9 h-9 rounded-full bg-blue-50 dark:bg-blue-900/30 flex items-center justify-center shrink-0 z-10 transition-transform group-hover:scale-110\">\n <i class=\"pi pi-user text-blue-600 dark:text-blue-400 text-xs\"></i>\n </div>\n <div class=\"flex-1 min-w-0\">\n <div class=\"flex items-center justify-between mb-1\">\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight truncate\">{{ a.action }}</span>\n <span class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest whitespace-nowrap ml-2\">{{ a.date | date:'shortTime' }}</span>\n </div>\n <p class=\"text-xs font-bold text-slate-500 dark:text-slate-400 leading-relaxed\">{{ a.user }} performed an action on your account.</p>\n </div>\n </div>\n }\n @if (activities().length === 0) {\n <div class=\"flex flex-col items-center justify-center py-12 opacity-50\">\n <i class=\"pi pi-info-circle text-4xl mb-4 text-slate-300 dark:text-slate-700\"></i>\n <p class=\"text-sm font-black text-slate-400 dark:text-slate-600 uppercase tracking-widest\">No recent activity</p>\n </div>\n }\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; }\n `]\n})\nexport class StatsComponent implements OnInit {\n private emailService = inject(EmailService);\n @Output() navigateTo = new EventEmitter<any>();\n\n loading = signal(true);\n loadingActivities = signal(true);\n \n stats = signal<EmailStats | null>(null);\n todayStats = signal<EmailStats | null>(null);\n accountInfo = signal<AccountInfo | null>(null);\n activities = signal<OrganizationActivity[]>([]);\n templates = signal<EmailTemplate[]>([]);\n\n periods = [{ label: 'Last 30 Days', value: 30 }, { label: 'Last 7 Days', value: 7 }];\n selectedPeriod = this.periods[0];\n\n openRate = computed(() => {\n const s = this.stats();\n if (!s || s.requests === 0) return 0;\n return Math.round((s.uniqueOpens / s.requests) * 100);\n });\n\n successRate = computed(() => {\n const s = this.stats();\n if (!s || s.requests === 0) return 0;\n return Math.round((s.delivered / s.requests) * 100);\n });\n\n isFreePlan = computed(() => {\n const info = this.accountInfo();\n return info?.plan?.some(p => p.type === 'free') || false;\n });\n\n dailyUsagePercent = computed(() => {\n const today = this.todayStats();\n if (!today || !this.isFreePlan()) return 0;\n return Math.min(100, Math.round((today.requests / 300) * 100));\n });\n\n totalCredits = computed(() => {\n const info = this.accountInfo();\n if (!info || !info.plan) return 0;\n return info.plan.reduce((acc, p) => acc + (p.credits || 0), 0);\n });\n\n templateStats = computed(() => {\n const list = this.templates();\n return {\n total: list.length,\n active: list.filter(t => t.isActive).length,\n drafts: list.filter(t => !t.isActive).length,\n lastModified: [...list].sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())[0]\n };\n });\n\n displayMetrics = computed(() => {\n const s = this.stats();\n const today = this.todayStats();\n const success = this.successRate();\n const hardBounces = s?.hardBounces || 0;\n \n return [\n { \n label: 'Success Rate', \n value: `${success}%`, \n trend: success > 95 ? 0.5 : -1.2, \n icon: 'pi-verified', \n bg: success > 90 ? 'bg-emerald-50 dark:bg-emerald-900/30' : 'bg-amber-50 dark:bg-amber-900/30', \n color: success > 90 ? 'text-emerald-600 dark:text-emerald-400' : 'text-amber-600 dark:text-amber-400' \n },\n { \n label: 'Hard Bounces', \n value: hardBounces.toLocaleString(), \n trend: hardBounces > 0 ? 100 : 0, \n icon: 'pi-times-circle', \n bg: hardBounces > 0 ? 'bg-rose-50 dark:bg-rose-900/30' : 'bg-slate-50 dark:bg-slate-900/30', \n color: hardBounces > 0 ? 'text-rose-600 dark:text-rose-400' : 'text-slate-600 dark:text-slate-400' \n },\n { \n label: 'Daily Quota', \n value: this.isFreePlan() ? `${today?.requests || 0}/300` : 'Unlimited', \n trend: this.dailyUsagePercent(), \n icon: 'pi-bolt', \n bg: 'bg-blue-50 dark:bg-blue-900/30', \n color: 'text-blue-600 dark:text-blue-400' \n },\n { \n label: 'Total Requests', \n value: s?.requests?.toLocaleString() || '0', \n trend: 12, \n icon: 'pi-send', \n bg: 'bg-indigo-50 dark:bg-indigo-900/30', \n color: 'text-indigo-600 dark:text-indigo-400' \n }\n ];\n });\n\n barData: any;\n barOptions = {\n plugins: { legend: { display: false } },\n scales: {\n x: { grid: { display: false }, border: { display: false }, ticks: { color: '#94a3b8', font: { weight: 'bold', size: 10 } } },\n y: { grid: { display: true, color: '#f1f5f9', drawTicks: false }, border: { display: false }, ticks: { display: false } }\n },\n maintainAspectRatio: false\n };\n\n donutData: any;\n donutOptions = {\n plugins: { legend: { display: false } },\n cutout: '80%',\n maintainAspectRatio: false\n };\n\n async ngOnInit() {\n await this.refresh();\n }\n\n async refresh() {\n this.loading.set(true);\n this.loadingActivities.set(true);\n\n try {\n const todayStr = new Date().toISOString().split('T')[0];\n const thirtyDaysAgo = new Date();\n thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);\n const thirtyDaysAgoStr = thirtyDaysAgo.toISOString().split('T')[0];\n\n // Safe individual calls to prevent one failure from breaking the dashboard\n const emptyStats: EmailStats = { \n requests: 0, delivered: 0, opened: 0, uniqueOpens: 0, clicked: 0, uniqueClicks: 0, \n complaints: 0, hardBounces: 0, softBounces: 0, blocked: 0, unsubscribed: 0 \n };\n\n const [statsData, todayStatsData, activitiesData, templatesData, accountData] = await Promise.all([\n this.emailService.getStatistics(thirtyDaysAgoStr, todayStr).catch(() => emptyStats),\n this.emailService.getStatistics(todayStr, todayStr).catch(() => emptyStats),\n this.emailService.getOrganizationActivities().catch(() => []),\n this.emailService.listTemplates().catch(() => []),\n this.emailService.getAccountInfo().catch(() => null)\n ]);\n\n this.stats.set(statsData);\n this.todayStats.set(todayStatsData);\n this.activities.set(activitiesData.slice(0, 5));\n this.templates.set(templatesData.slice(0, 5));\n this.accountInfo.set(accountData);\n\n this.barData = {\n labels: ['Requests', 'Deliv', 'Open', 'Click', 'Bounc', 'Compl'],\n datasets: [{\n label: 'Performance',\n data: [\n statsData.requests, \n statsData.delivered, \n statsData.opened, \n statsData.clicked, \n statsData.hardBounces + statsData.softBounces, \n statsData.complaints\n ],\n backgroundColor: ['#2b44b8', '#3b82f6', '#a855f7', '#2563eb', '#ef4444', '#f97316'],\n borderRadius: 12,\n barThickness: 32\n }]\n };\n\n this.donutData = {\n labels: ['Opened', 'Not Opened'],\n datasets: [{\n data: [statsData.uniqueOpens, Math.max(0, statsData.requests - statsData.uniqueOpens)],\n backgroundColor: ['#2b44b8', '#eff6ff'],\n borderWidth: 0\n }]\n };\n\n } catch (e) {\n console.error('Critical failure in dashboard refresh', e);\n } finally {\n this.loading.set(false);\n this.loadingActivities.set(false);\n }\n }\n}\n","import { Injectable, signal, computed, inject, effect } from '@angular/core';\nimport { AUTH_PROVIDER, AuthCredentials } from '../core/interfaces/auth-provider.interface';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthStore {\n private provider = inject(AUTH_PROVIDER, { optional: true });\n\n // State\n private _user = signal<any | null>(null);\n private _loading = signal<boolean>(false);\n private _error = signal<string | null>(null);\n\n // Selectors\n user = computed(() => this._user());\n isAuthenticated = computed(() => !!this._user());\n loading = computed(() => this._loading());\n error = computed(() => this._error());\n\n constructor() {\n // Restore from localStorage\n const savedUser = localStorage.getItem('ngx_brevo_user');\n if (savedUser) {\n try {\n this._user.set(JSON.parse(savedUser));\n } catch (e) {\n localStorage.removeItem('ngx_brevo_user');\n }\n }\n\n // Persist to localStorage\n effect(() => {\n const user = this._user();\n if (user) {\n localStorage.setItem('ngx_brevo_user', JSON.stringify(user));\n } else {\n localStorage.removeItem('ngx_brevo_user');\n }\n });\n }\n\n // Actions\n async login(credentials: AuthCredentials) {\n if (!this.provider) {\n this._user.set({ name: credentials.username || 'Guest', email: credentials.username });\n return;\n }\n\n this._loading.set(true);\n this._error.set(null);\n \n try {\n const response = await this.provider.login(credentials);\n if (response.success) {\n this._user.set(response.user);\n } else {\n this._error.set(response.error || 'Authentication failed');\n }\n } catch (e: any) {\n this._error.set(e.message || 'An error occurred during login');\n } finally {\n this._loading.set(false);\n }\n }\n\n async logout() {\n if (this.provider) {\n await this.provider.logout();\n }\n this._user.set(null);\n }\n}\n","export const APP_VERSION = 'V1.0.0';\nexport const APP_BUILD = 'STABLE';\nexport const APP_NAME = 'ngx-brevo';\nexport const ORG_NAME = 'NGX-BREVO SYSTEMS';\n","import { Component, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthStore } from '../../state/auth.store';\nimport { ThemeService } from '../../core/services/theme.service';\nimport { APP_VERSION, APP_BUILD, ORG_NAME } from '../../core/constants';\n\n// PrimeNG Imports\nimport { ButtonModule } from 'primeng/button';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { PasswordModule } from 'primeng/password';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { MessageModule } from 'primeng/message';\nimport { TooltipModule } from 'primeng/tooltip';\n\n@Component({\n selector: 'lib-login',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ButtonModule,\n InputTextModule,\n PasswordModule,\n CheckboxModule,\n MessageModule,\n TooltipModule\n ],\n template: `\n <div class=\"fixed inset-0 w-screen h-screen z-[9999] bg-[#EEF2FF] dark:bg-[#0F172A] overflow-hidden transition-colors duration-500 font-sans\">\n \n <!-- Theme Toggle -->\n <button \n (click)=\"themeService.toggle()\" \n class=\"absolute top-8 right-8 w-12 h-12 bg-white dark:bg-slate-800 rounded-full flex items-center justify-center cursor-pointer text-slate-700 dark:text-slate-300 transition-all hover:scale-110 z-[100] shadow-sm\"\n >\n <i [class]=\"themeService.theme() === 'dark' ? 'pi pi-sun' : 'pi pi-moon'\" class=\"text-lg\"></i>\n </button>\n\n <div class=\"relative w-full h-full flex flex-col items-center justify-center p-6 z-10\">\n \n <!-- Clean Resized Brand Logo -->\n <div class=\"text-center mb-6 animate-in fade-in slide-in-from-bottom-4 duration-1000\">\n <div class=\"relative w-56 h-auto mx-auto flex items-center justify-center group\">\n <!-- Subtle Ambient Glow -->\n <div class=\"absolute inset-0 bg-blue-500/10 rounded-full blur-3xl group-hover:bg-blue-400/20 transition-all duration-500\"></div>\n \n <!-- Floating Logo Image -->\n <div class=\"relative w-full h-full flex items-center justify-center z-10 animate-float\">\n <img src=\"/logo.png\" alt=\"ngx-brevo logo\" class=\"w-full h-full object-contain transition-transform duration-700 group-hover:scale-110\">\n </div>\n </div>\n </div>\n <!-- Login Card -->\n <div class=\"w-full max-w-[440px] bg-white dark:bg-slate-900 rounded-[32px] p-10 shadow-[0_20px_50px_rgba(0,0,0,0.05)] border border-slate-50 dark:border-slate-800 animate-in zoom-in-95 duration-700\">\n <h2 class=\"text-xl font-bold text-[#0F172A] dark:text-white mb-10\">Operator Login</h2>\n \n <form (submit)=\"onSubmit($event)\" class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col gap-3\">\n <label class=\"text-xs font-bold text-slate-600 dark:text-slate-400\">Authorized ID</label>\n <div class=\"relative group\">\n <i class=\"pi pi-user absolute left-5 top-1/2 -translate-y-1/2 text-slate-400 z-10\"></i>\n <input \n type=\"text\" \n pInputText \n [(ngModel)]=\"username\" \n name=\"username\" \n placeholder=\"Enter your ID\" \n class=\"w-full py-4 !pl-14 pr-5 rounded-xl border border-slate-100 dark:border-slate-800 bg-[#F9FAFB] dark:bg-slate-950 text-slate-900 dark:text-white text-sm focus:bg-white focus:ring-4 focus:ring-blue-500/5 transition-all outline-none\" \n />\n </div>\n </div>\n\n <div class=\"flex flex-col gap-3\">\n <label class=\"text-xs font-bold text-slate-600 dark:text-slate-400\">Security Key</label>\n <div class=\"relative group\">\n <i class=\"pi pi-lock absolute left-5 top-1/2 -translate-y-1/2 text-slate-400 z-10\"></i>\n <input \n [type]=\"showPassword() ? 'text' : 'password'\" \n pInputText \n [(ngModel)]=\"password\" \n name=\"password\" \n placeholder=\"Enter key\" \n class=\"w-full py-4 !pl-14 pr-12 rounded-xl border border-slate-100 dark:border-slate-800 bg-[#F9FAFB] dark:bg-slate-950 text-slate-900 dark:text-white text-sm focus:bg-white focus:ring-4 focus:ring-blue-500/5 transition-all outline-none\" \n />\n <button \n type=\"button\"\n (click)=\"showPassword.set(!showPassword())\"\n class=\"absolute right-4 top-1/2 -translate-y-1/2 text-slate-400 hover:text-blue-600 transition-colors cursor-pointer p-1 z-20\"\n >\n <i [class]=\"showPassword() ? 'pi pi-eye-slash' : 'pi pi-eye'\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex items-center\">\n <div class=\"flex items-center gap-3\">\n <p-checkbox [binary]=\"true\" id=\"auth\" styleClass=\"scale-110\"></p-checkbox>\n <label for=\"auth\" class=\"text-sm font-medium text-slate-500 dark:text-slate-400 cursor-pointer\">Stay authenticated</label>\n </div>\n </div>\n\n <div class=\"mt-4\">\n <p-button \n label=\"Authenticate Session\" \n [loading]=\"loading()\" \n type=\"submit\" \n styleClass=\"w-full py-4 rounded-xl font-bold bg-[#10B981] hover:bg-[#059669] border-none text-white transition-all shadow-lg shadow-emerald-500/20 active:scale-95\"\n ></p-button>\n </div>\n </form>\n </div>\n\n <!-- Footer Footer -->\n <div class=\"absolute bottom-10 text-center z-20\">\n <p class=\"text-[10px] font-bold text-slate-400 dark:text-slate-500 tracking-[0.2em]\">\n © 2026 {{ orgName }}. {{ appBuild }} {{ appVersion }}\n </p>\n </div>\n </div>\n\n\n <!-- Organic Random Waves -->\n <div class=\"absolute bottom-0 left-0 w-full h-[200px] overflow-hidden pointer-events-none z-0\">\n <svg class=\"absolute bottom-0 left-0 w-[200%] h-full opacity-60 dark:opacity-20 animate-random-wave-1\" viewBox=\"0 0 1440 320\" preserveAspectRatio=\"none\">\n <path fill=\"url(#wave-gradient-1)\" d=\"M0,160L48,176.3C96,193,192,225,288,210.7C384,196,480,135,576,131.3C672,127,768,179,864,181.3C960,183,1056,134,1152,110.3C1248,87,1344,87,1392,87L1440,87L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z\"></path>\n <defs>\n <linearGradient id=\"wave-gradient-1\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" style=\"stop-color:rgba(37,99,235,0.2);stop-opacity:1\" />\n <stop offset=\"100%\" style=\"stop-color:rgba(37,99,235,0.6);stop-opacity:1\" />\n </linearGradient>\n </defs>\n </svg>\n <svg class=\"absolute bottom-0 left-0 w-[200%] h-full opacity-40 dark:opacity-10 animate-random-wave-2\" viewBox=\"0 0 1440 320\" preserveAspectRatio=\"none\">\n <path fill=\"url(#wave-gradient-2)\" d=\"M0,224L60,208C120,192,240,160,360,176C480,192,600,256,720,256C840,256,960,192,1080,165.3C1200,139,1320,149,1380,154.7L1440,160L1440,320L1380,320C1320,320,1200,320,1080,320C960,320,840,320,720,320C600,320,480,320,360,320C240,320,120,320,60,320L0,320Z\"></path>\n <defs>\n <linearGradient id=\"wave-gradient-2\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" style=\"stop-color:rgba(16,185,129,0.1);stop-opacity:1\" />\n <stop offset=\"100%\" style=\"stop-color:rgba(37,99,235,0.4);stop-opacity:1\" />\n </linearGradient>\n </defs>\n </svg>\n <svg class=\"absolute bottom-0 left-0 w-[200%] h-full opacity-30 dark:opacity-5 animate-random-wave-3\" viewBox=\"0 0 1440 320\" preserveAspectRatio=\"none\">\n <path fill=\"url(#wave-gradient-3)\" d=\"M0,96L80,117.3C160,139,320,181,480,170.7C640,160,800,96,960,90.7C1120,85,1280,139,1360,165.3L1440,192L1440,320L1360,320C1280,320,1120,320,960,320C800,320,640,320,480,320C320,320,160,320,80,320L0,320Z\"></path>\n <defs>\n <linearGradient id=\"wave-gradient-3\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" style=\"stop-color:rgba(37,99,235,0.3);stop-opacity:1\" />\n <stop offset=\"100%\" style=\"stop-color:rgba(16,185,129,0.2);stop-opacity:1\" />\n </linearGradient>\n </defs>\n </svg>\n </div>\n </div>\n `,\n styles: [`\n @keyframes random-wave {\n 0% { transform: translateX(0) translateY(0); }\n 33% { transform: translateX(-10%) translateY(5px); }\n 66% { transform: translateX(-20%) translateY(-5px); }\n 100% { transform: translateX(0) translateY(0); }\n }\n .animate-random-wave-1 {\n animation: random-wave 20s ease-in-out infinite;\n }\n .animate-random-wave-2 {\n animation: random-wave 15s ease-in-out infinite;\n animation-delay: -5s;\n }\n .animate-random-wave-3 {\n animation: random-wave 25s ease-in-out infinite;\n animation-delay: -10s;\n }\n @keyframes shimmer {\n 0% { transform: translateX(-150%) rotate(45deg); }\n 100% { transform: translateX(150%) rotate(45deg); }\n }\n @keyframes bounce-subtle {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-3px); }\n }\n .animate-shimmer {\n animation: shimmer 3s infinite;\n }\n @keyframes float {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-10px); }\n }\n @keyframes text-shimmer {\n 0% { background-position: 0% 50%; }\n 100% { background-position: 200% 50%; }\n }\n @keyframes lightning-pulse {\n 0%, 100% { transform: scale(1) rotate(0deg); filter: brightness(1); }\n 50% { transform: scale(1.1) rotate(-5deg); filter: brightness(1.5); }\n }\n @keyframes shimmer-horizontal {\n 0% { transform: translateX(-10px); opacity: 0.3; }\n 50% { transform: translateX(20px); opacity: 1; }\n 100% { transform: translateX(-10px); opacity: 0.3; }\n }\n .animate-lightning-pulse {\n animation: lightning-pulse 2s ease-in-out infinite;\n }\n @keyframes lightning-shiver {\n 0%, 100% { transform: scale(1) translate(0, 0); filter: brightness(1) contrast(1); }\n 10%, 30%, 50%, 70%, 90% { transform: scale(1.05) translate(1px, -1px); filter: brightness(1.3) contrast(1.2); }\n 20%, 40%, 60%, 80% { transform: scale(1.02) translate(-1px, 1px); filter: brightness(1.1) contrast(1.1); }\n }\n .animate-lightning-shiver {\n animation: lightning-shiver 4s linear infinite;\n }\n `]\n})\nexport class LoginComponent {\n private authStore = inject(AuthStore);\n themeService = inject(ThemeService);\n\n appVersion = APP_VERSION;\n appBuild = APP_BUILD;\n orgName = ORG_NAME;\n\n showPassword = signal(false);\n\n username = '';\n password = '';\n\n loading = this.authStore.loading;\n error = this.authStore.error;\n\n async onSubmit(event: Event) {\n event.preventDefault();\n await this.authStore.login({\n username: this.username,\n password: this.password\n });\n }\n}\n","import { Component, inject, signal, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { EmailService } from '../../api/email.service';\n\n// PrimeNG Imports\nimport { CardModule } from 'primeng/card';\nimport { SelectModule } from 'primeng/select';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { ToggleSwitchModule } from 'primeng/toggleswitch';\nimport { ButtonModule } from 'primeng/button';\nimport { TagModule } from 'primeng/tag';\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { MessageModule } from 'primeng/message';\n\n@Component({\n selector: 'lib-settings',\n standalone: true,\n imports: [\n CommonModule, \n FormsModule, \n CardModule, \n SelectModule, \n InputTextModule, \n ToggleSwitchModule, \n ButtonModule, \n TagModule,\n IconFieldModule,\n InputIconModule,\n MessageModule\n ],\n template: `\n <div class=\"max-w-[1000px] mx-auto flex flex-col gap-8 animate-in fade-in slide-in-from-bottom-4 duration-700 pb-20\">\n \n <!-- Header Section -->\n <div>\n <h1 class=\"text-4xl font-black text-slate-900 dark:text-white m-0 tracking-tighter\">Settings</h1>\n <p class=\"text-slate-500 dark:text-slate-400 font-medium mt-2\">Manage global credentials and interface behavior.</p>\n </div>\n\n <!-- Platform Configuration -->\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] p-8 shadow-sm overflow-hidden\">\n <div class=\"flex items-center gap-3 mb-6\">\n <div class=\"w-8 h-8 bg-blue-50 dark:bg-blue-900/30 rounded-lg flex items-center justify-center text-blue-600\">\n <i class=\"pi pi-cog\"></i>\n </div>\n <h3 class=\"text-lg font-black text-slate-900 dark:text-white tracking-tight\">Platform Configuration</h3>\n </div>\n <p class=\"text-sm text-slate-500 dark:text-slate-400 font-bold mb-8 leading-relaxed uppercase tracking-widest text-[10px]\">\n Review foundational settings that apply across all workspaces in your environment.\n </p>\n \n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div class=\"p-6 bg-blue-50/50 dark:bg-blue-900/10 border border-blue-100/50 dark:border-blue-800/30 rounded-2xl group hover:shadow-md transition-all\">\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 bg-white dark:bg-slate-800 rounded-xl flex items-center justify-center shadow-sm text-blue-600 group-hover:scale-110 transition-transform\">\n <i class=\"pi pi-globe\"></i>\n </div>\n <div class=\"flex-1\">\n <span class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest\">Global Region</span>\n <div class=\"text-sm font-black text-slate-900 dark:text-white mt-1 mb-3\">US East (N. Virginia)</div>\n <p-tag severity=\"success\" value=\"ACTIVE\" styleClass=\"px-3 py-1 rounded-full text-[9px] font-black tracking-widest\"></p-tag>\n </div>\n </div>\n </div>\n <div class=\"p-6 bg-blue-50/50 dark:bg-blue-900/10 border border-blue-100/50 dark:border-blue-800/30 rounded-2xl group hover:shadow-md transition-all\">\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 bg-white dark:bg-slate-800 rounded-xl flex items-center justify-center shadow-sm text-blue-600 group-hover:scale-110 transition-transform\">\n <i class=\"pi pi-lock\"></i>\n </div>\n <div class=\"flex-1\">\n <span class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest\">Security Policy</span>\n <div class=\"text-sm font-black text-slate-900 dark:text-white mt-1 mb-3\">Strict (MFA Required)</div>\n <a class=\"text-[10px] font-black text-blue-600 dark:text-blue-400 uppercase tracking-widest cursor-pointer hover:underline\">Edit Policy</a>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- SMTP Provider -->\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] p-8 shadow-sm overflow-hidden\">\n <div class=\"flex flex-col sm:flex-row items-center justify-between gap-4 mb-8\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-8 h-8 bg-indigo-50 dark:bg-indigo-900/30 rounded-lg flex items-center justify-center text-indigo-600\">\n <i class=\"pi pi-envelope\"></i>\n </div>\n <h3 class=\"text-lg font-black text-slate-900 dark:text-white tracking-tight\">SMTP Provider</h3>\n </div>\n <div class=\"inline-flex items-center gap-2 px-3 py-1.5 bg-slate-100 dark:bg-slate-800 rounded-full text-[9px] font-black text-slate-500 dark:text-slate-400 tracking-widest\">\n <div class=\"w-1.5 h-1.5 bg-blue-600 rounded-full\"></div>\n LOCKED TO BREVO V3\n </div>\n </div>\n\n <div class=\"flex flex-col gap-8\">\n <div>\n <label class=\"block text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest mb-3 ml-1\">Active Service Provider</label>\n <p-select [options]=\"providers\" [(ngModel)]=\"selectedProvider\" optionLabel=\"label\" styleClass=\"w-full bg-slate-50 dark:bg-slate-950 border-slate-200 dark:border-slate-800 rounded-2xl font-bold text-sm h-14 flex items-center\"></p-select>\n </div>\n\n <div>\n <label class=\"block text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest mb-3 ml-1\">V3 API Key</label>\n <div class=\"relative group\">\n <i class=\"pi pi-eye absolute right-5 top-1/2 -translate-y-1/2 text-slate-400 cursor-pointer hover:text-blue-600 transition-colors z-10\"></i>\n <input \n type=\"password\" \n pInputText \n class=\"w-full bg-slate-50 dark:bg-slate-950 border-slate-200 dark:border-slate-800 rounded-2xl py-4 pl-6 pr-12 text-sm font-black text-slate-900 dark:text-white focus:ring-4 focus:ring-blue-500/10 transition-all outline-none\" \n value=\"••••••••••••••••••••••••••••••\" \n />\n </div>\n <div class=\"flex items-start gap-3 mt-4 p-4 bg-amber-50/30 dark:bg-amber-900/10 border border-amber-100/50 dark:border-amber-900/20 rounded-xl\">\n <i class=\"pi pi-info-circle text-amber-600 text-sm mt-0.5\"></i>\n <span class=\"text-[10px] text-amber-700 dark:text-amber-500 font-bold leading-relaxed uppercase tracking-widest\">Sensitive data is stored encrypted in your local browser database. We never send this key to our own servers.</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Interface Preferences -->\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] p-8 shadow-sm overflow-hidden\">\n <div class=\"flex items-center gap-3 mb-4\">\n <div class=\"w-8 h-8 bg-sky-50 dark:bg-sky-900/30 rounded-lg flex items-center justify-center text-sky-600\">\n <i class=\"pi pi-desktop\"></i>\n </div>\n <h3 class=\"text-lg font-black text-slate-900 dark:text-white tracking-tight\">Interface Preferences</h3>\n </div>\n \n <div class=\"flex flex-col\">\n <div class=\"flex items-center justify-between py-6 border-b border-slate-50 dark:border-slate-800/50\">\n <div class=\"flex flex-col gap-1\">\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">Auto-save Mode</span>\n <span class=\"text-xs font-bold text-slate-500 dark:text-slate-400\">Commit changes immediately while editing templates.</span>\n </div>\n <p-toggleswitch [ngModel]=\"true\"></p-toggleswitch>\n </div>\n <div class=\"flex items-center justify-between py-6 border-b border-slate-50 dark:border-slate-800/50\">\n <div class=\"flex flex-col gap-1\">\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">Developer Logs</span>\n <span class=\"text-xs font-bold text-slate-500 dark:text-slate-400\">Show advanced debug information in the operations panel.</span>\n </div>\n <p-toggleswitch [ngModel]=\"true\"></p-toggleswitch>\n </div>\n <div class=\"flex items-center justify-between py-6\">\n <div class=\"flex flex-col gap-1\">\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">Global Dark Mode</span>\n <span class=\"text-xs font-bold text-slate-500 dark:text-slate-400\">Sync interface theme with your operating system preference.</span>\n </div>\n <p-toggleswitch [ngModel]=\"false\"></p-toggleswitch>\n </div>\n </div>\n </div>\n\n <!-- Footer Actions -->\n <div class=\"sticky bottom-8 z-50 p-6 bg-white/90 dark:bg-slate-900/90 backdrop-blur-xl border border-slate-200 dark:border-slate-800 rounded-[28px] flex flex-col sm:flex-row items-center justify-between gap-6 shadow-2xl shadow-slate-900/20 animate-in slide-in-from-bottom-8 duration-1000\">\n <div class=\"flex items-center gap-3 text-slate-400 dark:text-slate-500\">\n <i class=\"pi pi-info-circle text-lg\"></i>\n <span class=\"text-[10px] font-black uppercase tracking-[0.2em]\">Changes will take effect upon refresh</span>\n </div>\n <div class=\"flex items-center gap-4 w-full sm:w-auto\">\n <p-button label=\"Reset Defaults\" [text]=\"true\" styleClass=\"w-full sm:w-auto px-8 py-3 rounded-2xl font-black text-xs text-slate-500 hover:bg-slate-100 dark:hover:bg-slate-800 transition-all\"></p-button>\n <p-button label=\"Save Changes\" icon=\"pi pi-check\" styleClass=\"w-full sm:w-auto px-10 py-3 bg-blue-600 hover:bg-blue-700 border-none rounded-2xl font-black text-xs shadow-xl shadow-blue-500/20 transition-all active:scale-95\"></p-button>\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; }\n `]\n})\nexport class SettingsComponent implements OnInit {\n private emailService = inject(EmailService);\n\n providers = [\n { label: 'Brevo (Sendinblue)', value: 'brevo' },\n { label: 'AWS SES', value: 'aws' },\n { label: 'SendGrid', value: 'sendgrid' }\n ];\n selectedProvider = this.providers[0];\n\n async ngOnInit() {\n // Logic for loading settings\n }\n}\n","import { Component, inject, signal, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EmailService } from '../../api/email.service';\nimport { AccountInfo } from '../../core/interfaces/email-provider.interface';\n\n// PrimeNG Imports\nimport { CardModule } from 'primeng/card';\nimport { AvatarModule } from 'primeng/avatar';\nimport { TagModule } from 'primeng/tag';\nimport { DividerModule } from 'primeng/divider';\nimport { ButtonModule } from 'primeng/button';\nimport { SkeletonModule } from 'primeng/skeleton';\nimport { ProgressBarModule } from 'primeng/progressbar';\n\n@Component({\n selector: 'lib-profile',\n standalone: true,\n imports: [\n CommonModule, \n CardModule, \n AvatarModule, \n TagModule, \n DividerModule, \n ButtonModule, \n SkeletonModule,\n ProgressBarModule\n ],\n template: `\n <div class=\"max-w-[1300px] mx-auto flex flex-col gap-8 animate-in fade-in slide-in-from-bottom-4 duration-700\">\n \n <!-- Header Card -->\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] p-8 shadow-sm\">\n <div class=\"flex flex-col md:flex-row items-center gap-8\">\n <div class=\"relative group\">\n <div class=\"w-32 h-32 rounded-full overflow-hidden border-4 border-white dark:border-slate-800 shadow-xl group-hover:scale-105 transition-transform duration-300\">\n <p-avatar label=\"NK\" size=\"xlarge\" shape=\"circle\" styleClass=\"w-full h-full bg-blue-600 text-white font-black text-4xl\"></p-avatar>\n </div>\n <button class=\"absolute bottom-1 right-1 w-10 h-10 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-full flex items-center justify-center text-slate-600 dark:text-slate-400 shadow-lg hover:bg-blue-50 dark:hover:bg-slate-700 transition-colors cursor-pointer\">\n <i class=\"pi pi-pencil\"></i>\n </button>\n </div>\n\n <div class=\"flex-1 text-center md:text-left\">\n <h1 class=\"text-4xl font-black text-slate-900 dark:text-white m-0 mb-3 tracking-tighter\">\n {{ account()?.firstName || 'Prateek' }} {{ account()?.lastName || 'Kulshrestha' }}\n </h1>\n <div class=\"flex items-center justify-center md:justify-start gap-3 text-slate-500 dark:text-slate-400 font-bold mb-6\">\n <i class=\"pi pi-envelope text-blue-600\"></i>\n <span>{{ account()?.email || 'support@ngx-brevo.io' }}</span>\n </div>\n <div class=\"flex flex-wrap justify-center md:justify-start gap-3\">\n <div class=\"inline-flex items-center gap-2.5 px-5 py-2 bg-slate-50 dark:bg-slate-800 border border-slate-100 dark:border-slate-700 rounded-full shadow-sm\">\n <div class=\"w-2 h-2 bg-emerald-500 rounded-full animate-pulse\"></div>\n <span class=\"text-xs font-black text-slate-700 dark:text-slate-300 uppercase tracking-widest\">{{ (account()?.plan?.[0]?.type || 'free') + ' Plan' }}</span>\n </div>\n <div class=\"inline-flex items-center gap-2.5 px-5 py-2 bg-slate-50 dark:bg-slate-800 border border-slate-100 dark:border-slate-700 rounded-full shadow-sm\">\n <i class=\"pi pi-building text-slate-400\"></i>\n <span class=\"text-xs font-black text-slate-700 dark:text-slate-300 uppercase tracking-widest\">{{ account()?.companyName || 'ngx-brevo' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-col sm:flex-row gap-4 shrink-0\">\n <p-button label=\"Edit Profile\" [outlined]=\"true\" styleClass=\"w-full sm:w-auto px-8 py-3 rounded-2xl font-black text-sm border-slate-200 dark:border-slate-700 hover:bg-slate-50 dark:hover:bg-slate-800 transition-all\"></p-button>\n <p-button label=\"Manage Billing\" styleClass=\"w-full sm:w-auto px-8 py-3 rounded-2xl font-black text-sm bg-blue-600 hover:bg-blue-700 border-none shadow-lg shadow-blue-500/20 transition-all hover:-translate-y-0.5 active:scale-95\"></p-button>\n </div>\n </div>\n </div>\n\n <div class=\"grid grid-cols-1 lg:grid-cols-3 gap-8\">\n <!-- Operator Identity -->\n <div class=\"lg:col-span-2\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden h-full\">\n <div class=\"px-8 py-6 border-b border-slate-50 dark:border-slate-800/50 flex items-center gap-3\">\n <div class=\"w-8 h-8 bg-blue-50 dark:bg-blue-900/30 rounded-lg flex items-center justify-center text-blue-600\">\n <i class=\"pi pi-id-card\"></i>\n </div>\n <h3 class=\"text-lg font-black text-slate-900 dark:text-white tracking-tight\">Operator Identity</h3>\n </div>\n <div class=\"p-8\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-8 mb-8\">\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest ml-1\">First Name</label>\n <div class=\"w-full px-6 py-4 bg-slate-50 dark:bg-slate-950 border border-slate-100 dark:border-slate-800 rounded-2xl text-sm font-black text-slate-900 dark:text-white tracking-tight\">\n {{ account()?.firstName || 'Prateek' }}\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest ml-1\">Last Name</label>\n <div class=\"w-full px-6 py-4 bg-slate-50 dark:bg-slate-950 border border-slate-100 dark:border-slate-800 rounded-2xl text-sm font-black text-slate-900 dark:text-white tracking-tight\">\n {{ account()?.lastName || 'Kulshrestha' }}\n </div>\n </div>\n </div>\n \n <div class=\"flex flex-col gap-2 mb-8\">\n <label class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest ml-1\">Registered Email</label>\n <div class=\"w-full px-6 py-4 bg-slate-50 dark:bg-slate-950 border border-slate-100 dark:border-slate-800 rounded-2xl flex items-center gap-4 text-sm font-black text-slate-900 dark:text-white tracking-tight\">\n <i class=\"pi pi-envelope text-slate-400\"></i>\n <span>{{ account()?.email || 'support@ngx-brevo.io' }}</span>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest ml-1\">Company Workspace</label>\n <div class=\"w-full px-6 py-4 bg-slate-50 dark:bg-slate-950 border border-slate-100 dark:border-slate-800 rounded-2xl flex items-center gap-4 text-sm font-black text-slate-900 dark:text-white tracking-tight\">\n <i class=\"pi pi-building text-slate-400\"></i>\n <span>{{ account()?.companyName || 'ngx-brevo' }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Subscription Usage -->\n <div class=\"lg:col-span-1\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden h-full flex flex-col\">\n <div class=\"px-8 py-6 border-b border-slate-50 dark:border-slate-800/50 flex items-center justify-between\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-8 h-8 bg-emerald-50 dark:bg-emerald-900/30 rounded-lg flex items-center justify-center text-emerald-600\">\n <i class=\"pi pi-wallet\"></i>\n </div>\n <h3 class=\"text-lg font-black text-slate-900 dark:text-white tracking-tight\">Usage</h3>\n </div>\n <p-tag severity=\"success\" value=\"ACTIVE\" styleClass=\"px-3 py-1 rounded-full text-[10px] font-black tracking-widest\"></p-tag>\n </div>\n <div class=\"p-8 flex-1\">\n <div class=\"mb-10 p-6 bg-slate-50 dark:bg-slate-800/40 rounded-3xl border border-slate-100 dark:border-slate-800/50\">\n <div class=\"flex justify-between items-end mb-4\">\n <span class=\"text-xs font-black text-slate-500 dark:text-slate-400 uppercase tracking-widest\">Email Credits</span>\n <div class=\"flex items-baseline gap-1.5\">\n <span class=\"text-3xl font-black text-slate-900 dark:text-white tracking-tighter\">{{ account()?.plan?.[0]?.credits || 0 }}</span>\n <span class=\"text-xs font-bold text-slate-400 uppercase\">/ 300</span>\n </div>\n </div>\n <p-progressBar [value]=\"((account()?.plan?.[0]?.credits || 0) / 300) * 100\" [showValue]=\"false\" styleClass=\"h-2 rounded-full overflow-hidden bg-slate-200 dark:bg-slate-700\"></p-progressBar>\n <div class=\"text-right mt-3\">\n <span class=\"text-[10px] font-black text-emerald-500 uppercase tracking-widest\">0% of quota consumed</span>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex gap-4 p-4 hover:bg-slate-50 dark:hover:bg-slate-800/50 rounded-2xl transition-colors group\">\n <div class=\"w-12 h-12 bg-blue-50 dark:bg-blue-900/30 rounded-xl flex items-center justify-center text-blue-600 dark:text-blue-400 text-xl group-hover:scale-110 transition-transform\">\n <i class=\"pi pi-calendar\"></i>\n </div>\n <div class=\"flex flex-col justify-center\">\n <span class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest leading-none mb-1\">Billing Renewal</span>\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">June 14, 2026</span>\n </div>\n </div>\n\n <div class=\"flex gap-4 p-4 hover:bg-slate-50 dark:hover:bg-slate-800/50 rounded-2xl transition-colors group\">\n <div class=\"w-12 h-12 bg-indigo-50 dark:bg-indigo-900/30 rounded-xl flex items-center justify-center text-indigo-600 dark:text-indigo-400 text-xl group-hover:scale-110 transition-transform\">\n <i class=\"pi pi-credit-card\"></i>\n </div>\n <div class=\"flex flex-col justify-center\">\n <span class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest leading-none mb-1\">Payment Method</span>\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">VISA **** 4242</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; }\n :host ::ng-deep .p-progressbar-value { background: #2563eb !important; border-radius: 999px; }\n `]\n})\nexport class ProfileComponent implements OnInit {\n private emailService = inject(EmailService);\n \n account = signal<AccountInfo | null>(null);\n loading = signal(true);\n\n async ngOnInit() {\n this.loading.set(true);\n try {\n const data = await this.emailService.getAccountInfo();\n this.account.set(data);\n } catch (e) {\n console.error('Failed to load profile', e);\n } finally {\n this.loading.set(false);\n }\n }\n}\n","import { Component, inject, signal, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EmailService } from '../../api/email.service';\nimport { Sender, Domain, Webhook, Process, BrevoUser } from '../../core/interfaces/email-provider.interface';\n\n// PrimeNG Imports\nimport { CardModule } from 'primeng/card';\nimport { TableModule } from 'primeng/table';\nimport { TagModule } from 'primeng/tag';\nimport { ButtonModule } from 'primeng/button';\nimport { SkeletonModule } from 'primeng/skeleton';\nimport { TabsModule } from 'primeng/tabs';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { AvatarModule } from 'primeng/avatar';\n\n@Component({\n selector: 'lib-infrastructure',\n standalone: true,\n imports: [\n CommonModule, \n CardModule, \n TableModule, \n TagModule, \n ButtonModule, \n SkeletonModule, \n TabsModule,\n TooltipModule,\n AvatarModule\n ],\n template: `\n <div class=\"max-w-[1200px] mx-auto flex flex-col gap-8 animate-in fade-in slide-in-from-bottom-4 duration-700\">\n \n <!-- Header Row -->\n <div class=\"flex flex-col sm:flex-row items-center justify-between gap-6\">\n <div>\n <h1 class=\"text-4xl font-black text-slate-900 dark:text-white m-0 tracking-tighter\">Node Manager</h1>\n <p class=\"text-slate-500 dark:text-slate-400 font-medium mt-2\">Verify senders, domains, and manage real-time webhooks</p>\n </div>\n <div class=\"flex items-center gap-3 w-full sm:w-auto\">\n <p-button icon=\"pi pi-refresh\" [outlined]=\"true\" (click)=\"refresh()\" [loading]=\"loading()\" styleClass=\"w-full sm:w-auto p-3 rounded-2xl border-slate-200 dark:border-slate-700 hover:bg-slate-50 dark:hover:bg-slate-800 transition-all\"></p-button>\n <p-button label=\"Add Asset\" icon=\"pi pi-plus\" styleClass=\"w-full sm:w-auto px-8 py-3 bg-blue-600 hover:bg-blue-700 border-none rounded-2xl font-black text-xs shadow-xl shadow-blue-500/20 transition-all\"></p-button>\n </div>\n </div>\n\n <p-tabs [value]=\"0\">\n <p-tablist styleClass=\"bg-transparent border-none\">\n <p-tab [value]=\"0\" styleClass=\"px-6 py-4 font-black text-xs uppercase tracking-widest transition-all\"><i class=\"pi pi-user mr-2 text-blue-600\"></i> Senders</p-tab>\n <p-tab [value]=\"1\" styleClass=\"px-6 py-4 font-black text-xs uppercase tracking-widest transition-all\"><i class=\"pi pi-globe mr-2 text-blue-600\"></i> Domains</p-tab>\n <p-tab [value]=\"2\" styleClass=\"px-6 py-4 font-black text-xs uppercase tracking-widest transition-all\"><i class=\"pi pi-sync mr-2 text-blue-600\"></i> Webhooks</p-tab>\n <p-tab [value]=\"3\" styleClass=\"px-6 py-4 font-black text-xs uppercase tracking-widest transition-all\"><i class=\"pi pi-bolt mr-2 text-blue-600\"></i> Tasks</p-tab>\n <p-tab [value]=\"4\" styleClass=\"px-6 py-4 font-black text-xs uppercase tracking-widest transition-all\"><i class=\"pi pi-users mr-2 text-blue-600\"></i> Users</p-tab>\n </p-tablist>\n \n <p-tabpanels styleClass=\"p-0 mt-6\">\n <!-- Senders Tab -->\n <p-tabpanel [value]=\"0\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden\">\n <div class=\"hidden md:block\">\n <p-table [value]=\"senders()\" [loading]=\"loading()\" styleClass=\"p-datatable-sm w-full\">\n <ng-template pTemplate=\"header\">\n <tr class=\"border-b border-slate-50 dark:border-slate-800/50\">\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">ID</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Operator Name</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Email Endpoint</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-center\">Status</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-s>\n <tr class=\"hover:bg-slate-50 dark:hover:bg-slate-800/40 transition-colors border-b border-slate-50/50 dark:border-slate-800/30\">\n <td class=\"px-6 py-4\"><span class=\"text-xs font-black text-slate-400 dark:text-slate-600\">#{{ s.id }}</span></td>\n <td class=\"px-6 py-4\"><span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">{{ s.name }}</span></td>\n <td class=\"px-6 py-4\"><span class=\"text-sm font-bold text-slate-500 dark:text-slate-400\">{{ s.email }}</span></td>\n <td class=\"px-6 py-4 text-center\">\n <div class=\"inline-flex items-center gap-2 px-3 py-1 rounded-full text-[10px] font-black tracking-widest\" \n [ngClass]=\"s.active ? 'bg-emerald-50 dark:bg-emerald-950/30 text-emerald-600 dark:text-emerald-400' : 'bg-slate-100 dark:bg-slate-800 text-slate-500'\">\n <div class=\"w-1.5 h-1.5 rounded-full\" [ngClass]=\"s.active ? 'bg-emerald-500 animate-pulse' : 'bg-slate-400'\"></div>\n <span>{{ s.active ? 'VERIFIED' : 'PENDING' }}</span>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n\n <!-- Mobile Grid -->\n <div class=\"md:hidden flex flex-col gap-4 p-6\">\n @for (s of senders(); track s.id) {\n <div class=\"bg-slate-50 dark:bg-slate-950 p-5 rounded-2xl border border-slate-100 dark:border-slate-800 shadow-sm\">\n <div class=\"flex justify-between items-center mb-4\">\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">{{ s.name }}</span>\n <p-tag [severity]=\"s.active ? 'success' : 'warn'\" [value]=\"s.active ? 'VERIFIED' : 'PENDING'\" styleClass=\"px-2 py-1 rounded-full text-[9px] font-black tracking-widest\"></p-tag>\n </div>\n <div class=\"text-xs font-bold text-slate-500 dark:text-slate-400 mb-2\">{{ s.email }}</div>\n <div class=\"text-[9px] font-black text-slate-400 dark:text-slate-600 uppercase tracking-[0.2em]\">NODE ID: #{{ s.id }}</div>\n </div>\n }\n </div>\n </div>\n </p-tabpanel>\n\n <!-- Domains Tab -->\n <p-tabpanel [value]=\"1\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden\">\n <p-table [value]=\"domains()\" [loading]=\"loading()\" styleClass=\"p-datatable-sm w-full\">\n <ng-template pTemplate=\"header\">\n <tr class=\"border-b border-slate-50 dark:border-slate-800/50\">\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Asset Domain</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-center\">Authenticated</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-center\">Verification</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-d>\n <tr class=\"hover:bg-slate-50 dark:hover:bg-slate-800/40 transition-colors border-b border-slate-50/50 dark:border-slate-800/30\">\n <td class=\"px-6 py-4\"><span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">{{ d.domain }}</span></td>\n <td class=\"px-6 py-4 text-center\">\n <div class=\"w-8 h-8 rounded-full bg-slate-50 dark:bg-slate-800 mx-auto flex items-center justify-center\">\n <i class=\"pi\" [class.pi-check-circle]=\"d.authenticated\" [class.text-emerald-500]=\"d.authenticated\" [class.pi-times-circle]=\"!d.authenticated\" [class.text-rose-500]=\"!d.authenticated\"></i>\n </div>\n </td>\n <td class=\"px-6 py-4 text-center\">\n <p-tag [severity]=\"d.verified ? 'success' : 'danger'\" [value]=\"d.verified ? 'YES' : 'NO'\" styleClass=\"px-3 py-1 rounded-full text-[10px] font-black tracking-widest\"></p-tag>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-tabpanel>\n\n <!-- Webhooks Tab -->\n <p-tabpanel [value]=\"2\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden\">\n <p-table [value]=\"webhooks()\" [loading]=\"loading()\" styleClass=\"p-datatable-sm w-full\">\n <ng-template pTemplate=\"header\">\n <tr class=\"border-b border-slate-50 dark:border-slate-800/50\">\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Target URL</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Service Type</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Monitored Events</th>\n <th class=\"px-6 py-4 text-right\" style=\"width: 5rem\"></th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-w>\n <tr class=\"hover:bg-slate-50 dark:hover:bg-slate-800/40 transition-colors border-b border-slate-50/50 dark:border-slate-800/30\">\n <td class=\"px-6 py-4\">\n <span class=\"text-xs font-black text-slate-900 dark:text-white tracking-tight truncate block max-w-[280px]\" [pTooltip]=\"w.url\">{{ w.url }}</span>\n </td>\n <td class=\"px-6 py-4\">\n <p-tag [value]=\"w.type\" severity=\"secondary\" styleClass=\"px-2 py-1 rounded-lg text-[9px] font-black tracking-widest\"></p-tag>\n </td>\n <td class=\"px-6 py-4\">\n <div class=\"flex gap-2 flex-wrap\">\n @for (e of w.events; track e) {\n <span class=\"text-[9px] bg-slate-100 dark:bg-slate-800 text-slate-600 dark:text-slate-400 px-2 py-1 rounded-md font-black uppercase tracking-wider\">{{ e }}</span>\n }\n </div>\n </td>\n <td class=\"px-6 py-4 text-right\">\n <p-button icon=\"pi pi-trash\" [text]=\"true\" severity=\"danger\" styleClass=\"hover:bg-rose-50 dark:hover:bg-rose-900/20 rounded-xl transition-all\"></p-button>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-tabpanel>\n\n <!-- Background Tasks Tab -->\n <p-tabpanel [value]=\"3\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden\">\n <p-table [value]=\"processes()\" [loading]=\"loading()\" styleClass=\"p-datatable-sm w-full\">\n <ng-template pTemplate=\"header\">\n <tr class=\"border-b border-slate-50 dark:border-slate-800/50\">\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Process ID</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Description</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Status</th>\n <th class=\"px-6 py-4 text-right\" style=\"width: 5rem\"></th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-p>\n <tr class=\"hover:bg-slate-50 dark:hover:bg-slate-800/40 transition-colors border-b border-slate-50/50 dark:border-slate-800/30\">\n <td class=\"px-6 py-4\"><span class=\"text-xs font-black text-slate-400 dark:text-slate-600\">#{{ p.id }}</span></td>\n <td class=\"px-6 py-4\"><span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">{{ p.name }}</span></td>\n <td class=\"px-6 py-4\">\n <p-tag [severity]=\"getProcessSeverity(p.status)\" [value]=\"p.status.toUpperCase()\" styleClass=\"px-3 py-1 rounded-full text-[10px] font-black tracking-widest\"></p-tag>\n </td>\n <td class=\"px-6 py-4 text-right\">\n @if (p.export_url) {\n <p-button icon=\"pi pi-download\" [text]=\"true\" (click)=\"downloadExport(p.export_url)\" pTooltip=\"Download Result\" styleClass=\"hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-xl transition-all\"></p-button>\n }\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-tabpanel>\n\n <!-- User Access Tab -->\n <p-tabpanel [value]=\"4\">\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden\">\n <div class=\"hidden md:block\">\n <p-table [value]=\"users()\" [loading]=\"loading()\" styleClass=\"p-datatable-sm w-full\">\n <ng-template pTemplate=\"header\">\n <tr class=\"border-b border-slate-50 dark:border-slate-800/50\">\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Operator Profile</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Assigned Privileges</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-center\">Status</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-u>\n <tr class=\"hover:bg-slate-50 dark:hover:bg-slate-800/40 transition-colors border-b border-slate-50/50 dark:border-slate-800/30\">\n <td class=\"px-6 py-4\">\n <div class=\"flex items-center gap-4\">\n <p-avatar [label]=\"u.email[0].toUpperCase()\" shape=\"circle\" styleClass=\"bg-blue-600 text-white font-black\"></p-avatar>\n <div class=\"flex flex-col\">\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">{{ u.firstName }} {{ u.lastName }}</span>\n <span class=\"text-[10px] font-bold text-slate-400 dark:text-slate-500 uppercase tracking-widest\">{{ u.email }}</span>\n </div>\n </div>\n </td>\n <td class=\"px-6 py-4\">\n <div class=\"flex gap-2 flex-wrap\">\n @for (priv of u.privileges; track priv) {\n <span class=\"text-[9px] bg-blue-50 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400 px-2.5 py-1 rounded-md font-black uppercase tracking-widest border border-blue-100/50 dark:border-blue-800/50\">{{ priv }}</span>\n }\n </div>\n </td>\n <td class=\"px-6 py-4 text-center\">\n <p-tag [severity]=\"u.status === 'active' ? 'success' : 'warn'\" [value]=\"u.status.toUpperCase()\" styleClass=\"px-3 py-1 rounded-full text-[10px] font-black tracking-widest\"></p-tag>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n\n <!-- Mobile Grid -->\n <div class=\"md:hidden flex flex-col gap-4 p-6\">\n @for (u of users(); track u.email) {\n <div class=\"bg-slate-50 dark:bg-slate-950 p-5 rounded-2xl border border-slate-100 dark:border-slate-800 shadow-sm\">\n <div class=\"flex items-center gap-4 mb-5\">\n <p-avatar [label]=\"u.email[0].toUpperCase()\" shape=\"circle\" styleClass=\"bg-blue-600 text-white font-black\"></p-avatar>\n <div class=\"flex flex-col\">\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">{{ u.firstName }} {{ u.lastName }}</span>\n <span class=\"text-[10px] font-bold text-slate-400 dark:text-slate-500 truncate max-w-[150px]\">{{ u.email }}</span>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-2 mb-4\">\n @for (priv of u.privileges; track priv) {\n <span class=\"text-[8px] bg-blue-50 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400 px-2 py-1 rounded-md font-black uppercase tracking-widest border border-blue-100/30 dark:border-blue-800/30\">{{ priv }}</span>\n }\n </div>\n <div class=\"flex justify-between items-center pt-4 border-t border-slate-100 dark:border-slate-800\">\n <span class=\"text-[9px] font-black text-slate-400 dark:text-slate-600 uppercase tracking-[0.2em]\">OPERATOR STATUS</span>\n <p-tag [severity]=\"u.status === 'active' ? 'success' : 'warn'\" [value]=\"u.status.toUpperCase()\" styleClass=\"px-2 py-0.5 rounded-full text-[9px] font-black tracking-widest\"></p-tag>\n </div>\n </div>\n }\n </div>\n </div>\n </p-tabpanel>\n </p-tabpanels>\n </p-tabs>\n </div>\n `,\n styles: [`\n :host { display: block; }\n :host ::ng-deep .p-tablist-tab-list {\n background: transparent !important;\n border-bottom: 2px solid #f1f5f9 !important;\n }\n .dark :host ::ng-deep .p-tablist-tab-list {\n border-bottom-color: #1e293b !important;\n }\n :host ::ng-deep .p-tab {\n border-bottom: 2px solid transparent !important;\n color: #64748b !important;\n }\n :host ::ng-deep .p-tab.p-highlight {\n border-bottom-color: #2563eb !important;\n color: #2563eb !important;\n background: transparent !important;\n }\n `]\n})\nexport class InfrastructureComponent implements OnInit {\n private emailService = inject(EmailService);\n\n loading = signal(true);\n senders = signal<Sender[]>([]);\n domains = signal<Domain[]>([]);\n webhooks = signal<Webhook[]>([]);\n processes = signal<Process[]>([]);\n users = signal<BrevoUser[]>([]);\n\n async ngOnInit() {\n await this.refresh();\n }\n\n async refresh() {\n this.loading.set(true);\n try {\n const [s, d, w, p, u] = await Promise.all([\n this.emailService.getSenders(),\n this.emailService.getDomains(),\n this.emailService.getWebhooks(),\n this.emailService.getProcesses(),\n this.emailService.getUsers()\n ]);\n this.senders.set(s);\n this.domains.set(d);\n this.webhooks.set(w);\n this.processes.set(p);\n this.users.set(u);\n } catch (e) {\n console.error('Failed to load infrastructure assets', e);\n } finally {\n this.loading.set(false);\n }\n }\n\n getProcessSeverity(status: string): 'success' | 'info' | 'warn' | 'danger' | 'secondary' {\n switch (status) {\n case 'completed': return 'success';\n case 'in_process': return 'info';\n case 'queued': return 'warn';\n case 'suspended': return 'danger';\n default: return 'secondary';\n }\n }\n\n downloadExport(url: string) {\n window.open(url, '_blank');\n }\n}\n","import { Component, inject, signal, OnInit, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { EmailService } from '../../api/email.service';\nimport { OrganizationActivity } from '../../core/interfaces/email-provider.interface';\n\n// PrimeNG Imports\nimport { CardModule } from 'primeng/card';\nimport { TableModule } from 'primeng/table';\nimport { TagModule } from 'primeng/tag';\nimport { ButtonModule } from 'primeng/button';\nimport { DatePickerModule } from 'primeng/datepicker';\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { SelectModule } from 'primeng/select';\nimport { TooltipModule } from 'primeng/tooltip';\n\n@Component({\n selector: 'lib-activity-log',\n standalone: true,\n imports: [\n CommonModule, \n FormsModule,\n CardModule, \n TableModule, \n TagModule, \n ButtonModule, \n DatePickerModule,\n IconFieldModule,\n InputIconModule,\n InputTextModule,\n SelectModule,\n TooltipModule\n ],\n template: `\n <div class=\"max-w-[1300px] mx-auto flex flex-col gap-8 animate-in fade-in slide-in-from-bottom-4 duration-700\">\n \n <!-- Header Section -->\n <div class=\"flex flex-col lg:flex-row lg:items-center justify-between gap-6\">\n <div>\n <h1 class=\"text-4xl font-black text-slate-900 dark:text-white m-0 tracking-tighter\">Audit Vault</h1>\n <p class=\"text-slate-500 dark:text-slate-400 font-medium mt-2\">Trace operator actions and security events across your workspace</p>\n </div>\n \n <div class=\"flex flex-col sm:flex-row items-center gap-4 w-full lg:w-auto\">\n <div class=\"flex items-center gap-3 bg-white dark:bg-slate-900 px-4 py-2 border border-slate-200 dark:border-slate-800 rounded-2xl shadow-sm w-full sm:w-auto\">\n <i class=\"pi pi-calendar text-blue-600\"></i>\n <p-datePicker \n [(ngModel)]=\"dateRange\" \n selectionMode=\"range\" \n [readonlyInput]=\"true\" \n placeholder=\"Audit Period\"\n styleClass=\"border-none bg-transparent font-bold text-sm\"\n (onSelect)=\"onDateChange()\"\n ></p-datePicker>\n </div>\n <p-button icon=\"pi pi-refresh\" (click)=\"refresh()\" [loading]=\"loading()\" styleClass=\"w-full sm:w-auto p-3 bg-blue-600 border-none rounded-2xl shadow-lg shadow-blue-500/20\"></p-button>\n </div>\n </div>\n\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden\">\n <p-table \n [value]=\"activities()\" \n [loading]=\"loading()\" \n [rows]=\"15\" \n [paginator]=\"true\" \n styleClass=\"p-datatable-modern w-full\"\n responsiveLayout=\"scroll\"\n >\n <ng-template pTemplate=\"caption\">\n <div class=\"flex flex-col sm:flex-row items-center justify-between gap-4 p-4 border-b border-slate-50 dark:border-slate-800/50\">\n <span class=\"text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-[0.2em]\">Global Activity Stream</span>\n <div class=\"relative w-full sm:w-72 group\">\n <i class=\"pi pi-search absolute left-4 top-1/2 -translate-y-1/2 text-slate-400 group-focus-within:text-blue-600 transition-colors\"></i>\n <input \n pInputText \n type=\"text\" \n placeholder=\"Search audit logs...\" \n (input)=\"onLocalSearch($event)\" \n class=\"w-full bg-slate-50 dark:bg-slate-950 border-none rounded-xl py-2.5 pl-12 pr-4 text-xs font-black text-slate-900 dark:text-white focus:ring-4 focus:ring-blue-500/10 transition-all outline-none\" \n />\n </div>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr class=\"border-b border-slate-50 dark:border-slate-800/50\">\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Timestamp</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Operator</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Action Node</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-center\">Integrity</th>\n <th class=\"px-6 py-4 text-right\" style=\"width: 5rem\"></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-a>\n <tr class=\"group hover:bg-slate-50 dark:hover:bg-slate-800/40 transition-colors border-b border-slate-50/50 dark:border-slate-800/30\">\n <td class=\"px-6 py-5\">\n <span class=\"text-xs font-black text-slate-400 dark:text-slate-600 uppercase tracking-wider\">{{ a.date | date:'MMM d, HH:mm' }}</span>\n </td>\n <td class=\"px-6 py-5\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-8 h-8 rounded-full bg-blue-600 flex items-center justify-center text-white font-black text-[10px] shadow-sm group-hover:scale-110 transition-transform\">\n {{ a.user[0].toUpperCase() }}\n </div>\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">{{ a.user }}</span>\n </div>\n </td>\n <td class=\"px-6 py-5\">\n <span class=\"text-[10px] font-black text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/30 px-3 py-1.5 rounded-lg border border-blue-100/50 dark:border-blue-800/50 uppercase tracking-widest\">{{ a.action }}</span>\n </td>\n <td class=\"px-6 py-5 text-center\">\n <div class=\"inline-flex items-center gap-2 px-3 py-1 rounded-full text-[9px] font-black bg-emerald-50 dark:bg-emerald-950/30 text-emerald-600 dark:text-emerald-400 tracking-[0.2em]\">\n <div class=\"w-1.5 h-1.5 bg-emerald-500 rounded-full animate-pulse\"></div>\n SECURE\n </div>\n </td>\n <td class=\"px-6 py-5 text-right\">\n <p-button icon=\"pi pi-info-circle\" [text]=\"true\" [pTooltip]=\"a.details | json\" styleClass=\"hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-xl transition-all\"></p-button>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"5\" class=\"px-6 py-20 text-center\">\n <div class=\"flex flex-col items-center justify-center opacity-40\">\n <i class=\"pi pi-shield text-5xl mb-4 text-slate-300 dark:text-slate-700\"></i>\n <h3 class=\"text-lg font-black text-slate-900 dark:text-white tracking-tight uppercase\">No Audit Records</h3>\n <p class=\"text-xs font-bold text-slate-500 dark:text-slate-400 mt-1 uppercase tracking-widest\">Adjust your audit period or security filters</p>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; }\n :host ::ng-deep .p-datepicker {\n border: none !important;\n background: transparent !important;\n }\n :host ::ng-deep .p-datepicker input {\n background: transparent !important;\n border: none !important;\n box-shadow: none !important;\n padding: 0 !important;\n width: 180px !important;\n }\n :host ::ng-deep .p-paginator {\n background: transparent !important;\n border: none !important;\n padding: 2rem !important;\n justify-content: flex-end !important;\n }\n :host ::ng-deep .p-paginator button {\n border-radius: 12px !important;\n font-weight: 800 !important;\n }\n :host ::ng-deep .p-paginator .p-highlight {\n background: #2563eb !important;\n color: white !important;\n }\n `]\n})\nexport class ActivityLogComponent implements OnInit {\n private emailService = inject(EmailService);\n\n loading = signal(true);\n activities = signal<OrganizationActivity[]>([]);\n dateRange: Date[] = [];\n\n async ngOnInit() {\n // Default to last 30 days\n const end = new Date();\n const start = new Date();\n start.setDate(start.getDate() - 30);\n this.dateRange = [start, end];\n \n await this.refresh();\n }\n\n async refresh() {\n this.loading.set(true);\n try {\n const startDate = this.dateRange[0]?.toISOString().split('T')[0];\n const endDate = this.dateRange[1]?.toISOString().split('T')[0];\n \n const data = await this.emailService.getOrganizationActivities(startDate, endDate);\n this.activities.set(data);\n } catch (e) {\n console.error('Failed to load audit logs', e);\n } finally {\n this.loading.set(false);\n }\n }\n\n onDateChange() {\n if (this.dateRange && this.dateRange[0] && this.dateRange[1]) {\n this.refresh();\n }\n }\n\n onLocalSearch(event: any) {\n // Table filter handled by PrimeNG if we bind it, \n // but for now we just show how to handle it.\n }\n\n getActionSeverity(action: string): 'success' | 'info' | 'warn' | 'danger' | 'secondary' {\n const a = action.toLowerCase();\n if (a.includes('create') || a.includes('add')) return 'success';\n if (a.includes('delete') || a.includes('remove')) return 'danger';\n if (a.includes('update') || a.includes('edit')) return 'info';\n return 'secondary';\n }\n}\n","import { Component, Input, OnInit, inject, signal, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { EmailService } from '../../api/email.service';\nimport { SmtpLog } from '../../core/interfaces/email-provider.interface';\n\n// PrimeNG Imports\nimport { TableModule } from 'primeng/table';\nimport { TagModule } from 'primeng/tag';\nimport { ButtonModule } from 'primeng/button';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { SkeletonModule } from 'primeng/skeleton';\nimport { DialogModule } from 'primeng/dialog';\nimport { SelectButtonModule } from 'primeng/selectbutton';\n\n@Component({\n selector: 'lib-log-list',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n TableModule,\n TagModule,\n ButtonModule,\n InputTextModule,\n IconFieldModule,\n InputIconModule,\n TooltipModule,\n SkeletonModule,\n DialogModule,\n SelectButtonModule\n ],\n template: `\n <div class=\"flex flex-col gap-8 animate-in fade-in slide-in-from-bottom-4 duration-700\">\n <div class=\"flex flex-col sm:flex-row items-start sm:items-end justify-between gap-4\">\n <div>\n <h1 class=\"text-4xl font-black text-slate-900 dark:text-white tracking-tighter m-0\">Deliverability Logs</h1>\n <p class=\"text-slate-500 dark:text-slate-400 mt-1 font-medium\">Consolidated tracking for all email events and recipients.</p>\n </div>\n <div class=\"flex items-center gap-3\">\n <p-button icon=\"pi pi-sync\" [text]=\"true\" (click)=\"loadLogs()\" [loading]=\"loading()\"></p-button>\n </div>\n </div>\n\n <div class=\"bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 rounded-[32px] shadow-sm overflow-hidden\">\n <div class=\"p-6 flex flex-col md:flex-row items-center justify-between gap-6 border-b border-slate-50 dark:border-slate-800/50\">\n <p-selectButton \n [options]=\"logCategories\" \n [(ngModel)]=\"activeCategory\" \n (onChange)=\"onCategoryChange()\"\n optionLabel=\"label\" \n optionValue=\"value\"\n styleClass=\"p-selectbutton-sm rounded-xl shrink-0\"\n ></p-selectButton>\n\n <p-iconField iconPosition=\"left\" class=\"w-full max-w-md\">\n <p-inputIcon styleClass=\"pi pi-search\"></p-inputIcon>\n <input type=\"text\" pInputText placeholder=\"Search recipient or subject...\" (input)=\"onSearch($event)\" class=\"w-full bg-slate-50 dark:bg-slate-950 border-none rounded-xl py-2.5 font-bold text-sm outline-none ring-offset-0 focus:ring-2 focus:ring-blue-500/20 transition-all\">\n </p-iconField>\n </div>\n\n <div class=\"p-2\">\n <p-table \n [value]=\"logs()\" \n [loading]=\"loading()\" \n [paginator]=\"true\" \n [rows]=\"10\" \n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"Showing {first} to {last} of {totalRecords} entries\"\n styleClass=\"p-datatable-sm w-full\"\n >\n <ng-template pTemplate=\"header\">\n <tr class=\"border-b border-slate-50 dark:border-slate-800/50\">\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Recipient</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Event</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Subject</th>\n <th class=\"px-6 py-4 text-[10px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest text-left\">Date</th>\n <th class=\"px-6 py-4 text-right\">Actions</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-log>\n <tr class=\"group hover:bg-slate-50 dark:hover:bg-slate-800/40 transition-colors\">\n <td class=\"px-6 py-4\">\n <span class=\"text-sm font-black text-slate-900 dark:text-white tracking-tight\">{{ log.email }}</span>\n </td>\n <td class=\"px-6 py-4\">\n <div class=\"inline-flex items-center gap-2 px-3 py-1 rounded-full text-[10px] font-black tracking-widest uppercase transition-colors\" \n [ngClass]=\"getEventStyles(log.event)\">\n <div class=\"w-1.5 h-1.5 rounded-full\" [ngClass]=\"getEventDot(log.event)\"></div>\n <span>{{ log.event }}</span>\n </div>\n </td>\n <td class=\"px-6 py-4\">\n <span class=\"text-xs font-bold text-slate-500 dark:text-slate-400 truncate max-w-[200px]\" [pTooltip]=\"log.subject\">{{ log.subject || 'No Subject' }}</span>\n </td>\n <td class=\"px-6 py-4\">\n <span class=\"text-xs font-bold text-slate-500 dark:text-slate-400\">{{ log.date | date:'medium' }}</span>\n </td>\n <td class=\"px-6 py-4 text-right\">\n <button \n (click)=\"previewEmail(log)\" \n class=\"p-2 text-slate-400 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-xl transition-all cursor-pointer group\"\n >\n <i class=\"pi pi-eye text-lg group-hover:scale-110 transition-transform\"></i>\n </button>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"5\" class=\"text-center py-12 opacity-50\">\n <i class=\"pi pi-inbox text-4xl mb-4 text-slate-300 dark:text-slate-700\"></i>\n <p class=\"text-sm font-black text-slate-400 dark:text-slate-600 uppercase tracking-widest\">No matching logs found</p>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n </div>\n\n <!-- Custom Tailwind Modal -->\n @if (previewVisible) {\n <div class=\"fixed inset-0 z-[10002] flex items-center justify-center p-4 sm:p-6 animate-in fade-in duration-300\">\n <!-- Backdrop -->\n <div class=\"absolute inset-0 bg-slate-950/60 backdrop-blur-md\" (click)=\"previewVisible = false\"></div>\n \n <!-- Modal Content -->\n <div class=\"relative bg-white dark:bg-slate-900 w-full max-w-5xl h-[85vh] rounded-[40px] shadow-2xl border border-white/20 dark:border-slate-800 flex flex-col overflow-hidden animate-in zoom-in-95 slide-in-from-bottom-8 duration-500\">\n <!-- Header -->\n <div class=\"px-8 py-6 flex items-center justify-between border-b border-slate-50 dark:border-slate-800/50\">\n <div>\n <h2 class=\"text-2xl font-black text-slate-900 dark:text-white tracking-tight m-0\">Email Content Preview</h2>\n <p class=\"text-xs font-bold text-slate-400 dark:text-slate-500 uppercase tracking-widest mt-1\">Recipient: {{ activeLog?.email }}</p>\n </div>\n <button (click)=\"previewVisible = false\" class=\"w-12 h-12 rounded-2xl bg-slate-50 dark:bg-slate-800 flex items-center justify-center text-slate-400 hover:text-rose-500 hover:bg-rose-50 dark:hover:bg-rose-900/20 transition-all\">\n <i class=\"pi pi-times text-xl\"></i>\n </button>\n </div>\n\n <!-- Body -->\n <div class=\"flex-1 overflow-hidden relative bg-slate-50 dark:bg-slate-950 p-6\">\n <div class=\"h-full rounded-2xl border border-slate-200 dark:border-slate-800 bg-white overflow-hidden shadow-inner\">\n @if (previewLoading()) {\n <div class=\"p-8 flex flex-col gap-4\">\n <div class=\"h-8 bg-slate-100 dark:bg-slate-800 rounded-lg animate-pulse\"></div>\n <div class=\"flex-1 bg-slate-50 dark:bg-slate-900 rounded-lg animate-pulse min-h-[400px]\"></div>\n </div>\n } @else {\n <iframe [srcdoc]=\"previewHtml()\" class=\"w-full h-full border-none\"></iframe>\n }\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"px-8 py-4 bg-slate-50/50 dark:bg-slate-900/50 border-t border-slate-100 dark:border-slate-800 flex items-center justify-between\">\n <div class=\"flex items-center gap-4\">\n <span class=\"text-[10px] font-black text-slate-400 uppercase tracking-widest\">Subject</span>\n <span class=\"text-xs font-bold text-slate-600 dark:text-slate-400\">{{ activeLog?.subject }}</span>\n </div>\n <button (click)=\"previewVisible = false\" class=\"px-6 py-2.5 bg-slate-900 dark:bg-white text-white dark:text-slate-900 rounded-xl font-black text-xs uppercase tracking-widest hover:scale-105 active:scale-95 transition-all\">\n Close Preview\n </button>\n </div>\n </div>\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n :host ::ng-deep .p-dialog-header {\n background: transparent !important;\n border: none !important;\n padding: 1.5rem 1.5rem 1rem 1.5rem !important;\n }\n :host ::ng-deep .p-dialog-content {\n background: transparent !important;\n padding: 0 1.5rem 1.5rem 1.5rem !important;\n }\n `]\n})\nexport class LogListComponent implements OnInit, OnChanges {\n @Input() initialEvent: string = 'delivered';\n \n private emailService = inject(EmailService);\n \n logs = signal<SmtpLog[]>([]);\n loading = signal(true);\n \n activeCategory = signal<string>('delivered');\n logCategories = [\n { label: 'Delivered', value: 'delivered' },\n { label: 'Hard Bounces', value: 'hardBounces' },\n { label: 'Soft Bounces', value: 'softBounces' },\n { label: 'Unsubscribed', value: 'unsubscribed' }\n ];\n\n previewVisible = false;\n previewLoading = signal(false);\n activeLog: SmtpLog | null = null;\n previewHtml = signal<string>('');\n\n async ngOnInit() {\n this.activeCategory.set(this.initialEvent);\n await this.loadLogs();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['initialEvent']) {\n this.activeCategory.set(this.initialEvent);\n this.loadLogs();\n }\n }\n\n onCategoryChange() {\n this.loadLogs();\n }\n\n async loadLogs() {\n this.loading.set(true);\n try {\n const data = await this.emailService.getSmtpLogs(100, 0, this.activeCategory());\n this.logs.set(data);\n } catch (e) {\n console.error('Failed to load logs', e);\n } finally {\n this.loading.set(false);\n }\n }\n\n async previewEmail(log: SmtpLog) {\n console.log('Previewing email for log:', log);\n if (!log.templateId) {\n console.warn('No templateId found for this log');\n this.previewHtml.set('<div class=\"p-12 text-center flex flex-col items-center justify-center h-full\"><i class=\"pi pi-exclamation-triangle text-4xl text-amber-500 mb-4\"></i><p class=\"text-slate-500 font-bold\">This email was sent as a dynamic raw HTML message without an associated template. Brevo logs do not store the full content of non-template emails for security and storage reasons.</p></div>');\n } else {\n this.previewLoading.set(true);\n try {\n const template = await this.emailService.getTemplate(log.templateId);\n this.previewHtml.set(template.htmlContent);\n } catch (e) {\n console.error('Failed to fetch template for preview', e);\n this.previewHtml.set('<div class=\"p-12 text-center text-slate-500\">Could not load email content. The template may have been deleted.</div>');\n } finally {\n this.previewLoading.set(false);\n }\n }\n \n this.activeLog = log;\n this.previewVisible = true;\n }\n\n onSearch(event: any) {\n // Search implementation...\n }\n\n getEventStyles(event: string) {\n switch (event) {\n case 'delivered': return 'bg-emerald-50 dark:bg-emerald-950/30 text-emerald-600 dark:text-emerald-400';\n case 'hardBounce':\n case 'softBounce': return 'bg-rose-50 dark:bg-rose-950/30 text-rose-600 dark:text-rose-400';\n case 'unsubscribed': return 'bg-amber-50 dark:bg-amber-950/30 text-amber-600 dark:text-amber-400';\n case 'opened': return 'bg-blue-50 dark:bg-blue-950/30 text-blue-600 dark:text-blue-400';\n default: return 'bg-slate-100 dark:bg-slate-800 text-slate-500';\n }\n }\n\n getEventDot(event: string) {\n switch (event) {\n case 'delivered': return 'bg-emerald-500';\n case 'hardBounce':\n case 'softBounce': return 'bg-rose-500';\n case 'unsubscribed': return 'bg-amber-500';\n case 'opened': return 'bg-blue-500';\n default: return 'bg-slate-400';\n }\n }\n}\n","import { Component, computed, signal, inject, HostListener, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TemplateListComponent } from './features/template-list/template-list.component';\nimport { TemplateEditorComponent } from './features/template-editor/template-editor.component';\nimport { BulkStatusPanelComponent } from './features/bulk-operations/bulk-status-panel.component';\nimport { BulkOperationsDashboardComponent } from './features/bulk-operations/bulk-operations-dashboard.component';\nimport { StatsComponent } from './features/dashboard/stats.component';\nimport { AuthStore } from './state/auth.store';\nimport { LoginComponent } from './features/auth/login.component';\nimport { SettingsComponent } from './features/settings/settings.component';\nimport { ProfileComponent } from './features/profile/profile.component';\nimport { InfrastructureComponent } from './features/infrastructure/infrastructure.component';\nimport { ActivityLogComponent } from './features/activity/activity-log.component';\nimport { LogListComponent } from './features/logs/log-list.component';\nimport { ThemeService } from './core/services/theme.service';\n\n// PrimeNG Imports\nimport { ButtonModule } from 'primeng/button';\nimport { ToolbarModule } from 'primeng/toolbar';\nimport { AvatarModule } from 'primeng/avatar';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { ToastModule } from 'primeng/toast';\n\n@Component({\n selector: 'lib-ngx-brevo-dashboard',\n standalone: true,\n imports: [\n CommonModule,\n TemplateListComponent,\n TemplateEditorComponent,\n BulkStatusPanelComponent,\n BulkOperationsDashboardComponent,\n StatsComponent,\n LoginComponent,\n SettingsComponent,\n ProfileComponent,\n InfrastructureComponent,\n ActivityLogComponent,\n LogListComponent,\n ButtonModule,\n ToolbarModule,\n AvatarModule,\n InputTextModule,\n TooltipModule,\n ToastModule\n ],\n template: `\n @if (!auth.isAuthenticated()) {\n <lib-login></lib-login>\n } @else {\n <p-toast></p-toast>\n <div class=\"h-screen w-screen flex bg-white dark:bg-slate-950 text-slate-900 dark:text-white overflow-hidden transition-colors duration-300\">\n \n <!-- Sidebar -->\n <aside \n class=\"fixed lg:relative z-[1001] w-[280px] h-full bg-slate-50 dark:bg-slate-900/50 border-r border-slate-200 dark:border-slate-800 flex flex-col transition-transform duration-300 ease-in-out backdrop-blur-xl\"\n [class.-translate-x-full]=\"!mobileSidebarActive() && isMobile()\"\n [class.translate-x-0]=\"mobileSidebarActive() || !isMobile()\"\n >\n <div class=\"px-0 py-0 mb-0 overflow-hidden\">\n <div class=\"flex items-center justify-center group cursor-default\">\n <div class=\"relative w-full h-auto flex items-center justify-center\">\n <img src=\"/logo.png\" alt=\"logo\" class=\"w-full h-full object-contain transition-transform duration-500 group-hover:scale-[1.02]\">\n </div>\n </div>\n </div>\n\n <!-- Quick User Profile -->\n <div class=\"px-6 mb-8\">\n <div class=\"p-4 bg-white dark:bg-slate-800 rounded-2xl border border-slate-200 dark:border-slate-700/50 shadow-sm flex items-center gap-3\">\n <p-avatar label=\"NK\" shape=\"circle\" size=\"normal\" styleClass=\"bg-blue-100 text-blue-700 font-black\"></p-avatar>\n <div class=\"flex flex-col overflow-hidden\">\n <span class=\"text-sm font-black truncate\">Marketing Admin</span>\n <span class=\"text-[10px] text-slate-500 font-bold uppercase tracking-wider\">Global Workspace</span>\n </div>\n </div>\n </div>\n\n <nav class=\"flex-1 overflow-y-auto px-4 custom-scrollbar\">\n <ul class=\"flex flex-col gap-1.5 list-none p-0 m-0\">\n <li *ngFor=\"let item of menuItems\">\n <a \n (click)=\"setTab(item.id)\"\n class=\"flex items-center gap-3.5 px-5 py-3.5 rounded-xl font-bold text-[0.92rem] transition-all cursor-pointer group\"\n [class]=\"activeTab() === item.id ? \n 'bg-blue-600 text-white shadow-lg shadow-blue-500/20' : \n 'text-slate-500 dark:text-slate-400 hover:bg-slate-200/50 dark:hover:bg-slate-800 hover:text-slate-900 dark:hover:text-white'\"\n >\n <i [class]=\"item.icon\" class=\"text-lg\" [class.text-blue-200]=\"activeTab() === item.id\"></i>\n <span>{{item.label}}</span>\n </a>\n </li>\n </ul>\n </nav>\n\n <div class=\"p-6 border-t border-slate-200 dark:border-slate-800\">\n <ul class=\"flex flex-col gap-1 list-none p-0 m-0\">\n <li>\n <a (click)=\"setTab('settings')\" class=\"flex items-center gap-3.5 px-5 py-3.5 rounded-xl font-bold text-[0.92rem] text-slate-500 dark:text-slate-400 hover:bg-slate-200/50 dark:hover:bg-slate-800 transition-all cursor-pointer\">\n <i class=\"pi pi-question-circle text-lg\"></i>\n <span>Support</span>\n </a>\n </li>\n <li>\n <a (click)=\"auth.logout()\" class=\"flex items-center gap-3.5 px-5 py-3.5 rounded-xl font-bold text-[0.92rem] text-red-500 hover:bg-red-50 dark:hover:bg-red-900/10 transition-all cursor-pointer\">\n <i class=\"pi pi-sign-out text-lg\"></i>\n <span>Logout</span>\n </a>\n </li>\n </ul>\n </div>\n </aside>\n\n <!-- Main Body -->\n <div class=\"flex-1 flex flex-col min-w-0 bg-white dark:bg-slate-950 overflow-hidden\">\n <header class=\"h-20 border-b border-slate-200 dark:border-slate-800 flex items-center justify-between px-8 bg-white/80 dark:bg-slate-950/80 backdrop-blur-md sticky top-0 z-50 shrink-0\">\n <div class=\"flex items-center gap-6 flex-1\">\n <button class=\"p-2 lg:hidden text-slate-500 hover:bg-slate-100 rounded-lg transition-colors\" (click)=\"onMenuButtonClick()\">\n <i class=\"pi pi-bars text-xl\"></i>\n </button>\n <div class=\"w-full max-w-[440px] relative group hidden md:block\">\n <i class=\"pi pi-search absolute left-4 top-1/2 -translate-y-1/2 text-slate-400 group-focus-within:text-blue-600 transition-colors\"></i>\n <input \n type=\"text\" \n placeholder=\"Search campaigns, contacts...\" \n class=\"w-full bg-slate-100 dark:bg-slate-900 border-none rounded-xl py-2.5 pl-12 pr-4 text-sm font-medium focus:ring-2 focus:ring-blue-500/20 transition-all outline-none\"\n >\n </div>\n </div>\n \n <div class=\"flex items-center gap-5\">\n <div class=\"hidden xl:flex flex-col items-end mr-2\">\n <span class=\"text-xs font-black text-slate-900 dark:text-white leading-none mb-1\">Good morning, Admin</span>\n </div>\n\n <div class=\"flex items-center bg-slate-100 dark:bg-slate-900 p-1.5 rounded-xl gap-1\">\n <button (click)=\"themeService.toggle()\" class=\"w-9 h-9 flex items-center justify-center rounded-lg text-slate-500 hover:text-blue-600 hover:bg-white dark:hover:bg-slate-800 transition-all shadow-sm\">\n <i [class]=\"themeService.theme() === 'dark' ? 'pi pi-sun' : 'pi pi-moon'\"></i>\n </button>\n <button class=\"w-9 h-9 flex items-center justify-center rounded-lg text-slate-500 hover:text-blue-600 hover:bg-white dark:hover:bg-slate-800 transition-all shadow-sm relative\">\n <i class=\"pi pi-bell\"></i>\n <span class=\"absolute top-2 right-2 w-2 h-2 bg-red-500 rounded-full border-2 border-slate-100 dark:border-slate-900\"></span>\n </button>\n </div>\n\n <div class=\"h-8 w-px bg-slate-200 dark:border-slate-800 hidden sm:block\"></div>\n\n <p-button label=\"Create\" icon=\"pi pi-plus\" styleClass=\"bg-blue-600 border-none rounded-xl font-black text-xs px-4 py-2.5 shadow-lg shadow-blue-500/20 hover:scale-105 transition-all active:scale-95\"></p-button>\n </div>\n </header>\n\n <main class=\"flex-1 overflow-y-auto p-6 lg:p-8 animate-in fade-in slide-in-from-bottom-4 duration-500 custom-scrollbar\">\n @if (activeTab() === 'dashboard') {\n <lib-stats (navigateTo)=\"handleNavigation($event)\"></lib-stats>\n } @else if (activeTab() === 'list') {\n <lib-template-list (editTemplate)=\"onEdit($event)\"></lib-template-list>\n } @else if (activeTab() === 'editor' && editingId()) {\n <lib-template-editor [templateId]=\"editingId()!\"></lib-template-editor>\n } @else if (activeTab() === 'settings') {\n <lib-settings></lib-settings>\n } @else if (activeTab() === 'profile') {\n <lib-profile></lib-profile>\n } @else if (activeTab() === 'infra') {\n <lib-infrastructure></lib-infrastructure>\n } @else if (activeTab() === 'activity') {\n <lib-activity-log></lib-activity-log>\n } @else if (activeTab() === 'bulk') {\n <lib-bulk-operations-dashboard (navigateTo)=\"handleNavigation($event)\"></lib-bulk-operations-dashboard>\n } @else if (activeTab() === 'logs') {\n <lib-log-list></lib-log-list>\n }\n </main>\n </div>\n\n <!-- Mobile Mask -->\n @if (mobileSidebarActive()) {\n <div \n class=\"fixed inset-0 bg-slate-900/60 backdrop-blur-sm z-[1000] lg:hidden transition-opacity duration-300\"\n (click)=\"closeMobileMenu()\"\n ></div>\n }\n \n <lib-bulk-status-panel></lib-bulk-status-panel>\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n .custom-scrollbar::-webkit-scrollbar { width: 6px; }\n .custom-scrollbar::-webkit-scrollbar-track { background: transparent; }\n .custom-scrollbar::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.1); border-radius: 10px; }\n .dark .custom-scrollbar::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); }\n @keyframes shimmer {\n 0% { transform: translateX(-150%) rotate(45deg); }\n 100% { transform: translateX(150%) rotate(45deg); }\n }\n @keyframes bounce-subtle {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-3px); }\n }\n @keyframes lightning-pulse {\n 0%, 100% { transform: scale(1) rotate(0deg); filter: brightness(1); }\n 50% { transform: scale(1.1) rotate(-5deg); filter: brightness(1.5); }\n }\n @keyframes lightning-shiver {\n 0%, 100% { transform: scale(1) translate(0, 0); filter: brightness(1) contrast(1); }\n 10%, 30%, 50%, 70%, 90% { transform: scale(1.05) translate(1px, -1px); filter: brightness(1.3) contrast(1.2); }\n 20%, 40%, 60%, 80% { transform: scale(1.02) translate(-1px, 1px); filter: brightness(1.1) contrast(1.1); }\n }\n .animate-lightning-shiver {\n animation: lightning-shiver 4s linear infinite;\n }\n `]\n})\nexport class NgxBrevoDashboardComponent {\n auth = inject(AuthStore);\n themeService = inject(ThemeService);\n\n activeTab = signal<'dashboard' | 'list' | 'editor' | 'settings' | 'bulk' | 'profile' | 'infra' | 'activity' | 'analytics' | 'logs'>(\n (localStorage.getItem('mf_active_tab') as any) || 'dashboard'\n );\n editingId = signal<string | number | null>(localStorage.getItem('mf_editing_id'));\n\n mobileSidebarActive = signal(false);\n\n menuItems = [\n { id: 'dashboard', label: 'Dashboard', icon: 'pi pi-th-large' },\n { id: 'profile', label: 'My Profile', icon: 'pi pi-user' },\n { id: 'infra', label: 'Node Manager', icon: 'pi pi-id-card' },\n { id: 'bulk', label: 'Bulk Operations', icon: 'pi pi-sparkles' },\n { id: 'list', label: 'Email Templates', icon: 'pi pi-envelope' },\n { id: 'logs', label: 'Email Logs', icon: 'pi pi-history' },\n { id: 'analytics', label: 'Analytics', icon: 'pi pi-chart-bar' },\n { id: 'activity', label: 'Activity Logs', icon: 'pi pi-comments' },\n { id: 'settings', label: 'Settings', icon: 'pi pi-cog' }\n ];\n\n constructor() {\n this.checkBreakpoint();\n effect(() => {\n localStorage.setItem('mf_active_tab', this.activeTab());\n const editId = this.editingId();\n if (editId) {\n localStorage.setItem('mf_editing_id', editId.toString());\n } else {\n localStorage.removeItem('mf_editing_id');\n }\n });\n }\n\n @HostListener('window:resize')\n onResize() {\n this.checkBreakpoint();\n }\n\n isMobile() {\n return window.innerWidth <= 991;\n }\n\n checkBreakpoint() {\n if (window.innerWidth > 991) {\n this.mobileSidebarActive.set(false);\n }\n }\n\n onMenuButtonClick() {\n this.mobileSidebarActive.update(v => !v);\n }\n\n setTab(tab: any) {\n this.activeTab.set(tab);\n if (tab !== 'editor') {\n this.editingId.set(null);\n }\n this.mobileSidebarActive.set(false);\n }\n\n handleNavigation(event: any) {\n if (typeof event === 'string') {\n this.setTab(event);\n } else if (event?.tab) {\n this.setTab(event.tab);\n if (event.id) {\n this.editingId.set(event.id);\n }\n }\n }\n\n closeMobileMenu() {\n this.mobileSidebarActive.set(false);\n }\n\n onEdit(id: string | number) {\n this.editingId.set(id);\n this.activeTab.set('editor');\n }\n}\n","import { Injectable, signal, computed, inject } from '@angular/core';\nimport { EmailTemplate } from '../core/interfaces/email-provider.interface';\nimport { EmailService } from '../api/email.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TemplateStore {\n private emailService = inject(EmailService);\n\n // State\n private _templates = signal<EmailTemplate[]>([]);\n private _loading = signal<boolean>(false);\n private _error = signal<string | null>(null);\n private _searchQuery = signal<string>('');\n\n // Selectors\n templates = computed(() => {\n const query = this._searchQuery().toLowerCase();\n if (!query) return this._templates();\n return this._templates().filter(t => \n t.name.toLowerCase().includes(query) || \n t.subject.toLowerCase().includes(query)\n );\n });\n loading = computed(() => this._loading());\n error = computed(() => this._error());\n\n // Actions\n async loadTemplates() {\n this._loading.set(true);\n try {\n const data = await this.emailService.listTemplates();\n this._templates.set(data);\n this._error.set(null);\n } catch (e: any) {\n this._error.set(e.message || 'Failed to load templates');\n } finally {\n this._loading.set(false);\n }\n }\n\n setSearchQuery(query: string) {\n this._searchQuery.set(query);\n }\n\n updateLocalTemplate(template: EmailTemplate) {\n this._templates.update(list => \n list.map(t => t.id === template.id ? template : t)\n );\n }\n}\n","import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { MessageService } from 'primeng/api';\nimport { catchError, throwError } from 'rxjs';\n\nexport const errorInterceptor: HttpInterceptorFn = (req, next) => {\n const messageService = inject(MessageService);\n\n return next(req).pipe(\n catchError((error: HttpErrorResponse) => {\n let errorMessage = 'An unknown error occurred';\n \n if (error.error instanceof ErrorEvent) {\n // Client-side error\n errorMessage = `Error: ${error.error.message}`;\n } else {\n // Server-side error\n errorMessage = error.error?.message || error.statusText || `Error Code: ${error.status}`;\n }\n\n messageService.add({\n severity: 'error',\n summary: 'API Error',\n detail: errorMessage,\n life: 5000\n });\n\n return throwError(() => error);\n })\n );\n};\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LoaderService {\n private activeRequests = 0;\n loading = signal(false);\n\n show() {\n this.activeRequests++;\n this.loading.set(true);\n }\n\n hide() {\n this.activeRequests--;\n if (this.activeRequests <= 0) {\n this.activeRequests = 0;\n this.loading.set(false);\n }\n }\n}\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { finalize } from 'rxjs';\nimport { LoaderService } from '../services/loader.service';\n\nexport const loaderInterceptor: HttpInterceptorFn = (req, next) => {\n const loaderService = inject(LoaderService);\n \n // Optionally skip loading for specific requests\n if (req.headers.has('skip-loader')) {\n return next(req);\n }\n\n loaderService.show();\n \n return next(req).pipe(\n finalize(() => loaderService.hide())\n );\n};\n","import { Component, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LoaderService } from '../../services/loader.service';\n\n@Component({\n selector: 'lib-loader',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div *ngIf=\"loaderService.loading()\" class=\"loader-overlay\">\n <div class=\"loader-content\">\n <div class=\"loader\">\n <span><span></span><span></span><span></span><span></span></span>\n <div class=\"base\">\n <span></span>\n <div class=\"face\"></div>\n </div>\n </div>\n <div class=\"longfazers\">\n <span></span><span></span><span></span><span></span>\n </div>\n </div>\n <div class=\"loading-text\">Speeding up your operations...</div>\n </div>\n `,\n styles: [`\n .loader-overlay {\n position: fixed;\n inset: 0;\n background: rgba(255, 255, 255, 0.9);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 9999;\n backdrop-filter: blur(8px);\n }\n\n :host-context(.dark) .loader-overlay {\n background: rgba(15, 23, 42, 0.9);\n }\n\n .loader-content {\n position: relative;\n height: 100px;\n width: 200px;\n }\n\n .loading-text {\n margin-top: 40px;\n font-weight: 800;\n text-transform: uppercase;\n letter-spacing: 0.3em;\n font-size: 10px;\n color: #000;\n }\n\n :host-context(.dark) .loading-text {\n color: #fff;\n }\n\n /* From Uiverse.io by anand_4957 */ \n .loader {\n position: absolute;\n top: 50%;\n margin-left: -50px;\n left: 50%;\n animation: speeder 0.4s linear infinite;\n }\n .loader > span {\n height: 5px;\n width: 35px;\n background: #000;\n position: absolute;\n top: -19px;\n left: 60px;\n border-radius: 2px 10px 1px 0;\n }\n :host-context(.dark) .loader > span { background: #fff; }\n\n .base span {\n position: absolute;\n width: 0;\n height: 0;\n border-top: 6px solid transparent;\n border-right: 100px solid #000;\n border-bottom: 6px solid transparent;\n }\n :host-context(.dark) .base span { border-right-color: #fff; }\n\n .base span:before {\n content: \"\";\n height: 22px;\n width: 22px;\n border-radius: 50%;\n background: #000;\n position: absolute;\n right: -110px;\n top: -16px;\n }\n :host-context(.dark) .base span:before { background: #fff; }\n\n .base span:after {\n content: \"\";\n position: absolute;\n width: 0;\n height: 0;\n border-top: 0 solid transparent;\n border-right: 55px solid #000;\n border-bottom: 16px solid transparent;\n top: -16px;\n right: -98px;\n }\n :host-context(.dark) .base span:after { border-right-color: #fff; }\n\n .face {\n position: absolute;\n height: 12px;\n width: 20px;\n background: #000;\n border-radius: 20px 20px 0 0;\n transform: rotate(-40deg);\n right: -125px;\n top: -15px;\n }\n :host-context(.dark) .face { background: #fff; }\n\n .face:after {\n content: \"\";\n height: 12px;\n width: 12px;\n background: #000;\n right: 4px;\n top: 7px;\n position: absolute;\n transform: rotate(40deg);\n transform-origin: 50% 50%;\n border-radius: 0 0 0 2px;\n }\n :host-context(.dark) .face:after { background: #fff; }\n\n .loader > span > span:nth-child(1),\n .loader > span > span:nth-child(2),\n .loader > span > span:nth-child(3),\n .loader > span > span:nth-child(4) {\n width: 30px;\n height: 1px;\n background: #000;\n position: absolute;\n animation: fazer1 0.2s linear infinite;\n }\n :host-context(.dark) .loader > span > span { background: #fff; }\n\n .loader > span > span:nth-child(2) {\n top: 3px;\n animation: fazer2 0.4s linear infinite;\n }\n .loader > span > span:nth-child(3) {\n top: 1px;\n animation: fazer3 0.4s linear infinite;\n animation-delay: -1s;\n }\n .loader > span > span:nth-child(4) {\n top: 4px;\n animation: fazer4 1s linear infinite;\n animation-delay: -1s;\n }\n @keyframes fazer1 {\n 0% { left: 0; }\n 100% { left: -80px; opacity: 0; }\n }\n @keyframes fazer2 {\n 0% { left: 0; }\n 100% { left: -100px; opacity: 0; }\n }\n @keyframes fazer3 {\n 0% { left: 0; }\n 100% { left: -50px; opacity: 0; }\n }\n @keyframes fazer4 {\n 0% { left: 0; }\n 100% { left: -150px; opacity: 0; }\n }\n @keyframes speeder {\n 0% { transform: translate(2px, 1px) rotate(0deg); }\n 10% { transform: translate(-1px, -3px) rotate(-1deg); }\n 20% { transform: translate(-2px, 0px) rotate(1deg); }\n 30% { transform: translate(1px, 2px) rotate(0deg); }\n 40% { transform: translate(1px, -1px) rotate(1deg); }\n 50% { transform: translate(-1px, 3px) rotate(-1deg); }\n 60% { transform: translate(-1px, 1px) rotate(0deg); }\n 70% { transform: translate(3px, 1px) rotate(-1deg); }\n 80% { transform: translate(-2px, -1px) rotate(1deg); }\n 90% { transform: translate(2px, 1px) rotate(0deg); }\n 100% { transform: translate(1px, -2px) rotate(-1deg); }\n }\n .longfazers {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n .longfazers span {\n position: absolute;\n height: 2px;\n width: 20%;\n background: #000;\n }\n :host-context(.dark) .longfazers span { background: #fff; }\n\n .longfazers span:nth-child(1) {\n top: 20%;\n animation: lf 0.6s linear infinite;\n animation-delay: -5s;\n }\n .longfazers span:nth-child(2) {\n top: 40%;\n animation: lf2 0.8s linear infinite;\n animation-delay: -1s;\n }\n .longfazers span:nth-child(3) {\n top: 60%;\n animation: lf3 0.6s linear infinite;\n }\n .longfazers span:nth-child(4) {\n top: 80%;\n animation: lf4 0.5s linear infinite;\n animation-delay: -3s;\n }\n @keyframes lf {\n 0% { left: 200%; }\n 100% { left: -200%; opacity: 0; }\n }\n @keyframes lf2 {\n 0% { left: 200%; }\n 100% { left: -200%; opacity: 0; }\n }\n @keyframes lf3 {\n 0% { left: 200%; }\n 100% { left: -100%; opacity: 0; }\n }\n @keyframes lf4 {\n 0% { left: 200%; }\n 100% { left: -100%; opacity: 0; }\n }\n `]\n})\nexport class LoaderComponent {\n loaderService = inject(LoaderService);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i4","i1","i3","i5","i7","i6","i8","i10"],"mappings":"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"}
|