@serve.zone/catalog 2.1.0 → 2.3.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,31 @@
1
+ import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
2
+ declare global {
3
+ interface HTMLElementTagNameMap {
4
+ 'sz-mta-list-view': SzMtaListView;
5
+ }
6
+ }
7
+ export type TEmailStatus = 'delivered' | 'bounced' | 'rejected' | 'deferred' | 'pending';
8
+ export type TEmailDirection = 'inbound' | 'outbound';
9
+ export interface IEmail {
10
+ id: string;
11
+ direction: TEmailDirection;
12
+ status: TEmailStatus;
13
+ from: string;
14
+ to: string;
15
+ subject: string;
16
+ timestamp: string;
17
+ messageId: string;
18
+ size: string;
19
+ }
20
+ export declare class SzMtaListView extends DeesElement {
21
+ static demo: () => TemplateResult<1>;
22
+ static demoGroups: string[];
23
+ accessor emails: IEmail[];
24
+ private accessor searchQuery;
25
+ private accessor statusFilter;
26
+ private accessor directionFilter;
27
+ private get filteredEmails();
28
+ static styles: import("@design.estate/dees-element").CSSResult[];
29
+ render(): TemplateResult;
30
+ private handleEmailClick;
31
+ }
@@ -0,0 +1,371 @@
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, state, } from '@design.estate/dees-element';
36
+ let SzMtaListView = (() => {
37
+ let _classDecorators = [customElement('sz-mta-list-view')];
38
+ let _classDescriptor;
39
+ let _classExtraInitializers = [];
40
+ let _classThis;
41
+ let _classSuper = DeesElement;
42
+ let _emails_decorators;
43
+ let _emails_initializers = [];
44
+ let _emails_extraInitializers = [];
45
+ let _searchQuery_decorators;
46
+ let _searchQuery_initializers = [];
47
+ let _searchQuery_extraInitializers = [];
48
+ let _statusFilter_decorators;
49
+ let _statusFilter_initializers = [];
50
+ let _statusFilter_extraInitializers = [];
51
+ let _directionFilter_decorators;
52
+ let _directionFilter_initializers = [];
53
+ let _directionFilter_extraInitializers = [];
54
+ var SzMtaListView = class extends _classSuper {
55
+ static { _classThis = this; }
56
+ static {
57
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
58
+ _emails_decorators = [property({ type: Array })];
59
+ _searchQuery_decorators = [state()];
60
+ _statusFilter_decorators = [state()];
61
+ _directionFilter_decorators = [state()];
62
+ __esDecorate(this, null, _emails_decorators, { kind: "accessor", name: "emails", static: false, private: false, access: { has: obj => "emails" in obj, get: obj => obj.emails, set: (obj, value) => { obj.emails = value; } }, metadata: _metadata }, _emails_initializers, _emails_extraInitializers);
63
+ __esDecorate(this, null, _searchQuery_decorators, { kind: "accessor", name: "searchQuery", static: false, private: false, access: { has: obj => "searchQuery" in obj, get: obj => obj.searchQuery, set: (obj, value) => { obj.searchQuery = value; } }, metadata: _metadata }, _searchQuery_initializers, _searchQuery_extraInitializers);
64
+ __esDecorate(this, null, _statusFilter_decorators, { kind: "accessor", name: "statusFilter", static: false, private: false, access: { has: obj => "statusFilter" in obj, get: obj => obj.statusFilter, set: (obj, value) => { obj.statusFilter = value; } }, metadata: _metadata }, _statusFilter_initializers, _statusFilter_extraInitializers);
65
+ __esDecorate(this, null, _directionFilter_decorators, { kind: "accessor", name: "directionFilter", static: false, private: false, access: { has: obj => "directionFilter" in obj, get: obj => obj.directionFilter, set: (obj, value) => { obj.directionFilter = value; } }, metadata: _metadata }, _directionFilter_initializers, _directionFilter_extraInitializers);
66
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
67
+ SzMtaListView = _classThis = _classDescriptor.value;
68
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
69
+ }
70
+ static demo = () => html `
71
+ <div style="padding: 24px; max-width: 1200px;">
72
+ <sz-mta-list-view
73
+ .emails=${[
74
+ { id: '1', direction: 'outbound', status: 'delivered', from: 'noreply@serve.zone', to: 'user@example.com', subject: 'Welcome to serve.zone', timestamp: '2024-01-15 14:30:22', messageId: '<abc123@serve.zone>', size: '12.4 KB' },
75
+ { id: '2', direction: 'outbound', status: 'bounced', from: 'alerts@serve.zone', to: 'invalid@nowhere.test', subject: 'Service Alert: CPU Usage High', timestamp: '2024-01-15 14:28:10', messageId: '<def456@serve.zone>', size: '8.2 KB' },
76
+ { id: '3', direction: 'inbound', status: 'delivered', from: 'support@customer.com', to: 'admin@serve.zone', subject: 'Re: Infrastructure Review', timestamp: '2024-01-15 14:25:00', messageId: '<ghi789@customer.com>', size: '24.1 KB' },
77
+ { id: '4', direction: 'outbound', status: 'rejected', from: 'billing@serve.zone', to: 'blocked@spam-domain.test', subject: 'Invoice #2024-001', timestamp: '2024-01-15 14:20:45', messageId: '<jkl012@serve.zone>', size: '45.6 KB' },
78
+ { id: '5', direction: 'outbound', status: 'deferred', from: 'noreply@serve.zone', to: 'slow@remote-server.test', subject: 'Password Reset Request', timestamp: '2024-01-15 14:15:30', messageId: '<mno345@serve.zone>', size: '6.8 KB' },
79
+ { id: '6', direction: 'inbound', status: 'delivered', from: 'ci@github.com', to: 'devops@serve.zone', subject: 'Build #4521 passed', timestamp: '2024-01-15 14:10:00', messageId: '<pqr678@github.com>', size: '15.3 KB' },
80
+ { id: '7', direction: 'outbound', status: 'pending', from: 'reports@serve.zone', to: 'team@serve.zone', subject: 'Weekly Infrastructure Report', timestamp: '2024-01-15 14:05:00', messageId: '<stu901@serve.zone>', size: '102.7 KB' },
81
+ ]}
82
+ ></sz-mta-list-view>
83
+ </div>
84
+ `;
85
+ static demoGroups = ['MTA'];
86
+ #emails_accessor_storage = __runInitializers(this, _emails_initializers, []);
87
+ get emails() { return this.#emails_accessor_storage; }
88
+ set emails(value) { this.#emails_accessor_storage = value; }
89
+ #searchQuery_accessor_storage = (__runInitializers(this, _emails_extraInitializers), __runInitializers(this, _searchQuery_initializers, ''));
90
+ get searchQuery() { return this.#searchQuery_accessor_storage; }
91
+ set searchQuery(value) { this.#searchQuery_accessor_storage = value; }
92
+ #statusFilter_accessor_storage = (__runInitializers(this, _searchQuery_extraInitializers), __runInitializers(this, _statusFilter_initializers, 'all'));
93
+ get statusFilter() { return this.#statusFilter_accessor_storage; }
94
+ set statusFilter(value) { this.#statusFilter_accessor_storage = value; }
95
+ #directionFilter_accessor_storage = (__runInitializers(this, _statusFilter_extraInitializers), __runInitializers(this, _directionFilter_initializers, 'all'));
96
+ get directionFilter() { return this.#directionFilter_accessor_storage; }
97
+ set directionFilter(value) { this.#directionFilter_accessor_storage = value; }
98
+ get filteredEmails() {
99
+ return this.emails.filter((email) => {
100
+ if (this.statusFilter !== 'all' && email.status !== this.statusFilter)
101
+ return false;
102
+ if (this.directionFilter !== 'all' && email.direction !== this.directionFilter)
103
+ return false;
104
+ if (this.searchQuery) {
105
+ const q = this.searchQuery.toLowerCase();
106
+ return (email.from.toLowerCase().includes(q) ||
107
+ email.to.toLowerCase().includes(q) ||
108
+ email.subject.toLowerCase().includes(q) ||
109
+ email.messageId.toLowerCase().includes(q));
110
+ }
111
+ return true;
112
+ });
113
+ }
114
+ static styles = [
115
+ cssManager.defaultStyles,
116
+ css `
117
+ :host {
118
+ display: block;
119
+ }
120
+
121
+ .filter-bar {
122
+ display: flex;
123
+ flex-wrap: wrap;
124
+ gap: 12px;
125
+ align-items: center;
126
+ margin-bottom: 16px;
127
+ }
128
+
129
+ .search-input {
130
+ flex: 1;
131
+ min-width: 200px;
132
+ padding: 8px 12px;
133
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
134
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
135
+ border-radius: 6px;
136
+ font-size: 14px;
137
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
138
+ outline: none;
139
+ transition: border-color 200ms ease;
140
+ }
141
+
142
+ .search-input::placeholder {
143
+ color: ${cssManager.bdTheme('#a1a1aa', '#52525b')};
144
+ }
145
+
146
+ .search-input:focus {
147
+ border-color: ${cssManager.bdTheme('#2563eb', '#3b82f6')};
148
+ }
149
+
150
+ .chip-group {
151
+ display: flex;
152
+ gap: 4px;
153
+ }
154
+
155
+ .chip {
156
+ padding: 6px 12px;
157
+ background: transparent;
158
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
159
+ border-radius: 9999px;
160
+ font-size: 12px;
161
+ font-weight: 500;
162
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
163
+ cursor: pointer;
164
+ transition: all 200ms ease;
165
+ white-space: nowrap;
166
+ }
167
+
168
+ .chip:hover {
169
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
170
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
171
+ }
172
+
173
+ .chip.active {
174
+ background: ${cssManager.bdTheme('#18181b', '#fafafa')};
175
+ color: ${cssManager.bdTheme('#fafafa', '#18181b')};
176
+ border-color: ${cssManager.bdTheme('#18181b', '#fafafa')};
177
+ }
178
+
179
+ .results-count {
180
+ font-size: 13px;
181
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
182
+ margin-bottom: 12px;
183
+ }
184
+
185
+ .table-container {
186
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
187
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
188
+ border-radius: 8px;
189
+ overflow: hidden;
190
+ }
191
+
192
+ .table-header {
193
+ display: grid;
194
+ grid-template-columns: 40px 90px 1.5fr 1.5fr 2fr 140px;
195
+ gap: 16px;
196
+ padding: 12px 16px;
197
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
198
+ border-bottom: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
199
+ font-size: 12px;
200
+ font-weight: 600;
201
+ text-transform: uppercase;
202
+ letter-spacing: 0.05em;
203
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
204
+ }
205
+
206
+ .table-row {
207
+ display: grid;
208
+ grid-template-columns: 40px 90px 1.5fr 1.5fr 2fr 140px;
209
+ gap: 16px;
210
+ padding: 12px 16px;
211
+ border-bottom: 1px solid ${cssManager.bdTheme('#f4f4f5', '#27272a')};
212
+ font-size: 14px;
213
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
214
+ align-items: center;
215
+ cursor: pointer;
216
+ transition: background 200ms ease;
217
+ }
218
+
219
+ .table-row:last-child {
220
+ border-bottom: none;
221
+ }
222
+
223
+ .table-row:hover {
224
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
225
+ }
226
+
227
+ .direction-icon {
228
+ display: flex;
229
+ align-items: center;
230
+ justify-content: center;
231
+ }
232
+
233
+ .direction-icon.inbound {
234
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
235
+ }
236
+
237
+ .direction-icon.outbound {
238
+ color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
239
+ }
240
+
241
+ .status-badge {
242
+ display: inline-flex;
243
+ align-items: center;
244
+ padding: 2px 8px;
245
+ border-radius: 9999px;
246
+ font-size: 12px;
247
+ font-weight: 500;
248
+ }
249
+
250
+ .status-badge.delivered {
251
+ background: ${cssManager.bdTheme('#dcfce7', 'rgba(34, 197, 94, 0.2)')};
252
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
253
+ }
254
+
255
+ .status-badge.bounced,
256
+ .status-badge.rejected {
257
+ background: ${cssManager.bdTheme('#fee2e2', 'rgba(239, 68, 68, 0.2)')};
258
+ color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
259
+ }
260
+
261
+ .status-badge.deferred {
262
+ background: ${cssManager.bdTheme('#fef9c3', 'rgba(250, 204, 21, 0.2)')};
263
+ color: ${cssManager.bdTheme('#ca8a04', '#facc15')};
264
+ }
265
+
266
+ .status-badge.pending {
267
+ background: ${cssManager.bdTheme('#dbeafe', 'rgba(59, 130, 246, 0.2)')};
268
+ color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
269
+ }
270
+
271
+ .email-from,
272
+ .email-to {
273
+ overflow: hidden;
274
+ text-overflow: ellipsis;
275
+ white-space: nowrap;
276
+ }
277
+
278
+ .email-subject {
279
+ overflow: hidden;
280
+ text-overflow: ellipsis;
281
+ white-space: nowrap;
282
+ font-weight: 500;
283
+ }
284
+
285
+ .email-timestamp {
286
+ font-size: 13px;
287
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
288
+ white-space: nowrap;
289
+ }
290
+
291
+ .empty-state {
292
+ padding: 48px 24px;
293
+ text-align: center;
294
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
295
+ }
296
+ `,
297
+ ];
298
+ render() {
299
+ const filtered = this.filteredEmails;
300
+ return html `
301
+ <div class="filter-bar">
302
+ <input
303
+ class="search-input"
304
+ type="text"
305
+ placeholder="Search by from, to, subject, or message ID..."
306
+ .value=${this.searchQuery}
307
+ @input=${(e) => { this.searchQuery = e.target.value; }}
308
+ />
309
+ <div class="chip-group">
310
+ ${['all', 'inbound', 'outbound'].map(dir => html `
311
+ <button
312
+ class="chip ${this.directionFilter === dir ? 'active' : ''}"
313
+ @click=${() => { this.directionFilter = dir; }}
314
+ >${dir === 'all' ? 'All' : dir === 'inbound' ? 'Inbound' : 'Outbound'}</button>
315
+ `)}
316
+ </div>
317
+ <div class="chip-group">
318
+ ${['all', 'delivered', 'bounced', 'rejected', 'deferred', 'pending'].map(s => html `
319
+ <button
320
+ class="chip ${this.statusFilter === s ? 'active' : ''}"
321
+ @click=${() => { this.statusFilter = s; }}
322
+ >${s === 'all' ? 'All' : s.charAt(0).toUpperCase() + s.slice(1)}</button>
323
+ `)}
324
+ </div>
325
+ </div>
326
+
327
+ <div class="results-count">Showing ${filtered.length} of ${this.emails.length} emails</div>
328
+
329
+ <div class="table-container">
330
+ <div class="table-header">
331
+ <span></span>
332
+ <span>Status</span>
333
+ <span>From</span>
334
+ <span>To</span>
335
+ <span>Subject</span>
336
+ <span>Timestamp</span>
337
+ </div>
338
+ ${filtered.length > 0 ? filtered.map(email => html `
339
+ <div class="table-row" @click=${() => this.handleEmailClick(email)}>
340
+ <span class="direction-icon ${email.direction}">
341
+ ${email.direction === 'inbound'
342
+ ? html `<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="5" x2="12" y2="19"/><polyline points="19 12 12 19 5 12"/></svg>`
343
+ : html `<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="19" x2="12" y2="5"/><polyline points="5 12 12 5 19 12"/></svg>`}
344
+ </span>
345
+ <span><span class="status-badge ${email.status}">${email.status}</span></span>
346
+ <span class="email-from" title="${email.from}">${email.from}</span>
347
+ <span class="email-to" title="${email.to}">${email.to}</span>
348
+ <span class="email-subject" title="${email.subject}">${email.subject}</span>
349
+ <span class="email-timestamp">${email.timestamp}</span>
350
+ </div>
351
+ `) : html `
352
+ <div class="empty-state">No emails found</div>
353
+ `}
354
+ </div>
355
+ `;
356
+ }
357
+ handleEmailClick(email) {
358
+ this.dispatchEvent(new CustomEvent('email-click', { detail: email, bubbles: true, composed: true }));
359
+ }
360
+ constructor() {
361
+ super(...arguments);
362
+ __runInitializers(this, _directionFilter_extraInitializers);
363
+ }
364
+ static {
365
+ __runInitializers(_classThis, _classExtraInitializers);
366
+ }
367
+ };
368
+ return SzMtaListView = _classThis;
369
+ })();
370
+ export { SzMtaListView };
371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3otbXRhLWxpc3Qtdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9zei1tdGEtbGlzdC12aWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGFBQWEsRUFDYixJQUFJLEVBQ0osR0FBRyxFQUNILFVBQVUsRUFDVixRQUFRLEVBQ1IsS0FBSyxHQUVOLE1BQU0sNkJBQTZCLENBQUM7SUF3QnhCLGFBQWE7NEJBRHpCLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQzs7OztzQkFDQyxXQUFXOzs7Ozs7Ozs7Ozs7OzZCQUFuQixTQUFRLFdBQVc7Ozs7a0NBbUIzQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7dUNBR3pCLEtBQUssRUFBRTt3Q0FHUCxLQUFLLEVBQUU7MkNBR1AsS0FBSyxFQUFFO1lBUlIsdUtBQWdCLE1BQU0sNkJBQU4sTUFBTSx1RkFBZ0I7WUFHdEMsc0xBQWlCLFdBQVcsNkJBQVgsV0FBVyxpR0FBYztZQUcxQyx5TEFBaUIsWUFBWSw2QkFBWixZQUFZLG1HQUErQjtZQUc1RCxrTUFBaUIsZUFBZSw2QkFBZixlQUFlLHlHQUFrQztZQTdCcEUsNktBMFNDOzs7O1FBelNRLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFBOzs7a0JBR2Y7WUFDUixFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUNsTyxFQUFFLEVBQUUsRUFBRSxHQUFH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
@@ -0,0 +1,78 @@
1
+ import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
2
+ declare global {
3
+ interface HTMLElementTagNameMap {
4
+ 'sz-route-card': SzRouteCard;
5
+ }
6
+ }
7
+ export type TRouteActionType = 'forward' | 'socket-handler';
8
+ export type TTlsMode = 'passthrough' | 'terminate' | 'terminate-and-reencrypt';
9
+ export type TPortRange = number | number[] | Array<{
10
+ from: number;
11
+ to: number;
12
+ }>;
13
+ export interface IRouteMatch {
14
+ ports: TPortRange;
15
+ domains?: string | string[];
16
+ path?: string;
17
+ clientIp?: string[];
18
+ tlsVersion?: string[];
19
+ headers?: Record<string, string>;
20
+ protocol?: 'http' | 'tcp';
21
+ }
22
+ export interface IRouteTarget {
23
+ host: string | string[];
24
+ port: number | 'preserve';
25
+ }
26
+ export interface IRouteTls {
27
+ mode: TTlsMode;
28
+ certificate?: 'auto' | {
29
+ key: string;
30
+ cert: string;
31
+ };
32
+ }
33
+ export interface IRouteAction {
34
+ type: TRouteActionType;
35
+ targets?: IRouteTarget[];
36
+ tls?: IRouteTls;
37
+ websocket?: {
38
+ enabled: boolean;
39
+ };
40
+ loadBalancing?: {
41
+ algorithm: 'round-robin' | 'least-connections' | 'ip-hash';
42
+ };
43
+ forwardingEngine?: 'node' | 'nftables';
44
+ }
45
+ export interface IRouteSecurity {
46
+ ipAllowList?: string[];
47
+ ipBlockList?: string[];
48
+ maxConnections?: number;
49
+ rateLimit?: {
50
+ enabled: boolean;
51
+ maxRequests: number;
52
+ window: number;
53
+ };
54
+ }
55
+ export interface IRouteConfig {
56
+ id?: string;
57
+ match: IRouteMatch;
58
+ action: IRouteAction;
59
+ security?: IRouteSecurity;
60
+ headers?: {
61
+ request?: Record<string, string>;
62
+ response?: Record<string, string>;
63
+ };
64
+ name?: string;
65
+ description?: string;
66
+ priority?: number;
67
+ tags?: string[];
68
+ enabled?: boolean;
69
+ }
70
+ export declare class SzRouteCard extends DeesElement {
71
+ static demo: () => TemplateResult<1>;
72
+ static demoGroups: string[];
73
+ accessor route: IRouteConfig | null;
74
+ static styles: import("@design.estate/dees-element").CSSResult[];
75
+ render(): TemplateResult;
76
+ private renderDomains;
77
+ private renderFeatures;
78
+ }