@uptime.link/statuspage 1.1.0 → 1.2.0

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 (28) hide show
  1. package/dist_bundle/bundle.js +1823 -915
  2. package/dist_bundle/bundle.js.map +3 -3
  3. package/dist_ts_web/00_commitinfo_data.js +1 -1
  4. package/dist_ts_web/elements/upl-statuspage-assetsselector.js +119 -45
  5. package/dist_ts_web/elements/upl-statuspage-footer.js +81 -27
  6. package/dist_ts_web/elements/upl-statuspage-header.js +79 -19
  7. package/dist_ts_web/elements/upl-statuspage-incidents.js +242 -55
  8. package/dist_ts_web/elements/upl-statuspage-statsgrid.js +225 -50
  9. package/dist_ts_web/elements/upl-statuspage-statusbar.js +58 -7
  10. package/dist_ts_web/elements/upl-statuspage-statusdetails.js +36 -11
  11. package/dist_ts_web/elements/upl-statuspage-statusmonth.d.ts +2 -0
  12. package/dist_ts_web/elements/upl-statuspage-statusmonth.js +415 -230
  13. package/dist_ts_web/styles/shared.styles.d.ts +22 -0
  14. package/dist_ts_web/styles/shared.styles.js +146 -3
  15. package/dist_watch/bundle.js +1417 -444
  16. package/dist_watch/bundle.js.map +3 -3
  17. package/dist_watch/index.html +1 -0
  18. package/package.json +1 -1
  19. package/ts_web/00_commitinfo_data.ts +1 -1
  20. package/ts_web/elements/upl-statuspage-assetsselector.ts +118 -44
  21. package/ts_web/elements/upl-statuspage-footer.ts +80 -26
  22. package/ts_web/elements/upl-statuspage-header.ts +87 -18
  23. package/ts_web/elements/upl-statuspage-incidents.ts +247 -56
  24. package/ts_web/elements/upl-statuspage-statsgrid.ts +224 -52
  25. package/ts_web/elements/upl-statuspage-statusbar.ts +57 -6
  26. package/ts_web/elements/upl-statuspage-statusdetails.ts +35 -10
  27. package/ts_web/elements/upl-statuspage-statusmonth.ts +436 -252
  28. package/ts_web/styles/shared.styles.ts +166 -2
@@ -76,66 +76,170 @@ export class UplStatuspageStatsgrid extends DeesElement {
76
76
  }
77
77
 
78
78
  .stat-card {
79
- background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')};
80
- border: 1px solid ${cssManager.bdTheme('#e5e7eb', '#27272a')};
81
- border-radius: ${unsafeCSS(sharedStyles.borderRadius.base)};
79
+ background: ${sharedStyles.colors.background.card};
80
+ border: 1px solid ${sharedStyles.colors.border.default};
81
+ border-radius: ${unsafeCSS(sharedStyles.borderRadius.lg)};
82
82
  padding: ${unsafeCSS(sharedStyles.spacing.lg)};
83
- transition: all 0.2s ease;
83
+ transition: all ${unsafeCSS(sharedStyles.durations.normal)} ${unsafeCSS(sharedStyles.easings.default)};
84
+ position: relative;
85
+ overflow: hidden;
86
+ animation: fadeInUp 0.4s ${unsafeCSS(sharedStyles.easings.default)} both;
87
+ }
88
+
89
+ .stat-card:nth-child(1) { animation-delay: 0ms; }
90
+ .stat-card:nth-child(2) { animation-delay: 50ms; }
91
+ .stat-card:nth-child(3) { animation-delay: 100ms; }
92
+ .stat-card:nth-child(4) { animation-delay: 150ms; }
93
+
94
+ @keyframes fadeInUp {
95
+ from {
96
+ opacity: 0;
97
+ transform: translateY(12px);
98
+ }
99
+ to {
100
+ opacity: 1;
101
+ transform: translateY(0);
102
+ }
103
+ }
104
+
105
+ /* Status-colored top accent */
106
+ .stat-card::before {
107
+ content: '';
108
+ position: absolute;
109
+ top: 0;
110
+ left: 0;
111
+ right: 0;
112
+ height: 3px;
113
+ background: ${sharedStyles.colors.border.muted};
114
+ transition: all ${unsafeCSS(sharedStyles.durations.fast)} ${unsafeCSS(sharedStyles.easings.default)};
115
+ }
116
+
117
+ .stat-card.status-card::before {
118
+ background: ${sharedStyles.colors.status.operational};
119
+ }
120
+
121
+ .stat-card.status-card.degraded::before {
122
+ background: ${sharedStyles.colors.status.degraded};
123
+ }
124
+
125
+ .stat-card.status-card.partial_outage::before {
126
+ background: ${sharedStyles.colors.status.partial};
127
+ }
128
+
129
+ .stat-card.status-card.major_outage::before {
130
+ background: ${sharedStyles.colors.status.major};
131
+ }
132
+
133
+ .stat-card.status-card.maintenance::before {
134
+ background: ${sharedStyles.colors.status.maintenance};
135
+ }
136
+
137
+ .stat-card.uptime-card::before {
138
+ background: ${sharedStyles.colors.status.operational};
139
+ }
140
+
141
+ .stat-card.response-card::before {
142
+ background: ${sharedStyles.colors.status.maintenance};
143
+ }
144
+
145
+ .stat-card.incident-card::before {
146
+ background: ${sharedStyles.colors.status.partial};
84
147
  }
