@serve.zone/catalog 1.0.1

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.
Files changed (122) hide show
  1. package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
  2. package/dist_ts_web/00_commitinfo_data.js +9 -0
  3. package/dist_ts_web/elements/index.d.ts +33 -0
  4. package/dist_ts_web/elements/index.js +45 -0
  5. package/dist_ts_web/elements/sz-certificates-card.d.ts +14 -0
  6. package/dist_ts_web/elements/sz-certificates-card.js +210 -0
  7. package/dist_ts_web/elements/sz-dashboard-view.d.ts +33 -0
  8. package/dist_ts_web/elements/sz-dashboard-view.js +242 -0
  9. package/dist_ts_web/elements/sz-demo-view-dashboard.d.ts +18 -0
  10. package/dist_ts_web/elements/sz-demo-view-dashboard.js +184 -0
  11. package/dist_ts_web/elements/sz-demo-view-network.d.ts +32 -0
  12. package/dist_ts_web/elements/sz-demo-view-network.js +384 -0
  13. package/dist_ts_web/elements/sz-demo-view-registries.d.ts +22 -0
  14. package/dist_ts_web/elements/sz-demo-view-registries.js +240 -0
  15. package/dist_ts_web/elements/sz-demo-view-services.d.ts +32 -0
  16. package/dist_ts_web/elements/sz-demo-view-services.js +468 -0
  17. package/dist_ts_web/elements/sz-demo-view-settings.d.ts +19 -0
  18. package/dist_ts_web/elements/sz-demo-view-settings.js +151 -0
  19. package/dist_ts_web/elements/sz-demo-view-tokens.d.ts +20 -0
  20. package/dist_ts_web/elements/sz-demo-view-tokens.js +141 -0
  21. package/dist_ts_web/elements/sz-dns-ssl-card.d.ts +13 -0
  22. package/dist_ts_web/elements/sz-dns-ssl-card.js +180 -0
  23. package/dist_ts_web/elements/sz-domain-detail-view.d.ts +48 -0
  24. package/dist_ts_web/elements/sz-domain-detail-view.js +789 -0
  25. package/dist_ts_web/elements/sz-login-view.d.ts +18 -0
  26. package/dist_ts_web/elements/sz-login-view.js +384 -0
  27. package/dist_ts_web/elements/sz-network-dns-view.d.ts +20 -0
  28. package/dist_ts_web/elements/sz-network-dns-view.js +244 -0
  29. package/dist_ts_web/elements/sz-network-domains-view.d.ts +28 -0
  30. package/dist_ts_web/elements/sz-network-domains-view.js +312 -0
  31. package/dist_ts_web/elements/sz-network-proxy-view.d.ts +39 -0
  32. package/dist_ts_web/elements/sz-network-proxy-view.js +510 -0
  33. package/dist_ts_web/elements/sz-platform-service-detail-view.d.ts +49 -0
  34. package/dist_ts_web/elements/sz-platform-service-detail-view.js +733 -0
  35. package/dist_ts_web/elements/sz-platform-services-card.d.ts +19 -0
  36. package/dist_ts_web/elements/sz-platform-services-card.js +196 -0
  37. package/dist_ts_web/elements/sz-quick-actions-card.d.ts +19 -0
  38. package/dist_ts_web/elements/sz-quick-actions-card.js +194 -0
  39. package/dist_ts_web/elements/sz-registry-external-view.d.ts +22 -0
  40. package/dist_ts_web/elements/sz-registry-external-view.js +313 -0
  41. package/dist_ts_web/elements/sz-registry-onebox-view.d.ts +14 -0
  42. package/dist_ts_web/elements/sz-registry-onebox-view.js +307 -0
  43. package/dist_ts_web/elements/sz-resource-usage-card.d.ts +25 -0
  44. package/dist_ts_web/elements/sz-resource-usage-card.js +323 -0
  45. package/dist_ts_web/elements/sz-reverse-proxy-card.d.ts +16 -0
  46. package/dist_ts_web/elements/sz-reverse-proxy-card.js +216 -0
  47. package/dist_ts_web/elements/sz-service-create-view.d.ts +67 -0
  48. package/dist_ts_web/elements/sz-service-create-view.js +828 -0
  49. package/dist_ts_web/elements/sz-service-detail-view.d.ts +57 -0
  50. package/dist_ts_web/elements/sz-service-detail-view.js +728 -0
  51. package/dist_ts_web/elements/sz-services-backups-view.d.ts +37 -0
  52. package/dist_ts_web/elements/sz-services-backups-view.js +413 -0
  53. package/dist_ts_web/elements/sz-services-list-view.d.ts +20 -0
  54. package/dist_ts_web/elements/sz-services-list-view.js +272 -0
  55. package/dist_ts_web/elements/sz-settings-view.d.ts +30 -0
  56. package/dist_ts_web/elements/sz-settings-view.js +448 -0
  57. package/dist_ts_web/elements/sz-stat-card.d.ts +17 -0
  58. package/dist_ts_web/elements/sz-stat-card.js +249 -0
  59. package/dist_ts_web/elements/sz-status-grid-cluster.d.ts +19 -0
  60. package/dist_ts_web/elements/sz-status-grid-cluster.js +142 -0
  61. package/dist_ts_web/elements/sz-status-grid-infra.d.ts +17 -0
  62. package/dist_ts_web/elements/sz-status-grid-infra.js +140 -0
  63. package/dist_ts_web/elements/sz-status-grid-network.d.ts +30 -0
  64. package/dist_ts_web/elements/sz-status-grid-network.js +190 -0
  65. package/dist_ts_web/elements/sz-status-grid-services.d.ts +17 -0
  66. package/dist_ts_web/elements/sz-status-grid-services.js +145 -0
  67. package/dist_ts_web/elements/sz-tokens-view.d.ts +26 -0
  68. package/dist_ts_web/elements/sz-tokens-view.js +344 -0
  69. package/dist_ts_web/elements/sz-traffic-card.d.ts +24 -0
  70. package/dist_ts_web/elements/sz-traffic-card.js +255 -0
  71. package/dist_ts_web/index.d.ts +2 -0
  72. package/dist_ts_web/index.js +3 -0
  73. package/dist_ts_web/pages/index.d.ts +3 -0
  74. package/dist_ts_web/pages/index.js +4 -0
  75. package/dist_ts_web/pages/mainpage.d.ts +1 -0
  76. package/dist_ts_web/pages/mainpage.js +46 -0
  77. package/dist_ts_web/pages/sz-demo-app-shell.d.ts +13 -0
  78. package/dist_ts_web/pages/sz-demo-app-shell.js +212 -0
  79. package/dist_ts_web/pages/sz-demo-app.d.ts +2 -0
  80. package/dist_ts_web/pages/sz-demo-app.js +20 -0
  81. package/npmextra.json +24 -0
  82. package/package.json +45 -0
  83. package/ts_web/00_commitinfo_data.ts +8 -0
  84. package/ts_web/elements/index.ts +54 -0
  85. package/ts_web/elements/sz-certificates-card.ts +155 -0
  86. package/ts_web/elements/sz-dashboard-view.ts +217 -0
  87. package/ts_web/elements/sz-demo-view-dashboard.ts +150 -0
  88. package/ts_web/elements/sz-demo-view-network.ts +354 -0
  89. package/ts_web/elements/sz-demo-view-registries.ts +206 -0
  90. package/ts_web/elements/sz-demo-view-services.ts +434 -0
  91. package/ts_web/elements/sz-demo-view-settings.ts +118 -0
  92. package/ts_web/elements/sz-demo-view-tokens.ts +109 -0
  93. package/ts_web/elements/sz-dns-ssl-card.ts +130 -0
  94. package/ts_web/elements/sz-domain-detail-view.ts +766 -0
  95. package/ts_web/elements/sz-login-view.ts +329 -0
  96. package/ts_web/elements/sz-network-dns-view.ts +208 -0
  97. package/ts_web/elements/sz-network-domains-view.ts +273 -0
  98. package/ts_web/elements/sz-network-proxy-view.ts +456 -0
  99. package/ts_web/elements/sz-platform-service-detail-view.ts +714 -0
  100. package/ts_web/elements/sz-platform-services-card.ts +163 -0
  101. package/ts_web/elements/sz-quick-actions-card.ts +161 -0
  102. package/ts_web/elements/sz-registry-external-view.ts +279 -0
  103. package/ts_web/elements/sz-registry-onebox-view.ts +258 -0
  104. package/ts_web/elements/sz-resource-usage-card.ts +284 -0
  105. package/ts_web/elements/sz-reverse-proxy-card.ts +151 -0
  106. package/ts_web/elements/sz-service-create-view.ts +773 -0
  107. package/ts_web/elements/sz-service-detail-view.ts +710 -0
  108. package/ts_web/elements/sz-services-backups-view.ts +390 -0
  109. package/ts_web/elements/sz-services-list-view.ts +237 -0
  110. package/ts_web/elements/sz-settings-view.ts +417 -0
  111. package/ts_web/elements/sz-stat-card.ts +187 -0
  112. package/ts_web/elements/sz-status-grid-cluster.ts +105 -0
  113. package/ts_web/elements/sz-status-grid-infra.ts +88 -0
  114. package/ts_web/elements/sz-status-grid-network.ts +152 -0
  115. package/ts_web/elements/sz-status-grid-services.ts +99 -0
  116. package/ts_web/elements/sz-tokens-view.ts +308 -0
  117. package/ts_web/elements/sz-traffic-card.ts +222 -0
  118. package/ts_web/index.ts +2 -0
  119. package/ts_web/pages/index.ts +3 -0
  120. package/ts_web/pages/mainpage.ts +46 -0
  121. package/ts_web/pages/sz-demo-app-shell.ts +179 -0
  122. package/ts_web/pages/sz-demo-app.ts +20 -0
