@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,258 @@
1
+ import {
2
+ DeesElement,
3
+ customElement,
4
+ html,
5
+ css,
6
+ cssManager,
7
+ property,
8
+ type TemplateResult,
9
+ } from '@design.estate/dees-element';
10
+
11
+ declare global {
12
+ interface HTMLElementTagNameMap {
13
+ 'sz-registry-onebox-view': SzRegistryOneboxView;
14
+ }
15
+ }
16
+
17
+ @customElement('sz-registry-onebox-view')
18
+ export class SzRegistryOneboxView extends DeesElement {
19
+ public static demo = () => html`
20
+ <div style="padding: 24px; max-width: 800px;">
21
+ <sz-registry-onebox-view
22
+ status="running"
23
+ registryUrl="localhost:3000/v2"
24
+ ></sz-registry-onebox-view>
25
+ </div>
26
+ `;
27
+
28
+ @property({ type: String })
29
+ public accessor status: 'running' | 'stopped' = 'stopped';
30
+
31
+ @property({ type: String })
32
+ public accessor registryUrl: string = '';
33
+
34
+ public static styles = [
35
+ cssManager.defaultStyles,
36
+ css`
37
+ :host {
38
+ display: block;
39
+ }
40
+
41
+ .card {
42
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
43
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
44
+ border-radius: 8px;
45
+ overflow: hidden;
46
+ }
47
+
48
+ .card-header {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 12px;
52
+ padding: 16px;
53
+ border-bottom: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
54
+ }
55
+
56
+ .registry-icon {
57
+ width: 40px;
58
+ height: 40px;
59
+ background: ${cssManager.bdTheme('#dbeafe', 'rgba(59, 130, 246, 0.2)')};
60
+ border-radius: 8px;
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
65
+ }
66
+
67
+ .header-info {
68
+ flex: 1;
69
+ }
70
+
71
+ .header-title {
72
+ display: flex;
73
+ align-items: center;
74
+ gap: 8px;
75
+ font-size: 16px;
76
+ font-weight: 600;
77
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
78
+ }
79
+
80
+ .default-badge {
81
+ padding: 2px 8px;
82
+ background: ${cssManager.bdTheme('#dbeafe', 'rgba(59, 130, 246, 0.2)')};
83
+ color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
84
+ border-radius: 4px;
85
+ font-size: 11px;
86
+ font-weight: 600;
87
+ }
88
+
89
+ .header-subtitle {
90
+ font-size: 13px;
91
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
92
+ margin-top: 2px;
93
+ }
94
+
95
+ .card-content {
96
+ padding: 16px;
97
+ }
98
+
99
+ .info-grid {
100
+ display: grid;
101
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
102
+ gap: 16px;
103
+ margin-bottom: 24px;
104
+ }
105
+
106
+ .info-item {
107
+ display: flex;
108
+ flex-direction: column;
109
+ gap: 4px;
110
+ }
111
+
112
+ .info-label {
113
+ font-size: 12px;
114
+ font-weight: 500;
115
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
116
+ text-transform: uppercase;
117
+ letter-spacing: 0.05em;
118
+ }
119
+
120
+ .info-value {
121
+ font-size: 14px;
122
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
123
+ }
124
+
125
+ .status-badge {
126
+ display: inline-flex;
127
+ align-items: center;
128
+ padding: 2px 8px;
129
+ border-radius: 9999px;
130
+ font-size: 12px;
131
+ font-weight: 500;
132
+ }
133
+
134
+ .status-badge.running {
135
+ background: ${cssManager.bdTheme('#dcfce7', 'rgba(34, 197, 94, 0.2)')};
136
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
137
+ }
138
+
139
+ .status-badge.stopped {
140
+ background: ${cssManager.bdTheme('#fee2e2', 'rgba(239, 68, 68, 0.2)')};
141
+ color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
142
+ }
143
+
144
+ .manage-link {
145
+ color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
146
+ text-decoration: none;
147
+ cursor: pointer;
148
+ }
149
+
150
+ .manage-link:hover {
151
+ text-decoration: underline;
152
+ }
153
+
154
+ .quick-start {
155
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
156
+ border-radius: 6px;
157
+ padding: 16px;
158
+ }
159
+
160
+ .quick-start-title {
161
+ font-size: 14px;
162
+ font-weight: 600;
163
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
164
+ margin-bottom: 8px;
165
+ }
166
+
167
+ .quick-start-desc {
168
+ font-size: 13px;
169
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
170
+ margin-bottom: 12px;
171
+ }
172
+
173
+ .code-block {
174
+ background: ${cssManager.bdTheme('#18181b', '#0a0a0a')};
175
+ border-radius: 6px;
176
+ padding: 12px;
177
+ font-family: monospace;
178
+ font-size: 13px;
179
+ overflow-x: auto;
180
+ }
181
+
182
+ .code-line {
183
+ color: ${cssManager.bdTheme('#a1a1aa', '#71717a')};
184
+ margin-bottom: 4px;
185
+ }
186
+
187
+ .code-line:last-child {
188
+ margin-bottom: 0;
189
+ }
190
+
191
+ .code-comment {
192
+ color: ${cssManager.bdTheme('#6b7280', '#52525b')};
193
+ }
194
+
195
+ .code-command {
196
+ color: ${cssManager.bdTheme('#fafafa', '#e4e4e7')};
197
+ }
198
+ `,
199
+ ];
200
+
201
+ public render(): TemplateResult {
202
+ return html`
203
+ <div class="card">
204
+ <div class="card-header">
205
+ <div class="registry-icon">
206
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
207
+ <path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path>
208
+ </svg>
209
+ </div>
210
+ <div class="header-info">
211
+ <div class="header-title">
212
+ Onebox Registry (Built-in)
213
+ <span class="default-badge">Default</span>
214
+ </div>
215
+ <div class="header-subtitle">Built-in container registry for your services</div>
216
+ </div>
217
+ </div>
218
+
219
+ <div class="card-content">
220
+ <div class="info-grid">
221
+ <div class="info-item">
222
+ <span class="info-label">Status</span>
223
+ <span class="info-value">
224
+ <span class="status-badge ${this.status}">${this.status === 'running' ? 'Running' : 'Stopped'}</span>
225
+ </span>
226
+ </div>
227
+ <div class="info-item">
228
+ <span class="info-label">Registry URL</span>
229
+ <span class="info-value">${this.registryUrl}</span>
230
+ </div>
231
+ <div class="info-item">
232
+ <span class="info-label">Authentication</span>
233
+ <span class="info-value">
234
+ <a class="manage-link" @click=${() => this.handleManageTokens()}>Manage Tokens</a>
235
+ </span>
236
+ </div>
237
+ </div>
238
+
239
+ <div class="quick-start">
240
+ <div class="quick-start-title">Quick Start</div>
241
+ <div class="quick-start-desc">To push images to the Onebox registry, use a CI or Global token:</div>
242
+ <div class="code-block">
243
+ <div class="code-line code-comment"># Login to the registry</div>
244
+ <div class="code-line code-command">docker login ${this.registryUrl.split('/')[0]} -u onebox -p YOUR_TOKEN</div>
245
+ <div class="code-line code-comment"># Tag and push your image</div>
246
+ <div class="code-line code-command">docker tag myapp ${this.registryUrl.split('/')[0]}/myservice:latest</div>
247
+ <div class="code-line code-command">docker push ${this.registryUrl.split('/')[0]}/myservice:latest</div>
248
+ </div>
249
+ </div>
250
+ </div>
251
+ </div>
252
+ `;
253
+ }
254
+
255
+ private handleManageTokens() {
256
+ this.dispatchEvent(new CustomEvent('manage-tokens', { bubbles: true, composed: true }));
257
+ }
258
+ }
@@ -0,0 +1,284 @@
1
+ import {
2
+ DeesElement,
3
+ customElement,
4
+ html,
5
+ css,
6
+ cssManager,
7
+ property,
8
+ type TemplateResult,
9
+ } from '@design.estate/dees-element';
10
+
11
+ declare global {
12
+ interface HTMLElementTagNameMap {
13
+ 'sz-resource-usage-card': SzResourceUsageCard;
14
+ }
15
+ }
16
+
17
+ export interface IResourceUsage {
18
+ cpu: number;
19
+ memoryUsed: string;
20
+ memoryTotal: string;
21
+ networkIn: string;
22
+ networkOut: string;
23
+ topConsumers: Array<{ name: string; memory: string }>;
24
+ }
25
+
26
+ @customElement('sz-resource-usage-card')
27
+ export class SzResourceUsageCard extends DeesElement {
28
+ public static demo = () => html`
29
+ <div style="padding: 24px; max-width: 800px;">
30
+ <sz-resource-usage-card
31
+ .data=${{
32
+ cpu: 0.5,
33
+ memoryUsed: '191 MB',
34
+ memoryTotal: '429.2 GB',
35
+ networkIn: '38.9 KB/s',
36
+ networkOut: '1.7 KB/s',
37
+ topConsumers: [
38
+ { name: 'test-nginx', memory: '32.1 MB' },
39
+ { name: 'test-v2', memory: '31.7 MB' },
40
+ ],
41
+ }}
42
+ serviceCount="7"
43
+ ></sz-resource-usage-card>
44
+ </div>
45
+ `;
46
+
47
+ @property({ type: Object })
48
+ public accessor data: IResourceUsage = {
49
+ cpu: 0,
50
+ memoryUsed: '0 MB',
51
+ memoryTotal: '0 GB',
52
+ networkIn: '0 KB/s',
53
+ networkOut: '0 KB/s',
54
+ topConsumers: [],
55
+ };
56
+
57
+ @property({ type: String })
58
+ public accessor serviceCount: string = '0';
59
+
60
+ public static styles = [
61
+ cssManager.defaultStyles,
62
+ css`
63
+ :host {
64
+ display: block;
65
+ height: 100%;
66
+ }
67
+
68
+ .card {
69
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
70
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
71
+ border-radius: 8px;
72
+ padding: 20px;
73
+ height: 100%;
74
+ box-sizing: border-box;
75
+ }
76
+
77
+ .header {
78
+ display: flex;
79
+ justify-content: space-between;
80
+ align-items: flex-start;
81
+ margin-bottom: 16px;
82
+ }
83
+
84
+ .title {
85
+ font-size: 16px;
86
+ font-weight: 600;
87
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
88
+ }
89
+
90
+ .subtitle {
91
+ font-size: 13px;
92
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
93
+ margin-top: 2px;
94
+ }
95
+
96
+ .view-all {
97
+ font-size: 13px;
98
+ color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')};
99
+ text-decoration: none;
100
+ cursor: pointer;
101
+ }
102
+
103
+ .view-all:hover {
104
+ text-decoration: underline;
105
+ }
106
+
107
+ .metrics {
108
+ display: flex;
109
+ flex-direction: column;
110
+ gap: 16px;
111
+ }
112
+
113
+ .metric-row {
114
+ display: flex;
115
+ flex-direction: column;
116
+ gap: 6px;
117
+ }
118
+
119
+ .metric-header {
120
+ display: flex;
121
+ justify-content: space-between;
122
+ align-items: center;
123
+ }
124
+
125
+ .metric-label {
126
+ font-size: 14px;
127
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
128
+ }
129
+
130
+ .metric-value {
131
+ font-size: 14px;
132
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
133
+ }
134
+
135
+ .progress-bar {
136
+ height: 6px;
137
+ background: ${cssManager.bdTheme('#f4f4f5', '#27272a')};
138
+ border-radius: 3px;
139
+ overflow: hidden;
140
+ }
141
+
142
+ .progress-fill {
143
+ height: 100%;
144
+ background: ${cssManager.bdTheme('#3b82f6', '#60a5fa')};
145
+ border-radius: 3px;
146
+ transition: width 300ms ease;
147
+ }
148
+
149
+ .network-row {
150
+ display: flex;
151
+ gap: 16px;
152
+ align-items: center;
153
+ }
154
+
155
+ .network-item {
156
+ display: flex;
157
+ align-items: center;
158
+ gap: 4px;
159
+ font-size: 14px;
160
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
161
+ }
162
+
163
+ .network-icon {
164
+ width: 14px;
165
+ height: 14px;
166
+ }
167
+
168
+ .network-icon.down {
169
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
170
+ }
171
+
172
+ .network-icon.up {
173
+ color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')};
174
+ }
175
+
176
+ .top-consumers {
177
+ margin-top: 8px;
178
+ padding-top: 12px;
179
+ border-top: 1px solid ${cssManager.bdTheme('#f4f4f5', '#27272a')};
180
+ }
181
+
182
+ .consumers-label {
183
+ font-size: 13px;
184
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
185
+ margin-bottom: 6px;
186
+ }
187
+
188
+ .consumers-list {
189
+ display: flex;
190
+ flex-wrap: wrap;
191
+ gap: 12px;
192
+ }
193
+
194
+ .consumer-item {
195
+ font-size: 13px;
196
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
197
+ }
198
+
199
+ .consumer-name {
200
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
201
+ }
202
+ `,
203
+ ];
204
+
205
+ public render(): TemplateResult {
206
+ return html`
207
+ <div class="card">
208
+ <div class="header">
209
+ <div>
210
+ <div class="title">Resource Usage</div>
211
+ <div class="subtitle">Aggregated across ${this.serviceCount} services</div>
212
+ </div>
213
+ <a class="view-all">View All</a>
214
+ </div>
215
+
216
+ <div class="metrics">
217
+ <div class="metric-row">
218
+ <div class="metric-header">
219
+ <span class="metric-label">CPU</span>
220
+ <span class="metric-value">${this.data.cpu.toFixed(1)}%</span>
221
+ </div>
222
+ <div class="progress-bar">
223
+ <div class="progress-fill" style="width: ${Math.min(this.data.cpu, 100)}%"></div>
224
+ </div>
225
+ </div>
226
+
227
+ <div class="metric-row">
228
+ <div class="metric-header">
229
+ <span class="metric-label">Memory</span>
230
+ <span class="metric-value">${this.data.memoryUsed} / ${this.data.memoryTotal}</span>
231
+ </div>
232
+ <div class="progress-bar">
233
+ <div class="progress-fill" style="width: ${this.calculateMemoryPercent()}%"></div>
234
+ </div>
235
+ </div>
236
+
237
+ <div class="metric-row">
238
+ <div class="metric-header">
239
+ <span class="metric-label">Network</span>
240
+ <div class="network-row">
241
+ <span class="network-item">
242
+ <svg class="network-icon down" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
243
+ <path d="M12 5v14M19 12l-7 7-7-7"/>
244
+ </svg>
245
+ ${this.data.networkIn}
246
+ </span>
247
+ <span class="network-item">
248
+ <svg class="network-icon up" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
249
+ <path d="M12 19V5M5 12l7-7 7 7"/>
250
+ </svg>
251
+ ${this.data.networkOut}
252
+ </span>
253
+ </div>
254
+ </div>
255
+ </div>
256
+ </div>
257
+
258
+ ${this.data.topConsumers.length > 0 ? html`
259
+ <div class="top-consumers">
260
+ <div class="consumers-label">Top consumers</div>
261
+ <div class="consumers-list">
262
+ ${this.data.topConsumers.map(
263
+ (consumer) => html`
264
+ <span class="consumer-item">
265
+ <span class="consumer-name">${consumer.name}:</span> ${consumer.memory}
266
+ </span>
267
+ `
268
+ )}
269
+ </div>
270
+ </div>
271
+ ` : ''}
272
+ </div>
273
+ `;
274
+ }
275
+
276
+ private calculateMemoryPercent(): number {
277
+ // Simple extraction of numbers - in real app would parse properly
278
+ const used = parseFloat(this.data.memoryUsed);
279
+ const total = parseFloat(this.data.memoryTotal);
280
+ if (total === 0) return 0;
281
+ // Assuming both are in same unit for demo
282
+ return Math.min((used / total) * 100, 100);
283
+ }
284
+ }
@@ -0,0 +1,151 @@
1
+ import {
2
+ DeesElement,
3
+ customElement,
4
+ html,
5
+ css,
6
+ cssManager,
7
+ property,
8
+ type TemplateResult,
9
+ } from '@design.estate/dees-element';
10
+
11
+ declare global {
12
+ interface HTMLElementTagNameMap {
13
+ 'sz-reverse-proxy-card': SzReverseProxyCard;
14
+ }
15
+ }
16
+
17
+ @customElement('sz-reverse-proxy-card')
18
+ export class SzReverseProxyCard extends DeesElement {
19
+ public static demo = () => html`
20
+ <div style="padding: 24px; max-width: 400px;">
21
+ <sz-reverse-proxy-card
22
+ httpPort="8080"
23
+ httpsPort="8443"
24
+ httpActive
25
+ httpsActive
26
+ routeCount="3"
27
+ ></sz-reverse-proxy-card>
28
+ </div>
29
+ `;
30
+
31
+ @property({ type: String })
32
+ public accessor httpPort: string = '80';
33
+
34
+ @property({ type: String })
35
+ public accessor httpsPort: string = '443';
36
+
37
+ @property({ type: Boolean })
38
+ public accessor httpActive: boolean = false;
39
+
40
+ @property({ type: Boolean })
41
+ public accessor httpsActive: boolean = false;
42
+
43
+ @property({ type: String })
44
+ public accessor routeCount: string = '0';
45
+
46
+ public static styles = [
47
+ cssManager.defaultStyles,
48
+ css`
49
+ :host {
50
+ display: block;
51
+ height: 100%;
52
+ }
53
+
54
+ .card {
55
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
56
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
57
+ border-radius: 8px;
58
+ padding: 20px;
59
+ height: 100%;
60
+ box-sizing: border-box;
61
+ }
62
+
63
+ .header {
64
+ margin-bottom: 16px;
65
+ }
66
+
67
+ .title {
68
+ font-size: 16px;
69
+ font-weight: 600;
70
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
71
+ }
72
+
73
+ .subtitle {
74
+ font-size: 13px;
75
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
76
+ margin-top: 2px;
77
+ }
78
+
79
+ .items {
80
+ display: flex;
81
+ flex-direction: column;
82
+ gap: 10px;
83
+ }
84
+
85
+ .item {
86
+ display: flex;
87
+ justify-content: space-between;
88
+ align-items: center;
89
+ }
90
+
91
+ .item-label {
92
+ font-size: 14px;
93
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
94
+ }
95
+
96
+ .item-value {
97
+ font-size: 14px;
98
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
99
+ }
100
+
101
+ .badge {
102
+ display: inline-flex;
103
+ align-items: center;
104
+ padding: 2px 10px;
105
+ border-radius: 9999px;
106
+ font-size: 12px;
107
+ font-weight: 500;
108
+ }
109
+
110
+ .badge.active {
111
+ background: ${cssManager.bdTheme('#dcfce7', 'rgba(34, 197, 94, 0.2)')};
112
+ color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
113
+ }
114
+
115
+ .badge.inactive {
116
+ background: ${cssManager.bdTheme('#fee2e2', 'rgba(239, 68, 68, 0.2)')};
117
+ color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
118
+ }
119
+ `,
120
+ ];
121
+
122
+ public render(): TemplateResult {
123
+ return html`
124
+ <div class="card">
125
+ <div class="header">
126
+ <div class="title">Reverse Proxy</div>
127
+ <div class="subtitle">HTTP/HTTPS proxy status</div>
128
+ </div>
129
+
130
+ <div class="items">
131
+ <div class="item">
132
+ <span class="item-label">HTTP (${this.httpPort})</span>
133
+ <span class="badge ${this.httpActive ? 'active' : 'inactive'}">
134
+ ${this.httpActive ? 'Active' : 'Inactive'}
135
+ </span>
136
+ </div>
137
+ <div class="item">
138
+ <span class="item-label">HTTPS (${this.httpsPort})</span>
139
+ <span class="badge ${this.httpsActive ? 'active' : 'inactive'}">
140
+ ${this.httpsActive ? 'Active' : 'Inactive'}
141
+ </span>
142
+ </div>
143
+ <div class="item">
144
+ <span class="item-label">Routes</span>
145
+ <span class="item-value">${this.routeCount}</span>
146
+ </div>
147
+ </div>
148
+ </div>
149
+ `;
150
+ }
151
+ }