@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,365 @@
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
+ .status-info {
39
+ margin-top: 12px;
40
+ padding: 12px;
41
+ background: white;
42
+ border-radius: 4px;
43
+ font-size: 13px;
44
+ line-height: 1.6;
45
+ }
46
+ </style>
47
+
48
+ <div class="demo-container">
49
+ <!-- Cycling Through All States -->
50
+ <div class="demo-section">
51
+ <div class="demo-title">Automatic Status Cycling</div>
52
+ <dees-demowrapper
53
+ .runAfterRender=${async (wrapperElement) => {
54
+ const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar');
55
+ const statusStates = [
56
+ {
57
+ status: 'operational',
58
+ message: 'All Systems Operational',
59
+ lastUpdated: Date.now(),
60
+ affectedServices: 0,
61
+ totalServices: 12
62
+ },
63
+ {
64
+ status: 'degraded',
65
+ message: 'Minor Service Degradation',
66
+ lastUpdated: Date.now(),
67
+ affectedServices: 2,
68
+ totalServices: 12
69
+ },
70
+ {
71
+ status: 'partial_outage',
72
+ message: 'Partial System Outage',
73
+ lastUpdated: Date.now(),
74
+ affectedServices: 4,
75
+ totalServices: 12
76
+ },
77
+ {
78
+ status: 'major_outage',
79
+ message: 'Major Service Disruption',
80
+ lastUpdated: Date.now(),
81
+ affectedServices: 8,
82
+ totalServices: 12
83
+ },
84
+ {
85
+ status: 'maintenance',
86
+ message: 'Scheduled Maintenance in Progress',
87
+ lastUpdated: Date.now(),
88
+ affectedServices: 3,
89
+ totalServices: 12
90
+ }
91
+ ];
92
+ let statusIndex = 0;
93
+ // Initial loading demo
94
+ statusBar.loading = true;
95
+ setTimeout(() => {
96
+ statusBar.loading = false;
97
+ statusBar.overallStatus = statusStates[0];
98
+ }, 1500);
99
+ // Cycle through states
100
+ setInterval(() => {
101
+ statusIndex = (statusIndex + 1) % statusStates.length;
102
+ statusBar.overallStatus = statusStates[statusIndex];
103
+ statusBar.overallStatus = { ...statusBar.overallStatus, lastUpdated: Date.now() };
104
+ }, 3000);
105
+ // Handle clicks
106
+ statusBar.addEventListener('statusClick', (event) => {
107
+ console.log('Status bar clicked:', event.detail);
108
+ alert(`Status Details:\n\nStatus: ${event.detail.status.status}\nMessage: ${event.detail.status.message}\nAffected Services: ${event.detail.status.affectedServices}`);
109
+ });
110
+ }}
111
+ >
112
+ <upl-statuspage-statusbar></upl-statuspage-statusbar>
113
+ </dees-demowrapper>
114
+ </div>
115
+
116
+ <!-- Manual Status Control -->
117
+ <div class="demo-section">
118
+ <div class="demo-title">Manual Status Control</div>
119
+ <dees-demowrapper
120
+ .runAfterRender=${async (wrapperElement) => {
121
+ const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar');
122
+ // Initial state
123
+ statusBar.overallStatus = {
124
+ status: 'operational',
125
+ message: 'All Systems Operational',
126
+ lastUpdated: Date.now(),
127
+ affectedServices: 0,
128
+ totalServices: 15
129
+ };
130
+ // Create controls
131
+ const controls = document.createElement('div');
132
+ controls.className = 'demo-controls';
133
+ controls.innerHTML = `
134
+ <button class="demo-button" data-status="operational">Operational</button>
135
+ <button class="demo-button" data-status="degraded">Degraded</button>
136
+ <button class="demo-button" data-status="partial_outage">Partial Outage</button>
137
+ <button class="demo-button" data-status="major_outage">Major Outage</button>
138
+ <button class="demo-button" data-status="maintenance">Maintenance</button>
139
+ `;
140
+ wrapperElement.appendChild(controls);
141
+ // Status messages
142
+ const statusMessages = {
143
+ operational: 'All Systems Operational',
144
+ degraded: 'Performance Issues Detected',
145
+ partial_outage: 'Some Services Unavailable',
146
+ major_outage: 'Critical System Failure',
147
+ maintenance: 'Planned Maintenance Window'
148
+ };
149
+ const affectedCounts = {
150
+ operational: 0,
151
+ degraded: 3,
152
+ partial_outage: 7,
153
+ major_outage: 12,
154
+ maintenance: 5
155
+ };
156
+ // Handle button clicks
157
+ controls.querySelectorAll('.demo-button').forEach(button => {
158
+ button.addEventListener('click', () => {
159
+ const status = button.getAttribute('data-status');
160
+ statusBar.overallStatus = {
161
+ status: status,
162
+ message: statusMessages[status],
163
+ lastUpdated: Date.now(),
164
+ affectedServices: affectedCounts[status],
165
+ totalServices: 15
166
+ };
167
+ });
168
+ });
169
+ }}
170
+ >
171
+ <upl-statuspage-statusbar></upl-statuspage-statusbar>
172
+ </dees-demowrapper>
173
+ </div>
174
+
175
+ <!-- Loading States -->
176
+ <div class="demo-section">
177
+ <div class="demo-title">Loading and Refresh States</div>
178
+ <dees-demowrapper
179
+ .runAfterRender=${async (wrapperElement) => {
180
+ const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar');
181
+ // Initial loading
182
+ statusBar.loading = true;
183
+ const controls = document.createElement('div');
184
+ controls.className = 'demo-controls';
185
+ controls.innerHTML = `
186
+ <button class="demo-button" id="toggleLoading">Toggle Loading</button>
187
+ <button class="demo-button" id="refresh">Refresh Status</button>
188
+ <button class="demo-button" id="simulateError">Simulate Error</button>
189
+ `;
190
+ wrapperElement.appendChild(controls);
191
+ // Set initial status after loading
192
+ setTimeout(() => {
193
+ statusBar.loading = false;
194
+ statusBar.overallStatus = {
195
+ status: 'operational',
196
+ message: 'All Systems Operational',
197
+ lastUpdated: Date.now(),
198
+ affectedServices: 0,
199
+ totalServices: 10
200
+ };
201
+ }, 2000);
202
+ // Toggle loading
203
+ controls.querySelector('#toggleLoading')?.addEventListener('click', () => {
204
+ statusBar.loading = !statusBar.loading;
205
+ });
206
+ // Refresh simulation
207
+ controls.querySelector('#refresh')?.addEventListener('click', () => {
208
+ statusBar.loading = true;
209
+ setTimeout(() => {
210
+ statusBar.loading = false;
211
+ // Simulate random status after refresh
212
+ const statuses = ['operational', 'degraded', 'partial_outage'];
213
+ const randomStatus = statuses[Math.floor(Math.random() * statuses.length)];
214
+ statusBar.overallStatus = {
215
+ status: randomStatus,
216
+ message: 'Status refreshed at ' + new Date().toLocaleTimeString(),
217
+ lastUpdated: Date.now(),
218
+ affectedServices: randomStatus === 'operational' ? 0 : Math.floor(Math.random() * 5) + 1,
219
+ totalServices: 10
220
+ };
221
+ }, 1000);
222
+ });
223
+ // Error simulation
224
+ controls.querySelector('#simulateError')?.addEventListener('click', () => {
225
+ statusBar.loading = true;
226
+ setTimeout(() => {
227
+ statusBar.loading = false;
228
+ statusBar.overallStatus = {
229
+ status: 'major_outage',
230
+ message: 'Unable to fetch status - Connection Error',
231
+ lastUpdated: Date.now(),
232
+ affectedServices: -1, // Unknown
233
+ totalServices: -1
234
+ };
235
+ }, 1500);
236
+ });
237
+ }}
238
+ >
239
+ <upl-statuspage-statusbar></upl-statuspage-statusbar>
240
+ </dees-demowrapper>
241
+ </div>
242
+
243
+ <!-- Edge Cases -->
244
+ <div class="demo-section">
245
+ <div class="demo-title">Edge Cases and Special States</div>
246
+ <dees-demowrapper
247
+ .runAfterRender=${async (wrapperElement) => {
248
+ const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar');
249
+ const edgeCases = [
250
+ {
251
+ label: 'No Services',
252
+ status: {
253
+ status: 'operational',
254
+ message: 'No services to monitor',
255
+ lastUpdated: Date.now(),
256
+ affectedServices: 0,
257
+ totalServices: 0
258
+ }
259
+ },
260
+ {
261
+ label: 'All Services Down',
262
+ status: {
263
+ status: 'major_outage',
264
+ message: 'Complete System Failure',
265
+ lastUpdated: Date.now(),
266
+ affectedServices: 25,
267
+ totalServices: 25
268
+ }
269
+ },
270
+ {
271
+ label: 'Very Long Message',
272
+ status: {
273
+ status: 'degraded',
274
+ message: 'Multiple services experiencing degraded performance due to increased load from seasonal traffic surge',
275
+ lastUpdated: Date.now(),
276
+ affectedServices: 7,
277
+ totalServices: 20
278
+ }
279
+ },
280
+ {
281
+ label: 'Old Timestamp',
282
+ status: {
283
+ status: 'operational',
284
+ message: 'Status data may be stale',
285
+ lastUpdated: Date.now() - 24 * 60 * 60 * 1000, // 24 hours ago
286
+ affectedServices: 0,
287
+ totalServices: 10
288
+ }
289
+ },
290
+ {
291
+ label: 'Future Maintenance',
292
+ status: {
293
+ status: 'maintenance',
294
+ message: 'Scheduled maintenance starting in 2 hours',
295
+ lastUpdated: Date.now(),
296
+ affectedServices: 0,
297
+ totalServices: 15
298
+ }
299
+ }
300
+ ];
301
+ let currentCase = 0;
302
+ statusBar.overallStatus = edgeCases[0].status;
303
+ // Create info display
304
+ const info = document.createElement('div');
305
+ info.className = 'status-info';
306
+ info.innerHTML = `<strong>Current Case:</strong> ${edgeCases[0].label}`;
307
+ wrapperElement.appendChild(info);
308
+ // Create controls
309
+ const controls = document.createElement('div');
310
+ controls.className = 'demo-controls';
311
+ controls.innerHTML = `
312
+ <button class="demo-button" id="prevCase">← Previous Case</button>
313
+ <button class="demo-button" id="nextCase">Next Case →</button>
314
+ `;
315
+ wrapperElement.appendChild(controls);
316
+ const updateCase = (index) => {
317
+ currentCase = index;
318
+ statusBar.overallStatus = edgeCases[currentCase].status;
319
+ info.innerHTML = `<strong>Current Case:</strong> ${edgeCases[currentCase].label}`;
320
+ };
321
+ controls.querySelector('#prevCase')?.addEventListener('click', () => {
322
+ const newIndex = (currentCase - 1 + edgeCases.length) % edgeCases.length;
323
+ updateCase(newIndex);
324
+ });
325
+ controls.querySelector('#nextCase')?.addEventListener('click', () => {
326
+ const newIndex = (currentCase + 1) % edgeCases.length;
327
+ updateCase(newIndex);
328
+ });
329
+ }}
330
+ >
331
+ <upl-statuspage-statusbar></upl-statuspage-statusbar>
332
+ </dees-demowrapper>
333
+ </div>
334
+
335
+ <!-- Non-Expandable Status Bar -->
336
+ <div class="demo-section">
337
+ <div class="demo-title">Non-Expandable Status Bar</div>
338
+ <dees-demowrapper
339
+ .runAfterRender=${async (wrapperElement) => {
340
+ const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar');
341
+ // Disable expandable behavior
342
+ statusBar.expandable = false;
343
+ statusBar.overallStatus = {
344
+ status: 'operational',
345
+ message: 'This status bar cannot be clicked',
346
+ lastUpdated: Date.now(),
347
+ affectedServices: 0,
348
+ totalServices: 8
349
+ };
350
+ // This event won't fire since expandable is false
351
+ statusBar.addEventListener('statusClick', (event) => {
352
+ console.log('This should not fire');
353
+ });
354
+ const info = document.createElement('div');
355
+ info.className = 'status-info';
356
+ info.innerHTML = 'Try clicking the status bar - it should not respond to clicks when expandable=false';
357
+ wrapperElement.appendChild(info);
358
+ }}
359
+ >
360
+ <upl-statuspage-statusbar></upl-statuspage-statusbar>
361
+ </dees-demowrapper>
362
+ </div>
363
+ </div>
364
+ `;
365
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsLXN0YXR1c3BhZ2Utc3RhdHVzYmFyLmRlbW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvdXBsLXN0YXR1c3BhZ2Utc3RhdHVzYmFyLmRlbW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR25ELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkFtRFIsS0FBSyxFQUFFLGNBQW1CLEVBQUUsRUFBRTtJQUM5QyxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFRLENBQUM7SUFFbEYsTUFBTSxZQUFZLEdBQXFCO1FBQ3JDO1lBQ0UsTUFBTSxFQUFFLGFBQWE7WUFDckIsT0FBTyxFQUFFLHlCQUF5QjtZQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUN2QixnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLGFBQWEsRUFBRSxFQUFFO1NBQ2xCO1FBQ0Q7WUFDRSxNQUFNLEVBQUUsVUFBVTtZQUNsQixPQUFPLEVBQUUsMkJBQTJCO1lBQ3BDLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3ZCLGdCQUFnQixFQUFFLENBQUM7WUFDbkIsYUFBYSxFQUFFLEVBQUU7U0FDbEI7UUFDRDtZQUNFLE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsT0FBTyxFQUFFLHVCQUF1QjtZQUNoQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUN2QixnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLGFBQWEsRUFBRSxFQUFFO1NBQ2xCO1FBQ0Q7WUFDRSxNQUFNLEVBQUUsY0FBYztZQUN0QixPQUFPLEVBQUUsMEJBQTBCO1lBQ25DLFdBQVcsRUFBRSxJQUFJLENB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