/* ALYSSIUN OS — Mobile interface. A sibling of public/desktop/, sharing no
   layout code with it. Tokens below are the exact values from the mobile
   interface spec; they intentionally do not reuse --desktop-* variables. */

:root[data-alyssiun-atmosphere="lux"] {
  --aos-m-bg: linear-gradient(180deg, #ffffff, #eceef3 52%, #dfe3ea);
  --aos-m-text: #0e1018;
  --aos-m-muted: #5c6273;
  --aos-m-faint: #949aab;
  --aos-m-glass: rgba(255, 255, 255, .66);
  --aos-m-glass-2: rgba(255, 255, 255, .86);
  --aos-m-app-surface: rgba(248, 249, 252, .93);
  --aos-m-solid: rgba(250, 251, 253, .97);
  --aos-m-edge: rgba(255, 255, 255, .9);
  --aos-m-hair: rgba(14, 18, 34, .09);
  --aos-m-ink: #0e1018;
  --aos-m-ink-on: #fff;
  --aos-m-shadow-s: 0 2px 10px rgba(20, 26, 50, .06);
  --aos-m-shadow: 0 14px 40px rgba(20, 26, 50, .10);
  --aos-m-shadow-l: 0 30px 80px rgba(20, 26, 50, .16);
  --aos-m-dim: rgba(14, 18, 34, .28);
  --aos-m-green: #34c759;
  --aos-m-danger: #c8392f;
  --aos-m-danger-soft: rgba(200, 57, 47, .1);
  --aos-m-wordmark: url("data:image/png;base64,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");
}

:root[data-alyssiun-atmosphere="neo"] {
  --aos-m-bg: linear-gradient(180deg, #04050c, #020308 52%, #000000);
  --aos-m-text: #f2f4fb;
  --aos-m-muted: #9aa2b8;
  --aos-m-faint: #616a80;
  --aos-m-glass: rgba(255, 255, 255, .055);
  --aos-m-glass-2: rgba(255, 255, 255, .1);
  --aos-m-app-surface: rgba(6, 8, 15, .93);
  --aos-m-solid: rgba(7, 9, 16, .96);
  --aos-m-edge: rgba(255, 255, 255, .14);
  --aos-m-hair: rgba(255, 255, 255, .08);
  --aos-m-ink: #ffffff;
  --aos-m-ink-on: #05070e;
  --aos-m-shadow-s: 0 2px 10px rgba(0, 0, 0, .4);
  --aos-m-shadow: 0 16px 44px rgba(0, 0, 0, .55);
  --aos-m-shadow-l: 0 34px 90px rgba(0, 0, 0, .7);
  --aos-m-dim: rgba(0, 0, 0, .55);
  --aos-m-green: #86e0c0;
  --aos-m-danger: #ff6b61;
  --aos-m-danger-soft: rgba(255, 107, 97, .14);
  --aos-m-wordmark: url("data:image/png;base64,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");
}

.aos-mobile-shell {
  position: fixed;
  inset: 0;
  z-index: 500;
  /* An interface switch remounts the shell in place; this soft entrance is the
     switch's whole transition — same quiet fade language as the transfer moment. */
  animation: aos-mobile-shell-in .3s ease;
  /* clip, not hidden: hidden makes the shell a scroll container, and a focus()
     inside a card the switcher has parked off-screen would scroll the whole
     shell sideways to reveal it. clip cannot scroll. */
  overflow: clip;
  background: var(--aos-m-bg);
  color: var(--aos-m-text);
  font-family: var(--brand-font, -apple-system, system-ui, sans-serif);
  padding-top: env(safe-area-inset-top);
  /* No bottom padding here: the bottom safe area is applied ONCE, by whatever
     owns the bottom edge (the fixed bar's own inset, or the home's last line). */
  padding-bottom: 0;
  padding-left: env(safe-area-inset-left);
  padding-right: env(safe-area-inset-right);
}

@keyframes aos-mobile-shell-in { from { opacity: 0; } }

@media (prefers-reduced-motion: reduce) {
  .aos-mobile-shell { animation: none; }
}

/* Its own layer, fixed to the screen behind everything: the large viewport's
   height (constant while the address bar shows or hides), anchored at the top,
   so neither a bounce nor the browser chrome moves or resizes it. */
.aos-mobile-wallpaper {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100vh;
  height: 100lvh;
  z-index: 0;
  background-position: center;
  pointer-events: none;
  transform: translateZ(0);
}

/* LUX: soft glow at the top. NEO: a horizon line + glow near the bottom. */
:root[data-alyssiun-atmosphere="lux"] .aos-mobile-wallpaper::before {
  content: "";
  position: absolute;
  inset: -20% -20% auto -20%;
  height: 60%;
  background: radial-gradient(ellipse at top, rgba(255, 255, 255, .9), rgba(255, 255, 255, 0) 70%);
}

:root[data-alyssiun-atmosphere="neo"] .aos-mobile-wallpaper::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 24%;
  height: 1px;
  background: rgba(150, 185, 235, .5);
  box-shadow: 0 0 60px 20px rgba(150, 185, 235, .5);
}

:root[data-alyssiun-atmosphere="neo"] .aos-mobile-wallpaper::after {
  content: "";
  position: absolute;
  left: 10%;
  right: 10%;
  bottom: 0;
  height: 30%;
  background: radial-gradient(ellipse at bottom, rgba(90, 120, 200, .28), rgba(0, 0, 0, 0) 70%);
}

.aos-mobile-home {
  position: relative;
  z-index: 1;
  /* The fixed bottom bar, when chosen, takes the strip below (--os-inset-bottom). */
  height: calc(100% - var(--os-inset-bottom, 0px));
  overflow-y: auto;
  /* The content area is the one thing that scrolls; it never hands its
     overscroll to the page. */
  overscroll-behavior: contain;
  display: flex;
  flex-direction: column;
  /* 62px top clearance keeps the header below the interface pill
     (which sits ~10-50px under the shell's own safe-area padding-top). */
  /* The bottom: 16px under the footer, plus only the room the bottom edge really
     needs: the floating Λ where it sits over the column (--aos-m-lambda-clear,
     mobile-lambda-clear.js), or the phone's safe area; nothing with the fixed
     bar, which the home already ends above. */
  padding: 62px 20px max(calc(16px + max(var(--aos-m-lambda-clear, 0px), env(safe-area-inset-bottom, 0px) - var(--os-inset-bottom, 0px))), var(--aos-m-fab-clear, 0px));
  transition: opacity .34s ease, transform .48s cubic-bezier(.2, .86, .26, 1);
}
/* Streaming mode on (os-round-10 T6): the STREAMING MODE label (interface-pill.js) has its own band
   under the header, so it never sits over the orb or anything else on the home. */
:root[data-alyssiun-streaming="on"] .aos-mobile-home { padding-top: 96px; }

/* With the floating Λ the Help & Support icon stands alone in the bottom right corner
   (os/bar/bar-support.js): the home's last line ends above it instead of running underneath it. */
:root:has(.aos-bar-support.is-floating) .aos-mobile-shell {
  --aos-m-fab-clear: calc(64px + env(safe-area-inset-bottom, 0px));
}

/* Centred column so the phone layout reads correctly on a wide desktop
   browser: the scroll container (.aos-mobile-home) stays full width, its
   content stops growing past a comfortable line length and centres itself. */
.aos-mobile-home-inner {
  width: 100%;
  max-width: 680px;
  margin: 0 auto;
  background: none;
  border: 0;
  box-shadow: none;
}

.aos-mobile-shell[data-app-open="true"] .aos-mobile-home {
  opacity: 0;
  pointer-events: none;
  transform: scale(.96);
}

/* While the switcher is open the live apps ARE the cards (os/switcher/
   live-preview.js): they stay on screen between the dim and the carousel,
   scaled onto their cards by a transform, and stop taking input. */
.aos-mobile-shell[data-switcher="true"] .aos-mobile-apps { pointer-events: none; }
/* Batch S: an app that is not on a card as itself (Streaming mode shows icon
   cards only) is not on screen behind the cards either. */
.aos-mobile-shell[data-switcher="true"] .aos-mobile-app:not(.is-previewing) { visibility: hidden; opacity: 0; transition: none; }

/* Behind the switcher the home stays on screen for context: dimmed by the
   backdrop below, blurred here. */
.aos-mobile-shell[data-switcher="true"] .aos-mobile-home {
  opacity: 1;
  transform: scale(.98);
  filter: blur(12px) saturate(.9);
  pointer-events: none;
  overflow: hidden;
}

/* --- The living header ------------------------------------------------------ */
.aos-mobile-avatar[hidden], .aos-mobile-signin[hidden] { display: none; }

/* The header now holds only the Active ID avatar (or Sign in), top RIGHT of
   the home (Task 7) — the same right edge as the fullscreen/display controls,
   stacked directly under them, so it never competes for room with the
   centred interface pill at any width down to a phone. The greeting moved
   into the ALY block. */
.aos-mobile-header {
  position: absolute;
  /* One header row on every device in the Mobile interface (Batch B2 T5): the
     ALYSSIUN mark top left, the interface pill centred, the avatar (or Sign
     in) top right with fullscreen just to its right. All 40px, all centred on
     the same line, measured from the full-width home, not the centred column. */
  top: 12px;
  right: calc(max(12px, env(safe-area-inset-right, 0px)) + 48px);
  z-index: 2;
  display: flex;
  align-items: center;
  min-width: 0;
  padding: 0;
  gap: 8px;
  background: none;
  border: 0;
  box-shadow: none;
}
/* Scrolled (mobile.js): fullscreen steps aside so it never covers what scrolls
   under its corner — the Apps view toggle above all. It returns at the top. */
.aos-mobile-shell .desktop-display-controls { transition: opacity .2s ease, visibility .2s; }
.aos-mobile-shell[data-home-scrolled="true"] .desktop-display-controls { opacity: 0; visibility: hidden; pointer-events: none; }
/* No fullscreen here (iPhone Safari): the avatar takes its corner. */
html[data-no-fullscreen] .aos-mobile-header { right: max(12px, env(safe-area-inset-right, 0px)); }
/* The row's pieces sit on the home itself, so the column never shifts them. */
.aos-mobile-home-inner { position: static; }
.aos-mobile-brand-slot {
  position: absolute;
  left: max(16px, env(safe-area-inset-left, 0px));
  top: 32px;
  transform: translateY(-50%);
  z-index: 2;
  display: flex;
  align-items: center;
}
.aos-mobile-aly { width: 100%; margin: 4px 0 26px; }

/* The ALYSSIUN mark, leading the header: opens the same About popup as the
   footer's "About Us" link (Task 5). The real wordmark asset, never drawn
   from type or a brand colour. */
.aos-mobile-brand {
  /* The mark keeps its size at every Size (os-round-10 T7), so it never runs into the centred pill. */
  width: min(30vw, 150px); min-width: 100px;
  height: 24px;
  background: var(--aos-m-wordmark) left center / contain no-repeat;
  border: 0;
  padding: 0;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: opacity .2s ease, transform .25s ease;
}
.aos-mobile-brand:active { transform: translateY(-2px); opacity: .85; }
@media (hover: hover) { .aos-mobile-brand:hover { opacity: .85; } }
.aos-mobile-brand:focus-visible { outline: 2px solid var(--aos-m-ink); outline-offset: 4px; }
@media (max-width: 360px) { .aos-mobile-brand { width: 100px; } }

.aos-mobile-avatar {
  width: 40px;
  height: 40px;
  border-radius: 999px;
  border: 1px solid var(--aos-m-edge);
  outline: 1px solid var(--aos-m-hair);
  outline-offset: -1px;
  background: var(--aos-m-glass-2) center / cover no-repeat;
  box-shadow: var(--aos-m-shadow);
  color: var(--aos-m-text);
  font: inherit;
  font-size: .92rem;
  font-weight: 500;
  letter-spacing: .04em;
  display: grid;
  place-items: center;
  cursor: pointer;
  -webkit-backdrop-filter: blur(18px) saturate(150%);
  backdrop-filter: blur(18px) saturate(150%);
  transition: transform .25s ease;
  -webkit-tap-highlight-color: transparent;
}
.aos-mobile-avatar:active { transform: translateY(-3px); }
@media (hover: hover) { .aos-mobile-avatar:hover { transform: translateY(-3px); } }
.aos-mobile-avatar:focus-visible { outline: 2px solid var(--aos-m-ink); outline-offset: 3px; }

.aos-mobile-signin {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  height: 40px;
  min-height: 40px;
  padding: 0 16px;
  border-radius: 999px;
  border: 1px solid var(--aos-m-edge);
  outline: 1px solid var(--aos-m-hair);
  outline-offset: -1px;
  background: var(--aos-m-ink);
  color: var(--aos-m-ink-on);
  font-size: .9rem;
  font-weight: 500;
  text-decoration: none;
  box-shadow: var(--aos-m-shadow);
  transition: transform .25s ease;
}
.aos-mobile-signin svg { width: 16px; height: 16px; }
@media (hover: hover) { .aos-mobile-signin:hover { transform: translateY(-3px); } }
.aos-mobile-signin:focus-visible { outline: 2px solid var(--aos-m-ink); outline-offset: 3px; }
/* A phone: the orb sits close to the top-left corner, so Sign in drops its
   arrow and tightens up to stay clear of it; on the narrowest phones it is a
   44px circle holding the arrow alone (the link keeps its "Sign in" name). */
@media (max-width: 480px) {
  .aos-mobile-signin { gap: 0; padding: 0 14px; font-size: .86rem; }
  .aos-mobile-signin svg { display: none; }
}
@media (max-width: 340px) {
  .aos-mobile-signin { width: 40px; padding: 0; justify-content: center; }
  .aos-mobile-signin span { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
  .aos-mobile-signin svg { display: block; }
}

/* The profile dropdown (Task 7): the exact same menu the Desktop panel shows
   (os/launcher/v1.js mountAccountMenu), mounted here as a sibling of the
   avatar. Its CSS lives in the launcher's own shadow-scoped stylesheet, which
   this page never loads, so the same rules are restated here against this
   page's own --aos-m-* tokens instead of v1.css's shadow-root ones. */
.aos-account-menu { position: absolute; right: 0; top: calc(100% + 10px); display: grid; width: 252px; padding: 8px; border: 1px solid var(--aos-m-hair); border-radius: 16px; background: var(--aos-m-solid); box-shadow: var(--aos-m-shadow-l); color: var(--aos-m-text); font-family: inherit; -webkit-backdrop-filter: blur(20px) saturate(150%); backdrop-filter: blur(20px) saturate(150%); }
.aos-account-menu[hidden] { display: none; }
/* The whole menu is always reachable (Batch K, K6): it scrolls inside the screen. */
.aos-account-menu { max-height: calc(100dvh - 84px - env(safe-area-inset-bottom)); overflow-y: auto; overscroll-behavior: contain; -webkit-overflow-scrolling: touch; z-index: 30; }
.aos-account-menu:has(.aos-id-switch:not([hidden])) { width: 272px; }
.aos-account-menu-item { display: flex; align-items: center; gap: 10px; width: 100%; height: 42px; padding: 0 10px; border: 0; border-radius: 10px; background: transparent; color: inherit; font: inherit; font-size: .82rem; font-weight: 650; text-align: left; text-decoration: none; cursor: pointer; }
/* os-fix-5 T1: hover styles only where there is a hover; a finger gets the pressed tint alone. */
.aos-account-menu-item:active { background: var(--aos-m-glass-2); }
@media (hover: hover) { .aos-account-menu-item:hover { background: var(--aos-m-glass-2); } }
/* A row with the focus (the Account row takes it as the menu opens): a soft highlight, not a thick outline (os-round-7 T6). */
.aos-account-menu-item:focus-visible { outline: none; background: var(--aos-m-glass-2); box-shadow: inset 0 0 0 1px var(--aos-m-hair); }
.aos-account-item-glyph { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 30px; height: 30px; border-radius: 9px; background: var(--aos-m-glass-2); color: var(--aos-m-muted); }
@media (hover: hover) { .aos-account-menu-item:hover .aos-account-item-glyph { color: var(--aos-m-text); } }
.aos-account-menu-label { margin: 2px 0 2px; padding: 0 10px; color: var(--aos-m-muted); font-size: .66rem; font-weight: 800; letter-spacing: .09em; text-transform: uppercase; }
.aos-account-menu-section { display: grid; gap: 1px; }
.aos-account-menu-section + .aos-account-menu-section { margin-top: 6px; padding-top: 10px; border-top: 1px solid var(--aos-m-hair); }
.aos-account-menu-section-logout { margin-top: 6px; padding-top: 10px; border-top: 1px solid var(--aos-m-hair); }
.aos-account-menu-logout { color: var(--aos-m-danger); }
.aos-account-menu-logout .aos-account-item-glyph { background: var(--aos-m-danger-soft); color: var(--aos-m-danger); }
.aos-account-menu-logout:active { background: var(--aos-m-danger-soft); }
@media (hover: hover) { .aos-account-menu-logout:hover { background: var(--aos-m-danger-soft); } }
.aos-id-switch { display: grid; gap: 1px; padding: 2px 0 8px; margin-bottom: 4px; border-bottom: 1px solid var(--aos-m-hair); }
.aos-id-switch[hidden] { display: none; }
.aos-id-current { position: relative; display: flex; align-items: center; gap: 10px; min-height: 48px; padding: 6px 4px 6px 10px; }
.aos-id-name { display: grid; min-width: 0; flex: 1 1 auto; }
.aos-id-name strong { font-size: .86rem; font-weight: 750; line-height: 1.25; white-space: normal; overflow-wrap: anywhere; }
.aos-id-name small, .aos-id-handle { color: var(--aos-m-muted); font-size: .7rem; opacity: .7; white-space: normal; overflow-wrap: anywhere; }
.aos-id-active-badge { flex: 0 0 auto; margin-left: auto; padding: 3px 9px; border-radius: 999px; background: var(--aos-m-glass-2); outline: 1px solid var(--aos-m-hair); font-size: .6rem; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; color: var(--aos-m-green); }
.aos-id-avatar { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 30px; height: 30px; border-radius: 999px; background: var(--aos-m-glass-2) center/cover no-repeat; border: 1px solid var(--aos-m-hair); font-size: .68rem; font-weight: 800; letter-spacing: .02em; color: var(--aos-m-text); overflow: hidden; }
.aos-id-list { display: grid; gap: 1px; padding: 2px 0 0; }
.aos-id-list[hidden] { display: none; }
.aos-id-switch.is-open .aos-accounts-chevron { transform: translateY(2px) rotate(-135deg); }
.aos-id-current .aos-id-active-badge { margin-left: 0; }
.aos-id-option { gap: 10px; height: 42px; }
.aos-id-option:disabled { opacity: .55; cursor: progress; }
.aos-id-option-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.aos-id-manage { height: 36px; font-size: .78rem; color: var(--aos-m-muted); }
.aos-id-manage .aos-account-item-glyph { width: 26px; height: 26px; }
.aos-id-note { margin: 2px 10px 0; color: var(--aos-m-muted); font-size: .68rem; }
.aos-id-note[hidden] { display: none; }
/* Accounts on this device (Batch I, I2), restated for this page like the rest. */
.aos-account-menu:has(.aos-accounts:not([hidden])) { width: 372px; max-width: calc(100vw - 24px); box-sizing: border-box; }
.aos-accounts { display: grid; gap: 2px; padding: 2px 0 8px; margin-bottom: 4px; border-bottom: 1px solid var(--aos-m-hair); }
.aos-accounts[hidden] { display: none; }
.aos-accounts-current { display: flex; align-items: center; gap: 10px; min-height: 48px; padding: 6px 4px 6px 10px; }
.aos-accounts-current .aos-id-avatar { width: 36px; height: 36px; font-size: .76rem; }
/* Night run, O1: the current account's own small Log out; the row packs tighter so its name and email keep their size. */
.aos-accounts-current { gap: 6px; }
/* Batch P, P1: smooth scroll inside the menu; the two summary rows open their lists. */
.aos-account-menu { scroll-behavior: smooth; touch-action: pan-y; align-content: start; }
.aos-menu-summary { border-radius: 12px; cursor: pointer; }
.aos-menu-summary:active { background: var(--aos-m-glass-2); }
.aos-id-current.aos-menu-summary { gap: 6px; }
.aos-id-current.aos-menu-summary .aos-id-avatar { width: 36px; height: 36px; font-size: .76rem; }
.aos-id-option .aos-accounts-check { margin-left: auto; }
.aos-accounts-who { display: grid; min-width: 0; flex: 1 1 auto; text-align: left; }
.aos-accounts-who strong { font-size: .86rem; font-weight: 750; line-height: 1.25; white-space: nowrap; overflow: hidden; }
.aos-accounts-email { font-size: .66rem; font-weight: 500; line-height: 1.3; color: var(--aos-m-muted); white-space: nowrap; overflow: hidden; }
.aos-eye-toggle { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 44px; height: 44px; padding: 0; border: 0; border-radius: 12px; background: transparent; color: var(--aos-m-muted); }
.aos-eye-toggle:active { background: var(--aos-m-glass-2); }
.aos-accounts-toggle { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 44px; height: 44px; padding: 0; border: 1px solid var(--aos-m-hair); border-radius: 12px; background: var(--aos-m-glass-2); color: var(--aos-m-muted); }
.aos-accounts-chevron { width: 8px; height: 8px; border-right: 1.8px solid currentColor; border-bottom: 1.8px solid currentColor; transform: translateY(-2px) rotate(45deg); }
.aos-accounts.is-open .aos-accounts-chevron { transform: translateY(2px) rotate(-135deg); }
.aos-accounts-list { display: grid; gap: 2px; padding: 4px 0 2px; }
.aos-accounts-list[hidden] { display: none; }
.aos-accounts-row { display: flex; align-items: center; gap: 4px; }
.aos-accounts-pick { flex: 1 1 auto; min-width: 0; height: auto; min-height: 48px; padding-top: 6px; padding-bottom: 6px; }
.aos-accounts-pick:disabled { opacity: .55; }
.aos-accounts-check { flex: 0 0 auto; margin-left: auto; color: var(--aos-m-green); font-weight: 800; }
.aos-accounts-logout { flex: 0 0 auto; min-width: 44px; height: 40px; padding: 0 10px; border: 0; border-radius: 10px; background: transparent; color: var(--aos-m-muted); font: inherit; font-size: .72rem; font-weight: 650; }
.aos-accounts-logout:active { background: var(--aos-m-danger-soft); color: var(--aos-m-danger); }
.aos-accounts-plus { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 30px; height: 30px; border-radius: 999px; background: var(--aos-m-glass-2); font-size: 1rem; font-weight: 600; }
.aos-accounts-add[aria-disabled="true"] { opacity: .5; }
/* Streaming mode switch (Batch K, K2), restated like the rest. */
.aos-streaming-item .aos-streaming-label { flex: 1 1 auto; }
/* Theme dropdown (os-fix-3 T2), restated like the rest: a row that opens a short list in place, hairline edges, no pill, no colour fill. */
.aos-theme-item { display: block; }
.aos-theme-label { flex: 1 1 auto; }
.aos-theme-value { flex: 0 0 auto; color: var(--aos-m-muted); font-size: .74rem; font-weight: 650; letter-spacing: .04em; }
.aos-theme-chevron { flex: 0 0 auto; width: 6px; height: 6px; margin: -3px 4px 0 2px; border-right: 1.5px solid var(--aos-m-muted); border-bottom: 1.5px solid var(--aos-m-muted); transform: rotate(45deg); }
.aos-theme-item.is-open .aos-theme-chevron { margin-top: 3px; transform: rotate(225deg); }
.aos-theme-list { display: grid; gap: 1px; margin: 0 0 0 27px; padding: 0; border-left: 1px solid var(--aos-m-hair); }
.aos-theme-item:not(.is-open) .aos-theme-opt { display: none; }
.aos-theme-item:not(.is-open) .aos-theme-list { border-left-color: transparent; }
.aos-theme-opt { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; height: 44px; padding: 0 10px 0 12px; border: 0; border-radius: 0 10px 10px 0; background: transparent; color: var(--aos-m-muted); font: inherit; font-size: .78rem; font-weight: 650; letter-spacing: .03em; text-align: left; cursor: pointer; appearance: none; -webkit-appearance: none; -webkit-tap-highlight-color: transparent; touch-action: manipulation; }
.aos-theme-opt:active { background: var(--aos-m-glass-2); }
.aos-theme-opt.is-on { color: var(--aos-m-text); }
.aos-theme-opt:focus-visible, .aos-theme-gear:focus-visible { outline: 2px solid var(--aos-m-ink); outline-offset: -2px; }
.aos-theme-check { visibility: hidden; color: var(--aos-m-text); font-size: .8rem; font-weight: 700; }
.aos-theme-opt.is-on .aos-theme-check { visibility: visible; }
.aos-theme-sched { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 44px; padding: 0 0 0 12px; color: var(--aos-m-muted); font-size: .7rem; font-weight: 550; letter-spacing: .02em; font-variant-numeric: tabular-nums; }
.aos-theme-sched[hidden] { display: none; }
.aos-theme-sched-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.aos-theme-gear { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 44px; height: 44px; border-radius: 10px; color: var(--aos-m-muted); text-decoration: none; }
.aos-theme-gear:active { background: var(--aos-m-glass-2); color: var(--aos-m-text); }
.aos-switch { position: relative; flex: 0 0 auto; width: 36px; height: 22px; border-radius: 999px; background: var(--aos-m-hair); }
.aos-switch-knob { position: absolute; left: 3px; top: 3px; width: 16px; height: 16px; border-radius: 999px; background: var(--aos-m-solid); box-shadow: 0 1px 3px rgba(0,0,0,.25); transition: transform .16s ease; }
.aos-streaming-item.is-on .aos-switch { background: var(--aos-m-green); }
.aos-streaming-item.is-on .aos-switch-knob { transform: translateX(14px); }

.aos-mobile-greeting {
  margin: 0;
  max-width: 100%;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  font-size: clamp(1.5rem, 6.4vw, 2.1rem);
  font-weight: 200;
  letter-spacing: -.02em;
  line-height: 1.15;
}

.aos-mobile-ask {
  margin: 14px 0 12px;
}

.aos-mobile-ask-input {
  width: 100%;
  padding: 14px 20px;
  border-radius: 999px;
  border: 1px solid var(--aos-m-edge);
  outline: 1px solid var(--aos-m-hair);
  outline-offset: -1px;
  background: var(--aos-m-glass);
  -webkit-backdrop-filter: blur(24px) saturate(150%);
  backdrop-filter: blur(24px) saturate(150%);
  box-shadow: var(--aos-m-shadow-s);
  color: var(--aos-m-text);
  font: inherit;
  font-size: .95rem;
  font-weight: 400;
}

.aos-mobile-ask-input::placeholder { color: var(--aos-m-faint); }
.aos-mobile-ask-input:focus { outline-color: var(--aos-m-ink); }

.aos-mobile-chips {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  padding-bottom: 4px;
  margin-bottom: 16px;
}

.aos-mobile-chip {
  flex: 0 0 auto;
  padding: 9px 16px;
  border-radius: 999px;
  border: 1px solid var(--aos-m-edge);
  outline: 1px solid var(--aos-m-hair);
  outline-offset: -1px;
  background: var(--aos-m-glass-2);
  color: var(--aos-m-text);
  font: inherit;
  font-size: .78rem;
  font-weight: 500;
  white-space: nowrap;
  cursor: pointer;
  -webkit-backdrop-filter: blur(18px) saturate(150%);
  backdrop-filter: blur(18px) saturate(150%);
  transition: transform .25s ease;
}

.aos-mobile-chip:active { transform: translateY(-3px); }
@media (hover: hover) {
  .aos-mobile-chip:hover { transform: translateY(-3px); }
}
.aos-mobile-chip:focus-visible { outline: 2px solid var(--aos-m-ink); outline-offset: 2px; }

/* The interface pill belongs to the home screen only: gone behind an open app
   (interface-pill.js isAppOpen) and while the open-apps view is showing. */
.aos-mobile-shell[data-switcher="true"] .aos-interface-pill { display: none; }
/* Inside the home's scroll container (mobile.js), which already starts below the
   shell's safe-area padding: sit 10px into its 62px top clearance and scroll with it. */
.aos-mobile-home > .aos-interface-pill { top: 12px; }

/* "Apps" on the left, the view toggle on the right: the desktop panel's head. */
.aos-mobile-grid-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin: 0 0 10px;
}
.aos-mobile-grid-head .aos-mobile-section-label { margin: 0; }
.aos-mobile-view-toggle {
  display: inline-grid;
  place-items: center;
  width: 36px;
  height: 36px;
  padding: 0;
  border: 1px solid var(--aos-m-hair);
  border-radius: 10px;
  background: var(--aos-m-glass);
  color: var(--aos-m-muted);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.aos-mobile-view-toggle svg { width: 17px; height: 17px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.aos-mobile-view-toggle:active { color: var(--aos-m-text); }
.aos-mobile-view-toggle:focus-visible { outline: 2px solid var(--aos-m-ink); outline-offset: 2px; }

.aos-mobile-section-label {
  margin: 0 0 10px;
  font-size: .7rem;
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--aos-m-muted);
}

.aos-mobile-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(64px, 1fr));
  gap: 18px 12px;
  padding-bottom: 24px;
}

