@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,494 @@
1
+ import { css, cssManager, unsafeCSS } from '@design.estate/dees-element';
2
+ export const fonts = {
3
+ base: `'Geist Sans', -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif`,
4
+ mono: `'Geist Mono', ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace`
5
+ };
6
+ export const colors = {
7
+ // Background colors
8
+ background: {
9
+ primary: cssManager.bdTheme('#ffffff', '#09090b'),
10
+ secondary: cssManager.bdTheme('#fafafa', '#18181b'),
11
+ muted: cssManager.bdTheme('#f4f4f5', '#27272a'),
12
+ card: cssManager.bdTheme('#ffffff', '#0f0f12'),
13
+ elevated: cssManager.bdTheme('#ffffff', '#1a1a1e')
14
+ },
15
+ // Border colors
16
+ border: {
17
+ default: cssManager.bdTheme('#e4e4e7', '#27272a'),
18
+ muted: cssManager.bdTheme('#f4f4f5', '#3f3f46'),
19
+ subtle: cssManager.bdTheme('#f0f0f2', '#1f1f23')
20
+ },
21
+ // Text colors
22
+ text: {
23
+ primary: cssManager.bdTheme('#09090b', '#fafafa'),
24
+ secondary: cssManager.bdTheme('#71717a', '#a1a1aa'),
25
+ muted: cssManager.bdTheme('#a1a1aa', '#71717a')
26
+ },
27
+ // Status colors - vibrant and accessible
28
+ status: {
29
+ operational: cssManager.bdTheme('#16a34a', '#22c55e'),
30
+ degraded: cssManager.bdTheme('#d97706', '#fbbf24'),
31
+ partial: cssManager.bdTheme('#dc2626', '#f87171'),
32
+ major: cssManager.bdTheme('#b91c1c', '#ef4444'),
33
+ maintenance: cssManager.bdTheme('#2563eb', '#60a5fa')
34
+ },
35
+ // Accent colors for interactive elements
36
+ accent: {
37
+ primary: cssManager.bdTheme('#09090b', '#fafafa'),
38
+ hover: cssManager.bdTheme('#18181b', '#e4e4e7'),
39
+ focus: cssManager.bdTheme('#3b82f6', '#60a5fa')
40
+ }
41
+ };
42
+ export const shadows = {
43
+ xs: '0 1px 2px 0 rgba(0, 0, 0, 0.03)',
44
+ sm: '0 1px 3px 0 rgba(0, 0, 0, 0.06), 0 1px 2px -1px rgba(0, 0, 0, 0.06)',
45
+ base: '0 4px 6px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -2px rgba(0, 0, 0, 0.05)',
46
+ md: '0 6px 12px -2px rgba(0, 0, 0, 0.08), 0 3px 7px -3px rgba(0, 0, 0, 0.05)',
47
+ lg: '0 12px 24px -4px rgba(0, 0, 0, 0.1), 0 6px 12px -6px rgba(0, 0, 0, 0.05)',
48
+ xl: '0 24px 48px -12px rgba(0, 0, 0, 0.12), 0 12px 24px -12px rgba(0, 0, 0, 0.05)',
49
+ inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.04)',
50
+ glow: '0 0 20px -5px rgba(34, 197, 94, 0.3)'
51
+ };
52
+ export const borderRadius = {
53
+ xs: '3px',
54
+ sm: '4px',
55
+ base: '6px',
56
+ md: '8px',
57
+ lg: '12px',
58
+ xl: '16px',
59
+ '2xl': '24px',
60
+ full: '9999px'
61
+ };
62
+ export const spacing = {
63
+ xs: '4px',
64
+ sm: '8px',
65
+ md: '16px',
66
+ lg: '24px',
67
+ xl: '32px',
68
+ '2xl': '48px',
69
+ '3xl': '64px',
70
+ '4xl': '96px'
71
+ };
72
+ // Animation easings
73
+ export const easings = {
74
+ default: 'cubic-bezier(0.4, 0, 0.2, 1)',
75
+ smooth: 'cubic-bezier(0.4, 0, 0.6, 1)',
76
+ bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',
77
+ snappy: 'cubic-bezier(0.2, 0, 0, 1)',
78
+ spring: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)'
79
+ };
80
+ // Durations
81
+ export const durations = {
82
+ instant: '50ms',
83
+ fast: '100ms',
84
+ normal: '200ms',
85
+ slow: '300ms',
86
+ slower: '500ms',
87
+ slowest: '800ms'
88
+ };
89
+ // Status gradients for backgrounds
90
+ export const statusGradients = {
91
+ operational: cssManager.bdTheme('linear-gradient(135deg, rgba(22, 163, 74, 0.08) 0%, rgba(22, 163, 74, 0.02) 100%)', 'linear-gradient(135deg, rgba(34, 197, 94, 0.12) 0%, rgba(34, 197, 94, 0.03) 100%)'),
92
+ degraded: cssManager.bdTheme('linear-gradient(135deg, rgba(217, 119, 6, 0.08) 0%, rgba(217, 119, 6, 0.02) 100%)', 'linear-gradient(135deg, rgba(251, 191, 36, 0.12) 0%, rgba(251, 191, 36, 0.03) 100%)'),
93
+ partial: cssManager.bdTheme('linear-gradient(135deg, rgba(220, 38, 38, 0.08) 0%, rgba(220, 38, 38, 0.02) 100%)', 'linear-gradient(135deg, rgba(248, 113, 113, 0.12) 0%, rgba(248, 113, 113, 0.03) 100%)'),
94
+ major: cssManager.bdTheme('linear-gradient(135deg, rgba(185, 28, 28, 0.10) 0%, rgba(185, 28, 28, 0.03) 100%)', 'linear-gradient(135deg, rgba(239, 68, 68, 0.15) 0%, rgba(239, 68, 68, 0.04) 100%)'),
95
+ maintenance: cssManager.bdTheme('linear-gradient(135deg, rgba(37, 99, 235, 0.08) 0%, rgba(37, 99, 235, 0.02) 100%)', 'linear-gradient(135deg, rgba(96, 165, 250, 0.12) 0%, rgba(96, 165, 250, 0.03) 100%)')
96
+ };
97
+ // Glassmorphism styles
98
+ export const glass = {
99
+ light: 'background: rgba(255, 255, 255, 0.7); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);',
100
+ dark: 'background: rgba(9, 9, 11, 0.8); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);',
101
+ subtle: cssManager.bdTheme('background: rgba(255, 255, 255, 0.5); backdrop-filter: blur(8px);', 'background: rgba(9, 9, 11, 0.6); backdrop-filter: blur(8px);')
102
+ };
103
+ // Status glow shadows
104
+ export const statusGlows = {
105
+ operational: '0 0 20px -5px rgba(34, 197, 94, 0.4)',
106
+ degraded: '0 0 20px -5px rgba(251, 191, 36, 0.4)',
107
+ partial: '0 0 20px -5px rgba(248, 113, 113, 0.4)',
108
+ major: '0 0 20px -5px rgba(239, 68, 68, 0.5)',
109
+ maintenance: '0 0 20px -5px rgba(96, 165, 250, 0.4)'
110
+ };
111
+ export const commonStyles = css `
112
+ /* Button styles */
113
+ .button {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ font-family: ${unsafeCSS(fonts.base)};
118
+ font-size: 13px;
119
+ font-weight: 500;
120
+ height: 36px;
121
+ padding: 0 14px;
122
+ border-radius: ${unsafeCSS(borderRadius.base)};
123
+ border: 1px solid ${colors.border.default};
124
+ background: ${colors.background.primary};
125
+ color: ${colors.text.primary};
126
+ cursor: pointer;
127
+ user-select: none;
128
+ transition: all ${unsafeCSS(durations.normal)} ${unsafeCSS(easings.default)};
129
+ gap: 6px;
130
+ white-space: nowrap;
131
+ letter-spacing: -0.01em;
132
+ }
133
+
134
+ .button:hover {
135
+ background: ${colors.background.secondary};
136
+ border-color: ${cssManager.bdTheme('#d4d4d8', '#3f3f46')};
137
+ box-shadow: ${unsafeCSS(shadows.xs)};
138
+ }
139
+
140
+ .button:active {
141
+ transform: scale(0.98);
142
+ transition-duration: ${unsafeCSS(durations.fast)};
143
+ }
144
+
145
+ .button:focus-visible {
146
+ outline: 2px solid ${colors.accent.focus};
147
+ outline-offset: 2px;
148
+ }
149
+
150
+ .button.primary {
151
+ background: ${colors.accent.primary};
152
+ color: ${colors.background.primary};
153
+ border-color: transparent;
154
+ }
155
+
156
+ .button.primary:hover {
157
+ background: ${colors.accent.hover};
158
+ box-shadow: ${unsafeCSS(shadows.sm)};
159
+ }
160
+
161
+ .button.ghost {
162
+ background: transparent;
163
+ border-color: transparent;
164
+ }
165
+
166
+ .button.ghost:hover {
167
+ background: ${colors.background.muted};
168
+ }
169
+
170
+ .button.sm {
171
+ height: 32px;
172
+ padding: 0 12px;
173
+ font-size: 12px;
174
+ }
175
+
176
+ .button.lg {
177
+ height: 44px;
178
+ padding: 0 20px;
179
+ font-size: 15px;
180
+ }
181
+
182
+ /* Card styles */
183
+ .card {
184
+ background: ${colors.background.card};
185
+ border: 1px solid ${colors.border.default};
186
+ border-radius: ${unsafeCSS(borderRadius.lg)};
187
+ padding: ${unsafeCSS(spacing.lg)};
188
+ box-shadow: ${unsafeCSS(shadows.sm)};
189
+ transition: all ${unsafeCSS(durations.normal)} ${unsafeCSS(easings.default)};
190
+ }
191
+
192
+ .card:hover {
193
+ border-color: ${colors.border.muted};
194
+ box-shadow: ${unsafeCSS(shadows.base)};
195
+ }
196
+
197
+ .card.interactive {
198
+ cursor: pointer;
199
+ }
200
+
201
+ .card.interactive:hover {
202
+ transform: translateY(-2px);
203
+ box-shadow: ${unsafeCSS(shadows.md)};
204
+ }
205
+
206
+ /* Loading skeleton */
207
+ .skeleton {
208
+ background: ${cssManager.bdTheme('linear-gradient(90deg, #f4f4f5 0%, #e4e4e7 50%, #f4f4f5 100%)', 'linear-gradient(90deg, #18181b 0%, #27272a 50%, #18181b 100%)')};
209
+ background-size: 200% 100%;
210
+ animation: skeleton-loading 1.5s ease-in-out infinite;
211
+ border-radius: ${unsafeCSS(borderRadius.base)};
212
+ }
213
+
214
+ @keyframes skeleton-loading {
215
+ 0% { background-position: 200% 0; }
216
+ 100% { background-position: -200% 0; }
217
+ }
218
+
219
+ /* Pulse animation for status indicators */
220
+ @keyframes pulse {
221
+ 0%, 100% { opacity: 1; }
222
+ 50% { opacity: 0.5; }
223
+ }
224
+
225
+ /* Pulse ring animation for active status */
226
+ @keyframes pulse-ring {
227
+ 0% {
228
+ transform: scale(1);
229
+ opacity: 0.8;
230
+ }
231
+ 100% {
232
+ transform: scale(2.5);
233
+ opacity: 0;
234
+ }
235
+ }
236
+
237
+ /* Shimmer effect for loading states */
238
+ @keyframes shimmer {
239
+ 0% {
240
+ background-position: -200% 0;
241
+ }
242
+ 100% {
243
+ background-position: 200% 0;
244
+ }
245
+ }
246
+
247
+ /* Fade in animation */
248
+ @keyframes fadeIn {
249
+ from { opacity: 0; transform: translateY(4px); }
250
+ to { opacity: 1; transform: translateY(0); }
251
+ }
252
+
253
+ .fade-in {
254
+ animation: fadeIn ${unsafeCSS(durations.slow)} ${unsafeCSS(easings.default)} forwards;
255
+ }
256
+
257
+ /* Fade in up animation */
258
+ @keyframes fadeInUp {
259
+ from {
260
+ opacity: 0;
261
+ transform: translateY(16px);
262
+ }
263
+ to {
264
+ opacity: 1;
265
+ transform: translateY(0);
266
+ }
267
+ }
268
+
269
+ .fade-in-up {
270
+ animation: fadeInUp ${unsafeCSS(durations.slower)} ${unsafeCSS(easings.default)} forwards;
271
+ }
272
+
273
+ /* Scale in animation */
274
+ @keyframes scaleIn {
275
+ from { opacity: 0; transform: scale(0.95); }
276
+ to { opacity: 1; transform: scale(1); }
277
+ }
278
+
279
+ .scale-in {
280
+ animation: scaleIn ${unsafeCSS(durations.slow)} ${unsafeCSS(easings.bounce)} forwards;
281
+ }
282
+
283
+ /* Slide down animation for expanding content */
284
+ @keyframes slideDown {
285
+ from {
286
+ opacity: 0;
287
+ transform: translateY(-8px);
288
+ }
289
+ to {
290
+ opacity: 1;
291
+ transform: translateY(0);
292
+ }
293
+ }
294
+
295
+ .slide-down {
296
+ animation: slideDown ${unsafeCSS(durations.slow)} ${unsafeCSS(easings.default)} forwards;
297
+ }
298
+
299
+ /* Stagger animation delay utilities */
300
+ .stagger-1 { animation-delay: 50ms; }
301
+ .stagger-2 { animation-delay: 100ms; }
302
+ .stagger-3 { animation-delay: 150ms; }
303
+ .stagger-4 { animation-delay: 200ms; }
304
+ .stagger-5 { animation-delay: 250ms; }
305
+
306
+ /* Status indicator with pulse ring */
307
+ .status-dot-animated {
308
+ position: relative;
309
+ width: 10px;
310
+ height: 10px;
311
+ border-radius: 50%;
312
+ }
313
+
314
+ .status-dot-animated::before {
315
+ content: '';
316
+ position: absolute;
317
+ inset: 0;
318
+ border-radius: 50%;
319
+ background: inherit;
320
+ animation: pulse-ring 2s ${unsafeCSS(easings.default)} infinite;
321
+ }
322
+
323
+ .status-dot-animated.operational::before {
324
+ background: ${colors.status.operational};
325
+ }
326
+
327
+ .status-dot-animated.degraded::before,
328
+ .status-dot-animated.partial_outage::before,
329
+ .status-dot-animated.major_outage::before {
330
+ animation: pulse-ring 1.5s ${unsafeCSS(easings.default)} infinite;
331
+ }
332
+
333
+ /* Hover lift effect */
334
+ .hover-lift {
335
+ transition: transform ${unsafeCSS(durations.normal)} ${unsafeCSS(easings.default)},
336
+ box-shadow ${unsafeCSS(durations.normal)} ${unsafeCSS(easings.default)};
337
+ }
338
+
339
+ .hover-lift:hover {
340
+ transform: translateY(-2px);
341
+ }
342
+
343
+ /* Icon animation */
344
+ .icon-spin {
345
+ animation: spin 1s linear infinite;
346
+ }
347
+
348
+ @keyframes spin {
349
+ from { transform: rotate(0deg); }
350
+ to { transform: rotate(360deg); }
351
+ }
352
+
353
+ /* Bounce animation for attention */
354
+ @keyframes bounce {
355
+ 0%, 100% { transform: translateY(0); }
356
+ 50% { transform: translateY(-4px); }
357
+ }
358
+
359
+ .bounce {
360
+ animation: bounce 1s ${unsafeCSS(easings.bounce)} infinite;
361
+ }
362
+
363
+ /* Container styles */
364
+ .container {
365
+ max-width: 1200px;
366
+ margin: 0 auto;
367
+ padding: 0 ${unsafeCSS(spacing.lg)};
368
+ }
369
+
370
+ /* Status pill */
371
+ .status-pill {
372
+ display: inline-flex;
373
+ align-items: center;
374
+ gap: 6px;
375
+ padding: 4px 10px;
376
+ border-radius: ${unsafeCSS(borderRadius.full)};
377
+ font-size: 12px;
378
+ font-weight: 500;
379
+ letter-spacing: 0.01em;
380
+ }
381
+
382
+ .status-pill .status-dot {
383
+ width: 6px;
384
+ height: 6px;
385
+ border-radius: 50%;
386
+ flex-shrink: 0;
387
+ }
388
+
389
+ .status-pill.operational {
390
+ background: ${cssManager.bdTheme('rgba(22, 163, 74, 0.1)', 'rgba(34, 197, 94, 0.15)')};
391
+ color: ${cssManager.bdTheme('#15803d', '#4ade80')};
392
+ }
393
+
394
+ .status-pill.operational .status-dot {
395
+ background: ${colors.status.operational};
396
+ }
397
+
398
+ .status-pill.degraded {
399
+ background: ${cssManager.bdTheme('rgba(217, 119, 6, 0.1)', 'rgba(251, 191, 36, 0.15)')};
400
+ color: ${cssManager.bdTheme('#b45309', '#fcd34d')};
401
+ }
402
+
403
+ .status-pill.degraded .status-dot {
404
+ background: ${colors.status.degraded};
405
+ }
406
+
407
+ .status-pill.partial_outage,
408
+ .status-pill.major_outage {
409
+ background: ${cssManager.bdTheme('rgba(220, 38, 38, 0.1)', 'rgba(248, 113, 113, 0.15)')};
410
+ color: ${cssManager.bdTheme('#b91c1c', '#fca5a5')};
411
+ }
412
+
413
+ .status-pill.partial_outage .status-dot,
414
+ .status-pill.major_outage .status-dot {
415
+ background: ${colors.status.major};
416
+ }
417
+
418
+ .status-pill.maintenance {
419
+ background: ${cssManager.bdTheme('rgba(37, 99, 235, 0.1)', 'rgba(96, 165, 250, 0.15)')};
420
+ color: ${cssManager.bdTheme('#1d4ed8', '#93c5fd')};
421
+ }
422
+
423
+ .status-pill.maintenance .status-dot {
424
+ background: ${colors.status.maintenance};
425
+ }
426
+
427
+ /* Responsive utilities */
428
+ @media (max-width: 1024px) {
429
+ .container {
430
+ padding: 0 ${unsafeCSS(spacing.md)};
431
+ }
432
+ }
433
+
434
+ @media (max-width: 640px) {
435
+ .container {
436
+ padding: 0 ${unsafeCSS(spacing.md)};
437
+ }
438
+
439
+ .button {
440
+ height: 40px;
441
+ padding: 0 16px;
442
+ }
443
+
444
+ .button.sm {
445
+ height: 36px;
446
+ }
447
+ }
448
+
449
+ /* Visually hidden (for accessibility) */
450
+ .sr-only {
451
+ position: absolute;
452
+ width: 1px;
453
+ height: 1px;
454
+ padding: 0;
455
+ margin: -1px;
456
+ overflow: hidden;
457
+ clip: rect(0, 0, 0, 0);
458
+ white-space: nowrap;
459
+ border: 0;
460
+ }
461
+ `;
462
+ export const getStatusColor = (status) => {
463
+ switch (status) {
464
+ case 'operational':
465
+ return colors.status.operational;
466
+ case 'degraded':
467
+ return colors.status.degraded;
468
+ case 'partial_outage':
469
+ return colors.status.partial;
470
+ case 'major_outage':
471
+ return colors.status.major;
472
+ case 'maintenance':
473
+ return colors.status.maintenance;
474
+ default:
475
+ return colors.text.secondary;
476
+ }
477
+ };
478
+ export const getStatusIcon = (status) => {
479
+ switch (status) {
480
+ case 'operational':
481
+ return '✓';
482
+ case 'degraded':
483
+ return '!';
484
+ case 'partial_outage':
485
+ return '⚠';
486
+ case 'major_outage':
487
+ return '✕';
488
+ case 'maintenance':
489
+ return '🔧';
490
+ default:
491
+ return '?';
492
+ }
493
+ };
494
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLnN0eWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9zdHlsZXMvc2hhcmVkLnN0eWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUc7SUFDbkIsSUFBSSxFQUFFLGlLQUFpSztJQUN2SyxJQUFJLEVBQUUsc0dBQXNHO0NBQzdHLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUc7SUFDcEIsb0JBQW9CO0lBQ3BCLFVBQVUsRUFBRTtRQUNWLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7UUFDakQsU0FBUyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUNuRCxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO1FBQy9DLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7UUFDOUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztLQUNuRDtJQUVELGdCQUFnQjtJQUNoQixNQUFNLEVBQUU7UUFDTixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO1FBQ2pELEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7UUFDL0MsTUFBTSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztLQUNqRDtJQUVELGNBQWM7SUFDZCxJQUFJLEVBQUU7UUFDSixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO1FBQ2pELFNBQVMsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7UUFDbkQsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztLQUNoRDtJQUVELHlDQUF5QztJQUN6QyxNQUFNLEVBQUU7UUFDTixXQUFXLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO1FBQ3JELFFBQVEsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7UUFDbEQsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUNqRCxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO1FBQy9DLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7S0FDdEQ7SUFFRCx5Q0FBeUM7SUFDekMsTUFBTSxFQUFFO1FBQ04sT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUNqRCxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO1FBQy9DLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7S0FDaEQ7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHO0lBQ3JCLEVBQUUsRUFBRSxpQ0FBaUM7SUFDckMsRUFBRSxFQUFFLHFFQUFxRTtJQUN6RSxJQUFJLEVBQUUsd0VBQXdFO0lBQzlFLEVBQUUsRUFBRSx5RUFBeUU7SUFDN0UsRUFBRSxFQUFFLDBFQUEwRTtJQUM5RSxFQUFFLEVBQUUsOEVBQThFO0lBQ2xGLEtBQUssRUFBRSx1Q0FBdUM7SUFDOUMsSUFBSSxFQUFFLHNDQUFzQztDQUM3QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHO0lBQzFCLEVBQUUsRUFBRSxLQUFLO0lBQ1QsRUFBRSxFQUFFLEtBQUs7SUFDVCxJQUFJLEVBQUUsS0FBSztJQUNYLEVBQUUsRUFBRSxLQUFLO0lBQ1QsRUFBRSxFQUFFLE1BQU07SUFDVixFQUFFLEVBQUUsTUFBTTtJQUNWLEtBQUssRUFBRSxNQUFNO0lBQ2IsSUFBSSxFQUFFLFFBQVE7Q0FDZixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHO0lBQ3JCLEVBQUUsRUFBRSxLQUFLO0lBQ1QsRUFBRSxFQUFFLEtBQUs7SUFDVCxFQUFFLEVBQUUsTUFBTTtJQUNWLEVBQUUsRUFBRSxNQUFNO0lBQ1YsRUFBRSxFQUFFLE1BQU07SUFDVixLQUFLLEVBQUUsTUFBTTtJQUNiLEtBQUssRUFBRSxNQUFNO0lBQ2IsS0FBSyxFQUFFLE1BQU07Q0FDZCxDQUFDO0FBRUYsb0JBQW9CO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRztJQUNyQixPQUFPLEVBQUUsOEJBQThCO0lBQ3ZDLE1BQU0sRUFBRSw4QkFBOEI7SUFDdEMsTUFBTSxFQUFFLHdDQUF3QztJQUNoRCxNQUFNLEVBQUUsNEJBQTRCO0lBQ3BDLE1BQU0sRUFBRSx5Q0FBeUM7Q0FDbEQsQ0FBQztBQUVGLFlBQVk7QUFDWixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUc7SUFDdkIsT0FBTyxFQUFFLE1BQU07SUFDZixJQUFJLEVBQUUsT0FBTztJQUNiLE1BQU0sRUFBRSxPQUFPO0lBQ2YsSUFBSSxFQUFFLE9BQU87SUFDYixNQUFNLEVBQUUsT0FBTztJQUNmLE9BQU8sRUFBRSxPQUFPO0NBQ2pCLENBQUM7QUFFRixtQ0FBbUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzdCLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUM3QixtRkFBbUYsRUFDbkYsbUZBQW1GLENBQ3BGO0lBQ0QsUUFBUSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQzFCLG1GQUFtRixFQUNuRixxRkFBcUYsQ0FDdEY7SUFDRCxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FDekIsbUZBQW1GLEVBQ25GLHVGQUF1RixDQUN4RjtJQUNELEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxDQUN2QixtRkFBbUYsRUFDbkYsbUZBQW1GLENBQ3BGO0lBQ0QsV0FBVyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQzdCLG1GQUFtRixFQUNuRixxRkFBcUYsQ0FDdEY7Q0FDRixDQUFDO0FBRUYsdUJBQXVCO0FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRztJQUNuQixLQUFLLEVBQUUseUdBQXlHO0lBQ2hILElBQUksRUFBRSxvR0FBb0c7SUFDMUcsTUFBTSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQ3hCLG1FQUFtRSxFQUNuRSw4REFBOEQsQ0FDL0Q7Q0FDRixDQUFDO0FBRUYsc0JBQXNCO0FBQ3RCLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRztJQUN6QixXQUFXLEVBQUUsc0NBQXNDO0lBQ25ELFFBQVEsRUFBRSx1Q0FBdUM7SUFDakQsT0FBTyxFQUFFLHdDQUF3QztJQUNqRCxLQUFLLEVBQUUsc0NBQXNDO0lBQzdDLFdBQVcsRUFBRSx1Q0FBdUM7Q0FDckQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUE7Ozs7OzttQkFNWixTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQzs7Ozs7cUJBS25CLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO3dCQUN6QixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU87a0JBQzNCLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTzthQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU87OztzQkFHVixTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDOzs7Ozs7O2tCQU83RCxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVM7b0JBQ3pCLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztrQkFDMUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Ozs7OzJCQUtaLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDOzs7O3lCQUkzQixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUs7Ozs7O2tCQUsxQixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU87YUFDMUIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPOzs7OztrQkFLcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLO2tCQUNuQixTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzs7Ozs7Ozs7O2tCQVNyQixNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQWlCdkIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJO3dCQUNoQixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU87cUJBQ3hCLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2VBQ2hDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2tCQUNsQixTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztzQkFDakIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQzs7OztvQkFJM0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLO2tCQUNyQixTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzs7Ozs7Ozs7O2tCQVN2QixTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzs7Ozs7a0JBS3JCLFVBQVUsQ0FBQyxPQUFPLENBQzlCLCtEQUErRCxFQUMvRCwrREFBK0QsQ0FDaEU7OztxQkFHZ0IsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7d0JBMkN6QixTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OzBCQWdCckQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQzs7Ozs7Ozs7Ozt5QkFVMUQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OzsyQkFnQnBELFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrQkF3Qm5ELFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDOzs7O2tCQUl2QyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVc7Ozs7OztpQ0FNVixTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQzs7Ozs7NEJBSy9CLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7NkJBQ3hELFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQkF3QjNELFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDOzs7Ozs7O2lCQU9uQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzs7Ozs7Ozs7O3FCQVNqQixTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7a0JBYy9CLFVBQVUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUseUJBQXlCLENBQUM7YUFDNUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDOzs7O2tCQUluQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVc7Ozs7a0JBSXpCLFVBQVUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsMEJBQTBCLENBQUM7YUFDN0UsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDOzs7O2tCQUluQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVE7Ozs7O2tCQUt0QixVQUFVLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLDJCQUEyQixDQUFDO2FBQzlFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQzs7Ozs7a0JBS25DLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSzs7OztrQkFJbkIsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSwwQkFBMEIsQ0FBQzthQUM3RSxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7Ozs7a0JBSW5DLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVzs7Ozs7O21CQU14QixTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzs7Ozs7O21CQU1yQixTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXlCdkMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFO0lBQy9DLFFBQVEsTUFBTSxFQUFFLENBQUM7UUFDZixLQUFLLGFBQWE7WUFDaEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUNuQyxLQUFLLFVBQVU7WUFDYixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2hDLEtBQUssZ0JBQWdCO1lBQ25CLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDL0IsS0FBSyxjQUFjO1lBQ2pCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDN0IsS0FBSyxhQUFhO1lBQ2hCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDbkM7WUFDRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ2pDLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRTtJQUM5QyxRQUFRLE1BQU0sRUFBRSxDQUFDO1FBQ2YsS0FBSyxhQUFhO1lBQ2hCLE9BQU8sR0FBRyxDQUFDO1FBQ2IsS0FBSyxVQUFVO1lBQ2IsT0FBTyxHQUFHLENBQUM7UUFDYixLQUFLLGdCQUFnQjtZQUNuQixPQUFPLEdBQUcsQ0FBQztRQUNiLEtBQUssY0FBYztZQUNqQixPQUFPLEdBQUcsQ0FBQztRQUNiLEtBQUssYUFBYTtZQUNoQixPQUFPLElBQUksQ0FBQztRQUNkO1lBQ0UsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyxDQUFDIn0=