@serve.zone/catalog 2.0.1 → 2.2.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,929 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { DeesElement, customElement, html, css, cssManager, property, } from '@design.estate/dees-element';
36
+ let SzMtaDetailView = (() => {
37
+ let _classDecorators = [customElement('sz-mta-detail-view')];
38
+ let _classDescriptor;
39
+ let _classExtraInitializers = [];
40
+ let _classThis;
41
+ let _classSuper = DeesElement;
42
+ let _email_decorators;
43
+ let _email_initializers = [];
44
+ let _email_extraInitializers = [];
45
+ var SzMtaDetailView = class extends _classSuper {
46
+ static { _classThis = this; }
47
+ static {
48
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
49
+ _email_decorators = [property({ type: Object })];
50
+ __esDecorate(this, null, _email_decorators, { kind: "accessor", name: "email", static: false, private: false, access: { has: obj => "email" in obj, get: obj => obj.email, set: (obj, value) => { obj.email = value; } }, metadata: _metadata }, _email_initializers, _email_extraInitializers);
51
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
52
+ SzMtaDetailView = _classThis = _classDescriptor.value;
53
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
54
+ }
55
+ static demo = () => html `
56
+ <div style="padding: 24px; max-width: 1200px;">
57
+ <sz-mta-detail-view
58
+ .email=${{
59
+ id: '1',
60
+ direction: 'outbound',
61
+ status: 'delivered',
62
+ from: 'noreply@serve.zone',
63
+ to: 'user@example.com',
64
+ toList: ['user@example.com'],
65
+ subject: 'Welcome to serve.zone',
66
+ timestamp: '2024-01-15 14:30:22',
67
+ messageId: '<abc123@serve.zone>',
68
+ size: '12.4 KB',
69
+ smtpLog: [
70
+ { timestamp: '14:30:20', direction: 'client', command: 'EHLO mail.serve.zone' },
71
+ { timestamp: '14:30:20', direction: 'server', command: '250-mail.example.com Hello', responseCode: 250 },
72
+ { timestamp: '14:30:20', direction: 'server', command: '250-STARTTLS', responseCode: 250 },
73
+ { timestamp: '14:30:20', direction: 'server', command: '250 SIZE 52428800', responseCode: 250 },
74
+ { timestamp: '14:30:20', direction: 'client', command: 'STARTTLS' },
75
+ { timestamp: '14:30:21', direction: 'server', command: '220 Ready to start TLS', responseCode: 220 },
76
+ { timestamp: '14:30:21', direction: 'client', command: 'EHLO mail.serve.zone' },
77
+ { timestamp: '14:30:21', direction: 'server', command: '250-mail.example.com Hello', responseCode: 250 },
78
+ { timestamp: '14:30:21', direction: 'server', command: '250-AUTH PLAIN LOGIN', responseCode: 250 },
79
+ { timestamp: '14:30:21', direction: 'server', command: '250 SIZE 52428800', responseCode: 250 },
80
+ { timestamp: '14:30:21', direction: 'client', command: 'AUTH PLAIN AHVzZXIAcGFzc3dvcmQ=' },
81
+ { timestamp: '14:30:21', direction: 'server', command: '235 2.7.0 Authentication successful', responseCode: 235 },
82
+ { timestamp: '14:30:21', direction: 'client', command: 'MAIL FROM:<noreply@serve.zone>' },
83
+ { timestamp: '14:30:21', direction: 'server', command: '250 OK', responseCode: 250 },
84
+ { timestamp: '14:30:21', direction: 'client', command: 'RCPT TO:<user@example.com>' },
85
+ { timestamp: '14:30:21', direction: 'server', command: '250 Accepted', responseCode: 250 },
86
+ { timestamp: '14:30:22', direction: 'client', command: 'DATA' },
87
+ { timestamp: '14:30:22', direction: 'server', command: '354 Enter message, ending with "." on a line by itself', responseCode: 354 },
88
+ { timestamp: '14:30:22', direction: 'client', command: '.' },
89
+ { timestamp: '14:30:22', direction: 'server', command: '250 OK id=1pQ2rS-0003Ab-C4', responseCode: 250 },
90
+ { timestamp: '14:30:22', direction: 'client', command: 'QUIT' },
91
+ { timestamp: '14:30:22', direction: 'server', command: '221 mail.example.com closing connection', responseCode: 221 },
92
+ ],
93
+ connectionInfo: {
94
+ sourceIp: '10.0.1.50',
95
+ sourceHostname: 'mail.serve.zone',
96
+ destinationIp: '93.184.216.34',
97
+ destinationPort: 25,
98
+ tlsVersion: 'TLSv1.3',
99
+ tlsCipher: 'TLS_AES_256_GCM_SHA384',
100
+ authenticated: true,
101
+ authMethod: 'PLAIN',
102
+ authUser: 'noreply@serve.zone',
103
+ },
104
+ authenticationResults: {
105
+ spf: 'pass',
106
+ spfDomain: 'serve.zone',
107
+ dkim: 'pass',
108
+ dkimDomain: 'serve.zone',
109
+ dmarc: 'pass',
110
+ dmarcPolicy: 'reject',
111
+ },
112
+ headers: {
113
+ 'From': 'noreply@serve.zone',
114
+ 'To': 'user@example.com',
115
+ 'Subject': 'Welcome to serve.zone',
116
+ 'Date': 'Mon, 15 Jan 2024 14:30:22 +0000',
117
+ 'MIME-Version': '1.0',
118
+ 'Content-Type': 'text/html; charset=UTF-8',
119
+ },
120
+ body: '<html>\\n<head><title>Welcome</title></head>\\n<body>\\n <h1>Welcome to serve.zone!</h1>\\n <p>Your account has been created successfully.</p>\\n <a href="https://serve.zone/dashboard">Go to Dashboard</a>\\n</body>\\n</html>',
121
+ }}
122
+ ></sz-mta-detail-view>
123
+ </div>
124
+ `;
125
+ static demoGroups = ['MTA'];
126
+ #email_accessor_storage = __runInitializers(this, _email_initializers, null);
127
+ get email() { return this.#email_accessor_storage; }
128
+ set email(value) { this.#email_accessor_storage = value; }
129
+ static styles = [
130
+ cssManager.defaultStyles,
131
+ css `
132
+ :host {
133
+ display: block;
134
+ }
135
+
136
+ .header {
137
+ display: flex;
138
+ align-items: center;
139
+ gap: 16px;
140
+ margin-bottom: 24px;
141
+ }
142
+
143
+ .back-link {
144
+ display: inline-flex;
145
+ align-items: center;
146
+ gap: 6px;
147
+ font-size: 14px;
148
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
149
+ cursor: pointer;
150
+ transition: color 200ms ease;
151
+ }
152
+
153
+ .back-link:hover {
154
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
155
+ }
156
+
157
+ .email-header {
158
+ display: flex;
159
+ align-items: center;
160
+ gap: 12px;
161
+ margin-bottom: 24px;
162
+ }
163
+
164
+ .email-subject {
165
+ font-size: 24px;
166
+ font-weight: 700;
167
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
168
+ margin: 0;
169
+ }
170
+
171
+ .badge-group {
172
+ display: flex;
173
+ gap: 8px;
174
+ }
175
+
176
+ .status-badge {
177
+ display: inline-flex;
178
+ align-items: center;
179
+ padding: 4px 12px;
180
+ border-radius: 9999px;
181
+ font-size: 13px;
182
+ font-weight: 500;
183
+ }
184
+
185
+ .status-badge.delivered {
186
+ background: ${cssManager.bdTheme('#dcfce7', 'rgba(34, 197, 94, 0.2)')};
187
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
188
+ }
189
+
190
+ .status-badge.bounced,
191
+ .status-badge.rejected {
192
+ background: ${cssManager.bdTheme('#fee2e2', 'rgba(239, 68, 68, 0.2)')};
193
+ color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
194
+ }
195
+
196
+ .status-badge.deferred {
197
+ background: ${cssManager.bdTheme('#fef9c3', 'rgba(250, 204, 21, 0.2)')};
198
+ color: ${cssManager.bdTheme('#ca8a04', '#facc15')};
199
+ }
200
+
201
+ .status-badge.pending {
202
+ background: ${cssManager.bdTheme('#dbeafe', 'rgba(59, 130, 246, 0.2)')};
203
+ color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
204
+ }
205
+
206
+ .direction-badge {
207
+ display: inline-flex;
208
+ align-items: center;
209
+ gap: 4px;
210
+ padding: 4px 12px;
211
+ border-radius: 9999px;
212
+ font-size: 13px;
213
+ font-weight: 500;
214
+ }
215
+
216
+ .direction-badge.inbound {
217
+ background: ${cssManager.bdTheme('#dcfce7', 'rgba(34, 197, 94, 0.2)')};
218
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
219
+ }
220
+
221
+ .direction-badge.outbound {
222
+ background: ${cssManager.bdTheme('#dbeafe', 'rgba(59, 130, 246, 0.2)')};
223
+ color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
224
+ }
225
+
226
+ .content {
227
+ display: grid;
228
+ grid-template-columns: 1fr;
229
+ gap: 24px;
230
+ }
231
+
232
+ @media (min-width: 1024px) {
233
+ .content {
234
+ grid-template-columns: 2fr 1fr;
235
+ }
236
+ }
237
+
238
+ .main-content {
239
+ display: flex;
240
+ flex-direction: column;
241
+ gap: 24px;
242
+ }
243
+
244
+ .sidebar {
245
+ display: flex;
246
+ flex-direction: column;
247
+ gap: 24px;
248
+ }
249
+
250
+ .card {
251
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
252
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
253
+ border-radius: 8px;
254
+ overflow: hidden;
255
+ }
256
+
257
+ .card-header {
258
+ display: flex;
259
+ justify-content: space-between;
260
+ align-items: center;
261
+ padding: 16px;
262
+ border-bottom: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
263
+ }
264
+
265
+ .card-title {
266
+ font-size: 16px;
267
+ font-weight: 600;
268
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
269
+ }
270
+
271
+ .card-subtitle {
272
+ font-size: 13px;
273
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
274
+ margin-top: 2px;
275
+ }
276
+
277
+ .card-content {
278
+ padding: 16px;
279
+ }
280
+
281
+ .detail-list {
282
+ display: flex;
283
+ flex-direction: column;
284
+ gap: 12px;
285
+ }
286
+
287
+ .detail-item {
288
+ display: flex;
289
+ justify-content: space-between;
290
+ align-items: flex-start;
291
+ }
292
+
293
+ .detail-label {
294
+ font-size: 14px;
295
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
296
+ flex-shrink: 0;
297
+ }
298
+
299
+ .detail-value {
300
+ font-size: 14px;
301
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
302
+ text-align: right;
303
+ word-break: break-all;
304
+ }
305
+
306
+ .smtp-log-container {
307
+ padding: 16px;
308
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
309
+ font-size: 13px;
310
+ line-height: 1.6;
311
+ max-height: 500px;
312
+ overflow-y: auto;
313
+ background: ${cssManager.bdTheme('#fafafa', '#0a0a0a')};
314
+ display: flex;
315
+ flex-direction: column;
316
+ gap: 8px;
317
+ scrollbar-width: thin;
318
+ scrollbar-color: ${cssManager.bdTheme('#d4d4d8', '#3f3f46')} transparent;
319
+ }
320
+
321
+ .smtp-log-container::-webkit-scrollbar {
322
+ width: 6px;
323
+ }
324
+
325
+ .smtp-log-container::-webkit-scrollbar-track {
326
+ background: transparent;
327
+ }
328
+
329
+ .smtp-log-container::-webkit-scrollbar-thumb {
330
+ background: ${cssManager.bdTheme('#d4d4d8', '#3f3f46')};
331
+ border-radius: 3px;
332
+ }
333
+
334
+ /* Phase separators */
335
+ .smtp-phase-separator {
336
+ display: flex;
337
+ align-items: center;
338
+ gap: 12px;
339
+ padding: 4px 0;
340
+ margin: 4px 0;
341
+ }
342
+
343
+ .smtp-phase-line {
344
+ flex: 1;
345
+ height: 1px;
346
+ background: ${cssManager.bdTheme('#e4e4e7', '#27272a')};
347
+ }
348
+
349
+ .smtp-phase-label {
350
+ font-size: 10px;
351
+ font-weight: 600;
352
+ text-transform: uppercase;
353
+ letter-spacing: 0.5px;
354
+ color: ${cssManager.bdTheme('#a1a1aa', '#52525b')};
355
+ white-space: nowrap;
356
+ }
357
+
358
+ /* Chat bubbles */
359
+ .smtp-bubble {
360
+ border-radius: 8px;
361
+ padding: 10px 14px;
362
+ max-width: 70%;
363
+ }
364
+
365
+ .smtp-bubble.client {
366
+ align-self: flex-start;
367
+ background: ${cssManager.bdTheme('rgba(59, 130, 246, 0.08)', 'rgba(59, 130, 246, 0.12)')};
368
+ border-left: 3px solid ${cssManager.bdTheme('#3b82f6', '#60a5fa')};
369
+ margin-right: auto;
370
+ }
371
+
372
+ .smtp-bubble.server {
373
+ align-self: flex-end;
374
+ background: ${cssManager.bdTheme('rgba(34, 197, 94, 0.06)', 'rgba(34, 197, 94, 0.10)')};
375
+ border-right: 3px solid ${cssManager.bdTheme('#22c55e', '#4ade80')};
376
+ margin-left: auto;
377
+ text-align: right;
378
+ }
379
+
380
+ .smtp-bubble-command {
381
+ white-space: pre-wrap;
382
+ word-break: break-all;
383
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
384
+ }
385
+
386
+ .smtp-bubble-meta {
387
+ display: flex;
388
+ align-items: center;
389
+ gap: 6px;
390
+ margin-top: 4px;
391
+ font-size: 11px;
392
+ color: ${cssManager.bdTheme('#a1a1aa', '#52525b')};
393
+ }
394
+
395
+ .smtp-bubble.server .smtp-bubble-meta {
396
+ justify-content: flex-end;
397
+ }
398
+
399
+ .smtp-direction-tag {
400
+ font-size: 10px;
401
+ font-weight: 600;
402
+ text-transform: uppercase;
403
+ letter-spacing: 0.3px;
404
+ }
405
+
406
+ .smtp-direction-tag.client {
407
+ color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')};
408
+ }
409
+
410
+ .smtp-direction-tag.server {
411
+ color: ${cssManager.bdTheme('#22c55e', '#4ade80')};
412
+ }
413
+
414
+ /* Response code badges */
415
+ .response-code-badge {
416
+ display: inline-block;
417
+ padding: 1px 7px;
418
+ border-radius: 9999px;
419
+ font-size: 11px;
420
+ font-weight: 700;
421
+ margin-bottom: 4px;
422
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
423
+ }
424
+
425
+ .response-code-badge.code-2xx {
426
+ background: ${cssManager.bdTheme('rgba(34, 197, 94, 0.15)', 'rgba(34, 197, 94, 0.25)')};
427
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
428
+ }
429
+
430
+ .response-code-badge.code-3xx {
431
+ background: ${cssManager.bdTheme('rgba(59, 130, 246, 0.15)', 'rgba(59, 130, 246, 0.25)')};
432
+ color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
433
+ }
434
+
435
+ .response-code-badge.code-4xx {
436
+ background: ${cssManager.bdTheme('rgba(250, 204, 21, 0.15)', 'rgba(250, 204, 21, 0.25)')};
437
+ color: ${cssManager.bdTheme('#ca8a04', '#facc15')};
438
+ }
439
+
440
+ .response-code-badge.code-5xx {
441
+ background: ${cssManager.bdTheme('rgba(239, 68, 68, 0.15)', 'rgba(239, 68, 68, 0.25)')};
442
+ color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
443
+ }
444
+
445
+ /* Copy button */
446
+ .smtp-copy-button {
447
+ display: inline-flex;
448
+ align-items: center;
449
+ gap: 6px;
450
+ padding: 6px 12px;
451
+ border-radius: 6px;
452
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
453
+ background: transparent;
454
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
455
+ font-size: 12px;
456
+ font-weight: 500;
457
+ cursor: pointer;
458
+ transition: all 150ms ease;
459
+ }
460
+
461
+ .smtp-copy-button:hover {
462
+ background: ${cssManager.bdTheme('#f4f4f5', '#27272a')};
463
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
464
+ border-color: ${cssManager.bdTheme('#d4d4d8', '#3f3f46')};
465
+ }
466
+
467
+ /* Header subtitle enhancements */
468
+ .smtp-header-subtitle {
469
+ font-size: 13px;
470
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
471
+ margin-top: 2px;
472
+ display: flex;
473
+ align-items: center;
474
+ gap: 8px;
475
+ flex-wrap: wrap;
476
+ }
477
+
478
+ .smtp-direction-badge {
479
+ display: inline-flex;
480
+ align-items: center;
481
+ padding: 2px 8px;
482
+ border-radius: 9999px;
483
+ font-size: 11px;
484
+ font-weight: 600;
485
+ text-transform: uppercase;
486
+ letter-spacing: 0.3px;
487
+ }
488
+
489
+ .smtp-direction-badge.inbound {
490
+ background: ${cssManager.bdTheme('rgba(34, 197, 94, 0.12)', 'rgba(34, 197, 94, 0.2)')};
491
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
492
+ }
493
+
494
+ .smtp-direction-badge.outbound {
495
+ background: ${cssManager.bdTheme('rgba(59, 130, 246, 0.12)', 'rgba(59, 130, 246, 0.2)')};
496
+ color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
497
+ }
498
+
499
+ .email-body-container {
500
+ padding: 16px;
501
+ font-family: monospace;
502
+ font-size: 13px;
503
+ max-height: 500px;
504
+ overflow-y: auto;
505
+ background: ${cssManager.bdTheme('#fafafa', '#0a0a0a')};
506
+ white-space: pre-wrap;
507
+ word-break: break-all;
508
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
509
+ }
510
+
511
+ .tls-badge {
512
+ display: inline-flex;
513
+ align-items: center;
514
+ padding: 2px 8px;
515
+ border-radius: 4px;
516
+ font-size: 12px;
517
+ font-weight: 500;
518
+ background: ${cssManager.bdTheme('#dcfce7', 'rgba(34, 197, 94, 0.2)')};
519
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
520
+ }
521
+
522
+ .auth-row {
523
+ display: flex;
524
+ justify-content: space-between;
525
+ align-items: center;
526
+ padding: 8px 0;
527
+ border-bottom: 1px solid ${cssManager.bdTheme('#f4f4f5', '#27272a')};
528
+ }
529
+
530
+ .auth-row:last-child {
531
+ border-bottom: none;
532
+ }
533
+
534
+ .auth-label {
535
+ font-size: 14px;
536
+ font-weight: 500;
537
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
538
+ }
539
+
540
+ .auth-domain {
541
+ font-size: 12px;
542
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
543
+ margin-left: 8px;
544
+ }
545
+
546
+ .auth-badge {
547
+ display: inline-flex;
548
+ align-items: center;
549
+ padding: 2px 8px;
550
+ border-radius: 9999px;
551
+ font-size: 12px;
552
+ font-weight: 500;
553
+ }
554
+
555
+ .auth-badge.pass {
556
+ background: ${cssManager.bdTheme('#dcfce7', 'rgba(34, 197, 94, 0.2)')};
557
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
558
+ }
559
+
560
+ .auth-badge.fail {
561
+ background: ${cssManager.bdTheme('#fee2e2', 'rgba(239, 68, 68, 0.2)')};
562
+ color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
563
+ }
564
+
565
+ .auth-badge.softfail,
566
+ .auth-badge.neutral,
567
+ .auth-badge.none {
568
+ background: ${cssManager.bdTheme('#fef9c3', 'rgba(250, 204, 21, 0.2)')};
569
+ color: ${cssManager.bdTheme('#ca8a04', '#facc15')};
570
+ }
571
+
572
+ .rejection-card {
573
+ border-color: ${cssManager.bdTheme('#fecaca', 'rgba(239, 68, 68, 0.3)')};
574
+ }
575
+
576
+ .rejection-content {
577
+ font-size: 14px;
578
+ color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
579
+ }
580
+
581
+ .rejection-label {
582
+ font-size: 12px;
583
+ font-weight: 600;
584
+ text-transform: uppercase;
585
+ letter-spacing: 0.05em;
586
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
587
+ margin-bottom: 4px;
588
+ }
589
+
590
+ .rejection-text {
591
+ font-family: monospace;
592
+ font-size: 13px;
593
+ padding: 8px 12px;
594
+ background: ${cssManager.bdTheme('#fef2f2', 'rgba(239, 68, 68, 0.1)')};
595
+ border-radius: 4px;
596
+ margin-bottom: 12px;
597
+ color: ${cssManager.bdTheme('#991b1b', '#fca5a5')};
598
+ }
599
+
600
+ .rejection-text:last-child {
601
+ margin-bottom: 0;
602
+ }
603
+
604
+ .no-email {
605
+ padding: 48px 24px;
606
+ text-align: center;
607
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
608
+ }
609
+ `,
610
+ ];
611
+ render() {
612
+ if (!this.email) {
613
+ return html `<div class="no-email">No email selected</div>`;
614
+ }
615
+ const email = this.email;
616
+ return html `
617
+ <div class="header">
618
+ <div class="back-link" @click=${() => this.handleBack()}>
619
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
620
+ <polyline points="15 18 9 12 15 6"></polyline>
621
+ </svg>
622
+ Back to Emails
623
+ </div>
624
+ </div>
625
+
626
+ <div class="email-header">
627
+ <h1 class="email-subject">${email.subject}</h1>
628
+ <div class="badge-group">
629
+ <span class="status-badge ${email.status}">${email.status}</span>
630
+ <span class="direction-badge ${email.direction}">${email.direction}</span>
631
+ </div>
632
+ </div>
633
+
634
+ <div class="content">
635
+ <div class="main-content">
636
+ <!-- Email Metadata -->
637
+ <div class="card">
638
+ <div class="card-header">
639
+ <div class="card-title">Email Metadata</div>
640
+ </div>
641
+ <div class="card-content">
642
+ <div class="detail-list">
643
+ <div class="detail-item">
644
+ <span class="detail-label">From</span>
645
+ <span class="detail-value">${email.from}</span>
646
+ </div>
647
+ <div class="detail-item">
648
+ <span class="detail-label">To</span>
649
+ <span class="detail-value">${email.toList.join(', ')}</span>
650
+ </div>
651
+ ${email.cc && email.cc.length > 0 ? html `
652
+ <div class="detail-item">
653
+ <span class="detail-label">CC</span>
654
+ <span class="detail-value">${email.cc.join(', ')}</span>
655
+ </div>
656
+ ` : ''}
657
+ <div class="detail-item">
658
+ <span class="detail-label">Subject</span>
659
+ <span class="detail-value">${email.subject}</span>
660
+ </div>
661
+ <div class="detail-item">
662
+ <span class="detail-label">Date</span>
663
+ <span class="detail-value">${email.timestamp}</span>
664
+ </div>
665
+ <div class="detail-item">
666
+ <span class="detail-label">Message ID</span>
667
+ <span class="detail-value">${email.messageId}</span>
668
+ </div>
669
+ <div class="detail-item">
670
+ <span class="detail-label">Size</span>
671
+ <span class="detail-value">${email.size}</span>
672
+ </div>
673
+ </div>
674
+ </div>
675
+ </div>
676
+
677
+ <!-- SMTP Transaction Log -->
678
+ <div class="card">
679
+ <div class="card-header">
680
+ <div>
681
+ <div class="card-title">SMTP Transaction Log</div>
682
+ <div class="smtp-header-subtitle">
683
+ <span class="smtp-direction-badge ${email.direction}">${email.direction}</span>
684
+ <span>${email.direction === 'outbound'
685
+ ? `${email.connectionInfo.sourceHostname} → ${email.connectionInfo.destinationIp}:${email.connectionInfo.destinationPort}`
686
+ : `${email.connectionInfo.sourceIp} → ${email.connectionInfo.sourceHostname}:${email.connectionInfo.destinationPort}`}</span>
687
+ </div>
688
+ </div>
689
+ <button class="smtp-copy-button" @click=${() => this.copySmtpLog()}>
690
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
691
+ <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
692
+ <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
693
+ </svg>
694
+ Copy Log
695
+ </button>
696
+ </div>
697
+ ${this.renderSmtpLog(email)}
698
+ </div>
699
+
700
+ <!-- Email Body -->
701
+ <div class="card">
702
+ <div class="card-header">
703
+ <div>
704
+ <div class="card-title">Email Body (Escaped)</div>
705
+ <div class="card-subtitle">Raw content — HTML is not rendered</div>
706
+ </div>
707
+ </div>
708
+ <pre class="email-body-container">${email.body}</pre>
709
+ </div>
710
+ </div>
711
+
712
+ <div class="sidebar">
713
+ <!-- Connection Info -->
714
+ <div class="card">
715
+ <div class="card-header">
716
+ <div class="card-title">Connection Info</div>
717
+ </div>
718
+ <div class="card-content">
719
+ <div class="detail-list">
720
+ <div class="detail-item">
721
+ <span class="detail-label">Source IP</span>
722
+ <span class="detail-value">${email.connectionInfo.sourceIp}</span>
723
+ </div>
724
+ <div class="detail-item">
725
+ <span class="detail-label">Source Hostname</span>
726
+ <span class="detail-value">${email.connectionInfo.sourceHostname}</span>
727
+ </div>
728
+ <div class="detail-item">
729
+ <span class="detail-label">Destination</span>
730
+ <span class="detail-value">${email.connectionInfo.destinationIp}:${email.connectionInfo.destinationPort}</span>
731
+ </div>
732
+ <div class="detail-item">
733
+ <span class="detail-label">TLS</span>
734
+ <span class="detail-value">
735
+ ${email.connectionInfo.tlsVersion
736
+ ? html `<span class="tls-badge">${email.connectionInfo.tlsVersion}</span>`
737
+ : 'None'}
738
+ </span>
739
+ </div>
740
+ ${email.connectionInfo.tlsCipher ? html `
741
+ <div class="detail-item">
742
+ <span class="detail-label">Cipher</span>
743
+ <span class="detail-value">${email.connectionInfo.tlsCipher}</span>
744
+ </div>
745
+ ` : ''}
746
+ <div class="detail-item">
747
+ <span class="detail-label">Authenticated</span>
748
+ <span class="detail-value">${email.connectionInfo.authenticated ? 'Yes' : 'No'}</span>
749
+ </div>
750
+ ${email.connectionInfo.authenticated ? html `
751
+ <div class="detail-item">
752
+ <span class="detail-label">Auth Method</span>
753
+ <span class="detail-value">${email.connectionInfo.authMethod}</span>
754
+ </div>
755
+ <div class="detail-item">
756
+ <span class="detail-label">Auth User</span>
757
+ <span class="detail-value">${email.connectionInfo.authUser}</span>
758
+ </div>
759
+ ` : ''}
760
+ </div>
761
+ </div>
762
+ </div>
763
+
764
+ <!-- Authentication Results -->
765
+ <div class="card">
766
+ <div class="card-header">
767
+ <div class="card-title">Authentication Results</div>
768
+ </div>
769
+ <div class="card-content">
770
+ <div class="auth-row">
771
+ <div>
772
+ <span class="auth-label">SPF</span>
773
+ <span class="auth-domain">${email.authenticationResults.spfDomain}</span>
774
+ </div>
775
+ <span class="auth-badge ${email.authenticationResults.spf}">${email.authenticationResults.spf}</span>
776
+ </div>
777
+ <div class="auth-row">
778
+ <div>
779
+ <span class="auth-label">DKIM</span>
780
+ <span class="auth-domain">${email.authenticationResults.dkimDomain}</span>
781
+ </div>
782
+ <span class="auth-badge ${email.authenticationResults.dkim}">${email.authenticationResults.dkim}</span>
783
+ </div>
784
+ <div class="auth-row">
785
+ <div>
786
+ <span class="auth-label">DMARC</span>
787
+ <span class="auth-domain">policy: ${email.authenticationResults.dmarcPolicy}</span>
788
+ </div>
789
+ <span class="auth-badge ${email.authenticationResults.dmarc}">${email.authenticationResults.dmarc}</span>
790
+ </div>
791
+ </div>
792
+ </div>
793
+
794
+ <!-- Rejection Details (conditional) -->
795
+ ${email.status === 'rejected' || email.status === 'bounced' ? html `
796
+ <div class="card rejection-card">
797
+ <div class="card-header">
798
+ <div class="card-title">Rejection Details</div>
799
+ </div>
800
+ <div class="card-content">
801
+ ${email.rejectionReason ? html `
802
+ <div class="rejection-label">Rejection Reason</div>
803
+ <div class="rejection-text">${email.rejectionReason}</div>
804
+ ` : ''}
805
+ ${email.bounceMessage ? html `
806
+ <div class="rejection-label">Bounce Message</div>
807
+ <div class="rejection-text">${email.bounceMessage}</div>
808
+ ` : ''}
809
+ </div>
810
+ </div>
811
+ ` : ''}
812
+ </div>
813
+ </div>
814
+ `;
815
+ }
816
+ getResponseCodeBadgeClass(code) {
817
+ if (code >= 500)
818
+ return 'code-5xx';
819
+ if (code >= 400)
820
+ return 'code-4xx';
821
+ if (code >= 300)
822
+ return 'code-3xx';
823
+ return 'code-2xx';
824
+ }
825
+ getSmtpPhases(log) {
826
+ const phases = [];
827
+ let currentPhase = '';
828
+ let ehloCount = 0;
829
+ for (const entry of log) {
830
+ const cmd = entry.command.toUpperCase();
831
+ let phase = currentPhase;
832
+ if (entry.direction === 'client') {
833
+ if (cmd.startsWith('EHLO') || cmd.startsWith('HELO')) {
834
+ ehloCount++;
835
+ if (ehloCount === 1) {
836
+ phase = 'connection';
837
+ }
838
+ else {
839
+ phase = 'post-tls';
840
+ }
841
+ }
842
+ else if (cmd === 'STARTTLS') {
843
+ phase = 'tls';
844
+ }
845
+ else if (cmd.startsWith('AUTH')) {
846
+ phase = 'auth';
847
+ }
848
+ else if (cmd.startsWith('MAIL FROM') || cmd.startsWith('RCPT TO') || cmd === 'DATA' || cmd === '.') {
849
+ phase = 'transfer';
850
+ }
851
+ else if (cmd === 'QUIT') {
852
+ phase = 'closing';
853
+ }
854
+ }
855
+ // Server responses stay in the current phase
856
+ if (entry.direction === 'server' && phase === '') {
857
+ phase = currentPhase || 'connection';
858
+ }
859
+ if (phase === '')
860
+ phase = 'connection';
861
+ if (phase !== currentPhase) {
862
+ currentPhase = phase;
863
+ const labels = {
864
+ 'connection': 'Connection',
865
+ 'tls': 'TLS Negotiation',
866
+ 'post-tls': 'Post-TLS Handshake',
867
+ 'auth': 'Authentication',
868
+ 'transfer': 'Mail Transfer',
869
+ 'closing': 'Closing',
870
+ };
871
+ phases.push({ phase, label: labels[phase] || phase, entries: [] });
872
+ }
873
+ if (phases.length === 0) {
874
+ phases.push({ phase: 'connection', label: 'Connection', entries: [] });
875
+ }
876
+ phases[phases.length - 1].entries.push(entry);
877
+ }
878
+ return phases;
879
+ }
880
+ renderSmtpLog(email) {
881
+ const phases = this.getSmtpPhases(email.smtpLog);
882
+ return html `
883
+ <div class="smtp-log-container">
884
+ ${phases.map(phase => html `
885
+ <div class="smtp-phase-separator">
886
+ <div class="smtp-phase-line"></div>
887
+ <span class="smtp-phase-label">${phase.label}</span>
888
+ <div class="smtp-phase-line"></div>
889
+ </div>
890
+ ${phase.entries.map(entry => html `
891
+ <div class="smtp-bubble ${entry.direction}">
892
+ ${entry.direction === 'server' && entry.responseCode ? html `
893
+ <span class="response-code-badge ${this.getResponseCodeBadgeClass(entry.responseCode)}">${entry.responseCode}</span>
894
+ ` : ''}
895
+ <div class="smtp-bubble-command">${entry.command}</div>
896
+ <div class="smtp-bubble-meta">
897
+ <span>${entry.timestamp}</span>
898
+ <span>·</span>
899
+ <span class="smtp-direction-tag ${entry.direction}">${entry.direction === 'client' ? 'Client' : 'Server'}</span>
900
+ </div>
901
+ </div>
902
+ `)}
903
+ `)}
904
+ </div>
905
+ `;
906
+ }
907
+ copySmtpLog() {
908
+ if (!this.email)
909
+ return;
910
+ const text = this.email.smtpLog
911
+ .map(e => `[${e.timestamp}] ${e.direction === 'client' ? 'C:' : 'S:'} ${e.command}`)
912
+ .join('\n');
913
+ navigator.clipboard.writeText(text);
914
+ }
915
+ handleBack() {
916
+ this.dispatchEvent(new CustomEvent('back', { bubbles: true, composed: true }));
917
+ }
918
+ constructor() {
919
+ super(...arguments);
920
+ __runInitializers(this, _email_extraInitializers);
921
+ }
922
+ static {
923
+ __runInitializers(_classThis, _classExtraInitializers);
924
+ }
925
+ };
926
+ return SzMtaDetailView = _classThis;
927
+ })();
928
+ export { SzMtaDetailView };
929
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3otbXRhLWRldGFpbC12aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL2VsZW1lbnRzL3N6LW10YS1kZXRhaWwtdmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsSUFBSSxFQUNKLEdBQUcsRUFDSCxVQUFVLEVBQ1YsUUFBUSxHQUVULE1BQU0sNkJBQTZCLENBQUM7SUFvRHhCLGVBQWU7NEJBRDNCLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQzs7OztzQkFDQyxXQUFXOzs7OytCQUFuQixTQUFRLFdBQVc7Ozs7aUNBMEU3QyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDM0Isb0tBQWdCLEtBQUssNkJBQUwsS0FBSyxxRkFBNkI7WUEzRXBELDZLQXcyQkM7Ozs7UUF2MkJRLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFBOzs7aUJBR2hCO1lBQ1AsRUFBRSxFQUFFLEdBQUc7WUFDUCxTQUFTLEVBQUUsVUFBVTtZQUNyQixNQUFNLEVBQUUsV0FBVztZQUNuQixJQUFJLEVBQUUsb0JBQW9CO1lBQzFCLEVBQUUsRUFBRSxrQkFBa0I7WUFDdEIsTUFBTSxFQUFFLENBQUMsa0JBQWtCLENBQUM7WUFDNUIsT0FBTyxFQUFFLHVCQUF1QjtZQUNoQyxTQUFTLEVBQUUscUJBQXFCO1lBQ2hDLFNBQVMsRUFBRSxxQkFBcUI7WUFDaEMsSUFBSSxFQUFFLFNBQVM7WUFDZixPQUFPLEVBQUU7Z0JBQ1AsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFO2dCQUMvRSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUs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