@uptime.link/statuspage 1.0.73 → 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 (96) 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 +54534 -26433
  59. package/dist_watch/bundle.js.map +4 -4
  60. package/dist_watch/index.html +3 -10
  61. package/npmextra.json +9 -3
  62. package/package.json +19 -19
  63. package/readme.hints.md +292 -0
  64. package/readme.md +326 -149
  65. package/readme.plan.md +261 -0
  66. package/ts_web/00_commitinfo_data.ts +1 -1
  67. package/ts_web/elements/index.ts +6 -0
  68. package/ts_web/elements/internal/uplinternal-miniheading.ts +24 -17
  69. package/ts_web/elements/upl-statuspage-assetsselector.demo.ts +607 -0
  70. package/ts_web/elements/upl-statuspage-assetsselector.ts +526 -18
  71. package/ts_web/elements/upl-statuspage-footer.demo.ts +744 -0
  72. package/ts_web/elements/upl-statuspage-footer.ts +608 -30
  73. package/ts_web/elements/upl-statuspage-header.demo.ts +241 -0
  74. package/ts_web/elements/upl-statuspage-header.ts +220 -52
  75. package/ts_web/elements/upl-statuspage-incidents.demo.ts +1216 -0
  76. package/ts_web/elements/upl-statuspage-incidents.ts +649 -26
  77. package/ts_web/elements/upl-statuspage-pagetitle.demo.ts +25 -0
  78. package/ts_web/elements/upl-statuspage-pagetitle.ts +89 -0
  79. package/ts_web/elements/upl-statuspage-statsgrid.demo.ts +315 -0
  80. package/ts_web/elements/upl-statuspage-statsgrid.ts +306 -0
  81. package/ts_web/elements/upl-statuspage-statusbar.demo.ts +393 -0
  82. package/ts_web/elements/upl-statuspage-statusbar.ts +281 -20
  83. package/ts_web/elements/upl-statuspage-statusdetails.demo.ts +754 -0
  84. package/ts_web/elements/upl-statuspage-statusdetails.ts +297 -38
  85. package/ts_web/elements/upl-statuspage-statusmonth.demo.ts +876 -0
  86. package/ts_web/elements/upl-statuspage-statusmonth.ts +397 -76
  87. package/ts_web/interfaces/index.ts +95 -0
  88. package/ts_web/pages/index.ts +4 -1
  89. package/ts_web/pages/statuspage-allgreen.ts +412 -0
  90. package/ts_web/pages/statuspage-demo.ts +653 -0
  91. package/ts_web/pages/statuspage-maintenance.ts +570 -0
  92. package/ts_web/pages/statuspage-outage.ts +568 -0
  93. package/ts_web/styles/shared.styles.ts +367 -0
  94. package/dist_ts_web/pages/page1.d.ts +0 -1
  95. package/dist_ts_web/pages/page1.js +0 -11
  96. package/ts_web/pages/page1.ts +0 -11