/* The app list could not be resolved: an honest failed state in place of the
   grid (Settings alone stays, it is OS chrome and not part of the list). */
.aos-mobile-apps-error {
  grid-column: 1 / -1;
  margin: 4px 0 8px;
  color: var(--aos-m-muted);
  font-size: .86rem;
}

.aos-mobile-apps-retry {
  padding: 0;
  border: 0;
  background: none;
  color: var(--aos-m-text);
  font: inherit;
  font-weight: 650;
  text-decoration: underline;
  cursor: pointer;
}

/* The home screen's bottom links: the LAST thing in the apps list, in the
   home's own scroll flow — never fixed, never sticky. With many apps installed
   a person scrolls down to reach them, which is the intent.
     Help & Support            (centred, on its own row)
     About Us ......... Report (left and right of one row)
     the standard ALYSSIUN footer */
.aos-mobile-foot {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 18px;
  margin-top: 28px;
  padding: 22px 0 0;
  border-top: 1px solid var(--aos-m-hair);
}

.aos-mobile-foot-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; width: min(420px, 100%); }

.aos-mobile-foot-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  padding: 0 14px;
  border: 0;
  background: none;
  color: var(--aos-m-text);
  font: inherit;
  font-size: .84rem;
  font-weight: 600;
  letter-spacing: .01em;
  cursor: pointer;
}
.aos-mobile-foot-link:active { color: var(--aos-m-muted); }
.aos-mobile-foot-link:focus-visible { outline: 2px solid var(--aos-m-text); outline-offset: 2px; border-radius: 10px; }

