/* T679 - Guest AI FAQ assistant widget - direction B "Linen" (owner-chosen 2026-09-12).
   A concierge's note on good paper: warm off-white surfaces, hairline rules instead of boxes for
   Anik's own words (a 2px accent rule marks the host's voice), the guest's words in ink capsules,
   a large serif name and a small-caps eyebrow, the peaks-and-river motif as the only ornament.

   SEMANTIC tokens only. The defaults below are the River Village ink+gold set; a per-app theme file
   (guest-assistant-theme.css on the Restaurant) overrides the VALUES on .gaw-root. This file is the
   shared/twin one - it must never carry a site-specific colour.
   Contrast rule: text on an accent surface uses --gaw-on-accent (ink); white text only on --gaw-ink.
   Every selector starts .gaw-; no inline styles, no external asset, no font CDN. */

.gaw-root {
    --gaw-ink: #1F1F1F;
    --gaw-accent: #c9a44c;
    --gaw-accent-dark: #a8862f;
    --gaw-paper: #fbf8f0;
    --gaw-paper2: #f1ead8;
    --gaw-tint: #f1ead8;            /* kept for compatibility (avatar face) = paper2 */
    --gaw-line: #e3d9c2;
    --gaw-fg: #1F1F1F;
    --gaw-fg2: #6E6558;
    --gaw-meta: #756B5D;
    --gaw-on-accent: #1F1F1F;
    --gaw-sub: #6E6558;
    --gaw-serif: "ZCOOL XiaoWei", Georgia, "Times New Roman", "Noto Serif", serif;
    --gaw-rise: 8px;
    /* T689 P1 - distance from the viewport corner for the closed launcher. One token so the JS
       obstacle engine can read the SAME number it has to offset from (guest-assistant.js
       relayout()); overridden to 14px at <=575.98 below. */
    --gaw-edge: 24px;
    /* T689 P4 - launcher glow colour. Gold default (River Village); a per-app theme file
       overrides the VALUE only. */
    --gaw-glow: rgba(201, 164, 76, .35);
}
.gaw-root, .gaw-root * { box-sizing: border-box; }

.gaw-sr { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }

.gaw-ic { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 16; stroke-linecap: round; stroke-linejoin: round; }

/* -- Avatar (Anik) --------------------------------------------------------- */
.gaw-avatar { display: block; width: 28px; height: 28px; flex: 0 0 auto; }
/* T689 P6 - no `fill` here on purpose: the face is painted by the fill PRESENTATION ATTRIBUTE
   `url(#gaw-g-face) var(--gaw-tint)` (gradient with a token fallback). A `fill` in this external
   stylesheet would beat that attribute, and `url(#...)` written in an EXTERNAL css file resolves
   against the stylesheet's own URL in Firefox - so the paint server reference must stay in the
   markup. Same reason the body/cap/highlight/shadow shapes carry no fill class. */
.gaw-av-face { stroke: var(--gaw-ink); stroke-width: 2; }
.gaw-av-ink { fill: var(--gaw-ink); }
.gaw-av-stroke { fill: none; stroke: var(--gaw-ink); stroke-width: 2.6; stroke-linecap: round; stroke-linejoin: round; }
.gaw-av-accent { fill: var(--gaw-accent); }
.gaw-av-accent-dark { fill: var(--gaw-accent-dark); }
/* T689 P6 - modelling layers. Every tone is a --gaw-* token plus an opacity; no hex in the SVG. */
.gaw-av-rim { fill: none; stroke: var(--gaw-paper); stroke-width: 1.2; stroke-opacity: .6; stroke-linecap: round; }
.gaw-av-catch { fill: var(--gaw-paper); fill-opacity: .8; }
.gaw-av-lid { fill: none; stroke: var(--gaw-ink); stroke-width: 1.2; stroke-opacity: .25; stroke-linecap: round; }
.gaw-av-blush { fill: var(--gaw-accent); fill-opacity: .18; }
/* T689 P6 - the shared paint servers (see _GuestAssistantWidget.cshtml). 0x0 and out of flow, but
   NOT display:none: a paint server inside a display:none subtree fails in Safari. */
