@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,88 @@
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
+ import './sz-dns-ssl-card.js';
12
+ import './sz-quick-actions-card.js';
13
+
14
+ import type { IQuickAction } from './sz-quick-actions-card.js';
15
+
16
+ declare global {
17
+ interface HTMLElementTagNameMap {
18
+ 'sz-status-grid-infra': SzStatusGridInfra;
19
+ }
20
+ }
21
+
22
+ @customElement('sz-status-grid-infra')
23
+ export class SzStatusGridInfra extends DeesElement {
24
+ public static demo = () => html`
25
+ <div style="padding: 24px; max-width: 1200px;">
26
+ <sz-status-grid-infra
27
+ dnsConfigured
28
+ acmeConfigured
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-status-grid-infra>
36
+ </div>
37
+ `;
38
+
39
+ @property({ type: Boolean })
40
+ public accessor dnsConfigured: boolean = false;
41
+
42
+ @property({ type: Boolean })
43
+ public accessor acmeConfigured: boolean = false;
44
+
45
+ @property({ type: Array })
46
+ public accessor actions: IQuickAction[] = [];
47
+
48
+ public static styles = [
49
+ cssManager.defaultStyles,
50
+ css`
51
+ :host {
52
+ display: block;
53
+ }
54
+
55
+ .grid {
56
+ display: grid;
57
+ grid-template-columns: 1fr;
58
+ gap: 16px;
59
+ align-items: stretch;
60
+ }
61
+
62
+ .grid > * {
63
+ height: 100%;
64
+ }
65
+
66
+ @media (min-width: 768px) {
67
+ .grid {
68
+ grid-template-columns: 1fr 2fr;
69
+ }
70
+ }
71
+ `,
72
+ ];
73
+
74
+ public render(): TemplateResult {
75
+ return html`
76
+ <div class="grid">
77
+ <sz-dns-ssl-card
78
+ ?dnsConfigured=${this.dnsConfigured}
79
+ ?acmeConfigured=${this.acmeConfigured}
80
+ ></sz-dns-ssl-card>
81
+ <sz-quick-actions-card
82
+ .actions=${this.actions}
83
+ @action-click=${(e: CustomEvent) => this.dispatchEvent(new CustomEvent('action-click', { detail: e.detail, bubbles: true, composed: true }))}
84
+ ></sz-quick-actions-card>
85
+ </div>
86
+ `;
87
+ }
88
+ }
@@ -0,0 +1,152 @@
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
+ import './sz-traffic-card.js';
12
+ import './sz-reverse-proxy-card.js';
13
+ import './sz-certificates-card.js';
14
+
15
+ import type { ITrafficData } from './sz-traffic-card.js';
16
+
17
+ declare global {
18
+ interface HTMLElementTagNameMap {
19
+ 'sz-status-grid-network': SzStatusGridNetwork;
20
+ }
21
+ }
22
+
23
+ export interface IProxyStatus {
24
+ httpPort: string;
25
+ httpsPort: string;
26
+ httpActive: boolean;
27
+ httpsActive: boolean;
28
+ routeCount: string;
29
+ }
30
+
31
+ export interface ICertificateStatus {
32
+ valid: number;
33
+ expiring: number;
34
+ expired: number;
35
+ }
36
+
37
+ @customElement('sz-status-grid-network')
38
+ export class SzStatusGridNetwork extends DeesElement {
39
+ public static demo = () => html`
40
+ <div style="padding: 24px; max-width: 1400px;">
41
+ <sz-status-grid-network
42
+ .traffic=${{
43
+ totalRequests: 125420,
44
+ requestsPerMinute: 847,
45
+ errorRate: 0.12,
46
+ avgResponseTime: 45,
47
+ statusDistribution: {
48
+ '2xx': 95.2,
49
+ '3xx': 2.1,
50
+ '4xx': 2.3,
51
+ '5xx': 0.4,
52
+ },
53
+ }}
54
+ .proxy=${{
55
+ httpPort: '80',
56
+ httpsPort: '443',
57
+ httpActive: true,
58
+ httpsActive: true,
59
+ routeCount: '12',
60
+ }}
61
+ .certificates=${{
62
+ valid: 8,
63
+ expiring: 2,
64
+ expired: 0,
65
+ }}
66
+ ></sz-status-grid-network>
67
+ </div>
68
+ `;
69
+
70
+ @property({ type: Object })
71
+ public accessor traffic: ITrafficData = {
72
+ requests: 0,
73
+ errors: 0,
74
+ errorPercent: 0,
75
+ avgResponse: 0,
76
+ reqPerMin: 0,
77
+ status2xx: 0,
78
+ status3xx: 0,
79
+ status4xx: 0,
80
+ status5xx: 0,
81
+ };
82
+
83
+ @property({ type: Object })
84
+ public accessor proxy: IProxyStatus = {
85
+ httpPort: '80',
86
+ httpsPort: '443',
87
+ httpActive: false,
88
+ httpsActive: false,
89
+ routeCount: '0',
90
+ };
91
+
92
+ @property({ type: Object })
93
+ public accessor certificates: ICertificateStatus = {
94
+ valid: 0,
95
+ expiring: 0,
96
+ expired: 0,
97
+ };
98
+
99
+ public static styles = [
100
+ cssManager.defaultStyles,
101
+ css`
102
+ :host {
103
+ display: block;
104
+ }
105
+
106
+ .grid {
107
+ display: grid;
108
+ grid-template-columns: 1fr;
109
+ gap: 16px;
110
+ align-items: stretch;
111
+ }
112
+
113
+ .grid > * {
114
+ height: 100%;
115
+ }
116
+
117
+ @media (min-width: 768px) {
118
+ .grid {
119
+ grid-template-columns: 1fr 1fr;
120
+ }
121
+ }
122
+
123
+ @media (min-width: 1024px) {
124
+ .grid {
125
+ grid-template-columns: 2fr 1fr 1fr;
126
+ }
127
+ }
128
+ `,
129
+ ];
130
+
131
+ public render(): TemplateResult {
132
+ return html`
133
+ <div class="grid">
134
+ <sz-traffic-card
135
+ .data=${this.traffic}
136
+ ></sz-traffic-card>
137
+ <sz-reverse-proxy-card
138
+ httpPort="${this.proxy.httpPort}"
139
+ httpsPort="${this.proxy.httpsPort}"
140
+ ?httpActive=${this.proxy.httpActive}
141
+ ?httpsActive=${this.proxy.httpsActive}
142
+ routeCount="${this.proxy.routeCount}"
143
+ ></sz-reverse-proxy-card>
144
+ <sz-certificates-card
145
+ valid="${this.certificates.valid}"
146
+ expiring="${this.certificates.expiring}"
147
+ expired="${this.certificates.expired}"
148
+ ></sz-certificates-card>
149
+ </div>
150
+ `;
151
+ }
152
+ }
@@ -0,0 +1,99 @@
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
+ import './sz-resource-usage-card.js';
12
+ import './sz-platform-services-card.js';
13
+
14
+ import type { IResourceUsage } from './sz-resource-usage-card.js';
15
+ import type { IPlatformService } from './sz-platform-services-card.js';
16
+
17
+ declare global {
18
+ interface HTMLElementTagNameMap {
19
+ 'sz-status-grid-services': SzStatusGridServices;
20
+ }
21
+ }
22
+
23
+ @customElement('sz-status-grid-services')
24
+ export class SzStatusGridServices extends DeesElement {
25
+ public static demo = () => html`
26
+ <div style="padding: 24px; max-width: 1200px;">
27
+ <sz-status-grid-services
28
+ .resourceUsage=${{
29
+ cpu: { percentage: 45, label: 'CPU Usage' },
30
+ memory: { percentage: 62, label: 'Memory', used: '4.96 GB', total: '8 GB' },
31
+ network: { percentage: 23, label: 'Network I/O', rate: '1.2 MB/s' },
32
+ topConsumers: [
33
+ { name: 'api-service', cpu: 25, memory: 512 },
34
+ { name: 'web-frontend', cpu: 15, memory: 256 },
35
+ { name: 'worker', cpu: 5, memory: 128 },
36
+ ],
37
+ }}
38
+ .platformServices=${[
39
+ { name: 'MongoDB', status: 'running' },
40
+ { name: 'S3 Storage', status: 'running' },
41
+ { name: 'ClickHouse', status: 'stopped' },
42
+ { name: 'Redis Cache', status: 'running' },
43
+ ]}
44
+ ></sz-status-grid-services>
45
+ </div>
46
+ `;
47
+
48
+ @property({ type: Object })
49
+ public accessor resourceUsage: IResourceUsage = {
50
+ cpu: 0,
51
+ memoryUsed: '0 GB',
52
+ memoryTotal: '0 GB',
53
+ networkIn: '0 MB/s',
54
+ networkOut: '0 MB/s',
55
+ topConsumers: [],
56
+ };
57
+
58
+ @property({ type: Array })
59
+ public accessor platformServices: IPlatformService[] = [];
60
+
61
+ public static styles = [
62
+ cssManager.defaultStyles,
63
+ css`
64
+ :host {
65
+ display: block;
66
+ }
67
+
68
+ .grid {
69
+ display: grid;
70
+ grid-template-columns: 1fr;
71
+ gap: 16px;
72
+ align-items: stretch;
73
+ }
74
+
75
+ .grid > * {
76
+ height: 100%;
77
+ }
78
+
79
+ @media (min-width: 768px) {
80
+ .grid {
81
+ grid-template-columns: 1fr 1fr;
82
+ }
83
+ }
84
+ `,
85
+ ];
86
+
87
+ public render(): TemplateResult {
88
+ return html`
89
+ <div class="grid">
90
+ <sz-resource-usage-card
91
+ .usage=${this.resourceUsage}
92
+ ></sz-resource-usage-card>
93
+ <sz-platform-services-card
94
+ .services=${this.platformServices}
95
+ ></sz-platform-services-card>
96
+ </div>
97
+ `;
98
+ }
99
+ }
@@ -0,0 +1,308 @@
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-tokens-view': SzTokensView;
14
+ }
15
+ }
16
+
17
+ export interface IToken {
18
+ id: string;
19
+ name: string;
20
+ type: 'global' | 'ci';
21
+ service?: string;
22
+ createdAt: string;
23
+ lastUsed?: string;
24
+ }
25
+
26
+ @customElement('sz-tokens-view')
27
+ export class SzTokensView extends DeesElement {
28
+ public static demo = () => html`
29
+ <div style="padding: 24px; max-width: 1000px;">
30
+ <sz-tokens-view
31
+ .globalTokens=${[
32
+ { id: '1', name: 'CI/CD Pipeline', type: 'global', createdAt: '2024-01-15', lastUsed: '2024-01-20' },
33
+ { id: '2', name: 'Development', type: 'global', createdAt: '2024-01-10' },
34
+ ]}
35
+ .ciTokens=${[
36
+ { id: '3', name: 'hello-world-ci', type: 'ci', service: 'hello-world', createdAt: '2024-01-18' },
37
+ { id: '4', name: 'api-service-ci', type: 'ci', service: 'api-service', createdAt: '2024-01-12', lastUsed: '2024-01-19' },
38
+ ]}
39
+ ></sz-tokens-view>
40
+ </div>
41
+ `;
42
+
43
+ @property({ type: Array })
44
+ public accessor globalTokens: IToken[] = [];
45
+
46
+ @property({ type: Array })
47
+ public accessor ciTokens: IToken[] = [];
48
+
49
+ public static styles = [
50
+ cssManager.defaultStyles,
51
+ css`
52
+ :host {
53
+ display: block;
54
+ }
55
+
56
+ .section {
57
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
58
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
59
+ border-radius: 8px;
60
+ margin-bottom: 24px;
61
+ overflow: hidden;
62
+ }
63
+
64
+ .section-header {
65
+ display: flex;
66
+ justify-content: space-between;
67
+ align-items: flex-start;
68
+ padding: 16px;
69
+ border-bottom: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
70
+ }
71
+
72
+ .section-info {
73
+ display: flex;
74
+ flex-direction: column;
75
+ gap: 4px;
76
+ }
77
+
78
+ .section-title {
79
+ font-size: 16px;
80
+ font-weight: 600;
81
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
82
+ }
83
+
84
+ .section-subtitle {
85
+ font-size: 13px;
86
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
87
+ }
88
+
89
+ .create-button {
90
+ display: inline-flex;
91
+ align-items: center;
92
+ gap: 6px;
93
+ padding: 8px 14px;
94
+ background: ${cssManager.bdTheme('#18181b', '#fafafa')};
95
+ border: none;
96
+ border-radius: 6px;
97
+ font-size: 13px;
98
+ font-weight: 500;
99
+ color: ${cssManager.bdTheme('#fafafa', '#18181b')};
100
+ cursor: pointer;
101
+ transition: all 200ms ease;
102
+ }
103
+
104
+ .create-button:hover {
105
+ opacity: 0.9;
106
+ }
107
+
108
+ .token-list {
109
+ padding: 16px;
110
+ }
111
+
112
+ .token-item {
113
+ display: flex;
114
+ justify-content: space-between;
115
+ align-items: center;
116
+ padding: 12px 16px;
117
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
118
+ border-radius: 6px;
119
+ margin-bottom: 8px;
120
+ }
121
+
122
+ .token-item:last-child {
123
+ margin-bottom: 0;
124
+ }
125
+
126
+ .token-info {
127
+ display: flex;
128
+ flex-direction: column;
129
+ gap: 4px;
130
+ }
131
+
132
+ .token-name {
133
+ font-size: 14px;
134
+ font-weight: 500;
135
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
136
+ }
137
+
138
+ .token-meta {
139
+ font-size: 12px;
140
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
141
+ }
142
+
143
+ .token-service {
144
+ display: inline-flex;
145
+ align-items: center;
146
+ padding: 2px 8px;
147
+ background: ${cssManager.bdTheme('#dbeafe', 'rgba(59, 130, 246, 0.2)')};
148
+ color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
149
+ border-radius: 4px;
150
+ font-size: 12px;
151
+ font-weight: 500;
152
+ margin-right: 8px;
153
+ }
154
+
155
+ .token-actions {
156
+ display: flex;
157
+ gap: 8px;
158
+ }
159
+
160
+ .action-button {
161
+ padding: 6px 12px;
162
+ background: transparent;
163
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
164
+ border-radius: 4px;
165
+ font-size: 12px;
166
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
167
+ cursor: pointer;
168
+ transition: all 200ms ease;
169
+ }
170
+
171
+ .action-button:hover {
172
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
173
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
174
+ }
175
+
176
+ .action-button.delete {
177
+ color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
178
+ border-color: ${cssManager.bdTheme('#fee2e2', 'rgba(239, 68, 68, 0.3)')};
179
+ }
180
+
181
+ .action-button.delete:hover {
182
+ background: ${cssManager.bdTheme('#fee2e2', 'rgba(239, 68, 68, 0.2)')};
183
+ }
184
+
185
+ .empty-state {
186
+ padding: 32px 16px;
187
+ text-align: center;
188
+ }
189
+
190
+ .empty-text {
191
+ font-size: 14px;
192
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
193
+ margin-bottom: 16px;
194
+ }
195
+
196
+ .empty-button {
197
+ display: inline-flex;
198
+ align-items: center;
199
+ gap: 6px;
200
+ padding: 8px 14px;
201
+ background: ${cssManager.bdTheme('#ffffff', '#09090b')};
202
+ border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
203
+ border-radius: 6px;
204
+ font-size: 13px;
205
+ font-weight: 500;
206
+ color: ${cssManager.bdTheme('#18181b', '#fafafa')};
207
+ cursor: pointer;
208
+ transition: all 200ms ease;
209
+ }
210
+
211
+ .empty-button:hover {
212
+ background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
213
+ }
214
+ `,
215
+ ];
216
+
217
+ public render(): TemplateResult {
218
+ return html`
219
+ <div class="section">
220
+ <div class="section-header">
221
+ <div class="section-info">
222
+ <div class="section-title">Global Tokens</div>
223
+ <div class="section-subtitle">Tokens that can push images to multiple services</div>
224
+ </div>
225
+ <button class="create-button" @click=${() => this.handleCreate('global')}>
226
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
227
+ <line x1="12" y1="5" x2="12" y2="19"></line>
228
+ <line x1="5" y1="12" x2="19" y2="12"></line>
229
+ </svg>
230
+ Create Token
231
+ </button>
232
+ </div>
233
+ ${this.globalTokens.length > 0 ? html`
234
+ <div class="token-list">
235
+ ${this.globalTokens.map(token => this.renderToken(token))}
236
+ </div>
237
+ ` : html`
238
+ <div class="empty-state">
239
+ <div class="empty-text">No global tokens created</div>
240
+ <button class="empty-button" @click=${() => this.handleCreate('global')}>Create Global Token</button>
241
+ </div>
242
+ `}
243
+ </div>
244
+
245
+ <div class="section">
246
+ <div class="section-header">
247
+ <div class="section-info">
248
+ <div class="section-title">CI Tokens (Service-specific)</div>
249
+ <div class="section-subtitle">Tokens tied to individual services for CI/CD pipelines</div>
250
+ </div>
251
+ <button class="create-button" @click=${() => this.handleCreate('ci')}>
252
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
253
+ <line x1="12" y1="5" x2="12" y2="19"></line>
254
+ <line x1="5" y1="12" x2="19" y2="12"></line>
255
+ </svg>
256
+ Create Token
257
+ </button>
258
+ </div>
259
+ ${this.ciTokens.length > 0 ? html`
260
+ <div class="token-list">
261
+ ${this.ciTokens.map(token => this.renderToken(token))}
262
+ </div>
263
+ ` : html`
264
+ <div class="empty-state">
265
+ <div class="empty-text">No CI tokens created</div>
266
+ <button class="empty-button" @click=${() => this.handleCreate('ci')}>Create CI Token</button>
267
+ </div>
268
+ `}
269
+ </div>
270
+ `;
271
+ }
272
+
273
+ private renderToken(token: IToken): TemplateResult {
274
+ return html`
275
+ <div class="token-item">
276
+ <div class="token-info">
277
+ <div class="token-name">${token.name}</div>
278
+ <div class="token-meta">
279
+ ${token.service ? html`<span class="token-service">${token.service}</span>` : ''}
280
+ Created ${token.createdAt}
281
+ ${token.lastUsed ? html` · Last used ${token.lastUsed}` : ''}
282
+ </div>
283
+ </div>
284
+ <div class="token-actions">
285
+ <button class="action-button" @click=${() => this.handleCopy(token)}>Copy</button>
286
+ <button class="action-button" @click=${() => this.handleRegenerate(token)}>Regenerate</button>
287
+ <button class="action-button delete" @click=${() => this.handleDelete(token)}>Delete</button>
288
+ </div>
289
+ </div>
290
+ `;
291
+ }
292
+
293
+ private handleCreate(type: 'global' | 'ci') {
294
+ this.dispatchEvent(new CustomEvent('create', { detail: { type }, bubbles: true, composed: true }));
295
+ }
296
+
297
+ private handleCopy(token: IToken) {
298
+ this.dispatchEvent(new CustomEvent('copy', { detail: token, bubbles: true, composed: true }));
299
+ }
300
+
301
+ private handleRegenerate(token: IToken) {
302
+ this.dispatchEvent(new CustomEvent('regenerate', { detail: token, bubbles: true, composed: true }));
303
+ }
304
+
305
+ private handleDelete(token: IToken) {
306
+ this.dispatchEvent(new CustomEvent('delete', { detail: token, bubbles: true, composed: true }));
307
+ }
308
+ }