@uptime.link/statuspage 1.0.74 → 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 (96) hide show
  1. package/dist_bundle/bundle.js +5019 -519
  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 +679 -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 +846 -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 +373 -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 +937 -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 +549 -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 +408 -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 +397 -62
  40. package/dist_ts_web/elements/upl-statuspage-statusmonth.d.ts +17 -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 +662 -103
  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 +102 -0
  57. package/dist_ts_web/styles/shared.styles.js +494 -0
  58. package/dist_watch/bundle.js +52265 -32033
  59. package/dist_watch/bundle.js.map +4 -4
  60. package/dist_watch/index.html +1 -0
  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 +600 -18
  71. package/ts_web/elements/upl-statuspage-footer.demo.ts +744 -0
  72. package/ts_web/elements/upl-statuspage-footer.ts +662 -30
  73. package/ts_web/elements/upl-statuspage-header.demo.ts +241 -0
  74. package/ts_web/elements/upl-statuspage-header.ts +289 -52
  75. package/ts_web/elements/upl-statuspage-incidents.demo.ts +1216 -0
  76. package/ts_web/elements/upl-statuspage-incidents.ts +840 -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 +478 -0
  81. package/ts_web/elements/upl-statuspage-statusbar.demo.ts +393 -0
  82. package/ts_web/elements/upl-statuspage-statusbar.ts +332 -20
  83. package/ts_web/elements/upl-statuspage-statusdetails.demo.ts +754 -0
  84. package/ts_web/elements/upl-statuspage-statusdetails.ts +321 -37
  85. package/ts_web/elements/upl-statuspage-statusmonth.demo.ts +876 -0
  86. package/ts_web/elements/upl-statuspage-statusmonth.ts +584 -79
  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 +531 -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,798 @@
