@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,434 @@
1
+ import {
2
+ DeesElement,
3
+ customElement,
4
+ html,
5
+ css,
6
+ cssManager,
7
+ property,
8
+ state,
9
+ type TemplateResult,
10
+ } from '@design.estate/dees-element';
11
+ import type { DeesAppui } from '@design.estate/dees-catalog';
12
+ import './index.js';
13
+
14
+ declare global {
15
+ interface HTMLElementTagNameMap {
16
+ 'sz-demo-view-services': SzDemoViewServices;
17
+ }
18
+ }
19
+
20
+ @customElement('sz-demo-view-services')
21
+ export class SzDemoViewServices extends DeesElement {
22
+ private appui: DeesAppui | null = null;
23
+
24
+ @state()
25
+ private accessor currentView: 'list' | 'create' | 'detail' | 'backups' | 'platform-detail' = 'list';
26
+
27
+ @state()
28
+ private accessor selectedService: any = null;
29
+
30
+ @state()
31
+ private accessor selectedPlatformService: any = null;
32
+
33
+ private demoServices = [
34
+ {
35
+ id: '1',
36
+ name: 'nginx-proxy',
37
+ image: 'nginx:latest',
38
+ status: 'running',
39
+ cpu: '2.5%',
40
+ memory: '256 MB',
41
+ ports: '80, 443',
42
+ uptime: '5d 12h',
43
+ },
44
+ {
45
+ id: '2',
46
+ name: 'api-gateway',
47
+ image: 'api-gateway:v2.1.0',
48
+ status: 'running',
49
+ cpu: '8.2%',
50
+ memory: '512 MB',
51
+ ports: '3000',
52
+ uptime: '3d 8h',
53
+ },
54
+ {
55
+ id: '3',
56
+ name: 'worker-service',
57
+ image: 'worker:latest',
58
+ status: 'stopped',
59
+ cpu: '0%',
60
+ memory: '0 MB',
61
+ ports: '-',
62
+ uptime: '-',
63
+ },
64
+ {
65
+ id: '4',
66
+ name: 'redis-cache',
67
+ image: 'redis:7-alpine',
68
+ status: 'running',
69
+ cpu: '1.2%',
70
+ memory: '128 MB',
71
+ ports: '6379',
72
+ uptime: '10d 4h',
73
+ },
74
+ ];
75
+
76
+ private demoPlatformService = {
77
+ id: '1',
78
+ name: 'MongoDB',
79
+ type: 'mongodb' as const,
80
+ status: 'running' as const,
81
+ version: '7.0.4',
82
+ host: 'localhost',
83
+ port: 27017,
84
+ credentials: { username: 'admin', password: '••••••••' },
85
+ config: { replicaSet: 'rs0', authEnabled: true, journaling: true },
86
+ metrics: { cpu: 12, memory: 45, storage: 23, connections: 8 },
87
+ };
88
+
89
+ private demoPlatformLogs = [
90
+ { timestamp: '2024-01-20 14:30:22', level: 'info' as const, message: 'Connection accepted from 127.0.0.1:54321' },
91
+ { timestamp: '2024-01-20 14:30:20', level: 'info' as const, message: 'Index build completed on collection users' },
92
+ { timestamp: '2024-01-20 14:30:15', level: 'warn' as const, message: 'Slow query detected: 1.2s on collection orders' },
93
+ { timestamp: '2024-01-20 14:30:10', level: 'info' as const, message: 'Checkpoint complete' },
94
+ ];
95
+
96
+ private demoBackupSchedules = [
97
+ { id: '1', scope: 'All Services', retention: 'D:7, W:4, M:12', schedule: '0 2 * * *', lastRun: '1/2/2026, 2:00:03 AM', nextRun: '1/3/2026, 2:00:00 AM', status: 'active' as const },
98
+ ];
99
+
100
+ private demoBackups = [
101
+ { id: '1', service: 'nginx-proxy', createdAt: '1/2/2026, 2:00:03 AM', size: '22.0 MB', includes: ['Image'] },
102
+ { id: '2', service: 'api-gateway', createdAt: '1/2/2026, 2:00:02 AM', size: '156.5 MB', includes: ['Image', 'Volumes'] },
103
+ { id: '3', service: 'redis-cache', createdAt: '1/2/2026, 2:00:00 AM', size: '48.0 MB', includes: ['Image', 'Data'] },
104
+ ];
105
+
106
+ public static styles = [
107
+ cssManager.defaultStyles,
108
+ css`
109
+ :host {
110
+ display: block;
111
+ padding: 24px;
112
+ height: 100%;
113
+ overflow-y: auto;
114
+ box-sizing: border-box;
115
+ }
116
+
117
+ .page-header {
118
+ display: flex;
119
+ justify-content: space-between;
120
+ align-items: flex-start;
121
+ margin-bottom: 24px;
122
+ }
123
+
124
+ .header-info {
125
+ display: flex;
126
+ flex-direction: column;
127
+ gap: 8px;
128
+ }
129
+
130
+ .page-title {
131
+ font-size: 24px;
132
+ font-weight: 700;
133
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
134
+ margin: 0;
135
+ }
136
+
137
+ .page-subtitle {
138
+ font-size: 14px;
139
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
140
+ margin: 0;
141
+ }
142
+
143
+ .header-actions {
144
+ display: flex;
145
+ gap: 8px;
146
+ }
147
+
148
+ .action-button {
149
+ display: inline-flex;
150
+ align-items: center;
151
+ gap: 6px;
152
+ padding: 8px 14px;
153
+ background: ${cssManager.bdTheme('#18181b', '#fafafa')};
154
+ border: none;
155
+ border-radius: 6px;
156
+ font-size: 13px;
157
+ font-weight: 500;
158
+ color: ${cssManager.bdTheme('#fafafa', '#18181b')};
159
+ cursor: pointer;
160
+ transition: all 200ms ease;
161
+ }
162
+
163
+ .action-button:hover {
164
+ opacity: 0.9;
165
+ }
166
+
167
+ .action-button.secondary {
168
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
169
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
170
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
171
+ }
172
+
173
+ .action-button.secondary:hover {
174
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
175
+ }
176
+
177
+ .tabs {
178
+ display: flex;
179
+ gap: 4px;
180
+ margin-bottom: 24px;
181
+ border-bottom: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
182
+ padding-bottom: 0;
183
+ }
184
+
185
+ .tab {
186
+ padding: 10px 16px;
187
+ font-size: 14px;
188
+ font-weight: 500;
189
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
190
+ background: transparent;
191
+ border: none;
192
+ cursor: pointer;
193
+ position: relative;
194
+ transition: color 200ms ease;
195
+ }
196
+
197
+ .tab:hover {
198
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
199
+ }
200
+
201
+ .tab.active {
202
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
203
+ }
204
+
205
+ .tab.active::after {
206
+ content: '';
207
+ position: absolute;
208
+ bottom: -1px;
209
+ left: 0;
210
+ right: 0;
211
+ height: 2px;
212
+ background: ${cssManager.bdTheme('#18181b', '#fafafa')};
213
+ border-radius: 1px 1px 0 0;
214
+ }
215
+
216
+ .back-button {
217
+ display: inline-flex;
218
+ align-items: center;
219
+ gap: 6px;
220
+ padding: 6px 12px;
221
+ background: transparent;
222
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
223
+ border-radius: 6px;
224
+ font-size: 13px;
225
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
226
+ cursor: pointer;
227
+ margin-bottom: 16px;
228
+ transition: all 200ms ease;
229
+ }
230
+
231
+ .back-button:hover {
232
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
233
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
234
+ }
235
+ `,
236
+ ];
237
+
238
+ public render(): TemplateResult {
239
+ return html`
240
+ ${this.currentView === 'list' ? this.renderListView() : ''}
241
+ ${this.currentView === 'create' ? this.renderCreateView() : ''}
242
+ ${this.currentView === 'detail' ? this.renderDetailView() : ''}
243
+ ${this.currentView === 'backups' ? this.renderBackupsView() : ''}
244
+ ${this.currentView === 'platform-detail' ? this.renderPlatformDetailView() : ''}
245
+ `;
246
+ }
247
+
248
+ private renderListView(): TemplateResult {
249
+ return html`
250
+ <div class="page-header">
251
+ <div class="header-info">
252
+ <h1 class="page-title">Services</h1>
253
+ <p class="page-subtitle">Manage your Docker containers and platform services</p>
254
+ </div>
255
+ <div class="header-actions">
256
+ <button class="action-button secondary" @click=${() => this.currentView = 'backups'}>
257
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
258
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/>
259
+ <polyline points="17 8 12 3 7 8"/>
260
+ <line x1="12" y1="3" x2="12" y2="15"/>
261
+ </svg>
262
+ Backups
263
+ </button>
264
+ <button class="action-button" @click=${() => this.currentView = 'create'}>
265
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
266
+ <line x1="12" y1="5" x2="12" y2="19"/>
267
+ <line x1="5" y1="12" x2="19" y2="12"/>
268
+ </svg>
269
+ Deploy Service
270
+ </button>
271
+ </div>
272
+ </div>
273
+
274
+ <div class="tabs">
275
+ <button class="tab active">Docker Services</button>
276
+ <button class="tab" @click=${() => { this.selectedPlatformService = this.demoPlatformService; this.currentView = 'platform-detail'; }}>Platform Services</button>
277
+ </div>
278
+
279
+ <sz-services-list-view
280
+ .services=${this.demoServices}
281
+ @view-service=${(e: CustomEvent) => { this.selectedService = e.detail; this.currentView = 'detail'; }}
282
+ @start-service=${(e: CustomEvent) => console.log('Start service:', e.detail)}
283
+ @stop-service=${(e: CustomEvent) => console.log('Stop service:', e.detail)}
284
+ @restart-service=${(e: CustomEvent) => console.log('Restart service:', e.detail)}
285
+ @delete-service=${(e: CustomEvent) => console.log('Delete service:', e.detail)}
286
+ ></sz-services-list-view>
287
+ `;
288
+ }
289
+
290
+ private renderCreateView(): TemplateResult {
291
+ return html`
292
+ <button class="back-button" @click=${() => this.currentView = 'list'}>
293
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
294
+ <polyline points="15 18 9 12 15 6"/>
295
+ </svg>
296
+ Back to Services
297
+ </button>
298
+
299
+ <sz-service-create-view
300
+ .registries=${[
301
+ { id: '1', name: 'Onebox Registry', url: 'registry.onebox.local' },
302
+ { id: '2', name: 'Docker Hub', url: 'docker.io' },
303
+ ]}
304
+ @create-service=${(e: CustomEvent) => { console.log('Create service:', e.detail); this.currentView = 'list'; }}
305
+ @cancel=${() => this.currentView = 'list'}
306
+ ></sz-service-create-view>
307
+ `;
308
+ }
309
+
310
+ private renderDetailView(): TemplateResult {
311
+ return html`
312
+ <button class="back-button" @click=${() => this.currentView = 'list'}>
313
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
314
+ <polyline points="15 18 9 12 15 6"/>
315
+ </svg>
316
+ Back to Services
317
+ </button>
318
+
319
+ <sz-service-detail-view
320
+ .service=${{
321
+ id: this.selectedService?.id || '1',
322
+ name: this.selectedService?.name || 'nginx-proxy',
323
+ image: this.selectedService?.image || 'nginx:latest',
324
+ status: this.selectedService?.status || 'running',
325
+ ports: [{ host: '80', container: '80' }, { host: '443', container: '443' }],
326
+ envVars: [
327
+ { key: 'NGINX_HOST', value: 'localhost' },
328
+ { key: 'NGINX_PORT', value: '80' },
329
+ ],
330
+ volumes: [
331
+ { host: '/data/nginx/conf', container: '/etc/nginx/conf.d' },
332
+ ],
333
+ createdAt: '2024-01-15 10:30:00',
334
+ restartPolicy: 'always',
335
+ }}
336
+ .logs=${[
337
+ { timestamp: '2024-01-20 14:30:22', level: 'info', message: '127.0.0.1 - - [20/Jan/2024:14:30:22 +0000] "GET / HTTP/1.1" 200 612' },
338
+ { timestamp: '2024-01-20 14:30:21', level: 'info', message: '127.0.0.1 - - [20/Jan/2024:14:30:21 +0000] "GET /api/health HTTP/1.1" 200 15' },
339
+ { timestamp: '2024-01-20 14:30:20', level: 'warn', message: 'upstream timed out (110: Connection timed out)' },
340
+ { timestamp: '2024-01-20 14:30:19', level: 'info', message: '127.0.0.1 - - [20/Jan/2024:14:30:19 +0000] "POST /api/data HTTP/1.1" 201 89' },
341
+ ]}
342
+ @start=${() => console.log('Start')}
343
+ @stop=${() => console.log('Stop')}
344
+ @restart=${() => console.log('Restart')}
345
+ ></sz-service-detail-view>
346
+ `;
347
+ }
348
+
349
+ private renderBackupsView(): TemplateResult {
350
+ return html`
351
+ <button class="back-button" @click=${() => this.currentView = 'list'}>
352
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
353
+ <polyline points="15 18 9 12 15 6"/>
354
+ </svg>
355
+ Back to Services
356
+ </button>
357
+
358
+ <div class="page-header">
359
+ <div class="header-info">
360
+ <h1 class="page-title">Backups</h1>
361
+ <p class="page-subtitle">Manage backup schedules and restore points</p>
362
+ </div>
363
+ </div>
364
+
365
+ <sz-services-backups-view
366
+ .schedules=${this.demoBackupSchedules}
367
+ .backups=${this.demoBackups}
368
+ @create-schedule=${() => console.log('Create schedule')}
369
+ @run-now=${(e: CustomEvent) => console.log('Run now:', e.detail)}
370
+ @download=${(e: CustomEvent) => console.log('Download:', e.detail)}
371
+ ></sz-services-backups-view>
372
+ `;
373
+ }
374
+
375
+ private renderPlatformDetailView(): TemplateResult {
376
+ return html`
377
+ <button class="back-button" @click=${() => this.currentView = 'list'}>
378
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
379
+ <polyline points="15 18 9 12 15 6"/>
380
+ </svg>
381
+ Back to Services
382
+ </button>
383
+
384
+ <sz-platform-service-detail-view
385
+ .service=${this.demoPlatformService}
386
+ .logs=${this.demoPlatformLogs}
387
+ @start=${() => console.log('Start')}
388
+ @stop=${() => console.log('Stop')}
389
+ @restart=${() => console.log('Restart')}
390
+ ></sz-platform-service-detail-view>
391
+ `;
392
+ }
393
+
394
+ async onActivate(context: { appui: DeesAppui; viewId: string }) {
395
+ this.appui = context.appui;
396
+
397
+ // Set up content tabs
398
+ this.appui.setContentTabs([
399
+ { key: 'Docker Services', action: () => { this.currentView = 'list'; this.updateSecondaryMenu(); } },
400
+ { key: 'Platform Services', action: () => { this.currentView = 'platform-detail'; this.updateSecondaryMenu(); } },
401
+ { key: 'Backups', action: () => { this.currentView = 'backups'; this.updateSecondaryMenu(); } },
402
+ ]);
403
+
404
+ this.updateSecondaryMenu();
405
+ }
406
+
407
+ private updateSecondaryMenu() {
408
+ if (!this.appui) return;
409
+
410
+ this.appui.setSecondaryMenu({
411
+ heading: 'Services',
412
+ groups: [
413
+ {
414
+ name: 'Actions',
415
+ items: [
416
+ { type: 'action', key: 'Deploy Service', iconName: 'lucide:Plus', action: () => { this.currentView = 'create'; } },
417
+ { type: 'action', key: 'Refresh', iconName: 'lucide:RefreshCw', action: () => { console.log('Refresh'); } },
418
+ ],
419
+ },
420
+ {
421
+ name: 'Quick Filters',
422
+ items: [
423
+ { key: 'Running', iconName: 'lucide:Play', badge: '3', badgeVariant: 'success', action: () => { console.log('Filter running'); } },
424
+ { key: 'Stopped', iconName: 'lucide:Square', badge: '1', action: () => { console.log('Filter stopped'); } },
425
+ ],
426
+ },
427
+ ],
428
+ });
429
+ }
430
+
431
+ onDeactivate() {
432
+ // Cleanup if needed
433
+ }
434
+ }
@@ -0,0 +1,118 @@
1
+ import {
2
+ DeesElement,
3
+ customElement,
4
+ html,
5
+ css,
6
+ cssManager,
7
+ type TemplateResult,
8
+ } from '@design.estate/dees-element';
9
+ import type { DeesAppui } from '@design.estate/dees-catalog';
10
+ import './index.js';
11
+
12
+ declare global {
13
+ interface HTMLElementTagNameMap {
14
+ 'sz-demo-view-settings': SzDemoViewSettings;
15
+ }
16
+ }
17
+
18
+ @customElement('sz-demo-view-settings')
19
+ export class SzDemoViewSettings extends DeesElement {
20
+ private appui: DeesAppui | null = null;
21
+
22
+ async onActivate(context: { appui: DeesAppui; viewId: string }) {
23
+ this.appui = context.appui;
24
+
25
+ // Settings doesn't need content tabs, but we set up the secondary menu
26
+ this.appui.setSecondaryMenu({
27
+ heading: 'Settings',
28
+ groups: [
29
+ {
30
+ name: 'Categories',
31
+ items: [
32
+ { key: 'General', iconName: 'lucide:Settings', action: () => { console.log('General settings'); } },
33
+ { key: 'Network', iconName: 'lucide:Network', action: () => { console.log('Network settings'); } },
34
+ { key: 'Security', iconName: 'lucide:Shield', action: () => { console.log('Security settings'); } },
35
+ { key: 'Certificates', iconName: 'lucide:FileBadge', action: () => { console.log('Certificate settings'); } },
36
+ ],
37
+ },
38
+ {
39
+ name: 'Actions',
40
+ items: [
41
+ { type: 'action', key: 'Export Config', iconName: 'lucide:Download', action: () => { console.log('Export config'); } },
42
+ { type: 'action', key: 'Import Config', iconName: 'lucide:Upload', action: () => { console.log('Import config'); } },
43
+ { type: 'action', variant: 'danger', key: 'Reset to Default', iconName: 'lucide:RotateCcw', confirmMessage: 'Are you sure you want to reset all settings to default?', action: () => { console.log('Reset settings'); } },
44
+ ],
45
+ },
46
+ ],
47
+ });
48
+ }
49
+
50
+ onDeactivate() {
51
+ // Cleanup if needed
52
+ }
53
+ private demoSettings = {
54
+ darkMode: true,
55
+ cloudflareToken: '',
56
+ cloudflareZoneId: '',
57
+ autoRenewCerts: true,
58
+ renewalThreshold: 30,
59
+ acmeEmail: 'admin@serve.zone',
60
+ httpPort: 80,
61
+ httpsPort: 443,
62
+ forceHttps: true,
63
+ };
64
+
65
+ public static styles = [
66
+ cssManager.defaultStyles,
67
+ css`
68
+ :host {
69
+ display: block;
70
+ padding: 24px;
71
+ height: 100%;
72
+ overflow-y: auto;
73
+ box-sizing: border-box;
74
+ }
75
+
76
+ .page-header {
77
+ margin-bottom: 24px;
78
+ }
79
+
80
+ .page-title {
81
+ font-size: 24px;
82
+ font-weight: 700;
83
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
84
+ margin: 0 0 8px 0;
85
+ }
86
+
87
+ .page-subtitle {
88
+ font-size: 14px;
89
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
90
+ margin: 0;
91
+ }
92
+
93
+ .settings-container {
94
+ max-width: 800px;
95
+ }
96
+ `,
97
+ ];
98
+
99
+ public render(): TemplateResult {
100
+ return html`
101
+ <div class="page-header">
102
+ <h1 class="page-title">Settings</h1>
103
+ <p class="page-subtitle">Configure your onebox instance</p>
104
+ </div>
105
+
106
+ <div class="settings-container">
107
+ <sz-settings-view
108
+ .settings=${this.demoSettings}
109
+ currentUser="admin"
110
+ @setting-change=${(e: CustomEvent) => console.log('Setting change:', e.detail)}
111
+ @change-password=${(e: CustomEvent) => console.log('Change password:', e.detail)}
112
+ @reset=${() => console.log('Reset settings')}
113
+ @save=${(e: CustomEvent) => console.log('Save settings:', e.detail)}
114
+ ></sz-settings-view>
115
+ </div>
116
+ `;
117
+ }
118
+ }
@@ -0,0 +1,109 @@
1
+ import {
2
+ DeesElement,
3
+ customElement,
4
+ html,
5
+ css,
6
+ cssManager,
7
+ type TemplateResult,
8
+ } from '@design.estate/dees-element';
9
+ import type { DeesAppui } from '@design.estate/dees-catalog';
10
+ import './index.js';
11
+
12
+ declare global {
13
+ interface HTMLElementTagNameMap {
14
+ 'sz-demo-view-tokens': SzDemoViewTokens;
15
+ }
16
+ }
17
+
18
+ @customElement('sz-demo-view-tokens')
19
+ export class SzDemoViewTokens extends DeesElement {
20
+ private appui: DeesAppui | null = null;
21
+
22
+ async onActivate(context: { appui: DeesAppui; viewId: string }) {
23
+ this.appui = context.appui;
24
+
25
+ // Tokens secondary menu
26
+ this.appui.setSecondaryMenu({
27
+ heading: 'Tokens',
28
+ groups: [
29
+ {
30
+ name: 'Actions',
31
+ items: [
32
+ { type: 'action', key: 'Create Global Token', iconName: 'lucide:Plus', action: () => { console.log('Create global token'); } },
33
+ { type: 'action', key: 'Create CI Token', iconName: 'lucide:GitBranch', action: () => { console.log('Create CI token'); } },
34
+ ],
35
+ },
36
+ {
37
+ name: 'Token Types',
38
+ items: [
39
+ { key: 'Global Tokens', iconName: 'lucide:Key', badge: '3', action: () => { console.log('Filter global'); } },
40
+ { key: 'CI Tokens', iconName: 'lucide:Cpu', badge: '3', action: () => { console.log('Filter CI'); } },
41
+ ],
42
+ },
43
+ ],
44
+ });
45
+ }
46
+
47
+ onDeactivate() {
48
+ // Cleanup if needed
49
+ }
50
+ private demoGlobalTokens = [
51
+ { id: '1', name: 'CI/CD Pipeline', type: 'global' as const, createdAt: '2024-01-15', lastUsed: '2024-01-20' },
52
+ { id: '2', name: 'Development', type: 'global' as const, createdAt: '2024-01-10' },
53
+ { id: '3', name: 'Production Deploy', type: 'global' as const, createdAt: '2024-01-05', lastUsed: '2024-01-19' },
54
+ ];
55
+
56
+ private demoCiTokens = [
57
+ { id: '4', name: 'api-gateway-ci', type: 'ci' as const, service: 'api-gateway', createdAt: '2024-01-18', lastUsed: '2024-01-20' },
58
+ { id: '5', name: 'frontend-ci', type: 'ci' as const, service: 'frontend', createdAt: '2024-01-12', lastUsed: '2024-01-19' },
59
+ { id: '6', name: 'worker-service-ci', type: 'ci' as const, service: 'worker-service', createdAt: '2024-01-08' },
60
+ ];
61
+
62
+ public static styles = [
63
+ cssManager.defaultStyles,
64
+ css`
65
+ :host {
66
+ display: block;
67
+ padding: 24px;
68
+ height: 100%;
69
+ overflow-y: auto;
70
+ box-sizing: border-box;
71
+ }
72
+
73
+ .page-header {
74
+ margin-bottom: 24px;
75
+ }
76
+
77
+ .page-title {
78
+ font-size: 24px;
79
+ font-weight: 700;
80
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
81
+ margin: 0 0 8px 0;
82
+ }
83
+
84
+ .page-subtitle {
85
+ font-size: 14px;
86
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
87
+ margin: 0;
88
+ }
89
+ `,
90
+ ];
91
+
92
+ public render(): TemplateResult {
93
+ return html`
94
+ <div class="page-header">
95
+ <h1 class="page-title">Tokens</h1>
96
+ <p class="page-subtitle">Manage registry access tokens for CI/CD pipelines</p>
97
+ </div>
98
+
99
+ <sz-tokens-view
100
+ .globalTokens=${this.demoGlobalTokens}
101
+ .ciTokens=${this.demoCiTokens}
102
+ @create=${(e: CustomEvent) => console.log('Create token:', e.detail)}
103
+ @copy=${(e: CustomEvent) => console.log('Copy token:', e.detail)}
104
+ @regenerate=${(e: CustomEvent) => console.log('Regenerate token:', e.detail)}
105
+ @delete=${(e: CustomEvent) => console.log('Delete token:', e.detail)}
106
+ ></sz-tokens-view>
107
+ `;
108
+ }
109
+ }