PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.5
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.5
1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 0.8.8 0.8.7 All 34 releases
desktop-mode / assets / css / station-home.css

station-home.css in OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin 1.1.5, at assets/css/station-home.css

802 lines 20.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*
2 * Station Home — Editorial Flight Deck.
3 *
4 * The selected Imagegen direction sets the hierarchy and proportion. This
5 * stylesheet translates it to live, theme-aware DOM: one identity mesh, no
6 * card shadows, generous editorial rhythm, and a compact top-band fallback.
7 */
8
9 .desktop-mode-station-home {
10 container: station-home / inline-size;
11 box-sizing: border-box;
12 block-size: 100%;
13 inline-size: 100%;
14 min-block-size: 0;
15 min-inline-size: 0;
16 position: relative;
17 overflow: hidden;
18 background: var( --os-ui-bg, #1a1721 );
19 color: var( --os-ui-fg, #fffbff );
20 font-family: var( --os-font, 'Geist', system-ui, sans-serif );
21 }
22
23 .os-station-home__layout {
24 display: grid;
25 grid-template-columns: 270px minmax( 0, 1fr );
26 block-size: 100%;
27 inline-size: 100%;
28 min-block-size: 0;
29 min-inline-size: 0;
30 }
31
32 .desktop-mode-station-home [hidden] {
33 display: none !important;
34 }
35
36 .os-station-home__rail {
37 display: flex;
38 flex-direction: column;
39 min-block-size: 0;
40 position: relative;
41 isolation: isolate;
42 overflow: hidden;
43 padding: 30px 22px 24px;
44 border-inline-end: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
45 background: var( --os-ui-surface-sunken, #0c0b0f );
46 }
47
48 .os-station-home__brand,
49 .os-station-home__location,
50 .os-station-home__actions {
51 position: relative;
52 z-index: 1;
53 }
54
55 .os-station-home__brand {
56 display: flex;
57 align-items: center;
58 gap: 12px;
59 font-size: 16px;
60 font-weight: 660;
61 letter-spacing: -0.02em;
62 }
63
64 .os-station-home__brand-mark {
65 display: block;
66 inline-size: 36px;
67 block-size: 36px;
68 border-radius: 10px;
69 }
70
71 .os-station-home__location {
72 display: flex;
73 align-items: center;
74 gap: 9px;
75 margin-block-start: 34px;
76 color: var( --os-ui-fg-muted, #b3afb5 );
77 font: 550 12px/1.2 var( --os-ui-font-mono, 'Geist Mono', monospace );
78 letter-spacing: 0.08em;
79 text-transform: uppercase;
80 }
81
82 .os-station-home__location > span {
83 inline-size: 7px;
84 block-size: 7px;
85 border-radius: 50%;
86 background: var( --os-ui-accent, #f252fc );
87 box-shadow: 0 0 0 4px color-mix( in srgb, var( --os-ui-accent, #f252fc ) 15%, transparent );
88 }
89
90 .os-station-home__mesh {
91 position: absolute;
92 z-index: 0;
93 /*
94 * The aurora fills the rail; the gradient stops place it, not the
95 * element box. Sizing the box to the shape is what gave this an
96 * outline to find, and an outline is what made people read a
97 * mascot in it.
98 */
99 inset: 0;
100 /*
101 * Read through the kit's themeable name, NOT `--os-mesh-holo`.
102 * A theme that suppresses the meshes sets every `--os-mesh-*` to
103 * `none`; because the property IS declared, the literal below
104 * would never fire and this would paint nothing at all rather
105 * than a quieter self.
106 *
107 * `--os-ui-hero-mesh` rather than `--os-ui-holo-fill` because
108 * this is a field, not a control. See the token's note in
109 * `variables.css` for why a field carries its alpha in the stops.
110 */
111 background: var( --os-ui-hero-mesh, radial-gradient( ellipse 38% 26% at 24% 20%, rgba( 170, 103, 255, 0.55 ) 0%, rgba( 170, 103, 255, 0 ) 72% ) );
112 /*
113 * No `opacity` here. The strength is in the stops, so dimming the
114 * whole layer would only pull every hue back toward the surface
115 * behind it — the exact thing this token exists to avoid. The
116 * mask fades the two ends so the field never meets the brand mark
117 * above it or the quick actions below on a hard line.
118 */
119 mask-image: linear-gradient( to bottom, transparent, #000 9%, #000 88%, transparent );
120 }
121
122 .os-station-home__actions {
123 display: grid;
124 gap: 6px;
125 margin-block-start: auto;
126 }
127
128 .os-station-home__action {
129 box-sizing: border-box;
130 min-block-size: 48px;
131 inline-size: 100%;
132 }
133
134 a.os-station-home__action {
135 display: flex;
136 align-items: center;
137 gap: 12px;
138 padding: 11px 12px;
139 border: 1px solid transparent;
140 border-radius: 8px;
141 color: var( --os-ui-fg, #fffbff );
142 font-size: 14px;
143 font-weight: 570;
144 line-height: 1.2;
145 text-decoration: none;
146 }
147
148 /*
149 * Hover and focus are scoped to the LINKS.
150 *
151 * A quick action is an `<a>` when it navigates and an `<os-button>`
152 * when it calls into the shell, which is not a difference the user
153 * has any business seeing — the five rows are one list. Left
154 * unscoped, these two rules land on the component hosts as well and
155 * stack on top of the chrome the kit already draws: the host's
156 * background paints under a shadow button that is separately painting
157 * `--os-ui-button-bg-hover`, so two low-alpha films compound and the
158 * component-backed rows hover visibly darker than their neighbours;
159 * and the host's `box-shadow` doubles the focus ring the button draws
160 * from the same token. `border-color` on a host is simply dead — no
161 * border-width or style there to recolour.
162 *
163 * So the links keep these, and the buttons are matched through the
164 * `--os-ui-button-*` tokens below instead.
165 */
166 a.os-station-home__action:hover {
167 background: var( --os-ui-hover, rgba( 255, 251, 255, 0.08 ) );
168 border-color: var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
169 }
170
171 a.os-station-home__action:focus-visible {
172 outline: none;
173 box-shadow: var( --os-ui-focus-ring, 0 0 0 2px #0c0b0f, 0 0 0 4px #f252fc );
174 }
175
176 os-button.os-station-home__action {
177 --os-ui-button-padding: 11px 12px;
178 --os-ui-button-min-height: 48px;
179 --os-ui-button-border: 1px solid transparent;
180 --os-ui-button-bg: transparent;
181 --os-ui-button-fg: var( --os-ui-fg, #fffbff );
182 --os-ui-button-bg-hover: var( --os-ui-hover, rgba( 255, 251, 255, 0.08 ) );
183 --os-ui-button-border-radius: 8px;
184 /*
185 * Quiet the iridescent layers for these two.
186 *
187 * Every `<os-button>` carries `os-holo-edge os-holo-sheen` on its
188 * inner button whatever the variant, so a ghost button in this
189 * list lights a gradient hairline and a hover film that its three
190 * `<a>` siblings have no way to match. The hairline is a genuine
191 * 1px all the way round — `holoEdge` builds it from `padding: 1px`
192 * and `mask-composite: exclude` — but it is painted with a 124deg
193 * gradient running 0.85 alpha at one end and 0.6 at the other, so
194 * it reads as changing WIDTH around the corner. In a row of five
195 * it just looks like two of them are wrong.
196 *
197 * Quieted here rather than in the component: the edge is exactly
198 * right for a button that stands on its own, and the holographic
199 * state is meant to be spent on identity moments, not on every
200 * item in a nav list. The `:active` glint and ring stay — those
201 * are press feedback, not resting chrome.
202 */
203 --os-ui-holo-edge: none;
204 --os-ui-holo-edge-quiet: none;
205 --os-ui-holo-sheen: none;
206 text-align: start;
207 }
208
209 /*
210 * Left-align the row, and match the links' icon gap.
211 *
212 * `<os-button>` centres its content — right for a button, wrong for a
213 * nav row, and invisible until `fill-cell` gives the button a width
214 * bigger than its label to centre WITHIN. The result is two rows that
215 * look indented against three that start at the padding edge.
216 *
217 * Neither justification nor gap has a `--os-ui-button-*` token, so
218 * this goes through `::part( button )`, which the component documents
219 * as an author hook for exactly this. `text-align` on the host cannot
220 * do it — the content is laid out by flex, which `text-align` does
221 * not reach.
222 */
223 os-button.os-station-home__action::part( button ) {
224 justify-content: flex-start;
225 gap: 12px;
226 }
227
228 /*
229 * The border the `<a>` rule gets from `border-color`, which cannot
230 * reach a component host. The shadow button reads this token, so the
231 * hairline appears on hover exactly as it does on the links.
232 */
233 os-button.os-station-home__action:hover {
234 --os-ui-button-border: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
235 }
236
237 .os-station-home__action .dashicons {
238 flex: 0 0 20px;
239 font-size: 20px;
240 }
241
242 .os-station-home__main {
243 min-block-size: 0;
244 min-inline-size: 0;
245 overflow: auto;
246 padding: clamp( 30px, 4vw, 54px ) clamp( 30px, 4.5vw, 64px ) 52px;
247 scrollbar-gutter: stable;
248 }
249
250 .os-station-home__intro {
251 display: flex;
252 align-items: flex-start;
253 justify-content: space-between;
254 gap: 24px;
255 padding-block-end: clamp( 42px, 6vh, 68px );
256 }
257
258 .os-station-home__intro h1 {
259 margin: 0;
260 max-inline-size: 780px;
261 font-size: clamp( 40px, 5.1vw, 68px );
262 font-weight: 710;
263 line-height: 0.98;
264 letter-spacing: -0.055em;
265 }
266
267 .os-station-home__intro p {
268 margin: 16px 0 0;
269 color: var( --os-ui-fg-muted, #b3afb5 );
270 font-size: clamp( 16px, 1.6vw, 20px );
271 line-height: 1.5;
272 }
273
274 .os-station-home__refresh {
275 flex: 0 0 auto;
276 --os-ui-button-padding: 10px;
277 --os-ui-button-min-height: 44px;
278 }
279
280 .os-station-home__error {
281 margin-block-end: 28px;
282 padding: 12px 14px;
283 border-inline-start: 3px solid var( --os-ui-danger, #ff8585 );
284 background: color-mix( in srgb, var( --os-ui-danger, #ff8585 ) 8%, transparent );
285 color: var( --os-ui-fg, #fffbff );
286 font-size: 14px;
287 }
288
289 .os-station-home__section + .os-station-home__section {
290 margin-block-start: clamp( 42px, 6vh, 64px );
291 }
292
293 .os-station-home__section > h2,
294 .os-station-home__section-heading > h2 {
295 margin: 0 0 15px;
296 color: var( --os-ui-fg-muted, #b3afb5 );
297 font: 600 12px/1.2 var( --os-ui-font-mono, 'Geist Mono', monospace );
298 letter-spacing: 0.09em;
299 text-transform: uppercase;
300 }
301
302 .os-station-home__section-heading {
303 display: flex;
304 align-items: center;
305 justify-content: space-between;
306 gap: 18px;
307 margin-block-end: 15px;
308 }
309
310 .os-station-home__section-heading > h2 {
311 margin-block-end: 0;
312 }
313
314 .os-station-home__section-heading > os-button {
315 --os-ui-button-padding: 7px 10px;
316 --os-ui-button-min-height: 36px;
317 }
318
319 .os-station-home__work {
320 border-block-start: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
321 }
322
323 .os-station-home__work-row {
324 display: grid;
325 grid-template-columns: 44px minmax( 0, 1fr ) auto minmax( 72px, auto ) 20px;
326 align-items: center;
327 gap: 16px;
328 min-block-size: 76px;
329 padding: 10px 4px;
330 border-block-end: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
331 color: inherit;
332 text-decoration: none;
333 }
334
335 .os-station-home__work-row:hover {
336 background: linear-gradient( 90deg, var( --os-ui-hover, rgba( 255, 251, 255, 0.05 ) ), transparent );
337 }
338
339 .os-station-home__work-row:focus-visible,
340 .os-station-home__attention-row:focus-visible {
341 outline: 2px solid var( --os-ui-accent, #f252fc );
342 outline-offset: 3px;
343 }
344
345 .os-station-home__row-icon {
346 display: grid;
347 place-items: center;
348 inline-size: 38px;
349 block-size: 38px;
350 border: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
351 border-radius: 9px;
352 color: var( --os-ui-accent-soft-fg, #ec9bff );
353 }
354
355 .os-station-home__row-copy,
356 .os-station-home__row-meta {
357 display: block;
358 min-inline-size: 0;
359 }
360
361 .os-station-home__row-title {
362 display: block;
363 overflow: hidden;
364 font-size: clamp( 17px, 1.7vw, 22px );
365 font-weight: 620;
366 /*
367 * `overflow: hidden` clips to the LINE BOX, not the glyphs, and
368 * `line-height: normal` is a font-metrics number that several
369 * families set tighter than their own descender depth. Every
370 * `g`, `p`, `y` and `j` then loses its tail — legibly enough to
371 * pass a glance and wrong in every screenshot. The overflow is
372 * here for the ellipsis, so the line box has to be told to make
373 * room rather than left to the font.
374 */
375 line-height: 1.35;
376 letter-spacing: -0.025em;
377 text-overflow: ellipsis;
378 white-space: nowrap;
379 }
380
381 .os-station-home__row-meta,
382 .os-station-home__work-row os-relative-time {
383 margin-block-start: 4px;
384 color: var( --os-ui-fg-muted, #b3afb5 );
385 font: 500 12px/1.3 var( --os-ui-font-mono, 'Geist Mono', monospace );
386 }
387
388 .os-station-home__work-row > .dashicons {
389 color: var( --os-ui-fg-faint, #66636b );
390 }
391
392 .os-station-home__work os-empty-state {
393 min-block-size: 176px;
394 border-block-end: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
395 }
396
397 .os-station-home__pulse {
398 display: grid;
399 grid-template-columns: repeat( 4, minmax( 0, 1fr ) );
400 border-block: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
401 }
402
403 .os-station-home__metric {
404 min-inline-size: 0;
405 padding: 22px 22px 24px;
406 }
407
408 .os-station-home__metric + .os-station-home__metric {
409 border-inline-start: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
410 }
411
412 .os-station-home__metric-label {
413 display: flex;
414 align-items: center;
415 gap: 8px;
416 min-inline-size: 0;
417 color: var( --os-ui-fg-muted, #b3afb5 );
418 font-size: 13px;
419 }
420
421 .os-station-home__metric-label span:last-child {
422 overflow: hidden;
423 /* Same descender clip as `__row-title`; see the note there. */
424 line-height: 1.35;
425 text-overflow: ellipsis;
426 white-space: nowrap;
427 }
428
429 .os-station-home__metric strong {
430 display: block;
431 margin-block-start: 16px;
432 font: 680 clamp( 30px, 3.2vw, 42px )/1 var( --os-ui-font-mono, 'Geist Mono', monospace );
433 letter-spacing: -0.05em;
434 }
435
436 .os-station-home__attention {
437 border-block-start: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
438 }
439
440 .os-station-home__attention-row,
441 .os-station-home__all-clear {
442 display: grid;
443 grid-template-columns: 64px minmax( 0, 1fr ) 20px;
444 align-items: center;
445 gap: 16px;
446 min-block-size: 72px;
447 padding: 10px 4px;
448 border-block-end: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
449 color: inherit;
450 text-decoration: none;
451 }
452
453 .os-station-home__attention-row:hover {
454 background: linear-gradient( 90deg, var( --os-ui-hover, rgba( 255, 251, 255, 0.05 ) ), transparent );
455 }
456
457 .os-station-home__attention-count {
458 display: flex;
459 align-items: center;
460 gap: 8px;
461 color: var( --os-ui-warning, #f7c66b );
462 }
463
464 .os-station-home__attention-count strong {
465 font: 680 18px/1 var( --os-ui-font-mono, 'Geist Mono', monospace );
466 }
467
468 .os-station-home__attention-copy,
469 .os-station-home__all-clear > span {
470 display: grid;
471 gap: 4px;
472 min-inline-size: 0;
473 }
474
475 .os-station-home__attention-copy > span,
476 .os-station-home__all-clear > span > span {
477 color: var( --os-ui-fg-muted, #b3afb5 );
478 font-size: 13px;
479 line-height: 1.4;
480 }
481
482 .os-station-home__all-clear {
483 grid-template-columns: 44px minmax( 0, 1fr );
484 }
485
486 .os-station-home__all-clear > .dashicons {
487 color: var( --os-ui-success, #9be8ba );
488 font-size: 26px;
489 }
490
491 .os-station-home__cards {
492 display: grid;
493 grid-template-columns: repeat( auto-fit, minmax( 220px, 1fr ) );
494 border-block-start: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
495 border-inline-start: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
496 }
497
498 .os-station-home__card {
499 --_card-tone: var( --os-ui-accent-soft-fg, #ec9bff );
500 display: flex;
501 flex-direction: column;
502 min-block-size: 218px;
503 min-inline-size: 0;
504 padding: 22px;
505 border-inline-end: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
506 border-block-end: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
507 box-shadow: inset 0 2px 0 color-mix( in srgb, var( --_card-tone ) 68%, transparent );
508 color: inherit;
509 text-decoration: none;
510 }
511
512 .os-station-home__card[ data-tone='info' ] {
513 --_card-tone: var( --os-ui-info, #c2f1f1 );
514 }
515
516 .os-station-home__card[ data-tone='success' ] {
517 --_card-tone: var( --os-ui-success, #9be8ba );
518 }
519
520 .os-station-home__card[ data-tone='warning' ] {
521 --_card-tone: var( --os-ui-warning, #f7c66b );
522 }
523
524 .os-station-home__card[ data-tone='danger' ] {
525 --_card-tone: var( --os-ui-danger, #ff8585 );
526 }
527
528 a.os-station-home__card:hover {
529 background: var( --os-ui-hover, rgba( 255, 251, 255, 0.05 ) );
530 }
531
532 a.os-station-home__card:focus-visible {
533 position: relative;
534 z-index: 1;
535 outline: 2px solid var( --os-ui-accent, #f252fc );
536 outline-offset: -3px;
537 }
538
539 .os-station-home__card-head {
540 display: flex;
541 align-items: center;
542 gap: 11px;
543 min-inline-size: 0;
544 }
545
546 .os-station-home__card-icon {
547 display: grid;
548 place-items: center;
549 flex: 0 0 38px;
550 inline-size: 38px;
551 block-size: 38px;
552 border: 1px solid color-mix( in srgb, var( --_card-tone ) 42%, transparent );
553 border-radius: 9px;
554 color: var( --_card-tone );
555 }
556
557 .os-station-home__card-icon > img {
558 display: block;
559 max-inline-size: 24px;
560 max-block-size: 24px;
561 object-fit: contain;
562 }
563
564 .os-station-home__card-head > span:last-child {
565 display: grid;
566 gap: 3px;
567 min-inline-size: 0;
568 }
569
570 .os-station-home__card-head strong {
571 overflow: hidden;
572 font-size: 15px;
573 /* Same descender clip as `__row-title`; see the note there. */
574 line-height: 1.35;
575 text-overflow: ellipsis;
576 white-space: nowrap;
577 }
578
579 .os-station-home__card-head > span:last-child > span {
580 overflow: hidden;
581 color: var( --os-ui-fg-muted, #b3afb5 );
582 font: 500 11px/1.3 var( --os-ui-font-mono, 'Geist Mono', monospace );
583 text-overflow: ellipsis;
584 text-transform: uppercase;
585 white-space: nowrap;
586 }
587
588 .os-station-home__card-value {
589 display: block;
590 margin-block-start: 26px;
591 font: 690 clamp( 30px, 3.2vw, 44px )/1 var( --os-ui-font-mono, 'Geist Mono', monospace );
592 letter-spacing: -0.055em;
593 }
594
595 .os-station-home__card-detail {
596 display: block;
597 margin-block-start: 9px;
598 color: var( --os-ui-fg-muted, #b3afb5 );
599 font-size: 13px;
600 line-height: 1.45;
601 }
602
603 .os-station-home__card-action {
604 display: flex;
605 align-items: center;
606 justify-content: space-between;
607 gap: 12px;
608 margin-block-start: auto;
609 padding-block-start: 22px;
610 color: var( --_card-tone );
611 font-size: 12px;
612 font-weight: 620;
613 }
614
615 .os-station-home__cards-empty {
616 display: grid;
617 grid-column: 1 / -1;
618 grid-template-columns: 44px minmax( 0, 1fr );
619 align-items: center;
620 gap: 16px;
621 min-block-size: 92px;
622 padding: 14px 18px;
623 border-inline-end: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
624 border-block-end: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
625 }
626
627 .os-station-home__cards-empty > .dashicons {
628 color: var( --os-ui-accent-soft-fg, #ec9bff );
629 font-size: 26px;
630 }
631
632 .os-station-home__cards-empty > span {
633 display: grid;
634 gap: 4px;
635 }
636
637 .os-station-home__cards-empty > span > span,
638 .os-station-home__card-modal-intro {
639 color: var( --os-ui-fg-muted, #b3afb5 );
640 font-size: 13px;
641 line-height: 1.45;
642 }
643
644 .os-station-home__card-modal-intro {
645 margin: 0 0 18px;
646 }
647
648 .os-station-home__card-preferences {
649 display: grid;
650 gap: 1px;
651 overflow: hidden;
652 border: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
653 border-radius: 10px;
654 background: var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
655 }
656
657 .os-station-home__card-preferences > os-switch {
658 padding: 14px;
659 background: var( --os-ui-surface, #1a1721 );
660 }
661
662 .os-station-home__loading {
663 position: absolute;
664 z-index: 3;
665 inset: 0;
666 display: grid;
667 place-content: center;
668 justify-items: center;
669 gap: 12px;
670 background: color-mix( in srgb, var( --os-ui-bg, #1a1721 ) 92%, transparent );
671 color: var( --os-ui-fg-muted, #b3afb5 );
672 font-size: 13px;
673 }
674
675 @container station-home ( max-width: 820px ) {
676 .os-station-home__layout {
677 grid-template-columns: 1fr;
678 grid-template-rows: auto minmax( 0, 1fr );
679 }
680
681 .os-station-home__rail {
682 display: grid;
683 grid-template-columns: auto auto minmax( 0, 1fr );
684 align-items: center;
685 gap: 18px;
686 padding: 14px 18px;
687 border-inline-end: 0;
688 border-block-end: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
689 }
690
691 .os-station-home__location,
692 .os-station-home__actions {
693 margin-block-start: 0;
694 }
695
696 .os-station-home__mesh {
697 /*
698 * The rail is a top band here, so the field fills that
699 * instead and the fade turns to run along it. No `opacity`
700 * override: the base rule dropped it, and re-introducing it
701 * would knock the aurora's chroma back down.
702 */
703 inset: 0;
704 mask-image: linear-gradient( 90deg, transparent, #000 24%, #000 76%, transparent );
705 }
706
707 .os-station-home__actions {
708 display: flex;
709 justify-content: flex-end;
710 gap: 3px;
711 min-inline-size: 0;
712 overflow-x: auto;
713 }
714
715 .os-station-home__action {
716 flex: 0 0 auto;
717 inline-size: auto;
718 min-block-size: 44px;
719 }
720
721 a.os-station-home__action {
722 padding: 10px;
723 }
724
725 .os-station-home__action > span:last-child {
726 position: absolute;
727 inline-size: 1px;
728 block-size: 1px;
729 margin: -1px;
730 overflow: hidden;
731 clip-path: inset( 50% );
732 white-space: nowrap;
733 }
734 }
735
736 @container station-home ( max-width: 620px ) {
737 .os-station-home__rail {
738 grid-template-columns: auto minmax( 0, 1fr );
739 }
740
741 .os-station-home__location {
742 display: none;
743 }
744
745 .os-station-home__main {
746 padding: 28px 22px 40px;
747 }
748
749 .os-station-home__intro h1 {
750 font-size: clamp( 34px, 9vw, 48px );
751 }
752
753 .os-station-home__work-row {
754 grid-template-columns: 40px minmax( 0, 1fr ) auto 20px;
755 gap: 11px;
756 }
757
758 .os-station-home__work-row os-relative-time {
759 display: none;
760 }
761
762 .os-station-home__pulse {
763 grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
764 }
765
766 .os-station-home__cards {
767 grid-template-columns: 1fr;
768 }
769
770 .os-station-home__metric:nth-child( 3 ) {
771 border-inline-start: 0;
772 }
773
774 .os-station-home__metric:nth-child( n + 3 ) {
775 border-block-start: 1px solid var( --os-ui-border, rgba( 255, 251, 255, 0.12 ) );
776 }
777 }
778
779 @media ( prefers-reduced-motion: reduce ) {
780 .os-station-home__work-row,
781 .os-station-home__attention-row,
782 .os-station-home__action {
783 scroll-behavior: auto;
784 transition: none;
785 }
786 }
787
788 @media ( forced-colors: active ) {
789 .os-station-home__mesh {
790 display: none;
791 }
792
793 .os-station-home__rail,
794 .os-station-home__work-row,
795 .os-station-home__pulse,
796 .os-station-home__metric,
797 .os-station-home__attention-row,
798 .os-station-home__all-clear {
799 border-color: CanvasText;
800 }
801 }
802