@uptime.link/statuspage 1.0.74 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist_bundle/bundle.js +4096 -504
  2. package/dist_bundle/bundle.js.map +4 -4
  3. package/dist_ts_web/00_commitinfo_data.js +2 -2
  4. package/dist_ts_web/elements/index.d.ts +3 -0
  5. package/dist_ts_web/elements/index.js +6 -1
  6. package/dist_ts_web/elements/internal/uplinternal-miniheading.d.ts +1 -0
  7. package/dist_ts_web/elements/internal/uplinternal-miniheading.js +78 -28
  8. package/dist_ts_web/elements/upl-statuspage-assetsselector.d.ts +14 -0
  9. package/dist_ts_web/elements/upl-statuspage-assetsselector.demo.d.ts +1 -0
  10. package/dist_ts_web/elements/upl-statuspage-assetsselector.demo.js +575 -0
  11. package/dist_ts_web/elements/upl-statuspage-assetsselector.js +605 -43
  12. package/dist_ts_web/elements/upl-statuspage-footer.d.ts +46 -2
  13. package/dist_ts_web/elements/upl-statuspage-footer.demo.d.ts +1 -0
  14. package/dist_ts_web/elements/upl-statuspage-footer.demo.js +679 -0
  15. package/dist_ts_web/elements/upl-statuspage-footer.js +792 -61
  16. package/dist_ts_web/elements/upl-statuspage-header.d.ts +5 -1
  17. package/dist_ts_web/elements/upl-statuspage-header.demo.d.ts +1 -0
  18. package/dist_ts_web/elements/upl-statuspage-header.demo.js +220 -0
  19. package/dist_ts_web/elements/upl-statuspage-header.js +313 -86
  20. package/dist_ts_web/elements/upl-statuspage-incidents.d.ts +22 -4
  21. package/dist_ts_web/elements/upl-statuspage-incidents.demo.d.ts +1 -0
  22. package/dist_ts_web/elements/upl-statuspage-incidents.demo.js +1147 -0
  23. package/dist_ts_web/elements/upl-statuspage-incidents.js +750 -74
  24. package/dist_ts_web/elements/upl-statuspage-pagetitle.d.ts +15 -0
  25. package/dist_ts_web/elements/upl-statuspage-pagetitle.demo.d.ts +1 -0
  26. package/dist_ts_web/elements/upl-statuspage-pagetitle.demo.js +25 -0
  27. package/dist_ts_web/elements/upl-statuspage-pagetitle.js +148 -0
  28. package/dist_ts_web/elements/upl-statuspage-statsgrid.d.ts +23 -0
  29. package/dist_ts_web/elements/upl-statuspage-statsgrid.demo.d.ts +1 -0
  30. package/dist_ts_web/elements/upl-statuspage-statsgrid.demo.js +295 -0
  31. package/dist_ts_web/elements/upl-statuspage-statsgrid.js +374 -0
  32. package/dist_ts_web/elements/upl-statuspage-statusbar.d.ts +4 -0
  33. package/dist_ts_web/elements/upl-statuspage-statusbar.demo.d.ts +1 -0
  34. package/dist_ts_web/elements/upl-statuspage-statusbar.demo.js +365 -0
  35. package/dist_ts_web/elements/upl-statuspage-statusbar.js +357 -44
  36. package/dist_ts_web/elements/upl-statuspage-statusdetails.d.ts +14 -0
  37. package/dist_ts_web/elements/upl-statuspage-statusdetails.demo.d.ts +1 -0
  38. package/dist_ts_web/elements/upl-statuspage-statusdetails.demo.js +706 -0
  39. package/dist_ts_web/elements/upl-statuspage-statusdetails.js +373 -63
  40. package/dist_ts_web/elements/upl-statuspage-statusmonth.d.ts +15 -0
  41. package/dist_ts_web/elements/upl-statuspage-statusmonth.demo.d.ts +1 -0
  42. package/dist_ts_web/elements/upl-statuspage-statusmonth.demo.js +798 -0
  43. package/dist_ts_web/elements/upl-statuspage-statusmonth.js +474 -100
  44. package/dist_ts_web/interfaces/index.d.ts +84 -0
  45. package/dist_ts_web/interfaces/index.js +4 -0
  46. package/dist_ts_web/pages/index.d.ts +4 -1
  47. package/dist_ts_web/pages/index.js +5 -2
  48. package/dist_ts_web/pages/statuspage-allgreen.d.ts +1 -0
  49. package/dist_ts_web/pages/statuspage-allgreen.js +386 -0
  50. package/dist_ts_web/pages/statuspage-demo.d.ts +1 -0
  51. package/dist_ts_web/pages/statuspage-demo.js +616 -0
  52. package/dist_ts_web/pages/statuspage-maintenance.d.ts +1 -0
  53. package/dist_ts_web/pages/statuspage-maintenance.js +544 -0
  54. package/dist_ts_web/pages/statuspage-outage.d.ts +1 -0
  55. package/dist_ts_web/pages/statuspage-outage.js +543 -0
  56. package/dist_ts_web/styles/shared.styles.d.ts +80 -0
  57. package/dist_ts_web/styles/shared.styles.js +351 -0
  58. package/dist_watch/bundle.js +51691 -32432
  59. package/dist_watch/bundle.js.map +4 -4
  60. package/npmextra.json +9 -3
  61. package/package.json +19 -19
  62. package/readme.hints.md +292 -0
  63. package/readme.md +326 -149
  64. package/readme.plan.md +261 -0
  65. package/ts_web/00_commitinfo_data.ts +1 -1
  66. package/ts_web/elements/index.ts +6 -0
  67. package/ts_web/elements/internal/uplinternal-miniheading.ts +24 -17
  68. package/ts_web/elements/upl-statuspage-assetsselector.demo.ts +607 -0
  69. package/ts_web/elements/upl-statuspage-assetsselector.ts +526 -18
  70. package/ts_web/elements/upl-statuspage-footer.demo.ts +744 -0
  71. package/ts_web/elements/upl-statuspage-footer.ts +608 -30
  72. package/ts_web/elements/upl-statuspage-header.demo.ts +241 -0
  73. package/ts_web/elements/upl-statuspage-header.ts +220 -52
  74. package/ts_web/elements/upl-statuspage-incidents.demo.ts +1216 -0
  75. package/ts_web/elements/upl-statuspage-incidents.ts +649 -26
  76. package/ts_web/elements/upl-statuspage-pagetitle.demo.ts +25 -0
  77. package/ts_web/elements/upl-statuspage-pagetitle.ts +89 -0
  78. package/ts_web/elements/upl-statuspage-statsgrid.demo.ts +315 -0
  79. package/ts_web/elements/upl-statuspage-statsgrid.ts +306 -0
  80. package/ts_web/elements/upl-statuspage-statusbar.demo.ts +393 -0
  81. package/ts_web/elements/upl-statuspage-statusbar.ts +281 -20
  82. package/ts_web/elements/upl-statuspage-statusdetails.demo.ts +754 -0
  83. package/ts_web/elements/upl-statuspage-statusdetails.ts +297 -38
  84. package/ts_web/elements/upl-statuspage-statusmonth.demo.ts +876 -0
  85. package/ts_web/elements/upl-statuspage-statusmonth.ts +397 -76
  86. package/ts_web/interfaces/index.ts +95 -0
  87. package/ts_web/pages/index.ts +4 -1
  88. package/ts_web/pages/statuspage-allgreen.ts +412 -0
  89. package/ts_web/pages/statuspage-demo.ts +653 -0
  90. package/ts_web/pages/statuspage-maintenance.ts +570 -0
  91. package/ts_web/pages/statuspage-outage.ts +568 -0
  92. package/ts_web/styles/shared.styles.ts +367 -0
  93. package/dist_ts_web/pages/page1.d.ts +0 -1
  94. package/dist_ts_web/pages/page1.js +0 -11
  95. package/ts_web/pages/page1.ts +0 -11
