PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.11
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.11
1.1.11 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 All 35 releases
desktop-mode / apps / station-home / station-home.css

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

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