/* The standard ALYSSIUN footer (os/launcher/footer-v1.js) closes the home. It
   stands on the wallpaper, so it takes the home's own ink and a soft halo to
   read on the brightest and the darkest wallpaper. */
.aos-mobile-brand-footer {
  --alyssiun-footer-padding: 6px 0 0;
  /* The room under the last line is the home's own bottom padding (one place, no second gap here). */
  margin-bottom: 0;
  color: var(--aos-m-text);
  text-shadow: 0 0 6px rgba(255, 255, 255, .8), 0 1px 0 rgba(255, 255, 255, .6);
}
:root[data-alyssiun-atmosphere="neo"] .aos-mobile-brand-footer { text-shadow: 0 0 6px rgba(0, 0, 0, .75), 0 1px 0 rgba(0, 0, 0, .55); }

.aos-mobile-support-btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-height: 44px;
  padding: 0 18px 0 15px;
  border: 1px solid var(--aos-m-hair);
  border-radius: 999px;
  background: var(--aos-m-glass);
  color: var(--aos-m-text);
  font: inherit;
  font-size: .84rem;
  font-weight: 600;
  letter-spacing: .01em;
  box-shadow: var(--aos-m-shadow-s);
  -webkit-backdrop-filter: blur(16px);
  backdrop-filter: blur(16px);
  cursor: pointer;
}