@@ -0,0 +1,241 @@
1
+ import { html } from '@design.estate/dees-element';
2
+
3
+ export const demoFunc = () => html`
4
+ <style>
5
+ .demo-container {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: 20px;
9
+ }
10
+ .demo-section {
11
+ border: 1px solid #ddd;
12
+ border-radius: 8px;
13
+ padding: 20px;
14
+ background: #f5f5f5;
15
+ }
16
+ .demo-title {
17
+ font-size: 14px;
18
+ font-weight: 600;
19
+ margin-bottom: 16px;
20
+ color: #333;
21
+ }
22
+ .demo-controls {
23
+ display: flex;
24
+ gap: 10px;
25
+ margin-top: 16px;
26
+ flex-wrap: wrap;
27
+ }
28
+ .demo-button {
29
+ padding: 6px 12px;
30
+ border: 1px solid #ddd;
31
+ background: white;
32
+ border-radius: 4px;
33
+ cursor: pointer;
34
+ font-size: 13px;
35
+ }
36
+ .demo-button:hover {
37
+ background: #f0f0f0;
38
+ }
39
+ </style>
40
+
41
+ <div class="demo-container">
42
+ <!-- Basic Header -->
43
+ <div class="demo-section">
44
+ <div class="demo-title">Basic Header with Dynamic Title</div>
45
+ <dees-demowrapper
46
+ .runAfterRender=${async (wrapperElement: any) => {
47
+ const header = wrapperElement.querySelector('upl-statuspage-header') as any;
48
+
49
+ // Demo different titles
50
+ const titles = [
51
+ 'MyService Status Page',
52
+ 'Production Environment Status',
53
+ 'API Health Dashboard',
54
+ 'Global Infrastructure Status',
55
+ '🚀 Rocket Systems Monitor',
56
+ 'Multi-Region Service Status'
57
+ ];
58
+
59
+ let titleIndex = 0;
60
+ header.pageTitle = titles[titleIndex];
61
+
62
+ // Add event listeners
63
+ header.addEventListener('reportNewIncident', (event: CustomEvent) => {
64
+ console.log('Report incident clicked');
65
+ alert('Report Incident form would open here');
66
+ });
67
+
68
+ header.addEventListener('statusSubscribe', (event: CustomEvent) => {
69
+ console.log('Subscribe clicked');
70
+ alert('Subscribe modal would open here');
71
+ });
72
+
73
+ // Cycle through titles
74
+ setInterval(() => {
75
+ titleIndex = (titleIndex + 1) % titles.length;
76
+ header.pageTitle = titles[titleIndex];
77
+ }, 2000);
78
+ }}
79
+ >
80
+ <upl-statuspage-header></upl-statuspage-header>
81
+ </dees-demowrapper>
82
+ </div>
83
+
84
+ <!-- Header with Hidden Buttons -->
85
+ <div class="demo-section">
86
+ <div class="demo-title">Header with Configurable Buttons</div>
87
+ <dees-demowrapper
88
+ .runAfterRender=${async (wrapperElement: any) => {
89
+ const header = wrapperElement.querySelector('upl-statuspage-header') as any;
90
+ header.pageTitle = 'Configurable Button States';
91
+
92
+ // Add properties to control button visibility
93
+ header.showReportButton = true;
94
+ header.showSubscribeButton = true;
95
+
96
+ const controls = document.createElement('div');
97
+ controls.className = 'demo-controls';
98
+ controls.innerHTML = `
99
+ <button class="demo-button" id="toggleReport">Toggle Report Button</button>
100
+ <button class="demo-button" id="toggleSubscribe">Toggle Subscribe Button</button>
101
+ <button class="demo-button" id="toggleBoth">Hide Both</button>
102
+ <button class="demo-button" id="showBoth">Show Both</button>
103
+ `;
104
+ wrapperElement.appendChild(controls);
105
+
106
+ controls.querySelector('#toggleReport')?.addEventListener('click', () => {
107
+ header.showReportButton = !header.showReportButton;
108
+ });
109
+
110
+ controls.querySelector('#toggleSubscribe')?.addEventListener('click', () => {
111
+ header.showSubscribeButton = !header.showSubscribeButton;
112
+ });
113
+
114
+ controls.querySelector('#toggleBoth')?.addEventListener('click', () => {
115
+ header.showReportButton = false;
116
+ header.showSubscribeButton = false;
117
+ });
118
+
119
+ controls.querySelector('#showBoth')?.addEventListener('click', () => {
120
+ header.showReportButton = true;
121
+ header.showSubscribeButton = true;
122
+ });
123
+ }}
124
+ >
125
+ <upl-statuspage-header></upl-statuspage-header>
126
+ </dees-demowrapper>
127
+ </div>
128
+
129
+ <!-- Header with Custom Styling -->
130
+ <div class="demo-section">
131
+ <div class="demo-title">Header with Custom Branding</div>
132
+ <dees-demowrapper
133
+ .runAfterRender=${async (wrapperElement: any) => {
134
+ const header = wrapperElement.querySelector('upl-statuspage-header') as any;
135
+ header.pageTitle = 'Enterprise Cloud Platform';
136
+
137
+ // Custom branding properties
138
+ header.brandColor = '#1976D2';
139
+ header.logoUrl = 'https://via.placeholder.com/120x40/1976D2/ffffff?text=LOGO';
140
+ header.customStyles = true;
141
+
142
+ // Simulate different brand states
143
+ const brands = [
144
+ { title: 'Enterprise Cloud Platform', color: '#1976D2', logo: 'ENTERPRISE' },
145
+ { title: 'StartUp SaaS Monitor', color: '#00BCD4', logo: 'STARTUP' },
146
+ { title: 'Government Services Status', color: '#4CAF50', logo: 'GOV' },
147
+ { title: 'Financial Systems Health', color: '#673AB7', logo: 'FINTECH' }
148
+ ];
149
+
150
+ let brandIndex = 0;
151
+ setInterval(() => {
152
+ brandIndex = (brandIndex + 1) % brands.length;
153
+ const brand = brands[brandIndex];
154
+ header.pageTitle = brand.title;
155
+ header.brandColor = brand.color;
156
+ header.logoUrl = `https://via.placeholder.com/120x40/${brand.color.slice(1)}/ffffff?text=${brand.logo}`;
157
+ }, 3000);
158
+ }}
159
+ >
160
+ <upl-statuspage-header></upl-statuspage-header>
161
+ </dees-demowrapper>
162
+ </div>
163
+
164
+ <!-- Header with Loading State -->
165
+ <div class="demo-section">
166
+ <div class="demo-title">Header with Loading States</div>
167
+ <dees-demowrapper
168
+ .runAfterRender=${async (wrapperElement: any) => {
169
+ const header = wrapperElement.querySelector('upl-statuspage-header') as any;
170
+ header.pageTitle = 'Loading State Demo';
171
+ header.loading = true;
172
+
173
+ // Simulate loading completion
174
+ setTimeout(() => {
175
+ header.loading = false;
176
+ header.pageTitle = 'Status Page Loaded';
177
+ }, 2000);
178
+
179
+ // Add loading toggle
180
+ const controls = document.createElement('div');
181
+ controls.className = 'demo-controls';
182
+ controls.innerHTML = `
183
+ <button class="demo-button" id="toggleLoading">Toggle Loading State</button>
184
+ `;
185
+ wrapperElement.appendChild(controls);
186
+
187
+ controls.querySelector('#toggleLoading')?.addEventListener('click', () => {
188
+ header.loading = !header.loading;
189
+ if (header.loading) {
190
+ header.pageTitle = 'Loading...';
191
+ setTimeout(() => {
192
+ header.loading = false;
193
+ header.pageTitle = 'Status Page Ready';
194
+ }, 2000);
195
+ }
196
+ });
197
+ }}
198
+ >
199
+ <upl-statuspage-header></upl-statuspage-header>
200
+ </dees-demowrapper>
201
+ </div>
202
+
203
+ <!-- Header with Event Counter -->
204
+ <div class="demo-section">
205
+ <div class="demo-title">Header with Event Tracking</div>
206
+ <dees-demowrapper
207
+ .runAfterRender=${async (wrapperElement: any) => {
208
+ const header = wrapperElement.querySelector('upl-statuspage-header') as any;
209
+ header.pageTitle = 'Event Tracking Demo';
210
+
211
+ let reportCount = 0;
212
+ let subscribeCount = 0;
213
+
214
+ // Create counter display
215
+ const counterDisplay = document.createElement('div');
216
+ counterDisplay.style.marginTop = '16px';
217
+ counterDisplay.style.fontSize = '14px';
218
+ counterDisplay.innerHTML = `
219
+ <div>Report Clicks: <strong id="reportCount">0</strong></div>
220
+ <div>Subscribe Clicks: <strong id="subscribeCount">0</strong></div>
221
+ `;
222
+ wrapperElement.appendChild(counterDisplay);
223
+
224
+ header.addEventListener('reportNewIncident', () => {
225
+ reportCount++;
226
+ counterDisplay.querySelector('#reportCount').textContent = reportCount.toString();
227
+ console.log(`Report incident clicked ${reportCount} times`);
228
+ });
229
+
230
+ header.addEventListener('statusSubscribe', () => {
231
+ subscribeCount++;
232
+ counterDisplay.querySelector('#subscribeCount').textContent = subscribeCount.toString();
233
+ console.log(`Subscribe clicked ${subscribeCount} times`);
234
+ });
235
+ }}
236
+ >
237
+ <upl-statuspage-header></upl-statuspage-header>
238
+ </dees-demowrapper>
239
+ </div>
240
+ </div>
241
+ `;
@@ -1,5 +1,7 @@
1
- import { DeesElement, property, html, customElement, type TemplateResult, css, cssManager } from '@design.estate/dees-element';
1
+ import { DeesElement, property, html, customElement, type TemplateResult, css, cssManager, unsafeCSS } from '@design.estate/dees-element';
2
2
  import * as domtools from '@design.estate/dees-domtools';
3
+ import * as sharedStyles from '../styles/shared.styles.js';
4
+ import { demoFunc } from './upl-statuspage-header.demo.js';
3
5
 
4
6
  declare global {
5
7
  interface HTMLElementTagNameMap {
@@ -10,13 +12,23 @@ declare global {
10
12
  @customElement('upl-statuspage-header')
11
13
  export class UplStatuspageHeader extends DeesElement {
12
14
  // STATIC
13
- public static demo = () => html`
14
- <upl-statuspage-header></upl-statuspage-header>
15
- `;
15
+ public static demo = demoFunc;
16
16
 
17
17
  // INSTANCE
18
- @property()
19
- public pageTitle: string = "Statuspage Title";
18
+ @property({ type: String })
19
+ accessor pageTitle: string = "Statuspage Title";
20
+
21
+ @property({ type: Boolean })
22
+ accessor showReportButton: boolean = true;
23
+
24
+ @property({ type: Boolean })
25
+ accessor showSubscribeButton: boolean = true;
26
+
27
+ @property({ type: String })
28
+ accessor logoUrl: string = '';
29
+
30
+ @property({ type: Boolean })
31
+ accessor loading: boolean = false;
20
32
 
21
33
 
22
34
  constructor() {
@@ -27,72 +39,228 @@ export class UplStatuspageHeader extends DeesElement {
27
39
  domtools.elementBasic.staticStyles,
28
40
  css`