85
148
 
86
149
  .stat-card:hover {
87
- border-color: ${cssManager.bdTheme('#d1d5db', '#3f3f46')};
88
- box-shadow: ${cssManager.bdTheme(
89
- '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
90
- '0 0 0 1px rgba(255, 255, 255, 0.1)'
91
- )};
150
+ border-color: ${sharedStyles.colors.border.muted};
151
+ box-shadow: ${unsafeCSS(sharedStyles.shadows.md)};
152
+ transform: translateY(-3px);
153
+ }
154
+
155
+ .stat-card:hover::before {
156
+ height: 4px;
92
157
  }
93
158
 
94
159
  .stat-label {
95
- font-size: 12px;
96
- color: ${cssManager.bdTheme('#6b7280', '#a1a1aa')};
160
+ font-size: 11px;
161
+ color: ${sharedStyles.colors.text.muted};
97
162
  text-transform: uppercase;
98
- letter-spacing: 0.05em;
99
- font-weight: 500;
163
+ letter-spacing: 0.06em;
164
+ font-weight: 600;
100
165
  margin-bottom: ${unsafeCSS(sharedStyles.spacing.sm)};
101
166
  display: flex;
102
167
  align-items: center;
103
- gap: ${unsafeCSS(sharedStyles.spacing.xs)};
168
+ gap: 6px;
169
+ }
170
+
171
+ .stat-label svg {
172
+ width: 14px;
173
+ height: 14px;
174
+ opacity: 0.7;
104
175
  }
105
176
 
106
177
  .stat-value {
107
- font-size: 24px;
108
- font-weight: 600;
109
- color: ${cssManager.bdTheme('#0a0a0a', '#fafafa')};
178
+ font-size: 28px;
179
+ font-weight: 700;
180
+ color: ${sharedStyles.colors.text.primary};
110
181
  font-variant-numeric: tabular-nums;
111
182
  line-height: 1.2;
183
+ letter-spacing: -0.02em;
184
+ transition: transform ${unsafeCSS(sharedStyles.durations.fast)} ${unsafeCSS(sharedStyles.easings.default)};
185
+ }
186
+
187
+ .stat-card:hover .stat-value {
188
+ transform: scale(1.02);
112
189
  }
113
190
 
114
191
  .stat-unit {
115
- font-size: 14px;
116
- font-weight: 400;
117
- color: ${cssManager.bdTheme('#6b7280', '#a1a1aa')};
118
- margin-left: 4px;
192
+ font-size: 16px;
193
+ font-weight: 500;
194
+ color: ${sharedStyles.colors.text.secondary};
195
+ margin-left: 2px;
119
196
  }
