@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,575 @@
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-info {
39
+ margin-top: 12px;
40
+ padding: 12px;
41
+ background: white;
42
+ border-radius: 4px;
43
+ font-size: 13px;
44
+ }
45
+ .event-log {
46
+ margin-top: 12px;
47
+ padding: 12px;
48
+ background: #f9f9f9;
49
+ border-radius: 4px;
50
+ font-size: 12px;
51
+ max-height: 150px;
52
+ overflow-y: auto;
53
+ font-family: monospace;
54
+ }
55
+ </style>
56
+
57
+ <div class="demo-container">
58
+ <!-- Full Featured Demo -->
59
+ <div class="demo-section">
60
+ <div class="demo-title">Full Featured Service Selector</div>
61
+ <dees-demowrapper
62
+ .runAfterRender=${async (wrapperElement) => {
63
+ const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector');
64
+ // Comprehensive demo data
65
+ const demoServices = [
66
+ // Infrastructure
67
+ {
68
+ id: 'api-gateway',
69
+ name: 'api-gateway',
70
+ displayName: 'API Gateway',
71
+ description: 'Main API endpoint for all services',
72
+ currentStatus: 'operational',
73
+ lastChecked: Date.now(),
74
+ uptime30d: 99.95,
75
+ uptime90d: 99.92,
76
+ responseTime: 45,
77
+ category: 'Infrastructure',
78
+ selected: true
79
+ },
80
+ {
81
+ id: 'web-server',
82
+ name: 'web-server',
83
+ displayName: 'Web Server',
84
+ description: 'Frontend web application server',
85
+ currentStatus: 'operational',
86
+ lastChecked: Date.now(),
87
+ uptime30d: 99.99,
88
+ uptime90d: 99.97,
89
+ responseTime: 28,
90
+ category: 'Infrastructure',
91
+ selected: true
92
+ },
93
+ {
94
+ id: 'load-balancer',
95
+ name: 'load-balancer',
96
+ displayName: 'Load Balancer',
97
+ description: 'Traffic distribution system',
98
+ currentStatus: 'operational',
99
+ lastChecked: Date.now(),
100
+ uptime30d: 100,
101
+ uptime90d: 99.99,
102
+ responseTime: 5,
103
+ category: 'Infrastructure',
104
+ selected: false
105
+ },
106
+ {
107
+ id: 'cdn',
108
+ name: 'cdn',
109
+ displayName: 'CDN',
110
+ description: 'Content delivery network',
111
+ currentStatus: 'operational',
112
+ lastChecked: Date.now(),
113
+ uptime30d: 100,
114
+ uptime90d: 99.99,
115
+ responseTime: 12,
116
+ category: 'Infrastructure',
117
+ selected: false
118
+ },
119
+ // Data Services
120
+ {
121
+ id: 'database',
122
+ name: 'database',
123
+ displayName: 'Database Cluster',
124
+ description: 'Primary database cluster with replicas',
125
+ currentStatus: 'degraded',
126
+ lastChecked: Date.now(),
127
+ uptime30d: 98.5,
128
+ uptime90d: 99.1,
129
+ responseTime: 120,
130
+ category: 'Data',
131
+ selected: true
132
+ },
133
+ {
134
+ id: 'redis-cache',
135
+ name: 'redis-cache',
136
+ displayName: 'Redis Cache',
137
+ description: 'In-memory data caching',
138
+ currentStatus: 'operational',
139
+ lastChecked: Date.now(),
140
+ uptime30d: 99.98,
141
+ uptime90d: 99.96,
142
+ responseTime: 5,
143
+ category: 'Data',
144
+ selected: true
145
+ },
146
+ {
147
+ id: 'elasticsearch',
148
+ name: 'elasticsearch',
149
+ displayName: 'Search Engine',
150
+ description: 'Full-text search service',
151
+ currentStatus: 'partial_outage',
152
+ lastChecked: Date.now(),
153
+ uptime30d: 95.2,
154
+ uptime90d: 97.8,
155
+ responseTime: 180,
156
+ category: 'Data',
157
+ selected: false
158
+ },
159
+ {
160
+ id: 'backup-service',
161
+ name: 'backup-service',
162
+ displayName: 'Backup Service',
163
+ description: 'Automated backup and recovery',
164
+ currentStatus: 'operational',
165
+ lastChecked: Date.now(),
166
+ uptime30d: 100,
167
+ uptime90d: 99.99,
168
+ responseTime: 95,
169
+ category: 'Data',
170
+ selected: true
171
+ },
172
+ // Application Services
173
+ {
174
+ id: 'auth-service',
175
+ name: 'auth-service',
176
+ displayName: 'Authentication Service',
177
+ description: 'User authentication and authorization',
178
+ currentStatus: 'operational',
179
+ lastChecked: Date.now(),
180
+ uptime30d: 99.98,
181
+ uptime90d: 99.95,
182
+ responseTime: 65,
183
+ category: 'Services',
184
+ selected: true
185
+ },
186
+ {
187
+ id: 'payment-gateway',
188
+ name: 'payment-gateway',
189
+ displayName: 'Payment Gateway',
190
+ description: 'Payment processing service',
191
+ currentStatus: 'maintenance',
192
+ lastChecked: Date.now(),
193
+ uptime30d: 97.5,
194
+ uptime90d: 98.8,
195
+ responseTime: 250,
196
+ category: 'Services',
197
+ selected: false
198
+ },
199
+ {
200
+ id: 'email-service',
201
+ name: 'email-service',
202
+ displayName: 'Email Service',
203
+ description: 'Transactional email delivery',
204
+ currentStatus: 'operational',
205
+ lastChecked: Date.now(),
206
+ uptime30d: 99.9,
207
+ uptime90d: 99.85,
208
+ responseTime: 150,
209
+ category: 'Services',
210
+ selected: true
211
+ },
212
+ {
213
+ id: 'notification-service',
214
+ name: 'notification-service',
215
+ displayName: 'Notification Service',
216
+ description: 'Push notifications and alerts',
217
+ currentStatus: 'operational',
218
+ lastChecked: Date.now(),
219
+ uptime30d: 99.7,
220
+ uptime90d: 99.8,
221
+ responseTime: 88,
222
+ category: 'Services',
223
+ selected: false
224
+ },
225
+ {
226
+ id: 'analytics',
227
+ name: 'analytics',
228
+ displayName: 'Analytics Engine',
229
+ description: 'Real-time analytics processing',
230
+ currentStatus: 'major_outage',
231
+ lastChecked: Date.now(),
232
+ uptime30d: 89.5,
233
+ uptime90d: 94.2,
234
+ responseTime: 450,
235
+ category: 'Services',
236
+ selected: false
237
+ },
238
+ // Monitoring
239
+ {
240
+ id: 'monitoring',
241
+ name: 'monitoring',
242
+ displayName: 'Monitoring System',
243
+ description: 'System health and metrics monitoring',
244
+ currentStatus: 'operational',
245
+ lastChecked: Date.now(),
246
+ uptime30d: 99.95,
247
+ uptime90d: 99.93,
248
+ responseTime: 78,
249
+ category: 'Monitoring',
250
+ selected: true
251
+ },
252
+ {
253
+ id: 'logging',
254
+ name: 'logging',
255
+ displayName: 'Logging Service',
256
+ description: 'Centralized log management',
257
+ currentStatus: 'operational',
258
+ lastChecked: Date.now(),
259
+ uptime30d: 99.9,
260
+ uptime90d: 99.88,
261
+ responseTime: 92,
262
+ category: 'Monitoring',
263
+ selected: false
264
+ }
265
+ ];
266
+ // Set initial data
267
+ assetsSelector.services = demoServices;
268
+ // Demo loading state
269
+ assetsSelector.loading = true;
270
+ setTimeout(() => {
271
+ assetsSelector.loading = false;
272
+ }, 1000);
273
+ // Create event log
274
+ const eventLog = document.createElement('div');
275
+ eventLog.className = 'event-log';
276
+ eventLog.innerHTML = '<strong>Event Log:</strong><br>';
277
+ wrapperElement.appendChild(eventLog);
278
+ const logEvent = (message) => {
279
+ const time = new Date().toLocaleTimeString();
280
+ eventLog.innerHTML += `[${time}] ${message}<br>`;
281
+ eventLog.scrollTop = eventLog.scrollHeight;
282
+ };
283
+ // Listen for selection changes
284
+ assetsSelector.addEventListener('selectionChanged', (event) => {
285
+ const selected = event.detail.selectedServices.length;
286
+ const total = demoServices.length;
287
+ logEvent(`Selection changed: ${selected}/${total} services selected`);
288
+ });
289
+ // Simulate status updates
290
+ setInterval(() => {
291
+ const randomService = demoServices[Math.floor(Math.random() * demoServices.length)];
292
+ const statuses = ['operational', 'degraded', 'partial_outage', 'major_outage', 'maintenance'];
293
+ const newStatus = statuses[Math.floor(Math.random() * statuses.length)];
294
+ if (randomService.currentStatus !== newStatus) {
295
+ const oldStatus = randomService.currentStatus;
296
+ randomService.currentStatus = newStatus;
297
+ randomService.lastChecked = Date.now();
298
+ assetsSelector.requestUpdate();
299
+ logEvent(`${randomService.displayName}: ${oldStatus} → ${newStatus}`);
300
+ }
301
+ }, 5000);
302
+ }}
303
+ >
304
+ <upl-statuspage-assetsselector></upl-statuspage-assetsselector>
305
+ </dees-demowrapper>
306
+ </div>
307
+
308
+ <!-- Empty State -->
309
+ <div class="demo-section">
310
+ <div class="demo-title">Empty State</div>
311
+ <dees-demowrapper
312
+ .runAfterRender=${async (wrapperElement) => {
313
+ const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector');
314
+ // No services
315
+ assetsSelector.services = [];
316
+ const controls = document.createElement('div');
317
+ controls.className = 'demo-controls';
318
+ controls.innerHTML = `
319
+ <button class="demo-button" id="addServices">Add Services</button>
320
+ `;
321
+ wrapperElement.appendChild(controls);
322
+ controls.querySelector('#addServices')?.addEventListener('click', () => {
323
+ assetsSelector.services = [
324
+ {
325
+ id: 'new-service-1',
326
+ name: 'new-service-1',
327
+ displayName: 'New Service 1',
328
+ description: 'Just added',
329
+ currentStatus: 'operational',
330
+ lastChecked: Date.now(),
331
+ uptime30d: 100,
332
+ uptime90d: 100,
333
+ responseTime: 50,
334
+ selected: true
335
+ },
336
+ {
337
+ id: 'new-service-2',
338
+ name: 'new-service-2',
339
+ displayName: 'New Service 2',
340
+ description: 'Just added',
341
+ currentStatus: 'operational',
342
+ lastChecked: Date.now(),
343
+ uptime30d: 100,
344
+ uptime90d: 100,
345
+ responseTime: 60,
346
+ selected: false
347
+ }
348
+ ];
349
+ });
350
+ }}
351
+ >
352
+ <upl-statuspage-assetsselector></upl-statuspage-assetsselector>
353
+ </dees-demowrapper>
354
+ </div>
355
+
356
+ <!-- Filtering Scenarios -->
357
+ <div class="demo-section">
358
+ <div class="demo-title">Advanced Filtering Demo</div>
359
+ <dees-demowrapper
360
+ .runAfterRender=${async (wrapperElement) => {
361
+ const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector');
362
+ // Generate many services for filtering
363
+ const generateServices = () => {
364
+ const services = [];
365
+ const regions = ['us-east', 'us-west', 'eu-central', 'ap-south'];
366
+ const types = ['api', 'web', 'db', 'cache', 'queue'];
367
+ const statuses = ['operational', 'degraded', 'partial_outage'];
368
+ regions.forEach(region => {
369
+ types.forEach(type => {
370
+ const id = `${region}-${type}`;
371
+ services.push({
372
+ id,
373
+ name: id,
374
+ displayName: `${region.toUpperCase()} ${type.toUpperCase()}`,
375
+ description: `${type} service in ${region} region`,
376
+ currentStatus: statuses[Math.floor(Math.random() * statuses.length)],
377
+ lastChecked: Date.now(),
378
+ uptime30d: 95 + Math.random() * 5,
379
+ uptime90d: 94 + Math.random() * 6,
380
+ responseTime: 20 + Math.random() * 200,
381
+ category: region,
382
+ selected: Math.random() > 0.5
383
+ });
384
+ });
385
+ });
386
+ return services;
387
+ };
388
+ assetsSelector.services = generateServices();
389
+ // Demo different filter scenarios
390
+ const scenarios = [
391
+ {
392
+ name: 'Show All',
393
+ action: () => {
394
+ assetsSelector.filterText = '';
395
+ assetsSelector.filterCategory = 'all';
396
+ assetsSelector.showOnlySelected = false;
397
+ }
398
+ },
399
+ {
400
+ name: 'Filter by Text: "api"',
401
+ action: () => {
402
+ assetsSelector.filterText = 'api';
403
+ assetsSelector.filterCategory = 'all';
404
+ assetsSelector.showOnlySelected = false;
405
+ }
406
+ },
407
+ {
408
+ name: 'Filter by Region: EU',
409
+ action: () => {
410
+ assetsSelector.filterText = '';
411
+ assetsSelector.filterCategory = 'eu-central';
412
+ assetsSelector.showOnlySelected = false;
413
+ }
414
+ },
415
+ {
416
+ name: 'Show Only Selected',
417
+ action: () => {
418
+ assetsSelector.filterText = '';
419
+ assetsSelector.filterCategory = 'all';
420
+ assetsSelector.showOnlySelected = true;
421
+ }
422
+ },
423
+ {
424
+ name: 'Complex: "db" in US regions',
425
+ action: () => {
426
+ assetsSelector.filterText = 'db';
427
+ assetsSelector.filterCategory = 'us-east';
428
+ assetsSelector.showOnlySelected = false;
429
+ }
430
+ }
431
+ ];
432
+ const controls = document.createElement('div');
433
+ controls.className = 'demo-controls';
434
+ scenarios.forEach(scenario => {
435
+ const button = document.createElement('button');
436
+ button.className = 'demo-button';
437
+ button.textContent = scenario.name;
438
+ button.onclick = scenario.action;
439
+ controls.appendChild(button);
440
+ });
441
+ wrapperElement.appendChild(controls);
442
+ const info = document.createElement('div');
443
+ info.className = 'demo-info';
444
+ wrapperElement.appendChild(info);
445
+ // Update info on changes
446
+ const updateInfo = () => {
447
+ const filtered = assetsSelector.getFilteredServices();
448
+ const selected = assetsSelector.services.filter((s) => s.selected).length;
449
+ info.innerHTML = `
450
+ <strong>Filter Status:</strong><br>
451
+ Total Services: ${assetsSelector.services.length}<br>
452
+ Visible Services: ${filtered.length}<br>
453
+ Selected Services: ${selected}<br>
454
+ Active Filters: ${assetsSelector.filterText ? 'Text="' + assetsSelector.filterText + '" ' : ''}${assetsSelector.filterCategory !== 'all' ? 'Category=' + assetsSelector.filterCategory + ' ' : ''}${assetsSelector.showOnlySelected ? 'Selected Only' : ''}
455
+ `;
456
+ };
457
+ // Watch for changes
458
+ assetsSelector.addEventListener('selectionChanged', updateInfo);
459
+ setInterval(updateInfo, 500);
460
+ updateInfo();
461
+ }}
462
+ >
463
+ <upl-statuspage-assetsselector></upl-statuspage-assetsselector>
464
+ </dees-demowrapper>
465
+ </div>
466
+
467
+ <!-- Performance Test -->
468
+ <div class="demo-section">
469
+ <div class="demo-title">Performance Test - Many Services</div>
470
+ <dees-demowrapper
471
+ .runAfterRender=${async (wrapperElement) => {
472
+ const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector');
473
+ const controls = document.createElement('div');
474
+ controls.className = 'demo-controls';
475
+ controls.innerHTML = `
476
+ <button class="demo-button" id="load50">Load 50 Services</button>
477
+ <button class="demo-button" id="load100">Load 100 Services</button>
478
+ <button class="demo-button" id="load200">Load 200 Services</button>
479
+ <button class="demo-button" id="clear">Clear All</button>
480
+ `;
481
+ wrapperElement.appendChild(controls);
482
+ const loadServices = (count) => {
483
+ const services = [];
484
+ const statuses = ['operational', 'degraded', 'partial_outage', 'major_outage', 'maintenance'];
485
+ for (let i = 0; i < count; i++) {
486
+ services.push({
487
+ id: `service-${i}`,
488
+ name: `service-${i}`,
489
+ displayName: `Service ${i}`,
490
+ description: `Auto-generated service number ${i}`,
491
+ currentStatus: statuses[Math.floor(Math.random() * statuses.length)],
492
+ lastChecked: Date.now() - Math.random() * 3600000,
493
+ uptime30d: 85 + Math.random() * 15,
494
+ uptime90d: 80 + Math.random() * 20,
495
+ responseTime: 10 + Math.random() * 500,
496
+ category: `Category ${Math.floor(i / 10)}`,
497
+ selected: Math.random() > 0.7
498
+ });
499
+ }
500
+ assetsSelector.loading = true;
501
+ setTimeout(() => {
502
+ assetsSelector.services = services;
503
+ assetsSelector.loading = false;
504
+ }, 500);
505
+ };
506
+ controls.querySelector('#load50')?.addEventListener('click', () => loadServices(50));
507
+ controls.querySelector('#load100')?.addEventListener('click', () => loadServices(100));
508
+ controls.querySelector('#load200')?.addEventListener('click', () => loadServices(200));
509
+ controls.querySelector('#clear')?.addEventListener('click', () => {
510
+ assetsSelector.services = [];
511
+ });
512
+ // Start with 50 services
513
+ loadServices(50);
514
+ }}
515
+ >
516
+ <upl-statuspage-assetsselector></upl-statuspage-assetsselector>
517
+ </dees-demowrapper>
518
+ </div>
519
+
520
+ <!-- Loading States -->
521
+ <div class="demo-section">
522
+ <div class="demo-title">Loading and Error States</div>
523
+ <dees-demowrapper
524
+ .runAfterRender=${async (wrapperElement) => {
525
+ const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector');
526
+ // Start with loading
527
+ assetsSelector.loading = true;
528
+ const controls = document.createElement('div');
529
+ controls.className = 'demo-controls';
530
+ controls.innerHTML = `
531
+ <button class="demo-button" id="toggleLoading">Toggle Loading</button>
532
+ <button class="demo-button" id="simulateError">Simulate Error</button>
533
+ <button class="demo-button" id="loadSuccess">Load Successfully</button>
534
+ `;
535
+ wrapperElement.appendChild(controls);
536
+ controls.querySelector('#toggleLoading')?.addEventListener('click', () => {
537
+ assetsSelector.loading = !assetsSelector.loading;
538
+ });
539
+ controls.querySelector('#simulateError')?.addEventListener('click', () => {
540
+ assetsSelector.loading = true;
541
+ setTimeout(() => {
542
+ assetsSelector.loading = false;
543
+ assetsSelector.services = [];
544
+ // You could add an error message property to the component
545
+ assetsSelector.errorMessage = 'Failed to load services';
546
+ }, 1500);
547
+ });
548
+ controls.querySelector('#loadSuccess')?.addEventListener('click', () => {
549
+ assetsSelector.loading = true;
550
+ setTimeout(() => {
551
+ assetsSelector.loading = false;
552
+ assetsSelector.services = [
553
+ {
554
+ id: 'loaded-1',
555
+ name: 'loaded-1',
556
+ displayName: 'Successfully Loaded Service',
557
+ description: 'This service was loaded after simulated delay',
558
+ currentStatus: 'operational',
559
+ lastChecked: Date.now(),
560
+ uptime30d: 99.9,
561
+ uptime90d: 99.8,
562
+ responseTime: 45,
563
+ selected: true
564
+ }
565
+ ];
566
+ }, 1000);
567
+ });
568
+ }}
569
+ >
570
+ <upl-statuspage-assetsselector></upl-statuspage-assetsselector>
571
+ </dees-demowrapper>
572
+ </div>
573
+ </div>
574
+ `;
575
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsLXN0YXR1c3BhZ2UtYXNzZXRzc2VsZWN0b3IuZGVtby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy91cGwtc3RhdHVzcGFnZS1hc3NldHNzZWxlY3Rvci5kZW1vLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUduRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBNERSLEtBQUssRUFBRSxjQUFtQixFQUFFLEVBQUU7SUFDOUMsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsQ0FBUSxDQUFDO0lBRTVGLDBCQUEwQjtJQUMxQixNQUFNLFlBQVksR0FBcUI7UUFDckMsaUJBQWlCO1FBQ2pCO1lBQ0UsRUFBRSxFQUFFLGFBQWE7WUFDakIsSUFBSSxFQUFFLGFBQWE7WUFDbkIsV0FBVyxFQUFFLGFBQWE7WUFDMUIsV0FBVyxFQUFFLG9DQUFvQztZQUNqRCxhQUFhLEVBQUUsYUFBYTtZQUM1QixXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUN2QixTQUFTLEVBQUUsS0FBSztZQUNoQixTQUFTLEVBQUUsS0FBSztZQUNoQixZQUFZLEVBQUUsRUFBRTtZQUNoQixRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLFFBQVEsRUFBRSxJQUFJO1NBQ2Y7UUFDRDtZQUNFLEVBQUUsRUFBRSxZQUFZO1lBQ2hCLElBQUksRUFBRSxZQUFZO1lBQ2xCLFdBQVcsRUFBRSxZQUFZO1lBQ3pCLFdBQVcsRUFBRSxpQ0FBaUM7WUFDOUMsYUFBYSxFQUFFLGFBQWE7WUFDNUIsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdkIsU0FBUyxFQUFFLEtBQUs7WUFD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