.gaw-av-defs { position: absolute; width: 0; height: 0; overflow: hidden; pointer-events: none; }
.gaw-av-g-accent { stop-color: var(--gaw-accent); }
.gaw-av-g-accent-dark { stop-color: var(--gaw-accent-dark); }
.gaw-av-g-paper { stop-color: var(--gaw-paper); }
.gaw-av-g-tint { stop-color: var(--gaw-tint); }
.gaw-av-g-ink { stop-color: var(--gaw-ink); }
.gaw-av-o-55 { stop-opacity: .55; }
.gaw-av-o-22 { stop-opacity: .22; }
.gaw-av-o-0 { stop-opacity: 0; }

/* -- Launcher: paper pill, hairline, avatar disc, accent presence dot ------- */
.gaw-launcher {
    /* T689 P1 - the corner offsets are var-driven. --gaw-reserve is a MEASURED horizontal lane
       kept clear for an always-present corner button (River Village .progress-wrap); --gaw-lift
       raises the pill above a bottom obstacle only while that obstacle is visible (Restaurant
       #foMobileBar / .scroll-top). Both default to 0px, so a page with no such furniture renders
       exactly as it did before. Offsets are never applied with transform (the reduced-motion
       block forces transform:none here).
       T689 P4 - min-width 314px = 2x the measured 156.9px pre-change width at 1280 (before.json).
       T689 P5 - overflow:hidden clips the ::before shimmer sweep to the pill. It clips CONTENT
       only: this element's own outline (:focus-visible) and box-shadow (the glow) paint outside
       the border box and are unaffected. isolation:isolate keeps the sweep's stacking local. */
    position: fixed;
    overflow: hidden; isolation: isolate;
    right: calc(var(--gaw-edge) + var(--gaw-reserve, 0px));
    bottom: calc(var(--gaw-edge) + var(--gaw-lift, 0px));
    z-index: 9990;
    display: inline-flex; align-items: center; gap: 12px;
    min-width: 314px; max-width: calc(100vw - 2 * var(--gaw-edge) - var(--gaw-reserve, 0px));
    min-height: 56px; padding: 0 20px 0 8px;
    background: var(--gaw-paper); color: var(--gaw-ink);
    border: 1px solid var(--gaw-line); border-radius: 999px;
    font-family: inherit; font-size: 15px; font-weight: 600; line-height: 1.2; cursor: pointer;
    box-shadow: 0 0 0 1px var(--gaw-line), 0 0 18px 4px var(--gaw-glow), 0 12px 28px rgba(0, 0, 0, .28);
}
.gaw-launcher:hover { background: var(--gaw-paper2); box-shadow: 0 0 0 1px var(--gaw-line), 0 0 22px 6px var(--gaw-glow), 0 12px 28px rgba(0, 0, 0, .28); }
.gaw-launcher:focus-visible { outline: 2px solid var(--gaw-accent); outline-offset: 2px; }
/* T689 P5 - the real children sit above the shimmer sweep. No offsets are introduced, so layout
   is unchanged. The ::before sweep is position:absolute, so it is OUT OF FLOW and never becomes
   a flex item of the inline-flex launcher. */
