@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
@@ -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,275 @@ 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: 64px;
58
+ padding: ${unsafeCSS(sharedStyles.spacing.md)} ${unsafeCSS(sharedStyles.spacing.lg)};
59
+ border-radius: ${unsafeCSS(sharedStyles.borderRadius.lg)};
60
+ cursor: default;
61
+ transition: all ${unsafeCSS(sharedStyles.durations.normal)} ${unsafeCSS(sharedStyles.easings.default)};
62
+ position: relative;
63
+ overflow: hidden;
64
+ font-weight: 500;
65
+ font-size: 15px;
66
+ letter-spacing: -0.01em;
67
+ background: ${sharedStyles.colors.background.card};
68
+ border: 1px solid ${sharedStyles.colors.border.default};
69
+ box-shadow: ${unsafeCSS(sharedStyles.shadows.sm)};
70
+ }
71
+
72
+ .statusbar-inner::before {
73
+ content: '';
74
+ position: absolute;
75
+ left: 0;
76
+ top: 0;
77
+ bottom: 0;
78
+ width: 4px;
79
+ transition: background ${unsafeCSS(sharedStyles.durations.normal)} ${unsafeCSS(sharedStyles.easings.default)};
80
+ }
81
+
82
+ .statusbar-inner.operational::before {
83
+ background: ${sharedStyles.colors.status.operational};
84
+ }
85
+
86
+ .statusbar-inner.degraded::before {
87
+ background: ${sharedStyles.colors.status.degraded};
88
+ }
89
+
90
+ .statusbar-inner.partial_outage::before {
91
+ background: ${sharedStyles.colors.status.partial};
92
+ }
93
+
94
+ .statusbar-inner.major_outage::before {
95
+ background: ${sharedStyles.colors.status.major};
96
+ }
97
+
98
+ .statusbar-inner.maintenance::before {
99
+ background: ${sharedStyles.colors.status.maintenance};
100
+ }
101
+
102
+ .statusbar-inner:hover {
103
+ border-color: ${sharedStyles.colors.border.muted};
104
+ box-shadow: ${unsafeCSS(sharedStyles.shadows.base)};
105
+ }
106
+
107
+ .status-indicator {
108
+ width: 10px;
109
+ height: 10px;
110
+ border-radius: 50%;
111
+ flex-shrink: 0;
112
+ position: relative;
113
+ }
114
+
115
+ .status-indicator::after {
116
+ content: '';
117
+ position: absolute;
118
+ inset: -3px;
119
+ border-radius: 50%;
120
+ opacity: 0.2;
121
+ }
122
+
123
+ .statusbar-inner.operational .status-indicator {
124
+ background: ${sharedStyles.colors.status.operational};
125
+ box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(22, 163, 74, 0.15)', 'rgba(34, 197, 94, 0.2)')};
126
+ }
127
+
128
+ .statusbar-inner.operational .status-indicator::after {
129
+ background: ${sharedStyles.colors.status.operational};
130
+ animation: pulse-ring 2s ease-out infinite;
131
+ }
132
+
133
+ .statusbar-inner.degraded .status-indicator {
134
+ background: ${sharedStyles.colors.status.degraded};
135
+ box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(217, 119, 6, 0.15)', 'rgba(251, 191, 36, 0.2)')};
136
+ }
137
+
138
+ .statusbar-inner.partial_outage .status-indicator {
139
+ background: ${sharedStyles.colors.status.partial};
140
+ box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(220, 38, 38, 0.15)', 'rgba(248, 113, 113, 0.2)')};
141
+ }
142
+
143
+ .statusbar-inner.major_outage .status-indicator {
144
+ background: ${sharedStyles.colors.status.major};
145
+ box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(185, 28, 28, 0.15)', 'rgba(239, 68, 68, 0.2)')};
146
+ animation: pulse-indicator 1s ease-in-out infinite;
147
+ }
148
+
149
+ .statusbar-inner.maintenance .status-indicator {
150
+ background: ${sharedStyles.colors.status.maintenance};
151
+ box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(37, 99, 235, 0.15)', 'rgba(96, 165, 250, 0.2)')};
152
+ }
153
+
154
+ @keyframes pulse-ring {
155
+ 0% { transform: scale(1); opacity: 0.2; }
156
+ 50% { transform: scale(1.5); opacity: 0; }
157
+ 100% { transform: scale(1); opacity: 0; }
158
+ }
159
+
160
+ @keyframes pulse-indicator {
161
+ 0%, 100% { opacity: 1; }
162
+ 50% { opacity: 0.6; }
163
+ }
164
+
165
+ .status-content {
166
+ display: flex;
167
+ align-items: center;
168
+ gap: ${unsafeCSS(sharedStyles.spacing.md)};
169
+ flex: 1;
170
+ padding-left: ${unsafeCSS(sharedStyles.spacing.sm)};
171
+ }
172
+
173
+ .status-main {
174
+ display: flex;
175
+ align-items: center;
176
+ gap: ${unsafeCSS(sharedStyles.spacing.sm)};
177
+ color: ${sharedStyles.colors.text.primary};
178
+ }
179
+
180
+ .status-message {
181
+ font-weight: 600;
182
+ }
183
+
184
+ .status-details {
185
+ font-size: 13px;
186
+ font-weight: 400;
187
+ color: ${sharedStyles.colors.text.secondary};
188
+ }
189
+
190
+ .loading-skeleton {
191
+ background: ${sharedStyles.colors.background.card};
192
+ border: 1px solid ${sharedStyles.colors.border.default};
193
+ border-radius: ${unsafeCSS(sharedStyles.borderRadius.lg)};
194
+ height: 64px;
195
+ position: relative;
196
+ overflow: hidden;
197
+ }
198
+
199
+ .loading-skeleton::after {
200
+ content: '';
201
+ position: absolute;
202
+ top: 0;
203
+ left: 0;
204
+ right: 0;
205
+ bottom: 0;
206
+ background: ${cssManager.bdTheme(
207
+ 'linear-gradient(90deg, transparent 0%, rgba(0,0,0,0.04) 50%, transparent 100%)',
208
+ 'linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.04) 50%, transparent 100%)'
209
+ )};
210
+ animation: loading 1.5s ${unsafeCSS(sharedStyles.easings.default)} infinite;
211
+ }
212
+
213
+ @keyframes loading {
214
+ 0% { transform: translateX(-100%); }
215
+ 100% { transform: translateX(200%); }
216
+ }
217
+
218
+ .last-updated {
219
+ font-size: 12px;
220
+ color: ${sharedStyles.colors.text.muted};
221
+ white-space: nowrap;
222
+ padding: 4px 10px;
223
+ background: ${sharedStyles.colors.background.muted};
224
+ border-radius: ${unsafeCSS(sharedStyles.borderRadius.full)};
225
+ transition: all ${unsafeCSS(sharedStyles.durations.fast)} ${unsafeCSS(sharedStyles.easings.default)};
226
+ }
227
+
228
+ .statusbar-inner:hover .last-updated {
229
+ background: ${cssManager.bdTheme('#e4e4e7', '#3f3f46')};
230
+ }
231
+
232
+ @media (max-width: 768px) {
233
+ .statusbar-container {
234
+ padding: ${unsafeCSS(sharedStyles.spacing.md)};
29
235
  }
30
236
 
31
- .mainbox {
32
- margin: auto;
33
- max-width: 900px;
34
- text-align: center;
35
- background: #19572E;
36
- line-height: 50px;
37
- border-radius: 3px;
237
+ .statusbar-inner {
238
+ flex-direction: column;
239
+ align-items: flex-start;
240
+ gap: ${unsafeCSS(sharedStyles.spacing.sm)};
241
+ min-height: auto;
242
+ padding: ${unsafeCSS(sharedStyles.spacing.md)};
38
243
  }
244
+
245
+ .status-main {
246
+ flex-direction: column;
247
+ align-items: flex-start;
248
+ gap: 4px;
249
+ }
250
+
251
+ .last-updated {
252
+ align-self: flex-start;
253
+ }
254
+ }
255
+
256
+ @media (max-width: 640px) {
257
+ .statusbar-inner {
258
+ font-size: 14px;
259
+ }
260
+
261
+ .status-indicator {
262
+ width: 8px;
263
+ height: 8px;
264
+ }
265
+
266
+ .last-updated {
267
+ font-size: 11px;
268
+ }
269
+ }
39
270
  `,
40
271
  ]
41
272
 
42
273
  public render(): TemplateResult {
274
+ const formatLastUpdated = () => {
275
+ const date = new Date(this.overallStatus.lastUpdated);
276
+ const now = new Date();
277
+ const diff = now.getTime() - date.getTime();
278
+ const minutes = Math.floor(diff / 60000);
279
+
280
+ if (minutes < 1) return 'Just now';
281
+ if (minutes < 60) return `${minutes}m ago`;
282
+ const hours = Math.floor(minutes / 60);
283
+ if (hours < 24) return `${hours}h ago`;
284
+ return date.toLocaleDateString();
285
+ };
286
+
43
287
  return html`
44
- <style>
45
- </style>
46
- <div class="mainbox">
47
- Everything is working normally!
288
+ <div class="statusbar-container">
289
+ ${this.loading ? html`
290
+ <div class="loading-skeleton"></div>
291
+ ` : html`
292
+ <div class="statusbar-inner ${this.overallStatus.status}">
293
+ <div class="status-content">
294
+ <div class="status-indicator"></div>
295
+ <div class="status-main">
296
+ <span>${this.overallStatus.message}</span>
297
+ ${this.overallStatus.affectedServices > 0 ? html`
298
+ <span class="status-details">
299
+ · ${this.overallStatus.affectedServices} of ${this.overallStatus.totalServices} services affected
300
+ </span>
301
+ ` : ''}
302
+ </div>
303
+ </div>
304
+ <div class="last-updated">
305
+ ${formatLastUpdated()}
306
+ </div>
307
+ </div>
308
+ `}
48
309
  </div>
49
310
  `;
50
311
  }