@uptime.link/statuspage 1.0.74 → 1.1.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 (95) hide show
  1. package/dist_bundle/bundle.js +4096 -504
  2. package/dist_bundle/bundle.js.map +4 -4
  3. package/dist_ts_web/00_commitinfo_data.js +2 -2
  4. package/dist_ts_web/elements/index.d.ts +3 -0
  5. package/dist_ts_web/elements/index.js +6 -1
  6. package/dist_ts_web/elements/internal/uplinternal-miniheading.d.ts +1 -0
  7. package/dist_ts_web/elements/internal/uplinternal-miniheading.js +78 -28
  8. package/dist_ts_web/elements/upl-statuspage-assetsselector.d.ts +14 -0
  9. package/dist_ts_web/elements/upl-statuspage-assetsselector.demo.d.ts +1 -0
  10. package/dist_ts_web/elements/upl-statuspage-assetsselector.demo.js +575 -0
  11. package/dist_ts_web/elements/upl-statuspage-assetsselector.js +605 -43
  12. package/dist_ts_web/elements/upl-statuspage-footer.d.ts +46 -2
  13. package/dist_ts_web/elements/upl-statuspage-footer.demo.d.ts +1 -0
  14. package/dist_ts_web/elements/upl-statuspage-footer.demo.js +679 -0
  15. package/dist_ts_web/elements/upl-statuspage-footer.js +792 -61
  16. package/dist_ts_web/elements/upl-statuspage-header.d.ts +5 -1
  17. package/dist_ts_web/elements/upl-statuspage-header.demo.d.ts +1 -0
  18. package/dist_ts_web/elements/upl-statuspage-header.demo.js +220 -0
  19. package/dist_ts_web/elements/upl-statuspage-header.js +313 -86
  20. package/dist_ts_web/elements/upl-statuspage-incidents.d.ts +22 -4
  21. package/dist_ts_web/elements/upl-statuspage-incidents.demo.d.ts +1 -0
  22. package/dist_ts_web/elements/upl-statuspage-incidents.demo.js +1147 -0
  23. package/dist_ts_web/elements/upl-statuspage-incidents.js +750 -74
  24. package/dist_ts_web/elements/upl-statuspage-pagetitle.d.ts +15 -0
  25. package/dist_ts_web/elements/upl-statuspage-pagetitle.demo.d.ts +1 -0
  26. package/dist_ts_web/elements/upl-statuspage-pagetitle.demo.js +25 -0
  27. package/dist_ts_web/elements/upl-statuspage-pagetitle.js +148 -0
  28. package/dist_ts_web/elements/upl-statuspage-statsgrid.d.ts +23 -0
  29. package/dist_ts_web/elements/upl-statuspage-statsgrid.demo.d.ts +1 -0
  30. package/dist_ts_web/elements/upl-statuspage-statsgrid.demo.js +295 -0
  31. package/dist_ts_web/elements/upl-statuspage-statsgrid.js +374 -0
  32. package/dist_ts_web/elements/upl-statuspage-statusbar.d.ts +4 -0
  33. package/dist_ts_web/elements/upl-statuspage-statusbar.demo.d.ts +1 -0
  34. package/dist_ts_web/elements/upl-statuspage-statusbar.demo.js +365 -0
  35. package/dist_ts_web/elements/upl-statuspage-statusbar.js +357 -44
  36. package/dist_ts_web/elements/upl-statuspage-statusdetails.d.ts +14 -0
  37. package/dist_ts_web/elements/upl-statuspage-statusdetails.demo.d.ts +1 -0
  38. package/dist_ts_web/elements/upl-statuspage-statusdetails.demo.js +706 -0
  39. package/dist_ts_web/elements/upl-statuspage-statusdetails.js +373 -63
  40. package/dist_ts_web/elements/upl-statuspage-statusmonth.d.ts +15 -0
  41. package/dist_ts_web/elements/upl-statuspage-statusmonth.demo.d.ts +1 -0
  42. package/dist_ts_web/elements/upl-statuspage-statusmonth.demo.js +798 -0
  43. package/dist_ts_web/elements/upl-statuspage-statusmonth.js +474 -100
  44. package/dist_ts_web/interfaces/index.d.ts +84 -0
  45. package/dist_ts_web/interfaces/index.js +4 -0
  46. package/dist_ts_web/pages/index.d.ts +4 -1
  47. package/dist_ts_web/pages/index.js +5 -2
  48. package/dist_ts_web/pages/statuspage-allgreen.d.ts +1 -0
  49. package/dist_ts_web/pages/statuspage-allgreen.js +386 -0
  50. package/dist_ts_web/pages/statuspage-demo.d.ts +1 -0
  51. package/dist_ts_web/pages/statuspage-demo.js +616 -0
  52. package/dist_ts_web/pages/statuspage-maintenance.d.ts +1 -0
  53. package/dist_ts_web/pages/statuspage-maintenance.js +544 -0
  54. package/dist_ts_web/pages/statuspage-outage.d.ts +1 -0
  55. package/dist_ts_web/pages/statuspage-outage.js +543 -0
  56. package/dist_ts_web/styles/shared.styles.d.ts +80 -0
  57. package/dist_ts_web/styles/shared.styles.js +351 -0
  58. package/dist_watch/bundle.js +51691 -32432
  59. package/dist_watch/bundle.js.map +4 -4
  60. package/npmextra.json +9 -3
  61. package/package.json +19 -19
  62. package/readme.hints.md +292 -0
  63. package/readme.md +326 -149
  64. package/readme.plan.md +261 -0
  65. package/ts_web/00_commitinfo_data.ts +1 -1
  66. package/ts_web/elements/index.ts +6 -0
  67. package/ts_web/elements/internal/uplinternal-miniheading.ts +24 -17
  68. package/ts_web/elements/upl-statuspage-assetsselector.demo.ts +607 -0
  69. package/ts_web/elements/upl-statuspage-assetsselector.ts +526 -18
  70. package/ts_web/elements/upl-statuspage-footer.demo.ts +744 -0
  71. package/ts_web/elements/upl-statuspage-footer.ts +608 -30
  72. package/ts_web/elements/upl-statuspage-header.demo.ts +241 -0
  73. package/ts_web/elements/upl-statuspage-header.ts +220 -52
  74. package/ts_web/elements/upl-statuspage-incidents.demo.ts +1216 -0
  75. package/ts_web/elements/upl-statuspage-incidents.ts +649 -26
  76. package/ts_web/elements/upl-statuspage-pagetitle.demo.ts +25 -0
  77. package/ts_web/elements/upl-statuspage-pagetitle.ts +89 -0
  78. package/ts_web/elements/upl-statuspage-statsgrid.demo.ts +315 -0
  79. package/ts_web/elements/upl-statuspage-statsgrid.ts +306 -0
  80. package/ts_web/elements/upl-statuspage-statusbar.demo.ts +393 -0
  81. package/ts_web/elements/upl-statuspage-statusbar.ts +281 -20
  82. package/ts_web/elements/upl-statuspage-statusdetails.demo.ts +754 -0
  83. package/ts_web/elements/upl-statuspage-statusdetails.ts +297 -38
  84. package/ts_web/elements/upl-statuspage-statusmonth.demo.ts +876 -0
  85. package/ts_web/elements/upl-statuspage-statusmonth.ts +397 -76
  86. package/ts_web/interfaces/index.ts +95 -0
  87. package/ts_web/pages/index.ts +4 -1
  88. package/ts_web/pages/statuspage-allgreen.ts +412 -0
  89. package/ts_web/pages/statuspage-demo.ts +653 -0
  90. package/ts_web/pages/statuspage-maintenance.ts +570 -0
  91. package/ts_web/pages/statuspage-outage.ts +568 -0
  92. package/ts_web/styles/shared.styles.ts +367 -0
  93. package/dist_ts_web/pages/page1.d.ts +0 -1
  94. package/dist_ts_web/pages/page1.js +0 -11
  95. package/ts_web/pages/page1.ts +0 -11