120
197
 
121
198
  .stat-change {
122
199
  font-size: 12px;
123
- margin-top: ${unsafeCSS(sharedStyles.spacing.xs)};
200
+ margin-top: ${unsafeCSS(sharedStyles.spacing.sm)};
124
201
  display: flex;
125
202
  align-items: center;
126
203
  gap: 4px;
204
+ padding: 4px 8px;
205
+ border-radius: ${unsafeCSS(sharedStyles.borderRadius.sm)};
206
+ width: fit-content;
127
207
  }
128
208
 
129
209
  .stat-change.positive {
130
- color: ${cssManager.bdTheme('#10b981', '#10b981')};
210
+ color: ${sharedStyles.colors.status.operational};
211
+ background: ${cssManager.bdTheme('rgba(22, 163, 74, 0.08)', 'rgba(34, 197, 94, 0.12)')};
131
212
  }
132
213
 
133
214
  .stat-change.negative {
134
- color: ${cssManager.bdTheme('#ef4444', '#ef4444')};
215
+ color: ${sharedStyles.colors.status.partial};
216
+ background: ${cssManager.bdTheme('rgba(239, 68, 68, 0.08)', 'rgba(248, 113, 113, 0.12)')};
135
217
  }
136
218
 
137
219
  .stat-change.neutral {
138
- color: ${cssManager.bdTheme('#6b7280', '#a1a1aa')};
220
+ color: ${sharedStyles.colors.text.muted};
221
+ background: ${sharedStyles.colors.background.muted};
222
+ }
223
+
224
+ /* Status text color variations */
225
+ .stat-value.operational {
226
+ color: ${sharedStyles.colors.status.operational};
227
+ }
228
+
229
+ .stat-value.degraded {
230
+ color: ${sharedStyles.colors.status.degraded};
231
+ }
232
+
233
+ .stat-value.partial_outage {
234
+ color: ${sharedStyles.colors.status.partial};
235
+ }
236
+
237
+ .stat-value.major_outage {
238
+ color: ${sharedStyles.colors.status.major};
239
+ }
240
+
241
+ .stat-value.maintenance {
242
+ color: ${sharedStyles.colors.status.maintenance};
139
243
  }
140
244
 