.aos-mobile-support-btn svg { color: var(--aos-m-muted); }
.aos-mobile-support-btn:active { background: var(--aos-m-glass-2); }
.aos-mobile-support-btn:focus-visible { outline: 2px solid var(--aos-m-text); outline-offset: 2px; }

.aos-mobile-tile {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  background: none;
  border: none;
  color: inherit;
  font: inherit;
  cursor: pointer;
  -webkit-touch-callout: none;
  user-select: none;
}

.aos-mobile-tile:focus-visible {
  outline: 2px solid var(--aos-m-ink);
  outline-offset: 3px;
  border-radius: 26px;
}

/* One icon style on mobile: the OS colour-icon contract (/os/icons/v1.css),
   the same gradient tile + white glyph the launcher and desktop draw. The
   wrapper only sets the size; the icon itself fills it. */
.aos-mobile-tile-icon {
  width: 56px;
  height: 56px;
  border-radius: 26px;
  display: block;
  transition: transform .25s ease;
}

.aos-mobile-tile-icon .desktop-app-icon {
  width: 100%;
  height: 100%;
  border-radius: inherit;
  display: grid;
  place-items: center;
  border: 1px solid transparent;
}

@media (hover: hover) {
  .aos-mobile-tile:hover .aos-mobile-tile-icon { transform: translateY(-3px); }
}

