@astralibx/email-ui 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/styles/theme.ts","../src/styles/shared.ts","../src/components/account/alx-account-list.ts","../src/components/account/alx-account-form.ts","../src/components/account/alx-account-health.ts","../src/components/account/alx-account-warmup.ts","../src/components/account/alx-account-capacity.ts","../src/components/account/alx-smtp-tester.ts","../src/components/account/alx-bounce-status.ts","../src/components/account/alx-approval-queue.ts","../src/components/account/alx-global-settings.ts","../src/components/rules/alx-template-list.ts","../src/components/rules/alx-template-editor.ts","../src/components/rules/alx-rule-list.ts","../src/components/rules/alx-rule-editor.ts","../src/components/rules/alx-run-history.ts","../src/components/rules/alx-throttle-settings.ts","../src/components/rules/alx-guide-panel.ts","../src/components/analytics/alx-analytics-overview.ts","../src/components/analytics/alx-analytics-timeline.ts","../src/components/analytics/alx-analytics-accounts.ts","../src/components/analytics/alx-analytics-rules.ts","../src/components/analytics/alx-analytics-engagement.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const alxDarkTheme = css`\n :host {\n --alx-primary: #d4af37;\n --alx-danger: #ef4444;\n --alx-success: #22c55e;\n --alx-warning: #f59e0b;\n --alx-info: #3b82f6;\n --alx-bg: #111;\n --alx-surface: #1a1a1a;\n --alx-border: #333;\n --alx-text: #ccc;\n --alx-text-muted: #888;\n --alx-radius: 6px;\n --alx-font-family: 'Inter', sans-serif;\n }\n`;\n\nexport const alxLightTheme = css`\n :host {\n --alx-primary: #b8941e;\n --alx-danger: #dc2626;\n --alx-success: #16a34a;\n --alx-warning: #d97706;\n --alx-info: #2563eb;\n --alx-bg: #f8f9fa;\n --alx-surface: #ffffff;\n --alx-border: #e2e8f0;\n --alx-text: #1a1a1a;\n --alx-text-muted: #64748b;\n --alx-radius: 6px;\n --alx-font-family: 'Inter', sans-serif;\n }\n`;\n\nexport const alxBaseStyles = css`\n :host {\n display: block;\n font-family: var(--alx-font-family, 'Inter', sans-serif);\n color: var(--alx-text, #ccc);\n background: var(--alx-bg, #111);\n box-sizing: border-box;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: inherit;\n }\n`;\n","import { css } from 'lit';\n\nexport const alxResetStyles = css`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n`;\n\nexport const alxTypographyStyles = css`\n h1, h2, h3, h4, h5, h6 {\n color: var(--alx-text);\n font-family: var(--alx-font-family);\n font-weight: 600;\n line-height: 1.3;\n }\n\n h1 { font-size: 1.75rem; }\n h2 { font-size: 1.5rem; }\n h3 { font-size: 1.25rem; }\n h4 { font-size: 1.1rem; }\n\n p {\n color: var(--alx-text);\n line-height: 1.6;\n }\n\n .text-muted {\n color: var(--alx-text-muted);\n }\n\n .text-small {\n font-size: 0.85rem;\n }\n`;\n\nexport const alxButtonStyles = css`\n button, .alx-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n background: var(--alx-surface);\n color: var(--alx-text);\n font-family: var(--alx-font-family);\n font-size: 0.875rem;\n cursor: pointer;\n transition: background 0.15s, border-color 0.15s;\n }\n\n button:hover, .alx-btn:hover {\n border-color: var(--alx-primary);\n }\n\n button:disabled, .alx-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .alx-btn-primary {\n background: var(--alx-primary);\n color: #111;\n border-color: var(--alx-primary);\n }\n\n .alx-btn-danger {\n background: var(--alx-danger);\n color: #fff;\n border-color: var(--alx-danger);\n }\n\n .alx-btn-success {\n background: var(--alx-success);\n color: #fff;\n border-color: var(--alx-success);\n }\n\n .alx-btn-sm {\n padding: 0.25rem 0.625rem;\n font-size: 0.8rem;\n }\n`;\n\nexport const alxInputStyles = css`\n input, select, textarea {\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n background: var(--alx-bg);\n color: var(--alx-text);\n font-family: var(--alx-font-family);\n font-size: 0.875rem;\n transition: border-color 0.15s;\n }\n\n input:focus, select:focus, textarea:focus {\n outline: none;\n border-color: var(--alx-primary);\n }\n\n input::placeholder, textarea::placeholder {\n color: var(--alx-text-muted);\n }\n\n label {\n display: block;\n margin-bottom: 0.25rem;\n font-size: 0.85rem;\n color: var(--alx-text-muted);\n }\n`;\n\nexport const alxTableStyles = css`\n table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.875rem;\n }\n\n th {\n text-align: left;\n padding: 0.625rem 0.75rem;\n border-bottom: 2px solid var(--alx-border);\n color: var(--alx-text-muted);\n font-weight: 600;\n font-size: 0.8rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n td {\n padding: 0.625rem 0.75rem;\n border-bottom: 1px solid var(--alx-border);\n color: var(--alx-text);\n }\n\n tr:hover td {\n background: var(--alx-surface);\n }\n`;\n\nexport const alxCardStyles = css`\n .alx-card {\n background: var(--alx-surface);\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n padding: 1.25rem;\n }\n\n .alx-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n }\n`;\n\nexport const alxBadgeStyles = css`\n .alx-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.15rem 0.5rem;\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 500;\n line-height: 1.4;\n }\n\n .alx-badge-success {\n background: color-mix(in srgb, var(--alx-success) 15%, transparent);\n color: var(--alx-success);\n }\n\n .alx-badge-danger {\n background: color-mix(in srgb, var(--alx-danger) 15%, transparent);\n color: var(--alx-danger);\n }\n\n .alx-badge-warning {\n background: color-mix(in srgb, var(--alx-warning) 15%, transparent);\n color: var(--alx-warning);\n }\n\n .alx-badge-info {\n background: color-mix(in srgb, var(--alx-info) 15%, transparent);\n color: var(--alx-info);\n }\n\n .alx-badge-muted {\n background: color-mix(in srgb, var(--alx-text-muted) 15%, transparent);\n color: var(--alx-text-muted);\n }\n`;\n\nexport const alxLoadingStyles = css`\n .alx-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n color: var(--alx-text-muted);\n }\n\n .alx-spinner {\n width: 1.25rem;\n height: 1.25rem;\n border: 2px solid var(--alx-border);\n border-top-color: var(--alx-primary);\n border-radius: 50%;\n animation: alx-spin 0.6s linear infinite;\n }\n\n @keyframes alx-spin {\n to { transform: rotate(360deg); }\n }\n\n .alx-empty {\n text-align: center;\n padding: 3rem 1rem;\n color: var(--alx-text-muted);\n }\n\n .alx-error {\n padding: 1rem;\n background: color-mix(in srgb, var(--alx-danger) 10%, transparent);\n border: 1px solid var(--alx-danger);\n border-radius: var(--alx-radius);\n color: var(--alx-danger);\n font-size: 0.875rem;\n }\n`;\n","import { LitElement, html, css } from 'lit';\nimport { customElement, state, property } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxButtonStyles,\n alxInputStyles,\n alxTableStyles,\n alxBadgeStyles,\n alxLoadingStyles,\n alxCardStyles,\n} from '../../styles/shared.js';\nimport { AccountAPI } from '../../api/account.api.js';\n\ninterface Account {\n _id: string;\n email: string;\n senderName?: string;\n provider: string;\n status: string;\n healthScore?: number;\n dailyLimit?: number;\n sentToday?: number;\n warmupActive?: boolean;\n}\n\n@customElement('alx-account-list')\nexport class AlxAccountList extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxButtonStyles,\n alxInputStyles,\n alxTableStyles,\n alxBadgeStyles,\n alxLoadingStyles,\n alxCardStyles,\n css`\n .toolbar {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-bottom: 1rem;\n flex-wrap: wrap;\n }\n .toolbar select {\n width: auto;\n min-width: 140px;\n }\n .spacer {\n flex: 1;\n }\n tr[data-clickable] {\n cursor: pointer;\n }\n .health-bar {\n display: inline-block;\n width: 60px;\n height: 8px;\n background: var(--alx-border);\n border-radius: 4px;\n overflow: hidden;\n vertical-align: middle;\n margin-right: 0.5rem;\n }\n .health-bar-fill {\n height: 100%;\n border-radius: 4px;\n transition: width 0.3s;\n }\n .capacity-bar {\n display: inline-block;\n width: 80px;\n height: 8px;\n background: var(--alx-border);\n border-radius: 4px;\n overflow: hidden;\n vertical-align: middle;\n margin-right: 0.5rem;\n }\n .capacity-bar-fill {\n height: 100%;\n border-radius: 4px;\n }\n .pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n margin-top: 1rem;\n }\n `,\n ];\n\n @property({ type: Number }) page = 1;\n @property({ type: Number }) limit = 20;\n\n @state() private accounts: Account[] = [];\n @state() private total = 0;\n @state() private loading = false;\n @state() private error = '';\n @state() private statusFilter = '';\n @state() private providerFilter = '';\n\n private _api?: AccountAPI;\n private get api(): AccountAPI {\n if (!this._api) this._api = new AccountAPI();\n return this._api;\n }\n private _loadGeneration = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.load();\n }\n\n async load(): Promise<void> {\n const gen = ++this._loadGeneration;\n this.loading = true;\n this.error = '';\n try {\n const params: Record<string, unknown> = {\n page: this.page,\n limit: this.limit,\n };\n if (this.statusFilter) params['status'] = this.statusFilter;\n if (this.providerFilter) params['provider'] = this.providerFilter;\n\n const res = await this.api.list(params) as {\n data: Account[];\n total: number;\n };\n if (gen !== this._loadGeneration) return;\n this.accounts = res.data ?? [];\n this.total = res.total ?? 0;\n } catch (e) {\n if (gen !== this._loadGeneration) return;\n this.error = e instanceof Error ? e.message : 'Failed to load accounts';\n } finally {\n if (gen === this._loadGeneration) this.loading = false;\n }\n }\n\n private get totalPages(): number {\n return Math.max(1, Math.ceil(this.total / this.limit));\n }\n\n private onRowClick(account: Account): void {\n this.dispatchEvent(\n new CustomEvent('alx-account-selected', {\n detail: account,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private onStatusChange(e: Event): void {\n this.statusFilter = (e.target as HTMLSelectElement).value;\n this.page = 1;\n this.load();\n }\n\n private onProviderChange(e: Event): void {\n this.providerFilter = (e.target as HTMLSelectElement).value;\n this.page = 1;\n this.load();\n }\n\n private onPrev(): void {\n if (this.page > 1) {\n this.page--;\n this.load();\n }\n }\n\n private onNext(): void {\n if (this.page < this.totalPages) {\n this.page++;\n this.load();\n }\n }\n\n private onCreate(): void {\n this.dispatchEvent(\n new CustomEvent('alx-account-create', {\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private healthColor(score: number): string {\n if (score > 80) return 'var(--alx-success)';\n if (score > 50) return 'var(--alx-warning)';\n return 'var(--alx-danger)';\n }\n\n private capacityColor(sent: number, limit: number): string {\n const remaining = (limit - sent) / limit;\n if (remaining > 0.5) return 'var(--alx-success)';\n if (remaining > 0.2) return 'var(--alx-warning)';\n return 'var(--alx-danger)';\n }\n\n private statusBadgeClass(status: string): string {\n switch (status) {\n case 'active':\n return 'alx-badge alx-badge-success';\n case 'disabled':\n case 'error':\n return 'alx-badge alx-badge-danger';\n case 'warmup':\n return 'alx-badge alx-badge-warning';\n default:\n return 'alx-badge alx-badge-muted';\n }\n }\n\n override render() {\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>Email Accounts</h3>\n </div>\n\n <div class=\"toolbar\">\n <select @change=${this.onStatusChange}>\n <option value=\"\">All Statuses</option>\n <option value=\"active\">Active</option>\n <option value=\"warmup\">Warmup</option>\n <option value=\"disabled\">Disabled</option>\n <option value=\"error\">Error</option>\n </select>\n\n <select @change=${this.onProviderChange}>\n <option value=\"\">All Providers</option>\n <option value=\"gmail\">Gmail</option>\n <option value=\"ses\">SES</option>\n </select>\n\n <span class=\"spacer\"></span>\n\n <button @click=${() => this.load()}>Refresh</button>\n <button class=\"alx-btn-primary\" @click=${this.onCreate}>\n + Create\n </button>\n </div>\n\n ${this.error ? html`<div class=\"alx-error\">${this.error}</div>` : ''}\n ${this.loading\n ? html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`\n : this.accounts.length === 0\n ? html`<div class=\"alx-empty\">No accounts found</div>`\n : html`\n <table>\n <thead>\n <tr>\n <th>Email</th>\n <th>Provider</th>\n <th>Status</th>\n <th>Health</th>\n <th>Capacity</th>\n <th>Warmup</th>\n </tr>\n </thead>\n <tbody>\n ${this.accounts.map(\n (a) => html`\n <tr\n data-clickable\n @click=${() => this.onRowClick(a)}\n >\n <td>${a.email}</td>\n <td>${a.provider}</td>\n <td>\n <span class=${this.statusBadgeClass(a.status)}>\n ${a.status}\n </span>\n </td>\n <td>\n <span class=\"health-bar\">\n <span\n class=\"health-bar-fill\"\n style=\"width:${a.healthScore ?? 0}%;background:${this.healthColor(a.healthScore ?? 0)}\"\n ></span>\n </span>\n ${a.healthScore ?? 0}\n </td>\n <td>\n <span class=\"capacity-bar\">\n <span\n class=\"capacity-bar-fill\"\n style=\"width:${a.dailyLimit ? ((a.sentToday ?? 0) / a.dailyLimit) * 100 : 0}%;background:${this.capacityColor(a.sentToday ?? 0, a.dailyLimit ?? 1)}\"\n ></span>\n </span>\n ${a.sentToday ?? 0}/${a.dailyLimit ?? 0}\n </td>\n <td>\n ${a.warmupActive\n ? html`<span class=\"alx-badge alx-badge-warning\">Active</span>`\n : html`<span class=\"alx-badge alx-badge-muted\">Off</span>`}\n </td>\n </tr>\n `,\n )}\n </tbody>\n </table>\n\n <div class=\"pagination\">\n <button\n class=\"alx-btn-sm\"\n ?disabled=${this.page <= 1}\n @click=${this.onPrev}\n >\n Prev\n </button>\n <span class=\"text-small text-muted\">\n Page ${this.page} of ${this.totalPages}\n </span>\n <button\n class=\"alx-btn-sm\"\n ?disabled=${this.page >= this.totalPages}\n @click=${this.onNext}\n >\n Next\n </button>\n </div>\n `}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-account-list': AlxAccountList;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, state, property } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxButtonStyles,\n alxInputStyles,\n alxCardStyles,\n alxLoadingStyles,\n} from '../../styles/shared.js';\nimport { AccountAPI } from '../../api/account.api.js';\n\n@customElement('alx-account-form')\nexport class AlxAccountForm extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxButtonStyles,\n alxInputStyles,\n alxCardStyles,\n alxLoadingStyles,\n css`\n .form-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n }\n .form-group {\n display: flex;\n flex-direction: column;\n }\n .form-group.full {\n grid-column: 1 / -1;\n }\n .section-title {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--alx-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin: 1.25rem 0 0.5rem;\n grid-column: 1 / -1;\n }\n .actions {\n display: flex;\n gap: 0.75rem;\n justify-content: flex-end;\n margin-top: 1.25rem;\n }\n input[type='number'] {\n width: 100%;\n }\n `,\n ];\n\n @property({ attribute: 'account-id' }) accountId = '';\n\n @state() private email = '';\n @state() private senderName = '';\n @state() private provider: 'gmail' | 'ses' = 'gmail';\n @state() private smtpHost = '';\n @state() private smtpPort = 587;\n @state() private smtpUser = '';\n @state() private smtpPass = '';\n @state() private imapHost = '';\n @state() private imapPort = 993;\n @state() private imapUser = '';\n @state() private imapPass = '';\n @state() private loading = false;\n @state() private saving = false;\n @state() private error = '';\n\n private _api?: AccountAPI;\n private get api(): AccountAPI {\n if (!this._api) this._api = new AccountAPI();\n return this._api;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.accountId) this.loadAccount();\n }\n\n private async loadAccount(): Promise<void> {\n this.loading = true;\n this.error = '';\n try {\n const account = (await this.api.getById(this.accountId)) as Record<string, unknown>;\n this.email = (account['email'] as string) ?? '';\n this.senderName = (account['senderName'] as string) ?? '';\n this.provider = (account['provider'] as 'gmail' | 'ses') ?? 'gmail';\n const smtp = (account['smtpConfig'] as Record<string, unknown>) ?? {};\n this.smtpHost = (smtp['host'] as string) ?? '';\n this.smtpPort = (smtp['port'] as number) ?? 587;\n this.smtpUser = (smtp['user'] as string) ?? '';\n this.smtpPass = (smtp['pass'] as string) ?? '';\n const imap = (account['imapConfig'] as Record<string, unknown>) ?? {};\n this.imapHost = (imap['host'] as string) ?? '';\n this.imapPort = (imap['port'] as number) ?? 993;\n this.imapUser = (imap['user'] as string) ?? '';\n this.imapPass = (imap['pass'] as string) ?? '';\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Failed to load account';\n } finally {\n this.loading = false;\n }\n }\n\n private async onSubmit(e: Event): Promise<void> {\n e.preventDefault();\n if (!this.email) {\n this.error = 'Email is required';\n return;\n }\n\n this.saving = true;\n this.error = '';\n\n const data: Record<string, unknown> = {\n email: this.email,\n senderName: this.senderName,\n provider: this.provider,\n smtpConfig: {\n host: this.smtpHost,\n port: this.smtpPort,\n user: this.smtpUser,\n pass: this.smtpPass,\n },\n };\n\n if (this.provider === 'gmail') {\n data['imapConfig'] = {\n host: this.imapHost,\n port: this.imapPort,\n user: this.imapUser,\n pass: this.imapPass,\n };\n }\n\n try {\n let result: unknown;\n if (this.accountId) {\n result = await this.api.update(this.accountId, data);\n } else {\n result = await this.api.create(data);\n }\n this.dispatchEvent(\n new CustomEvent('alx-account-saved', {\n detail: result,\n bubbles: true,\n composed: true,\n }),\n );\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Failed to save account';\n } finally {\n this.saving = false;\n }\n }\n\n private onCancel(): void {\n this.dispatchEvent(\n new CustomEvent('alx-account-cancelled', {\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private showImap(): boolean {\n return this.provider === 'gmail';\n }\n\n override render() {\n if (this.loading) {\n return html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`;\n }\n\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>${this.accountId ? 'Edit Account' : 'Create Account'}</h3>\n </div>\n\n ${this.error ? html`<div class=\"alx-error\">${this.error}</div>` : ''}\n\n <form @submit=${this.onSubmit}>\n <div class=\"form-grid\">\n <div class=\"form-group\">\n <label>Email *</label>\n <input\n type=\"email\"\n .value=${this.email}\n @input=${(e: Event) => (this.email = (e.target as HTMLInputElement).value)}\n placeholder=\"sender@example.com\"\n required\n />\n </div>\n <div class=\"form-group\">\n <label>Sender Name</label>\n <input\n type=\"text\"\n .value=${this.senderName}\n @input=${(e: Event) => (this.senderName = (e.target as HTMLInputElement).value)}\n placeholder=\"Display Name\"\n />\n </div>\n <div class=\"form-group\">\n <label>Provider</label>\n <select\n .value=${this.provider}\n @change=${(e: Event) => (this.provider = (e.target as HTMLSelectElement).value as 'gmail' | 'ses')}\n >\n <option value=\"gmail\">Gmail</option>\n <option value=\"ses\">AWS SES</option>\n </select>\n </div>\n\n <div class=\"section-title\">SMTP Configuration</div>\n <div class=\"form-group\">\n <label>SMTP Host</label>\n <input\n type=\"text\"\n .value=${this.smtpHost}\n @input=${(e: Event) => (this.smtpHost = (e.target as HTMLInputElement).value)}\n placeholder=\"smtp.gmail.com\"\n />\n </div>\n <div class=\"form-group\">\n <label>SMTP Port</label>\n <input\n type=\"number\"\n .value=${String(this.smtpPort)}\n @input=${(e: Event) => (this.smtpPort = Number((e.target as HTMLInputElement).value))}\n />\n </div>\n <div class=\"form-group\">\n <label>SMTP User</label>\n <input\n type=\"text\"\n .value=${this.smtpUser}\n @input=${(e: Event) => (this.smtpUser = (e.target as HTMLInputElement).value)}\n placeholder=\"user@gmail.com\"\n />\n </div>\n <div class=\"form-group\">\n <label>SMTP Password</label>\n <input\n type=\"password\"\n .value=${this.smtpPass}\n @input=${(e: Event) => (this.smtpPass = (e.target as HTMLInputElement).value)}\n placeholder=\"App password\"\n />\n </div>\n\n ${this.showImap()\n ? html`\n <div class=\"section-title\">IMAP Configuration</div>\n <div class=\"form-group\">\n <label>IMAP Host</label>\n <input\n type=\"text\"\n .value=${this.imapHost}\n @input=${(e: Event) => (this.imapHost = (e.target as HTMLInputElement).value)}\n placeholder=\"imap.gmail.com\"\n />\n </div>\n <div class=\"form-group\">\n <label>IMAP Port</label>\n <input\n type=\"number\"\n .value=${String(this.imapPort)}\n @input=${(e: Event) => (this.imapPort = Number((e.target as HTMLInputElement).value))}\n />\n </div>\n <div class=\"form-group\">\n <label>IMAP User</label>\n <input\n type=\"text\"\n .value=${this.imapUser}\n @input=${(e: Event) => (this.imapUser = (e.target as HTMLInputElement).value)}\n placeholder=\"user@gmail.com\"\n />\n </div>\n <div class=\"form-group\">\n <label>IMAP Password</label>\n <input\n type=\"password\"\n .value=${this.imapPass}\n @input=${(e: Event) => (this.imapPass = (e.target as HTMLInputElement).value)}\n placeholder=\"App password\"\n />\n </div>\n `\n : ''}\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" @click=${this.onCancel}>Cancel</button>\n <button type=\"submit\" class=\"alx-btn-primary\" ?disabled=${this.saving}>\n ${this.saving ? 'Saving...' : this.accountId ? 'Update' : 'Create'}\n </button>\n </div>\n </form>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-account-form': AlxAccountForm;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, state, property } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxCardStyles,\n alxLoadingStyles,\n alxBadgeStyles,\n} from '../../styles/shared.js';\nimport { AccountAPI } from '../../api/account.api.js';\n\ninterface AccountHealth {\n _id: string;\n email: string;\n healthScore: number;\n bounceRate: number;\n consecutiveErrors: number;\n lastErrorDate?: string;\n lastError?: string;\n status: string;\n}\n\n@customElement('alx-account-health')\nexport class AlxAccountHealth extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxCardStyles,\n alxLoadingStyles,\n alxBadgeStyles,\n css`\n .health-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1rem;\n }\n .health-item {\n background: var(--alx-surface);\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n padding: 1rem;\n }\n .health-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 0.75rem;\n }\n .health-email {\n font-weight: 500;\n font-size: 0.9rem;\n }\n .health-score {\n font-size: 1.5rem;\n font-weight: 700;\n }\n .health-bar-track {\n width: 100%;\n height: 10px;\n background: var(--alx-border);\n border-radius: 5px;\n overflow: hidden;\n margin-bottom: 0.75rem;\n }\n .health-bar-fill {\n height: 100%;\n border-radius: 5px;\n transition: width 0.4s ease;\n }\n .health-stats {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0.5rem;\n font-size: 0.8rem;\n }\n .stat-label {\n color: var(--alx-text-muted);\n }\n .stat-value {\n text-align: right;\n }\n .header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n }\n `,\n ];\n\n @property({ type: Number, attribute: 'refresh-interval' }) refreshInterval = 30;\n\n @state() private accounts: AccountHealth[] = [];\n @state() private loading = false;\n @state() private error = '';\n\n private _api?: AccountAPI;\n private get api(): AccountAPI {\n if (!this._api) this._api = new AccountAPI();\n return this._api;\n }\n private intervalId?: ReturnType<typeof setInterval>;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.load();\n if (this.refreshInterval > 0) {\n this.intervalId = setInterval(() => this.load(), this.refreshInterval * 1000);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.intervalId) clearInterval(this.intervalId);\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('refreshInterval') && this.intervalId) {\n clearInterval(this.intervalId);\n if (this.refreshInterval > 0) {\n this.intervalId = setInterval(() => this.load(), this.refreshInterval * 1000);\n } else {\n this.intervalId = undefined;\n }\n }\n }\n\n async load(): Promise<void> {\n if (this.loading) return;\n this.loading = true;\n this.error = '';\n try {\n const res = (await this.api.getAllHealth()) as AccountHealth[] | { data: AccountHealth[] };\n this.accounts = Array.isArray(res) ? res : (res.data ?? []);\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Failed to load health data';\n } finally {\n this.loading = false;\n }\n }\n\n private healthColor(score: number): string {\n if (score > 80) return 'var(--alx-success)';\n if (score > 50) return 'var(--alx-warning)';\n return 'var(--alx-danger)';\n }\n\n private formatDate(dateStr?: string): string {\n if (!dateStr) return 'N/A';\n return new Date(dateStr).toLocaleString();\n }\n\n override render() {\n return html`\n <div class=\"alx-card\">\n <div class=\"header-row\">\n <h3>Account Health</h3>\n <span class=\"text-small text-muted\">\n Auto-refresh: ${this.refreshInterval}s\n </span>\n </div>\n\n ${this.error ? html`<div class=\"alx-error\">${this.error}</div>` : ''}\n ${this.loading && this.accounts.length === 0\n ? html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`\n : this.accounts.length === 0\n ? html`<div class=\"alx-empty\">No health data available</div>`\n : html`\n <div class=\"health-grid\">\n ${this.accounts.map(\n (a) => html`\n <div class=\"health-item\">\n <div class=\"health-header\">\n <span class=\"health-email\">${a.email}</span>\n <span\n class=\"health-score\"\n style=\"color:${this.healthColor(a.healthScore)}\"\n >\n ${a.healthScore}\n </span>\n </div>\n <div class=\"health-bar-track\">\n <span\n class=\"health-bar-fill\"\n style=\"width:${a.healthScore}%;background:${this.healthColor(a.healthScore)}\"\n ></span>\n </div>\n <div class=\"health-stats\">\n <span class=\"stat-label\">Bounce Rate</span>\n <span class=\"stat-value\">${(a.bounceRate * 100).toFixed(1)}%</span>\n <span class=\"stat-label\">Consecutive Errors</span>\n <span class=\"stat-value\">${a.consecutiveErrors}</span>\n <span class=\"stat-label\">Last Error</span>\n <span class=\"stat-value\">${this.formatDate(a.lastErrorDate)}</span>\n </div>\n ${a.lastError\n ? html`<div class=\"alx-error\" style=\"margin-top:0.5rem;padding:0.5rem;font-size:0.75rem\">\n ${a.lastError}\n </div>`\n : ''}\n </div>\n `,\n )}\n </div>\n `}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-account-health': AlxAccountHealth;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, state, property } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxButtonStyles,\n alxCardStyles,\n alxBadgeStyles,\n alxLoadingStyles,\n} from '../../styles/shared.js';\nimport { AccountAPI } from '../../api/account.api.js';\n\ninterface WarmupPhase {\n day: number;\n dailyLimit: number;\n label?: string;\n}\n\ninterface WarmupStatus {\n active: boolean;\n currentDay: number;\n currentPhase?: string;\n dailyLimit: number;\n schedule: WarmupPhase[];\n startedAt?: string;\n completedAt?: string;\n}\n\n@customElement('alx-account-warmup')\nexport class AlxAccountWarmup extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxButtonStyles,\n alxCardStyles,\n alxBadgeStyles,\n alxLoadingStyles,\n css`\n .warmup-progress {\n margin: 1.25rem 0;\n }\n .progress-bar-track {\n width: 100%;\n height: 16px;\n background: var(--alx-border);\n border-radius: 8px;\n overflow: hidden;\n }\n .progress-bar-fill {\n height: 100%;\n background: var(--alx-primary);\n border-radius: 8px;\n transition: width 0.4s ease;\n }\n .progress-info {\n display: flex;\n justify-content: space-between;\n margin-top: 0.5rem;\n font-size: 0.8rem;\n color: var(--alx-text-muted);\n }\n .stats-row {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 1rem;\n margin-bottom: 1.25rem;\n }\n .stat-box {\n text-align: center;\n padding: 0.75rem;\n background: var(--alx-bg);\n border-radius: var(--alx-radius);\n border: 1px solid var(--alx-border);\n }\n .stat-value {\n font-size: 1.5rem;\n font-weight: 700;\n color: var(--alx-primary);\n }\n .stat-label {\n font-size: 0.75rem;\n color: var(--alx-text-muted);\n margin-top: 0.25rem;\n }\n .actions {\n display: flex;\n gap: 0.75rem;\n margin-top: 1rem;\n }\n .schedule-list {\n list-style: none;\n margin: 1rem 0 0;\n padding: 0;\n }\n .schedule-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 0;\n border-bottom: 1px solid var(--alx-border);\n font-size: 0.85rem;\n }\n .schedule-day {\n width: 60px;\n font-weight: 600;\n color: var(--alx-text-muted);\n }\n .schedule-limit {\n color: var(--alx-text);\n }\n .schedule-active {\n color: var(--alx-primary);\n font-weight: 600;\n }\n `,\n ];\n\n @property({ attribute: 'account-id' }) accountId = '';\n\n @state() private warmup: WarmupStatus | null = null;\n @state() private loading = false;\n @state() private error = '';\n @state() private actionLoading = false;\n\n private _api?: AccountAPI;\n private get api(): AccountAPI {\n if (!this._api) this._api = new AccountAPI();\n return this._api;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.accountId) this.load();\n }\n\n async load(): Promise<void> {\n if (!this.accountId) return;\n this.loading = true;\n this.error = '';\n try {\n this.warmup = (await this.api.getWarmupStatus(this.accountId)) as WarmupStatus;\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Failed to load warmup status';\n } finally {\n this.loading = false;\n }\n }\n\n private async onStart(): Promise<void> {\n this.actionLoading = true;\n try {\n await this.api.startWarmup(this.accountId);\n await this.load();\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Failed to start warmup';\n } finally {\n this.actionLoading = false;\n }\n }\n\n private get totalDays(): number {\n if (!this.warmup?.schedule?.length) return 1;\n return this.warmup.schedule[this.warmup.schedule.length - 1].day;\n }\n\n private get progressPercent(): number {\n if (!this.warmup) return 0;\n return Math.min(100, (this.warmup.currentDay / this.totalDays) * 100);\n }\n\n override render() {\n if (this.loading) {\n return html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`;\n }\n if (this.error) {\n return html`<div class=\"alx-card\"><div class=\"alx-error\">${this.error}</div></div>`;\n }\n if (!this.warmup) {\n return html`<div class=\"alx-card\"><div class=\"alx-empty\">No warmup data</div></div>`;\n }\n\n const w = this.warmup;\n\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>Warmup Status</h3>\n ${w.active\n ? html`<span class=\"alx-badge alx-badge-warning\">Active</span>`\n : w.completedAt\n ? html`<span class=\"alx-badge alx-badge-success\">Completed</span>`\n : html`<span class=\"alx-badge alx-badge-muted\">Inactive</span>`}\n </div>\n\n <div class=\"stats-row\">\n <div class=\"stat-box\">\n <div class=\"stat-value\">${w.currentDay}</div>\n <div class=\"stat-label\">Current Day</div>\n </div>\n <div class=\"stat-box\">\n <div class=\"stat-value\">${w.currentPhase ?? 'N/A'}</div>\n <div class=\"stat-label\">Phase</div>\n </div>\n <div class=\"stat-box\">\n <div class=\"stat-value\">${w.dailyLimit}</div>\n <div class=\"stat-label\">Daily Limit</div>\n </div>\n </div>\n\n <div class=\"warmup-progress\">\n <div class=\"progress-bar-track\">\n <div\n class=\"progress-bar-fill\"\n style=\"width:${this.progressPercent}%\"\n ></div>\n </div>\n <div class=\"progress-info\">\n <span>Day ${w.currentDay}</span>\n <span>${this.progressPercent.toFixed(0)}%</span>\n <span>Day ${this.totalDays}</span>\n </div>\n </div>\n\n ${w.schedule?.length\n ? html`\n <h4 style=\"margin-top:1rem\">Phase Schedule</h4>\n <ul class=\"schedule-list\">\n ${w.schedule.map(\n (phase) => html`\n <li class=\"schedule-item\">\n <span class=\"schedule-day\">Day ${phase.day}</span>\n <span class=${w.currentDay === phase.day ? 'schedule-active' : 'schedule-limit'}>\n ${phase.dailyLimit} emails/day\n </span>\n ${phase.label ? html`<span class=\"text-muted text-small\">${phase.label}</span>` : ''}\n </li>\n `,\n )}\n </ul>\n `\n : ''}\n\n <div class=\"actions\">\n ${!w.active\n ? html`<button class=\"alx-btn-primary\" ?disabled=${this.actionLoading} @click=${this.onStart}>\n ${this.actionLoading ? 'Starting...' : 'Start Warmup'}\n </button>`\n : ''}\n <button @click=${() => this.load()}>Refresh</button>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-account-warmup': AlxAccountWarmup;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxCardStyles,\n alxLoadingStyles,\n alxButtonStyles,\n} from '../../styles/shared.js';\nimport { AccountAPI } from '../../api/account.api.js';\n\ninterface AccountCapacity {\n _id: string;\n email: string;\n dailyLimit: number;\n sentToday: number;\n remaining: number;\n}\n\ninterface CapacityResponse {\n accounts: AccountCapacity[];\n totalLimit: number;\n totalSent: number;\n totalRemaining: number;\n}\n\n@customElement('alx-account-capacity')\nexport class AlxAccountCapacity extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxCardStyles,\n alxLoadingStyles,\n alxButtonStyles,\n css`\n .aggregate {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 1rem;\n margin-bottom: 1.25rem;\n }\n .aggregate-box {\n text-align: center;\n padding: 1rem;\n background: var(--alx-bg);\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n }\n .aggregate-value {\n font-size: 1.75rem;\n font-weight: 700;\n }\n .aggregate-label {\n font-size: 0.75rem;\n color: var(--alx-text-muted);\n margin-top: 0.25rem;\n }\n .capacity-list {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n .capacity-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 0.75rem;\n background: var(--alx-surface);\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n }\n .capacity-email {\n width: 200px;\n font-size: 0.85rem;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .capacity-bar-container {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n .capacity-bar-track {\n flex: 1;\n height: 12px;\n background: var(--alx-border);\n border-radius: 6px;\n overflow: hidden;\n }\n .capacity-bar-fill {\n height: 100%;\n border-radius: 6px;\n transition: width 0.3s ease;\n }\n .capacity-numbers {\n font-size: 0.8rem;\n color: var(--alx-text-muted);\n white-space: nowrap;\n min-width: 80px;\n text-align: right;\n }\n .header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n }\n `,\n ];\n\n @state() private capacity: CapacityResponse | null = null;\n @state() private loading = false;\n @state() private error = '';\n\n private _api?: AccountAPI;\n private get api(): AccountAPI {\n if (!this._api) this._api = new AccountAPI();\n return this._api;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.load();\n }\n\n async load(): Promise<void> {\n this.loading = true;\n this.error = '';\n try {\n this.capacity = (await this.api.getCapacity()) as CapacityResponse;\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Failed to load capacity';\n } finally {\n this.loading = false;\n }\n }\n\n private capacityColor(remaining: number, limit: number): string {\n if (limit === 0) return 'var(--alx-text-muted)';\n const pct = remaining / limit;\n if (pct > 0.5) return 'var(--alx-success)';\n if (pct > 0.2) return 'var(--alx-warning)';\n return 'var(--alx-danger)';\n }\n\n private usagePercent(sent: number, limit: number): number {\n if (limit === 0) return 0;\n return Math.min(100, (sent / limit) * 100);\n }\n\n override render() {\n return html`\n <div class=\"alx-card\">\n <div class=\"header-row\">\n <h3>Sending Capacity</h3>\n <button @click=${() => this.load()}>Refresh</button>\n </div>\n\n ${this.error ? html`<div class=\"alx-error\">${this.error}</div>` : ''}\n ${this.loading\n ? html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`\n : !this.capacity\n ? html`<div class=\"alx-empty\">No capacity data</div>`\n : html`\n <div class=\"aggregate\">\n <div class=\"aggregate-box\">\n <div class=\"aggregate-value\">${this.capacity.totalLimit}</div>\n <div class=\"aggregate-label\">Total Limit</div>\n </div>\n <div class=\"aggregate-box\">\n <div class=\"aggregate-value\">${this.capacity.totalSent}</div>\n <div class=\"aggregate-label\">Sent Today</div>\n </div>\n <div class=\"aggregate-box\">\n <div\n class=\"aggregate-value\"\n style=\"color:${this.capacityColor(this.capacity.totalRemaining, this.capacity.totalLimit)}\"\n >\n ${this.capacity.totalRemaining}\n </div>\n <div class=\"aggregate-label\">Remaining</div>\n </div>\n </div>\n\n <div class=\"capacity-list\">\n ${this.capacity.accounts.map(\n (a) => html`\n <div class=\"capacity-item\">\n <span class=\"capacity-email\">${a.email}</span>\n <div class=\"capacity-bar-container\">\n <div class=\"capacity-bar-track\">\n <div\n class=\"capacity-bar-fill\"\n style=\"width:${this.usagePercent(a.sentToday, a.dailyLimit)}%;background:${this.capacityColor(a.remaining, a.dailyLimit)}\"\n ></div>\n </div>\n <span class=\"capacity-numbers\">\n ${a.sentToday}/${a.dailyLimit}\n </span>\n </div>\n </div>\n `,\n )}\n </div>\n `}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-account-capacity': AlxAccountCapacity;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, state, property } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxButtonStyles,\n alxCardStyles,\n alxLoadingStyles,\n} from '../../styles/shared.js';\nimport { AccountAPI } from '../../api/account.api.js';\n\n@customElement('alx-smtp-tester')\nexport class AlxSmtpTester extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxButtonStyles,\n alxCardStyles,\n alxLoadingStyles,\n css`\n .result {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-top: 1rem;\n padding: 1rem;\n border-radius: var(--alx-radius);\n font-size: 0.9rem;\n }\n .result-success {\n background: color-mix(in srgb, var(--alx-success) 10%, transparent);\n border: 1px solid var(--alx-success);\n color: var(--alx-success);\n }\n .result-failure {\n background: color-mix(in srgb, var(--alx-danger) 10%, transparent);\n border: 1px solid var(--alx-danger);\n color: var(--alx-danger);\n }\n .icon {\n font-size: 1.5rem;\n flex-shrink: 0;\n }\n .test-area {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n `,\n ];\n\n @property({ attribute: 'account-id' }) accountId = '';\n\n @state() private testing = false;\n @state() private result: { success: boolean; message: string } | null = null;\n\n private _api?: AccountAPI;\n private get api(): AccountAPI {\n if (!this._api) this._api = new AccountAPI();\n return this._api;\n }\n\n private async onTest(): Promise<void> {\n if (!this.accountId) return;\n this.testing = true;\n this.result = null;\n try {\n const res = (await this.api.testConnection(this.accountId)) as {\n success?: boolean;\n message?: string;\n error?: string;\n };\n this.result = {\n success: res.success !== false,\n message: res.message ?? 'Connection successful',\n };\n } catch (e) {\n this.result = {\n success: false,\n message: e instanceof Error ? e.message : 'Connection test failed',\n };\n } finally {\n this.testing = false;\n }\n }\n\n override render() {\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>SMTP Connection Test</h3>\n </div>\n\n <div class=\"test-area\">\n <button\n class=\"alx-btn-primary\"\n ?disabled=${this.testing || !this.accountId}\n @click=${this.onTest}\n >\n ${this.testing ? 'Testing...' : 'Test Connection'}\n </button>\n ${this.testing\n ? html`<div class=\"alx-spinner\"></div>`\n : ''}\n </div>\n\n ${this.result\n ? html`\n <div class=\"result ${this.result.success ? 'result-success' : 'result-failure'}\">\n <span class=\"icon\">${this.result.success ? '\\u2713' : '\\u2717'}</span>\n <span>${this.result.message}</span>\n </div>\n `\n : ''}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-smtp-tester': AlxSmtpTester;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, state, property } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxButtonStyles,\n alxCardStyles,\n alxBadgeStyles,\n alxLoadingStyles,\n alxTableStyles,\n} from '../../styles/shared.js';\nimport { AccountAPI } from '../../api/account.api.js';\n\ninterface BounceInfo {\n _id: string;\n email: string;\n imapEnabled: boolean;\n lastChecked?: string;\n bouncesFound: number;\n status: string;\n}\n\n@customElement('alx-bounce-status')\nexport class AlxBounceStatus extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxButtonStyles,\n alxCardStyles,\n alxBadgeStyles,\n alxLoadingStyles,\n alxTableStyles,\n css`\n .single-view {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n .info-row {\n display: flex;\n justify-content: space-between;\n padding: 0.5rem 0;\n border-bottom: 1px solid var(--alx-border);\n font-size: 0.875rem;\n }\n .info-label {\n color: var(--alx-text-muted);\n }\n .actions {\n margin-top: 1rem;\n }\n `,\n ];\n\n @property({ attribute: 'account-id' }) accountId = '';\n\n @state() private accounts: BounceInfo[] = [];\n @state() private single: BounceInfo | null = null;\n @state() private loading = false;\n @state() private checking = false;\n @state() private error = '';\n\n private _api?: AccountAPI;\n private get api(): AccountAPI {\n if (!this._api) this._api = new AccountAPI();\n return this._api;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.load();\n }\n\n async load(): Promise<void> {\n this.loading = true;\n this.error = '';\n try {\n if (this.accountId) {\n const health = (await this.api.getHealth(this.accountId)) as BounceInfo;\n this.single = health;\n } else {\n const res = (await this.api.getAllHealth()) as BounceInfo[] | { data: BounceInfo[] };\n this.accounts = Array.isArray(res) ? res : (res.data ?? []);\n }\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Failed to load bounce status';\n } finally {\n this.loading = false;\n }\n }\n\n private async onCheckNow(accountId: string): Promise<void> {\n this.checking = true;\n try {\n await this.api.testConnection(accountId);\n await this.load();\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Check failed';\n } finally {\n this.checking = false;\n }\n }\n\n private formatDate(dateStr?: string): string {\n if (!dateStr) return 'Never';\n return new Date(dateStr).toLocaleString();\n }\n\n private renderSingle() {\n const b = this.single;\n if (!b) return html`<div class=\"alx-empty\">No bounce data</div>`;\n\n return html`\n <div class=\"single-view\">\n <div class=\"info-row\">\n <span class=\"info-label\">IMAP Enabled</span>\n <span>${b.imapEnabled ? html`<span class=\"alx-badge alx-badge-success\">Yes</span>` : html`<span class=\"alx-badge alx-badge-muted\">No</span>`}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Last Checked</span>\n <span>${this.formatDate(b.lastChecked)}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Bounces Found</span>\n <span>${b.bouncesFound}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Status</span>\n <span class=\"alx-badge ${b.status === 'active' ? 'alx-badge-success' : 'alx-badge-warning'}\">${b.status}</span>\n </div>\n <div class=\"actions\">\n <button class=\"alx-btn-primary\" ?disabled=${this.checking} @click=${() => this.onCheckNow(this.accountId)}>\n ${this.checking ? 'Checking...' : 'Check Now'}\n </button>\n </div>\n </div>\n `;\n }\n\n private renderTable() {\n if (this.accounts.length === 0) {\n return html`<div class=\"alx-empty\">No accounts</div>`;\n }\n\n return html`\n <table>\n <thead>\n <tr>\n <th>Email</th>\n <th>IMAP</th>\n <th>Last Checked</th>\n <th>Bounces</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n ${this.accounts.map(\n (a) => html`\n <tr>\n <td>${a.email}</td>\n <td>\n ${a.imapEnabled\n ? html`<span class=\"alx-badge alx-badge-success\">On</span>`\n : html`<span class=\"alx-badge alx-badge-muted\">Off</span>`}\n </td>\n <td>${this.formatDate(a.lastChecked)}</td>\n <td>${a.bouncesFound}</td>\n <td>\n <button class=\"alx-btn-sm\" ?disabled=${this.checking} @click=${() => this.onCheckNow(a._id)}>\n Check Now\n </button>\n </td>\n </tr>\n `,\n )}\n </tbody>\n </table>\n `;\n }\n\n override render() {\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>Bounce Status</h3>\n </div>\n\n ${this.error ? html`<div class=\"alx-error\">${this.error}</div>` : ''}\n ${this.loading\n ? html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`\n : this.accountId\n ? this.renderSingle()\n : this.renderTable()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-bounce-status': AlxBounceStatus;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxButtonStyles,\n alxTableStyles,\n alxBadgeStyles,\n alxCardStyles,\n alxLoadingStyles,\n} from '../../styles/shared.js';\nimport { AccountAPI } from '../../api/account.api.js';\n\ninterface Draft {\n _id: string;\n to: string;\n subject: string;\n status: string;\n createdAt: string;\n}\n\n@customElement('alx-approval-queue')\nexport class AlxApprovalQueue extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxButtonStyles,\n alxTableStyles,\n alxBadgeStyles,\n alxCardStyles,\n alxLoadingStyles,\n css`\n .toolbar {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-bottom: 1rem;\n flex-wrap: wrap;\n }\n .spacer {\n flex: 1;\n }\n .bulk-actions {\n display: flex;\n gap: 0.5rem;\n }\n .select-cell {\n width: 40px;\n }\n input[type='checkbox'] {\n width: auto;\n cursor: pointer;\n }\n .selected-count {\n font-size: 0.85rem;\n color: var(--alx-text-muted);\n }\n `,\n ];\n\n @state() private drafts: Draft[] = [];\n @state() private loading = false;\n @state() private error = '';\n @state() private selectedIds = new Set<string>();\n @state() private actionLoading = false;\n\n private _api?: AccountAPI;\n private get api(): AccountAPI {\n if (!this._api) this._api = new AccountAPI();\n return this._api;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.load();\n }\n\n async load(): Promise<void> {\n this.loading = true;\n this.error = '';\n try {\n const res = (await this.api.listDrafts({ status: 'pending' } as Record<string, unknown>)) as {\n data: Draft[];\n };\n this.drafts = res.data ?? [];\n this.selectedIds = new Set();\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Failed to load drafts';\n } finally {\n this.loading = false;\n }\n }\n\n private toggleSelect(id: string): void {\n const next = new Set(this.selectedIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n this.selectedIds = next;\n }\n\n private toggleAll(): void {\n if (this.selectedIds.size === this.drafts.length) {\n this.selectedIds = new Set();\n } else {\n this.selectedIds = new Set(this.drafts.map((d) => d._id));\n }\n }\n\n private async onApprove(id: string): Promise<void> {\n this.actionLoading = true;\n try {\n await this.api.approveDraft(id);\n this.dispatchEvent(\n new CustomEvent('alx-draft-approved', {\n detail: { id },\n bubbles: true,\n composed: true,\n }),\n );\n await this.load();\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Approve failed';\n } finally {\n this.actionLoading = false;\n }\n }\n\n private async onReject(id: string): Promise<void> {\n this.actionLoading = true;\n try {\n await this.api.rejectDraft(id);\n this.dispatchEvent(\n new CustomEvent('alx-draft-rejected', {\n detail: { id },\n bubbles: true,\n composed: true,\n }),\n );\n await this.load();\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Reject failed';\n } finally {\n this.actionLoading = false;\n }\n }\n\n private async onBulkApprove(): Promise<void> {\n if (this.selectedIds.size === 0) return;\n this.actionLoading = true;\n try {\n await this.api.bulkApprove([...this.selectedIds]);\n this.dispatchEvent(\n new CustomEvent('alx-draft-approved', {\n detail: { ids: [...this.selectedIds] },\n bubbles: true,\n composed: true,\n }),\n );\n await this.load();\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Bulk approve failed';\n } finally {\n this.actionLoading = false;\n }\n }\n\n private async onBulkReject(): Promise<void> {\n if (this.selectedIds.size === 0) return;\n this.actionLoading = true;\n try {\n const ids = [...this.selectedIds];\n const results = await Promise.allSettled(ids.map(id => this.api.rejectDraft(id)));\n const failures = results.filter(r => r.status === 'rejected');\n if (failures.length > 0) {\n this.error = `${failures.length} of ${ids.length} rejections failed`;\n }\n this.dispatchEvent(\n new CustomEvent('alx-draft-rejected', {\n detail: { ids },\n bubbles: true,\n composed: true,\n }),\n );\n await this.load();\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Bulk reject failed';\n } finally {\n this.actionLoading = false;\n }\n }\n\n private onView(draft: Draft): void {\n this.dispatchEvent(\n new CustomEvent('alx-draft-view', {\n detail: draft,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private formatDate(dateStr: string): string {\n return new Date(dateStr).toLocaleString();\n }\n\n override render() {\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>Approval Queue</h3>\n </div>\n\n <div class=\"toolbar\">\n ${this.selectedIds.size > 0\n ? html`\n <span class=\"selected-count\">${this.selectedIds.size} selected</span>\n <div class=\"bulk-actions\">\n <button\n class=\"alx-btn-sm alx-btn-success\"\n ?disabled=${this.actionLoading}\n @click=${this.onBulkApprove}\n >\n Approve Selected\n </button>\n <button\n class=\"alx-btn-sm alx-btn-danger\"\n ?disabled=${this.actionLoading}\n @click=${this.onBulkReject}\n >\n Reject Selected\n </button>\n </div>\n `\n : ''}\n <span class=\"spacer\"></span>\n <button @click=${() => this.load()}>Refresh</button>\n </div>\n\n ${this.error ? html`<div class=\"alx-error\">${this.error}</div>` : ''}\n ${this.loading\n ? html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`\n : this.drafts.length === 0\n ? html`<div class=\"alx-empty\">No pending drafts</div>`\n : html`\n <table>\n <thead>\n <tr>\n <th class=\"select-cell\">\n <input\n type=\"checkbox\"\n .checked=${this.selectedIds.size === this.drafts.length && this.drafts.length > 0}\n @change=${this.toggleAll}\n />\n </th>\n <th>To</th>\n <th>Subject</th>\n <th>Created</th>\n <th>Status</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n ${this.drafts.map(\n (d) => html`\n <tr>\n <td class=\"select-cell\">\n <input\n type=\"checkbox\"\n .checked=${this.selectedIds.has(d._id)}\n @change=${() => this.toggleSelect(d._id)}\n />\n </td>\n <td>${d.to}</td>\n <td>${d.subject}</td>\n <td>${this.formatDate(d.createdAt)}</td>\n <td>\n <span class=\"alx-badge alx-badge-warning\">${d.status}</span>\n </td>\n <td>\n <button class=\"alx-btn-sm\" @click=${() => this.onView(d)}>View</button>\n <button\n class=\"alx-btn-sm alx-btn-success\"\n ?disabled=${this.actionLoading}\n @click=${() => this.onApprove(d._id)}\n >\n Approve\n </button>\n <button\n class=\"alx-btn-sm alx-btn-danger\"\n ?disabled=${this.actionLoading}\n @click=${() => this.onReject(d._id)}\n >\n Reject\n </button>\n </td>\n </tr>\n `,\n )}\n </tbody>\n </table>\n `}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-approval-queue': AlxApprovalQueue;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxButtonStyles,\n alxInputStyles,\n alxCardStyles,\n alxLoadingStyles,\n} from '../../styles/shared.js';\nimport { AccountAPI } from '../../api/account.api.js';\n\ninterface Settings {\n timezone?: string;\n devMode?: boolean;\n imap?: {\n enabled?: boolean;\n pollIntervalMinutes?: number;\n };\n approval?: {\n enabled?: boolean;\n autoApproveAfterMinutes?: number;\n };\n queue?: {\n concurrency?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n };\n}\n\n@customElement('alx-global-settings')\nexport class AlxGlobalSettings extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxButtonStyles,\n alxInputStyles,\n alxCardStyles,\n alxLoadingStyles,\n css`\n .section {\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n margin-bottom: 0.75rem;\n overflow: hidden;\n }\n .section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n background: var(--alx-surface);\n cursor: pointer;\n user-select: none;\n }\n .section-header:hover {\n background: var(--alx-bg);\n }\n .section-title {\n font-weight: 600;\n font-size: 0.9rem;\n }\n .section-toggle {\n font-size: 0.75rem;\n color: var(--alx-text-muted);\n }\n .section-body {\n padding: 1rem;\n display: none;\n }\n .section-body.open {\n display: block;\n }\n .field-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n margin-bottom: 0.75rem;\n }\n .field-group {\n display: flex;\n flex-direction: column;\n }\n .toggle-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 0;\n }\n .toggle-label {\n font-size: 0.85rem;\n }\n .toggle-switch {\n position: relative;\n width: 44px;\n height: 24px;\n cursor: pointer;\n }\n .toggle-switch input {\n opacity: 0;\n width: 0;\n height: 0;\n position: absolute;\n }\n .toggle-slider {\n position: absolute;\n inset: 0;\n background: var(--alx-border);\n border-radius: 12px;\n transition: background 0.2s;\n }\n .toggle-slider::before {\n content: '';\n position: absolute;\n left: 3px;\n top: 3px;\n width: 18px;\n height: 18px;\n background: var(--alx-text);\n border-radius: 50%;\n transition: transform 0.2s;\n }\n .toggle-switch input:checked + .toggle-slider {\n background: var(--alx-primary);\n }\n .toggle-switch input:checked + .toggle-slider::before {\n transform: translateX(20px);\n }\n .section-actions {\n display: flex;\n justify-content: flex-end;\n margin-top: 0.75rem;\n }\n input[type='number'] {\n width: 100%;\n }\n `,\n ];\n\n @state() private settings: Settings = {};\n @state() private loading = false;\n @state() private error = '';\n @state() private saving: Record<string, boolean> = {};\n @state() private openSections = new Set<string>(['timezone']);\n\n private _api?: AccountAPI;\n private get api(): AccountAPI {\n if (!this._api) this._api = new AccountAPI();\n return this._api;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.load();\n }\n\n async load(): Promise<void> {\n this.loading = true;\n this.error = '';\n try {\n this.settings = ((await this.api.getSettings()) as Settings) ?? {};\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Failed to load settings';\n } finally {\n this.loading = false;\n }\n }\n\n private toggleSection(name: string): void {\n const next = new Set(this.openSections);\n if (next.has(name)) next.delete(name);\n else next.add(name);\n this.openSections = next;\n }\n\n private async saveSection(section: string, data: Record<string, unknown>): Promise<void> {\n this.saving = { ...this.saving, [section]: true };\n try {\n await this.api.updateSettings(data);\n this.dispatchEvent(\n new CustomEvent('alx-settings-saved', {\n detail: { section, data },\n bubbles: true,\n composed: true,\n }),\n );\n await this.load();\n } catch (e) {\n this.error = e instanceof Error ? e.message : 'Failed to save settings';\n } finally {\n this.saving = { ...this.saving, [section]: false };\n }\n }\n\n private renderSection(name: string, title: string, content: unknown) {\n const isOpen = this.openSections.has(name);\n return html`\n <div class=\"section\">\n <div class=\"section-header\" @click=${() => this.toggleSection(name)}>\n <span class=\"section-title\">${title}</span>\n <span class=\"section-toggle\">${isOpen ? '\\u25B2' : '\\u25BC'}</span>\n </div>\n <div class=\"section-body ${isOpen ? 'open' : ''}\">\n ${content}\n </div>\n </div>\n `;\n }\n\n override render() {\n if (this.loading) {\n return html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`;\n }\n\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>Global Settings</h3>\n </div>\n\n ${this.error ? html`<div class=\"alx-error\">${this.error}</div>` : ''}\n\n ${this.renderSection(\n 'timezone',\n 'Timezone & General',\n html`\n <div class=\"field-row\">\n <div class=\"field-group\">\n <label>Timezone</label>\n <input\n type=\"text\"\n .value=${this.settings.timezone ?? 'UTC'}\n @input=${(e: Event) => {\n this.settings = { ...this.settings, timezone: (e.target as HTMLInputElement).value };\n }}\n placeholder=\"e.g. America/New_York\"\n />\n </div>\n </div>\n <div class=\"toggle-row\">\n <span class=\"toggle-label\">Dev Mode</span>\n <label class=\"toggle-switch\">\n <input\n type=\"checkbox\"\n .checked=${this.settings.devMode ?? false}\n @change=${(e: Event) => {\n this.settings = { ...this.settings, devMode: (e.target as HTMLInputElement).checked };\n }}\n />\n <span class=\"toggle-slider\"></span>\n </label>\n </div>\n <div class=\"section-actions\">\n <button\n class=\"alx-btn-primary alx-btn-sm\"\n ?disabled=${this.saving['timezone']}\n @click=${() => this.saveSection('timezone', { timezone: this.settings.timezone, devMode: this.settings.devMode })}\n >\n ${this.saving['timezone'] ? 'Saving...' : 'Save'}\n </button>\n </div>\n `,\n )}\n\n ${this.renderSection(\n 'imap',\n 'IMAP Configuration',\n html`\n <div class=\"toggle-row\">\n <span class=\"toggle-label\">IMAP Bounce Checking</span>\n <label class=\"toggle-switch\">\n <input\n type=\"checkbox\"\n .checked=${this.settings.imap?.enabled ?? false}\n @change=${(e: Event) => {\n this.settings = {\n ...this.settings,\n imap: { ...this.settings.imap, enabled: (e.target as HTMLInputElement).checked },\n };\n }}\n />\n <span class=\"toggle-slider\"></span>\n </label>\n </div>\n <div class=\"field-row\">\n <div class=\"field-group\">\n <label>Poll Interval (minutes)</label>\n <input\n type=\"number\"\n .value=${String(this.settings.imap?.pollIntervalMinutes ?? 15)}\n @input=${(e: Event) => {\n this.settings = {\n ...this.settings,\n imap: { ...this.settings.imap, pollIntervalMinutes: Number((e.target as HTMLInputElement).value) },\n };\n }}\n min=\"1\"\n />\n </div>\n </div>\n <div class=\"section-actions\">\n <button\n class=\"alx-btn-primary alx-btn-sm\"\n ?disabled=${this.saving['imap']}\n @click=${() => this.saveSection('imap', { imap: this.settings.imap })}\n >\n ${this.saving['imap'] ? 'Saving...' : 'Save'}\n </button>\n </div>\n `,\n )}\n\n ${this.renderSection(\n 'approval',\n 'Approval Workflow',\n html`\n <div class=\"toggle-row\">\n <span class=\"toggle-label\">Require Approval</span>\n <label class=\"toggle-switch\">\n <input\n type=\"checkbox\"\n .checked=${this.settings.approval?.enabled ?? false}\n @change=${(e: Event) => {\n this.settings = {\n ...this.settings,\n approval: { ...this.settings.approval, enabled: (e.target as HTMLInputElement).checked },\n };\n }}\n />\n <span class=\"toggle-slider\"></span>\n </label>\n </div>\n <div class=\"field-row\">\n <div class=\"field-group\">\n <label>Auto-approve After (minutes, 0 = disabled)</label>\n <input\n type=\"number\"\n .value=${String(this.settings.approval?.autoApproveAfterMinutes ?? 0)}\n @input=${(e: Event) => {\n this.settings = {\n ...this.settings,\n approval: {\n ...this.settings.approval,\n autoApproveAfterMinutes: Number((e.target as HTMLInputElement).value),\n },\n };\n }}\n min=\"0\"\n />\n </div>\n </div>\n <div class=\"section-actions\">\n <button\n class=\"alx-btn-primary alx-btn-sm\"\n ?disabled=${this.saving['approval']}\n @click=${() => this.saveSection('approval', { approval: this.settings.approval })}\n >\n ${this.saving['approval'] ? 'Saving...' : 'Save'}\n </button>\n </div>\n `,\n )}\n\n ${this.renderSection(\n 'queue',\n 'Queue Tuning',\n html`\n <div class=\"field-row\">\n <div class=\"field-group\">\n <label>Concurrency</label>\n <input\n type=\"number\"\n .value=${String(this.settings.queue?.concurrency ?? 5)}\n @input=${(e: Event) => {\n this.settings = {\n ...this.settings,\n queue: { ...this.settings.queue, concurrency: Number((e.target as HTMLInputElement).value) },\n };\n }}\n min=\"1\"\n />\n </div>\n <div class=\"field-group\">\n <label>Retry Attempts</label>\n <input\n type=\"number\"\n .value=${String(this.settings.queue?.retryAttempts ?? 3)}\n @input=${(e: Event) => {\n this.settings = {\n ...this.settings,\n queue: { ...this.settings.queue, retryAttempts: Number((e.target as HTMLInputElement).value) },\n };\n }}\n min=\"0\"\n />\n </div>\n </div>\n <div class=\"field-row\">\n <div class=\"field-group\">\n <label>Retry Delay (ms)</label>\n <input\n type=\"number\"\n .value=${String(this.settings.queue?.retryDelayMs ?? 5000)}\n @input=${(e: Event) => {\n this.settings = {\n ...this.settings,\n queue: { ...this.settings.queue, retryDelayMs: Number((e.target as HTMLInputElement).value) },\n };\n }}\n min=\"100\"\n step=\"100\"\n />\n </div>\n </div>\n <div class=\"section-actions\">\n <button\n class=\"alx-btn-primary alx-btn-sm\"\n ?disabled=${this.saving['queue']}\n @click=${() => this.saveSection('queue', { queue: this.settings.queue })}\n >\n ${this.saving['queue'] ? 'Saving...' : 'Save'}\n </button>\n </div>\n `,\n )}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-global-settings': AlxGlobalSettings;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, state, property } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxInputStyles,\n alxTableStyles,\n alxBadgeStyles,\n alxLoadingStyles,\n alxCardStyles,\n} from '../../styles/shared.js';\nimport { RuleAPI } from '../../api/rule.api.js';\nimport type { PaginatedResponse } from '../../api/http-client.js';\n\ninterface TemplateRow {\n _id: string;\n name: string;\n slug: string;\n category: string;\n audience: string;\n platform: string;\n isActive: boolean;\n}\n\n@customElement('alx-template-list')\nexport class AlxTemplateList extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxInputStyles,\n alxTableStyles,\n alxBadgeStyles,\n alxLoadingStyles,\n alxCardStyles,\n css`\n .toolbar {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n flex-wrap: wrap;\n margin-bottom: 1rem;\n }\n\n .toolbar select {\n width: auto;\n min-width: 140px;\n }\n\n .spacer {\n flex: 1;\n }\n\n tr[data-clickable] {\n cursor: pointer;\n }\n\n .pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n margin-top: 1rem;\n }\n\n .toggle {\n position: relative;\n display: inline-block;\n width: 36px;\n height: 20px;\n }\n\n .toggle input {\n opacity: 0;\n width: 0;\n height: 0;\n position: absolute;\n }\n\n .toggle-slider {\n position: absolute;\n inset: 0;\n background: var(--alx-border);\n border-radius: 20px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .toggle-slider::before {\n content: '';\n position: absolute;\n width: 14px;\n height: 14px;\n left: 3px;\n bottom: 3px;\n background: #fff;\n border-radius: 50%;\n transition: transform 0.2s;\n }\n\n .toggle input:checked + .toggle-slider {\n background: var(--alx-success);\n }\n\n .toggle input:checked + .toggle-slider::before {\n transform: translateX(16px);\n }\n `,\n ];\n\n @property({ type: String }) categories = '';\n @property({ type: String }) audiences = '';\n @property({ type: String }) platforms = '';\n\n @state() private _templates: TemplateRow[] = [];\n @state() private _loading = false;\n @state() private _error = '';\n @state() private _page = 1;\n @state() private _totalPages = 1;\n @state() private _total = 0;\n @state() private _filterCategory = '';\n @state() private _filterAudience = '';\n @state() private _filterPlatform = '';\n\n private __api?: RuleAPI;\n private get _api(): RuleAPI {\n if (!this.__api) this.__api = new RuleAPI();\n return this.__api;\n }\n private readonly _limit = 20;\n private _loadGeneration = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._loadTemplates();\n }\n\n private _parseJsonAttr(val: string): string[] {\n if (!val) return [];\n try {\n return JSON.parse(val);\n } catch {\n return [];\n }\n }\n\n private async _loadTemplates(): Promise<void> {\n const gen = ++this._loadGeneration;\n this._loading = true;\n this._error = '';\n try {\n const params: Record<string, unknown> = {\n page: this._page,\n limit: this._limit,\n };\n if (this._filterCategory) params['category'] = this._filterCategory;\n if (this._filterAudience) params['audience'] = this._filterAudience;\n if (this._filterPlatform) params['platform'] = this._filterPlatform;\n\n const res = await this._api.listTemplates(params) as PaginatedResponse<TemplateRow>;\n if (gen !== this._loadGeneration) return;\n this._templates = res.data;\n this._totalPages = res.totalPages;\n this._total = res.total;\n } catch (err) {\n if (gen !== this._loadGeneration) return;\n this._error = err instanceof Error ? err.message : 'Failed to load templates';\n } finally {\n if (gen === this._loadGeneration) this._loading = false;\n }\n }\n\n private _onRowClick(template: TemplateRow): void {\n this.dispatchEvent(\n new CustomEvent('alx-template-selected', {\n detail: template,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private async _onToggleActive(template: TemplateRow, e: Event): Promise<void> {\n e.stopPropagation();\n try {\n await this._api.updateTemplate(template._id, { isActive: !template.isActive });\n await this._loadTemplates();\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to toggle template';\n }\n }\n\n private _onCreateClick(): void {\n this.dispatchEvent(\n new CustomEvent('alx-template-create', { bubbles: true, composed: true }),\n );\n }\n\n private _onFilterChange(): void {\n this._page = 1;\n this._loadTemplates();\n }\n\n private _goToPage(page: number): void {\n this._page = page;\n this._loadTemplates();\n }\n\n private _renderFilterSelect(\n label: string,\n value: string,\n options: string[],\n onChange: (val: string) => void,\n ) {\n if (options.length === 0) return nothing;\n return html`\n <select\n aria-label=${label}\n .value=${value}\n @change=${(e: Event) => {\n onChange((e.target as HTMLSelectElement).value);\n this._onFilterChange();\n }}\n >\n <option value=\"\">All ${label}</option>\n ${options.map((o) => html`<option value=${o} ?selected=${value === o}>${o}</option>`)}\n </select>\n `;\n }\n\n override render() {\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>Email Templates</h3>\n </div>\n\n <div class=\"toolbar\">\n ${this._renderFilterSelect(\n 'Categories',\n this._filterCategory,\n this._parseJsonAttr(this.categories),\n (v) => (this._filterCategory = v),\n )}\n ${this._renderFilterSelect(\n 'Audiences',\n this._filterAudience,\n this._parseJsonAttr(this.audiences),\n (v) => (this._filterAudience = v),\n )}\n ${this._renderFilterSelect(\n 'Platforms',\n this._filterPlatform,\n this._parseJsonAttr(this.platforms),\n (v) => (this._filterPlatform = v),\n )}\n <span class=\"spacer\"></span>\n <button class=\"alx-btn-primary\" @click=${this._onCreateClick}>+ Create Template</button>\n </div>\n\n ${this._error ? html`<div class=\"alx-error\">${this._error}</div>` : nothing}\n\n ${this._loading\n ? html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`\n : this._templates.length === 0\n ? html`<div class=\"alx-empty\">No templates found</div>`\n : html`\n <table>\n <thead>\n <tr>\n <th>Name</th>\n <th>Slug</th>\n <th>Category</th>\n <th>Audience</th>\n <th>Platform</th>\n <th>Active</th>\n </tr>\n </thead>\n <tbody>\n ${this._templates.map(\n (t) => html`\n <tr data-clickable @click=${() => this._onRowClick(t)}>\n <td>${t.name}</td>\n <td><code>${t.slug}</code></td>\n <td>${t.category}</td>\n <td>${t.audience}</td>\n <td>${t.platform}</td>\n <td>\n <label class=\"toggle\" @click=${(e: Event) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n .checked=${t.isActive}\n @change=${(e: Event) => this._onToggleActive(t, e)}\n />\n <span class=\"toggle-slider\"></span>\n </label>\n </td>\n </tr>\n `,\n )}\n </tbody>\n </table>\n\n <div class=\"pagination\">\n <button\n class=\"alx-btn-sm\"\n ?disabled=${this._page <= 1}\n @click=${() => this._goToPage(this._page - 1)}\n >\n Prev\n </button>\n <span class=\"text-muted text-small\">\n Page ${this._page} of ${this._totalPages} (${this._total} total)\n </span>\n <button\n class=\"alx-btn-sm\"\n ?disabled=${this._page >= this._totalPages}\n @click=${() => this._goToPage(this._page + 1)}\n >\n Next\n </button>\n </div>\n `}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-template-list': AlxTemplateList;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, state, property } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxInputStyles,\n alxCardStyles,\n alxLoadingStyles,\n} from '../../styles/shared.js';\nimport { RuleAPI } from '../../api/rule.api.js';\n\ninterface TemplateData {\n _id?: string;\n name: string;\n slug: string;\n category: string;\n audience: string;\n platform: string;\n subject: string;\n body: string;\n textBody: string;\n variables: string[];\n isActive: boolean;\n}\n\nconst EMPTY_TEMPLATE: TemplateData = {\n name: '',\n slug: '',\n category: '',\n audience: '',\n platform: '',\n subject: '',\n body: '',\n textBody: '',\n variables: [],\n isActive: true,\n};\n\n@customElement('alx-template-editor')\nexport class AlxTemplateEditor extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxInputStyles,\n alxCardStyles,\n alxLoadingStyles,\n css`\n .form-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n }\n\n .form-group {\n display: flex;\n flex-direction: column;\n }\n\n .form-group-full {\n grid-column: 1 / -1;\n }\n\n textarea {\n min-height: 200px;\n font-family: 'Fira Code', 'Cascadia Code', monospace;\n font-size: 0.8rem;\n resize: vertical;\n }\n\n .variables-input {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n }\n\n .variable-tag {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.2rem 0.5rem;\n background: color-mix(in srgb, var(--alx-primary) 15%, transparent);\n color: var(--alx-primary);\n border-radius: var(--alx-radius);\n font-size: 0.8rem;\n }\n\n .variable-tag button {\n background: none;\n border: none;\n color: var(--alx-text-muted);\n cursor: pointer;\n padding: 0;\n font-size: 1rem;\n line-height: 1;\n }\n\n .add-variable {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.5rem;\n }\n\n .add-variable input {\n width: 180px;\n }\n\n .actions {\n display: flex;\n gap: 0.75rem;\n margin-top: 1.5rem;\n }\n\n .preview-frame {\n width: 100%;\n height: 400px;\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n background: #fff;\n margin-top: 0.5rem;\n }\n `,\n ];\n\n @property({ attribute: 'template-id' }) templateId = '';\n @property({ type: String }) categories = '';\n @property({ type: String }) audiences = '';\n @property({ type: String }) platforms = '';\n\n @state() private _form: TemplateData = { ...EMPTY_TEMPLATE };\n @state() private _loading = false;\n @state() private _saving = false;\n @state() private _error = '';\n @state() private _previewHtml = '';\n @state() private _previewing = false;\n @state() private _newVariable = '';\n\n private __api?: RuleAPI;\n private get _api(): RuleAPI {\n if (!this.__api) this.__api = new RuleAPI();\n return this.__api;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.templateId) {\n this._loadTemplate();\n }\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('templateId') && this.templateId) {\n this._loadTemplate();\n }\n }\n\n private _parseJsonAttr(val: string): string[] {\n if (!val) return [];\n try {\n return JSON.parse(val);\n } catch {\n return [];\n }\n }\n\n private async _loadTemplate(): Promise<void> {\n this._loading = true;\n this._error = '';\n try {\n const res = await this._api.listTemplates({ _id: this.templateId, limit: 1 }) as {\n data: TemplateData[];\n };\n if (res.data.length > 0) {\n this._form = { ...res.data[0] };\n }\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to load template';\n } finally {\n this._loading = false;\n }\n }\n\n private _updateField(field: keyof TemplateData, value: unknown): void {\n this._form = { ...this._form, [field]: value };\n }\n\n private _addVariable(): void {\n const v = this._newVariable.trim();\n if (v && !this._form.variables.includes(v)) {\n this._form = { ...this._form, variables: [...this._form.variables, v] };\n this._newVariable = '';\n }\n }\n\n private _removeVariable(variable: string): void {\n this._form = {\n ...this._form,\n variables: this._form.variables.filter((v) => v !== variable),\n };\n }\n\n private async _onPreview(): Promise<void> {\n this._previewing = true;\n this._error = '';\n try {\n const res = (await this._api.previewTemplate({\n body: this._form.body,\n subject: this._form.subject,\n variables: this._form.variables,\n })) as { html: string };\n this._previewHtml = res.html;\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Preview failed';\n } finally {\n this._previewing = false;\n }\n }\n\n private async _onSave(): Promise<void> {\n this._saving = true;\n this._error = '';\n try {\n const payload: Record<string, unknown> = { ...this._form };\n delete payload['_id'];\n\n let result: unknown;\n if (this._form._id) {\n result = await this._api.updateTemplate(this._form._id, payload);\n } else {\n result = await this._api.createTemplate(payload);\n }\n\n this.dispatchEvent(\n new CustomEvent('alx-template-saved', {\n detail: result,\n bubbles: true,\n composed: true,\n }),\n );\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to save template';\n } finally {\n this._saving = false;\n }\n }\n\n private _renderSelect(\n label: string,\n field: keyof TemplateData,\n options: string[],\n ) {\n const value = this._form[field] as string;\n return html`\n <div class=\"form-group\">\n <label>${label}</label>\n <select\n .value=${value}\n @change=${(e: Event) => this._updateField(field, (e.target as HTMLSelectElement).value)}\n >\n <option value=\"\">Select ${label.toLowerCase()}</option>\n ${options.map((o) => html`<option value=${o} ?selected=${value === o}>${o}</option>`)}\n </select>\n </div>\n `;\n }\n\n override render() {\n if (this._loading) {\n return html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`;\n }\n\n const categories = this._parseJsonAttr(this.categories);\n const audiences = this._parseJsonAttr(this.audiences);\n const platforms = this._parseJsonAttr(this.platforms);\n const isEdit = !!this._form._id;\n\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>${isEdit ? 'Edit Template' : 'Create Template'}</h3>\n </div>\n\n ${this._error ? html`<div class=\"alx-error\">${this._error}</div>` : nothing}\n\n <div class=\"form-grid\">\n <div class=\"form-group\">\n <label>Name</label>\n <input\n type=\"text\"\n .value=${this._form.name}\n @input=${(e: Event) => this._updateField('name', (e.target as HTMLInputElement).value)}\n placeholder=\"Template name\"\n />\n </div>\n\n <div class=\"form-group\">\n <label>Slug</label>\n <input\n type=\"text\"\n .value=${this._form.slug}\n @input=${(e: Event) => this._updateField('slug', (e.target as HTMLInputElement).value)}\n placeholder=\"template-slug\"\n />\n </div>\n\n ${categories.length > 0\n ? this._renderSelect('Category', 'category', categories)\n : html`\n <div class=\"form-group\">\n <label>Category</label>\n <input\n type=\"text\"\n .value=${this._form.category}\n @input=${(e: Event) =>\n this._updateField('category', (e.target as HTMLInputElement).value)}\n placeholder=\"Category\"\n />\n </div>\n `}\n\n ${audiences.length > 0\n ? this._renderSelect('Audience', 'audience', audiences)\n : html`\n <div class=\"form-group\">\n <label>Audience</label>\n <input\n type=\"text\"\n .value=${this._form.audience}\n @input=${(e: Event) =>\n this._updateField('audience', (e.target as HTMLInputElement).value)}\n placeholder=\"Audience\"\n />\n </div>\n `}\n\n ${platforms.length > 0\n ? this._renderSelect('Platform', 'platform', platforms)\n : html`\n <div class=\"form-group\">\n <label>Platform</label>\n <input\n type=\"text\"\n .value=${this._form.platform}\n @input=${(e: Event) =>\n this._updateField('platform', (e.target as HTMLInputElement).value)}\n placeholder=\"Platform\"\n />\n </div>\n `}\n\n <div class=\"form-group\">\n <label>Subject</label>\n <input\n type=\"text\"\n .value=${this._form.subject}\n @input=${(e: Event) =>\n this._updateField('subject', (e.target as HTMLInputElement).value)}\n placeholder=\"Email subject (supports {{variables}})\"\n />\n </div>\n\n <div class=\"form-group form-group-full\">\n <label>Body (MJML / Handlebars)</label>\n <textarea\n .value=${this._form.body}\n @input=${(e: Event) =>\n this._updateField('body', (e.target as HTMLTextAreaElement).value)}\n placeholder=\"<mjml>...</mjml>\"\n ></textarea>\n </div>\n\n <div class=\"form-group form-group-full\">\n <label>Text Body (plain text fallback)</label>\n <textarea\n .value=${this._form.textBody}\n @input=${(e: Event) =>\n this._updateField('textBody', (e.target as HTMLTextAreaElement).value)}\n placeholder=\"Plain text version of the email\"\n style=\"min-height: 100px\"\n ></textarea>\n </div>\n\n <div class=\"form-group form-group-full\">\n <label>Variables</label>\n <div class=\"variables-input\">\n ${this._form.variables.map(\n (v) => html`\n <span class=\"variable-tag\">\n {{${v}}}\n <button @click=${() => this._removeVariable(v)}>&times;</button>\n </span>\n `,\n )}\n </div>\n <div class=\"add-variable\">\n <input\n type=\"text\"\n .value=${this._newVariable}\n @input=${(e: Event) =>\n (this._newVariable = (e.target as HTMLInputElement).value)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this._addVariable();\n }\n }}\n placeholder=\"Variable name\"\n />\n <button class=\"alx-btn-sm\" @click=${this._addVariable}>Add</button>\n </div>\n </div>\n\n ${this._previewHtml\n ? html`\n <div class=\"form-group form-group-full\">\n <label>Preview</label>\n <iframe\n class=\"preview-frame\"\n .srcdoc=${this._previewHtml}\n sandbox=\"\"\n ></iframe>\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"actions\">\n <button\n class=\"alx-btn-primary\"\n ?disabled=${this._saving}\n @click=${this._onSave}\n >\n ${this._saving ? 'Saving...' : isEdit ? 'Update Template' : 'Create Template'}\n </button>\n <button\n ?disabled=${this._previewing || !this._form.body}\n @click=${this._onPreview}\n >\n ${this._previewing ? 'Loading...' : 'Preview'}\n </button>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-template-editor': AlxTemplateEditor;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxTableStyles,\n alxBadgeStyles,\n alxLoadingStyles,\n alxCardStyles,\n} from '../../styles/shared.js';\nimport { RuleAPI } from '../../api/rule.api.js';\nimport type { PaginatedResponse } from '../../api/http-client.js';\n\ninterface RuleRow {\n _id: string;\n name: string;\n templateName?: string;\n templateId: string;\n isActive: boolean;\n lastRunAt: string | null;\n totalSent: number;\n totalSkipped: number;\n}\n\n@customElement('alx-rule-list')\nexport class AlxRuleList extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxTableStyles,\n alxBadgeStyles,\n alxLoadingStyles,\n alxCardStyles,\n css`\n .toolbar {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-bottom: 1rem;\n }\n\n .spacer {\n flex: 1;\n }\n\n tr[data-clickable] {\n cursor: pointer;\n }\n\n .pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n margin-top: 1rem;\n }\n\n .toggle {\n position: relative;\n display: inline-block;\n width: 36px;\n height: 20px;\n }\n\n .toggle input {\n opacity: 0;\n width: 0;\n height: 0;\n position: absolute;\n }\n\n .toggle-slider {\n position: absolute;\n inset: 0;\n background: var(--alx-border);\n border-radius: 20px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .toggle-slider::before {\n content: '';\n position: absolute;\n width: 14px;\n height: 14px;\n left: 3px;\n bottom: 3px;\n background: #fff;\n border-radius: 50%;\n transition: transform 0.2s;\n }\n\n .toggle input:checked + .toggle-slider {\n background: var(--alx-success);\n }\n\n .toggle input:checked + .toggle-slider::before {\n transform: translateX(16px);\n }\n\n .stat {\n font-variant-numeric: tabular-nums;\n }\n `,\n ];\n\n @state() private _rules: RuleRow[] = [];\n @state() private _loading = false;\n @state() private _error = '';\n @state() private _page = 1;\n @state() private _totalPages = 1;\n @state() private _total = 0;\n\n private __api?: RuleAPI;\n private get _api(): RuleAPI {\n if (!this.__api) this.__api = new RuleAPI();\n return this.__api;\n }\n private readonly _limit = 20;\n private _loadGeneration = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._loadRules();\n }\n\n private async _loadRules(): Promise<void> {\n const gen = ++this._loadGeneration;\n this._loading = true;\n this._error = '';\n try {\n const res = await this._api.listRules({\n page: this._page,\n limit: this._limit,\n }) as PaginatedResponse<RuleRow>;\n if (gen !== this._loadGeneration) return;\n this._rules = res.data;\n this._totalPages = res.totalPages;\n this._total = res.total;\n } catch (err) {\n if (gen !== this._loadGeneration) return;\n this._error = err instanceof Error ? err.message : 'Failed to load rules';\n } finally {\n if (gen === this._loadGeneration) this._loading = false;\n }\n }\n\n private _onRowClick(rule: RuleRow): void {\n this.dispatchEvent(\n new CustomEvent('alx-rule-selected', {\n detail: rule,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private async _onToggleActive(rule: RuleRow, e: Event): Promise<void> {\n e.stopPropagation();\n try {\n await this._api.toggleRule(rule._id);\n await this._loadRules();\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to toggle rule';\n }\n }\n\n private _onCreateClick(): void {\n this.dispatchEvent(\n new CustomEvent('alx-rule-create', { bubbles: true, composed: true }),\n );\n }\n\n private async _onDryRun(rule: RuleRow, e: Event): Promise<void> {\n e.stopPropagation();\n try {\n const result = await this._api.dryRun(rule._id);\n this.dispatchEvent(\n new CustomEvent('alx-rule-dry-run', {\n detail: { ruleId: rule._id, result },\n bubbles: true,\n composed: true,\n }),\n );\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Dry run failed';\n }\n }\n\n private _goToPage(page: number): void {\n this._page = page;\n this._loadRules();\n }\n\n private _formatDate(dateStr: string | null): string {\n if (!dateStr) return '--';\n return new Date(dateStr).toLocaleString();\n }\n\n override render() {\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>Email Rules</h3>\n </div>\n\n <div class=\"toolbar\">\n <span class=\"spacer\"></span>\n <button class=\"alx-btn-primary\" @click=${this._onCreateClick}>+ Create Rule</button>\n </div>\n\n ${this._error ? html`<div class=\"alx-error\">${this._error}</div>` : nothing}\n\n ${this._loading\n ? html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`\n : this._rules.length === 0\n ? html`<div class=\"alx-empty\">No rules found</div>`\n : html`\n <table>\n <thead>\n <tr>\n <th>Name</th>\n <th>Template</th>\n <th>Active</th>\n <th>Last Run</th>\n <th>Sent</th>\n <th>Skipped</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n ${this._rules.map(\n (r) => html`\n <tr data-clickable @click=${() => this._onRowClick(r)}>\n <td>${r.name}</td>\n <td>${r.templateName ?? r.templateId}</td>\n <td>\n <label class=\"toggle\" @click=${(e: Event) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n .checked=${r.isActive}\n @change=${(e: Event) => this._onToggleActive(r, e)}\n />\n <span class=\"toggle-slider\"></span>\n </label>\n </td>\n <td class=\"text-muted text-small\">${this._formatDate(r.lastRunAt)}</td>\n <td class=\"stat\">${r.totalSent}</td>\n <td class=\"stat\">${r.totalSkipped}</td>\n <td>\n <button\n class=\"alx-btn-sm\"\n @click=${(e: Event) => this._onDryRun(r, e)}\n >\n Dry Run\n </button>\n </td>\n </tr>\n `,\n )}\n </tbody>\n </table>\n\n <div class=\"pagination\">\n <button\n class=\"alx-btn-sm\"\n ?disabled=${this._page <= 1}\n @click=${() => this._goToPage(this._page - 1)}\n >\n Prev\n </button>\n <span class=\"text-muted text-small\">\n Page ${this._page} of ${this._totalPages} (${this._total} total)\n </span>\n <button\n class=\"alx-btn-sm\"\n ?disabled=${this._page >= this._totalPages}\n @click=${() => this._goToPage(this._page + 1)}\n >\n Next\n </button>\n </div>\n `}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-rule-list': AlxRuleList;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, state, property } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxInputStyles,\n alxCardStyles,\n alxLoadingStyles,\n} from '../../styles/shared.js';\nimport { RuleAPI } from '../../api/rule.api.js';\n\ninterface Condition {\n field: string;\n operator: string;\n value: string;\n}\n\ninterface TemplateOption {\n _id: string;\n name: string;\n}\n\ninterface RuleData {\n _id?: string;\n name: string;\n templateId: string;\n platform: string;\n audience: string;\n target: {\n conditions: Condition[];\n };\n behavior: {\n sendOnce: boolean;\n resendAfterDays: number | null;\n maxPerRun: number;\n autoApprove: boolean;\n emailType: string;\n bypassThrottle: boolean;\n };\n isActive: boolean;\n}\n\nconst EMPTY_RULE: RuleData = {\n name: '',\n templateId: '',\n platform: '',\n audience: '',\n target: { conditions: [] },\n behavior: {\n sendOnce: true,\n resendAfterDays: null,\n maxPerRun: 50,\n autoApprove: true,\n emailType: 'marketing',\n bypassThrottle: false,\n },\n isActive: true,\n};\n\nconst OPERATORS = ['equals', 'not_equals', 'contains', 'gt', 'gte', 'lt', 'lte', 'in', 'exists'];\n\n@customElement('alx-rule-editor')\nexport class AlxRuleEditor extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxInputStyles,\n alxCardStyles,\n alxLoadingStyles,\n css`\n .form-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n }\n\n .form-group {\n display: flex;\n flex-direction: column;\n }\n\n .form-group-full {\n grid-column: 1 / -1;\n }\n\n .section-title {\n font-size: 0.95rem;\n font-weight: 600;\n color: var(--alx-text);\n margin-top: 1rem;\n margin-bottom: 0.5rem;\n padding-bottom: 0.25rem;\n border-bottom: 1px solid var(--alx-border);\n grid-column: 1 / -1;\n }\n\n .condition-row {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n margin-bottom: 0.5rem;\n }\n\n .condition-row input,\n .condition-row select {\n flex: 1;\n }\n\n .condition-row button {\n flex-shrink: 0;\n }\n\n .checkbox-group {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-top: 0.25rem;\n }\n\n .checkbox-group input[type='checkbox'] {\n width: auto;\n }\n\n .actions {\n display: flex;\n gap: 0.75rem;\n margin-top: 1.5rem;\n }\n `,\n ];\n\n @property({ attribute: 'rule-id' }) ruleId = '';\n\n @state() private _form: RuleData = JSON.parse(JSON.stringify(EMPTY_RULE));\n @state() private _templates: TemplateOption[] = [];\n @state() private _loading = false;\n @state() private _saving = false;\n @state() private _error = '';\n\n private __api?: RuleAPI;\n private get _api(): RuleAPI {\n if (!this.__api) this.__api = new RuleAPI();\n return this.__api;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._loadTemplates();\n if (this.ruleId) {\n this._loadRule();\n }\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('ruleId') && this.ruleId) {\n this._loadRule();\n }\n }\n\n private async _loadTemplates(): Promise<void> {\n try {\n const res = (await this._api.listTemplates({ limit: 200 })) as {\n data: TemplateOption[];\n };\n this._templates = res.data;\n } catch {\n // templates will be empty, user can still type an ID\n }\n }\n\n private async _loadRule(): Promise<void> {\n this._loading = true;\n this._error = '';\n try {\n const res = (await this._api.listRules({ _id: this.ruleId, limit: 1 })) as {\n data: RuleData[];\n };\n if (res.data.length > 0) {\n this._form = { ...JSON.parse(JSON.stringify(EMPTY_RULE)), ...res.data[0] };\n }\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to load rule';\n } finally {\n this._loading = false;\n }\n }\n\n private _updateField(field: keyof RuleData, value: unknown): void {\n this._form = { ...this._form, [field]: value };\n }\n\n private _updateBehavior(field: keyof RuleData['behavior'], value: unknown): void {\n this._form = {\n ...this._form,\n behavior: { ...this._form.behavior, [field]: value },\n };\n }\n\n private _addCondition(): void {\n const conditions = [...this._form.target.conditions, { field: '', operator: 'equals', value: '' }];\n this._form = { ...this._form, target: { conditions } };\n }\n\n private _updateCondition(index: number, field: keyof Condition, value: string): void {\n const conditions = [...this._form.target.conditions];\n conditions[index] = { ...conditions[index], [field]: value };\n this._form = { ...this._form, target: { conditions } };\n }\n\n private _removeCondition(index: number): void {\n const conditions = this._form.target.conditions.filter((_, i) => i !== index);\n this._form = { ...this._form, target: { conditions } };\n }\n\n private async _onSave(): Promise<void> {\n this._saving = true;\n this._error = '';\n try {\n const payload: Record<string, unknown> = { ...this._form };\n delete payload['_id'];\n\n let result: unknown;\n if (this._form._id) {\n result = await this._api.updateRule(this._form._id, payload);\n } else {\n result = await this._api.createRule(payload);\n }\n\n this.dispatchEvent(\n new CustomEvent('alx-rule-saved', {\n detail: result,\n bubbles: true,\n composed: true,\n }),\n );\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to save rule';\n } finally {\n this._saving = false;\n }\n }\n\n override render() {\n if (this._loading) {\n return html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`;\n }\n\n const isEdit = !!this._form._id;\n\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>${isEdit ? 'Edit Rule' : 'Create Rule'}</h3>\n </div>\n\n ${this._error ? html`<div class=\"alx-error\">${this._error}</div>` : nothing}\n\n <div class=\"form-grid\">\n <div class=\"form-group\">\n <label>Name</label>\n <input\n type=\"text\"\n .value=${this._form.name}\n @input=${(e: Event) => this._updateField('name', (e.target as HTMLInputElement).value)}\n placeholder=\"Rule name\"\n />\n </div>\n\n <div class=\"form-group\">\n <label>Template</label>\n <select\n .value=${this._form.templateId}\n @change=${(e: Event) =>\n this._updateField('templateId', (e.target as HTMLSelectElement).value)}\n >\n <option value=\"\">Select template</option>\n ${this._templates.map(\n (t) =>\n html`<option value=${t._id} ?selected=${this._form.templateId === t._id}>\n ${t.name}\n </option>`,\n )}\n </select>\n </div>\n\n <div class=\"form-group\">\n <label>Platform</label>\n <input\n type=\"text\"\n .value=${this._form.platform}\n @input=${(e: Event) =>\n this._updateField('platform', (e.target as HTMLInputElement).value)}\n placeholder=\"Platform\"\n />\n </div>\n\n <div class=\"form-group\">\n <label>Audience</label>\n <input\n type=\"text\"\n .value=${this._form.audience}\n @input=${(e: Event) =>\n this._updateField('audience', (e.target as HTMLInputElement).value)}\n placeholder=\"Audience\"\n />\n </div>\n\n <!-- Conditions -->\n <div class=\"section-title\">Target Conditions</div>\n\n <div class=\"form-group form-group-full\">\n ${this._form.target.conditions.map(\n (c, i) => html`\n <div class=\"condition-row\">\n <input\n type=\"text\"\n .value=${c.field}\n @input=${(e: Event) =>\n this._updateCondition(i, 'field', (e.target as HTMLInputElement).value)}\n placeholder=\"Field path\"\n />\n <select\n .value=${c.operator}\n @change=${(e: Event) =>\n this._updateCondition(i, 'operator', (e.target as HTMLSelectElement).value)}\n >\n ${OPERATORS.map(\n (op) =>\n html`<option value=${op} ?selected=${c.operator === op}>${op}</option>`,\n )}\n </select>\n <input\n type=\"text\"\n .value=${c.value}\n @input=${(e: Event) =>\n this._updateCondition(i, 'value', (e.target as HTMLInputElement).value)}\n placeholder=\"Value\"\n />\n <button class=\"alx-btn-sm alx-btn-danger\" @click=${() => this._removeCondition(i)}>\n &times;\n </button>\n </div>\n `,\n )}\n <button class=\"alx-btn-sm\" @click=${this._addCondition}>+ Add Condition</button>\n </div>\n\n <!-- Behavior -->\n <div class=\"section-title\">Behavior</div>\n\n <div class=\"form-group\">\n <label>Email Type</label>\n <select\n .value=${this._form.behavior.emailType}\n @change=${(e: Event) =>\n this._updateBehavior('emailType', (e.target as HTMLSelectElement).value)}\n >\n <option value=\"marketing\" ?selected=${this._form.behavior.emailType === 'marketing'}>\n Marketing\n </option>\n <option\n value=\"transactional\"\n ?selected=${this._form.behavior.emailType === 'transactional'}\n >\n Transactional\n </option>\n </select>\n </div>\n\n <div class=\"form-group\">\n <label>Max Per Run</label>\n <input\n type=\"number\"\n .value=${String(this._form.behavior.maxPerRun)}\n @input=${(e: Event) =>\n this._updateBehavior('maxPerRun', Number((e.target as HTMLInputElement).value))}\n min=\"1\"\n />\n </div>\n\n <div class=\"form-group\">\n <label>Resend After Days</label>\n <input\n type=\"number\"\n .value=${this._form.behavior.resendAfterDays !== null\n ? String(this._form.behavior.resendAfterDays)\n : ''}\n @input=${(e: Event) => {\n const val = (e.target as HTMLInputElement).value;\n this._updateBehavior('resendAfterDays', val ? Number(val) : null);\n }}\n placeholder=\"Leave empty for never\"\n min=\"1\"\n />\n </div>\n\n <div class=\"form-group\">\n <div class=\"checkbox-group\">\n <input\n type=\"checkbox\"\n id=\"sendOnce\"\n .checked=${this._form.behavior.sendOnce}\n @change=${(e: Event) =>\n this._updateBehavior('sendOnce', (e.target as HTMLInputElement).checked)}\n />\n <label for=\"sendOnce\" style=\"margin-bottom:0\">Send Once</label>\n </div>\n </div>\n\n <div class=\"form-group\">\n <div class=\"checkbox-group\">\n <input\n type=\"checkbox\"\n id=\"autoApprove\"\n .checked=${this._form.behavior.autoApprove}\n @change=${(e: Event) =>\n this._updateBehavior('autoApprove', (e.target as HTMLInputElement).checked)}\n />\n <label for=\"autoApprove\" style=\"margin-bottom:0\">Auto Approve</label>\n </div>\n </div>\n\n <div class=\"form-group\">\n <div class=\"checkbox-group\">\n <input\n type=\"checkbox\"\n id=\"bypassThrottle\"\n .checked=${this._form.behavior.bypassThrottle}\n @change=${(e: Event) =>\n this._updateBehavior('bypassThrottle', (e.target as HTMLInputElement).checked)}\n />\n <label for=\"bypassThrottle\" style=\"margin-bottom:0\">Bypass Throttle</label>\n </div>\n </div>\n </div>\n\n <div class=\"actions\">\n <button\n class=\"alx-btn-primary\"\n ?disabled=${this._saving}\n @click=${this._onSave}\n >\n ${this._saving ? 'Saving...' : isEdit ? 'Update Rule' : 'Create Rule'}\n </button>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-rule-editor': AlxRuleEditor;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxInputStyles,\n alxTableStyles,\n alxBadgeStyles,\n alxLoadingStyles,\n alxCardStyles,\n} from '../../styles/shared.js';\nimport { RuleAPI } from '../../api/rule.api.js';\nimport type { PaginatedResponse } from '../../api/http-client.js';\n\ninterface PerRuleStat {\n ruleName: string;\n ruleId: string;\n sent: number;\n skipped: number;\n errors: number;\n}\n\ninterface RunLog {\n _id: string;\n runAt: string;\n triggeredBy: string;\n duration: number;\n rulesProcessed: number;\n totalSent: number;\n totalSkipped: number;\n totalErrors: number;\n perRuleStats: PerRuleStat[];\n}\n\n@customElement('alx-run-history')\nexport class AlxRunHistory extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxInputStyles,\n alxTableStyles,\n alxBadgeStyles,\n alxLoadingStyles,\n alxCardStyles,\n css`\n .toolbar {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n flex-wrap: wrap;\n margin-bottom: 1rem;\n }\n\n .toolbar input[type='date'] {\n width: auto;\n }\n\n .spacer {\n flex: 1;\n }\n\n .pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n margin-top: 1rem;\n }\n\n .expandable {\n cursor: pointer;\n }\n\n .expand-icon {\n display: inline-block;\n transition: transform 0.2s;\n margin-right: 0.5rem;\n }\n\n .expand-icon.open {\n transform: rotate(90deg);\n }\n\n .sub-table {\n padding: 0.75rem 1.5rem;\n background: var(--alx-bg);\n }\n\n .sub-table table {\n font-size: 0.8rem;\n }\n\n .stat {\n font-variant-numeric: tabular-nums;\n }\n\n .duration {\n color: var(--alx-text-muted);\n font-size: 0.8rem;\n }\n `,\n ];\n\n @state() private _logs: RunLog[] = [];\n @state() private _loading = false;\n @state() private _error = '';\n @state() private _page = 1;\n @state() private _totalPages = 1;\n @state() private _total = 0;\n @state() private _expandedIds = new Set<string>();\n @state() private _dateFrom = '';\n @state() private _dateTo = '';\n\n private __api?: RuleAPI;\n private get _api(): RuleAPI {\n if (!this.__api) this.__api = new RuleAPI();\n return this.__api;\n }\n private readonly _limit = 20;\n private _loadGeneration = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._loadLogs();\n }\n\n private async _loadLogs(): Promise<void> {\n const gen = ++this._loadGeneration;\n this._loading = true;\n this._error = '';\n try {\n const params: Record<string, unknown> = {\n page: this._page,\n limit: this._limit,\n };\n if (this._dateFrom) params['from'] = this._dateFrom;\n if (this._dateTo) params['to'] = this._dateTo;\n\n const res = (await this._api.getRunHistory(params)) as PaginatedResponse<RunLog>;\n if (gen !== this._loadGeneration) return;\n this._logs = res.data;\n this._totalPages = res.totalPages;\n this._total = res.total;\n } catch (err) {\n if (gen !== this._loadGeneration) return;\n this._error = err instanceof Error ? err.message : 'Failed to load run history';\n } finally {\n if (gen === this._loadGeneration) this._loading = false;\n }\n }\n\n private _toggleExpand(id: string): void {\n const next = new Set(this._expandedIds);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n this._expandedIds = next;\n }\n\n private _onDateFilter(): void {\n this._page = 1;\n this._loadLogs();\n }\n\n private _goToPage(page: number): void {\n this._page = page;\n this._loadLogs();\n }\n\n private _formatDate(dateStr: string): string {\n return new Date(dateStr).toLocaleString();\n }\n\n private _formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n }\n\n override render() {\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>Run History</h3>\n </div>\n\n <div class=\"toolbar\">\n <label style=\"margin-bottom:0\">From</label>\n <input\n type=\"date\"\n .value=${this._dateFrom}\n @change=${(e: Event) => {\n this._dateFrom = (e.target as HTMLInputElement).value;\n this._onDateFilter();\n }}\n />\n <label style=\"margin-bottom:0\">To</label>\n <input\n type=\"date\"\n .value=${this._dateTo}\n @change=${(e: Event) => {\n this._dateTo = (e.target as HTMLInputElement).value;\n this._onDateFilter();\n }}\n />\n <span class=\"spacer\"></span>\n </div>\n\n ${this._error ? html`<div class=\"alx-error\">${this._error}</div>` : nothing}\n\n ${this._loading\n ? html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`\n : this._logs.length === 0\n ? html`<div class=\"alx-empty\">No run history found</div>`\n : html`\n <table>\n <thead>\n <tr>\n <th></th>\n <th>Run At</th>\n <th>Triggered By</th>\n <th>Duration</th>\n <th>Rules</th>\n <th>Sent</th>\n <th>Skipped</th>\n <th>Errors</th>\n </tr>\n </thead>\n <tbody>\n ${this._logs.map((log) => {\n const expanded = this._expandedIds.has(log._id);\n return html`\n <tr class=\"expandable\" @click=${() => this._toggleExpand(log._id)}>\n <td>\n <span class=\"expand-icon ${expanded ? 'open' : ''}\">&#9654;</span>\n </td>\n <td>${this._formatDate(log.runAt)}</td>\n <td>${log.triggeredBy}</td>\n <td class=\"duration\">${this._formatDuration(log.duration)}</td>\n <td class=\"stat\">${log.rulesProcessed}</td>\n <td class=\"stat\">${log.totalSent}</td>\n <td class=\"stat\">${log.totalSkipped}</td>\n <td class=\"stat\">\n ${log.totalErrors > 0\n ? html`<span class=\"alx-badge alx-badge-danger\">${log.totalErrors}</span>`\n : '0'}\n </td>\n </tr>\n ${expanded && log.perRuleStats?.length > 0\n ? html`\n <tr>\n <td colspan=\"8\" class=\"sub-table\">\n <table>\n <thead>\n <tr>\n <th>Rule</th>\n <th>Sent</th>\n <th>Skipped</th>\n <th>Errors</th>\n </tr>\n </thead>\n <tbody>\n ${log.perRuleStats.map(\n (stat) => html`\n <tr>\n <td>${stat.ruleName}</td>\n <td class=\"stat\">${stat.sent}</td>\n <td class=\"stat\">${stat.skipped}</td>\n <td class=\"stat\">${stat.errors}</td>\n </tr>\n `,\n )}\n </tbody>\n </table>\n </td>\n </tr>\n `\n : nothing}\n `;\n })}\n </tbody>\n </table>\n\n <div class=\"pagination\">\n <button\n class=\"alx-btn-sm\"\n ?disabled=${this._page <= 1}\n @click=${() => this._goToPage(this._page - 1)}\n >\n Prev\n </button>\n <span class=\"text-muted text-small\">\n Page ${this._page} of ${this._totalPages} (${this._total} total)\n </span>\n <button\n class=\"alx-btn-sm\"\n ?disabled=${this._page >= this._totalPages}\n @click=${() => this._goToPage(this._page + 1)}\n >\n Next\n </button>\n </div>\n `}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-run-history': AlxRunHistory;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxInputStyles,\n alxCardStyles,\n alxLoadingStyles,\n} from '../../styles/shared.js';\nimport { RuleAPI } from '../../api/rule.api.js';\n\ninterface ThrottleData {\n maxPerUserPerDay: number;\n maxPerUserPerWeek: number;\n minGapDays: number;\n}\n\nconst DEFAULT_THROTTLE: ThrottleData = {\n maxPerUserPerDay: 1,\n maxPerUserPerWeek: 3,\n minGapDays: 1,\n};\n\n@customElement('alx-throttle-settings')\nexport class AlxThrottleSettings extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxInputStyles,\n alxCardStyles,\n alxLoadingStyles,\n css`\n .form-grid {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 1rem;\n }\n\n .form-group {\n display: flex;\n flex-direction: column;\n }\n\n .actions {\n display: flex;\n gap: 0.75rem;\n margin-top: 1.5rem;\n }\n\n .hint {\n font-size: 0.75rem;\n color: var(--alx-text-muted);\n margin-top: 0.25rem;\n }\n\n @media (max-width: 600px) {\n .form-grid {\n grid-template-columns: 1fr;\n }\n }\n `,\n ];\n\n @state() private _form: ThrottleData = { ...DEFAULT_THROTTLE };\n @state() private _loading = false;\n @state() private _saving = false;\n @state() private _error = '';\n @state() private _saved = false;\n\n private __api?: RuleAPI;\n private get _api(): RuleAPI {\n if (!this.__api) this.__api = new RuleAPI();\n return this.__api;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._loadSettings();\n }\n\n private async _loadSettings(): Promise<void> {\n this._loading = true;\n this._error = '';\n try {\n const res = (await this._api.getThrottleSettings()) as ThrottleData;\n this._form = {\n maxPerUserPerDay: res.maxPerUserPerDay ?? DEFAULT_THROTTLE.maxPerUserPerDay,\n maxPerUserPerWeek: res.maxPerUserPerWeek ?? DEFAULT_THROTTLE.maxPerUserPerWeek,\n minGapDays: res.minGapDays ?? DEFAULT_THROTTLE.minGapDays,\n };\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to load throttle settings';\n } finally {\n this._loading = false;\n }\n }\n\n private async _onSave(): Promise<void> {\n this._saving = true;\n this._error = '';\n this._saved = false;\n try {\n await this._api.updateThrottleSettings(this._form as unknown as Record<string, unknown>);\n this._saved = true;\n this.dispatchEvent(\n new CustomEvent('alx-throttle-saved', {\n detail: { ...this._form },\n bubbles: true,\n composed: true,\n }),\n );\n setTimeout(() => {\n this._saved = false;\n }, 3000);\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to save throttle settings';\n } finally {\n this._saving = false;\n }\n }\n\n override render() {\n if (this._loading) {\n return html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`;\n }\n\n return html`\n <div class=\"alx-card\">\n <div class=\"alx-card-header\">\n <h3>Throttle Settings</h3>\n </div>\n\n ${this._error ? html`<div class=\"alx-error\">${this._error}</div>` : nothing}\n\n <div class=\"form-grid\">\n <div class=\"form-group\">\n <label>Max Per User Per Day</label>\n <input\n type=\"number\"\n .value=${String(this._form.maxPerUserPerDay)}\n @input=${(e: Event) =>\n (this._form = {\n ...this._form,\n maxPerUserPerDay: Number((e.target as HTMLInputElement).value),\n })}\n min=\"1\"\n />\n <span class=\"hint\">Maximum emails sent to one user in a single day</span>\n </div>\n\n <div class=\"form-group\">\n <label>Max Per User Per Week</label>\n <input\n type=\"number\"\n .value=${String(this._form.maxPerUserPerWeek)}\n @input=${(e: Event) =>\n (this._form = {\n ...this._form,\n maxPerUserPerWeek: Number((e.target as HTMLInputElement).value),\n })}\n min=\"1\"\n />\n <span class=\"hint\">Maximum emails sent to one user in a 7-day window</span>\n </div>\n\n <div class=\"form-group\">\n <label>Min Gap Days</label>\n <input\n type=\"number\"\n .value=${String(this._form.minGapDays)}\n @input=${(e: Event) =>\n (this._form = {\n ...this._form,\n minGapDays: Number((e.target as HTMLInputElement).value),\n })}\n min=\"0\"\n />\n <span class=\"hint\">Minimum days between consecutive emails to the same user</span>\n </div>\n </div>\n\n <div class=\"actions\">\n <button\n class=\"alx-btn-primary\"\n ?disabled=${this._saving}\n @click=${this._onSave}\n >\n ${this._saving ? 'Saving...' : 'Save Settings'}\n </button>\n ${this._saved\n ? html`<span style=\"color: var(--alx-success); align-self: center; font-size: 0.875rem\"\n >Settings saved</span\n >`\n : nothing}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-throttle-settings': AlxThrottleSettings;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxCardStyles,\n} from '../../styles/shared.js';\n\ninterface GuideSection {\n title: string;\n content: string;\n}\n\nconst GUIDE_SECTIONS: GuideSection[] = [\n {\n title: 'Getting Started',\n content: `The Rule Engine automates email sending based on configurable rules and templates.\n\n<strong>Setup flow:</strong>\n1. Create email templates with MJML/Handlebars markup\n2. Define rules that match target users using conditions\n3. Configure throttle settings to control send frequency\n4. Activate rules and monitor via run history\n\nTemplates use Handlebars variables (e.g. <code>{{firstName}}</code>) that are populated at send time from your user data.`,\n },\n {\n title: 'Templates',\n content: `Templates define the email content sent by rules.\n\n<strong>Fields:</strong>\n- <strong>Name/Slug:</strong> Human-readable name and unique identifier\n- <strong>Category:</strong> Groups templates (e.g. marketing, transactional, onboarding)\n- <strong>Audience:</strong> Target audience type (e.g. clients, therapists, leads)\n- <strong>Platform:</strong> Which platform this template belongs to\n- <strong>Subject:</strong> Email subject line (supports Handlebars variables)\n- <strong>Body:</strong> MJML markup with Handlebars variables for dynamic content\n- <strong>Text Body:</strong> Plain text fallback for email clients that don't render HTML\n- <strong>Variables:</strong> List of variable names used in the template\n\nUse the <strong>Preview</strong> button to see rendered HTML before saving.`,\n },\n {\n title: 'Rules',\n content: `Rules define <em>who</em> gets <em>which</em> template and <em>when</em>.\n\n<strong>Target Conditions:</strong>\nEach rule has conditions that filter eligible recipients. Conditions use field paths, operators, and values:\n- <code>status equals active</code>\n- <code>createdAt gt 2024-01-01</code>\n- <code>tags contains vip</code>\n\n<strong>Behavior settings:</strong>\n- <strong>Send Once:</strong> Only send to each user once per rule\n- <strong>Resend After Days:</strong> Re-send after N days (null = never)\n- <strong>Max Per Run:</strong> Cap how many emails one rule execution can send\n- <strong>Auto Approve:</strong> Send immediately vs. queue for manual approval\n- <strong>Email Type:</strong> Marketing or transactional (affects unsubscribe handling)\n- <strong>Bypass Throttle:</strong> Skip global throttle limits (use sparingly)\n\nUse <strong>Dry Run</strong> to see which users would be matched without actually sending.`,\n },\n {\n title: 'Throttling',\n content: `Throttle settings prevent email fatigue by limiting how often any single user receives emails.\n\n<strong>Settings:</strong>\n- <strong>Max Per User Per Day:</strong> Hard cap on daily emails to one recipient\n- <strong>Max Per User Per Week:</strong> Rolling 7-day window limit\n- <strong>Min Gap Days:</strong> Minimum days between consecutive sends to the same user\n\nThese apply globally across all rules. Individual rules can bypass throttling via the <code>bypassThrottle</code> flag (recommended only for critical transactional emails).`,\n },\n {\n title: 'Hooks',\n content: `The rule engine emits lifecycle hooks that your application can listen to:\n\n- <strong>onSend:</strong> Fires after each email is sent (or fails). Statuses: <code>sent</code>, <code>error</code>, <code>skipped</code>, <code>invalid</code>, <code>throttled</code>\n- <strong>onRunComplete:</strong> Fires after a full rule execution cycle with aggregate stats\n\nUse hooks to integrate with your own analytics, logging, or alerting systems.\n\n<strong>Example:</strong>\n<code>ruleEngine.on('send', (event) => { analytics.record(event); });</code>`,\n },\n];\n\n@customElement('alx-guide-panel')\nexport class AlxGuidePanel extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxResetStyles,\n alxTypographyStyles,\n alxButtonStyles,\n alxCardStyles,\n css`\n .toggle-btn {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n background: var(--alx-surface);\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n padding: 0.5rem 1rem;\n color: var(--alx-text);\n cursor: pointer;\n font-size: 0.875rem;\n width: 100%;\n text-align: left;\n }\n\n .toggle-btn:hover {\n border-color: var(--alx-primary);\n }\n\n .panel {\n margin-top: 0.5rem;\n }\n\n .section {\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n margin-bottom: 0.5rem;\n overflow: hidden;\n }\n\n .section-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.625rem 0.75rem;\n background: var(--alx-surface);\n cursor: pointer;\n font-weight: 600;\n font-size: 0.875rem;\n color: var(--alx-text);\n border: none;\n width: 100%;\n text-align: left;\n }\n\n .section-header:hover {\n background: color-mix(in srgb, var(--alx-primary) 8%, var(--alx-surface));\n }\n\n .expand-icon {\n display: inline-block;\n transition: transform 0.2s;\n font-size: 0.7rem;\n }\n\n .expand-icon.open {\n transform: rotate(90deg);\n }\n\n .section-body {\n padding: 0.75rem 1rem;\n font-size: 0.85rem;\n line-height: 1.7;\n color: var(--alx-text);\n border-top: 1px solid var(--alx-border);\n }\n\n .section-body code {\n background: color-mix(in srgb, var(--alx-primary) 12%, transparent);\n color: var(--alx-primary);\n padding: 0.1rem 0.35rem;\n border-radius: 3px;\n font-family: 'Fira Code', 'Cascadia Code', monospace;\n font-size: 0.8rem;\n }\n `,\n ];\n\n @state() private _visible = false;\n @state() private _openSections = new Set<number>();\n\n private _togglePanel(): void {\n this._visible = !this._visible;\n }\n\n private _toggleSection(index: number): void {\n const next = new Set(this._openSections);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n this._openSections = next;\n }\n\n override render() {\n return html`\n <div>\n <button class=\"toggle-btn\" @click=${this._togglePanel}>\n <span class=\"expand-icon ${this._visible ? 'open' : ''}\">&#9654;</span>\n Rule Engine Guide\n </button>\n\n ${this._visible\n ? html`\n <div class=\"panel\">\n ${GUIDE_SECTIONS.map(\n (section, i) => html`\n <div class=\"section\">\n <button class=\"section-header\" @click=${() => this._toggleSection(i)}>\n <span\n class=\"expand-icon ${this._openSections.has(i) ? 'open' : ''}\"\n >&#9654;</span\n >\n ${section.title}\n </button>\n ${this._openSections.has(i)\n ? html`<div class=\"section-body\">${unsafeHTML(section.content)}</div>`\n : ''}\n </div>\n `,\n )}\n </div>\n `\n : ''}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-guide-panel': AlxGuidePanel;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxCardStyles,\n alxLoadingStyles,\n alxTypographyStyles,\n} from '../../styles/shared.js';\nimport { AnalyticsAPI } from '../../api/analytics.api.js';\n\ninterface OverviewMetric {\n key: string;\n label: string;\n count: number;\n percentage: number;\n color: 'success' | 'danger' | 'info' | 'muted';\n}\n\n@customElement('alx-analytics-overview')\nexport class AlxAnalyticsOverview extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxCardStyles,\n alxLoadingStyles,\n alxTypographyStyles,\n css`\n .metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 1rem;\n }\n\n .metric-card {\n background: var(--alx-surface);\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n padding: 1.25rem;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .metric-card .label {\n font-size: 0.8rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--alx-text-muted);\n }\n\n .metric-card .count {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1.2;\n }\n\n .metric-card .percentage {\n font-size: 0.85rem;\n }\n\n .color-success .count,\n .color-success .percentage {\n color: var(--alx-success);\n }\n\n .color-danger .count,\n .color-danger .percentage {\n color: var(--alx-danger);\n }\n\n .color-info .count,\n .color-info .percentage {\n color: var(--alx-info);\n }\n\n .color-muted .count,\n .color-muted .percentage {\n color: var(--alx-text);\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n }\n `,\n ];\n\n @property({ attribute: 'date-from' }) dateFrom = '';\n @property({ attribute: 'date-to' }) dateTo = '';\n\n @state() private _loading = false;\n @state() private _error = '';\n @state() private _metrics: OverviewMetric[] = [];\n\n private __api?: AnalyticsAPI;\n private get _api(): AnalyticsAPI {\n if (!this.__api) this.__api = new AnalyticsAPI();\n return this.__api;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._loadData();\n }\n\n override updated(changed: Map<string, unknown>) {\n if (changed.has('dateFrom') || changed.has('dateTo')) {\n if (changed.has('dateFrom') && changed.get('dateFrom') !== undefined) {\n this._loadData();\n } else if (changed.has('dateTo') && changed.get('dateTo') !== undefined) {\n this._loadData();\n }\n }\n }\n\n private _getDefaultRange() {\n const to = new Date();\n const from = new Date();\n from.setDate(from.getDate() - 30);\n return {\n from: this.dateFrom || from.toISOString().split('T')[0],\n to: this.dateTo || to.toISOString().split('T')[0],\n };\n }\n\n private async _loadData() {\n this._loading = true;\n this._error = '';\n try {\n const range = this._getDefaultRange();\n const data = await this._api.getOverview({ from: range.from, to: range.to }) as Record<string, number>;\n this._buildMetrics(data);\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to load analytics overview';\n } finally {\n this._loading = false;\n }\n }\n\n private _buildMetrics(data: Record<string, number>) {\n const sent = data['sent'] ?? 0;\n const pct = (val: number) => (sent > 0 ? Math.round((val / sent) * 1000) / 10 : 0);\n\n const defs: Array<{ key: string; label: string; color: OverviewMetric['color'] }> = [\n { key: 'sent', label: 'Total Sent', color: 'muted' },\n { key: 'delivered', label: 'Delivered', color: 'success' },\n { key: 'failed', label: 'Failed', color: 'danger' },\n { key: 'bounced', label: 'Bounced', color: 'danger' },\n { key: 'complained', label: 'Complained', color: 'danger' },\n { key: 'opened', label: 'Opened', color: 'info' },\n { key: 'clicked', label: 'Clicked', color: 'info' },\n { key: 'unsubscribed', label: 'Unsubscribed', color: 'danger' },\n ];\n\n this._metrics = defs.map((d) => ({\n ...d,\n count: data[d.key] ?? 0,\n percentage: d.key === 'sent' ? 100 : pct(data[d.key] ?? 0),\n }));\n }\n\n private _formatCount(n: number): string {\n if (n >= 1_000_000) return (n / 1_000_000).toFixed(1) + 'M';\n if (n >= 1_000) return (n / 1_000).toFixed(1) + 'K';\n return String(n);\n }\n\n override render() {\n if (this._loading) {\n return html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`;\n }\n\n if (this._error) {\n return html`<div class=\"alx-error\">${this._error}</div>`;\n }\n\n if (this._metrics.length === 0) {\n return html`<div class=\"alx-empty\">No analytics data available for the selected period.</div>`;\n }\n\n return html`\n <div class=\"header\">\n <h3>Analytics Overview</h3>\n </div>\n <div class=\"metrics-grid\">\n ${this._metrics.map(\n (m) => html`\n <div class=\"metric-card color-${m.color}\">\n <span class=\"label\">${m.label}</span>\n <span class=\"count\">${this._formatCount(m.count)}</span>\n <span class=\"percentage\">${m.percentage}%</span>\n </div>\n `,\n )}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-analytics-overview': AlxAnalyticsOverview;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport { alxLoadingStyles, alxTypographyStyles } from '../../styles/shared.js';\nimport { AnalyticsAPI } from '../../api/analytics.api.js';\n\ninterface TimelineEntry {\n date: string;\n count: number;\n}\n\n@customElement('alx-analytics-timeline')\nexport class AlxAnalyticsTimeline extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxLoadingStyles,\n alxTypographyStyles,\n css`\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n }\n\n .chart-container {\n background: var(--alx-surface);\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n padding: 1.25rem;\n }\n\n .chart {\n display: flex;\n align-items: flex-end;\n gap: 2px;\n height: 200px;\n padding-top: 1rem;\n }\n\n .bar-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n justify-content: flex-end;\n position: relative;\n min-width: 0;\n }\n\n .bar {\n width: 100%;\n max-width: 40px;\n background: var(--alx-info);\n border-radius: 2px 2px 0 0;\n min-height: 2px;\n transition: background 0.15s;\n position: relative;\n cursor: pointer;\n }\n\n .bar:hover {\n background: var(--alx-primary);\n }\n\n .tooltip {\n display: none;\n position: absolute;\n bottom: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n background: var(--alx-bg);\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n padding: 0.35rem 0.5rem;\n font-size: 0.75rem;\n white-space: nowrap;\n color: var(--alx-text);\n z-index: 10;\n pointer-events: none;\n }\n\n .bar:hover .tooltip {\n display: block;\n }\n\n .x-axis {\n display: flex;\n gap: 2px;\n margin-top: 0.5rem;\n overflow: hidden;\n }\n\n .x-axis .x-label {\n flex: 1;\n text-align: center;\n font-size: 0.65rem;\n color: var(--alx-text-muted);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .y-axis-label {\n font-size: 0.75rem;\n color: var(--alx-text-muted);\n margin-bottom: 0.25rem;\n }\n `,\n ];\n\n @property({ attribute: 'date-from' }) dateFrom = '';\n @property({ attribute: 'date-to' }) dateTo = '';\n @property() interval: 'daily' | 'weekly' | 'monthly' = 'daily';\n\n @state() private _loading = false;\n @state() private _error = '';\n @state() private _entries: TimelineEntry[] = [];\n\n private __api?: AnalyticsAPI;\n private get _api(): AnalyticsAPI {\n if (!this.__api) this.__api = new AnalyticsAPI();\n return this.__api;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._loadData();\n }\n\n override updated(changed: Map<string, unknown>) {\n const watchKeys = ['dateFrom', 'dateTo', 'interval'];\n for (const key of watchKeys) {\n if (changed.has(key) && changed.get(key) !== undefined) {\n this._loadData();\n return;\n }\n }\n }\n\n private _getDefaultRange() {\n const to = new Date();\n const from = new Date();\n from.setDate(from.getDate() - 30);\n return {\n from: this.dateFrom || from.toISOString().split('T')[0],\n to: this.dateTo || to.toISOString().split('T')[0],\n };\n }\n\n private async _loadData() {\n this._loading = true;\n this._error = '';\n try {\n const range = this._getDefaultRange();\n const data = await this._api.getTimeline({\n from: range.from,\n to: range.to,\n interval: this.interval,\n }) as TimelineEntry[];\n this._entries = Array.isArray(data) ? data : [];\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to load timeline data';\n } finally {\n this._loading = false;\n }\n }\n\n private _formatDate(dateStr: string): string {\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n } catch {\n return dateStr;\n }\n }\n\n override render() {\n if (this._loading) {\n return html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`;\n }\n\n if (this._error) {\n return html`<div class=\"alx-error\">${this._error}</div>`;\n }\n\n if (this._entries.length === 0) {\n return html`<div class=\"alx-empty\">No timeline data available for the selected period.</div>`;\n }\n\n const maxValue = Math.max(...this._entries.map((e) => e.count), 1);\n const showEveryNth = this._entries.length > 15 ? Math.ceil(this._entries.length / 15) : 1;\n\n return html`\n <div class=\"header\">\n <h3>Send Volume</h3>\n </div>\n <div class=\"chart-container\">\n <div class=\"y-axis-label\">Max: ${maxValue.toLocaleString()}</div>\n <div class=\"chart\">\n ${this._entries.map(\n (entry) => html`\n <div class=\"bar-wrapper\">\n <div\n class=\"bar\"\n style=\"height: ${(entry.count / maxValue) * 100}%\"\n >\n <span class=\"tooltip\">${this._formatDate(entry.date)}: ${entry.count.toLocaleString()}</span>\n </div>\n </div>\n `,\n )}\n </div>\n <div class=\"x-axis\">\n ${this._entries.map(\n (entry, i) => html`\n <span class=\"x-label\">\n ${i % showEveryNth === 0 ? this._formatDate(entry.date) : ''}\n </span>\n `,\n )}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-analytics-timeline': AlxAnalyticsTimeline;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxLoadingStyles,\n alxTableStyles,\n alxTypographyStyles,\n} from '../../styles/shared.js';\nimport { AnalyticsAPI } from '../../api/analytics.api.js';\n\ninterface AccountStat {\n accountId: string;\n email: string;\n sent: number;\n delivered: number;\n bounced: number;\n failed: number;\n deliveryRate: number;\n}\n\ntype SortKey = 'email' | 'sent' | 'delivered' | 'bounced' | 'failed' | 'deliveryRate';\n\n@customElement('alx-analytics-accounts')\nexport class AlxAnalyticsAccounts extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxTableStyles,\n alxLoadingStyles,\n alxTypographyStyles,\n css`\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n }\n\n .table-wrapper {\n background: var(--alx-surface);\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n overflow-x: auto;\n }\n\n th {\n cursor: pointer;\n user-select: none;\n }\n\n th:hover {\n color: var(--alx-primary);\n }\n\n .sort-indicator {\n margin-left: 0.25rem;\n font-size: 0.7rem;\n }\n\n .rate-good { color: var(--alx-success); }\n .rate-warn { color: var(--alx-warning); }\n .rate-bad { color: var(--alx-danger); }\n `,\n ];\n\n @property({ attribute: 'date-from' }) dateFrom = '';\n @property({ attribute: 'date-to' }) dateTo = '';\n\n @state() private _loading = false;\n @state() private _error = '';\n @state() private _accounts: AccountStat[] = [];\n @state() private _sortKey: SortKey = 'sent';\n @state() private _sortAsc = false;\n\n private __api?: AnalyticsAPI;\n private get _api(): AnalyticsAPI {\n if (!this.__api) this.__api = new AnalyticsAPI();\n return this.__api;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._loadData();\n }\n\n override updated(changed: Map<string, unknown>) {\n if (changed.has('dateFrom') || changed.has('dateTo')) {\n if (changed.has('dateFrom') && changed.get('dateFrom') !== undefined) {\n this._loadData();\n } else if (changed.has('dateTo') && changed.get('dateTo') !== undefined) {\n this._loadData();\n }\n }\n }\n\n private _getDefaultRange() {\n const to = new Date();\n const from = new Date();\n from.setDate(from.getDate() - 30);\n return {\n from: this.dateFrom || from.toISOString().split('T')[0],\n to: this.dateTo || to.toISOString().split('T')[0],\n };\n }\n\n private async _loadData() {\n this._loading = true;\n this._error = '';\n try {\n const range = this._getDefaultRange();\n const data = await this._api.getAccountStats({ from: range.from, to: range.to }) as AccountStat[];\n this._accounts = (Array.isArray(data) ? data : []).map((a) => ({\n ...a,\n deliveryRate: a.sent > 0 ? Math.round((a.delivered / a.sent) * 1000) / 10 : 0,\n }));\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to load account stats';\n } finally {\n this._loading = false;\n }\n }\n\n private _sort(key: SortKey) {\n if (this._sortKey === key) {\n this._sortAsc = !this._sortAsc;\n } else {\n this._sortKey = key;\n this._sortAsc = key === 'email';\n }\n }\n\n private get _sortedAccounts(): AccountStat[] {\n const sorted = [...this._accounts].sort((a, b) => {\n const aVal = a[this._sortKey];\n const bVal = b[this._sortKey];\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n return aVal.localeCompare(bVal);\n }\n return (aVal as number) - (bVal as number);\n });\n return this._sortAsc ? sorted : sorted.reverse();\n }\n\n private _sortIndicator(key: SortKey) {\n if (this._sortKey !== key) return '';\n return this._sortAsc ? '\\u25B2' : '\\u25BC';\n }\n\n private _rateClass(rate: number): string {\n if (rate >= 95) return 'rate-good';\n if (rate >= 90) return 'rate-warn';\n return 'rate-bad';\n }\n\n override render() {\n if (this._loading) {\n return html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`;\n }\n\n if (this._error) {\n return html`<div class=\"alx-error\">${this._error}</div>`;\n }\n\n if (this._accounts.length === 0) {\n return html`<div class=\"alx-empty\">No account stats available for the selected period.</div>`;\n }\n\n const cols: Array<{ key: SortKey; label: string }> = [\n { key: 'email', label: 'Account' },\n { key: 'sent', label: 'Sent' },\n { key: 'delivered', label: 'Delivered' },\n { key: 'bounced', label: 'Bounced' },\n { key: 'failed', label: 'Failed' },\n { key: 'deliveryRate', label: 'Delivery Rate' },\n ];\n\n return html`\n <div class=\"header\">\n <h3>Account Performance</h3>\n </div>\n <div class=\"table-wrapper\">\n <table>\n <thead>\n <tr>\n ${cols.map(\n (c) => html`\n <th @click=${() => this._sort(c.key)}>\n ${c.label}\n <span class=\"sort-indicator\">${this._sortIndicator(c.key)}</span>\n </th>\n `,\n )}\n </tr>\n </thead>\n <tbody>\n ${this._sortedAccounts.map(\n (a) => html`\n <tr>\n <td>${a.email || a.accountId}</td>\n <td>${a.sent.toLocaleString()}</td>\n <td>${a.delivered.toLocaleString()}</td>\n <td>${a.bounced.toLocaleString()}</td>\n <td>${a.failed.toLocaleString()}</td>\n <td class=\"${this._rateClass(a.deliveryRate)}\">${a.deliveryRate}%</td>\n </tr>\n `,\n )}\n </tbody>\n </table>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-analytics-accounts': AlxAnalyticsAccounts;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxLoadingStyles,\n alxTableStyles,\n alxTypographyStyles,\n} from '../../styles/shared.js';\nimport { AnalyticsAPI } from '../../api/analytics.api.js';\n\ninterface RuleStat {\n ruleId: string;\n name: string;\n sent: number;\n delivered: number;\n bounced: number;\n failed: number;\n skipped: number;\n errorRate: number;\n}\n\ntype SortKey = 'name' | 'sent' | 'delivered' | 'bounced' | 'failed' | 'skipped' | 'errorRate';\n\n@customElement('alx-analytics-rules')\nexport class AlxAnalyticsRules extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxTableStyles,\n alxLoadingStyles,\n alxTypographyStyles,\n css`\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n }\n\n .table-wrapper {\n background: var(--alx-surface);\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n overflow-x: auto;\n }\n\n th {\n cursor: pointer;\n user-select: none;\n }\n\n th:hover {\n color: var(--alx-primary);\n }\n\n .sort-indicator {\n margin-left: 0.25rem;\n font-size: 0.7rem;\n }\n\n .error-rate-high {\n color: var(--alx-danger);\n font-weight: 600;\n }\n\n .error-rate-low {\n color: var(--alx-success);\n }\n `,\n ];\n\n @property({ attribute: 'date-from' }) dateFrom = '';\n @property({ attribute: 'date-to' }) dateTo = '';\n\n @state() private _loading = false;\n @state() private _error = '';\n @state() private _rules: RuleStat[] = [];\n @state() private _sortKey: SortKey = 'sent';\n @state() private _sortAsc = false;\n\n private __api?: AnalyticsAPI;\n private get _api(): AnalyticsAPI {\n if (!this.__api) this.__api = new AnalyticsAPI();\n return this.__api;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._loadData();\n }\n\n override updated(changed: Map<string, unknown>) {\n if (changed.has('dateFrom') || changed.has('dateTo')) {\n if (changed.has('dateFrom') && changed.get('dateFrom') !== undefined) {\n this._loadData();\n } else if (changed.has('dateTo') && changed.get('dateTo') !== undefined) {\n this._loadData();\n }\n }\n }\n\n private _getDefaultRange() {\n const to = new Date();\n const from = new Date();\n from.setDate(from.getDate() - 30);\n return {\n from: this.dateFrom || from.toISOString().split('T')[0],\n to: this.dateTo || to.toISOString().split('T')[0],\n };\n }\n\n private async _loadData() {\n this._loading = true;\n this._error = '';\n try {\n const range = this._getDefaultRange();\n const data = await this._api.getRuleStats({ from: range.from, to: range.to }) as RuleStat[];\n this._rules = (Array.isArray(data) ? data : []).map((r) => ({\n ...r,\n errorRate: r.sent > 0\n ? Math.round(((r.bounced + r.failed) / r.sent) * 1000) / 10\n : 0,\n }));\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to load rule stats';\n } finally {\n this._loading = false;\n }\n }\n\n private _sort(key: SortKey) {\n if (this._sortKey === key) {\n this._sortAsc = !this._sortAsc;\n } else {\n this._sortKey = key;\n this._sortAsc = key === 'name';\n }\n }\n\n private get _sortedRules(): RuleStat[] {\n const sorted = [...this._rules].sort((a, b) => {\n const aVal = a[this._sortKey];\n const bVal = b[this._sortKey];\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n return aVal.localeCompare(bVal);\n }\n return (aVal as number) - (bVal as number);\n });\n return this._sortAsc ? sorted : sorted.reverse();\n }\n\n private _sortIndicator(key: SortKey) {\n if (this._sortKey !== key) return '';\n return this._sortAsc ? '\\u25B2' : '\\u25BC';\n }\n\n override render() {\n if (this._loading) {\n return html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`;\n }\n\n if (this._error) {\n return html`<div class=\"alx-error\">${this._error}</div>`;\n }\n\n if (this._rules.length === 0) {\n return html`<div class=\"alx-empty\">No rule stats available for the selected period.</div>`;\n }\n\n const cols: Array<{ key: SortKey; label: string }> = [\n { key: 'name', label: 'Rule' },\n { key: 'sent', label: 'Sent' },\n { key: 'delivered', label: 'Delivered' },\n { key: 'bounced', label: 'Bounced' },\n { key: 'failed', label: 'Failed' },\n { key: 'skipped', label: 'Skipped' },\n { key: 'errorRate', label: 'Error Rate' },\n ];\n\n return html`\n <div class=\"header\">\n <h3>Rule Performance</h3>\n </div>\n <div class=\"table-wrapper\">\n <table>\n <thead>\n <tr>\n ${cols.map(\n (c) => html`\n <th @click=${() => this._sort(c.key)}>\n ${c.label}\n <span class=\"sort-indicator\">${this._sortIndicator(c.key)}</span>\n </th>\n `,\n )}\n </tr>\n </thead>\n <tbody>\n ${this._sortedRules.map(\n (r) => html`\n <tr>\n <td>${r.name || r.ruleId}</td>\n <td>${r.sent.toLocaleString()}</td>\n <td>${r.delivered.toLocaleString()}</td>\n <td>${r.bounced.toLocaleString()}</td>\n <td>${r.failed.toLocaleString()}</td>\n <td>${r.skipped.toLocaleString()}</td>\n <td class=\"${r.errorRate > 5 ? 'error-rate-high' : 'error-rate-low'}\">\n ${r.errorRate}%\n </td>\n </tr>\n `,\n )}\n </tbody>\n </table>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-analytics-rules': AlxAnalyticsRules;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { alxBaseStyles } from '../../styles/theme.js';\nimport {\n alxCardStyles,\n alxLoadingStyles,\n alxTypographyStyles,\n} from '../../styles/shared.js';\nimport { AnalyticsAPI } from '../../api/analytics.api.js';\n\ninterface EngagementData {\n sent: number;\n opened: number;\n clicked: number;\n unsubscribed: number;\n}\n\n@customElement('alx-analytics-engagement')\nexport class AlxAnalyticsEngagement extends LitElement {\n static override styles = [\n alxBaseStyles,\n alxCardStyles,\n alxLoadingStyles,\n alxTypographyStyles,\n css`\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n }\n\n .metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 1rem;\n }\n\n .metric-card {\n background: var(--alx-surface);\n border: 1px solid var(--alx-border);\n border-radius: var(--alx-radius);\n padding: 1.25rem;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .metric-card .label {\n font-size: 0.8rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--alx-text-muted);\n }\n\n .metric-card .rate {\n font-size: 2rem;\n font-weight: 700;\n line-height: 1.2;\n color: var(--alx-info);\n }\n\n .metric-card .detail {\n font-size: 0.8rem;\n color: var(--alx-text-muted);\n }\n\n .rate-unsub {\n color: var(--alx-warning) !important;\n }\n\n .info-banner {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n background: color-mix(in srgb, var(--alx-info) 10%, transparent);\n border: 1px solid color-mix(in srgb, var(--alx-info) 30%, transparent);\n border-radius: var(--alx-radius);\n color: var(--alx-info);\n font-size: 0.85rem;\n margin-bottom: 1rem;\n }\n\n .info-icon {\n font-weight: 700;\n flex-shrink: 0;\n }\n `,\n ];\n\n @property({ attribute: 'date-from' }) dateFrom = '';\n @property({ attribute: 'date-to' }) dateTo = '';\n\n @state() private _loading = false;\n @state() private _error = '';\n @state() private _data: EngagementData | null = null;\n @state() private _showSesNote = false;\n\n private __api?: AnalyticsAPI;\n private get _api(): AnalyticsAPI {\n if (!this.__api) this.__api = new AnalyticsAPI();\n return this.__api;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._loadData();\n }\n\n override updated(changed: Map<string, unknown>) {\n if (changed.has('dateFrom') || changed.has('dateTo')) {\n if (changed.has('dateFrom') && changed.get('dateFrom') !== undefined) {\n this._loadData();\n } else if (changed.has('dateTo') && changed.get('dateTo') !== undefined) {\n this._loadData();\n }\n }\n }\n\n private _getDefaultRange() {\n const to = new Date();\n const from = new Date();\n from.setDate(from.getDate() - 30);\n return {\n from: this.dateFrom || from.toISOString().split('T')[0],\n to: this.dateTo || to.toISOString().split('T')[0],\n };\n }\n\n private async _loadData() {\n this._loading = true;\n this._error = '';\n try {\n const range = this._getDefaultRange();\n const data = await this._api.getOverview({ from: range.from, to: range.to }) as EngagementData;\n this._data = data;\n this._showSesNote = (data.opened ?? 0) === 0 && (data.clicked ?? 0) === 0 && (data.sent ?? 0) > 0;\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to load engagement data';\n } finally {\n this._loading = false;\n }\n }\n\n private _pct(numerator: number, denominator: number): string {\n if (denominator === 0) return '0.0';\n return (Math.round((numerator / denominator) * 1000) / 10).toFixed(1);\n }\n\n override render() {\n if (this._loading) {\n return html`<div class=\"alx-loading\"><div class=\"alx-spinner\"></div></div>`;\n }\n\n if (this._error) {\n return html`<div class=\"alx-error\">${this._error}</div>`;\n }\n\n if (!this._data) {\n return html`<div class=\"alx-empty\">No engagement data available for the selected period.</div>`;\n }\n\n const d = this._data;\n const sent = d.sent ?? 0;\n const opened = d.opened ?? 0;\n const clicked = d.clicked ?? 0;\n const unsubscribed = d.unsubscribed ?? 0;\n\n const openRate = this._pct(opened, sent);\n const clickRate = this._pct(clicked, sent);\n const unsubRate = this._pct(unsubscribed, sent);\n\n return html`\n <div class=\"header\">\n <h3>Engagement Metrics</h3>\n </div>\n\n ${this._showSesNote\n ? html`\n <div class=\"info-banner\">\n <span class=\"info-icon\">i</span>\n <span>\n Open and click tracking data is only available for SES accounts with tracking enabled.\n Gmail/SMTP accounts do not report engagement metrics.\n </span>\n </div>\n `\n : ''}\n\n <div class=\"metrics-grid\">\n <div class=\"metric-card\">\n <span class=\"label\">Open Rate</span>\n <span class=\"rate\">${openRate}%</span>\n <span class=\"detail\">${opened.toLocaleString()} of ${sent.toLocaleString()} sent</span>\n </div>\n\n <div class=\"metric-card\">\n <span class=\"label\">Click Rate</span>\n <span class=\"rate\">${clickRate}%</span>\n <span class=\"detail\">${clicked.toLocaleString()} of ${sent.toLocaleString()} sent</span>\n </div>\n\n <div class=\"metric-card\">\n <span class=\"label\">Unsubscribe Rate</span>\n <span class=\"rate rate-unsub\">${unsubRate}%</span>\n <span class=\"detail\">${unsubscribed.toLocaleString()} of ${sent.toLocaleString()} sent</span>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'alx-analytics-engagement': AlxAnalyticsEngagement;\n }\n}\n"],"names":["__decorateClass","e","b","c"],"mappings":"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"}