@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,648 @@
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
+ function formatPorts(ports) {
37
+ if (typeof ports === 'number')
38
+ return String(ports);
39
+ if (Array.isArray(ports)) {
40
+ return ports
41
+ .map((p) => {
42
+ if (typeof p === 'number')
43
+ return String(p);
44
+ return `${p.from}\u2013${p.to}`;
45
+ })
46
+ .join(', ');
47
+ }
48
+ return String(ports);
49
+ }
50
+ function formatTargets(targets) {
51
+ const result = [];
52
+ for (const t of targets) {
53
+ const hosts = Array.isArray(t.host) ? t.host : [t.host];
54
+ const portStr = t.port === 'preserve' ? '(preserve)' : String(t.port);
55
+ for (const h of hosts) {
56
+ result.push(`${h}:${portStr}`);
57
+ }
58
+ }
59
+ return result;
60
+ }
61
+ let SzRouteCard = (() => {
62
+ let _classDecorators = [customElement('sz-route-card')];
63
+ let _classDescriptor;
64
+ let _classExtraInitializers = [];
65
+ let _classThis;
66
+ let _classSuper = DeesElement;
67
+ let _route_decorators;
68
+ let _route_initializers = [];
69
+ let _route_extraInitializers = [];
70
+ var SzRouteCard = class extends _classSuper {
71
+ static { _classThis = this; }
72
+ static {
73
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
74
+ _route_decorators = [property({ type: Object })];
75
+ __esDecorate(this, null, _route_decorators, { kind: "accessor", name: "route", static: false, private: false, access: { has: obj => "route" in obj, get: obj => obj.route, set: (obj, value) => { obj.route = value; } }, metadata: _metadata }, _route_initializers, _route_extraInitializers);
76
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
77
+ SzRouteCard = _classThis = _classDescriptor.value;
78
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
79
+ }
80
+ static demo = () => html `
81
+ <div style="padding: 24px; max-width: 520px;">
82
+ <sz-route-card
83
+ .route=${{
84
+ name: 'API Gateway',
85
+ description: 'Main API gateway with TLS termination and load balancing',
86
+ enabled: true,
87
+ priority: 10,
88
+ tags: ['web', 'api', 'production'],
89
+ match: {
90
+ ports: [443, 8443],
91
+ domains: ['api.example.com', '*.api.serve.zone'],
92
+ path: '/api/*',
93
+ protocol: 'http',
94
+ clientIp: ['10.0.0.0/8'],
95
+ },
96
+ action: {
97
+ type: 'forward',
98
+ targets: [
99
+ { host: ['10.0.0.1', '10.0.0.2'], port: 8080 },
100
+ ],
101
+ tls: { mode: 'terminate', certificate: 'auto' },
102
+ websocket: { enabled: true },
103
+ loadBalancing: { algorithm: 'round-robin' },
104
+ forwardingEngine: 'nftables',
105
+ },
106
+ security: {
107
+ ipAllowList: ['10.0.0.0/8'],
108
+ ipBlockList: ['192.168.100.0/24'],
109
+ rateLimit: { enabled: true, maxRequests: 100, window: 60 },
110
+ maxConnections: 1000,
111
+ },
112
+ }}
113
+ ></sz-route-card>
114
+ </div>
115
+ `;
116
+ static demoGroups = ['Routes'];
117
+ #route_accessor_storage = __runInitializers(this, _route_initializers, null);
118
+ get route() { return this.#route_accessor_storage; }
119
+ set route(value) { this.#route_accessor_storage = value; }
120
+ static styles = [
121
+ cssManager.defaultStyles,
122
+ css `
123
+ :host {
124
+ display: block;
125
+ }
126
+
127
+ .card {
128
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
129
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
130
+ border-radius: 8px;
131
+ padding: 20px;
132
+ transition: border-color 200ms ease, box-shadow 200ms ease;
133
+ }
134
+
135
+ .card:hover {
136
+ border-color: ${cssManager.bdTheme('#d4d4d8', '#3f3f46')};
137
+ box-shadow: 0 2px 8px ${cssManager.bdTheme('rgba(0,0,0,0.06)', 'rgba(0,0,0,0.2)')};
138
+ }
139
+
140
+ /* Header */
141
+ .header {
142
+ display: flex;
143
+ align-items: flex-start;
144
+ justify-content: space-between;
145
+ gap: 12px;
146
+ margin-bottom: 4px;
147
+ }
148
+
149
+ .header-left {
150
+ display: flex;
151
+ align-items: center;
152
+ gap: 8px;
153
+ min-width: 0;
154
+ }
155
+
156
+ .status-dot {
157
+ width: 8px;
158
+ height: 8px;
159
+ border-radius: 50%;
160
+ flex-shrink: 0;
161
+ }
162
+
163
+ .status-dot.enabled {
164
+ background: ${cssManager.bdTheme('#22c55e', '#22c55e')};
165
+ box-shadow: 0 0 6px ${cssManager.bdTheme('rgba(34,197,94,0.4)', 'rgba(34,197,94,0.3)')};
166
+ }
167
+
168
+ .status-dot.disabled {
169
+ background: ${cssManager.bdTheme('#a1a1aa', '#52525b')};
170
+ }
171
+
172
+ .route-name {
173
+ font-size: 15px;
174
+ font-weight: 600;
175
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
176
+ white-space: nowrap;
177
+ overflow: hidden;
178
+ text-overflow: ellipsis;
179
+ }
180
+
181
+ .header-badges {
182
+ display: flex;
183
+ gap: 6px;
184
+ flex-shrink: 0;
185
+ }
186
+
187
+ .badge {
188
+ display: inline-flex;
189
+ align-items: center;
190
+ padding: 2px 8px;
191
+ border-radius: 9999px;
192
+ font-size: 11px;
193
+ font-weight: 500;
194
+ white-space: nowrap;
195
+ }
196
+
197
+ .badge.forward {
198
+ background: ${cssManager.bdTheme('#dbeafe', 'rgba(59, 130, 246, 0.2)')};
199
+ color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
200
+ }
201
+
202
+ .badge.socket-handler {
203
+ background: ${cssManager.bdTheme('#ede9fe', 'rgba(139, 92, 246, 0.2)')};
204
+ color: ${cssManager.bdTheme('#7c3aed', '#a78bfa')};
205
+ }
206
+
207
+ .badge.enabled {
208
+ background: ${cssManager.bdTheme('#dcfce7', 'rgba(34, 197, 94, 0.2)')};
209
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
210
+ }
211
+
212
+ .badge.disabled {
213
+ background: ${cssManager.bdTheme('#f4f4f5', 'rgba(113, 113, 122, 0.2)')};
214
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
215
+ }
216
+
217
+ .description {
218
+ font-size: 13px;
219
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
220
+ margin-bottom: 8px;
221
+ line-height: 1.4;
222
+ }
223
+
224
+ .meta-row {
225
+ display: flex;
226
+ align-items: center;
227
+ justify-content: space-between;
228
+ flex-wrap: wrap;
229
+ gap: 6px;
230
+ margin-bottom: 16px;
231
+ }
232
+
233
+ .tags {
234
+ display: flex;
235
+ flex-wrap: wrap;
236
+ gap: 4px;
237
+ }
238
+
239
+ .tag {
240
+ padding: 2px 8px;
241
+ background: ${cssManager.bdTheme('#f4f4f5', '#27272a')};
242
+ border-radius: 4px;
243
+ font-size: 11px;
244
+ font-weight: 500;
245
+ color: ${cssManager.bdTheme('#52525b', '#a1a1aa')};
246
+ }
247
+
248
+ .priority {
249
+ font-size: 11px;
250
+ color: ${cssManager.bdTheme('#a1a1aa', '#71717a')};
251
+ font-weight: 500;
252
+ }
253
+
254
+ /* Sections */
255
+ .section {
256
+ border-left: 3px solid;
257
+ padding: 10px 14px;
258
+ margin-bottom: 12px;
259
+ border-radius: 0 6px 6px 0;
260
+ background: ${cssManager.bdTheme('#fafafa', '#0a0a0a')};
261
+ }
262
+
263
+ .section:last-of-type {
264
+ margin-bottom: 0;
265
+ }
266
+
267
+ .section.match {
268
+ border-left-color: ${cssManager.bdTheme('#3b82f6', '#3b82f6')};
269
+ }
270
+
271
+ .section.action {
272
+ border-left-color: ${cssManager.bdTheme('#22c55e', '#22c55e')};
273
+ }
274
+
275
+ .section.security {
276
+ border-left-color: ${cssManager.bdTheme('#f59e0b', '#f59e0b')};
277
+ }
278
+
279
+ .section-label {
280
+ font-size: 10px;
281
+ font-weight: 600;
282
+ text-transform: uppercase;
283
+ letter-spacing: 0.08em;
284
+ color: ${cssManager.bdTheme('#a1a1aa', '#71717a')};
285
+ margin-bottom: 8px;
286
+ }
287
+
288
+ .field-row {
289
+ display: flex;
290
+ gap: 8px;
291
+ margin-bottom: 5px;
292
+ font-size: 13px;
293
+ line-height: 1.5;
294
+ }
295
+
296
+ .field-row:last-child {
297
+ margin-bottom: 0;
298
+ }
299
+
300
+ .field-key {
301
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
302
+ min-width: 64px;
303
+ flex-shrink: 0;
304
+ font-weight: 500;
305
+ }
306
+
307
+ .field-value {
308
+ color: ${cssManager.bdTheme('#18181b', '#e4e4e7')};
309
+ word-break: break-all;
310
+ }
311
+
312
+ .domain-chip {
313
+ display: inline-flex;
314
+ padding: 1px 6px;
315
+ background: ${cssManager.bdTheme('#eff6ff', 'rgba(59, 130, 246, 0.1)')};
316
+ border-radius: 3px;
317
+ font-size: 12px;
318
+ margin-right: 4px;
319
+ margin-bottom: 2px;
320
+ font-family: monospace;
321
+ }
322
+
323
+ .domain-chip.glob {
324
+ background: ${cssManager.bdTheme('#fef3c7', 'rgba(245, 158, 11, 0.15)')};
325
+ color: ${cssManager.bdTheme('#92400e', '#fbbf24')};
326
+ }
327
+
328
+ .mono {
329
+ font-family: monospace;
330
+ font-size: 12px;
331
+ }
332
+
333
+ .protocol-badge {
334
+ display: inline-flex;
335
+ padding: 1px 6px;
336
+ border-radius: 3px;
337
+ font-size: 11px;
338
+ font-weight: 500;
339
+ }
340
+
341
+ .protocol-badge.http {
342
+ background: ${cssManager.bdTheme('#dbeafe', 'rgba(59, 130, 246, 0.2)')};
343
+ color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
344
+ }
345
+
346
+ .protocol-badge.tcp {
347
+ background: ${cssManager.bdTheme('#dcfce7', 'rgba(34, 197, 94, 0.2)')};
348
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
349
+ }
350
+
351
+ .tls-badge {
352
+ display: inline-flex;
353
+ padding: 1px 6px;
354
+ border-radius: 3px;
355
+ font-size: 11px;
356
+ font-weight: 500;
357
+ }
358
+
359
+ .tls-badge.auto {
360
+ background: ${cssManager.bdTheme('#dcfce7', 'rgba(34, 197, 94, 0.2)')};
361
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
362
+ }
363
+
364
+ .tls-badge.custom {
365
+ background: ${cssManager.bdTheme('#ffedd5', 'rgba(249, 115, 22, 0.2)')};
366
+ color: ${cssManager.bdTheme('#c2410c', '#fb923c')};
367
+ }
368
+
369
+ .engine-badge {
370
+ display: inline-flex;
371
+ padding: 1px 6px;
372
+ border-radius: 3px;
373
+ font-size: 11px;
374
+ font-weight: 500;
375
+ background: ${cssManager.bdTheme('#fae8ff', 'rgba(168, 85, 247, 0.2)')};
376
+ color: ${cssManager.bdTheme('#7e22ce', '#c084fc')};
377
+ }
378
+
379
+ .header-pair {
380
+ display: inline;
381
+ font-family: monospace;
382
+ font-size: 12px;
383
+ }
384
+
385
+ /* Feature icons */
386
+ .features-row {
387
+ display: flex;
388
+ flex-wrap: wrap;
389
+ gap: 10px;
390
+ margin-top: 14px;
391
+ padding-top: 12px;
392
+ border-top: 1px solid ${cssManager.bdTheme('#f4f4f5', '#1a1a1a')};
393
+ }
394
+
395
+ .feature {
396
+ display: flex;
397
+ align-items: center;
398
+ gap: 4px;
399
+ font-size: 11px;
400
+ font-weight: 500;
401
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
402
+ }
403
+
404
+ .feature-icon {
405
+ font-size: 13px;
406
+ }
407
+
408
+ .no-route {
409
+ text-align: center;
410
+ padding: 24px;
411
+ color: ${cssManager.bdTheme('#a1a1aa', '#52525b')};
412
+ font-size: 13px;
413
+ }
414
+ `,
415
+ ];
416
+ render() {
417
+ if (!this.route) {
418
+ return html `<div class="card"><div class="no-route">No route data</div></div>`;
419
+ }
420
+ const r = this.route;
421
+ const isEnabled = r.enabled !== false;
422
+ const match = r.match;
423
+ const action = r.action;
424
+ const security = r.security;
425
+ return html `
426
+ <div class="card">
427
+ <!-- Header -->
428
+ <div class="header">
429
+ <div class="header-left">
430
+ <span class="status-dot ${isEnabled ? 'enabled' : 'disabled'}"></span>
431
+ <span class="route-name">${r.name || r.id || 'Unnamed Route'}</span>
432
+ </div>
433
+ <div class="header-badges">
434
+ <span class="badge ${action.type}">${action.type}</span>
435
+ <span class="badge ${isEnabled ? 'enabled' : 'disabled'}">${isEnabled ? 'enabled' : 'disabled'}</span>
436
+ </div>
437
+ </div>
438
+
439
+ ${r.description ? html `<div class="description">${r.description}</div>` : ''}
440
+
441
+ <div class="meta-row">
442
+ ${r.tags && r.tags.length > 0
443
+ ? html `<div class="tags">${r.tags.map((t) => html `<span class="tag">${t}</span>`)}</div>`
444
+ : html `<div></div>`}
445
+ ${r.priority != null ? html `<span class="priority">Priority: ${r.priority}</span>` : ''}
446
+ </div>
447
+
448
+ <!-- Match Section -->
449
+ <div class="section match">
450
+ <div class="section-label">Match</div>
451
+ <div class="field-row">
452
+ <span class="field-key">Ports</span>
453
+ <span class="field-value mono">${formatPorts(match.ports)}</span>
454
+ </div>
455
+ ${match.domains
456
+ ? html `
457
+ <div class="field-row">
458
+ <span class="field-key">Domains</span>
459
+ <span class="field-value">${this.renderDomains(match.domains)}</span>
460
+ </div>
461
+ `
462
+ : ''}
463
+ ${match.path
464
+ ? html `
465
+ <div class="field-row">
466
+ <span class="field-key">Path</span>
467
+ <span class="field-value mono">${match.path}</span>
468
+ </div>
469
+ `
470
+ : ''}
471
+ ${match.protocol
472
+ ? html `
473
+ <div class="field-row">
474
+ <span class="field-key">Protocol</span>
475
+ <span class="field-value">
476
+ <span class="protocol-badge ${match.protocol}">${match.protocol}</span>
477
+ </span>
478
+ </div>
479
+ `
480
+ : ''}
481
+ ${match.clientIp && match.clientIp.length > 0
482
+ ? html `
483
+ <div class="field-row">
484
+ <span class="field-key">Client</span>
485
+ <span class="field-value mono">${match.clientIp.join(', ')}</span>
486
+ </div>
487
+ `
488
+ : ''}
489
+ ${match.tlsVersion && match.tlsVersion.length > 0
490
+ ? html `
491
+ <div class="field-row">
492
+ <span class="field-key">TLS Ver</span>
493
+ <span class="field-value">${match.tlsVersion.join(', ')}</span>
494
+ </div>
495
+ `
496
+ : ''}
497
+ ${match.headers
498
+ ? html `
499
+ <div class="field-row">
500
+ <span class="field-key">Headers</span>
501
+ <span class="field-value">
502
+ ${Object.entries(match.headers).map(([k, v]) => html `<span class="header-pair">${k}=${v}</span> `)}
503
+ </span>
504
+ </div>
505
+ `
506
+ : ''}
507
+ </div>
508
+
509
+ <!-- Action Section -->
510
+ <div class="section action">
511
+ <div class="section-label">Action</div>
512
+ ${action.targets && action.targets.length > 0
513
+ ? html `
514
+ <div class="field-row">
515
+ <span class="field-key">Targets</span>
516
+ <span class="field-value mono">${formatTargets(action.targets).join(', ')}</span>
517
+ </div>
518
+ `
519
+ : ''}
520
+ ${action.tls
521
+ ? html `
522
+ <div class="field-row">
523
+ <span class="field-key">TLS</span>
524
+ <span class="field-value">
525
+ ${action.tls.mode}
526
+ ${action.tls.certificate
527
+ ? action.tls.certificate === 'auto'
528
+ ? html ` <span class="tls-badge auto">auto cert</span>`
529
+ : html ` <span class="tls-badge custom">custom cert</span>`
530
+ : ''}
531
+ </span>
532
+ </div>
533
+ `
534
+ : ''}
535
+ ${action.forwardingEngine
536
+ ? html `
537
+ <div class="field-row">
538
+ <span class="field-key">Engine</span>
539
+ <span class="field-value"><span class="engine-badge">${action.forwardingEngine}</span></span>
540
+ </div>
541
+ `
542
+ : ''}
543
+ ${action.loadBalancing
544
+ ? html `
545
+ <div class="field-row">
546
+ <span class="field-key">LB</span>
547
+ <span class="field-value">${action.loadBalancing.algorithm}</span>
548
+ </div>
549
+ `
550
+ : ''}
551
+ ${action.websocket?.enabled
552
+ ? html `
553
+ <div class="field-row">
554
+ <span class="field-key">WS</span>
555
+ <span class="field-value"><span class="badge enabled">enabled</span></span>
556
+ </div>
557
+ `
558
+ : ''}
559
+ </div>
560
+
561
+ <!-- Security Section -->
562
+ ${security
563
+ ? html `
564
+ <div class="section security">
565
+ <div class="section-label">Security</div>
566
+ ${security.ipAllowList && security.ipAllowList.length > 0
567
+ ? html `
568
+ <div class="field-row">
569
+ <span class="field-key">Allow</span>
570
+ <span class="field-value mono">${security.ipAllowList.join(', ')}</span>
571
+ </div>
572
+ `
573
+ : ''}
574
+ ${security.ipBlockList && security.ipBlockList.length > 0
575
+ ? html `
576
+ <div class="field-row">
577
+ <span class="field-key">Block</span>
578
+ <span class="field-value mono">${security.ipBlockList.join(', ')}</span>
579
+ </div>
580
+ `
581
+ : ''}
582
+ ${security.rateLimit?.enabled
583
+ ? html `
584
+ <div class="field-row">
585
+ <span class="field-key">Rate</span>
586
+ <span class="field-value">${security.rateLimit.maxRequests} req / ${security.rateLimit.window}s</span>
587
+ </div>
588
+ `
589
+ : ''}
590
+ ${security.maxConnections
591
+ ? html `
592
+ <div class="field-row">
593
+ <span class="field-key">Max Conn</span>
594
+ <span class="field-value">${security.maxConnections}</span>
595
+ </div>
596
+ `
597
+ : ''}
598
+ </div>
599
+ `
600
+ : ''}
601
+
602
+ <!-- Feature Icons Row -->
603
+ ${this.renderFeatures()}
604
+ </div>
605
+ `;
606
+ }
607
+ renderDomains(domains) {
608
+ const list = Array.isArray(domains) ? domains : [domains];
609
+ return html `${list.map((d) => html `<span class="domain-chip ${d.includes('*') ? 'glob' : ''}">${d}</span>`)}`;
610
+ }
611
+ renderFeatures() {
612
+ if (!this.route)
613
+ return html ``;
614
+ const features = [];
615
+ const action = this.route.action;
616
+ const security = this.route.security;
617
+ const headers = this.route.headers;
618
+ if (action.tls) {
619
+ features.push(html `<span class="feature"><span class="feature-icon">&#x1f512;</span>TLS</span>`);
620
+ }
621
+ if (action.websocket?.enabled) {
622
+ features.push(html `<span class="feature"><span class="feature-icon">&#x2194;</span>WS</span>`);
623
+ }
624
+ if (action.loadBalancing) {
625
+ features.push(html `<span class="feature"><span class="feature-icon">&#x2696;</span>LB</span>`);
626
+ }
627
+ if (security) {
628
+ features.push(html `<span class="feature"><span class="feature-icon">&#x1f6e1;</span>Security</span>`);
629
+ }
630
+ if (headers) {
631
+ features.push(html `<span class="feature"><span class="feature-icon">&#x2699;</span>Headers</span>`);
632
+ }
633
+ if (features.length === 0)
634
+ return html ``;
635
+ return html `<div class="features-row">${features}</div>`;
636
+ }
637
+ constructor() {
638
+ super(...arguments);
639
+ __runInitializers(this, _route_extraInitializers);
640
+ }
641
+ static {
642
+ __runInitializers(_classThis, _classExtraInitializers);
643
+ }
644
+ };
645
+ return SzRouteCard = _classThis;
646
+ })();
647
+ export { SzRouteCard };
648
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3otcm91dGUtY2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9zei1yb3V0ZS1jYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGFBQWEsRUFDYixJQUFJLEVBQ0osR0FBRyxFQUNILFVBQVUsRUFDVixRQUFRLEdBRVQsTUFBTSw2QkFBNkIsQ0FBQztBQThEckMsU0FBUyxXQUFXLENBQUMsS0FBaUI7SUFDcEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLO2FBQ1QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDVCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLE9BQXVCO0lBQzVDLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FB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
@@ -0,0 +1,21 @@
1
+ import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
2
+ import type { IRouteConfig } from './sz-route-card.js';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'sz-route-list-view': SzRouteListView;
6
+ }
7
+ }
8
+ export declare class SzRouteListView extends DeesElement {
9
+ static demo: () => TemplateResult<1>;
10
+ static demoGroups: string[];
11
+ accessor routes: IRouteConfig[];
12
+ private accessor searchQuery;
13
+ private accessor actionFilter;
14
+ private accessor enabledFilter;
15
+ private get filteredRoutes();
16
+ private routeMatchesSearch;
17
+ private formatPortsForSearch;
18
+ static styles: import("@design.estate/dees-element").CSSResult[];
19
+ render(): TemplateResult;
20
+ private handleRouteClick;
21
+ }