29
41
  :host {
30
- display: block;
31
- background: ${cssManager.bdTheme('#eeeeeb', '#222222')};
32
- font-family: Inter;
33
- color: ${cssManager.bdTheme('#333333', '#ffffff')};
42
+ display: block;
43
+ background: ${sharedStyles.colors.background.primary};
44
+ font-family: ${unsafeCSS(sharedStyles.fonts.base)};
45
+ color: ${sharedStyles.colors.text.primary};
46
+ border-bottom: 1px solid ${sharedStyles.colors.border.default};
47
+ position: sticky;
48
+ top: 0;
49
+ z-index: 40;
50
+ backdrop-filter: blur(12px);
51
+ -webkit-backdrop-filter: blur(12px);
52
+ }
53
+
54
+ .header-container {
55
+ max-width: 1200px;
56
+ margin: 0 auto;
57
+ padding: 0 ${unsafeCSS(sharedStyles.spacing.lg)};
58
+ }
59
+
60
+ .header-nav {
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: space-between;
64
+ height: 64px;
65
+ }
66
+
67
+ .header-left {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: ${unsafeCSS(sharedStyles.spacing.lg)};
71
+ }
72
+
73
+ .header-actions {
74
+ display: flex;
75
+ align-items: center;
76
+ gap: ${unsafeCSS(sharedStyles.spacing.sm)};
77
+ }
78
+
79
+ .actionButton {
80
+ font-family: ${unsafeCSS(sharedStyles.fonts.base)};
81
+ font-size: 13px;
82
+ font-weight: 500;
83
+ padding: 0 14px;
84
+ border-radius: ${unsafeCSS(sharedStyles.borderRadius.base)};
85
+ cursor: pointer;
86
+ user-select: none;
87
+ transition: all ${unsafeCSS(sharedStyles.durations.normal)} ${unsafeCSS(sharedStyles.easings.default)};
88
+ display: inline-flex;
89
+ align-items: center;
90
+ justify-content: center;
91
+ height: 36px;
92
+ background: transparent;
93
+ border: 1px solid ${sharedStyles.colors.border.default};
94
+ color: ${sharedStyles.colors.text.primary};
95
+ letter-spacing: -0.01em;
96
+ }
97
+
98
+ .actionButton:hover {
99
+ background: ${sharedStyles.colors.background.secondary};
100
+ border-color: ${sharedStyles.colors.border.muted};
101
+ box-shadow: ${unsafeCSS(sharedStyles.shadows.xs)};
102
+ }
103
+
104
+ .actionButton:active {
105
+ transform: scale(0.98);
106
+ transition-duration: ${unsafeCSS(sharedStyles.durations.fast)};
107
+ }
108
+
109
+ .actionButton:focus-visible {
110
+ outline: 2px solid ${sharedStyles.colors.accent.focus};
111
+ outline-offset: 2px;
112
+ }
113
+
114
+ .site-title {
115
+ font-size: 18px;
116
+ font-weight: 600;
117
+ letter-spacing: -0.02em;
118
+ color: ${sharedStyles.colors.text.primary};
119
+ }
120
+
121
+ .logo {
122
+ height: 28px;
123
+ width: auto;
124
+ filter: ${cssManager.bdTheme('none', 'brightness(0) invert(1)')};
125
+ transition: opacity ${unsafeCSS(sharedStyles.durations.normal)} ${unsafeCSS(sharedStyles.easings.default)};
126
+ }
127
+
128
+ .logo:hover {
129
+ opacity: 0.8;
130
+ }
131
+
132
+ .page-info {
133
+ padding: ${unsafeCSS(sharedStyles.spacing.lg)} 0 ${unsafeCSS(sharedStyles.spacing.xl)} 0;
134
+ }
135
+
136
+ .page-title {
137
+ font-size: 48px;
138
+ font-weight: 700;
139
+ letter-spacing: -0.03em;
140
+ line-height: 1.1;
141
+ color: ${sharedStyles.colors.text.primary};
142
+ margin: 0 0 16px 0;
143
+ }
144
+
145
+ .page-subtitle {
146
+ font-size: 18px;
147
+ color: ${sharedStyles.colors.text.secondary};
148
+ margin: 0;
149
+ line-height: 1.5;
150
+ }
151
+
152
+ /* Primary button variant */
153
+ .actionButton.primary {
154
+ background: ${sharedStyles.colors.accent.primary};
155
+ color: ${sharedStyles.colors.background.primary};
156
+ border-color: transparent;
157
+ }
158
+
159
+ .actionButton.primary:hover {
160
+ background: ${sharedStyles.colors.accent.hover};
161
+ box-shadow: ${unsafeCSS(sharedStyles.shadows.sm)};
162
+ }
163
+
164
+ .loading-skeleton {
165
+ height: 64px;
166
+ background: ${sharedStyles.colors.background.secondary};
167
+ border-bottom: 1px solid ${sharedStyles.colors.border.default};
168
+ position: relative;
169
+ overflow: hidden;
170
+ }
171
+
172
+ .loading-skeleton::after {
173
+ content: '';
174
+ position: absolute;
175
+ inset: 0;
176
+ background: ${cssManager.bdTheme(
177
+ 'linear-gradient(90deg, transparent 0%, rgba(0,0,0,0.04) 50%, transparent 100%)',
178
+ 'linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.04) 50%, transparent 100%)'
179
+ )};
180
+ animation: loading 1.5s ${unsafeCSS(sharedStyles.easings.default)} infinite;
181
+ }
182
+
183
+ @keyframes loading {
184
+ 0% { transform: translateX(-100%); }
185
+ 100% { transform: translateX(200%); }
186
+ }
187
+
188
+ @media (max-width: 768px) {
189
+ .header-container {
190
+ padding: 0 ${unsafeCSS(sharedStyles.spacing.md)};
191
+ }
192
+
193
+ .header-nav {
194
+ height: 56px;
34
195
  }
35
196
 
36
- .mainbox {
37
- margin: auto;
38
- max-width: 900px;
197
+ .header-left {
198
+ gap: ${unsafeCSS(sharedStyles.spacing.md)};
39
199
  }
40
200
 
41
- .mainbox .actions {
42
- display: flex;
43
- justify-content: flex-end;
44
- padding: 20px 0px 40px 0px;
201
+ .site-title {
202
+ font-size: 16px;
45
203
  }
46
204
 
47
- .mainbox .actions .actionButton {
48
- background: ${cssManager.bdTheme('#00000000', '#ffffff00')};
49
-
205
+ .logo {
206
+ height: 24px;
207
+ }
208
+ }
209
+
210
+ @media (max-width: 640px) {
211
+ .actionButton {
50
212
  font-size: 12px;
51
- border: 1px solid ${cssManager.bdTheme('#333', '#CCC')};
52
- padding: 6px 10px 7px 10px;
53
- margin-left: 10px;
54
- border-radius: 3px;
55
- cursor: pointer;
56
- user-select: none;
213
+ padding: 0 12px;
214
+ height: 32px;
57
215
  }
58
216
 
59
- .mainbox .actions .actionButton:hover {
60
- background: ${cssManager.bdTheme('#333333', '#efefef')};
61
- border: 1px solid ${cssManager.bdTheme('#333333', '#efefef')};
62
- color: ${cssManager.bdTheme('#fff', '#333333')};
217
+ .page-title {
218
+ font-size: 32px;
63
219
  }
64
220
 
65
- h1 {
66
- margin: 0px;
67
- text-align: center;
68
- font-weight: 600;
69
- font-size: 35px;
221
+ .page-subtitle {
222
+ font-size: 16px;
70
223
  }
71
224
 
72
- h2 {
73
- margin: 0px;
74
- margin-top: 10px;
75
- text-align: center;
76
- font-weight: 600;
77
- font-size: 18px;
225
+ .header-actions {
226
+ gap: 6px;
78
227
  }
228
+ }
79
229
  `
80
230
  ]
81
231
 
82
232
  public render(): TemplateResult {
233
+ if (this.loading) {
234
+ return html`
235
+ <div class="loading-skeleton"></div>
236
+ `;
237
+ }
238
+
83
239
  return html`
84
- ${domtools.elementBasic.styles}
85
- <style>
86
-
87
- </style>
88
- <div class="mainbox">
89
- <div class="actions">
90
- <div class="actionButton" @click=${this.dispatchReportNewIncident}>report new incident</div>
91
- <div class="actionButton" @click=${this.dispatchStatusSubscribe}>subscribe</div>
240
+ <header>
241
+ <div class="header-container">
242
+ <nav class="header-nav">
243
+ <div class="header-left">
244
+ ${this.logoUrl ? html`
245
+ <img src="${this.logoUrl}" alt="${this.pageTitle}" class="logo">
246
+ ` : ''}
247
+ <h1 class="site-title">${this.pageTitle}</h1>
248
+ </div>
249
+ <div class="header-actions">
250
+ ${this.showReportButton ? html`
251
+ <button class="actionButton" @click=${this.dispatchReportNewIncident}>
252
+ Report Issue
253
+ </button>
254
+ ` : ''}
255
+ ${this.showSubscribeButton ? html`
256
+ <button class="actionButton primary" @click=${this.dispatchStatusSubscribe}>
257
+ Subscribe
258
+ </button>
259
+ ` : ''}
260
+ </div>
261
+ </nav>
92
262
  </div>
93
- <h1>${this.pageTitle}</h1>
94
- <h2>STATUS BOARD</h2>
95
- </div>
263
+ </header>
96
264
  `;
97
265
  }
98
266