.aos-mobile-tile-icon svg,
.aos-mobile-tile-icon .desktop-app-icon svg { width: 50%; height: 50%; fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; }

.aos-mobile-tile-body { display: contents; }
.aos-mobile-tile-detail { display: none; }

/* List view: one row per app, icon + name + what it is. */
.aos-mobile-grid[data-view="list"] {
  grid-template-columns: 1fr;
  gap: 8px;
}
.aos-mobile-grid[data-view="list"] .aos-mobile-tile {
  flex-direction: row;
  gap: 14px;
  min-height: 60px;
  padding: 8px 12px;
  border: 1px solid var(--aos-m-hair);
  border-radius: 16px;
  background: var(--aos-m-glass);
  text-align: left;
}
.aos-mobile-grid[data-view="list"] .aos-mobile-tile-icon { width: 44px; height: 44px; border-radius: 14px; flex: none; }
.aos-mobile-grid[data-view="list"] .aos-mobile-tile-body { display: grid; gap: 2px; min-width: 0; }
.aos-mobile-grid[data-view="list"] .aos-mobile-tile-label {
  max-width: none; text-align: left; font-size: .92rem; font-weight: 600;
}
.aos-mobile-grid[data-view="list"] .aos-mobile-tile-detail {
  display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--aos-m-muted); font-size: .76rem;
}
.aos-mobile-grid[data-view="list"] .aos-mobile-tile:focus-visible { border-radius: 16px; }
@media (hover: hover) {
  .aos-mobile-grid[data-view="list"] .aos-mobile-tile:hover .aos-mobile-tile-icon { transform: none; }
}

