@serve.zone/catalog 2.2.0 → 2.4.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,193 @@
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, } from '@design.estate/dees-element';
36
+ import './index.js';
37
+ let SzDemoViewConfig = (() => {
38
+ let _classDecorators = [customElement('sz-demo-view-config')];
39
+ let _classDescriptor;
40
+ let _classExtraInitializers = [];
41
+ let _classThis;
42
+ let _classSuper = DeesElement;
43
+ var SzDemoViewConfig = class extends _classSuper {
44
+ static { _classThis = this; }
45
+ static {
46
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
47
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
48
+ SzDemoViewConfig = _classThis = _classDescriptor.value;
49
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
50
+ }
51
+ static styles = [
52
+ cssManager.defaultStyles,
53
+ css `
54
+ :host {
55
+ display: block;
56
+ padding: 24px;
57
+ height: 100%;
58
+ overflow-y: auto;
59
+ box-sizing: border-box;
60
+ }
61
+ `,
62
+ ];
63
+ render() {
64
+ const systemFields = [
65
+ { key: 'Base Directory', value: '/home/user/.serve.zone/dcrouter' },
66
+ { key: 'Data Directory', value: '/home/user/.serve.zone/dcrouter/data' },
67
+ { key: 'Public IP', value: '203.0.113.50' },
68
+ { key: 'Proxy IPs', value: ['203.0.113.10', '203.0.113.11'], type: 'pills' },
69
+ { key: 'Uptime', value: '3d 14h 22m' },
70
+ { key: 'Storage Backend', value: 'filesystem', type: 'badge' },
71
+ ];
72
+ const proxyFields = [
73
+ { key: 'Route Count', value: 12 },
74
+ { key: 'ACME Enabled', value: true, type: 'boolean' },
75
+ { key: 'Account Email', value: 'admin@serve.zone' },
76
+ { key: 'Use Production', value: true, type: 'boolean' },
77
+ { key: 'Auto Renew', value: true, type: 'boolean' },
78
+ { key: 'Renew Threshold', value: '30 days' },
79
+ ];
80
+ const emailFields = [
81
+ { key: 'Ports', value: ['25', '465', '587'], type: 'pills' },
82
+ { key: 'Hostname', value: 'mail.serve.zone' },
83
+ { key: 'Domains', value: ['serve.zone', 'mail.serve.zone'], type: 'pills' },
84
+ { key: 'Email Routes', value: 5 },
85
+ { key: 'Received Path', value: '/data/emails' },
86
+ ];
87
+ const dnsFields = [
88
+ { key: 'Port', value: 53 },
89
+ { key: 'NS Domains', value: ['ns1.serve.zone', 'ns2.serve.zone'], type: 'pills' },
90
+ { key: 'Scopes', value: ['serve.zone', 'example.com'], type: 'pills' },
91
+ { key: 'Record Count', value: 24 },
92
+ { key: 'DNS Challenge', value: true, type: 'boolean' },
93
+ ];
94
+ const tlsFields = [
95
+ { key: 'Contact Email', value: 'admin@serve.zone' },
96
+ { key: 'Domain', value: 'serve.zone' },
97
+ { key: 'Source', value: 'acme', type: 'badge' },
98
+ { key: 'Certificate Path', value: null },
99
+ { key: 'Key Path', value: null },
100
+ ];
101
+ const cacheFields = [
102
+ { key: 'Storage Path', value: '/home/user/.serve.zone/dcrouter/tsmdb' },
103
+ { key: 'DB Name', value: 'dcrouter' },
104
+ { key: 'Default TTL', value: '30 days' },
105
+ { key: 'Cleanup Interval', value: '1 hour' },
106
+ ];
107
+ const radiusFields = [
108
+ { key: 'Auth Port', value: null },
109
+ { key: 'Accounting Port', value: null },
110
+ ];
111
+ const remoteIngressFields = [
112
+ { key: 'Tunnel Port', value: 8443 },
113
+ { key: 'Hub Domain', value: 'hub.serve.zone' },
114
+ { key: 'TLS Configured', value: true, type: 'boolean' },
115
+ ];
116
+ return html `
117
+ <sz-config-overview
118
+ infoText="This view displays the current running configuration. DcRouter is configured through code or remote management."
119
+ >
120
+ <sz-config-section
121
+ title="System"
122
+ subtitle="Base paths and infrastructure"
123
+ icon="lucide:server"
124
+ status="enabled"
125
+ .fields=${systemFields}
126
+ ></sz-config-section>
127
+
128
+ <sz-config-section
129
+ title="SmartProxy"
130
+ subtitle="HTTP/HTTPS and TCP/SNI reverse proxy"
131
+ icon="lucide:network"
132
+ status="enabled"
133
+ .fields=${proxyFields}
134
+ ></sz-config-section>
135
+
136
+ <sz-config-section
137
+ title="Email Server"
138
+ subtitle="SMTP email handling with smartmta"
139
+ icon="lucide:mail"
140
+ status="enabled"
141
+ .fields=${emailFields}
142
+ ></sz-config-section>
143
+
144
+ <sz-config-section
145
+ title="DNS Server"
146
+ subtitle="Authoritative DNS with smartdns"
147
+ icon="lucide:globe"
148
+ status="enabled"
149
+ .fields=${dnsFields}
150
+ ></sz-config-section>
151
+
152
+ <sz-config-section
153
+ title="TLS / Certificates"
154
+ subtitle="Certificate management and ACME"
155
+ icon="lucide:shield-check"
156
+ status="enabled"
157
+ .fields=${tlsFields}
158
+ ></sz-config-section>
159
+
160
+ <sz-config-section
161
+ title="Cache Database"
162
+ subtitle="Persistent caching with smartdata"
163
+ icon="lucide:database"
164
+ status="enabled"
165
+ .fields=${cacheFields}
166
+ ></sz-config-section>
167
+
168
+ <sz-config-section
169
+ title="RADIUS Server"
170
+ subtitle="Network authentication and VLAN assignment"
171
+ icon="lucide:wifi"
172
+ status="not-configured"
173
+ .fields=${radiusFields}
174
+ ></sz-config-section>
175
+
176
+ <sz-config-section
177
+ title="Remote Ingress"
178
+ subtitle="Edge tunnel nodes"
179
+ icon="lucide:cloud"
180
+ status="enabled"
181
+ .fields=${remoteIngressFields}
182
+ ></sz-config-section>
183
+ </sz-config-overview>
184
+ `;
185
+ }
186
+ static {
187
+ __runInitializers(_classThis, _classExtraInitializers);
188
+ }
189
+ };
190
+ return SzDemoViewConfig = _classThis;
191
+ })();
192
+ export { SzDemoViewConfig };
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3otZGVtby12aWV3LWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9zei1kZW1vLXZpZXctY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGFBQWEsRUFDYixJQUFJLEVBQ0osR0FBRyxFQUNILFVBQVUsR0FFWCxNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sWUFBWSxDQUFDO0lBU1AsZ0JBQWdCOzRCQUQ1QixhQUFhLENBQUMscUJBQXFCLENBQUM7Ozs7c0JBQ0MsV0FBVztnQ0FBbkIsU0FBUSxXQUFXOzs7O1lBQWpELDZLQWlKQzs7OztRQWhKUSxNQUFNLENBQUMsTUFBTSxHQUFHO1lBQ3JCLFVBQVUsQ0FBQyxhQUFhO1lBQ3hCLEdBQUcsQ0FBQTs7Ozs7Ozs7S0FRRjtTQUNGLENBQUM7UUFFSyxNQUFNO1lBQ1gsTUFBTSxZQUFZLEdBQW1CO2dCQUNuQyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsaUNBQWlDLEVBQUU7Z0JBQ25FLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxzQ0FBc0MsRUFBRTtnQkFDeEUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUU7Z0JBQzNDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtnQkFDNUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUU7Z0JBQ3RDLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTthQUMvRCxDQUFDO1lBRUYsTUFBTSxXQUFXLEdBQW1C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
@@ -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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