@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
@@ -1,5 +1,8 @@
1
- import { DeesElement, property, html, customElement, type TemplateResult, cssManager, css } from '@design.estate/dees-element';
1
+ import { DeesElement, property, html, customElement, type TemplateResult, cssManager, css, unsafeCSS } from '@design.estate/dees-element';
2
2
  import * as domtools from '@design.estate/dees-domtools';
3
+ import type { IOverallStatus } from '../interfaces/index.js';
4
+ import * as sharedStyles from '../styles/shared.styles.js';
5
+ import { demoFunc } from './upl-statuspage-statusbar.demo.js';
3
6
 
4
7
  declare global {
5
8
  interface HTMLElementTagNameMap {
@@ -9,9 +12,22 @@ declare global {
9
12
 
10
13
  @customElement('upl-statuspage-statusbar')
11
14
  export class UplStatuspageStatusbar extends DeesElement {
12
- public static demo = () => html`
13
- <upl-statuspage-statusbar></upl-statuspage-statusbar>
14
- `;
15
+ public static demo = demoFunc;
16
+
17
+ @property({ type: Object })
18
+ accessor overallStatus: IOverallStatus = {
19
+ status: 'operational',
20
+ message: 'All Systems Operational',
21
+ lastUpdated: Date.now(),
22
+ affectedServices: 0,
23
+ totalServices: 0
24
+ };
25
+
26
+ @property({ type: Boolean })
27
+ accessor loading: boolean = false;
28
+
29
+ @property({ type: Boolean })
30
+ accessor expandable: boolean = true;
15
31
 
16
32
  constructor() {
17
33
  super();
@@ -21,30 +37,326 @@ export class UplStatuspageStatusbar extends DeesElement {
21
37
  cssManager.defaultStyles,
22
38
  css`
23
39
  :host {
24
- padding: 20px 0px 15px 0px;
25
- display: block;
26
- background: ${cssManager.bdTheme('#eeeeeb', '#222222')};;
27
- font-family: Inter;
28
- color: #fff;
40
+ padding: 0;
41
+ display: block;
42
+ background: transparent;
43
+ font-family: ${unsafeCSS(sharedStyles.fonts.base)};
44
+ }
45
+
46
+ .statusbar-container {
47
+ margin: auto;
48
+ max-width: 1200px;
49
+ padding: ${unsafeCSS(sharedStyles.spacing.lg)};
50
+ position: relative;
51
+ }
52
+
53
+ .statusbar-inner {
54
+ display: flex;
55
+ align-items: center;
56
+ justify-content: space-between;
57
+ min-height: 72px;
58
+ padding: ${unsafeCSS(sharedStyles.spacing.lg)} ${unsafeCSS(sharedStyles.spacing.xl)};
59
+ border-radius: ${unsafeCSS(sharedStyles.borderRadius.xl)};
60
+ cursor: default;
61
+ transition: all ${unsafeCSS(sharedStyles.durations.slow)} ${unsafeCSS(sharedStyles.easings.default)};
62
+ position: relative;
63
+ overflow: hidden;
64
+ font-weight: 500;
65
+ font-size: 15px;
66
+ letter-spacing: -0.01em;
67
+ border: 1px solid ${sharedStyles.colors.border.default};
68
+ box-shadow: ${unsafeCSS(sharedStyles.shadows.sm)};
69
+ }
70
+
71
+ /* Gradient background overlay */
72
+ .statusbar-inner::before {
73
+ content: '';
74
+ position: absolute;
75
+ inset: 0;
76
+ opacity: 1;
77
+ transition: opacity ${unsafeCSS(sharedStyles.durations.slow)} ${unsafeCSS(sharedStyles.easings.default)};
78
+ z-index: 0;
79
+ }
80
+
81
+ /* Left accent border */
82
+ .statusbar-inner::after {
83
+ content: '';
84
+ position: absolute;
85
+ left: 0;
86
+ top: 0;
87
+ bottom: 0;
88
+ width: 4px;
89
+ transition: background ${unsafeCSS(sharedStyles.durations.normal)} ${unsafeCSS(sharedStyles.easings.default)};
90
+ z-index: 1;
91
+ }
92
+
93
+ /* Operational - green gradient */
94
+ .statusbar-inner.operational {
95
+ background: ${sharedStyles.colors.background.card};
96
+ }
97
+ .statusbar-inner.operational::before {
98
+ background: ${sharedStyles.statusGradients.operational};
99
+ }
100
+ .statusbar-inner.operational::after {
101
+ background: ${sharedStyles.colors.status.operational};
102
+ }
103
+
104
+ /* Degraded - yellow/amber gradient */
105
+ .statusbar-inner.degraded {
106
+ background: ${sharedStyles.colors.background.card};
107
+ }
108
+ .statusbar-inner.degraded::before {
109
+ background: ${sharedStyles.statusGradients.degraded};
110
+ }
111
+ .statusbar-inner.degraded::after {
112
+ background: ${sharedStyles.colors.status.degraded};
113
+ }
114
+
115
+ /* Partial outage - orange/red gradient */
116
+ .statusbar-inner.partial_outage {
117
+ background: ${sharedStyles.colors.background.card};
118
+ }
119
+ .statusbar-inner.partial_outage::before {
120
+ background: ${sharedStyles.statusGradients.partial};
121
+ }
122
+ .statusbar-inner.partial_outage::after {
123
+ background: ${sharedStyles.colors.status.partial};
124
+ }
125
+
126
+ /* Major outage - red gradient */
127
+ .statusbar-inner.major_outage {
128
+ background: ${sharedStyles.colors.background.card};
129
+ }
130
+ .statusbar-inner.major_outage::before {
131
+ background: ${sharedStyles.statusGradients.major};
132
+ }
133
+ .statusbar-inner.major_outage::after {
134
+ background: ${sharedStyles.colors.status.major};
135
+ }
136
+
137
+ /* Maintenance - blue gradient */
138
+ .statusbar-inner.maintenance {
139
+ background: ${sharedStyles.colors.background.card};
140
+ }
141
+ .statusbar-inner.maintenance::before {
142
+ background: ${sharedStyles.statusGradients.maintenance};
143
+ }
144
+ .statusbar-inner.maintenance::after {
145
+ background: ${sharedStyles.colors.status.maintenance};
146
+ }
147
+
148
+ .statusbar-inner:hover {
149
+ border-color: ${sharedStyles.colors.border.muted};
150
+ box-shadow: ${unsafeCSS(sharedStyles.shadows.md)};
151
+ transform: translateY(-1px);
152
+ }
153
+
154
+ .statusbar-inner:hover::before {
155
+ opacity: 1.2;
156
+ }
157
+
158
+ .status-indicator {
159
+ width: 10px;
160
+ height: 10px;
161
+ border-radius: 50%;
162
+ flex-shrink: 0;
163
+ position: relative;
164
+ }
165
+
166
+ .status-indicator::after {
167
+ content: '';
168
+ position: absolute;
169
+ inset: -3px;
170
+ border-radius: 50%;
171
+ opacity: 0.2;
172
+ }
173
+
174
+ .statusbar-inner.operational .status-indicator {
175
+ background: ${sharedStyles.colors.status.operational};
176
+ box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(22, 163, 74, 0.15)', 'rgba(34, 197, 94, 0.2)')};
177
+ }
178
+
179
+ .statusbar-inner.operational .status-indicator::after {
180
+ background: ${sharedStyles.colors.status.operational};
181
+ animation: pulse-ring 2s ease-out infinite;
182
+ }
183
+
184
+ .statusbar-inner.degraded .status-indicator {
185
+ background: ${sharedStyles.colors.status.degraded};
186
+ box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(217, 119, 6, 0.15)', 'rgba(251, 191, 36, 0.2)')};
187
+ }
188
+
189
+ .statusbar-inner.partial_outage .status-indicator {
190
+ background: ${sharedStyles.colors.status.partial};
191
+ box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(220, 38, 38, 0.15)', 'rgba(248, 113, 113, 0.2)')};
192
+ }
193
+
194
+ .statusbar-inner.major_outage .status-indicator {
195
+ background: ${sharedStyles.colors.status.major};
196
+ box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(185, 28, 28, 0.15)', 'rgba(239, 68, 68, 0.2)')};
197
+ animation: pulse-indicator 1s ease-in-out infinite;
198
+ }
199
+
200
+ .statusbar-inner.maintenance .status-indicator {
201
+ background: ${sharedStyles.colors.status.maintenance};
202
+ box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(37, 99, 235, 0.15)', 'rgba(96, 165, 250, 0.2)')};
203
+ }
204
+
205
+ @keyframes pulse-ring {
206
+ 0% { transform: scale(1); opacity: 0.2; }
207
+ 50% { transform: scale(1.5); opacity: 0; }
208
+ 100% { transform: scale(1); opacity: 0; }
209
+ }
210
+
211
+ @keyframes pulse-indicator {
212
+ 0%, 100% { opacity: 1; }
213
+ 50% { opacity: 0.6; }
214
+ }
215
+
216
+ .status-content {
217
+ display: flex;
218
+ align-items: center;
219
+ gap: ${unsafeCSS(sharedStyles.spacing.md)};
220
+ flex: 1;
221
+ padding-left: ${unsafeCSS(sharedStyles.spacing.sm)};
222
+ }
223
+
224
+ .status-main {
225
+ display: flex;
226
+ align-items: center;
227
+ gap: ${unsafeCSS(sharedStyles.spacing.sm)};
228
+ color: ${sharedStyles.colors.text.primary};
229
+ }
230
+
231
+ .status-message {
232
+ font-weight: 600;
233
+ }
234
+
235
+ .status-details {
236
+ font-size: 13px;
237
+ font-weight: 400;
238
+ color: ${sharedStyles.colors.text.secondary};
239
+ }
240
+
241
+ .loading-skeleton {
242
+ background: ${sharedStyles.colors.background.card};
243
+ border: 1px solid ${sharedStyles.colors.border.default};
244
+ border-radius: ${unsafeCSS(sharedStyles.borderRadius.lg)};
245
+ height: 64px;
246
+ position: relative;
247
+ overflow: hidden;
248
+ }
249
+
250
+ .loading-skeleton::after {
251
+ content: '';
252
+ position: absolute;
253
+ top: 0;
254
+ left: 0;
255
+ right: 0;
256
+ bottom: 0;
257
+ background: ${cssManager.bdTheme(
258
+ 'linear-gradient(90deg, transparent 0%, rgba(0,0,0,0.04) 50%, transparent 100%)',
259
+ 'linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.04) 50%, transparent 100%)'
260
+ )};
261
+ animation: loading 1.5s ${unsafeCSS(sharedStyles.easings.default)} infinite;
262
+ }
263
+
264
+ @keyframes loading {
265
+ 0% { transform: translateX(-100%); }
266
+ 100% { transform: translateX(200%); }
267
+ }
268
+
269
+ .last-updated {
270
+ font-size: 12px;
271
+ color: ${sharedStyles.colors.text.muted};
272
+ white-space: nowrap;
273
+ padding: 4px 10px;
274
+ background: ${sharedStyles.colors.background.muted};
275
+ border-radius: ${unsafeCSS(sharedStyles.borderRadius.full)};
276
+ transition: all ${unsafeCSS(sharedStyles.durations.fast)} ${unsafeCSS(sharedStyles.easings.default)};
277
+ }
278
+
279
+ .statusbar-inner:hover .last-updated {
280
+ background: ${cssManager.bdTheme('#e4e4e7', '#3f3f46')};
281
+ }
282
+
283
+ @media (max-width: 768px) {
284
+ .statusbar-container {
285
+ padding: ${unsafeCSS(sharedStyles.spacing.md)};
29
286
  }
30
287
 
31
- .mainbox {
32
- margin: auto;
33
- max-width: 900px;
34
- text-align: center;
35
- background: #19572E;
36
- line-height: 50px;
37
- border-radius: 3px;
288
+ .statusbar-inner {
289
+ flex-direction: column;
290
+ align-items: flex-start;
291
+ gap: ${unsafeCSS(sharedStyles.spacing.sm)};
292
+ min-height: auto;
293
+ padding: ${unsafeCSS(sharedStyles.spacing.md)};
38
294
  }
295
+
296
+ .status-main {
297
+ flex-direction: column;
298
+ align-items: flex-start;
299
+ gap: 4px;
300
+ }
301
+
302
+ .last-updated {
303
+ align-self: flex-start;
304
+ }
305
+ }
306
+
307
+ @media (max-width: 640px) {
308
+ .statusbar-inner {
309
+ font-size: 14px;
310
+ }
311
+
312
+ .status-indicator {
313
+ width: 8px;
314
+ height: 8px;
315
+ }
316
+
317
+ .last-updated {
318
+ font-size: 11px;
319
+ }
320
+ }
39
321
  `,
40
322
  ]
41
323
 
42
324
  public render(): TemplateResult {
325
+ const formatLastUpdated = () => {
326
+ const date = new Date(this.overallStatus.lastUpdated);
327
+ const now = new Date();
328
+ const diff = now.getTime() - date.getTime();
329
+ const minutes = Math.floor(diff / 60000);
330
+
331
+ if (minutes < 1) return 'Just now';
332
+ if (minutes < 60) return `${minutes}m ago`;
333
+ const hours = Math.floor(minutes / 60);
334
+ if (hours < 24) return `${hours}h ago`;
335
+ return date.toLocaleDateString();
336
+ };
337
+
43
338
  return html`
44
- <style>
45
- </style>
46
- <div class="mainbox">
47
- Everything is working normally!
339
+ <div class="statusbar-container">
340
+ ${this.loading ? html`
341
+ <div class="loading-skeleton"></div>
342
+ ` : html`
343
+ <div class="statusbar-inner ${this.overallStatus.status}">
344
+ <div class="status-content">
345
+ <div class="status-indicator"></div>
346
+ <div class="status-main">
347
+ <span>${this.overallStatus.message}</span>
348
+ ${this.overallStatus.affectedServices > 0 ? html`
349
+ <span class="status-details">
350
+ · ${this.overallStatus.affectedServices} of ${this.overallStatus.totalServices} services affected
351
+ </span>
352
+ ` : ''}
353
+ </div>
354
+ </div>
355
+ <div class="last-updated">
356
+ ${formatLastUpdated()}
357
+ </div>
358
+ </div>
359
+ `}
48
360
  </div>
49
361
  `;
50
362
  }