@@ -0,0 +1,568 @@
1
+ import { html, cssManager } from "@design.estate/dees-element";
2
+ import type { IServiceStatus, IOverallStatus, IIncidentDetails, IStatusHistoryPoint, IMonthlyUptime } from '../interfaces/index.js';
3
+
4
+ export const statuspageOutage = () => html`
5
+ <style>
6
+ .demo-page-wrapper {
7
+ min-height: 100vh;
8
+ background: ${cssManager.bdTheme('#fafafa', '#0a0a0a')};
9
+ }
10
+ .demo-page-wrapper > dees-demowrapper {
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: 24px;
14
+ }
15
+ </style>
16
+
17
+ <div class="demo-page-wrapper">
18
+
19
+ <dees-demowrapper
20
+ .runAfterRender=${async (wrapperElement: any) => {
21
+ const header = wrapperElement.querySelector('upl-statuspage-header') as any;
22
+ const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar') as any;
23
+ const statsGrid = wrapperElement.querySelector('upl-statuspage-statsgrid') as any;
24
+ const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector') as any;
25
+ const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails') as any;
26
+ const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth') as any;
27
+ const incidents = wrapperElement.querySelector('upl-statuspage-incidents') as any;
28
+ const footer = wrapperElement.querySelector('upl-statuspage-footer') as any;
29
+
30
+ // Configure Header
31
+ header.pageTitle = 'DataStream';
32
+ header.showReportButton = true;
33
+ header.showSubscribeButton = true;
34
+ header.logoUrl = 'https://via.placeholder.com/150x50/F44336/ffffff?text=DS';
35
+
36
+ // Configure Overall Status - Major Outage
37
+ statusBar.overallStatus = {
38
+ status: 'major_outage',
39
+ message: 'Major service disruption affecting multiple regions',
40
+ lastUpdated: Date.now(),
41
+ affectedServices: 8,
42
+ totalServices: 15
43
+ };
44
+
45
+ // Configure Services - Multiple Outages
46
+ const services: IServiceStatus[] = [
47
+ // Core Services - Major Outage
48
+ {
49
+ id: 'api-gateway',
50
+ name: 'api-gateway',
51
+ displayName: 'API Gateway',
52
+ description: 'Main API endpoint',
53
+ currentStatus: 'major_outage',
54
+ lastChecked: Date.now(),
55
+ uptime30d: 85.2,
56
+ uptime90d: 92.5,
57
+ responseTime: 2500,
58
+ category: 'Core Infrastructure',
59
+ selected: true
60
+ },
61
+ {
62
+ id: 'auth-service',
63
+ name: 'auth-service',
64
+ displayName: 'Authentication',
65
+ description: 'Login and authorization',
66
+ currentStatus: 'major_outage',
67
+ lastChecked: Date.now(),
68
+ uptime30d: 84.8,
69
+ uptime90d: 91.2,
70
+ responseTime: 3200,
71
+ category: 'Core Infrastructure',
72
+ selected: true
73
+ },
74
+ {
75
+ id: 'web-portal',
76
+ name: 'web-portal',
77
+ displayName: 'Web Portal',
78
+ description: 'Customer web interface',
79
+ currentStatus: 'partial_outage',
80
+ lastChecked: Date.now(),
81
+ uptime30d: 88.5,
82
+ uptime90d: 94.2,
83
+ responseTime: 1800,
84
+ category: 'Frontend',
85
+ selected: true
86
+ },
87
+ // Database Services - Critical
88
+ {
89
+ id: 'primary-db',
90
+ name: 'primary-db',
91
+ displayName: 'Primary Database',
92
+ description: 'Main data storage',
93
+ currentStatus: 'major_outage',
94
+ lastChecked: Date.now(),
95
+ uptime30d: 82.1,
96
+ uptime90d: 90.5,
97
+ responseTime: 5000,
98
+ category: 'Data Layer',
99
+ selected: true
100
+ },
101
+ {
102
+ id: 'replica-db',
103
+ name: 'replica-db',
104
+ displayName: 'Database Replicas',
105
+ description: 'Read replicas',
106
+ currentStatus: 'partial_outage',
107
+ lastChecked: Date.now(),
108
+ uptime30d: 86.7,
109
+ uptime90d: 93.1,
110
+ responseTime: 2200,
111
+ category: 'Data Layer',
112
+ selected: true
113
+ },
114
+ {
115
+ id: 'cache-layer',
116
+ name: 'cache-layer',
117
+ displayName: 'Cache Layer',
118
+ description: 'Redis cache',
119
+ currentStatus: 'degraded',
120
+ lastChecked: Date.now(),
121
+ uptime30d: 92.3,
122
+ uptime90d: 95.8,
123
+ responseTime: 450,
124
+ category: 'Data Layer',
125
+ selected: true
126
+ },
127
+ // Regional Services
128
+ {
129
+ id: 'us-east',
130
+ name: 'us-east',
131
+ displayName: 'US East Region',
132
+ description: 'Primary US datacenter',
133
+ currentStatus: 'major_outage',
134
+ lastChecked: Date.now(),
135
+ uptime30d: 81.5,
136
+ uptime90d: 89.2,
137
+ responseTime: 4500,
138
+ category: 'Regional',
139
+ selected: true
140
+ },
141
+ {
142
+ id: 'us-west',
143
+ name: 'us-west',
144
+ displayName: 'US West Region',
145
+ description: 'Secondary US datacenter',
146
+ currentStatus: 'degraded',
147
+ lastChecked: Date.now(),
148
+ uptime30d: 94.2,
149
+ uptime90d: 96.8,
150
+ responseTime: 180,
151
+ category: 'Regional',
152
+ selected: true
153
+ },
154
+ {
155
+ id: 'eu-central',
156
+ name: 'eu-central',
157
+ displayName: 'EU Central Region',
158
+ description: 'European datacenter',
159
+ currentStatus: 'major_outage',
160
+ lastChecked: Date.now(),
161
+ uptime30d: 83.7,
162
+ uptime90d: 91.2,
163
+ responseTime: 3800,
164
+ category: 'Regional',
165
+ selected: true
166
+ },
167
+ // Some operational services
168
+ {
169
+ id: 'status-page',
170
+ name: 'status-page',
171
+ displayName: 'Status Page',
172
+ description: 'This status page',
173
+ currentStatus: 'operational',
174
+ lastChecked: Date.now(),
175
+ uptime30d: 99.9,
176
+ uptime90d: 99.8,
177
+ responseTime: 45,
178
+ category: 'Support',
179
+ selected: false
180
+ },
181
+ {
182
+ id: 'support-portal',
183
+ name: 'support-portal',
184
+ displayName: 'Support Portal',
185
+ description: 'Customer support system',
186
+ currentStatus: 'operational',
187
+ lastChecked: Date.now(),
188
+ uptime30d: 98.5,
189
+ uptime90d: 99.1,
190
+ responseTime: 120,
191
+ category: 'Support',
192
+ selected: false
193
+ },
194
+ // Degraded services
195
+ {
196
+ id: 'email-service',
197
+ name: 'email-service',
198
+ displayName: 'Email Notifications',
199
+ description: 'Automated emails',
200
+ currentStatus: 'degraded',
201
+ lastChecked: Date.now(),
202
+ uptime30d: 91.2,
203
+ uptime90d: 94.5,
204
+ responseTime: 850,
205
+ category: 'Communication',
206
+ selected: true
207
+ },
208
+ {
209
+ id: 'analytics',
210
+ name: 'analytics',
211
+ displayName: 'Analytics Platform',
212
+ description: 'Usage analytics',
213
+ currentStatus: 'partial_outage',
214
+ lastChecked: Date.now(),
215
+ uptime30d: 87.3,
216
+ uptime90d: 92.8,
217
+ responseTime: 1200,
218
+ category: 'Services',
219
+ selected: false
220
+ },
221
+ {
222
+ id: 'backup-system',
223
+ name: 'backup-system',
224
+ displayName: 'Backup System',
225
+ description: 'Data backups',
226
+ currentStatus: 'degraded',
227
+ lastChecked: Date.now(),
228
+ uptime30d: 95.2,
229
+ uptime90d: 97.1,
230
+ responseTime: 320,
231
+ category: 'Services',
232
+ selected: false
233
+ },
234
+ {
235
+ id: 'monitoring',
236
+ name: 'monitoring',
237
+ displayName: 'Monitoring System',
238
+ description: 'Infrastructure monitoring',
239
+ currentStatus: 'operational',
240
+ lastChecked: Date.now(),
241
+ uptime30d: 98.7,
242
+ uptime90d: 99.2,
243
+ responseTime: 65,
244
+ category: 'Services',
245
+ selected: true
246
+ }
247
+ ];
248
+
249
+ assetsSelector.services = services;
250
+
251
+ // Configure Stats Grid - Major outage metrics
252
+ const operationalCount = services.filter(s => s.currentStatus === 'operational').length;
253
+ const avgResponseTime = services.reduce((sum, s) => sum + (s.responseTime || 0), 0) / services.length;
254
+ const avgUptime = services.reduce((sum, s) => sum + (s.uptime30d || 0), 0) / services.length;
255
+
256
+ statsGrid.currentStatus = 'major_outage';
257
+ statsGrid.uptime = avgUptime;
258
+ statsGrid.avgResponseTime = Math.round(avgResponseTime);
259
+ statsGrid.totalIncidents = 15; // High number of incidents
260
+ statsGrid.affectedServices = services.filter(s => s.currentStatus !== 'operational').length;
261
+ statsGrid.totalServices = services.length;
262
+ statsGrid.timePeriod = '30 days';
263
+
264
+ // Configure Status Details - Showing the outage timeline
265
+ const generateStatusDetails = (): IStatusHistoryPoint[] => {
266
+ const details: IStatusHistoryPoint[] = [];
267
+ const now = new Date();
268
+
269
+ for (let i = 47; i >= 0; i--) {
270
+ const date = new Date(now);
271
+ date.setMinutes(0, 0, 0);
272
+ date.setHours(date.getHours() - i);
273
+
274
+ let status: 'operational' | 'degraded' | 'major_outage' = 'operational';
275
+ let value = 100;
276
+ let responseTime = 30;
277
+
278
+ // Outage started 8 hours ago
279
+ if (i <= 8) {
280
+ status = 'major_outage';
281
+ value = 15 + Math.random() * 20;
282
+ responseTime = 2000 + Math.random() * 3000;
283
+ } else if (i <= 12) {
284
+ // Degradation before the outage
285
+ status = 'degraded';
286
+ value = 70 + Math.random() * 20;
287
+ responseTime = 200 + Math.random() * 800;
288
+ } else if (i <= 24) {
289
+ // Some issues yesterday
290
+ if (Math.random() > 0.7) {
291
+ status = 'degraded';
292
+ value = 85 + Math.random() * 10;
293
+ responseTime = 100 + Math.random() * 200;
294
+ }
295
+ }
296
+
297
+ details.push({
298
+ timestamp: date.getTime(),
299
+ status,
300
+ responseTime
301
+ });
302
+ }
303
+
304
+ return details;
305
+ };
306
+
307
+ statusDetails.dataPoints = generateStatusDetails();
308
+ statusDetails.serviceId = 'primary-db';
309
+ statusDetails.serviceName = 'Primary Database';
310
+
311
+ // Configure Monthly Status - Poor performance
312
+ const generateMonthlyData = (): IMonthlyUptime[] => {
313
+ const months: IMonthlyUptime[] = [];
314
+ const now = new Date();
315
+
316
+ for (let m = 4; m >= 0; m--) {
317
+ const monthDate = new Date(now.getFullYear(), now.getMonth() - m, 1);
318
+ const daysInMonth = new Date(monthDate.getFullYear(), monthDate.getMonth() + 1, 0).getDate();
319
+ const monthKey = monthDate.toISOString().slice(0, 7);
320
+
321
+ const days = [];
322
+ let totalUptime = 0;
323
+ let incidents = 0;
324
+
325
+ for (let d = 1; d <= daysInMonth; d++) {
326
+ const dayDate = new Date(monthDate.getFullYear(), monthDate.getMonth(), d);
327
+ const isToday = dayDate.toDateString() === now.toDateString();
328
+ const isFuture = dayDate > now;
329
+
330
+ if (isFuture) continue;
331
+
332
+ let status: 'operational' | 'degraded' | 'partial_outage' | 'major_outage' = 'operational';
333
+ let uptime = 100;
334
+ let dayIncidents = 0;
335
+
336
+ // Today - major outage
337
+ if (isToday) {
338
+ status = 'major_outage';
339
+ uptime = 45;
340
+ dayIncidents = 3;
341
+ } else if (Math.random() > 0.7) {
342
+ // Frequent issues
343
+ if (Math.random() > 0.5) {
344
+ status = 'partial_outage';
345
+ uptime = 75 + Math.random() * 15;
346
+ dayIncidents = 2;
347
+ } else {
348
+ status = 'degraded';
349
+ uptime = 85 + Math.random() * 10;
350
+ dayIncidents = 1;
351
+ }
352
+ }
353
+
354
+ days.push({
355
+ date: dayDate.toISOString().slice(0, 10),
356
+ status,
357
+ uptime,
358
+ incidents: dayIncidents,
359
+ totalDowntime: Math.round((100 - uptime) * 14.4)
360
+ });
361
+
362
+ totalUptime += uptime;
363
+ incidents += dayIncidents;
364
+ }
365
+
366
+ months.push({
367
+ month: monthKey,
368
+ days,
369
+ overallUptime: totalUptime / days.length,
370
+ totalIncidents: incidents
371
+ });
372
+ }
373
+
374
+ return months;
375
+ };
376
+
377
+ statusMonth.monthlyData = generateMonthlyData();
378
+ statusMonth.serviceId = 'all-services';
379
+ statusMonth.serviceName = 'All Services';
380
+
381
+ // Configure Incidents - Multiple current incidents
382
+ const currentIncidents: IIncidentDetails[] = [
383
+ {
384
+ id: 'inc-2024-crit-001',
385
+ title: 'Complete Database Failure in Multiple Regions',
386
+ impact: 'Users unable to access any services. Complete system outage.',
387
+ severity: 'critical',
388
+ status: 'investigating',
389
+ startTime: Date.now() - 8 * 60 * 60 * 1000,
390
+ affectedServices: ['Primary Database', 'Database Replicas', 'API Gateway', 'Authentication', 'US East Region', 'EU Central Region'],
391
+ updates: [
392
+ {
393
+ id: 'update-1',
394
+ timestamp: Date.now() - 8 * 60 * 60 * 1000,
395
+ status: 'investigating',
396
+ message: 'Multiple alerts triggered. Complete service failure detected across regions.',
397
+ author: 'Automated Monitoring'
398
+ },
399
+ {
400
+ id: 'update-2',
401
+ timestamp: Date.now() - 7.5 * 60 * 60 * 1000,
402
+ status: 'investigating',
403
+ message: 'All hands on deck. Engineering teams mobilized. Initial investigation points to cascading database failure.',
404
+ author: 'Incident Commander'
405
+ },
406
+ {
407
+ id: 'update-3',
408
+ timestamp: Date.now() - 6 * 60 * 60 * 1000,
409
+ status: 'identified',
410
+ message: 'Root cause identified: Corrupted replication logs causing database cluster failures. Working on recovery.',
411
+ author: 'Database Team'
412
+ },
413
+ {
414
+ id: 'update-4',
415
+ timestamp: Date.now() - 4 * 60 * 60 * 1000,
416
+ status: 'monitoring',
417
+ message: 'Attempting to restore from backups. This is a complex operation and will take time.',
418
+ author: 'Infrastructure Team'
419
+ },
420
+ {
421
+ id: 'update-5',
422
+ timestamp: Date.now() - 2 * 60 * 60 * 1000,
423
+ status: 'monitoring',
424
+ message: 'Partial recovery in progress. Some read-only operations may become available soon.',
425
+ author: 'Database Team'
426
+ },
427
+ {
428
+ id: 'update-6',
429
+ timestamp: Date.now() - 30 * 60 * 1000,
430
+ status: 'monitoring',
431
+ message: 'Critical update: Recovery is taking longer than expected. We are exploring all options including failover to disaster recovery site.',
432
+ author: 'CTO'
433
+ }
434
+ ]
435
+ },
436
+ {
437
+ id: 'inc-2024-maj-002',
438
+ title: 'API Gateway Overload',
439
+ impact: 'API requests failing or timing out',
440
+ severity: 'major',
441
+ status: 'monitoring',
442
+ startTime: Date.now() - 6 * 60 * 60 * 1000,
443
+ affectedServices: ['API Gateway', 'Web Portal'],
444
+ updates: [
445
+ {
446
+ id: 'update-7',
447
+ timestamp: Date.now() - 6 * 60 * 60 * 1000,
448
+ status: 'investigating',
449
+ message: 'API Gateway experiencing extreme load due to retry storms from database failures.',
450
+ author: 'API Team'
451
+ },
452
+ {
453
+ id: 'update-8',
454
+ timestamp: Date.now() - 5 * 60 * 60 * 1000,
455
+ status: 'identified',
456
+ message: 'Implementing rate limiting and circuit breakers to prevent cascade failures.',
457
+ author: 'API Team'
458
+ },
459
+ {
460
+ id: 'update-9',
461
+ timestamp: Date.now() - 3 * 60 * 60 * 1000,
462
+ status: 'monitoring',
463
+ message: 'Rate limiting in place. Load is stabilizing but service remains degraded.',
464
+ author: 'API Team'
465
+ }
466
+ ]
467
+ },
468
+ {
469
+ id: 'inc-2024-maj-003',
470
+ title: 'Email Service Delays',
471
+ impact: 'Notification emails delayed by up to 2 hours',
472
+ severity: 'major',
473
+ status: 'monitoring',
474
+ startTime: Date.now() - 5 * 60 * 60 * 1000,
475
+ affectedServices: ['Email Notifications'],
476
+ updates: [
477
+ {
478
+ id: 'update-10',
479
+ timestamp: Date.now() - 5 * 60 * 60 * 1000,
480
+ status: 'investigating',
481
+ message: 'Email queue backing up due to system outages.',
482
+ author: 'Communications Team'
483
+ },
484
+ {
485
+ id: 'update-11',
486
+ timestamp: Date.now() - 3 * 60 * 60 * 1000,
487
+ status: 'monitoring',
488
+ message: 'Processing backlog slowly. Prioritizing critical notifications.',
489
+ author: 'Communications Team'
490
+ }
491
+ ]
492
+ }
493
+ ];
494
+
495
+ const pastIncidents: IIncidentDetails[] = [
496
+ {
497
+ id: 'inc-2024-prev-001',
498
+ title: 'Previous Major Outage',
499
+ impact: 'Services unavailable for 4 hours',
500
+ severity: 'critical',
501
+ status: 'resolved',
502
+ startTime: Date.now() - 30 * 24 * 60 * 60 * 1000,
503
+ endTime: Date.now() - 30 * 24 * 60 * 60 * 1000 + 4 * 60 * 60 * 1000,
504
+ affectedServices: ['All Services'],
505
+ rootCause: 'Power failure at primary datacenter with UPS failure.',
506
+ resolution: 'Power restored. UPS systems replaced and tested.',
507
+ updates: [
508
+ {
509
+ id: 'update-12',
510
+ timestamp: Date.now() - 30 * 24 * 60 * 60 * 1000,
511
+ status: 'investigating',
512
+ message: 'Complete datacenter power loss.',
513
+ author: 'Operations'
514
+ },
515
+ {
516
+ id: 'update-13',
517
+ timestamp: Date.now() - 30 * 24 * 60 * 60 * 1000 + 4 * 60 * 60 * 1000,
518
+ status: 'resolved',
519
+ message: 'Power restored. Services coming back online.',
520
+ author: 'Operations'
521
+ },
522
+ {
523
+ id: 'update-14',
524
+ timestamp: Date.now() - 29 * 24 * 60 * 60 * 1000,
525
+ status: 'postmortem',
526
+ message: 'Postmortem published. Multiple redundancy improvements implemented.',
527
+ author: 'Engineering'
528
+ }
529
+ ]
530
+ }
531
+ ];
532
+
533
+ incidents.currentIncidents = currentIncidents;
534
+ incidents.pastIncidents = pastIncidents;
535
+
536
+ // Configure Footer
537
+ footer.companyName = 'DataStream Platform';
538
+ footer.legalUrl = 'https://datastream.example.com/legal';
539
+ footer.supportEmail = 'emergency@datastream.example.com';
540
+ footer.statusPageUrl = 'https://status.datastream.example.com';
541
+ footer.lastUpdated = Date.now();
542
+ footer.currentYear = new Date().getFullYear();
543
+ footer.socialLinks = [
544
+ { platform: 'twitter', url: 'https://twitter.com/datastream' }
545
+ ];
546
+ footer.rssFeedUrl = 'https://status.datastream.example.com/rss';
547
+ footer.apiStatusUrl = 'https://api.datastream.example.com/v1/status';
548
+ footer.enableSubscribe = true;
549
+ footer.enableReportIssue = true;
550
+ footer.subscriberCount = 15234;
551
+ footer.errorMessage = 'Critical: Multiple services experiencing major outages';
552
+ footer.additionalLinks = [
553
+ { label: 'Emergency Support', url: 'tel:+1-800-HELP-NOW' },
554
+ { label: 'Incident Updates', url: 'https://datastream.example.com/incidents' }
555
+ ];
556
+ }}
557
+ >
558
+ <upl-statuspage-header></upl-statuspage-header>
559
+ <upl-statuspage-statusbar></upl-statuspage-statusbar>
560
+ <upl-statuspage-statsgrid></upl-statuspage-statsgrid>
561
+ <upl-statuspage-assetsselector></upl-statuspage-assetsselector>
562
+ <upl-statuspage-statusdetails></upl-statuspage-statusdetails>
563
+ <upl-statuspage-statusmonth></upl-statuspage-statusmonth>
564
+ <upl-statuspage-incidents></upl-statuspage-incidents>
565
+ <upl-statuspage-footer></upl-statuspage-footer>
566
+ </dees-demowrapper>
567
+ </div>
568
+ `;