.gaw-launcher > * { position: relative; z-index: 1; }
.gaw-launcher::before {
    content: ""; position: absolute; top: 0; bottom: 0; left: 0; width: 45%; z-index: 0;
    pointer-events: none;
    background: linear-gradient(105deg, transparent 0%, var(--gaw-glow) 50%, transparent 100%);
    opacity: 0; transform: translateX(-130%);
}
.gaw-launcher-av { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: 50%; background: var(--gaw-paper2); border: 1px solid var(--gaw-line); flex: 0 0 auto; }
.gaw-launcher .gaw-avatar { width: 30px; height: 30px; }
/* T689 P4 - two-line label: name + a small eyebrow line (plain text nodes in the partial). */
.gaw-launcher-label { display: flex; flex-direction: column; gap: 2px; min-width: 0; text-align: left; }
.gaw-launcher-name { font-size: 15px; font-weight: 700; line-height: 1.2; color: var(--gaw-ink); }
.gaw-launcher-tag { font-size: 11px; font-weight: 600; line-height: 1.2; letter-spacing: .9px; text-transform: uppercase; color: var(--gaw-fg2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.gaw-dot { position: relative; display: block; width: 7px; height: 7px; border-radius: 50%; background: var(--gaw-accent); flex: 0 0 auto; }
/* T689 P5 - radar ping. At scale(3) the 9px ring box is 27px (13.5px half-extent) around a dot
   centre 23.5px from the pill's right edge and 28px from its top/bottom - inside the pill, so
   overflow:hidden never clips it. */
.gaw-dot::after {
    content: ""; position: absolute; inset: -1px; border-radius: 50%;
    border: 1.5px solid var(--gaw-accent); opacity: 0; pointer-events: none;
}
.gaw-root.is-open .gaw-launcher { display: none; }

/* -- Panel: paper sheet ---------------------------------------------------- */
.gaw-panel {
    /* T689 P1 - same reserve/lift vars as the launcher (--gaw-panel-lift is measured against the
       PANEL's own x-range). T689 P3 - 440px wide, 15.5px/1.6 for legibility. */
    position: fixed;
    right: calc(24px + var(--gaw-reserve, 0px));
    bottom: calc(24px + var(--gaw-panel-lift, 0px));
    z-index: 9991;
    width: 440px; max-width: calc(100vw - 32px - var(--gaw-reserve, 0px)); height: 660px;
    max-height: calc(100vh - 48px - var(--gaw-panel-lift, 0px)); min-height: 420px;
    display: flex; flex-direction: column; overflow: hidden;
    background: var(--gaw-paper); color: var(--gaw-fg);
    border: 1px solid var(--gaw-line); border-radius: 14px;
    box-shadow: 0 24px 60px rgba(0, 0, 0, .35);
    font-size: 15.5px; line-height: 1.6;
}
.gaw-panel[hidden] { display: none; }

/* -- Head ------------------------------------------------------------------ */
.gaw-head { display: flex; align-items: flex-start; gap: 12px; padding: 22px 16px 14px 22px; background: var(--gaw-paper); border-bottom: 1px solid var(--gaw-line); flex-shrink: 0; }
.gaw-av-ring { display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px; margin-top: 2px; border-radius: 50%; background: var(--gaw-paper2); border: 1px solid var(--gaw-line); flex: 0 0 auto; }
.gaw-av-ring .gaw-avatar { width: 36px; height: 36px; }
.gaw-head-text { min-width: 0; flex: 1 1 auto; }
.gaw-title { margin: 0; font-family: var(--gaw-serif); font-size: 28px; font-weight: 400; line-height: 1; letter-spacing: 1px; color: var(--gaw-ink); }
.gaw-sub { display: flex; flex-direction: column; gap: 6px; margin: 6px 0 0; font-size: 10.5px; line-height: 1.35; letter-spacing: 1.4px; text-transform: uppercase; color: var(--gaw-fg2); }
.gaw-motif { display: block; width: 84px; height: 12px; color: var(--gaw-accent); }
.gaw-close { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; margin: -6px -4px 0 0; background: transparent; color: var(--gaw-fg2); border: 0; border-radius: 50%; cursor: pointer; flex: 0 0 auto; }
.gaw-close .gaw-ic { width: 20px; height: 20px; }
.gaw-close:hover { background: var(--gaw-paper2); color: var(--gaw-ink); }
.gaw-close:focus-visible { outline: 2px solid var(--gaw-accent); outline-offset: -2px; }

/* T685 F2 - "New conversation" header control. Same 40px box as .gaw-close so the two read as one
   pair and both clear the 44px tap target once their -6px/-4px negative margins are accounted for
   against the head padding. */
.gaw-new { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; margin: -6px 0 0 0; background: transparent; color: var(--gaw-fg2); border: 0; border-radius: 50%; cursor: pointer; flex: 0 0 auto; }
.gaw-new .gaw-ic { width: 19px; height: 19px; }
.gaw-new:hover { background: var(--gaw-paper2); color: var(--gaw-ink); }
.gaw-new:focus-visible { outline: 2px solid var(--gaw-accent); outline-offset: -2px; }

/* T685 F2 - inline reset action shown under the turn-cap reply. */
.gaw-reset { display: flex; justify-content: center; }
.gaw-reset-btn { min-height: 44px; padding: 10px 20px; background: var(--gaw-paper2); color: var(--gaw-ink); font: inherit; font-size: 13px; font-weight: 600; border: 1px solid var(--gaw-line); border-radius: 999px; cursor: pointer; }
.gaw-reset-btn:hover { border-color: var(--gaw-accent); color: var(--gaw-accent); }
.gaw-reset-btn:focus-visible { outline: 2px solid var(--gaw-accent); outline-offset: 2px; }

/* -- Log: Anik = left-ruled block, guest = ink capsule ---------------------- */
/* T689 P3 - overflow-x:hidden: the log is the scroll container, and a child wider than it used to
   produce a horizontal scrollbar (see .gaw-links / .gaw-fb below). */
.gaw-log { flex: 1 1 auto; overflow-y: auto; overflow-x: hidden; display: flex; flex-direction: column; gap: 20px; padding: 22px 24px 12px; background: var(--gaw-paper); }
.gaw-msg { display: flex; flex-direction: column; }
.gaw-msg--user { align-items: flex-end; }
.gaw-msg--bot { flex-direction: row; flex-wrap: wrap; align-items: flex-start; gap: 0 10px; }
.gaw-msg--bot .gaw-av-wrap { display: block; flex: 0 0 auto; margin-top: 1px; }
.gaw-msg--bot .gaw-avatar { width: 24px; height: 24px; }
.gaw-bubble { margin: 0; white-space: pre-wrap; word-wrap: break-word; overflow-wrap: anywhere; }
.gaw-bubble p { margin: 0 0 6px; }
.gaw-bubble p:last-child { margin-bottom: 0; }
.gaw-bubble ul { margin: 6px 0 0; padding-left: 18px; }
.gaw-bubble li { margin: 3px 0; }
.gaw-bubble strong { font-weight: 700; color: var(--gaw-ink); }
/* the host theme styles bare p/li/ul - keep the widget text on its own tokens */
.gaw-root .gaw-bubble p, .gaw-root .gaw-bubble li, .gaw-root .gaw-bubble ul { color: inherit; font-size: inherit; line-height: inherit; }
.gaw-msg--bot .gaw-bubble { flex: 1 1 0; min-width: 0; max-width: calc(100% - 34px); padding: 2px 0 2px 14px; border-left: 2px solid var(--gaw-accent); border-radius: 0; color: var(--gaw-fg); }
.gaw-msg--card .gaw-bubble { padding: 12px 14px 12px 16px; background: #fff; border: 1px solid var(--gaw-line); border-left: 2px solid var(--gaw-accent); border-radius: 0 10px 10px 0; }
.gaw-msg--user .gaw-bubble { max-width: 82%; padding: 10px 16px; background: var(--gaw-ink); color: #fff; border-radius: 20px 20px 4px 20px; }
.gaw-msg--user .gaw-bubble strong { color: #fff; }

/* deep-link chips: first = ink fill (primary), the rest ink outline */
/* T689 P3 - these rows are flex:1 0 100% inside a wrapping row; a 34px LEFT MARGIN on a 100%-basis
   child made the row 100%+34px wide and forced horizontal overflow. The 34px indent (avatar 24px +
   10px gap) is now padding, which border-box absorbs. */
.gaw-links { display: flex; flex-wrap: wrap; gap: 8px; flex: 1 0 100%; min-width: 0; margin: 12px 0 0; padding-left: 34px; }
.gaw-link { max-width: 100%; overflow-wrap: anywhere; display: inline-flex; align-items: center; min-height: 34px; padding: 0 16px; background: var(--gaw-ink); color: #fff; border: 1px solid var(--gaw-ink); border-radius: 999px; font-size: 13px; font-weight: 600; text-decoration: none; }
.gaw-link:nth-child(n+2) { background: transparent; color: var(--gaw-ink); }
.gaw-link:hover, .gaw-link:focus-visible { background: var(--gaw-accent); border-color: var(--gaw-accent); color: var(--gaw-on-accent); outline: none; }

.gaw-fb { display: flex; align-items: center; gap: 8px; flex: 1 0 100%; min-width: 0; margin: 10px 0 0; padding-left: 34px; font-size: 12px; color: var(--gaw-fg2); }
.gaw-fb-label { color: var(--gaw-fg2); }
.gaw-fb-btn { min-height: 26px; padding: 0 2px; background: transparent; color: var(--gaw-fg2); border: 0; border-bottom: 1px solid var(--gaw-line); font-family: inherit; font-size: 12px; cursor: pointer; }
.gaw-fb-btn:hover, .gaw-fb-btn:focus-visible { color: var(--gaw-ink); border-bottom-color: var(--gaw-accent); outline: none; }
.gaw-fb-btn:disabled { opacity: .5; cursor: default; }
.gaw-fb-done { margin-left: 4px; }

/* -- Suggested questions: hairline rows with an accent arrow ---------------- */
.gaw-suggest { display: flex; flex-direction: column; padding: 0 22px 8px; background: var(--gaw-paper); flex-shrink: 0; }
.gaw-suggest[hidden] { display: none; }
.gaw-chip-q { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 42px; padding: 10px 0; background: transparent; color: var(--gaw-ink); border: 0; border-top: 1px solid var(--gaw-line); font-family: inherit; font-size: 14.5px; text-align: left; cursor: pointer; }
.gaw-chip-q::after { content: "\2192"; color: var(--gaw-accent); font-size: 15px; line-height: 1; }
.gaw-chip-q:hover { color: var(--gaw-accent-dark); }
.gaw-chip-q:focus-visible { outline: 2px solid var(--gaw-accent); outline-offset: 2px; }

/* -- Typing: accent dots + italic label ------------------------------------ */
.gaw-typing { display: flex; align-items: center; gap: 8px; padding: 0 22px 10px; background: var(--gaw-paper); font-size: 12px; font-style: italic; color: var(--gaw-fg2); flex-shrink: 0; }
.gaw-typing[hidden] { display: none; }
.gaw-av-typing { display: none; }
.gaw-dots { display: inline-flex; align-items: center; gap: 4px; }
.gaw-dots i { display: block; width: 5px; height: 5px; border-radius: 50%; background: var(--gaw-accent); }
.gaw-dots i:nth-child(2) { opacity: .6; }
.gaw-dots i:nth-child(3) { opacity: .3; }

/* -- Composer: underline field, ink send disc with an accent glyph ---------- */
.gaw-form { padding: 8px 22px 4px; background: var(--gaw-paper); border-top: 1px solid var(--gaw-line); flex-shrink: 0; }
.gaw-input { display: block; width: 100%; min-height: 36px; max-height: 120px; padding: 8px 0; background: transparent; color: var(--gaw-ink); border: 0; border-bottom: 1.5px solid var(--gaw-ink); border-radius: 0; font: inherit; font-size: 16px; resize: none; }
.gaw-root .gaw-input { background: transparent; box-shadow: none; }
.gaw-input::placeholder { color: var(--gaw-meta); }
.gaw-input:focus { outline: none; border-bottom-color: var(--gaw-accent); }
.gaw-form-row { display: flex; align-items: center; justify-content: space-between; margin-top: 6px; }
.gaw-count { font-size: 11px; color: var(--gaw-meta); }
.gaw-send { display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 38px; background: var(--gaw-ink); color: var(--gaw-accent); border: 0; border-radius: 50%; cursor: pointer; flex: 0 0 auto; }
.gaw-send .gaw-ic { width: 19px; height: 19px; }
.gaw-send:hover { background: #000; }
.gaw-send:focus-visible { outline: 2px solid var(--gaw-accent); outline-offset: 2px; }
.gaw-send:disabled { opacity: .55; cursor: default; }

/* -- Footer ---------------------------------------------------------------- */
.gaw-foot { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 10px; padding: 8px 22px 16px; background: var(--gaw-paper); border-top: 1px solid var(--gaw-line); font-size: 11px; color: var(--gaw-meta); flex-shrink: 0; }
.gaw-staff { color: var(--gaw-ink); font-weight: 700; font-size: 12.5px; text-decoration: underline; text-decoration-color: var(--gaw-accent); text-underline-offset: 3px; }
.gaw-staff:hover, .gaw-staff:focus-visible { color: var(--gaw-accent-dark); }

/* -- Breakpoints ----------------------------------------------------------- */
@media (max-width: 991.98px) {
    .gaw-panel { height: 72vh; }
}
@media (max-width: 575.98px) {
    /* T689 P1 - moving the one token keeps the launcher's right/bottom AND the JS engine's offset
       maths in step (relayout() reads --gaw-edge off the root). */
    .gaw-root { --gaw-edge: 14px; }
    .gaw-launcher { min-width: 0; }
    .gaw-panel { top: 0; right: 0; bottom: 0; left: 0; width: 100%; max-width: none; height: 100%; max-height: none; min-height: 0; border: 0; border-radius: 0; box-shadow: none; }
    .gaw-head { padding-top: calc(22px + env(safe-area-inset-top, 0px)); }
    .gaw-foot { padding-bottom: calc(16px + env(safe-area-inset-bottom, 0px)); }
    .gaw-msg--user .gaw-bubble { max-width: 86%; }
}
@media (max-width: 360px) {
    /* T689 P4 - the NAME stays readable at 360px (the old rule hid the whole label); only the small
       eyebrow line is dropped, and the pill is still capped by the max-width above. */
    .gaw-launcher { gap: 10px; padding: 0 16px 0 6px; }
    .gaw-launcher-tag { display: none; }
    .gaw-launcher-av { width: 38px; height: 38px; }
    .gaw-launcher .gaw-avatar { width: 26px; height: 26px; }
    .gaw-head { padding: 18px 12px 12px 16px; }
    .gaw-log, .gaw-suggest, .gaw-typing, .gaw-form, .gaw-foot { padding-left: 16px; padding-right: 16px; }
    .gaw-title { font-size: 25px; }

    /* T685 F3 - reclaim vertical space at 360px so more of the conversation is visible.
       The subtitle line wraps to three or four lines at this width and, together with the
       decorative motif and the long greeting, pushed the first answer below the fold.
       Nothing is removed - the subtitle is clamped, not hidden, so its text stays readable
       and available to assistive technology. */
    .gaw-sub { gap: 3px; margin-top: 4px; letter-spacing: .9px; }
    .gaw-sub-txt {
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        overflow: hidden;
    }
    /* purely decorative flourish - the first thing to go when space is scarce */
    .gaw-motif { display: none; }
    .gaw-log { gap: 12px; padding-top: 14px; }
    .gaw-head { padding-bottom: 10px; }
    .gaw-msg--card .gaw-bubble { padding: 9px 11px 9px 13px; }
    .gaw-msg--user .gaw-bubble { padding: 8px 13px; }
}

/* -- Motion: opacity + an 8px rise, never a scale; paper does not pop ------- */
@media (prefers-reduced-motion: no-preference) {
    .gaw-panel { animation: gaw-rise 180ms ease-out both; }
    .gaw-suggest.is-stagger .gaw-chip-q { animation: gaw-fade 220ms ease-out both; }
    .gaw-suggest.is-stagger .gaw-chip-q:nth-child(1) { animation-delay: 0ms; }
    .gaw-suggest.is-stagger .gaw-chip-q:nth-child(2) { animation-delay: 40ms; }
    .gaw-suggest.is-stagger .gaw-chip-q:nth-child(3) { animation-delay: 80ms; }
    .gaw-suggest.is-stagger .gaw-chip-q:nth-child(4) { animation-delay: 120ms; }
    .gaw-launcher, .gaw-close, .gaw-send, .gaw-chip-q, .gaw-link { transition: background-color .15s ease, color .15s ease, border-color .15s ease; }
    /* T689 P5 - four staggered attention effects, "noticeable but calm, always on".
       (1) glow pulse 3.2s ambient (paint-only box-shadow, as in P4, stronger)
       (2) radar ping 4s     - active [0, 1.2) mod 4
       (3) shimmer sweep 12s - active [2, 3.1) mod 12  => [2, 3.1) mod 4
       (4) attention nudge 24s - active [9.4, 10.3) mod 24 => [1.4, 2.3) mod 4, [9.4,10.3) mod 12
       Because 4 | 12 | 24 those residues hold for ALL t, so no two discrete effects (2-4) ever
       coincide. The nudge is translateY <= 0 at every frame and touches neither x nor scale, so
       guest-assistant.js relayout()'s getBoundingClientRect() x-range is unchanged and the
       measured 0px clearance to every obstacle BELOW the launcher can only increase. */
    .gaw-launcher { animation: gaw-glow 3.2s ease-in-out infinite alternate, gaw-nudge 24s ease-in-out 9.4s infinite; }
    /* the target must never move under the pointer: pause the nudge, keep the glow */
    .gaw-launcher:hover, .gaw-launcher:focus-visible { animation-play-state: running, paused; }
    .gaw-launcher::before { animation: gaw-shimmer 12s linear 2s infinite; }
    .gaw-dot::after { animation: gaw-ping 4s ease-out infinite; }
}
@keyframes gaw-glow {
    from { box-shadow: 0 0 0 1px var(--gaw-line), 0 0 18px 4px var(--gaw-glow), 0 12px 28px rgba(0, 0, 0, .28); }
    to { box-shadow: 0 0 0 1px var(--gaw-line), 0 0 28px 9px var(--gaw-glow), 0 12px 28px rgba(0, 0, 0, .28); }
}
@keyframes gaw-shimmer {
    0% { transform: translateX(-130%); opacity: 0; }
    2% { opacity: 1; }
    9.2%, 100% { transform: translateX(130%); opacity: 0; }
}
@keyframes gaw-ping {
    0% { transform: scale(1); opacity: .75; }
    30%, 100% { transform: scale(3); opacity: 0; }
}
@keyframes gaw-nudge {
    0%, 3.75%, 100% { transform: translateY(0); }
    1.2% { transform: translateY(-4px); }
    2.4% { transform: translateY(0); }
    3.1% { transform: translateY(-2px); }
}
@keyframes gaw-rise { from { opacity: 0; transform: translateY(var(--gaw-rise)); } to { opacity: 1; transform: none; } }
@keyframes gaw-fade { from { opacity: 0; } to { opacity: 1; } }

@media (prefers-reduced-motion: reduce) {
    /* T689 P5 - the two pseudo-element effects are both stopped AND removed; the static glow on
       .gaw-launcher (box-shadow, not an animation) stays - that was approved in P4. */
    .gaw-panel, .gaw-suggest .gaw-chip-q, .gaw-dots i, .gaw-launcher, .gaw-launcher::before, .gaw-dot::after { animation: none !important; }
    .gaw-launcher::before, .gaw-dot::after { display: none !important; }
    .gaw-launcher, .gaw-close, .gaw-send, .gaw-chip-q, .gaw-link { transition: none !important; }
    .gaw-panel, .gaw-launcher { transform: none !important; }
}
