@serve.zone/catalog 2.2.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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/catalog',
6
- version: '2.2.0',
6
+ version: '2.3.0',
7
7
  description: 'UI component catalog for serve.zone'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUscUJBQXFCO0lBQzNCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxxQ0FBcUM7Q0FDbkQsQ0FBQSJ9
@@ -27,6 +27,8 @@ export * from './sz-platform-service-detail-view.js';
27
27
  export * from './sz-domain-detail-view.js';
28
28
  export * from './sz-mta-list-view.js';
29
29
  export * from './sz-mta-detail-view.js';
30
+ export * from './sz-route-card.js';
31
+ export * from './sz-route-list-view.js';
30
32
  export * from './sz-demo-view-dashboard.js';
31
33
  export * from './sz-demo-view-services.js';
32
34
  export * from './sz-demo-view-network.js';
@@ -34,3 +36,4 @@ export * from './sz-demo-view-registries.js';
34
36
  export * from './sz-demo-view-tokens.js';
35
37
  export * from './sz-demo-view-settings.js';
36
38
  export * from './sz-demo-view-mta.js';
39
+ export * from './sz-demo-view-routes.js';
@@ -38,6 +38,9 @@ export * from './sz-domain-detail-view.js';
38
38
  // MTA Email Views
39
39
  export * from './sz-mta-list-view.js';
40
40
  export * from './sz-mta-detail-view.js';
41
+ // Route Configuration Views
42
+ export * from './sz-route-card.js';
43
+ export * from './sz-route-list-view.js';
41
44
  // Demo Views
42
45
  export * from './sz-demo-view-dashboard.js';
43
46
  export * from './sz-demo-view-services.js';
@@ -46,4 +49,5 @@ export * from './sz-demo-view-registries.js';
46
49
  export * from './sz-demo-view-tokens.js';
47
50
  export * from './sz-demo-view-settings.js';
