@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,679 @@
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
+ .event-log {
52
+ margin-top: 12px;
53
+ padding: 12px;
54
+ background: #f9f9f9;
55
+ border-radius: 4px;
56
+ font-size: 12px;
57
+ max-height: 150px;
58
+ overflow-y: auto;
59
+ font-family: monospace;
60
+ }
61
+ .config-display {
62
+ display: grid;
63
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
64
+ gap: 12px;
65
+ margin-top: 12px;
66
+ }
67
+ .config-item {
68
+ background: white;
69
+ padding: 12px;
70
+ border-radius: 4px;
71
+ font-size: 12px;
72
+ }
73
+ .config-label {
74
+ font-weight: 600;
75
+ color: #666;
76
+ margin-bottom: 4px;
77
+ }
78
+ .config-value {
79
+ word-break: break-word;
80
+ }
81
+ </style>
82
+
83
+ <div class="demo-container">
84
+ <!-- Different Configuration Scenarios -->
85
+ <div class="demo-section">
86
+ <div class="demo-title">Different Footer Configurations</div>
87
+ <dees-demowrapper
88
+ .runAfterRender=${async (wrapperElement) => {
89
+ const footer = wrapperElement.querySelector('upl-statuspage-footer');
90
+ // Configuration presets
91
+ const configPresets = {
92
+ minimal: {
93
+ name: 'Minimal',
94
+ config: {
95
+ companyName: 'SimpleStatus',
96
+ whitelabel: true,
97
+ lastUpdated: Date.now()
98
+ }
99
+ },
100
+ standard: {
101
+ name: 'Standard',
102
+ config: {
103
+ companyName: 'TechCorp Solutions',
104
+ legalUrl: 'https://example.com/legal',
105
+ supportEmail: 'support@techcorp.com',
106
+ statusPageUrl: 'https://status.techcorp.com',
107
+ whitelabel: false,
108
+ lastUpdated: Date.now(),
109
+ currentYear: new Date().getFullYear()
110
+ }
111
+ },
112
+ fullFeatured: {
113
+ name: 'Full Featured',
114
+ config: {
115
+ companyName: 'Enterprise Cloud Platform',
116
+ legalUrl: 'https://enterprise.com/legal',
117
+ supportEmail: 'support@enterprise.com',
118
+ statusPageUrl: 'https://status.enterprise.com',
119
+ whitelabel: false,
120
+ socialLinks: [
121
+ { platform: 'twitter', url: 'https://twitter.com/enterprise' },
122
+ { platform: 'github', url: 'https://github.com/enterprise' },
123
+ { platform: 'linkedin', url: 'https://linkedin.com/company/enterprise' },
124
+ { platform: 'facebook', url: 'https://facebook.com/enterprise' },
125
+ { platform: 'youtube', url: 'https://youtube.com/enterprise' }
126
+ ],
127
+ rssFeedUrl: 'https://status.enterprise.com/rss',
128
+ apiStatusUrl: 'https://api.enterprise.com/v1/status',
129
+ lastUpdated: Date.now(),
130
+ currentYear: new Date().getFullYear(),
131
+ language: 'en',
132
+ additionalLinks: [
133
+ { label: 'API Docs', url: 'https://docs.enterprise.com' },
134
+ { label: 'Service SLA', url: 'https://enterprise.com/sla' },
135
+ { label: 'Security', url: 'https://enterprise.com/security' }
136
+ ]
137
+ }
138
+ },
139
+ international: {
140
+ name: 'International',
141
+ config: {
142
+ companyName: 'Global Services GmbH',
143
+ legalUrl: 'https://global.eu/legal',
144
+ supportEmail: 'support@global.eu',
145
+ statusPageUrl: 'https://status.global.eu',
146
+ whitelabel: false,
147
+ language: 'de',
148
+ currentYear: new Date().getFullYear(),
149
+ lastUpdated: Date.now(),
150
+ languageOptions: [
151
+ { code: 'en', label: 'English' },
152
+ { code: 'de', label: 'Deutsch' },
153
+ { code: 'fr', label: 'Français' },
154
+ { code: 'es', label: 'Español' },
155
+ { code: 'ja', label: '日本語' }
156
+ ],
157
+ socialLinks: [
158
+ { platform: 'twitter', url: 'https://twitter.com/global_eu' },
159
+ { platform: 'linkedin', url: 'https://linkedin.com/company/global-eu' }
160
+ ]
161
+ }
162
+ },
163
+ whitelabel: {
164
+ name: 'Whitelabel',
165
+ config: {
166
+ companyName: 'Custom Brand Status',
167
+ whitelabel: true,
168
+ customBranding: {
169
+ primaryColor: '#FF5722',
170
+ logoUrl: 'https://example.com/custom-logo.png',
171
+ footerText: 'Powered by Custom Infrastructure'
172
+ },
173
+ lastUpdated: Date.now(),
174
+ currentYear: new Date().getFullYear()
175
+ }
176
+ }
177
+ };
178
+ // Initial setup
179
+ let currentPreset = 'standard';
180
+ const applyPreset = (preset) => {
181
+ Object.keys(preset.config).forEach(key => {
182
+ footer[key] = preset.config[key];
183
+ });
184
+ updateConfigDisplay(preset.config);
185
+ };
186
+ applyPreset(configPresets[currentPreset]);
187
+ // Create controls
188
+ const controls = document.createElement('div');
189
+ controls.className = 'demo-controls';
190
+ Object.entries(configPresets).forEach(([key, preset]) => {
191
+ const button = document.createElement('button');
192
+ button.className = 'demo-button' + (key === currentPreset ? ' active' : '');
193
+ button.textContent = preset.name;
194
+ button.onclick = () => {
195
+ controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active'));
196
+ button.classList.add('active');
197
+ currentPreset = key;
198
+ footer.loading = true;
199
+ setTimeout(() => {
200
+ applyPreset(preset);
201
+ footer.loading = false;
202
+ }, 500);
203
+ };
204
+ controls.appendChild(button);
205
+ });
206
+ wrapperElement.appendChild(controls);
207
+ // Add configuration display
208
+ const configDisplay = document.createElement('div');
209
+ configDisplay.className = 'config-display';
210
+ wrapperElement.appendChild(configDisplay);
211
+ const updateConfigDisplay = (config) => {
212
+ configDisplay.innerHTML = Object.entries(config)
213
+ .filter(([key]) => key !== 'socialLinks' && key !== 'additionalLinks' && key !== 'languageOptions')
214
+ .map(([key, value]) => `
215
+ <div class="config-item">
216
+ <div class="config-label">${key}</div>
217
+ <div class="config-value">${value}</div>
218
+ </div>
219
+ `).join('');
220
+ };
221
+ // Handle events
222
+ footer.addEventListener('footerLinkClick', (event) => {
223
+ console.log('Footer link clicked:', event.detail);
224
+ alert(`Link clicked: ${event.detail.type} - ${event.detail.url}`);
225
+ });
226
+ footer.addEventListener('subscribeClick', () => {
227
+ alert('Subscribe feature would open here');
228
+ });
229
+ footer.addEventListener('reportIncidentClick', () => {
230
+ alert('Report incident form would open here');
231
+ });
232
+ footer.addEventListener('languageChange', (event) => {
233
+ alert(`Language changed to: ${event.detail.language}`);
234
+ });
235
+ }}
236
+ >
237
+ <upl-statuspage-footer></upl-statuspage-footer>
238
+ </dees-demowrapper>
239
+ </div>
240
+
241
+ <!-- Loading and Error States -->
242
+ <div class="demo-section">
243
+ <div class="demo-title">Loading and Error States</div>
244
+ <dees-demowrapper
245
+ .runAfterRender=${async (wrapperElement) => {
246
+ const footer = wrapperElement.querySelector('upl-statuspage-footer');
247
+ // Start with loading
248
+ footer.loading = true;
249
+ footer.companyName = 'LoadingCorp';
250
+ const controls = document.createElement('div');
251
+ controls.className = 'demo-controls';
252
+ controls.innerHTML = `
253
+ <button class="demo-button" id="toggleLoading">Toggle Loading</button>
254
+ <button class="demo-button" id="loadSuccess">Load Successfully</button>
255
+ <button class="demo-button" id="simulateError">Simulate Error</button>
256
+ <button class="demo-button" id="simulateOffline">Simulate Offline</button>
257
+ <button class="demo-button" id="brokenLinks">Broken Links</button>
258
+ `;
259
+ wrapperElement.appendChild(controls);
260
+ controls.querySelector('#toggleLoading')?.addEventListener('click', () => {
261
+ footer.loading = !footer.loading;
262
+ });
263
+ controls.querySelector('#loadSuccess')?.addEventListener('click', () => {
264
+ footer.loading = true;
265
+ setTimeout(() => {
266
+ footer.companyName = 'Successfully Loaded Inc';
267
+ footer.legalUrl = 'https://example.com/legal';
268
+ footer.supportEmail = 'support@loaded.com';
269
+ footer.statusPageUrl = 'https://status.loaded.com';
270
+ footer.lastUpdated = Date.now();
271
+ footer.socialLinks = [
272
+ { platform: 'twitter', url: 'https://twitter.com/loaded' },
273
+ { platform: 'github', url: 'https://github.com/loaded' }
274
+ ];
275
+ footer.loading = false;
276
+ footer.errorMessage = null;
277
+ }, 1000);
278
+ });
279
+ controls.querySelector('#simulateError')?.addEventListener('click', () => {
280
+ footer.loading = true;
281
+ setTimeout(() => {
282
+ footer.loading = false;
283
+ footer.errorMessage = 'Failed to load footer configuration';
284
+ footer.companyName = 'Error Loading';
285
+ footer.socialLinks = [];
286
+ }, 1500);
287
+ });
288
+ controls.querySelector('#simulateOffline')?.addEventListener('click', () => {
289
+ footer.offline = true;
290
+ footer.errorMessage = 'You are currently offline';
291
+ footer.lastUpdated = null;
292
+ });
293
+ controls.querySelector('#brokenLinks')?.addEventListener('click', () => {
294
+ footer.companyName = 'Broken Links Demo';
295
+ footer.legalUrl = 'https://broken.invalid/legal';
296
+ footer.supportEmail = 'invalid-email';
297
+ footer.socialLinks = [
298
+ { platform: 'twitter', url: '' },
299
+ { platform: 'github', url: 'not-a-url' }
300
+ ];
301
+ footer.rssFeedUrl = 'https://broken.invalid/rss';
302
+ footer.apiStatusUrl = null;
303
+ });
304
+ // Add info display
305
+ const info = document.createElement('div');
306
+ info.className = 'demo-info';
307
+ info.innerHTML = 'Test different loading states and error scenarios using the controls above.';
308
+ wrapperElement.appendChild(info);
309
+ }}
310
+ >
311
+ <upl-statuspage-footer></upl-statuspage-footer>
312
+ </dees-demowrapper>
313
+ </div>
314
+
315
+ <!-- Dynamic Updates and Real-time Features -->
316
+ <div class="demo-section">
317
+ <div class="demo-title">Dynamic Updates and Real-time Features</div>
318
+ <dees-demowrapper
319
+ .runAfterRender=${async (wrapperElement) => {
320
+ const footer = wrapperElement.querySelector('upl-statuspage-footer');
321
+ // Initial configuration
322
+ footer.companyName = 'RealTime Systems';
323
+ footer.legalUrl = 'https://realtime.com/legal';
324
+ footer.supportEmail = 'support@realtime.com';
325
+ footer.statusPageUrl = 'https://status.realtime.com';
326
+ footer.lastUpdated = Date.now();
327
+ footer.currentYear = new Date().getFullYear();
328
+ // Dynamic social links
329
+ const allSocialPlatforms = [
330
+ { platform: 'twitter', url: 'https://twitter.com/realtime' },
331
+ { platform: 'github', url: 'https://github.com/realtime' },
332
+ { platform: 'linkedin', url: 'https://linkedin.com/company/realtime' },
333
+ { platform: 'facebook', url: 'https://facebook.com/realtime' },
334
+ { platform: 'youtube', url: 'https://youtube.com/realtime' },
335
+ { platform: 'instagram', url: 'https://instagram.com/realtime' },
336
+ { platform: 'slack', url: 'https://realtime.slack.com' },
337
+ { platform: 'discord', url: 'https://discord.gg/realtime' }
338
+ ];
339
+ footer.socialLinks = allSocialPlatforms.slice(0, 3);
340
+ // Real-time status feed
341
+ footer.rssFeedUrl = 'https://status.realtime.com/rss';
342
+ footer.apiStatusUrl = 'https://api.realtime.com/v1/status';
343
+ // Status feed simulation
344
+ const statusUpdates = [
345
+ 'All systems operational',
346
+ 'Investigating API latency',
347
+ 'Maintenance scheduled for tonight',
348
+ 'Performance improvements deployed',
349
+ 'New datacenter online',
350
+ 'Security patch applied'
351
+ ];
352
+ let updateIndex = 0;
353
+ footer.latestStatusUpdate = statusUpdates[0];
354
+ // Auto-update last updated time
355
+ const updateInterval = setInterval(() => {
356
+ footer.lastUpdated = Date.now();
357
+ }, 5000);
358
+ // Rotate status updates
359
+ const statusInterval = setInterval(() => {
360
+ updateIndex = (updateIndex + 1) % statusUpdates.length;
361
+ footer.latestStatusUpdate = statusUpdates[updateIndex];
362
+ logEvent(`Status update: ${statusUpdates[updateIndex]}`);
363
+ }, 8000);
364
+ // Create controls
365
+ const controls = document.createElement('div');
366
+ controls.className = 'demo-controls';
367
+ controls.innerHTML = `
368
+ <button class="demo-button" id="addSocial">Add Social Link</button>
369
+ <button class="demo-button" id="removeSocial">Remove Social Link</button>
370
+ <button class="demo-button" id="updateStatus">Force Status Update</button>
371
+ <button class="demo-button" id="changeYear">Change Year</button>
372
+ `;
373
+ wrapperElement.appendChild(controls);
374
+ controls.querySelector('#addSocial')?.addEventListener('click', () => {
375
+ if (footer.socialLinks.length < allSocialPlatforms.length) {
376
+ footer.socialLinks = [...footer.socialLinks, allSocialPlatforms[footer.socialLinks.length]];
377
+ logEvent(`Added ${allSocialPlatforms[footer.socialLinks.length - 1].platform} link`);
378
+ }
379
+ });
380
+ controls.querySelector('#removeSocial')?.addEventListener('click', () => {
381
+ if (footer.socialLinks.length > 0) {
382
+ const removed = footer.socialLinks[footer.socialLinks.length - 1];
383
+ footer.socialLinks = footer.socialLinks.slice(0, -1);
384
+ logEvent(`Removed ${removed.platform} link`);
385
+ }
386
+ });
387
+ controls.querySelector('#updateStatus')?.addEventListener('click', () => {
388
+ const customStatus = prompt('Enter custom status update:');
389
+ if (customStatus) {
390
+ footer.latestStatusUpdate = customStatus;
391
+ footer.lastUpdated = Date.now();
392
+ logEvent(`Custom status: ${customStatus}`);
393
+ }
394
+ });
395
+ controls.querySelector('#changeYear')?.addEventListener('click', () => {
396
+ footer.currentYear = footer.currentYear + 1;
397
+ logEvent(`Year changed to ${footer.currentYear}`);
398
+ });
399
+ // Event log
400
+ const eventLog = document.createElement('div');
401
+ eventLog.className = 'event-log';
402
+ eventLog.innerHTML = '<strong>Event Log:</strong><br>';
403
+ wrapperElement.appendChild(eventLog);
404
+ const logEvent = (message) => {
405
+ const time = new Date().toLocaleTimeString();
406
+ eventLog.innerHTML += `[${time}] ${message}<br>`;
407
+ eventLog.scrollTop = eventLog.scrollHeight;
408
+ };
409
+ logEvent('Real-time updates started');
410
+ // Cleanup
411
+ wrapperElement.addEventListener('remove', () => {
412
+ clearInterval(updateInterval);
413
+ clearInterval(statusInterval);
414
+ });
415
+ }}
416
+ >
417
+ <upl-statuspage-footer></upl-statuspage-footer>
418
+ </dees-demowrapper>
419
+ </div>
420
+
421
+ <!-- Interactive Features -->
422
+ <div class="demo-section">
423
+ <div class="demo-title">Interactive Features and Actions</div>
424
+ <dees-demowrapper
425
+ .runAfterRender=${async (wrapperElement) => {
426
+ const footer = wrapperElement.querySelector('upl-statuspage-footer');
427
+ // Setup interactive footer
428
+ footer.companyName = 'Interactive Corp';
429
+ footer.legalUrl = 'https://interactive.com/legal';
430
+ footer.supportEmail = 'help@interactive.com';
431
+ footer.statusPageUrl = 'https://status.interactive.com';
432
+ footer.whitelabel = false;
433
+ footer.lastUpdated = Date.now();
434
+ footer.currentYear = new Date().getFullYear();
435
+ // Interactive features
436
+ footer.enableSubscribe = true;
437
+ footer.enableReportIssue = true;
438
+ footer.enableLanguageSelector = true;
439
+ footer.enableThemeToggle = true;
440
+ footer.languageOptions = [
441
+ { code: 'en', label: 'English' },
442
+ { code: 'es', label: 'Español' },
443
+ { code: 'fr', label: 'Français' },
444
+ { code: 'de', label: 'Deutsch' },
445
+ { code: 'ja', label: '日本語' },
446
+ { code: 'zh', label: '中文' }
447
+ ];
448
+ footer.socialLinks = [
449
+ { platform: 'twitter', url: 'https://twitter.com/interactive' },
450
+ { platform: 'github', url: 'https://github.com/interactive' },
451
+ { platform: 'discord', url: 'https://discord.gg/interactive' }
452
+ ];
453
+ footer.additionalLinks = [
454
+ { label: 'API Documentation', url: 'https://docs.interactive.com' },
455
+ { label: 'Service Level Agreement', url: 'https://interactive.com/sla' },
456
+ { label: 'Privacy Policy', url: 'https://interactive.com/privacy' },
457
+ { label: 'Terms of Service', url: 'https://interactive.com/terms' }
458
+ ];
459
+ // Subscribe functionality
460
+ let subscriberCount = 1234;
461
+ footer.subscriberCount = subscriberCount;
462
+ footer.addEventListener('subscribeClick', (event) => {
463
+ const email = prompt('Enter your email to subscribe:');
464
+ if (email && email.includes('@')) {
465
+ subscriberCount++;
466
+ footer.subscriberCount = subscriberCount;
467
+ logAction(`New subscriber: ${email} (Total: ${subscriberCount})`);
468
+ alert(`Successfully subscribed! You are subscriber #${subscriberCount}`);
469
+ }
470
+ });
471
+ // Report issue functionality
472
+ footer.addEventListener('reportIncidentClick', (event) => {
473
+ const issue = prompt('Describe the issue you are experiencing:');
474
+ if (issue) {
475
+ const ticketId = `INC-${Date.now().toString().slice(-6)}`;
476
+ logAction(`Issue reported: ${ticketId} - ${issue.substring(0, 50)}...`);
477
+ alert(`Thank you! Your issue has been logged.\nTicket ID: ${ticketId}\nWe will investigate and update you at the provided email.`);
478
+ }
479
+ });
480
+ // Language change
481
+ footer.addEventListener('languageChange', (event) => {
482
+ const newLang = event.detail.language;
483
+ footer.currentLanguage = newLang;
484
+ logAction(`Language changed to: ${newLang}`);
485
+ // Simulate translation
486
+ const translations = {
487
+ en: 'Interactive Corp',
488
+ es: 'Corporación Interactiva',
489
+ fr: 'Corp Interactif',
490
+ de: 'Interaktive GmbH',
491
+ ja: 'インタラクティブ株式会社',
492
+ zh: '互动公司'
493
+ };
494
+ footer.companyName = translations[newLang] || translations.en;
495
+ });
496
+ // Theme toggle
497
+ footer.addEventListener('themeToggle', (event) => {
498
+ const theme = event.detail.theme;
499
+ logAction(`Theme changed to: ${theme}`);
500
+ footer.currentTheme = theme;
501
+ });
502
+ // Click tracking
503
+ footer.addEventListener('footerLinkClick', (event) => {
504
+ logAction(`Link clicked: ${event.detail.type} - ${event.detail.label || event.detail.url}`);
505
+ });
506
+ // Action log
507
+ const actionLog = document.createElement('div');
508
+ actionLog.className = 'event-log';
509
+ actionLog.innerHTML = '<strong>User Actions:</strong><br>';
510
+ wrapperElement.appendChild(actionLog);
511
+ const logAction = (message) => {
512
+ const time = new Date().toLocaleTimeString();
513
+ actionLog.innerHTML += `[${time}] ${message}<br>`;
514
+ actionLog.scrollTop = actionLog.scrollHeight;
515
+ };
516
+ logAction('Interactive footer ready');
517
+ // Add info
518
+ const info = document.createElement('div');
519
+ info.className = 'demo-info';
520
+ info.innerHTML = 'Try clicking on various footer elements to see the interactive features in action.';
521
+ wrapperElement.appendChild(info);
522
+ }}
523
+ >
524
+ <upl-statuspage-footer></upl-statuspage-footer>
525
+ </dees-demowrapper>
526
+ </div>
527
+
528
+ <!-- Edge Cases -->
529
+ <div class="demo-section">
530
+ <div class="demo-title">Edge Cases and Special Scenarios</div>
531
+ <dees-demowrapper
532
+ .runAfterRender=${async (wrapperElement) => {
533
+ const footer = wrapperElement.querySelector('upl-statuspage-footer');
534
+ const edgeCases = {
535
+ empty: {
536
+ name: 'Empty/Minimal',
537
+ config: {
538
+ companyName: '',
539
+ whitelabel: true,
540
+ lastUpdated: null
541
+ }
542
+ },
543
+ veryLong: {
544
+ name: 'Very Long Content',
545
+ config: {
546
+ companyName: 'International Mega Corporation with an Extremely Long Company Name That Tests Layout Limits Inc.',
547
+ legalUrl: 'https://very-long-domain-name-that-might-break-layouts.international-corporation.com/legal/terms-and-conditions/privacy-policy/cookie-policy',
548
+ supportEmail: 'customer.support.team@very-long-domain-name.international-corporation.com',
549
+ socialLinks: Array.from({ length: 15 }, (_, i) => ({
550
+ platform: ['twitter', 'github', 'linkedin', 'facebook', 'youtube'][i % 5],
551
+ url: `https://social-${i}.com/long-username-handle-that-tests-limits`
552
+ })),
553
+ additionalLinks: Array.from({ length: 10 }, (_, i) => ({
554
+ label: `Very Long Link Label That Might Cause Layout Issues #${i + 1}`,
555
+ url: `https://example.com/very/long/path/structure/that/goes/on/and/on/page-${i}`
556
+ }))
557
+ }
558
+ },
559
+ unicode: {
560
+ name: 'Unicode/International',
561
+ config: {
562
+ companyName: '🌍 全球服务 • グローバル • العالمية • Глобальный 🌏',
563
+ legalUrl: 'https://unicode.test/法律',
564
+ supportEmail: 'support@日本.jp',
565
+ currentYear: new Date().getFullYear(),
566
+ socialLinks: [
567
+ { platform: 'twitter', url: 'https://twitter.com/🌐' },
568
+ { platform: 'github', url: 'https://github.com/世界' }
569
+ ],
570
+ additionalLinks: [
571
+ { label: '📋 Terms & Conditions', url: '#' },
572
+ { label: '🔒 Privacy Policy', url: '#' },
573
+ { label: '🛡️ Security', url: '#' }
574
+ ]
575
+ }
576
+ },
577
+ brokenData: {
578
+ name: 'Broken/Invalid Data',
579
+ config: {
580
+ companyName: null,
581
+ legalUrl: 'not-a-valid-url',
582
+ supportEmail: 'not-an-email',
583
+ currentYear: 'not-a-year',
584
+ lastUpdated: 'invalid-timestamp',
585
+ socialLinks: [
586
+ { platform: null, url: null },
587
+ { platform: 'unknown-platform', url: '' },
588
+ { url: 'https://missing-platform.com' },
589
+ { platform: 'twitter' }
590
+ ],
591
+ rssFeedUrl: '',
592
+ apiStatusUrl: undefined
593
+ }
594
+ },
595
+ maxData: {
596
+ name: 'Maximum Data',
597
+ config: {
598
+ companyName: 'Maximum Configuration Demo',
599
+ legalUrl: 'https://max.demo/legal',
600
+ supportEmail: 'all@max.demo',
601
+ statusPageUrl: 'https://status.max.demo',
602
+ whitelabel: false,
603
+ currentYear: new Date().getFullYear(),
604
+ lastUpdated: Date.now(),
605
+ language: 'en',
606
+ theme: 'dark',
607
+ socialLinks: Array.from({ length: 20 }, (_, i) => ({
608
+ platform: 'generic',
609
+ url: `https://social${i}.com`
610
+ })),
611
+ additionalLinks: Array.from({ length: 15 }, (_, i) => ({
612
+ label: `Link ${i + 1}`,
613
+ url: `#link${i + 1}`
614
+ })),
615
+ rssFeedUrl: 'https://status.max.demo/rss',
616
+ apiStatusUrl: 'https://api.max.demo/status',
617
+ subscriberCount: 999999,
618
+ enableSubscribe: true,
619
+ enableReportIssue: true,
620
+ enableLanguageSelector: true,
621
+ enableThemeToggle: true,
622
+ languageOptions: Array.from({ length: 50 }, (_, i) => ({
623
+ code: `lang${i}`,
624
+ label: `Language ${i}`
625
+ }))
626
+ }
627
+ }
628
+ };
629
+ // Initial setup
630
+ let currentCase = 'empty';
631
+ const applyCase = (edgeCase) => {
632
+ // Clear all properties first
633
+ Object.keys(footer).forEach(key => {
634
+ if (typeof footer[key] !== 'function') {
635
+ footer[key] = undefined;
636
+ }
637
+ });
638
+ // Apply new config
639
+ Object.keys(edgeCase.config).forEach(key => {
640
+ footer[key] = edgeCase.config[key];
641
+ });
642
+ };
643
+ applyCase(edgeCases[currentCase]);
644
+ // Create controls
645
+ const controls = document.createElement('div');
646
+ controls.className = 'demo-controls';
647
+ Object.entries(edgeCases).forEach(([key, edgeCase]) => {
648
+ const button = document.createElement('button');
649
+ button.className = 'demo-button' + (key === currentCase ? ' active' : '');
650
+ button.textContent = edgeCase.name;
651
+ button.onclick = () => {
652
+ controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active'));
653
+ button.classList.add('active');
654
+ currentCase = key;
655
+ applyCase(edgeCase);
656
+ };
657
+ controls.appendChild(button);
658
+ });
659
+ wrapperElement.appendChild(controls);
660
+ // Add description
661
+ const info = document.createElement('div');
662
+ info.className = 'demo-info';
663
+ info.innerHTML = `
664
+ <strong>Edge Case Descriptions:</strong><br>
665
+ <strong>Empty:</strong> Minimal configuration with missing data<br>
666
+ <strong>Very Long:</strong> Tests layout with extremely long content<br>
667
+ <strong>Unicode:</strong> International characters and emojis<br>
668
+ <strong>Broken Data:</strong> Invalid or malformed configuration<br>
669
+ <strong>Maximum Data:</strong> All features with maximum content
670
+ `;
671
+ wrapperElement.appendChild(info);
672
+ }}
673
+ >
674
+ <upl-statuspage-footer></upl-statuspage-footer>
675
+ </dees-demowrapper>
676
+ </div>
677
+ </div>
678
+ `;
679
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsLXN0YXR1c3BhZ2UtZm9vdGVyLmRlbW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvdXBsLXN0YXR1c3BhZ2UtZm9vdGVyLmRlbW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR25ELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQXNGUixLQUFLLEVBQUUsY0FBbUIsRUFBRSxFQUFFO0lBQzlDLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQVEsQ0FBQztJQUU1RSx3QkFBd0I7SUFDeEIsTUFBTSxhQUFhLEdBQUc7UUFDcEIsT0FBTyxFQUFFO1lBQ1AsSUFBSSxFQUFFLFNBQVM7WUFDZixNQUFNLEVBQUU7Z0JBQ04sV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUN4QjtTQUNGO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsSUFBSSxFQUFFLFVBQVU7WUFDaEIsTUFBTSxFQUFFO2dCQUNOLFdBQVcsRUFBRSxvQkFBb0I7Z0JBQ2pDLFFBQVEsRUFBRSwyQkFBMkI7Z0JBQ3JDLFlBQVksRUFBRSxzQkFBc0I7Z0JBQ3BDLGFBQWEsRUFBRSw2QkFBNkI7Z0JBQzVDLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2FBQ3RDO1NBQ0Y7UUFDRCxZQUFZLEVBQUU7WUFDWixJQUFJLEVBQUUs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