@@ -0,0 +1,354 @@
1
+ import {
2
+ DeesElement,
3
+ customElement,
4
+ html,
5
+ css,
6
+ cssManager,
7
+ state,
8
+ type TemplateResult,
9
+ } from '@design.estate/dees-element';
10
+ import type { DeesAppui } from '@design.estate/dees-catalog';
11
+ import './index.js';
12
+
13
+ declare global {
14
+ interface HTMLElementTagNameMap {
15
+ 'sz-demo-view-network': SzDemoViewNetwork;
16
+ }
17
+ }
18
+
19
+ @customElement('sz-demo-view-network')
20
+ export class SzDemoViewNetwork extends DeesElement {
21
+ private appui: DeesAppui | null = null;
22
+
23
+ @state()
24
+ private accessor currentTab: 'proxy' | 'dns' | 'domains' | 'domain-detail' = 'proxy';
25
+
26
+ async onActivate(context: { appui: DeesAppui; viewId: string }) {
27
+ this.appui = context.appui;
28
+
29
+ // Set up content tabs
30
+ this.appui.setContentTabs([
31
+ {
32
+ key: 'Reverse Proxy',
33
+ action: () => {
34
+ this.currentTab = 'proxy';
35
+ this.updateSecondaryMenu();
36
+ },
37
+ },
38
+ {
39
+ key: 'DNS Records',
40
+ action: () => {
41
+ this.currentTab = 'dns';
42
+ this.updateSecondaryMenu();
43
+ },
44
+ },
45
+ {
46
+ key: 'Domains',
47
+ action: () => {
48
+ this.currentTab = 'domains';
49
+ this.updateSecondaryMenu();
50
+ },
51
+ },
52
+ ]);
53
+
54
+ this.updateSecondaryMenu();
55
+ }
56
+
57
+ private updateSecondaryMenu() {
58
+ if (!this.appui) return;
59
+
60
+ if (this.currentTab === 'proxy') {
61
+ this.appui.setSecondaryMenu({
62
+ heading: 'Reverse Proxy',
63
+ groups: [
64
+ {
65
+ name: 'Actions',
66
+ items: [
67
+ { type: 'action', key: 'Add Route', iconName: 'lucide:Plus', action: () => { console.log('Add route'); } },
68
+ { type: 'action', key: 'Refresh', iconName: 'lucide:RefreshCw', action: () => { console.log('Refresh'); } },
69
+ ],
70
+ },
71
+ {
72
+ name: 'Statistics',
73
+ items: [
74
+ { type: 'header', label: '42 Active Connections' },
75
+ { type: 'header', label: '15,420 Requests Today' },
76
+ ],
77
+ },
78
+ ],
79
+ });
80
+ } else if (this.currentTab === 'dns') {
81
+ this.appui.setSecondaryMenu({
82
+ heading: 'DNS Records',
83
+ groups: [
84
+ {
85
+ name: 'Actions',
86
+ items: [
87
+ { type: 'action', key: 'Add Record', iconName: 'lucide:Plus', action: () => { console.log('Add record'); } },
88
+ { type: 'action', key: 'Import Zone', iconName: 'lucide:Upload', action: () => { console.log('Import zone'); } },
89
+ ],
90
+ },
91
+ {
92
+ name: 'Zones',
93
+ items: [
94
+ { key: 'example.com', iconName: 'lucide:Globe', action: () => { console.log('Select example.com'); } },
95
+ { key: 'example.net', iconName: 'lucide:Globe', action: () => { console.log('Select example.net'); } },
96
+ { key: 'myapp.io', iconName: 'lucide:Globe', action: () => { console.log('Select myapp.io'); } },
97
+ ],
98
+ },
99
+ ],
100
+ });
101
+ } else if (this.currentTab === 'domains' || this.currentTab === 'domain-detail') {
102
+ this.appui.setSecondaryMenu({
103
+ heading: 'Domains',
104
+ groups: [
105
+ {
106
+ name: 'Actions',
107
+ items: [
108
+ { type: 'action', key: 'Add Domain', iconName: 'lucide:Plus', action: () => { console.log('Add domain'); } },
109
+ { type: 'action', key: 'Verify All', iconName: 'lucide:CheckCircle', action: () => { console.log('Verify all'); } },
110
+ ],
111
+ },
112
+ {
113
+ name: 'Certificates',
114
+ items: [
115
+ { key: 'Valid', iconName: 'lucide:ShieldCheck', badge: '3', badgeVariant: 'success', action: () => { console.log('Filter valid'); } },
116
+ { key: 'Expiring Soon', iconName: 'lucide:AlertTriangle', badge: '1', badgeVariant: 'warning', action: () => { console.log('Filter expiring'); } },
117
+ ],
118
+ },
119
+ ],
120
+ });
121
+ }
122
+ }
123
+
124
+ onDeactivate() {
125
+ // Cleanup if needed
126
+ }
127
+
128
+ @state()
129
+ private accessor selectedDomain: any = null;
130
+
131
+ private demoProxyRoutes = [
132
+ { id: '1', domain: 'api.example.com', target: 'http://api-gateway:3000', ssl: true, status: 'active' as const },
133
+ { id: '2', domain: 'app.example.com', target: 'http://frontend:8080', ssl: true, status: 'active' as const },
134
+ { id: '3', domain: 'admin.example.com', target: 'http://admin-panel:4000', ssl: true, status: 'active' as const },
135
+ { id: '4', domain: 'legacy.example.com', target: 'http://legacy:5000', ssl: false, status: 'inactive' as const },
136
+ ];
137
+
138
+ private demoAccessLogs = [
139
+ { timestamp: '14:30:22', method: 'GET', path: '/api/users', status: 200, duration: '45ms', ip: '192.168.1.100' },
140
+ { timestamp: '14:30:21', method: 'POST', path: '/api/orders', status: 201, duration: '120ms', ip: '192.168.1.105' },
141
+ { timestamp: '14:30:20', method: 'GET', path: '/api/products', status: 200, duration: '89ms', ip: '192.168.1.100' },
142
+ { timestamp: '14:30:19', method: 'DELETE', path: '/api/cache', status: 204, duration: '12ms', ip: '192.168.1.50' },
143
+ { timestamp: '14:30:18', method: 'GET', path: '/health', status: 200, duration: '5ms', ip: '10.0.0.1' },
144
+ ];
145
+
146
+ private demoDnsRecords = [
147
+ { id: '1', type: 'A' as const, name: '@', value: '192.168.1.100', ttl: 3600, zone: 'example.com' },
148
+ { id: '2', type: 'A' as const, name: 'api', value: '192.168.1.100', ttl: 3600, zone: 'example.com' },
149
+ { id: '3', type: 'CNAME' as const, name: 'www', value: 'example.com', ttl: 3600, zone: 'example.com' },
150
+ { id: '4', type: 'MX' as const, name: '@', value: 'mail.example.com', ttl: 3600, zone: 'example.com', priority: 10 },
151
+ { id: '5', type: 'TXT' as const, name: '@', value: 'v=spf1 include:_spf.example.com ~all', ttl: 3600, zone: 'example.com' },
152
+ ];
153
+
154
+ private demoDomains = [
155
+ { id: '1', name: 'example.com', status: 'active' as const, ssl: true, sslExpiry: '2024-04-15', dnsProvider: 'Cloudflare', recordCount: 12 },
156
+ { id: '2', name: 'api.example.com', status: 'active' as const, ssl: true, sslExpiry: '2024-05-20', dnsProvider: 'Cloudflare', recordCount: 3 },
157
+ { id: '3', name: 'staging.example.com', status: 'pending' as const, ssl: false, sslExpiry: null, dnsProvider: 'Cloudflare', recordCount: 2 },
158
+ { id: '4', name: 'legacy.example.net', status: 'active' as const, ssl: true, sslExpiry: '2024-02-10', dnsProvider: 'Manual', recordCount: 5 },
159
+ ];
160
+
161
+ private demoDomainDetail = {
162
+ id: '1',
163
+ name: 'example.com',
164
+ status: 'active' as const,
165
+ verified: true,
166
+ createdAt: '2024-01-10',
167
+ proxyRoutes: ['/api/*', '/app/*', '/admin/*'],
168
+ };
169
+
170
+ private demoCertificate = {
171
+ id: '1',
172
+ domain: 'example.com',
173
+ issuer: "Let's Encrypt",
174
+ validFrom: '2024-01-10',
175
+ validUntil: '2024-04-10',
176
+ daysRemaining: 45,
177
+ status: 'valid' as const,
178
+ autoRenew: true,
179
+ chain: ['R3', 'ISRG Root X1'],
180
+ };
181
+
182
+ private demoDomainDnsRecords = [
183
+ { id: '1', type: 'A' as const, name: '@', value: '192.168.1.100', ttl: 3600 },
184
+ { id: '2', type: 'CNAME' as const, name: 'www', value: 'example.com', ttl: 3600 },
185
+ { id: '3', type: 'MX' as const, name: '@', value: 'mail.example.com', ttl: 3600, priority: 10 },
186
+ { id: '4', type: 'TXT' as const, name: '@', value: 'v=spf1 include:_spf.example.com ~all', ttl: 3600 },
187
+ ];
188
+
189
+ public static styles = [
190
+ cssManager.defaultStyles,
191
+ css`
192
+ :host {
193
+ display: block;
194
+ padding: 24px;
195
+ height: 100%;
196
+ overflow-y: auto;
197
+ box-sizing: border-box;
198
+ }
199
+
200
+ .page-header {
201
+ margin-bottom: 24px;
202
+ }
203
+
204
+ .page-title {
205
+ font-size: 24px;
206
+ font-weight: 700;
207
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
208
+ margin: 0 0 8px 0;
209
+ }
210
+
211
+ .page-subtitle {
212
+ font-size: 14px;
213
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
214
+ margin: 0;
215
+ }
216
+
217
+ .tabs {
218
+ display: flex;
219
+ gap: 4px;
220
+ margin-bottom: 24px;
221
+ border-bottom: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
222
+ }
223
+
224
+ .tab {
225
+ padding: 10px 16px;
226
+ font-size: 14px;
227
+ font-weight: 500;
228
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
229
+ background: transparent;
230
+ border: none;
231
+ cursor: pointer;
232
+ position: relative;
233
+ transition: color 200ms ease;
234
+ }
235
+
236
+ .tab:hover {
237
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
238
+ }
239
+
240
+ .tab.active {
241
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
242
+ }
243
+
244
+ .tab.active::after {
245
+ content: '';
246
+ position: absolute;
247
+ bottom: -1px;
248
+ left: 0;
249
+ right: 0;
250
+ height: 2px;
251
+ background: ${cssManager.bdTheme('#18181b', '#fafafa')};
252
+ border-radius: 1px 1px 0 0;
253
+ }
254
+
255
+ .back-button {
256
+ display: inline-flex;
257
+ align-items: center;
258
+ gap: 6px;
259
+ padding: 6px 12px;
260
+ background: transparent;
261
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
262
+ border-radius: 6px;
263
+ font-size: 13px;
264
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
265
+ cursor: pointer;
266
+ margin-bottom: 16px;
267
+ transition: all 200ms ease;
268
+ }
269
+
270
+ .back-button:hover {
271
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
272
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
273
+ }
274
+ `,
275
+ ];
276
+
277
+ public render(): TemplateResult {
278
+ if (this.currentTab === 'domain-detail') {
279
+ return this.renderDomainDetail();
280
+ }
281
+
282
+ return html`
283
+ ${this.currentTab === 'proxy' ? this.renderProxyView() : ''}
284
+ ${this.currentTab === 'dns' ? this.renderDnsView() : ''}
285
+ ${this.currentTab === 'domains' ? this.renderDomainsView() : ''}
286
+ `;
287
+ }
288
+
289
+ private renderProxyView(): TemplateResult {
290
+ return html`
291
+ <sz-network-proxy-view
292
+ .routes=${this.demoProxyRoutes}
293
+ .accessLogs=${this.demoAccessLogs}
294
+ .stats=${{
295
+ activeConnections: 42,
296
+ requestsToday: 15420,
297
+ bytesTransferred: '2.4 GB',
298
+ }}
299
+ @add-route=${() => console.log('Add route')}
300
+ @edit-route=${(e: CustomEvent) => console.log('Edit route:', e.detail)}
301
+ @delete-route=${(e: CustomEvent) => console.log('Delete route:', e.detail)}
302
+ ></sz-network-proxy-view>
303
+ `;
304
+ }
305
+
306
+ private renderDnsView(): TemplateResult {
307
+ return html`
308
+ <sz-network-dns-view
309
+ .records=${this.demoDnsRecords}
310
+ .zones=${['example.com', 'example.net', 'myapp.io']}
311
+ .selectedZone=${'example.com'}
312
+ @add-record=${() => console.log('Add record')}
313
+ @edit-record=${(e: CustomEvent) => console.log('Edit record:', e.detail)}
314
+ @delete-record=${(e: CustomEvent) => console.log('Delete record:', e.detail)}
315
+ @change-zone=${(e: CustomEvent) => console.log('Change zone:', e.detail)}
316
+ ></sz-network-dns-view>
317
+ `;
318
+ }
319
+
320
+ private renderDomainsView(): TemplateResult {
321
+ return html`
322
+ <sz-network-domains-view
323
+ .domains=${this.demoDomains}
324
+ @add-domain=${() => console.log('Add domain')}
325
+ @view-domain=${(e: CustomEvent) => { this.selectedDomain = e.detail; this.currentTab = 'domain-detail'; }}
326
+ @renew-ssl=${(e: CustomEvent) => console.log('Renew SSL:', e.detail)}
327
+ @delete-domain=${(e: CustomEvent) => console.log('Delete domain:', e.detail)}
328
+ ></sz-network-domains-view>
329
+ `;
330
+ }
331
+
332
+ private renderDomainDetail(): TemplateResult {
333
+ return html`
334
+ <button class="back-button" @click=${() => this.currentTab = 'domains'}>
335
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
336
+ <polyline points="15 18 9 12 15 6"/>
337
+ </svg>
338
+ Back to Domains
339
+ </button>
340
+
341
+ <sz-domain-detail-view
342
+ .domain=${this.demoDomainDetail}
343
+ .certificate=${this.demoCertificate}
344
+ .dnsRecords=${this.demoDomainDnsRecords}
345
+ @verify-domain=${() => console.log('Verify domain')}
346
+ @delete-domain=${() => { console.log('Delete domain'); this.currentTab = 'domains'; }}
347
+ @renew-certificate=${() => console.log('Renew certificate')}
348
+ @add-dns-record=${() => console.log('Add DNS record')}
349
+ @edit-dns-record=${(e: CustomEvent) => console.log('Edit DNS record:', e.detail)}
350
+ @delete-dns-record=${(e: CustomEvent) => console.log('Delete DNS record:', e.detail)}
351
+ ></sz-domain-detail-view>
352
+ `;
353
+ }
354
+ }
@@ -0,0 +1,206 @@
1
+ import {
2
+ DeesElement,
3
+ customElement,
4
+ html,
5
+ css,
6
+ cssManager,
7
+ state,
8
+ type TemplateResult,
9
+ } from '@design.estate/dees-element';
10
+ import type { DeesAppui } from '@design.estate/dees-catalog';
11
+ import './index.js';
12
+
13
+ declare global {
14
+ interface HTMLElementTagNameMap {
15
+ 'sz-demo-view-registries': SzDemoViewRegistries;
16
+ }
17
+ }
18
+
19
+ @customElement('sz-demo-view-registries')
20
+ export class SzDemoViewRegistries extends DeesElement {
21
+ private appui: DeesAppui | null = null;
22
+
23
+ @state()
24
+ private accessor currentTab: 'onebox' | 'external' = 'onebox';
25
+
26
+ async onActivate(context: { appui: DeesAppui; viewId: string }) {
27
+ this.appui = context.appui;
28
+
29
+ // Set up content tabs
30
+ this.appui.setContentTabs([
31
+ {
32
+ key: 'Onebox Registry',
33
+ action: () => {
34
+ this.currentTab = 'onebox';
35
+ this.updateSecondaryMenu();
36
+ },
37
+ },
38
+ {
39
+ key: 'External Registries',
40
+ action: () => {
41
+ this.currentTab = 'external';
42
+ this.updateSecondaryMenu();
43
+ },
44
+ },
45
+ ]);
46
+
47
+ this.updateSecondaryMenu();
48
+ }
49
+
50
+ private updateSecondaryMenu() {
51
+ if (!this.appui) return;
52
+
53
+ if (this.currentTab === 'onebox') {
54
+ this.appui.setSecondaryMenu({
55
+ heading: 'Onebox Registry',
56
+ groups: [
57
+ {
58
+ name: 'Actions',
59
+ items: [
60
+ { type: 'action', key: 'Push Image', iconName: 'lucide:Upload', action: () => { console.log('Push image'); } },
61
+ { type: 'action', variant: 'danger', key: 'Garbage Collect', iconName: 'lucide:Trash2', action: () => { console.log('GC'); } },
62
+ ],
63
+ },
64
+ {
65
+ name: 'Statistics',
66
+ items: [
67
+ { type: 'header', label: '4 Images' },
68
+ { type: 'header', label: '640 MB Total' },
69
+ ],
70
+ },
71
+ ],
72
+ });
73
+ } else {
74
+ this.appui.setSecondaryMenu({
75
+ heading: 'External Registries',
76
+ groups: [
77
+ {
78
+ name: 'Actions',
79
+ items: [
80
+ { type: 'action', key: 'Add Registry', iconName: 'lucide:Plus', action: () => { console.log('Add registry'); } },
81
+ { type: 'action', key: 'Test All', iconName: 'lucide:CheckCircle', action: () => { console.log('Test all'); } },
82
+ ],
83
+ },
84
+ {
85
+ name: 'Connected',
86
+ items: [
87
+ { key: 'Docker Hub', iconName: 'lucide:Box', action: () => { console.log('Docker Hub'); } },
88
+ { key: 'GHCR', iconName: 'lucide:Github', action: () => { console.log('GHCR'); } },
89
+ ],
90
+ },
91
+ ],
92
+ });
93
+ }
94
+ }
95
+
96
+ onDeactivate() {
97
+ // Cleanup if needed
98
+ }
99
+
100
+ private demoOneboxImages = [
101
+ { id: '1', name: 'api-gateway', tags: ['latest', 'v2.1.0', 'v2.0.0'], size: '256 MB', updated: '2024-01-20', pulls: 142 },
102
+ { id: '2', name: 'frontend', tags: ['latest', 'v1.5.0'], size: '128 MB', updated: '2024-01-19', pulls: 89 },
103
+ { id: '3', name: 'worker-service', tags: ['latest'], size: '64 MB', updated: '2024-01-18', pulls: 56 },
104
+ { id: '4', name: 'admin-panel', tags: ['latest', 'v3.0.0', 'v2.9.0'], size: '192 MB', updated: '2024-01-17', pulls: 34 },
105
+ ];
106
+
107
+ private demoExternalRegistries = [
108
+ { id: '1', name: 'Docker Hub', url: 'docker.io', status: 'connected' as const, images: 12 },
109
+ { id: '2', name: 'GitHub Container Registry', url: 'ghcr.io', status: 'connected' as const, images: 8 },
110
+ { id: '3', name: 'AWS ECR', url: '123456789.dkr.ecr.us-east-1.amazonaws.com', status: 'error' as const, images: 0 },
111
+ ];
112
+
113
+ public static styles = [
114
+ cssManager.defaultStyles,
115
+ css`
116
+ :host {
117
+ display: block;
118
+ padding: 24px;
119
+ height: 100%;
120
+ overflow-y: auto;
121
+ box-sizing: border-box;
122
+ }
123
+
124
+ .page-header {
125
+ margin-bottom: 24px;
126
+ }
127
+
128
+ .page-title {
129
+ font-size: 24px;
130
+ font-weight: 700;
131
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
132
+ margin: 0 0 8px 0;
133
+ }
134
+
135
+ .page-subtitle {
136
+ font-size: 14px;
137
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
138
+ margin: 0;
139
+ }
140
+
141
+ .tabs {
142
+ display: flex;
143
+ gap: 4px;
144
+ margin-bottom: 24px;
145
+ border-bottom: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
146
+ }
147
+
148
+ .tab {
149
+ padding: 10px 16px;
150
+ font-size: 14px;
151
+ font-weight: 500;
152
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
153
+ background: transparent;
154
+ border: none;
155
+ cursor: pointer;
156
+ position: relative;
157
+ transition: color 200ms ease;
158
+ }
159
+
160
+ .tab:hover {
161
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
162
+ }
163
+
164
+ .tab.active {
165
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
166
+ }
167
+
168
+ .tab.active::after {
169
+ content: '';
170
+ position: absolute;
171
+ bottom: -1px;
172
+ left: 0;
173
+ right: 0;
174
+ height: 2px;
175
+ background: ${cssManager.bdTheme('#18181b', '#fafafa')};
176
+ border-radius: 1px 1px 0 0;
177
+ }
178
+ `,
179
+ ];
180
+
181
+ public render(): TemplateResult {
182
+ return html`
183
+ ${this.currentTab === 'onebox' ? html`
184
+ <sz-registry-onebox-view
185
+ .images=${this.demoOneboxImages}
186
+ .stats=${{
187
+ totalImages: 4,
188
+ totalSize: '640 MB',
189
+ totalPulls: 321,
190
+ }}
191
+ @view-image=${(e: CustomEvent) => console.log('View image:', e.detail)}
192
+ @delete-image=${(e: CustomEvent) => console.log('Delete image:', e.detail)}
193
+ @delete-tag=${(e: CustomEvent) => console.log('Delete tag:', e.detail)}
194
+ ></sz-registry-onebox-view>
195
+ ` : html`
196
+ <sz-registry-external-view
197
+ .registries=${this.demoExternalRegistries}
198
+ @add-registry=${() => console.log('Add registry')}
199
+ @edit-registry=${(e: CustomEvent) => console.log('Edit registry:', e.detail)}
200
+ @delete-registry=${(e: CustomEvent) => console.log('Delete registry:', e.detail)}
201
+ @test-connection=${(e: CustomEvent) => console.log('Test connection:', e.detail)}
202
+ ></sz-registry-external-view>
203
+ `}
204
+ `;
205
+ }
206
+ }