141
245
  .loading-skeleton {
@@ -145,61 +249,102 @@ export class UplStatuspageStatsgrid extends DeesElement {
145
249
  }
146
250
 
147
251
  .skeleton-card {
148
- background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')};
149
- border: 1px solid ${cssManager.bdTheme('#e5e7eb', '#27272a')};
150
- border-radius: ${unsafeCSS(sharedStyles.borderRadius.base)};
252
+ background: ${sharedStyles.colors.background.card};
253
+ border: 1px solid ${sharedStyles.colors.border.default};
254
+ border-radius: ${unsafeCSS(sharedStyles.borderRadius.lg)};
151
255
  padding: ${unsafeCSS(sharedStyles.spacing.lg)};
152
- height: 100px;
256
+ height: 110px;
257
+ position: relative;
258
+ overflow: hidden;
259
+ }
260
+
261
+ .skeleton-card::before {
262
+ content: '';
263
+ position: absolute;
264
+ top: 0;
265
+ left: 0;
266
+ right: 0;
267
+ height: 3px;
268
+ background: ${sharedStyles.colors.background.muted};
153
269
  }
154
270
 
155
271
  .skeleton-label {
156
- height: 14px;
272
+ height: 12px;
157
273
  width: 80px;
158
- background: ${cssManager.bdTheme('#f3f4f6', '#27272a')};
274
+ background: ${sharedStyles.colors.background.muted};
159
275
  border-radius: 4px;
160
276
  margin-bottom: ${unsafeCSS(sharedStyles.spacing.sm)};
161
- animation: pulse 2s infinite;
277
+ animation: shimmer 1.5s infinite;
162
278
  }
163
279
 
164
280
  .skeleton-value {
165
- height: 28px;
166
- width: 120px;
167
- background: ${cssManager.bdTheme('#f3f4f6', '#27272a')};
168
- border-radius: 4px;
169
- animation: pulse 2s infinite;
281
+ height: 32px;
282
+ width: 100px;
283
+ background: ${sharedStyles.colors.background.muted};
284
+ border-radius: 6px;
285
+ animation: shimmer 1.5s infinite;
170
286
  animation-delay: 0.1s;
171
287
  }
172
288
 
173
- @keyframes pulse {
174
- 0%, 100% { opacity: 1; }
175
- 50% { opacity: 0.5; }
289
+ .skeleton-change {
290
+ height: 20px;
291
+ width: 70px;
292
+ background: ${sharedStyles.colors.background.muted};
293
+ border-radius: 4px;
294
+ margin-top: ${unsafeCSS(sharedStyles.spacing.sm)};
295
+ animation: shimmer 1.5s infinite;
296
+ animation-delay: 0.2s;
297
+ }
298
+
299
+ @keyframes shimmer {
300
+ 0% { opacity: 0.5; }
301
+ 50% { opacity: 1; }
302
+ 100% { opacity: 0.5; }
176
303
  }
177
304
 
178
305
  .status-indicator {
179
306
  display: inline-block;
180
- width: 6px;
181
- height: 6px;
307
+ width: 8px;
308
+ height: 8px;
182
309
  border-radius: 50%;
310
+ flex-shrink: 0;
183
311
  }
184
312
 
185
313
  .status-indicator.operational {
186
314
  background: ${sharedStyles.colors.status.operational};
315
+ box-shadow: 0 0 0 2px ${cssManager.bdTheme('rgba(22, 163, 74, 0.2)', 'rgba(34, 197, 94, 0.25)')};
316
+ animation: statusPulse 2s ease-in-out infinite;
317
+ }
318
+
319
+ @keyframes statusPulse {
320
+ 0%, 100% { box-shadow: 0 0 0 2px ${cssManager.bdTheme('rgba(22, 163, 74, 0.2)', 'rgba(34, 197, 94, 0.25)')}; }
321
+ 50% { box-shadow: 0 0 0 4px ${cssManager.bdTheme('rgba(22, 163, 74, 0.1)', 'rgba(34, 197, 94, 0.15)')}; }
187
322
  }
188
323
 
189
324
  .status-indicator.degraded {
190
325
  background: ${sharedStyles.colors.status.degraded};
326
+ box-shadow: 0 0 0 2px ${cssManager.bdTheme('rgba(217, 119, 6, 0.2)', 'rgba(251, 191, 36, 0.25)')};
191
327
  }
192
328
 
193
329
  .status-indicator.partial_outage {
194
330
  background: ${sharedStyles.colors.status.partial};
331
+ box-shadow: 0 0 0 2px ${cssManager.bdTheme('rgba(239, 68, 68, 0.2)', 'rgba(248, 113, 113, 0.25)')};
195
332
  }
196
333
 
197
334
  .status-indicator.major_outage {
198
335
  background: ${sharedStyles.colors.status.major};
336
+ box-shadow: 0 0 0 2px ${cssManager.bdTheme('rgba(185, 28, 28, 0.2)', 'rgba(239, 68, 68, 0.25)')};
337
+ animation: majorPulse 1s ease-in-out infinite;
338
+ }
339
+
340
+ @keyframes majorPulse {
341
+ 0%, 100% { opacity: 1; }
342
+ 50% { opacity: 0.6; }
199
343
  }
200
344
 
201
345
  .status-indicator.maintenance {
202
346
  background: ${sharedStyles.colors.status.maintenance};
347
+ box-shadow: 0 0 0 2px ${cssManager.bdTheme('rgba(37, 99, 235, 0.2)', 'rgba(96, 165, 250, 0.25)')};
203
348
  }
204
349
 
205
350
  @media (max-width: 640px) {
@@ -208,7 +353,7 @@ export class UplStatuspageStatsgrid extends DeesElement {
208
353
  }
209
354
 
210
355
  .stats-grid {
211
- grid-template-columns: 1fr;
356
+ grid-template-columns: repeat(2, 1fr);
212
357
  gap: ${unsafeCSS(sharedStyles.spacing.sm)};
213
358
  }
214
359
 
@@ -217,7 +362,16 @@ export class UplStatuspageStatsgrid extends DeesElement {
217
362
  }
218
363
 
219
364
  .stat-value {
220
- font-size: 20px;
365
+ font-size: 22px;
366
+ }
367
+
368
+ .stat-label {
369
+ font-size: 10px;
370
+ }
371
+
372
+ .stat-label svg {
373
+ width: 12px;
374
+ height: 12px;
221
375
  }
222
376
  }
223
377
  `,
@@ -237,18 +391,23 @@ export class UplStatuspageStatsgrid extends DeesElement {
237
391
  </div>
238
392
  ` : html`
239
393
  <div class="stats-grid">
240
- <div class="stat-card">
394
+ <div class="stat-card status-card ${this.currentStatus}">
241
395
  <div class="stat-label">
242
396
  <span class="status-indicator ${this.currentStatus}"></span>
243
397
  Current Status
244
398
  </div>
245
- <div class="stat-value">
399
+ <div class="stat-value ${this.currentStatus}">
246
400
  ${this.formatStatus(this.currentStatus)}
247
401
  </div>
248
402
  </div>
249
403
 
250
- <div class="stat-card">
251
- <div class="stat-label">Uptime</div>
404
+ <div class="stat-card uptime-card">
405
+ <div class="stat-label">
406
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
407
+ <polyline points="22 12 18 12 15 21 9 3 6 12 2 12"></polyline>
408
+ </svg>
409
+ Uptime
410
+ </div>
252
411
  <div class="stat-value">
253
412
  ${this.uptime.toFixed(2)}<span class="stat-unit">%</span>
254
413
  </div>
@@ -257,16 +416,29 @@ export class UplStatuspageStatsgrid extends DeesElement {
257
416
  </div>
258
417
  </div>
259
418
 
260
- <div class="stat-card">
261
- <div class="stat-label">Avg Response Time</div>
419
+ <div class="stat-card response-card">
420
+ <div class="stat-label">
421
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
422
+ <circle cx="12" cy="12" r="10"></circle>
423
+ <polyline points="12 6 12 12 16 14"></polyline>
424
+ </svg>
425
+ Avg Response
426
+ </div>
262
427
  <div class="stat-value">
263
428
  ${this.avgResponseTime}<span class="stat-unit">ms</span>
264
429
  </div>
265
430
  ${this.renderResponseChange()}
266
431
  </div>
267
432
 
268
- <div class="stat-card">
269
- <div class="stat-label">Incidents</div>
433
+ <div class="stat-card incident-card">
434
+ <div class="stat-label">
435
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
436
+ <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path>
437
+ <line x1="12" y1="9" x2="12" y2="13"></line>
438
+ <line x1="12" y1="17" x2="12.01" y2="17"></line>
439
+ </svg>
440
+ Incidents
441
+ </div>
270
442
  <div class="stat-value">
271
443
  ${this.totalIncidents}
272
444
  </div>
@@ -54,22 +54,32 @@ export class UplStatuspageStatusbar extends DeesElement {
54
54
  display: flex;
55
55
  align-items: center;
56
56
  justify-content: space-between;
57
- min-height: 64px;
58
- padding: ${unsafeCSS(sharedStyles.spacing.md)} ${unsafeCSS(sharedStyles.spacing.lg)};
59
- border-radius: ${unsafeCSS(sharedStyles.borderRadius.lg)};
57
+ min-height: 72px;
58
+ padding: ${unsafeCSS(sharedStyles.spacing.lg)} ${unsafeCSS(sharedStyles.spacing.xl)};
59
+ border-radius: ${unsafeCSS(sharedStyles.borderRadius.xl)};
60
60
  cursor: default;
61
- transition: all ${unsafeCSS(sharedStyles.durations.normal)} ${unsafeCSS(sharedStyles.easings.default)};
61
+ transition: all ${unsafeCSS(sharedStyles.durations.slow)} ${unsafeCSS(sharedStyles.easings.default)};
62
62
  position: relative;
63
63
  overflow: hidden;
64
64
  font-weight: 500;
65
65
  font-size: 15px;
66
66
  letter-spacing: -0.01em;
67
- background: ${sharedStyles.colors.background.card};
68
67
  border: 1px solid ${sharedStyles.colors.border.default};
69
68
  box-shadow: ${unsafeCSS(sharedStyles.shadows.sm)};
70
69
  }
71
70
 
71
+ /* Gradient background overlay */
72
72
  .statusbar-inner::before {
73
+ content: '';
74
+ position: absolute;
75
+ inset: 0;
76
+ opacity: 1;
77
+ transition: opacity ${unsafeCSS(sharedStyles.durations.slow)} ${unsafeCSS(sharedStyles.easings.default)};
78
+ z-index: 0;
79
+ }
80
+
81
+ /* Left accent border */
82
+ .statusbar-inner::after {
73
83
  content: '';
74
84
  position: absolute;
75
85
  left: 0;
@@ -77,31 +87,72 @@ export class UplStatuspageStatusbar extends DeesElement {
77
87
  bottom: 0;
78
88
  width: 4px;
79
89
  transition: background ${unsafeCSS(sharedStyles.durations.normal)} ${unsafeCSS(sharedStyles.easings.default)};
90
+ z-index: 1;
80
91
  }
81
92
 
93
+ /* Operational - green gradient */
94
+ .statusbar-inner.operational {
95
+ background: ${sharedStyles.colors.background.card};
96
+ }
82
97
  .statusbar-inner.operational::before {
98
+ background: ${sharedStyles.statusGradients.operational};
99
+ }
100
+ .statusbar-inner.operational::after {
83
101
  background: ${sharedStyles.colors.status.operational};
84
102
  }
85
103
 
104
+ /* Degraded - yellow/amber gradient */
105
+ .statusbar-inner.degraded {
106
+ background: ${sharedStyles.colors.background.card};
107
+ }
86
108
  .statusbar-inner.degraded::before {
109
+ background: ${sharedStyles.statusGradients.degraded};
110
+ }
111
+ .statusbar-inner.degraded::after {
87
112
  background: ${sharedStyles.colors.status.degraded};
88
113
  }
89
114
 
115
+ /* Partial outage - orange/red gradient */
116
+ .statusbar-inner.partial_outage {
117
+ background: ${sharedStyles.colors.background.card};
118
+ }
90
119
  .statusbar-inner.partial_outage::before {
120
+ background: ${sharedStyles.statusGradients.partial};
121
+ }
122
+ .statusbar-inner.partial_outage::after {
91
123
  background: ${sharedStyles.colors.status.partial};
92
124
  }
93
125
 
126
+ /* Major outage - red gradient */
127
+ .statusbar-inner.major_outage {
128
+ background: ${sharedStyles.colors.background.card};
129
+ }
94
130
  .statusbar-inner.major_outage::before {
131
+ background: ${sharedStyles.statusGradients.major};
132
+ }
133
+ .statusbar-inner.major_outage::after {
95
134
  background: ${sharedStyles.colors.status.major};
96
135
  }
97
136
 
137
+ /* Maintenance - blue gradient */
138
+ .statusbar-inner.maintenance {
139
+ background: ${sharedStyles.colors.background.card};
140
+ }
98
141
  .statusbar-inner.maintenance::before {
142
+ background: ${sharedStyles.statusGradients.maintenance};
143
+ }
144
+ .statusbar-inner.maintenance::after {
99
145
  background: ${sharedStyles.colors.status.maintenance};
100
146
  }
101
147
 
102
148
  .statusbar-inner:hover {
103
149
  border-color: ${sharedStyles.colors.border.muted};
104
- box-shadow: ${unsafeCSS(sharedStyles.shadows.base)};
150
+ box-shadow: ${unsafeCSS(sharedStyles.shadows.md)};
151
+ transform: translateY(-1px);
152
+ }
153
+
154
+ .statusbar-inner:hover::before {
155
+ opacity: 1.2;
105
156
  }
106
157
 
107
158
  .status-indicator {
@@ -73,6 +73,12 @@ export class UplStatuspageStatusdetails extends DeesElement {
73
73
 
74
74
  .graph-container {
75
75
  position: relative;
76
+ animation: fadeIn 0.3s ${unsafeCSS(sharedStyles.easings.default)};
77
+ }
78
+
79
+ @keyframes fadeIn {
80
+ from { opacity: 0; }
81
+ to { opacity: 1; }
76
82
  }
77
83
 
78
84
  .mainbox {
@@ -98,14 +104,29 @@ export class UplStatuspageStatusdetails extends DeesElement {
98
104
  flex: 1;
99
105
  height: 100%;
100
106
  cursor: pointer;
101
- transition: all 0.15s ease;
107
+ transition: all ${unsafeCSS(sharedStyles.durations.fast)} ${unsafeCSS(sharedStyles.easings.default)};
102
108
  position: relative;
103
- border-radius: 2px;
109
+ border-radius: 3px;
110
+ animation: barGrow 0.4s ${unsafeCSS(sharedStyles.easings.default)} both;
111
+ animation-delay: calc(var(--bar-index, 0) * 8ms);
112
+ transform-origin: bottom;
113
+ }
114
+
115
+ @keyframes barGrow {
116
+ from {
117
+ transform: scaleY(0);
118
+ opacity: 0;
119
+ }
120
+ to {
121
+ transform: scaleY(1);
122
+ opacity: 1;
123
+ }
104
124
  }
105
125
 
106
126
  .mainbox .barContainer .bar:hover {
107
- transform: scaleY(1.1);
108
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
127
+ transform: scaleY(1.15);
128
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
129
+ z-index: 1;
109
130
  }
110
131
 
111
132
  .mainbox .barContainer .bar.operational {
@@ -149,20 +170,23 @@ export class UplStatuspageStatusdetails extends DeesElement {
149
170
  position: absolute;
150
171
  background: ${cssManager.bdTheme('#0a0a0a', '#fafafa')};
151
172
  color: ${cssManager.bdTheme('#fafafa', '#0a0a0a')};
152
- padding: 6px 10px;
153
- border-radius: 4px;
173
+ padding: 8px 12px;
174
+ border-radius: ${unsafeCSS(sharedStyles.borderRadius.base)};
154
175
  font-size: 11px;
155
176
  pointer-events: none;
156
177
  opacity: 0;
157
- transition: opacity 0.15s;
178
+ transition: opacity ${unsafeCSS(sharedStyles.durations.fast)} ${unsafeCSS(sharedStyles.easings.default)},
179
+ transform ${unsafeCSS(sharedStyles.durations.fast)} ${unsafeCSS(sharedStyles.easings.default)};
158
180
  z-index: 50;
159
181
  white-space: nowrap;
160
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
161
- line-height: 1.4;
182
+ box-shadow: ${unsafeCSS(sharedStyles.shadows.lg)};
183
+ line-height: 1.5;
184
+ transform: translateY(4px);
162
185
  }
163
186
 
164
187
  .tooltip.visible {
165
188
  opacity: 1;
189
+ transform: translateY(0);
166
190
  }
167
191
 
168
192
  .tooltip-time {
@@ -274,8 +298,9 @@ export class UplStatuspageStatusdetails extends DeesElement {
274
298
  const responseTime = dataPoint?.responseTime || 0;
275
299
 
276
300
  bars.push(html`
277
- <div
301
+ <div
278
302
  class="bar ${status}"
303
+ style="--bar-index: ${i}"
279
304
  @mouseenter=${(e: MouseEvent) => this.showTooltip(e, timestamp, status, responseTime)}
280
305
  @click=${() => this.handleBarClick(timestamp, status, responseTime)}
281
306
  ></div>