48
51
  export * from './sz-demo-view-mta.js';
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCO0FBQ2xCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyw0QkFBNEIsQ0FBQztBQUUzQyxrQkFBa0I7QUFDbEIsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHdCQUF3QixDQUFDO0FBRXZDLGdCQUFnQjtBQUNoQixjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxpQkFBaUI7QUFDakIsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLGdDQUFnQyxDQUFDO0FBRS9DLGlCQUFpQjtBQUNqQixjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyw2QkFBNkIsQ0FBQztBQUU1QyxjQUFjO0FBQ2QsY0FBYyxxQkFBcUIsQ0FBQztBQUVwQyxnQkFBZ0I7QUFDaEIsY0FBYyx1QkFBdUIsQ0FBQztBQUV0QyxlQUFlO0FBQ2YsY0FBYyxvQkFBb0IsQ0FBQztBQUVuQyxpQkFBaUI7QUFDakIsY0FBYyw2QkFBNkIsQ0FBQztBQUU1QyxlQUFlO0FBQ2YsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLDRCQUE0QixDQUFDO0FBRTNDLGtCQUFrQjtBQUNsQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMseUJBQXlCLENBQUM7QUFFeEMsYUFBYTtBQUNiLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsdUJBQXVCLENBQUMifQ==
52
+ export * from './sz-demo-view-routes.js';
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCO0FBQ2xCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyw0QkFBNEIsQ0FBQztBQUUzQyxrQkFBa0I7QUFDbEIsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHdCQUF3QixDQUFDO0FBRXZDLGdCQUFnQjtBQUNoQixjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxpQkFBaUI7QUFDakIsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLGdDQUFnQyxDQUFDO0FBRS9DLGlCQUFpQjtBQUNqQixjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyw2QkFBNkIsQ0FBQztBQUU1QyxjQUFjO0FBQ2QsY0FBYyxxQkFBcUIsQ0FBQztBQUVwQyxnQkFBZ0I7QUFDaEIsY0FBYyx1QkFBdUIsQ0FBQztBQUV0QyxlQUFlO0FBQ2YsY0FBYyxvQkFBb0IsQ0FBQztBQUVuQyxpQkFBaUI7QUFDakIsY0FBYyw2QkFBNkIsQ0FBQztBQUU1QyxlQUFlO0FBQ2YsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLDRCQUE0QixDQUFDO0FBRTNDLGtCQUFrQjtBQUNsQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMseUJBQXlCLENBQUM7QUFFeEMsNEJBQTRCO0FBQzVCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyx5QkFBeUIsQ0FBQztBQUV4QyxhQUFhO0FBQ2IsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLDBCQUEwQixDQUFDIn0=
@@ -0,0 +1,22 @@
1
+ import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
2
+ import type { DeesAppui } from '@design.estate/dees-catalog';
3
+ import './index.js';
4
+ declare global {
5
+ interface HTMLElementTagNameMap {
6
+ 'sz-demo-view-routes': SzDemoViewRoutes;
7
+ }
8
+ }
9
+ export declare class SzDemoViewRoutes extends DeesElement {
10
+ private appui;
11
+ private accessor currentTab;
12
+ private demoRoutes;
13
+ private get filteredRoutes();
14
+ onActivate(context: {
15
+ appui: DeesAppui;
16
+ viewId: string;
17
+ }): Promise<void>;
18
+ private updateSecondaryMenu;
19
+ onDeactivate(): void;
20
+ static styles: import("@design.estate/dees-element").CSSResult[];
21
+ render(): TemplateResult;
22
+ }
@@ -0,0 +1,388 @@
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, state, } from '@design.estate/dees-element';
36
+ import './index.js';
37
+ let SzDemoViewRoutes = (() => {
38
+ let _classDecorators = [customElement('sz-demo-view-routes')];
39
+ let _classDescriptor;
40
+ let _classExtraInitializers = [];
41
+ let _classThis;
42
+ let _classSuper = DeesElement;
43
+ let _currentTab_decorators;
44
+ let _currentTab_initializers = [];
45
+ let _currentTab_extraInitializers = [];
46
+ var SzDemoViewRoutes = class extends _classSuper {
47
+ static { _classThis = this; }
48
+ static {
49
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
50
+ _currentTab_decorators = [state()];
51
+ __esDecorate(this, null, _currentTab_decorators, { kind: "accessor", name: "currentTab", static: false, private: false, access: { has: obj => "currentTab" in obj, get: obj => obj.currentTab, set: (obj, value) => { obj.currentTab = value; } }, metadata: _metadata }, _currentTab_initializers, _currentTab_extraInitializers);
52
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
53
+ SzDemoViewRoutes = _classThis = _classDescriptor.value;
54
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
55
+ }
56
+ appui = null;
57
+ #currentTab_accessor_storage = __runInitializers(this, _currentTab_initializers, 'all');
58
+ get currentTab() { return this.#currentTab_accessor_storage; }
59
+ set currentTab(value) { this.#currentTab_accessor_storage = value; }
60
+ demoRoutes = (__runInitializers(this, _currentTab_extraInitializers), [
61
+ // 1. HTTPS with TLS termination + auto cert
62
+ {
63
+ id: 'route-1',
64
+ name: 'Web Frontend',
65
+ description: 'Main website with TLS termination and automatic certificates',
66
+ enabled: true,
67
+ priority: 10,
68
+ tags: ['web', 'https', 'production'],
69
+ match: {
70
+ ports: 443,
71
+ domains: ['serve.zone', 'www.serve.zone'],
72
+ protocol: 'http',
73
+ },
74
+ action: {
75
+ type: 'forward',
76
+ targets: [{ host: '10.0.0.10', port: 3000 }],
77
+ tls: { mode: 'terminate', certificate: 'auto' },
78
+ },
79
+ },
80
+ // 2. HTTP to HTTPS redirect
81
+ {
82
+ id: 'route-2',
83
+ name: 'HTTP Redirect',
84
+ description: 'Redirects all HTTP traffic to HTTPS',
85
+ enabled: true,
86
+ priority: 100,
87
+ tags: ['web', 'http', 'redirect'],
88
+ match: {
89
+ ports: 80,
90
+ domains: ['serve.zone', 'www.serve.zone'],
91
+ protocol: 'http',
92
+ },
93
+ action: {
94
+ type: 'socket-handler',
95
+ },
96
+ },
97
+ // 3. Email SMTP route
98
+ {
99
+ id: 'route-3',
100
+ name: 'SMTP Inbound',
101
+ description: 'Inbound email relay for serve.zone domain',
102
+ enabled: true,
103
+ tags: ['email', 'smtp', 'production'],
104
+ match: {
105
+ ports: 25,
106
+ domains: 'mail.serve.zone',
107
+ },
108
+ action: {
109
+ type: 'forward',
110
+ targets: [{ host: '10.0.1.5', port: 25 }],
111
+ tls: { mode: 'terminate', certificate: 'auto' },
112
+ },
113
+ },
114
+ // 4. API gateway with path matching, rate limiting, CORS
115
+ {
116
+ id: 'route-4',
117
+ name: 'API Gateway',
118
+ description: 'API gateway with rate limiting, CORS headers, and load balancing',
119
+ enabled: true,
120
+ priority: 20,
121
+ tags: ['web', 'api', 'https', 'production'],
122
+ match: {
123
+ ports: 443,
124
+ domains: 'api.serve.zone',
125
+ path: '/v2/*',
126
+ protocol: 'http',
127
+ },
128
+ action: {
129
+ type: 'forward',
130
+ targets: [
131
+ { host: ['10.0.0.20', '10.0.0.21', '10.0.0.22'], port: 8080 },
132
+ ],
133
+ tls: { mode: 'terminate', certificate: 'auto' },
134
+ loadBalancing: { algorithm: 'round-robin' },
135
+ },
136
+ security: {
137
+ rateLimit: { enabled: true, maxRequests: 200, window: 60 },
138
+ maxConnections: 5000,
139
+ },
140
+ headers: {
141
+ response: {
142
+ 'Access-Control-Allow-Origin': '*',
143
+ 'X-Request-Id': '{{requestId}}',
144
+ },
145
+ },
146
+ },
147
+ // 5. WebSocket route
148
+ {
149
+ id: 'route-5',
150
+ name: 'WebSocket Realtime',
151
+ description: 'Real-time WebSocket connections for live updates',
152
+ enabled: true,
153
+ tags: ['web', 'https', 'websocket'],
154
+ match: {
155
+ ports: 443,
156
+ domains: 'ws.serve.zone',
157
+ path: '/ws/*',
158
+ protocol: 'http',
159
+ },
160
+ action: {
161
+ type: 'forward',
162
+ targets: [{ host: '10.0.0.30', port: 9090 }],
163
+ tls: { mode: 'terminate', certificate: 'auto' },
164
+ websocket: { enabled: true },
165
+ },
166
+ },
167
+ // 6. Wildcard domain route
168
+ {
169
+ id: 'route-6',
170
+ name: 'Tenant Wildcard',
171
+ description: 'Multi-tenant wildcard routing for customer subdomains',
172
+ enabled: true,
173
+ priority: 50,
174
+ tags: ['web', 'https', 'multi-tenant'],
175
+ match: {
176
+ ports: 443,
177
+ domains: '*.customers.serve.zone',
178
+ protocol: 'http',
179
+ },
180
+ action: {
181
+ type: 'forward',
182
+ targets: [{ host: '10.0.0.40', port: 8080 }],
183
+ tls: { mode: 'terminate', certificate: 'auto' },
184
+ },
185
+ security: {
186
+ ipAllowList: ['10.0.0.0/8', '172.16.0.0/12'],
187
+ },
188
+ },
189
+ // 7. Load-balanced route with health check
190
+ {
191
+ id: 'route-7',
192
+ name: 'Microservices LB',
193
+ description: 'Load-balanced microservices backend with IP-hash affinity',
194
+ enabled: true,
195
+ tags: ['web', 'https', 'production'],
196
+ match: {
197
+ ports: [443, 8443],
198
+ domains: 'services.serve.zone',
199
+ protocol: 'http',
200
+ },
201
+ action: {
202
+ type: 'forward',
203
+ targets: [
204
+ { host: ['10.0.2.1', '10.0.2.2', '10.0.2.3', '10.0.2.4'], port: 3000 },
205
+ ],
206
+ tls: { mode: 'terminate-and-reencrypt', certificate: 'auto' },
207
+ loadBalancing: { algorithm: 'ip-hash' },
208
+ },
209
+ },
210
+ // 8. DNS-over-HTTPS route
211
+ {
212
+ id: 'route-8',
213
+ name: 'DNS over HTTPS',
214
+ description: 'DNS-over-HTTPS resolver endpoint',
215
+ enabled: true,
216
+ tags: ['dns', 'https'],
217
+ match: {
218
+ ports: 443,
219
+ domains: 'dns.serve.zone',
220
+ path: '/dns-query',
221
+ protocol: 'http',
222
+ },
223
+ action: {
224
+ type: 'forward',
225
+ targets: [{ host: '10.0.3.1', port: 8053 }],
226
+ tls: { mode: 'terminate', certificate: 'auto' },
227
+ },
228
+ },
229
+ // 9. NFTables high-performance route
230
+ {
231
+ id: 'route-9',
232
+ name: 'High-Perf TCP Proxy',
233
+ description: 'NFTables-accelerated TCP proxy for game servers',
234
+ enabled: true,
235
+ tags: ['tcp', 'nftables', 'production'],
236
+ match: {
237
+ ports: [{ from: 27000, to: 27050 }],
238
+ protocol: 'tcp',
239
+ },
240
+ action: {
241
+ type: 'forward',
242
+ targets: [{ host: '10.0.4.1', port: 'preserve' }],
243
+ forwardingEngine: 'nftables',
244
+ },
245
+ },
246
+ // 10. Disabled maintenance route
247
+ {
248
+ id: 'route-10',
249
+ name: 'Legacy Admin Panel',
250
+ description: 'Deprecated admin panel — disabled for maintenance',
251
+ enabled: false,
252
+ tags: ['web', 'https', 'deprecated'],
253
+ match: {
254
+ ports: 443,
255
+ domains: 'admin-old.serve.zone',
256
+ protocol: 'http',
257
+ },
258
+ action: {
259
+ type: 'socket-handler',
260
+ },
261
+ security: {
262
+ ipBlockList: ['0.0.0.0/0'],
263
+ },
264
+ },
265
+ ]);
266
+ get filteredRoutes() {
267
+ if (this.currentTab === 'all')
268
+ return this.demoRoutes;
269
+ if (this.currentTab === 'https') {
270
+ return this.demoRoutes.filter((r) => r.tags?.some((t) => ['web', 'https', 'http'].includes(t)));
271
+ }
272
+ if (this.currentTab === 'email') {
273
+ return this.demoRoutes.filter((r) => r.tags?.some((t) => ['email', 'smtp'].includes(t)));
274
+ }
275
+ if (this.currentTab === 'dns') {
276
+ return this.demoRoutes.filter((r) => r.tags?.some((t) => ['dns'].includes(t)));
277
+ }
278
+ return this.demoRoutes;
279
+ }
280
+ async onActivate(context) {
281
+ this.appui = context.appui;
282
+ this.appui.setContentTabs([
283
+ {
284
+ key: 'All Routes',
285
+ action: () => {
286
+ this.currentTab = 'all';
287
+ this.updateSecondaryMenu();
288
+ },
289
+ },
290
+ {
291
+ key: 'HTTP/S',
292
+ action: () => {
293
+ this.currentTab = 'https';
294
+ this.updateSecondaryMenu();
295
+ },
296
+ },
297
+ {
298
+ key: 'Email',
299
+ action: () => {
300
+ this.currentTab = 'email';
301
+ this.updateSecondaryMenu();
302
+ },
303
+ },
304
+ {
305
+ key: 'DNS',
306
+ action: () => {
307
+ this.currentTab = 'dns';
308
+ this.updateSecondaryMenu();
309
+ },
310
+ },
311
+ ]);
312
+ this.updateSecondaryMenu();
313
+ }
314
+ updateSecondaryMenu() {
315
+ if (!this.appui)
316
+ return;
317
+ const total = this.demoRoutes.length;
318
+ const active = this.demoRoutes.filter((r) => r.enabled !== false).length;
319
+ const forwardCount = this.demoRoutes.filter((r) => r.action.type === 'forward').length;
320
+ this.appui.setSecondaryMenu({
321
+ heading: 'Routes',
322
+ groups: [
323
+ {
324
+ name: 'Actions',
325
+ items: [
326
+ {
327
+ type: 'action',
328
+ key: 'Refresh',
329
+ iconName: 'lucide:RefreshCw',
330
+ action: () => {
331
+ console.log('Refresh routes');
332
+ },
333
+ },
334
+ {
335
+ type: 'action',
336
+ key: 'Add Route',
337
+ iconName: 'lucide:Plus',
338
+ action: () => {
339
+ console.log('Add route');
340
+ },
341
+ },
342
+ ],
343
+ },
344
+ {
345
+ name: 'Statistics',
346
+ items: [
347
+ { type: 'header', label: `${total} Total Routes` },
348
+ { type: 'header', label: `${active} Active` },
349
+ { type: 'header', label: `${forwardCount} Forward` },
350
+ { type: 'header', label: `${total - forwardCount} Socket Handler` },
351
+ ],
352
+ },
353
+ ],
354
+ });
355
+ }
356
+ onDeactivate() {
357
+ // Cleanup if needed
358
+ }
359
+ static styles = [
360
+ cssManager.defaultStyles,
361
+ css `
362
+ :host {
363
+ display: block;
364
+ padding: 24px;
365
+ height: 100%;
366
+ overflow-y: auto;
367
+ box-sizing: border-box;
368
+ }
369
+ `,
370
+ ];
371
+ render() {
372
+ return html `
373
+ <sz-route-list-view
374
+ .routes=${this.filteredRoutes}
375
+ @route-click=${(e) => {
376
+ console.log('Route clicked:', e.detail.name);
377
+ }}
378
+ ></sz-route-list-view>
379
+ `;
380
+ }
381
+ static {
382
+ __runInitializers(_classThis, _classExtraInitializers);
383
+ }
384
+ };
385
+ return SzDemoViewRoutes = _classThis;
386
+ })();
387
+ export { SzDemoViewRoutes };
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3otZGVtby12aWV3LXJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9zei1kZW1vLXZpZXctcm91dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGFBQWEsRUFDYixJQUFJLEVBQ0osR0FBRyxFQUNILFVBQVUsRUFDVixLQUFLLEdBRU4sTUFBTSw2QkFBNkIsQ0FBQztBQUdyQyxPQUFPLFlBQVksQ0FBQztJQVNQLGdCQUFnQjs0QkFENUIsYUFBYSxDQUFDLHFCQUFxQixDQUFDOzs7O3NCQUNDLFdBQVc7Ozs7Z0NBQW5CLFNBQVEsV0FBVzs7OztzQ0FHOUMsS0FBSyxFQUFFO1lBQ1IsbUxBQWlCLFVBQVUsNkJBQVYsVUFBVSwrRkFBNEM7WUFKekUsNktBcVZDOzs7O1FBcFZTLEtBQUssR0FBcUIsSUFBSSxDQUFDO1FBR3ZDLGlGQUFpRSxLQUFLLEVBQUM7UUFBdkUsSUFBaUIsVUFBVSxnREFBNEM7UUFBdkUsSUFBaUIsVUFBVSxzREFBNEM7UUFFL0QsVUFBVSw0REFBbUI7WUFDbkMsNENBQTRDO1lBQzVDO2dCQUNFLEVBQUUsRUFBRSxTQUFTO2dCQUNiLElBQUksRUFBRSxjQUFjO2dCQUNwQixXQUFXLEVBQUUsOERBQThEO2dCQUMzRSxPQUFPLEVBQUUsSUFBSTtnQkFDYixRQUFRLEVBQUUsRUFBRTtnQkFDWixJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQztnQkFDcEMsS0FBSyxFQUFFO29CQUNMLEtBQUssRUFBRSxHQUFHO29CQUNWLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQztvQkFDekMsUUFBUSxFQUFFLE1BQU07aUJBQ2pCO2dCQUNELE1BQU0sRUFBRTtvQkFDTixJQUFJLEVBQUUsU0FBUztvQkFDZixPQUFPLEVBQUUsQ0FBQyxF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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
+ }