@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,163 @@
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-platform-services-card': SzPlatformServicesCard;
14
+ }
15
+ }
16
+
17
+ export interface IPlatformService {
18
+ name: string;
19
+ status: string;
20
+ running: boolean;
21
+ url?: string;
22
+ }
23
+
24
+ @customElement('sz-platform-services-card')
25
+ export class SzPlatformServicesCard extends DeesElement {
26
+ public static demo = () => html`
27
+ <div style="padding: 24px; max-width: 500px;">
28
+ <sz-platform-services-card
29
+ .services=${[
30
+ { name: 'MongoDB', status: '1 DB', running: true },
31
+ { name: 'S3 Storage (MinIO)', status: '1 bucket', running: true },
32
+ { name: 'Caddy Reverse Proxy', status: 'Running', running: true },
33
+ { name: 'ClickHouse', status: '1 DB', running: true },
34
+ ]}
35
+ ></sz-platform-services-card>
36
+ </div>
37
+ `;
38
+
39
+ @property({ type: Array })
40
+ public accessor services: IPlatformService[] = [];
41
+
42
+ public static styles = [
43
+ cssManager.defaultStyles,
44
+ css`
45
+ :host {
46
+ display: block;
47
+ height: 100%;
48
+ }
49
+
50
+ .card {
51
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
52
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
53
+ border-radius: 8px;
54
+ padding: 20px;
55
+ height: 100%;
56
+ box-sizing: border-box;
57
+ }
58
+
59
+ .header {
60
+ margin-bottom: 16px;
61
+ }
62
+
63
+ .title {
64
+ font-size: 16px;
65
+ font-weight: 600;
66
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
67
+ }
68
+
69
+ .subtitle {
70
+ font-size: 13px;
71
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
72
+ margin-top: 2px;
73
+ }
74
+
75
+ .services-list {
76
+ display: flex;
77
+ flex-direction: column;
78
+ gap: 12px;
79
+ }
80
+
81
+ .service-item {
82
+ display: flex;
83
+ justify-content: space-between;
84
+ align-items: center;
85
+ padding: 8px 0;
86
+ cursor: pointer;
87
+ transition: opacity 200ms ease;
88
+ }
89
+
90
+ .service-item:hover {
91
+ opacity: 0.8;
92
+ }
93
+
94
+ .service-left {
95
+ display: flex;
96
+ align-items: center;
97
+ gap: 10px;
98
+ }
99
+
100
+ .status-dot {
101
+ width: 8px;
102
+ height: 8px;
103
+ border-radius: 50%;
104
+ flex-shrink: 0;
105
+ }
106
+
107
+ .status-dot.running {
108
+ background: ${cssManager.bdTheme('#22c55e', '#22c55e')};
109
+ box-shadow: 0 0 6px ${cssManager.bdTheme('rgba(34, 197, 94, 0.4)', 'rgba(34, 197, 94, 0.4)')};
110
+ }
111
+
112
+ .status-dot.stopped {
113
+ background: ${cssManager.bdTheme('#ef4444', '#ef4444')};
114
+ }
115
+
116
+ .service-name {
117
+ font-size: 14px;
118
+ font-weight: 500;
119
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
120
+ }
121
+
122
+ .service-status {
123
+ font-size: 13px;
124
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
125
+ }
126
+ `,
127
+ ];
128
+
129
+ public render(): TemplateResult {
130
+ return html`
131
+ <div class="card">
132
+ <div class="header">
133
+ <div class="title">Platform Services</div>
134
+ <div class="subtitle">Infrastructure status</div>
135
+ </div>
136
+
137
+ <div class="services-list">
138
+ ${this.services.map(
139
+ (service) => html`
140
+ <div class="service-item" @click=${() => this.handleServiceClick(service)}>
141
+ <div class="service-left">
142
+ <div class="status-dot ${service.running ? 'running' : 'stopped'}"></div>
143
+ <span class="service-name">${service.name}</span>
144
+ </div>
145
+ <span class="service-status">${service.status}</span>
146
+ </div>
147
+ `
148
+ )}
149
+ </div>
150
+ </div>
151
+ `;
152
+ }
153
+
154
+ private handleServiceClick(service: IPlatformService) {
155
+ this.dispatchEvent(
156
+ new CustomEvent('service-click', {
157
+ detail: service,
158
+ bubbles: true,
159
+ composed: true,
160
+ })
161
+ );
162
+ }
163
+ }
@@ -0,0 +1,161 @@
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-quick-actions-card': SzQuickActionsCard;
14
+ }
15
+ }
16
+
17
+ export interface IQuickAction {
18
+ label: string;
19
+ icon?: string;
20
+ primary?: boolean;
21
+ url?: string;
22
+ }
23
+
24
+ @customElement('sz-quick-actions-card')
25
+ export class SzQuickActionsCard extends DeesElement {
26
+ public static demo = () => html`
27
+ <div style="padding: 24px; max-width: 800px;">
28
+ <sz-quick-actions-card
29
+ .actions=${[
30
+ { label: 'Deploy Service', icon: 'plus', primary: true },
31
+ { label: 'View All Services' },
32
+ { label: 'Platform Services' },
33
+ { label: 'Manage Domains' },
34
+ ]}
35
+ ></sz-quick-actions-card>
36
+ </div>
37
+ `;
38
+
39
+ @property({ type: Array })
40
+ public accessor actions: IQuickAction[] = [];
41
+
42
+ public static styles = [
43
+ cssManager.defaultStyles,
44
+ css`
45
+ :host {
46
+ display: block;
47
+ height: 100%;
48
+ }
49
+
50
+ .card {
51
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
52
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
53
+ border-radius: 8px;
54
+ padding: 20px;
55
+ height: 100%;
56
+ box-sizing: border-box;
57
+ }
58
+
59
+ .header {
60
+ margin-bottom: 16px;
61
+ }
62
+
63
+ .title {
64
+ font-size: 16px;
65
+ font-weight: 600;
66
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
67
+ }
68
+
69
+ .subtitle {
70
+ font-size: 13px;
71
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
72
+ margin-top: 2px;
73
+ }
74
+
75
+ .actions {
76
+ display: flex;
77
+ flex-wrap: wrap;
78
+ gap: 12px;
79
+ }
80
+
81
+ .action-button {
82
+ display: inline-flex;
83
+ align-items: center;
84
+ gap: 8px;
85
+ padding: 10px 16px;
86
+ border-radius: 6px;
87
+ font-size: 14px;
88
+ font-weight: 500;
89
+ cursor: pointer;
90
+ transition: all 200ms ease;
91
+ border: none;
92
+ outline: none;
93
+ }
94
+
95
+ .action-button.primary {
96
+ background: ${cssManager.bdTheme('#2563eb', '#3b82f6')};
97
+ color: white;
98
+ }
99
+
100
+ .action-button.primary:hover {
101
+ background: ${cssManager.bdTheme('#1d4ed8', '#2563eb')};
102
+ }
103
+
104
+ .action-button.secondary {
105
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
106
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
107
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
108
+ }
109
+
110
+ .action-button.secondary:hover {
111
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
112
+ border-color: ${cssManager.bdTheme('#d4d4d8', '#3f3f46')};
113
+ }
114
+
115
+ .action-icon {
116
+ width: 16px;
117
+ height: 16px;
118
+ }
119
+ `,
120
+ ];
121
+
122
+ public render(): TemplateResult {
123
+ return html`
124
+ <div class="card">
125
+ <div class="header">
126
+ <div class="title">Quick Actions</div>
127
+ <div class="subtitle">Common tasks and shortcuts</div>
128
+ </div>
129
+
130
+ <div class="actions">
131
+ ${this.actions.map(
132
+ (action) => html`
133
+ <button
134
+ class="action-button ${action.primary ? 'primary' : 'secondary'}"
135
+ @click=${() => this.handleActionClick(action)}
136
+ >
137
+ ${action.icon === 'plus' ? html`
138
+ <svg class="action-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
139
+ <line x1="12" y1="5" x2="12" y2="19"></line>
140
+ <line x1="5" y1="12" x2="19" y2="12"></line>
141
+ </svg>
142
+ ` : ''}
143
+ ${action.label}
144
+ </button>
145
+ `
146
+ )}
147
+ </div>
148
+ </div>
149
+ `;
150
+ }
151
+
152
+ private handleActionClick(action: IQuickAction) {
153
+ this.dispatchEvent(
154
+ new CustomEvent('action-click', {
155
+ detail: action,
156
+ bubbles: true,
157
+ composed: true,
158
+ })
159
+ );
160
+ }
161
+ }
@@ -0,0 +1,279 @@
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-external-view': SzRegistryExternalView;
14
+ }
15
+ }
16
+
17
+ export interface IExternalRegistry {
18
+ id: string;
19
+ name: string;
20
+ url: string;
21
+ username: string;
22
+ type: 'dockerhub' | 'ghcr' | 'gcr' | 'ecr' | 'custom';
23
+ }
24
+
25
+ @customElement('sz-registry-external-view')
26
+ export class SzRegistryExternalView extends DeesElement {
27
+ public static demo = () => html`
28
+ <div style="padding: 24px; max-width: 800px;">
29
+ <sz-registry-external-view
30
+ .registries=${[
31
+ { id: '1', name: 'Docker Hub', url: 'docker.io', username: 'myuser', type: 'dockerhub' },
32
+ { id: '2', name: 'GitHub Container Registry', url: 'ghcr.io', username: 'myorg', type: 'ghcr' },
33
+ ]}
34
+ ></sz-registry-external-view>
35
+ </div>
36
+ `;
37
+
38
+ @property({ type: Array })
39
+ public accessor registries: IExternalRegistry[] = [];
40
+
41
+ public static styles = [
42
+ cssManager.defaultStyles,
43
+ css`
44
+ :host {
45
+ display: block;
46
+ }
47
+
48
+ .header {
49
+ display: flex;
50
+ justify-content: space-between;
51
+ align-items: flex-start;
52
+ margin-bottom: 24px;
53
+ }
54
+
55
+ .header-info {
56
+ display: flex;
57
+ flex-direction: column;
58
+ gap: 4px;
59
+ }
60
+
61
+ .header-title {
62
+ font-size: 18px;
63
+ font-weight: 600;
64
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
65
+ }
66
+
67
+ .header-subtitle {
68
+ font-size: 14px;
69
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
70
+ }
71
+
72
+ .add-button {
73
+ display: inline-flex;
74
+ align-items: center;
75
+ gap: 6px;
76
+ padding: 8px 14px;
77
+ background: ${cssManager.bdTheme('#18181b', '#fafafa')};
78
+ border: none;
79
+ border-radius: 6px;
80
+ font-size: 13px;
81
+ font-weight: 500;
82
+ color: ${cssManager.bdTheme('#fafafa', '#18181b')};
83
+ cursor: pointer;
84
+ transition: all 200ms ease;
85
+ }
86
+
87
+ .add-button:hover {
88
+ opacity: 0.9;
89
+ }
90
+
91
+ .registry-list {
92
+ display: flex;
93
+ flex-direction: column;
94
+ gap: 12px;
95
+ }
96
+
97
+ .registry-item {
98
+ display: flex;
99
+ justify-content: space-between;
100
+ align-items: center;
101
+ padding: 16px;
102
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
103
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
104
+ border-radius: 8px;
105
+ }
106
+
107
+ .registry-info {
108
+ display: flex;
109
+ align-items: center;
110
+ gap: 12px;
111
+ }
112
+
113
+ .registry-icon {
114
+ width: 40px;
115
+ height: 40px;
116
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
117
+ border-radius: 8px;
118
+ display: flex;
119
+ align-items: center;
120
+ justify-content: center;
121
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
122
+ }
123
+
124
+ .registry-details {
125
+ display: flex;
126
+ flex-direction: column;
127
+ gap: 2px;
128
+ }
129
+
130
+ .registry-name {
131
+ font-size: 14px;
132
+ font-weight: 500;
133
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
134
+ }
135
+
136
+ .registry-url {
137
+ font-size: 13px;
138
+ font-family: monospace;
139
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
140
+ }
141
+
142
+ .registry-actions {
143
+ display: flex;
144
+ gap: 8px;
145
+ }
146
+
147
+ .action-button {
148
+ padding: 6px 12px;
149
+ background: transparent;
150
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
151
+ border-radius: 4px;
152
+ font-size: 12px;
153
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
154
+ cursor: pointer;
155
+ transition: all 200ms ease;
156
+ }
157
+
158
+ .action-button:hover {
159
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
160
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
161
+ }
162
+
163
+ .action-button.delete {
164
+ color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
165
+ border-color: ${cssManager.bdTheme('#fee2e2', 'rgba(239, 68, 68, 0.3)')};
166
+ }
167
+
168
+ .action-button.delete:hover {
169
+ background: ${cssManager.bdTheme('#fee2e2', 'rgba(239, 68, 68, 0.2)')};
170
+ }
171
+
172
+ .empty-state {
173
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
174
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
175
+ border-radius: 8px;
176
+ padding: 48px 24px;
177
+ text-align: center;
178
+ }
179
+
180
+ .empty-icon {
181
+ width: 48px;
182
+ height: 48px;
183
+ margin: 0 auto 16px;
184
+ color: ${cssManager.bdTheme('#a1a1aa', '#52525b')};
185
+ }
186
+
187
+ .empty-title {
188
+ font-size: 16px;
189
+ font-weight: 600;
190
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
191
+ margin-bottom: 8px;
192
+ }
193
+
194
+ .empty-description {
195
+ font-size: 14px;
196
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
197
+ margin-bottom: 16px;
198
+ }
199
+
200
+ .empty-button {
201
+ display: inline-flex;
202
+ align-items: center;
203
+ gap: 6px;
204
+ padding: 8px 14px;
205
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
206
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
207
+ border-radius: 6px;
208
+ font-size: 13px;
209
+ font-weight: 500;
210
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
211
+ cursor: pointer;
212
+ transition: all 200ms ease;
213
+ }
214
+
215
+ .empty-button:hover {
216
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
217
+ }
218
+ `,
219
+ ];
220
+
221
+ public render(): TemplateResult {
222
+ return html`
223
+ <div class="header">
224
+ <div class="header-info">
225
+ <div class="header-title">External Registries</div>
226
+ <div class="header-subtitle">Add credentials for private Docker registries</div>
227
+ </div>
228
+ <button class="add-button" @click=${() => this.handleAdd()}>Add Registry</button>
229
+ </div>
230
+
231
+ ${this.registries.length > 0 ? html`
232
+ <div class="registry-list">
233
+ ${this.registries.map(registry => html`
234
+ <div class="registry-item">
235
+ <div class="registry-info">
236
+ <div class="registry-icon">
237
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
238
+ <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>
239
+ </svg>
240
+ </div>
241
+ <div class="registry-details">
242
+ <div class="registry-name">${registry.name}</div>
243
+ <div class="registry-url">${registry.url} (${registry.username})</div>
244
+ </div>
245
+ </div>
246
+ <div class="registry-actions">
247
+ <button class="action-button" @click=${() => this.handleEdit(registry)}>Edit</button>
248
+ <button class="action-button delete" @click=${() => this.handleDelete(registry)}>Delete</button>
249
+ </div>
250
+ </div>
251
+ `)}
252
+ </div>
253
+ ` : html`
254
+ <div class="empty-state">
255
+ <svg class="empty-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
256
+ <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>
257
+ <polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline>
258
+ <line x1="12" y1="22.08" x2="12" y2="12"></line>
259
+ </svg>
260
+ <div class="empty-title">No external registries</div>
261
+ <div class="empty-description">Add credentials for Docker Hub, GitHub Container Registry, or other private registries.</div>
262
+ <button class="empty-button" @click=${() => this.handleAdd()}>Add External Registry</button>
263
+ </div>
264
+ `}
265
+ `;
266
+ }
267
+
268
+ private handleAdd() {
269
+ this.dispatchEvent(new CustomEvent('add', { bubbles: true, composed: true }));
270
+ }
271
+
272
+ private handleEdit(registry: IExternalRegistry) {
273
+ this.dispatchEvent(new CustomEvent('edit', { detail: registry, bubbles: true, composed: true }));
274
+ }
275
+
276
+ private handleDelete(registry: IExternalRegistry) {
277
+ this.dispatchEvent(new CustomEvent('delete', { detail: registry, bubbles: true, composed: true }));
278
+ }
279
+ }