.aos-mobile-tile-label {
  font-size: .68rem;
  font-weight: 400;
  text-align: center;
  max-width: 68px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* --- Full-screen apps ------------------------------------------------------ */
/* An app ends where the fixed bottom bar begins (0 while the bar is not on). */
.aos-mobile-apps { position: absolute; inset: 0 0 var(--os-inset-bottom, 0px); z-index: 2; pointer-events: none; }

.aos-mobile-app {
  position: absolute;
  inset: 0;
  display: none;
  opacity: 0;
  /* Hidden from hit-testing too: an app that was left stays mounted (its
     frame keeps running) but must never catch a tap meant for the home
     underneath it — a Settings pane sets its own pointer-events, so
     pointer-events: none on this container alone is not enough. */
  visibility: hidden;
  transform: scale(1.02);
  transition: opacity .34s ease, transform .48s cubic-bezier(.2, .86, .26, 1), visibility 0s linear .34s;
}

.aos-mobile-app.is-mounted { display: block; }
.aos-mobile-app.is-active { opacity: 1; visibility: visible; transform: none; pointer-events: auto; transition-delay: 0s; }

/* In the switcher every open app is on screen, live, scaled onto its card by
   an inline transform (live-preview.js sets .is-previewing) and clipped to the
   card's corners. The inline transition is the preview's own; none here. */
.aos-mobile-app.is-previewing {
  display: block;
  opacity: 1;
  visibility: visible;
  pointer-events: none;
  overflow: clip;
  border-radius: var(--aos-r-xl, 28px);
  box-shadow: var(--aos-m-shadow-l);
  will-change: transform, opacity;
  transform-origin: center center;
}
.aos-mobile-app.is-previewing iframe, .aos-mobile-app.is-previewing .mobile-settings-window { border-radius: inherit; }

/* Safe areas reach inside the apps from HERE, not from each app: the app's
   frame starts below the status bar / notch (and clear of a landscape notch),
   but runs all the way down to the bottom edge — a band left above the home
   indicator read as dead space under every app. Only the app's CONTENT is
   inset there: a cross-origin frame cannot be relied on to see
   env(safe-area-inset-*) — iOS hands every iframe 0 — so the OS sends the
   bottom inset over the embed handshake and the app's launcher publishes it
   as --alyssiun-safe-bottom for the app's bottom bars. Sized with calc(), not
   top+bottom: an absolutely positioned iframe is a replaced element and
   ignores `bottom` for its height. */
.aos-mobile-app { --aos-app-inset-top: env(safe-area-inset-top, 0px); --aos-app-inset-bottom: env(safe-area-inset-bottom, 0px);
  --aos-app-inset-left: env(safe-area-inset-left, 0px); --aos-app-inset-right: env(safe-area-inset-right, 0px);
  background: var(--aos-m-solid); }
.aos-mobile-app iframe, .aos-mobile-app .mobile-settings-window {
  position: absolute;
  top: var(--aos-app-inset-top);
  left: var(--aos-app-inset-left);
  width: calc(100% - var(--aos-app-inset-left) - var(--aos-app-inset-right));
  height: calc(100% - var(--aos-app-inset-top));
}
/* Help & Support is CRM's page, which knows nothing of the OS's insets: its
   composer sits on the very bottom edge, where Λ floats. So the frame ends
   above Λ's strip instead, and the send button can never sit under Λ. */
.aos-mobile-app[data-mobile-app-id="support"] iframe {
  /* 100px: Λ's 64px (os-round-7 T2; it was 56) on its ~34px floor, so the send button is never under it. */
  height: calc(100% - var(--aos-app-inset-top) - var(--aos-app-inset-bottom) - 100px);
}
/* With the fixed bottom bar (the default) Λ sits IN the bar and the app layer
   already ends on it, so that strip was an empty band between the message box
   and the bar: the chat runs down to the bar. The same while the on-screen
   keyboard is up (mobile-keyboard-fit.js): the frame ends on the keyboard. */
:root:has(.aos-bar) .aos-mobile-app[data-mobile-app-id="support"] iframe,
.aos-mobile-apps[data-keyboard] .aos-mobile-app[data-mobile-app-id="support"] iframe {
  height: calc(100% - var(--aos-app-inset-top));
}
/* The strip behind the status bar is the chat's own header colour (CRM's LUX /
   NEO surface), so the header reads as starting at the top of the screen. */
.aos-mobile-app[data-mobile-app-id="support"] { background: #fcfbf8; }
:root[data-alyssiun-atmosphere="neo"] .aos-mobile-app[data-mobile-app-id="support"] { background: #101720; }
/* Settings is the OS's own page, not a frame: it keeps the bottom inset, and
   (Batch J, J6) ends above Λ's strip like Help & Support, so Λ's default spot
   covers no row, label or control in any section, scrolled or not. */
.aos-mobile-app .mobile-settings-window { height: calc(100% - var(--aos-app-inset-top) - var(--aos-app-inset-bottom) - 92px); }
.aos-mobile-app iframe {
  display: block;
  border: 0;
  background: var(--aos-m-solid);
  /* Batch P, P3: a loading page stays see-through (themed background above) instead of solid white in NEO. */
  color-scheme: light;
}

/* Settings hosts the shared desktop settings window full-screen, chrome-free
   (inset like an app frame, above). */
.aos-mobile-app .mobile-settings-window {
  border: 0;
  border-radius: 0;
  overflow: hidden;
  background: var(--desktop-surface, var(--aos-m-solid));
}

.aos-mobile-app .mobile-settings-window .window-content {
  height: 100%;
}
/* os-round-10 T5: Settings on a phone is the whole screen between the status area and the bar, edge to
   edge: no card corners, no window padding, and with the fixed bar (Λ sits in it) no strip kept for Λ
   at the bottom, as for Help & Support above. The floating Λ keeps its strip. */
.aos-mobile-app .mobile-settings-window.mobile-settings-window { border-radius: 0; box-shadow: none; }
.aos-mobile-app .mobile-settings-window .window-content.window-content { padding: 0; }
:root:has(.aos-bar) .aos-mobile-app .mobile-settings-window { height: calc(100% - var(--aos-app-inset-top)); }

/* --- Switcher ---------------------------------------------------------------- */
/* Layers: home (1) -> backdrop dim (2) -> live apps (3) -> switcher frames + gestures (4). */
.aos-mobile-switcher-backdrop {
  position: absolute;
  inset: 0;
  z-index: 2;
  background: var(--aos-m-dim);
}
.aos-mobile-switcher-backdrop[hidden] { display: none; }
.aos-mobile-apps { z-index: 3; }

.aos-mobile-switcher {
  position: absolute;
  inset: 0 0 var(--os-inset-bottom, 0px);
  z-index: 4;
  background: transparent;
}

.aos-mobile-switcher[hidden] { display: none; }

/* aly-batch12 T8: while the switcher is up the fixed bottom bar steps away, with
   Λ seated in it and Help & Support at its end, so nothing lies over the cards
   or "Close all"; the switcher then reaches the bottom edge (Close all keeps the
   safe area, mobile-switcher.js). Both come back the moment it closes (at once:
   WebKit can leave a returning opacity transition stuck at 0). Opacity and
   visibility only: the bar's slide-in animation owns its transform. */
.aos-mobile-shell[data-switcher="true"] .aos-mobile-switcher { bottom: 0; }
:root:has(.aos-mobile-shell[data-switcher="true"]) .aos-bar {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity .16s ease, visibility 0s linear .16s;
}
:root:has(.aos-bar):has(.aos-mobile-shell[data-switcher="true"]) .aos-lambda-shell,
:root:has(.aos-mobile-shell[data-switcher="true"]) .aos-lambda.is-docked { visibility: hidden; pointer-events: none; }

.aos-mobile-switcher-stage {
  position: relative;
  width: 100%;
  height: 100%;
  touch-action: none;
}

/* The frame around a live card: the app itself renders underneath it. */
.aos-mobile-switcher-card {
  position: absolute;
  border-radius: 30px;
  border: 1px solid var(--aos-m-edge);
  outline: 1px solid var(--aos-m-hair);
  outline-offset: -1px;
  background: transparent;
  box-shadow: var(--aos-m-shadow-l);
  transform-origin: center;
  transition: transform .3s cubic-bezier(.2, .86, .26, 1), left .3s cubic-bezier(.2, .86, .26, 1), opacity .2s ease;
  will-change: transform, left;
  cursor: pointer;
}
.aos-mobile-switcher-stage.is-dragging .aos-mobile-switcher-card { transition: opacity .2s ease; }

.aos-mobile-switcher-head {
  position: absolute;
  left: 0;
  right: 0;
  top: -36px;
  height: 28px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  font-size: .8rem;
  font-weight: 500;
  color: var(--aos-m-text);
  white-space: nowrap;
  text-shadow: 0 1px 8px var(--aos-m-glass-2);
}
.aos-mobile-switcher-head-icon { width: 24px; height: 24px; flex: none; }
.aos-mobile-switcher-head-icon .desktop-app-icon {
  width: 24px; height: 24px; border-radius: 8px; display: grid; place-items: center; border: 1px solid transparent;
}
.aos-mobile-switcher-head-icon svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 2.6; stroke-linecap: round; stroke-linejoin: round; }
.aos-mobile-switcher-head-name { overflow: hidden; text-overflow: ellipsis; }

/* Before the app has loaded: an opaque surface with the app icon centred. */
.aos-mobile-switcher-placeholder { display: none; }
.aos-mobile-switcher-card.is-placeholder .aos-mobile-switcher-placeholder {
  display: grid;
  place-items: center;
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: var(--aos-m-app-surface);
}
.aos-mobile-switcher-placeholder .desktop-app-icon {
  width: 64px; height: 64px; border-radius: 26px; display: grid; place-items: center; border: 1px solid transparent;
}
.aos-mobile-switcher-placeholder svg { width: 32px; height: 32px; fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; }

/* The close button sits in the title row ABOVE the card, right-aligned, so it
   never covers the app's own header inside the card. 32px to see; the ::after
   widens the hit area to 48px (44+ on a scaled neighbour card) and stops short
   of the card's top edge. */
.aos-mobile-switcher-head { padding: 0 40px; }
.aos-mobile-switcher-close {
  position: absolute;
  top: -38px;
  right: 0;
  width: 32px;
  height: 32px;
  border-radius: 999px;
  border: 1px solid var(--aos-m-edge);
  outline: 1px solid var(--aos-m-hair);
  outline-offset: -1px;
  /* The solid surface, not glass: the card behind it is the app itself, which
     is usually light, so in NEO a glass button would vanish against it. */
  background: var(--aos-m-solid);
  color: var(--aos-m-text);
  box-shadow: var(--aos-m-shadow-s);
  display: grid;
  place-items: center;
  cursor: pointer;
}
.aos-mobile-switcher-close::after { content: ""; position: absolute; inset: -8px -8px -5px; border-radius: 999px; }

.aos-mobile-switcher-card:focus-visible,
.aos-mobile-switcher-close:focus-visible {
  outline: 2px solid var(--aos-m-ink);
  outline-offset: 2px;
}

/* --- Motion preference ------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  .aos-mobile-home, .aos-mobile-app, .aos-mobile-switcher-card, .aos-mobile-avatar {
    transition: none;
  }
}

/* Atmosphere change: colours cross over one second instead of snapping.
   theme-shell.js / the launcher set data-atmosphere-fading for that second. */
html[data-atmosphere-fading] *,
html[data-atmosphere-fading] *::before,
html[data-atmosphere-fading] *::after {
  transition: background-color 1s ease, color 1s ease, border-color 1s ease, fill 1s ease,
    stroke 1s ease, box-shadow 1s ease, outline-color 1s ease;
}
[data-wallpaper-ghost] { transition: opacity 1s ease; pointer-events: none; }
@media (prefers-reduced-motion: reduce) {
  html[data-atmosphere-fading] *, html[data-atmosphere-fading] *::before, html[data-atmosphere-fading] *::after,
  [data-wallpaper-ghost] { transition: none; }
}

/* --- Prompts (os-round-8 T3, mobile-prompts.js) ------------------------------- */
/* Install, Notifications and LIVE NOW on the home, one at a time (prompt-queue.js):
   a waiting one is kept out of sight, and none shows over an open app or the switcher. */
.mobile-prompts { position: fixed; inset: 0 0 var(--os-inset-bottom, 0px); z-index: 5; pointer-events: none; }
.mobile-prompts [data-prompt-waiting] { display: none !important; }
/* Seated on the bottom bar (fixed bar) or just above a floating Λ (--aos-m-lambda-clear), never under either. */
.mobile-prompts > .alerts-nudge { position: absolute; bottom: calc(12px + var(--aos-m-lambda-clear, 0px)); }
.mobile-prompts > .desktop-live-events { bottom: calc(12px + var(--aos-m-lambda-clear, 0px)); }
@media (max-width: 640px) {
  .mobile-prompts > .alerts-nudge { left: 8px; right: 8px; }
  .mobile-prompts .alerts-nudge-card { border-radius: 20px; border-bottom: 1px solid var(--desktop-border); padding-bottom: 16px; }
}
.aos-mobile-shell:is([data-app-open="true"], [data-switcher="true"]) .mobile-prompts { display: none; }
/* Where the card at the bottom would sit on ALY's type box (a short screen), it shows at the top instead. */
.mobile-prompts[data-place="top"] > :is(.alerts-nudge, .desktop-live-events) { top: calc(env(safe-area-inset-top, 0px) + 60px); bottom: auto; }

/* os-round-8 T6: a Store app whose server is paused for its payment keeps its tile, tagged "Paused". */
.aos-tile-paused { display: inline-block; width: max-content; margin: 2px auto 0; padding: 1px 7px; border: 1px solid currentColor; border-radius: 999px;
  font-size: .6rem; font-weight: 700; letter-spacing: .08em; line-height: 1.5; text-transform: uppercase; opacity: .72; }
.aos-mobile-grid[data-view="list"] .aos-tile-paused { margin: 2px 0 0; }

/* os-round-12 T0b: RECENT below the apps, the Desktop panel's section (mobile-recent.js) laid out for
   a phone: 2 cards a row on phones, 3 on tablets; a title takes up to two lines, broken between
   words (a long file name without spaces breaks where it must), and ends in an ellipsis after that. */
.aos-mobile-recent { margin: 4px 0 8px; }
.aos-mobile-recent[hidden] { display: none; }
.aos-mobile-recent .aos-recent-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 0 0 10px; }
.aos-mobile-recent .aos-recent-head .aos-mobile-section-label { margin: 0; }
.aos-mobile-recent .aos-recent-toggle { display: inline-flex; align-items: center; gap: 6px; min-height: 36px; padding: 4px 12px;
  border: 1px solid var(--aos-m-hair); border-radius: 999px; background: var(--aos-m-glass); color: var(--aos-m-muted);
  font: inherit; font-size: .68rem; font-weight: 650; letter-spacing: .06em; text-transform: uppercase; cursor: pointer;
  -webkit-tap-highlight-color: transparent; }
.aos-mobile-recent .aos-recent-toggle[hidden] { display: none; }
.aos-mobile-recent .aos-recent-toggle:active { color: var(--aos-m-text); }
.aos-mobile-recent .aos-recent-toggle:focus-visible { outline: 2px solid var(--aos-m-ink); outline-offset: 2px; }
.aos-mobile-recent .aos-recent-toggle svg { transition: transform .26s ease; }
.aos-mobile-recent.is-collapsed .aos-recent-toggle svg { transform: rotate(-90deg); }
.aos-mobile-recent .aos-recent-wrap { display: grid; grid-template-rows: 1fr; transition: grid-template-rows .28s cubic-bezier(.3,.1,.2,1); }
.aos-mobile-recent .aos-recent-inner { min-height: 0; overflow: hidden; opacity: 1; transition: opacity .22s ease; }
.aos-mobile-recent.is-collapsed .aos-recent-wrap { grid-template-rows: 0fr; }
.aos-mobile-recent.is-collapsed .aos-recent-inner { opacity: 0; }
.aos-mobile-recent.is-collapsed .aos-recent-head { margin-bottom: 0; }
.aos-mobile-recent .aos-recent-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; padding-bottom: 4px; }
@media (min-width: 700px) { .aos-mobile-recent .aos-recent-list { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.aos-mobile-recent .aos-recent-item { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; min-width: 0; min-height: 112px;
  padding: 12px; border: 1px solid var(--aos-m-hair); border-radius: 16px; background: var(--aos-m-glass); color: var(--aos-m-text);
  font: inherit; text-align: left; cursor: pointer; -webkit-tap-highlight-color: transparent; }
.aos-mobile-recent .aos-recent-item:active { background: var(--aos-m-glass-2, var(--aos-m-glass)); }
.aos-mobile-recent .aos-recent-item:focus-visible { outline: 2px solid var(--aos-m-ink); outline-offset: 2px; }
.aos-mobile-recent .aos-recent-icon { position: relative; flex: none; width: 34px; height: 34px; border-radius: 10px; display: grid; place-items: center; overflow: hidden; }
.aos-mobile-recent .aos-recent-icon svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; }
.aos-mobile-recent .aos-recent-text { display: grid; gap: 3px; width: 100%; min-width: 0; }
.aos-mobile-recent .aos-recent-text strong { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2;
  overflow: hidden; font-size: .86rem; font-weight: 650; line-height: 1.25; word-break: normal; overflow-wrap: anywhere; hyphens: auto; }
.aos-mobile-recent .aos-recent-text small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .74rem; color: var(--aos-m-muted); }

/* The file view a RECENT card opens (mobile-file-view.js), a full-screen Mobile app like Settings. */
.aos-mobile-app .window-content-mobile-file { display: flex; flex-direction: column; height: 100%; padding: 0; overflow: hidden; }
.aos-mobile-file { display: flex; flex-direction: column; flex: 1; min-height: 0; }
.aos-mobile-file-head { display: flex; align-items: center; gap: 10px; min-height: 52px; padding: 6px 12px; border-bottom: 1px solid var(--aos-m-hair); }
.aos-mobile-file-close { display: inline-grid; place-items: center; flex: none; width: 44px; height: 44px; padding: 0; border: 0; border-radius: 12px;
  background: transparent; color: var(--aos-m-text); cursor: pointer; -webkit-tap-highlight-color: transparent; }
.aos-mobile-file-close svg { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
.aos-mobile-file-close:focus-visible { outline: 2px solid var(--aos-m-ink); outline-offset: 2px; }
.aos-mobile-file-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .95rem; font-weight: 650; }
.aos-mobile-file .drive-file-preview { flex: 1; min-height: 0; overflow: auto; }
.aos-mobile-file .drive-file-actions { padding: 10px 12px calc(10px + env(safe-area-inset-bottom, 0px)); }