@@ -0,0 +1,570 @@
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 statuspageMaintenance = () => 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 = 'SecureVault';
32
+ header.showReportButton = true;
33
+ header.showSubscribeButton = true;
34
+ header.logoUrl = 'https://via.placeholder.com/150x50/2196F3/ffffff?text=SV';
35
+
36
+ // Configure Overall Status - Maintenance
37
+ statusBar.overallStatus = {
38
+ status: 'maintenance',
39
+ message: 'Scheduled maintenance in progress - Expected completion: 2:00 AM UTC',
40
+ lastUpdated: Date.now(),
41
+ affectedServices: 5,
42
+ totalServices: 14
43
+ };
44
+
45
+ // Configure Services - Mix of maintenance and operational
46
+ const services: IServiceStatus[] = [
47
+ // Core Services - Some under maintenance
48
+ {
49
+ id: 'web-app',
50
+ name: 'web-app',
51
+ displayName: 'Web Application',
52
+ description: 'Customer portal',
53
+ currentStatus: 'operational',
54
+ lastChecked: Date.now(),
55
+ uptime30d: 99.92,
56
+ uptime90d: 99.89,
57
+ responseTime: 45,
58
+ category: 'Frontend',
59
+ selected: true
60
+ },
61
+ {
62
+ id: 'mobile-api',
63
+ name: 'mobile-api',
64
+ displayName: 'Mobile API',
65
+ description: 'Mobile app backend',
66
+ currentStatus: 'operational',
67
+ lastChecked: Date.now(),
68
+ uptime30d: 99.88,
69
+ uptime90d: 99.85,
70
+ responseTime: 62,
71
+ category: 'Frontend',
72
+ selected: true
73
+ },
74
+ {
75
+ id: 'auth-service',
76
+ name: 'auth-service',
77
+ displayName: 'Authentication Service',
78
+ description: 'User authentication',
79
+ currentStatus: 'maintenance',
80
+ lastChecked: Date.now(),
81
+ uptime30d: 99.5,
82
+ uptime90d: 99.7,
83
+ responseTime: 0,
84
+ category: 'Core Services',
85
+ selected: true
86
+ },
87
+ {
88
+ id: 'api-gateway',
89
+ name: 'api-gateway',
90
+ displayName: 'API Gateway',
91
+ description: 'Main API endpoint',
92
+ currentStatus: 'degraded',
93
+ lastChecked: Date.now(),
94
+ uptime30d: 99.2,
95
+ uptime90d: 99.4,
96
+ responseTime: 125,
97
+ category: 'Core Services',
98
+ selected: true
99
+ },
100
+ // Database Services
101
+ {
102
+ id: 'primary-db',
103
+ name: 'primary-db',
104
+ displayName: 'Primary Database',
105
+ description: 'Main database cluster',
106
+ currentStatus: 'maintenance',
107
+ lastChecked: Date.now(),
108
+ uptime30d: 99.6,
109
+ uptime90d: 99.7,
110
+ responseTime: 0,
111
+ category: 'Data Storage',
112
+ selected: true
113
+ },
114
+ {
115
+ id: 'replica-db',
116
+ name: 'replica-db',
117
+ displayName: 'Database Replicas',
118
+ description: 'Read replicas (read-only mode)',
119
+ currentStatus: 'degraded',
120
+ lastChecked: Date.now(),
121
+ uptime30d: 99.7,
122
+ uptime90d: 99.8,
123
+ responseTime: 85,
124
+ category: 'Data Storage',
125
+ selected: true
126
+ },
127
+ {
128
+ id: 'cache',
129
+ name: 'cache',
130
+ displayName: 'Cache Service',
131
+ description: 'Redis cache layer',
132
+ currentStatus: 'operational',
133
+ lastChecked: Date.now(),
134
+ uptime30d: 99.95,
135
+ uptime90d: 99.93,
136
+ responseTime: 8,
137
+ category: 'Data Storage',
138
+ selected: false
139
+ },
140
+ // Backup and Storage
141
+ {
142
+ id: 'backup-service',
143
+ name: 'backup-service',
144
+ displayName: 'Backup Service',
145
+ description: 'Automated backups',
146
+ currentStatus: 'maintenance',
147
+ lastChecked: Date.now(),
148
+ uptime30d: 99.8,
149
+ uptime90d: 99.85,
150
+ responseTime: 0,
151
+ category: 'Operations',
152
+ selected: true
153
+ },
154
+ {
155
+ id: 'file-storage',
156
+ name: 'file-storage',
157
+ displayName: 'File Storage',
158
+ description: 'Object storage service',
159
+ currentStatus: 'operational',
160
+ lastChecked: Date.now(),
161
+ uptime30d: 99.99,
162
+ uptime90d: 99.98,
163
+ responseTime: 42,
164
+ category: 'Operations',
165
+ selected: false
166
+ },
167
+ // Monitoring and Support
168
+ {
169
+ id: 'monitoring',
170
+ name: 'monitoring',
171
+ displayName: 'Monitoring System',
172
+ description: 'System monitoring',
173
+ currentStatus: 'operational',
174
+ lastChecked: Date.now(),
175
+ uptime30d: 99.9,
176
+ uptime90d: 99.88,
177
+ responseTime: 32,
178
+ category: 'Support',
179
+ selected: true
180
+ },
181
+ {
182
+ id: 'logging',
183
+ name: 'logging',
184
+ displayName: 'Logging Service',
185
+ description: 'Centralized logs',
186
+ currentStatus: 'maintenance',
187
+ lastChecked: Date.now(),
188
+ uptime30d: 99.7,
189
+ uptime90d: 99.75,
190
+ responseTime: 0,
191
+ category: 'Support',
192
+ selected: false
193
+ },
194
+ {
195
+ id: 'alerting',
196
+ name: 'alerting',
197
+ displayName: 'Alerting System',
198
+ description: 'Alert notifications',
199
+ currentStatus: 'operational',
200
+ lastChecked: Date.now(),
201
+ uptime30d: 99.85,
202
+ uptime90d: 99.82,
203
+ responseTime: 28,
204
+ category: 'Support',
205
+ selected: false
206
+ },
207
+ // Communication Services
208
+ {
209
+ id: 'email',
210
+ name: 'email',
211
+ displayName: 'Email Service',
212
+ description: 'Transactional emails',
213
+ currentStatus: 'operational',
214
+ lastChecked: Date.now(),
215
+ uptime30d: 99.6,
216
+ uptime90d: 99.55,
217
+ responseTime: 142,
218
+ category: 'Communication',
219
+ selected: true
220
+ },
221
+ {
222
+ id: 'webhooks',
223
+ name: 'webhooks',
224
+ displayName: 'Webhook Delivery',
225
+ description: 'Webhook notifications',
226
+ currentStatus: 'maintenance',
227
+ lastChecked: Date.now(),
228
+ uptime30d: 99.4,
229
+ uptime90d: 99.45,
230
+ responseTime: 0,
231
+ category: 'Communication',
232
+ selected: false
233
+ }
234
+ ];
235
+
236
+ assetsSelector.services = services;
237
+
238
+ // Configure Stats Grid - Maintenance mode metrics
239
+ const operationalCount = services.filter(s => s.currentStatus === 'operational').length;
240
+ const avgResponseTime = services.reduce((sum, s) => sum + (s.responseTime || 0), 0) / services.length;
241
+ const avgUptime = services.reduce((sum, s) => sum + (s.uptime30d || 0), 0) / services.length;
242
+
243
+ statsGrid.currentStatus = 'maintenance';
244
+ statsGrid.uptime = avgUptime;
245
+ statsGrid.avgResponseTime = Math.round(avgResponseTime);
246
+ statsGrid.totalIncidents = 1; // Just the maintenance
247
+ statsGrid.affectedServices = services.filter(s => s.currentStatus === 'maintenance').length;
248
+ statsGrid.totalServices = services.length;
249
+ statsGrid.timePeriod = '30 days';
250
+
251
+ // Configure Status Details - Showing maintenance period
252
+ const generateStatusDetails = (): IStatusHistoryPoint[] => {
253
+ const details: IStatusHistoryPoint[] = [];
254
+ const now = new Date();
255
+ const maintenanceStarted = 2; // 2 hours ago
256
+
257
+ for (let i = 47; i >= 0; i--) {
258
+ const date = new Date(now);
259
+ date.setMinutes(0, 0, 0);
260
+ date.setHours(date.getHours() - i);
261
+
262
+ let status: 'operational' | 'degraded' | 'outage' = 'operational';
263
+ let value = 100;
264
+ let responseTime = 25;
265
+
266
+ // Maintenance window
267
+ if (i <= maintenanceStarted) {
268
+ status = 'degraded';
269
+ value = 60;
270
+ responseTime = 0;
271
+ } else if (i <= maintenanceStarted + 2) {
272
+ // Pre-maintenance prep
273
+ status = 'degraded';
274
+ value = 85;
275
+ responseTime = 80;
276
+ }
277
+
278
+ details.push({
279
+ timestamp: date.getTime(),
280
+ status,
281
+ responseTime
282
+ });
283
+ }
284
+
285
+ return details;
286
+ };
287
+
288
+ statusDetails.dataPoints = generateStatusDetails();
289
+ statusDetails.serviceId = 'primary-db';
290
+ statusDetails.serviceName = 'Primary Database';
291
+
292
+ // Configure Monthly Status - Good uptime with scheduled maintenance windows
293
+ const generateMonthlyData = (): IMonthlyUptime[] => {
294
+ const months: IMonthlyUptime[] = [];
295
+ const now = new Date();
296
+
297
+ for (let m = 4; m >= 0; m--) {
298
+ const monthDate = new Date(now.getFullYear(), now.getMonth() - m, 1);
299
+ const daysInMonth = new Date(monthDate.getFullYear(), monthDate.getMonth() + 1, 0).getDate();
300
+ const monthKey = monthDate.toISOString().slice(0, 7);
301
+
302
+ const days = [];
303
+ let totalUptime = 0;
304
+ let incidents = 0;
305
+
306
+ for (let d = 1; d <= daysInMonth; d++) {
307
+ const dayDate = new Date(monthDate.getFullYear(), monthDate.getMonth(), d);
308
+ const isToday = dayDate.toDateString() === now.toDateString();
309
+ const isFuture = dayDate > now;
310
+ const isFirstSunday = dayDate.getDay() === 0 && d <= 7;
311
+
312
+ if (isFuture) continue;
313
+
314
+ let status: 'operational' | 'degraded' | 'partial_outage' | 'major_outage' = 'operational';
315
+ let uptime = 100;
316
+ let dayIncidents = 0;
317
+
318
+ // Today - maintenance
319
+ if (isToday) {
320
+ status = 'degraded';
321
+ uptime = 92; // 2 hours of maintenance = 8% downtime
322
+ dayIncidents = 0; // Maintenance is not an incident
323
+ } else if (isFirstSunday) {
324
+ // Monthly maintenance on first Sunday
325
+ status = 'degraded';
326
+ uptime = 96; // 1 hour maintenance
327
+ dayIncidents = 0;
328
+ } else if (Math.random() > 0.95) {
329
+ // Occasional issues
330
+ status = 'degraded';
331
+ uptime = 98 + Math.random() * 2;
332
+ dayIncidents = 1;
333
+ }
334
+
335
+ days.push({
336
+ date: dayDate.toISOString().slice(0, 10),
337
+ status,
338
+ uptime,
339
+ incidents: dayIncidents,
340
+ totalDowntime: Math.round((100 - uptime) * 14.4)
341
+ });
342
+
343
+ totalUptime += uptime;
344
+ incidents += dayIncidents;
345
+ }
346
+
347
+ months.push({
348
+ month: monthKey,
349
+ days,
350
+ overallUptime: totalUptime / days.length,
351
+ totalIncidents: incidents
352
+ });
353
+ }
354
+
355
+ return months;
356
+ };
357
+
358
+ statusMonth.monthlyData = generateMonthlyData();
359
+ statusMonth.serviceId = 'all-services';
360
+ statusMonth.serviceName = 'All Services';
361
+
362
+ // Configure Incidents - Current maintenance
363
+ const currentIncidents: IIncidentDetails[] = [
364
+ {
365
+ id: 'maint-2024-001',
366
+ title: 'Scheduled Database Maintenance',
367
+ impact: 'Database will be in read-only mode. Some features may be temporarily unavailable.',
368
+ severity: 'minor',
369
+ status: 'monitoring',
370
+ startTime: Date.now() - 2 * 60 * 60 * 1000,
371
+ affectedServices: ['Primary Database', 'Authentication Service', 'Backup Service', 'Logging Service', 'Webhook Delivery'],
372
+ updates: [
373
+ {
374
+ id: 'update-1',
375
+ timestamp: Date.now() - 7 * 24 * 60 * 60 * 1000,
376
+ status: 'investigating',
377
+ message: 'Scheduled maintenance has been announced for database upgrades and security patches.',
378
+ author: 'Operations Team'
379
+ },
380
+ {
381
+ id: 'update-2',
382
+ timestamp: Date.now() - 24 * 60 * 60 * 1000,
383
+ status: 'investigating',
384
+ message: 'Reminder: Database maintenance scheduled for tomorrow at 12:00 AM UTC.',
385
+ author: 'Operations Team'
386
+ },
387
+ {
388
+ id: 'update-3',
389
+ timestamp: Date.now() - 2 * 60 * 60 * 1000,
390
+ status: 'monitoring',
391
+ message: 'Maintenance window has begun. Database is now in read-only mode.',
392
+ author: 'Database Team'
393
+ },
394
+ {
395
+ id: 'update-4',
396
+ timestamp: Date.now() - 1.5 * 60 * 60 * 1000,
397
+ status: 'monitoring',
398
+ message: 'Security patches applied successfully. Beginning database schema updates.',
399
+ author: 'Database Team'
400
+ },
401
+ {
402
+ id: 'update-5',
403
+ timestamp: Date.now() - 1 * 60 * 60 * 1000,
404
+ status: 'monitoring',
405
+ message: 'Schema updates 50% complete. Everything proceeding as planned.',
406
+ author: 'Database Team'
407
+ },
408
+ {
409
+ id: 'update-6',
410
+ timestamp: Date.now() - 30 * 60 * 1000,
411
+ status: 'monitoring',
412
+ message: 'Final testing phase. Services will begin coming back online shortly.',
413
+ author: 'Operations Team'
414
+ }
415
+ ]
416
+ }
417
+ ];
418
+
419
+ const pastIncidents: IIncidentDetails[] = [
420
+ {
421
+ id: 'maint-2024-prev-001',
422
+ title: 'Previous Monthly Maintenance',
423
+ impact: 'Services were in maintenance mode for 1 hour',
424
+ severity: 'minor',
425
+ status: 'resolved',
426
+ startTime: Date.now() - 30 * 24 * 60 * 60 * 1000,
427
+ endTime: Date.now() - 30 * 24 * 60 * 60 * 1000 + 60 * 60 * 1000,
428
+ affectedServices: ['Primary Database', 'Backup Service'],
429
+ rootCause: 'Scheduled monthly maintenance for security updates.',
430
+ resolution: 'Maintenance completed successfully with all updates applied.',
431
+ updates: [
432
+ {
433
+ id: 'update-7',
434
+ timestamp: Date.now() - 30 * 24 * 60 * 60 * 1000,
435
+ status: 'monitoring',
436
+ message: 'Monthly maintenance started.',
437
+ author: 'Operations Team'
438
+ },
439
+ {
440
+ id: 'update-8',
441
+ timestamp: Date.now() - 30 * 24 * 60 * 60 * 1000 + 60 * 60 * 1000,
442
+ status: 'resolved',
443
+ message: 'Maintenance completed successfully.',
444
+ author: 'Operations Team'
445
+ }
446
+ ]
447
+ },
448
+ {
449
+ id: 'inc-2024-001',
450
+ title: 'API Gateway Performance Issues',
451
+ impact: 'Slow API responses for some users',
452
+ severity: 'minor',
453
+ status: 'resolved',
454
+ startTime: Date.now() - 15 * 24 * 60 * 60 * 1000,
455
+ endTime: Date.now() - 15 * 24 * 60 * 60 * 1000 + 45 * 60 * 1000,
456
+ affectedServices: ['API Gateway'],
457
+ rootCause: 'Memory leak in API Gateway service.',
458
+ resolution: 'Service restarted and patch applied.',
459
+ updates: [
460
+ {
461
+ id: 'update-9',
462
+ timestamp: Date.now() - 15 * 24 * 60 * 60 * 1000,
463
+ status: 'investigating',
464
+ message: 'Investigating reports of slow API responses.',
465
+ author: 'API Team'
466
+ },
467
+ {
468
+ id: 'update-10',
469
+ timestamp: Date.now() - 15 * 24 * 60 * 60 * 1000 + 30 * 60 * 1000,
470
+ status: 'identified',
471
+ message: 'Memory leak identified. Preparing fix.',
472
+ author: 'API Team'
473
+ },
474
+ {
475
+ id: 'update-11',
476
+ timestamp: Date.now() - 15 * 24 * 60 * 60 * 1000 + 45 * 60 * 1000,
477
+ status: 'resolved',
478
+ message: 'Fix applied. Performance back to normal.',
479
+ author: 'API Team'
480
+ }
481
+ ]
482
+ },
483
+ {
484
+ id: 'maint-2023-012',
485
+ title: 'Year-End Infrastructure Upgrade',
486
+ impact: 'Planned downtime for major infrastructure improvements',
487
+ severity: 'major',
488
+ status: 'resolved',
489
+ startTime: Date.now() - 60 * 24 * 60 * 60 * 1000,
490
+ endTime: Date.now() - 60 * 24 * 60 * 60 * 1000 + 4 * 60 * 60 * 1000,
491
+ affectedServices: ['All Services'],
492
+ rootCause: 'Annual infrastructure upgrade and capacity expansion.',
493
+ resolution: 'All upgrades completed successfully. System capacity increased by 50%.',
494
+ updates: [
495
+ {
496
+ id: 'update-12',
497
+ timestamp: Date.now() - 67 * 24 * 60 * 60 * 1000,
498
+ status: 'investigating',
499
+ message: 'Year-end maintenance scheduled for next week.',
500
+ author: 'CTO'
501
+ },
502
+ {
503
+ id: 'update-13',
504
+ timestamp: Date.now() - 60 * 24 * 60 * 60 * 1000,
505
+ status: 'monitoring',
506
+ message: 'Maintenance window started. All services going offline.',
507
+ author: 'Operations Team'
508
+ },
509
+ {
510
+ id: 'update-14',
511
+ timestamp: Date.now() - 60 * 24 * 60 * 60 * 1000 + 2 * 60 * 60 * 1000,
512
+ status: 'monitoring',
513
+ message: 'Hardware upgrades complete. Software updates in progress.',
514
+ author: 'Infrastructure Team'
515
+ },
516
+ {
517
+ id: 'update-15',
518
+ timestamp: Date.now() - 60 * 24 * 60 * 60 * 1000 + 4 * 60 * 60 * 1000,
519
+ status: 'resolved',
520
+ message: 'All systems back online. Performance improvements confirmed.',
521
+ author: 'Operations Team'
522
+ },
523
+ {
524
+ id: 'update-16',
525
+ timestamp: Date.now() - 59 * 24 * 60 * 60 * 1000,
526
+ status: 'postmortem',
527
+ message: 'Maintenance report published. 50% capacity increase achieved.',
528
+ author: 'Engineering Team'
529
+ }
530
+ ]
531
+ }
532
+ ];
533
+
534
+ incidents.currentIncidents = currentIncidents;
535
+ incidents.pastIncidents = pastIncidents;
536
+
537
+ // Configure Footer
538
+ footer.companyName = 'SecureVault Infrastructure';
539
+ footer.legalUrl = 'https://securevault.example.com/legal';
540
+ footer.supportEmail = 'support@securevault.example.com';
541
+ footer.statusPageUrl = 'https://status.securevault.example.com';
542
+ footer.lastUpdated = Date.now();
543
+ footer.currentYear = new Date().getFullYear();
544
+ footer.socialLinks = [
545
+ { platform: 'twitter', url: 'https://twitter.com/securevault' },
546
+ { platform: 'linkedin', url: 'https://linkedin.com/company/securevault' }
547
+ ];
548
+ footer.rssFeedUrl = 'https://status.securevault.example.com/rss';
549
+ footer.apiStatusUrl = 'https://api.securevault.example.com/v1/status';
550
+ footer.enableSubscribe = true;
551
+ footer.subscriberCount = 3892;
552
+ footer.additionalLinks = [
553
+ { label: 'Maintenance Schedule', url: 'https://securevault.example.com/maintenance' },
554
+ { label: 'API Documentation', url: 'https://docs.securevault.example.com' },
555
+ { label: 'Support Portal', url: 'https://support.securevault.example.com' }
556
+ ];
557
+ footer.latestStatusUpdate = 'Database maintenance 50% complete - On track for 2:00 AM UTC completion';
558
+ }}
559
+ >
560
+ <upl-statuspage-header></upl-statuspage-header>
561
+ <upl-statuspage-statusbar></upl-statuspage-statusbar>
562
+ <upl-statuspage-statsgrid></upl-statuspage-statsgrid>
563
+ <upl-statuspage-assetsselector></upl-statuspage-assetsselector>
564
+ <upl-statuspage-statusdetails></upl-statuspage-statusdetails>
565
+ <upl-statuspage-statusmonth></upl-statuspage-statusmonth>
566
+ <upl-statuspage-incidents></upl-statuspage-incidents>
567
+ <upl-statuspage-footer></upl-statuspage-footer>
568
+ </dees-demowrapper>
569
+ </div>
570
+ `;