1
+ import { html } from '@design.estate/dees-element';
2
+ export const demoFunc = () => html `
3
+ <style>
4
+ .demo-container {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: 20px;
8
+ }
9
+ .demo-section {
10
+ border: 1px solid #ddd;
11
+ border-radius: 8px;
12
+ padding: 20px;
13
+ background: #f5f5f5;
14
+ }
15
+ .demo-title {
16
+ font-size: 14px;
17
+ font-weight: 600;
18
+ margin-bottom: 16px;
19
+ color: #333;
20
+ }
21
+ .demo-controls {
22
+ display: flex;
23
+ gap: 10px;
24
+ margin-top: 16px;
25
+ flex-wrap: wrap;
26
+ }
27
+ .demo-button {
28
+ padding: 6px 12px;
29
+ border: 1px solid #ddd;
30
+ background: white;
31
+ border-radius: 4px;
32
+ cursor: pointer;
33
+ font-size: 13px;
34
+ }
35
+ .demo-button:hover {
36
+ background: #f0f0f0;
37
+ }
38
+ .demo-button.active {
39
+ background: #2196F3;
40
+ color: white;
41
+ border-color: #2196F3;
42
+ }
43
+ .demo-info {
44
+ margin-top: 12px;
45
+ padding: 12px;
46
+ background: white;
47
+ border-radius: 4px;
48
+ font-size: 13px;
49
+ line-height: 1.6;
50
+ }
51
+ .stats-display {
52
+ display: grid;
53
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
54
+ gap: 12px;
55
+ margin-top: 12px;
56
+ }
57
+ .stat-card {
58
+ background: white;
59
+ padding: 12px;
60
+ border-radius: 4px;
61
+ text-align: center;
62
+ }
63
+ .stat-value {
64
+ font-size: 18px;
65
+ font-weight: 600;
66
+ color: #2196F3;
67
+ }
68
+ .stat-label {
69
+ font-size: 11px;
70
+ color: #666;
71
+ margin-top: 4px;
72
+ }
73
+ .month-nav {
74
+ display: flex;
75
+ justify-content: space-between;
76
+ align-items: center;
77
+ margin-top: 12px;
78
+ }
79
+ </style>
80
+
81
+ <div class="demo-container">
82
+ <!-- Different Month Patterns -->
83
+ <div class="demo-section">
84
+ <div class="demo-title">Different Month Patterns</div>
85
+ <dees-demowrapper
86
+ .runAfterRender=${async (wrapperElement) => {
87
+ const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth');
88
+ // Pattern generators
89
+ const generateMonthPattern = (monthCount, pattern) => {
90
+ const months = [];
91
+ const now = new Date();
92
+ for (let monthOffset = monthCount - 1; monthOffset >= 0; monthOffset--) {
93
+ const monthDate = new Date(now.getFullYear(), now.getMonth() - monthOffset, 1);
94
+ const year = monthDate.getFullYear();
95
+ const month = monthDate.getMonth();
96
+ const monthKey = `${year}-${String(month + 1).padStart(2, '0')}`;
97
+ const daysInMonth = new Date(year, month + 1, 0).getDate();
98
+ const days = [];
99
+ let totalIncidents = 0;
100
+ let totalUptimeMinutes = 0;
101
+ for (let day = 1; day <= daysInMonth; day++) {
102
+ let uptime = 100;
103
+ let incidents = 0;
104
+ let downtime = 0;
105
+ let status = 'operational';
106
+ switch (pattern) {
107
+ case 'perfect':
108
+ // Near perfect uptime
109
+ if (Math.random() < 0.02) {
110
+ uptime = 99.9 + Math.random() * 0.099;
111
+ status = 'degraded';
112
+ }
113
+ break;
114
+ case 'problematic':
115
+ // Frequent issues
116
+ const problemRand = Math.random();
117
+ if (problemRand < 0.1) {
118
+ uptime = 70 + Math.random() * 20;
119
+ incidents = 2 + Math.floor(Math.random() * 3);
120
+ status = 'major_outage';
121
+ }
122
+ else if (problemRand < 0.25) {
123
+ uptime = 90 + Math.random() * 8;
124
+ incidents = 1 + Math.floor(Math.random() * 2);
125
+ status = 'partial_outage';
126
+ }
127
+ else if (problemRand < 0.4) {
128
+ uptime = 98 + Math.random() * 1.5;
129
+ incidents = 1;
130
+ status = 'degraded';
131
+ }
132
+ break;
133
+ case 'improving':
134
+ // Getting better over time
135
+ const improvementFactor = (monthCount - monthOffset) / monthCount;
136
+ const improveRand = Math.random();
137
+ if (improveRand < 0.3 * (1 - improvementFactor)) {
138
+ uptime = 85 + Math.random() * 10 + (improvementFactor * 10);
139
+ incidents = Math.max(0, 3 - Math.floor(improvementFactor * 3));
140
+ status = improvementFactor > 0.7 ? 'degraded' : 'partial_outage';
141
+ }
142
+ break;
143
+ case 'degrading':
144
+ // Getting worse over time
145
+ const degradationFactor = monthOffset / monthCount;
146
+ const degradeRand = Math.random();
147
+ if (degradeRand < 0.3 * (1 - degradationFactor)) {
148
+ uptime = 85 + Math.random() * 10 + (degradationFactor * 10);
149
+ incidents = Math.max(0, 3 - Math.floor(degradationFactor * 3));
150
+ status = degradationFactor > 0.7 ? 'degraded' : 'major_outage';
151
+ }
152
+ break;
153
+ case 'seasonal':
154
+ // Worse during certain months (simulating high traffic periods)
155
+ const monthNum = month;
156
+ if (monthNum === 11 || monthNum === 0) { // December, January
157
+ if (Math.random() < 0.3) {
158
+ uptime = 92 + Math.random() * 6;
159
+ incidents = 1 + Math.floor(Math.random() * 2);
160
+ status = 'degraded';
161
+ }
162
+ }
163
+ else if (monthNum === 6 || monthNum === 7) { // July, August
164
+ if (Math.random() < 0.2) {
165
+ uptime = 94 + Math.random() * 5;
166
+ incidents = 1;
167
+ status = 'degraded';
168
+ }
169
+ }
170
+ break;
171
+ }
172
+ downtime = Math.floor((100 - uptime) * 14.4);
173
+ totalIncidents += incidents;
174
+ totalUptimeMinutes += uptime * 14.4;
175
+ days.push({
176
+ date: `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`,
177
+ uptime,
178
+ incidents,
179
+ totalDowntime: downtime,
180
+ status
181
+ });
182
+ }
183
+ const overallUptime = totalUptimeMinutes / (daysInMonth * 1440) * 100;
184
+ months.push({
185
+ month: monthKey,
186
+ days,
187
+ overallUptime,
188
+ totalIncidents
189
+ });
190
+ }
191
+ return months;
192
+ };
193
+ // Initial setup
194
+ statusMonth.serviceId = 'production-api';
195
+ statusMonth.serviceName = 'Production API';
196
+ statusMonth.monthlyData = generateMonthPattern(6, 'perfect');
197
+ // Create pattern controls
198
+ const controls = document.createElement('div');
199
+ controls.className = 'demo-controls';
200
+ const patterns = [
201
+ { key: 'perfect', label: 'Perfect Uptime' },
202
+ { key: 'problematic', label: 'Problematic' },
203
+ { key: 'improving', label: 'Improving Trend' },
204
+ { key: 'degrading', label: 'Degrading Trend' },
205
+ { key: 'seasonal', label: 'Seasonal Pattern' }
206
+ ];
207
+ patterns.forEach((pattern, index) => {
208
+ const button = document.createElement('button');
209
+ button.className = 'demo-button' + (index === 0 ? ' active' : '');
210
+ button.textContent = pattern.label;
211
+ button.onclick = () => {
212
+ controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active'));
213
+ button.classList.add('active');
214
+ statusMonth.loading = true;
215
+ setTimeout(() => {
216
+ statusMonth.monthlyData = generateMonthPattern(6, pattern.key);
217
+ statusMonth.loading = false;
218
+ updateStats();
219
+ }, 500);
220
+ };
221
+ controls.appendChild(button);
222
+ });
223
+ wrapperElement.appendChild(controls);
224
+ // Add statistics display
225
+ const statsDiv = document.createElement('div');
226
+ statsDiv.className = 'stats-display';
227
+ wrapperElement.appendChild(statsDiv);
228
+ const updateStats = () => {
229
+ const data = statusMonth.monthlyData || [];
230
+ const avgUptime = data.reduce((sum, month) => sum + month.overallUptime, 0) / data.length;
231
+ const totalIncidents = data.reduce((sum, month) => sum + month.totalIncidents, 0);
232
+ const worstMonth = data.reduce((worst, month) => month.overallUptime < worst.overallUptime ? month : worst, data[0]);
233
+ statsDiv.innerHTML = `
234
+ <div class="stat-card">
235
+ <div class="stat-value">${avgUptime.toFixed(3)}%</div>
236
+ <div class="stat-label">Avg Uptime</div>
237
+ </div>
238
+ <div class="stat-card">
239
+ <div class="stat-value">${totalIncidents}</div>
240
+ <div class="stat-label">Total Incidents</div>
241
+ </div>
242
+ <div class="stat-card">
243
+ <div class="stat-value">${data.length}</div>
244
+ <div class="stat-label">Months</div>
245
+ </div>
246
+ <div class="stat-card">
247
+ <div class="stat-value">${worstMonth ? worstMonth.overallUptime.toFixed(2) : '100'}%</div>
248
+ <div class="stat-label">Worst Month</div>
249
+ </div>
250
+ `;
251
+ };
252
+ updateStats();
253
+ // Handle day clicks
254
+ statusMonth.addEventListener('dayClick', (event) => {
255
+ const { date, uptime, incidents, status, totalDowntime } = event.detail;
256
+ alert(`Day Details for ${date}:\n\nUptime: ${uptime.toFixed(3)}%\nIncidents: ${incidents}\nStatus: ${status}\nDowntime: ${totalDowntime} minutes`);
257
+ });
258
+ }}
259
+ >
260
+ <upl-statuspage-statusmonth></upl-statuspage-statusmonth>
261
+ </dees-demowrapper>
262
+ </div>
263
+
264
+ <!-- Different Time Spans -->
265
+ <div class="demo-section">
266
+ <div class="demo-title">Different Time Spans</div>
267
+ <dees-demowrapper
268
+ .runAfterRender=${async (wrapperElement) => {
269
+ const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth');
270
+ // Generate data for different time spans
271
+ const generateTimeSpanData = (months) => {
272
+ const data = [];
273
+ const now = new Date();
274
+ for (let monthOffset = months - 1; monthOffset >= 0; monthOffset--) {
275
+ const monthDate = new Date(now.getFullYear(), now.getMonth() - monthOffset, 1);
276
+ const year = monthDate.getFullYear();
277
+ const month = monthDate.getMonth();
278
+ const monthKey = `${year}-${String(month + 1).padStart(2, '0')}`;
279
+ const daysInMonth = new Date(year, month + 1, 0).getDate();
280
+ const days = [];
281
+ let totalIncidents = 0;
282
+ let totalUptimeMinutes = 0;
283
+ for (let day = 1; day <= daysInMonth; day++) {
284
+ // Create realistic patterns
285
+ let uptime = 99.9 + Math.random() * 0.099;
286
+ let incidents = 0;
287
+ let status = 'operational';
288
+ if (Math.random() < 0.05) {
289
+ uptime = 95 + Math.random() * 4.9;
290
+ incidents = 1;
291
+ status = 'degraded';
292
+ }
293
+ else if (Math.random() < 0.01) {
294
+ uptime = 85 + Math.random() * 10;
295
+ incidents = 2;
296
+ status = 'partial_outage';
297
+ }
298
+ const downtime = Math.floor((100 - uptime) * 14.4);
299
+ totalIncidents += incidents;
300
+ totalUptimeMinutes += uptime * 14.4;
301
+ days.push({
302
+ date: `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`,
303
+ uptime,
304
+ incidents,
305
+ totalDowntime: downtime,
306
+ status
307
+ });
308
+ }
309
+ const overallUptime = totalUptimeMinutes / (daysInMonth * 1440) * 100;
310
+ data.push({
311
+ month: monthKey,
312
+ days,
313
+ overallUptime,
314
+ totalIncidents
315
+ });
316
+ }
317
+ return data;
318
+ };
319
+ // Initial setup
320
+ statusMonth.serviceId = 'multi-region-lb';
321
+ statusMonth.serviceName = 'Multi-Region Load Balancer';
322
+ statusMonth.monthlyData = generateTimeSpanData(3);
323
+ // Create time span controls
324
+ const controls = document.createElement('div');
325
+ controls.className = 'demo-controls';
326
+ const timeSpans = [
327
+ { months: 3, label: 'Last 3 Months' },
328
+ { months: 6, label: 'Last 6 Months' },
329
+ { months: 12, label: 'Last 12 Months' },
330
+ { months: 24, label: 'Last 24 Months' }
331
+ ];
332
+ timeSpans.forEach((span, index) => {
333
+ const button = document.createElement('button');
334
+ button.className = 'demo-button' + (index === 0 ? ' active' : '');
335
+ button.textContent = span.label;
336
+ button.onclick = () => {
337
+ controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active'));
338
+ button.classList.add('active');
339
+ statusMonth.loading = true;
340
+ setTimeout(() => {
341
+ statusMonth.monthlyData = generateTimeSpanData(span.months);
342
+ statusMonth.loading = false;
343
+ }, 500);
344
+ };
345
+ controls.appendChild(button);
346
+ });
347
+ wrapperElement.appendChild(controls);
348
+ // Add info display
349
+ const info = document.createElement('div');
350
+ info.className = 'demo-info';
351
+ info.innerHTML = 'Click on different time spans to see historical uptime data. The component automatically adjusts the display based on the number of months.';
352
+ wrapperElement.appendChild(info);
353
+ }}
354
+ >
355
+ <upl-statuspage-statusmonth></upl-statuspage-statusmonth>
356
+ </dees-demowrapper>
357
+ </div>
358
+
359
+ <!-- Current Month Real-time Updates -->
360
+ <div class="demo-section">
361
+ <div class="demo-title">Current Month with Real-time Updates</div>
362
+ <dees-demowrapper
363
+ .runAfterRender=${async (wrapperElement) => {
364
+ const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth');
365
+ // Generate current month data
366
+ const generateCurrentMonthData = () => {
367
+ const now = new Date();
368
+ const year = now.getFullYear();
369
+ const month = now.getMonth();
370
+ const today = now.getDate();
371
+ const monthKey = `${year}-${String(month + 1).padStart(2, '0')}`;
372
+ const daysInMonth = new Date(year, month + 1, 0).getDate();
373
+ const days = [];
374
+ let totalIncidents = 0;
375
+ let totalUptimeMinutes = 0;
376
+ // Generate data only up to today
377
+ for (let day = 1; day <= today; day++) {
378
+ let uptime = 99.9 + Math.random() * 0.099;
379
+ let incidents = 0;
380
+ let status = 'operational';
381
+ // Today might have ongoing issues
382
+ if (day === today) {
383
+ if (Math.random() < 0.3) {
384
+ uptime = 95 + Math.random() * 4;
385
+ incidents = 1;
386
+ status = 'degraded';
387
+ }
388
+ }
389
+ else if (Math.random() < 0.05) {
390
+ uptime = 97 + Math.random() * 2.9;
391
+ incidents = 1;
392
+ status = 'degraded';
393
+ }
394
+ const downtime = Math.floor((100 - uptime) * 14.4);
395
+ totalIncidents += incidents;
396
+ totalUptimeMinutes += uptime * 14.4;
397
+ days.push({
398
+ date: `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`,
399
+ uptime,
400
+ incidents,
401
+ totalDowntime: downtime,
402
+ status
403
+ });
404
+ }
405
+ // Fill remaining days with placeholder
406
+ for (let day = today + 1; day <= daysInMonth; day++) {
407
+ days.push({
408
+ date: `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`,
409
+ uptime: 0,
410
+ incidents: 0,
411
+ totalDowntime: 0,
412
+ status: 'operational'
413
+ });
414
+ }
415
+ const overallUptime = today > 0 ? totalUptimeMinutes / (today * 1440) * 100 : 100;
416
+ return [{
417
+ month: monthKey,
418
+ days,
419
+ overallUptime,
420
+ totalIncidents
421
+ }];
422
+ };
423
+ // Initial setup
424
+ statusMonth.serviceId = 'realtime-monitor';
425
+ statusMonth.serviceName = 'Real-time Monitoring Service';
426
+ statusMonth.monthlyData = generateCurrentMonthData();
427
+ statusMonth.showCurrentDay = true;
428
+ // Update today's status periodically
429
+ const updateInterval = setInterval(() => {
430
+ const data = statusMonth.monthlyData;
431
+ if (data && data.length > 0) {
432
+ const currentMonth = data[0];
433
+ const today = new Date().getDate() - 1;
434
+ if (currentMonth.days[today]) {
435
+ // Simulate status changes
436
+ const rand = Math.random();
437
+ if (rand < 0.1) {
438
+ currentMonth.days[today].uptime = 95 + Math.random() * 4.9;
439
+ currentMonth.days[today].incidents = (currentMonth.days[today].incidents || 0) + 1;
440
+ currentMonth.days[today].status = 'degraded';
441
+ currentMonth.days[today].totalDowntime = Math.floor((100 - currentMonth.days[today].uptime) * 14.4);
442
+ // Recalculate overall uptime
443
+ let totalUptime = 0;
444
+ let validDays = 0;
445
+ currentMonth.days.forEach((day, index) => {
446
+ if (index <= today && day.uptime > 0) {
447
+ totalUptime += day.uptime;
448
+ validDays++;
449
+ }
450
+ });
451
+ currentMonth.overallUptime = validDays > 0 ? totalUptime / validDays : 100;
452
+ currentMonth.totalIncidents = currentMonth.days.reduce((sum, day) => sum + (day.incidents || 0), 0);
453
+ statusMonth.requestUpdate();
454
+ logUpdate('Status degraded - Uptime: ' + currentMonth.days[today].uptime.toFixed(2) + '%');
455
+ }
456
+ else if (rand < 0.05 && currentMonth.days[today].status !== 'operational') {
457
+ // Recover from issues
458
+ currentMonth.days[today].uptime = 99.9 + Math.random() * 0.099;
459
+ currentMonth.days[today].status = 'operational';
460
+ currentMonth.days[today].totalDowntime = Math.floor((100 - currentMonth.days[today].uptime) * 14.4);
461
+ statusMonth.requestUpdate();
462
+ logUpdate('Service recovered to operational status');
463
+ }
464
+ }
465
+ }
466
+ }, 3000);
467
+ // Create controls
468
+ const controls = document.createElement('div');
469
+ controls.className = 'demo-controls';
470
+ controls.innerHTML = '<button class="demo-button" id="simulateOutage">Simulate Outage</button>' +
471
+ '<button class="demo-button" id="simulateRecovery">Simulate Recovery</button>' +
472
+ '<button class="demo-button" id="refreshData">Refresh Data</button>';
473
+ wrapperElement.appendChild(controls);
474
+ controls.querySelector('#simulateOutage')?.addEventListener('click', () => {
475
+ const data = statusMonth.monthlyData;
476
+ if (data && data.length > 0) {
477
+ const today = new Date().getDate() - 1;
478
+ data[0].days[today].uptime = 85 + Math.random() * 10;
479
+ data[0].days[today].incidents = (data[0].days[today].incidents || 0) + 1;
480
+ data[0].days[today].status = 'major_outage';
481
+ data[0].days[today].totalDowntime = Math.floor((100 - data[0].days[today].uptime) * 14.4);
482
+ statusMonth.requestUpdate();
483
+ logUpdate('Major outage simulated');
484
+ }
485
+ });
486
+ controls.querySelector('#simulateRecovery')?.addEventListener('click', () => {
487
+ const data = statusMonth.monthlyData;
488
+ if (data && data.length > 0) {
489
+ const today = new Date().getDate() - 1;
490
+ data[0].days[today].uptime = 99.95;
491
+ data[0].days[today].status = 'operational';
492
+ data[0].days[today].totalDowntime = Math.floor((100 - data[0].days[today].uptime) * 14.4);
493
+ statusMonth.requestUpdate();
494
+ logUpdate('Service recovered');
495
+ }
496
+ });
497
+ controls.querySelector('#refreshData')?.addEventListener('click', () => {
498
+ statusMonth.monthlyData = generateCurrentMonthData();
499
+ logUpdate('Data refreshed');
500
+ });
501
+ // Add update log
502
+ const logDiv = document.createElement('div');
503
+ logDiv.className = 'demo-info';
504
+ logDiv.style.maxHeight = '100px';
505
+ logDiv.style.overflowY = 'auto';
506
+ logDiv.innerHTML = '<strong>Update Log:</strong><br>';
507
+ wrapperElement.appendChild(logDiv);
508
+ const logUpdate = (message) => {
509
+ const time = new Date().toLocaleTimeString();
510
+ logDiv.innerHTML += '[' + time + '] ' + message + '<br>';
511
+ logDiv.scrollTop = logDiv.scrollHeight;
512
+ };
513
+ // Cleanup
514
+ wrapperElement.addEventListener('remove', () => {
515
+ clearInterval(updateInterval);
516
+ });
517
+ }}
518
+ >
519
+ <upl-statuspage-statusmonth></upl-statuspage-statusmonth>
520
+ </dees-demowrapper>
521
+ </div>
522
+
523
+ <!-- Edge Cases -->
524
+ <div class="demo-section">
525
+ <div class="demo-title">Edge Cases and Special Scenarios</div>
526
+ <dees-demowrapper
527
+ .runAfterRender=${async (wrapperElement) => {
528
+ const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth');
529
+ const scenarios = {
530
+ noData: {
531
+ name: 'No Data',
532
+ data: []
533
+ },
534
+ singleMonth: {
535
+ name: 'Single Month',
536
+ data: [{
537
+ month: '2024-01',
538
+ days: Array.from({ length: 31 }, (_, i) => ({
539
+ date: `2024-01-${String(i + 1).padStart(2, '0')}`,
540
+ uptime: 99.9 + Math.random() * 0.099,
541
+ incidents: 0,
542
+ totalDowntime: 0,
543
+ status: 'operational'
544
+ })),
545
+ overallUptime: 99.95,
546
+ totalIncidents: 0
547
+ }]
548
+ },
549
+ allDown: {
550
+ name: 'Complete Outage Month',
551
+ data: [{
552
+ month: '2024-01',
553
+ days: Array.from({ length: 31 }, (_, i) => ({
554
+ date: `2024-01-${String(i + 1).padStart(2, '0')}`,
555
+ uptime: 0,
556
+ incidents: 5,
557
+ totalDowntime: 1440,
558
+ status: 'major_outage'
559
+ })),
560
+ overallUptime: 0,
561
+ totalIncidents: 155
562
+ }]
563
+ },
564
+ maintenanceMonth: {
565
+ name: 'Maintenance Heavy Month',
566
+ data: [{
567
+ month: '2024-01',
568
+ days: Array.from({ length: 31 }, (_, i) => {
569
+ // Maintenance every weekend
570
+ const dayOfWeek = new Date(2024, 0, i + 1).getDay();
571
+ if (dayOfWeek === 0 || dayOfWeek === 6) {
572
+ return {
573
+ date: `2024-01-${String(i + 1).padStart(2, '0')}`,
574
+ uptime: 95,
575
+ incidents: 0,
576
+ totalDowntime: 72,
577
+ status: 'maintenance'
578
+ };
579
+ }
580
+ return {
581
+ date: `2024-01-${String(i + 1).padStart(2, '0')}`,
582
+ uptime: 99.95,
583
+ incidents: 0,
584
+ totalDowntime: 0.7,
585
+ status: 'operational'
586
+ };
587
+ }),
588
+ overallUptime: 98.2,
589
+ totalIncidents: 0
590
+ }]
591
+ },
592
+ mixedYear: {
593
+ name: 'Full Year Mixed',
594
+ data: Array.from({ length: 12 }, (_, monthIndex) => {
595
+ const year = 2023;
596
+ const month = monthIndex;
597
+ const daysInMonth = new Date(year, month + 1, 0).getDate();
598
+ // Different pattern each quarter
599
+ let monthPattern = 'operational';
600
+ if (monthIndex < 3)
601
+ monthPattern = 'degraded';
602
+ else if (monthIndex < 6)
603
+ monthPattern = 'improving';
604
+ else if (monthIndex < 9)
605
+ monthPattern = 'stable';
606
+ else
607
+ monthPattern = 'volatile';
608
+ const days = Array.from({ length: daysInMonth }, (_, dayIndex) => {
609
+ let uptime = 99.9;
610
+ let status = 'operational';
611
+ let incidents = 0;
612
+ if (monthPattern === 'degraded' && Math.random() < 0.3) {
613
+ uptime = 85 + Math.random() * 10;
614
+ status = 'degraded';
615
+ incidents = 1;
616
+ }
617
+ else if (monthPattern === 'volatile' && Math.random() < 0.2) {
618
+ uptime = 90 + Math.random() * 9;
619
+ status = Math.random() < 0.5 ? 'partial_outage' : 'degraded';
620
+ incidents = Math.floor(Math.random() * 3) + 1;
621
+ }
622
+ return {
623
+ date: `${year}-${String(month + 1).padStart(2, '0')}-${String(dayIndex + 1).padStart(2, '0')}`,
624
+ uptime,
625
+ incidents,
626
+ totalDowntime: Math.floor((100 - uptime) * 14.4),
627
+ status
628
+ };
629
+ });
630
+ const totalIncidents = days.reduce((sum, day) => sum + day.incidents, 0);
631
+ const overallUptime = days.reduce((sum, day) => sum + day.uptime, 0) / days.length;
632
+ return {
633
+ month: `${year}-${String(month + 1).padStart(2, '0')}`,
634
+ days,
635
+ overallUptime,
636
+ totalIncidents
637
+ };
638
+ })
639
+ }
640
+ };
641
+ // Initial setup
642
+ let currentScenario = 'singleMonth';
643
+ statusMonth.serviceId = 'edge-case-service';
644
+ statusMonth.serviceName = 'Edge Case Service';
645
+ statusMonth.monthlyData = scenarios[currentScenario].data;
646
+ // Create scenario controls
647
+ const controls = document.createElement('div');
648
+ controls.className = 'demo-controls';
649
+ Object.entries(scenarios).forEach(([key, scenario]) => {
650
+ const button = document.createElement('button');
651
+ button.className = 'demo-button' + (key === currentScenario ? ' active' : '');
652
+ button.textContent = scenario.name;
653
+ button.onclick = () => {
654
+ controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active'));
655
+ button.classList.add('active');
656
+ currentScenario = key;
657
+ statusMonth.loading = true;
658
+ setTimeout(() => {
659
+ statusMonth.monthlyData = scenario.data;
660
+ statusMonth.loading = false;
661
+ }, 300);
662
+ };
663
+ controls.appendChild(button);
664
+ });
665
+ wrapperElement.appendChild(controls);
666
+ }}
667
+ >
668
+ <upl-statuspage-statusmonth></upl-statuspage-statusmonth>
669
+ </dees-demowrapper>
670
+ </div>
671
+
672
+ <!-- Loading and Navigation States -->
673
+ <div class="demo-section">
674
+ <div class="demo-title">Loading and Navigation Features</div>
675
+ <dees-demowrapper
676
+ .runAfterRender=${async (wrapperElement) => {
677
+ const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth');
678
+ // Start with loading
679
+ statusMonth.loading = true;
680
+ statusMonth.serviceId = 'navigation-demo';
681
+ statusMonth.serviceName = 'Navigation Demo Service';
682
+ const controls = document.createElement('div');
683
+ controls.className = 'demo-controls';
684
+ controls.innerHTML = '<button class="demo-button" id="toggleLoading">Toggle Loading</button>' +
685
+ '<button class="demo-button" id="loadSuccess">Load Successfully</button>' +
686
+ '<button class="demo-button" id="loadError">Simulate Error</button>' +
687
+ '<button class="demo-button" id="toggleTooltip">Toggle Tooltip</button>';
688
+ wrapperElement.appendChild(controls);
689
+ controls.querySelector('#toggleLoading')?.addEventListener('click', () => {
690
+ statusMonth.loading = !statusMonth.loading;
691
+ });
692
+ controls.querySelector('#loadSuccess')?.addEventListener('click', () => {
693
+ statusMonth.loading = true;
694
+ setTimeout(() => {
695
+ const months = 6;
696
+ const data = [];
697
+ const now = new Date();
698
+ for (let i = months - 1; i >= 0; i--) {
699
+ const monthDate = new Date(now.getFullYear(), now.getMonth() - i, 1);
700
+ const year = monthDate.getFullYear();
701
+ const month = monthDate.getMonth();
702
+ const daysInMonth = new Date(year, month + 1, 0).getDate();
703
+ data.push({
704
+ month: `${year}-${String(month + 1).padStart(2, '0')}`,
705
+ days: Array.from({ length: daysInMonth }, (_, d) => ({
706
+ date: `${year}-${String(month + 1).padStart(2, '0')}-${String(d + 1).padStart(2, '0')}`,
707
+ uptime: 99 + Math.random(),
708
+ incidents: Math.random() < 0.05 ? 1 : 0,
709
+ totalDowntime: Math.random() < 0.05 ? Math.floor(Math.random() * 60) : 0,
710
+ status: Math.random() < 0.05 ? 'degraded' : 'operational'
711
+ })),
712
+ overallUptime: 99.5 + Math.random() * 0.4,
713
+ totalIncidents: Math.floor(Math.random() * 5)
714
+ });
715
+ }
716
+ statusMonth.monthlyData = data;
717
+ statusMonth.loading = false;
718
+ }, 1000);
719
+ });
720
+ controls.querySelector('#loadError')?.addEventListener('click', () => {
721
+ statusMonth.loading = true;
722
+ setTimeout(() => {
723
+ statusMonth.loading = false;
724
+ statusMonth.monthlyData = [];
725
+ statusMonth.errorMessage = 'Failed to load monthly uptime data';
726
+ }, 1500);
727
+ });
728
+ controls.querySelector('#toggleTooltip')?.addEventListener('click', () => {
729
+ statusMonth.showTooltip = !statusMonth.showTooltip;
730
+ const btn = controls.querySelector('#toggleTooltip');
731
+ if (btn)
732
+ btn.textContent = 'Toggle Tooltip (' + (statusMonth.showTooltip ? 'ON' : 'OFF') + ')';
733
+ });
734
+ // Month navigation
735
+ const navDiv = document.createElement('div');
736
+ navDiv.className = 'month-nav';
737
+ navDiv.innerHTML = '<button class="demo-button" id="prevMonth">← Previous</button>' +
738
+ '<span id="currentMonth">Loading...</span>' +
739
+ '<button class="demo-button" id="nextMonth">Next →</button>';
740
+ wrapperElement.appendChild(navDiv);
741
+ let currentMonthIndex = 0;
742
+ const updateNavigation = () => {
743
+ const data = statusMonth.monthlyData || [];
744
+ if (data.length > 0 && currentMonthIndex < data.length) {
745
+ const month = data[currentMonthIndex];
746
+ const currentMonthEl = navDiv.querySelector('#currentMonth');
747
+ if (currentMonthEl)
748
+ currentMonthEl.textContent = month.month;
749
+ const prevBtn = navDiv.querySelector('#prevMonth');
750
+ const nextBtn = navDiv.querySelector('#nextMonth');
751
+ if (prevBtn)
752
+ prevBtn.disabled = currentMonthIndex === 0;
753
+ if (nextBtn)
754
+ nextBtn.disabled = currentMonthIndex === data.length - 1;
755
+ }
756
+ };
757
+ navDiv.querySelector('#prevMonth')?.addEventListener('click', () => {
758
+ if (currentMonthIndex > 0) {
759
+ currentMonthIndex--;
760
+ updateNavigation();
761
+ // Highlight the month somehow
762
+ statusMonth.highlightMonth = statusMonth.monthlyData[currentMonthIndex].month;
763
+ }
764
+ });
765
+ navDiv.querySelector('#nextMonth')?.addEventListener('click', () => {
766
+ if (currentMonthIndex < (statusMonth.monthlyData?.length || 0) - 1) {
767
+ currentMonthIndex++;
768
+ updateNavigation();
769
+ statusMonth.highlightMonth = statusMonth.monthlyData[currentMonthIndex].month;
770
+ }
771
+ });
772
+ // Initial load
773
+ setTimeout(() => {
774
+ const data = Array.from({ length: 3 }, (_, i) => ({
775
+ month: `2024-${String(i + 1).padStart(2, '0')}`,
776
+ days: Array.from({ length: 31 }, (_, d) => ({
777
+ date: `2024-${String(i + 1).padStart(2, '0')}-${String(d + 1).padStart(2, '0')}`,
778
+ uptime: 99.5 + Math.random() * 0.5,
779
+ incidents: 0,
780
+ totalDowntime: 0,
781
+ status: 'operational'
782
+ })),
783
+ overallUptime: 99.7 + Math.random() * 0.3,
784
+ totalIncidents: Math.floor(Math.random() * 3)
785
+ }));
786
+ statusMonth.monthlyData = data;
787
+ statusMonth.loading = false;
788
+ statusMonth.showTooltip = true;
789
+ updateNavigation();
790
+ }, 1000);
791
+ }}
792
+ >
793
+ <upl-statuspage-statusmonth></upl-statuspage-statusmonth>
794
+ </dees-demowrapper>
795
+ </div>
796
+ </div>
797
+ `;
798
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsLXN0YXR1c3BhZ2Utc3RhdHVzbW9udGguZGVtby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy91cGwtc3RhdHVzcGFnZS1zdGF0dXNtb250aC5kZW1vLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUduRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBb0ZSLEtBQUssRUFBRSxjQUFtQixFQUFFLEVBQUU7SUFDOUMsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBUSxDQUFDO0lBRXRGLHFCQUFxQjtJQUNyQixNQUFNLG9CQUFvQixHQUFHLENBQUMsVUFBa0IsRUFBRSxPQUEyRSxFQUFvQixFQUFFO1FBQ2pKLE1BQU0sTUFBTSxHQUFxQixFQUFFLENBQUM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUV2QixLQUFLLElBQUksV0FBVyxHQUFHLFVBQVUsR0FBRyxDQUFDLEVBQUUsV0FBVyxJQUFJLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQy9FLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkMsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJ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