/* Phone sheet, tablet rail, desktop panel. All styles are dock-scoped. */
.alive-dock{position:fixed;z-index:1040;inset:auto 0 0;width:100%;box-sizing:border-box;color:#edf7f5;background:#101e24;border:1px solid #36515a;border-radius:20px 20px 0 0;box-shadow:0 12px 48px #0006;font:14px/1.4 system-ui,sans-serif;padding-bottom:env(safe-area-inset-bottom)}
.alive-dock *{box-sizing:border-box}.alive-dock__header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px}.alive-dock__identity{display:flex;align-items:center;gap:9px;min-width:0;font-weight:650}.alive-dock__light{width:8px;height:8px;flex:none;border-radius:50%;background:#8be3be;box-shadow:0 0 12px #8be3be88}
.alive-dock [hidden]{display:none}
.alive-dock__toggle{border:1px solid #52717a;background:transparent;color:#edf7f5;border-radius:9px;padding:10px;min-height:44px;cursor:pointer}.alive-dock__body{max-height:65dvh;overflow:auto;overscroll-behavior:contain}.alive-dock__body[hidden]{display:none}.alive-dock__greeting{margin:0;padding:0 16px 10px;color:#c3dcd7}.alive-dock__frame{display:block;width:100%;height:350px;border:0;background:#0c151b}.alive-dock__talk{display:block;width:calc(100% - 32px);min-height:44px;margin:10px 16px 0;padding:10px 16px;border:0;border-radius:12px;background:#a2f1cd;color:#102720;font-weight:700;cursor:pointer}.alive-dock__talk:disabled{opacity:.55;cursor:default}.alive-dock__note{margin:8px 16px 12px;font-size:12px;color:#bfd0d5}.alive-dock button:focus-visible,.alive-dock a:focus-visible{outline:3px solid #fff;outline-offset:2px}
/* A greeter without a stage: its still, its greeting and a link to its own door (never a dead frame). */
.alive-dock__still-row{display:flex;align-items:center;gap:12px;padding:4px 16px 0}.alive-dock__still{flex:none;width:72px;height:72px;border-radius:16px;object-fit:cover;object-position:50% 18%;background:#0c151b}.alive-dock__still-row .alive-dock__greeting{padding:0}a.alive-dock__talk{text-align:center;text-decoration:none}.alive-dock__note a{color:#a2f1cd;font-weight:650}
@media (min-width: 768px){.alive-dock{inset:88px 16px auto auto;width:320px;max-height:calc(100dvh - 112px);border-radius:18px;padding:0}.alive-dock__body{max-height:calc(100dvh - 180px)}.alive-dock__frame{height:420px}}
@media (min-width: 1200px){.alive-dock{inset:auto 24px 24px auto;width:360px;max-height:calc(100dvh - 48px)}.alive-dock__body{max-height:calc(100dvh - 116px)}.alive-dock__frame{height:420px}}
/* Collapsed (the first paint at every width): a small pill with the light, the name and the invitation. */
.alive-dock[data-alive-dock-state="collapsed"]{inset:auto 16px calc(16px + env(safe-area-inset-bottom)) auto;width:auto;max-width:calc(100vw - 32px);border-radius:999px;padding:0}
.alive-dock[data-alive-dock-state="collapsed"] .alive-dock__header{padding:4px 4px 4px 14px}
.alive-dock[data-alive-dock-state="collapsed"] .alive-dock__identity{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.alive-dock[data-alive-dock-state="collapsed"] .alive-dock__toggle{flex:none;border-color:#a2f1cd;border-radius:999px;background:#a2f1cd;color:#102720;font-weight:700;padding:10px 16px}
@media (max-width: 767.98px){body:has(.alive-dock[data-alive-dock-state="collapsed"]){padding-bottom:calc(72px + env(safe-area-inset-bottom))}}
/* Line 5556 (ai.features.dock_pill_name_ai): the pill says her whole name and that she is an AI. Two lines share one cell: the full line ("Mrs. NetShow · AI") sits on top and wraps out of sight when it would not fit, uncovering the short line ("NetShow · AI"), whose name then ellipsizes (min-width:0); the Talk button never covers it. Line 7175: at 400px and below the collapsed pill's button shows 'Talk' (its 'with your guide' is visually hidden, never display:none, so its accessible name is unchanged), which leaves room for the whole 'Mrs. NetShow · AI' at 375. */
.alive-dock--pill-ai .alive-dock__who{display:flex;align-items:center;gap:9px;flex:0 1 auto;min-width:0;font-weight:650}
.alive-dock--pill-ai .alive-dock__names{display:grid;grid-template-columns:minmax(0,1fr);min-width:0}
.alive-dock--pill-ai .alive-dock__short,.alive-dock--pill-ai .alive-dock__full{grid-area:1/1;min-width:0}
.alive-dock--pill-ai .alive-dock__short{display:flex;align-items:baseline;white-space:nowrap}
.alive-dock--pill-ai .alive-dock__identity{display:block;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.alive-dock--pill-ai .alive-dock__honorific{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
.alive-dock--pill-ai .alive-dock__ai-words{flex:none;white-space:pre;color:#a2f1cd}
.alive-dock--pill-ai .alive-dock__full{display:flex;flex-wrap:wrap;height:1.4em;overflow:hidden}
.alive-dock--pill-ai .alive-dock__full::before{content:"";width:0;height:1.4em}
.alive-dock--pill-ai .alive-dock__full-line{white-space:nowrap;background:#101e24}
/* Line 7132: the collapsed pill already says "· AI" in words, so the header's corner AI mark (display:inline-block!important, AiDisclosure::css) yields instead of covering "guide" on the Talk button (measured at every collapsed width, 320 to 1024 px); the open panel and a pill without the words keep it. */
.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__header>.ns-ai-mark{display:none!important}
@media (max-width: 400px){.alive-dock--pill-ai[data-alive-dock-state="collapsed"]{right:10px;max-width:calc(100vw - 20px)}.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__header{gap:6px;padding-left:12px}.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__who{gap:7px}.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__toggle{padding:10px}.alive-dock--pill-ai .alive-dock__identity{min-width:0}.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__toggle-long{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}}
/* The Help-chat teaser (components/communicator-unavailable) and the live-human button keep the bottom-right corner; the dock sits above them. */
body:has(.netshow-help-unavailable, #ns-live-human) .alive-dock{bottom:calc(84px + env(safe-area-inset-bottom))}
/* Line 6971 (ai.features.auth_dock_corner_phone): on /login, /register and the password pages the closed dock is a 48px round face button in the bottom-right corner, so the form is never under it; the name and the invitation are hidden from sight only, and stay its accessible name. */
/* Line 6008: on a phone the page's last content ends 8px above the closed pill: its height (--alive-dock-h, measured by alive-dock.js) plus its offset above (16px, or 84px over the teaser, which a widget may add after load) and the safe area. */
/* Line 8472 (login-corner-face-shows-with-ai-mark-r1): the live check at 375 found a blank dark circle: the page's Bootstrap 5.3.3 reboot hides every [hidden] with !important, so her face is display:block !important under a heavier selector (as line 7993 does for /meet), and line 7132's collapsed-pill AI-mark hide is out-weighed by one more class, so a small AI mark straddles the button's top-right edge, off her eyes. At 481 px and up the sign-in and sign-up pages keep the pill, and the page ends the pill's height (56px: alive-dock.js measures --alive-dock-h only at 480 px and below) plus 24px lower, as the 480 px reserve does, so it never covers "Don't have an account?". */
/* Line 8263 (login-corner-button-clears-forgot-password-r1): on /login and /register (.auth-page) the form fills the right edge from the email field to the hint, so at the bottom the button sat on 'Forgot password?' (375x812) or the password field (375x667); it is anchored top-right beside the card's logo instead (the 64px header plus 40px), scrolls with the page, and sits under the sticky header's menu button (z-index:1). An open dock keeps its place. */
/* Line 9624 (login-corner-face-clear-of-sign-in-card-r1): 104px landed inside the sign-in card (the 64px top menu plus the page's 24px top padding put its top at 88px), so her face and AI badge sat on its corner. While the corner dock is on the page, open or closed, the sign-in and sign-up cards start 80px down and the face rests in that gutter: 16px below the top menu (its AI mark 10px below it, clear of the menu button) and 8px above the card; under the older 122px landing header it rests 14px below the header, 18px above the card. Line 8472's min-width:481px page-end reserve stood inside this max-width:480px block, where it could never match (body padding-bottom measured 0px at 768px); it now follows the block. */
/* Line 11532 (ai.features.auth_guide_clear_of_sign_in, login-guide-never-covers-sign-in-r1): the live check at c2c953052fb found the shared character (line 11197's stage adapter, mounted inside this dock) over the sign-in form: at 375 its 72 px card was squeezed into the 48 px corner button, a dark column about 45 px wide with a second, half-cut face and a caption one letter wide down the right edge of the form (measured 636 px tall, over the password eye); at 1440 its greeting card grew the closed pill over the sign-in card. css/avatar-studio/stage-adapter.css now keeps the character out of every closed dock (display:none), which also took her greeting off the phone sign-in pages. On /login, /register and the password pages the dock carries data-alive-dock-auth-clear="1" (key on). Only where line 9624 holds the gutter above the sign-in and sign-up cards (.auth-card, 480 px and below) does the closed corner button bring her greeting back beside it: the character's face folds away (the button is her one face, with its AI mark) and its AI chip and caption make one line of at most three rows, level with the button and ending 8 px before it, never on the card. The password pages keep the corner button at the foot of the screen, where no gutter is held, so there and from 481 px up the greeting stays in the closed dock. A tap opens the same dock (the phone sheet, the rail, the panel); inside it the character's face folds away too (clip, never display:none), so the open dock shows one face, the frame's. Key off: no marker, no change. */
@media (max-width: 480px){body:has(.alive-dock[data-alive-dock-state="collapsed"]:not(.alive-dock--voice-first)){padding-bottom:calc(var(--alive-dock-h,56px) + 24px + env(safe-area-inset-bottom))}body:has(.netshow-help-unavailable, #ns-live-human):has(.alive-dock[data-alive-dock-state="collapsed"]:not(.alive-dock--voice-first)){padding-bottom:calc(var(--alive-dock-h,56px) + 92px + env(safe-area-inset-bottom))}.alive-dock--corner[data-alive-dock-state="collapsed"]{width:48px;height:48px;max-width:48px;inset-inline-end:16px;bottom:calc(16px + env(safe-area-inset-bottom));border-radius:50%;padding:0;overflow:visible}.alive-dock--corner[data-alive-dock-state="collapsed"] .alive-dock__header{position:relative;width:48px;height:48px;padding:0;gap:0;justify-content:center}.alive-dock--corner[data-alive-dock-state="collapsed"] .alive-dock__header>img.alive-dock__corner-face{display:block!important;width:44px;height:44px;border-radius:50%;object-fit:cover;object-position:50% 18%;background:#0c151b;pointer-events:none}.alive-dock.alive-dock--corner[data-alive-dock-state="collapsed"] .alive-dock__header>.ns-ai-mark{display:inline-block!important;top:-6px!important;right:-10px!important;left:auto!important;bottom:auto!important;transform:none!important;padding:0 3px!important;font-size:12px!important;line-height:14px!important}.alive-dock--corner[data-alive-dock-state="collapsed"] .alive-dock__header>span:not(.ns-ai-mark){position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.alive-dock--corner[data-alive-dock-state="collapsed"] .alive-dock__toggle{position:absolute;inset:0;width:48px;height:48px;min-height:48px;padding:0;border:2px solid #a2f1cd;border-radius:50%;background:transparent;color:transparent;font-size:0}body:has(.auth-page) .alive-dock--corner[data-alive-dock-state="collapsed"]{position:absolute;top:136px;bottom:auto;z-index:1}body:has(.auth-page):has(.ns-tm) .alive-dock--corner[data-alive-dock-state="collapsed"]{top:80px}body:has(.alive-dock--corner) .auth-page{padding-top:80px}
/* Line 6993 (ai.features.dock_pill_mini_on_talk_pages): on /meet and /live-avatars, whose own Talk buttons open the dock, the closed pill is a 56 px round light at 480 px and below, clear of the first-screen sign-up buttons. Her name and the invitation are hidden visually, never from a screen reader (the aside keeps its aria-label, the button its words); the AI mark stays on the circle; a tap opens the dock as before. */
.alive-dock--mini[data-alive-dock-state="collapsed"]{right:12px;bottom:calc(16px + env(safe-area-inset-bottom));width:56px;height:56px;border-radius:50%}
.alive-dock--mini[data-alive-dock-state="collapsed"] .alive-dock__header{padding:0}
.alive-dock--mini[data-alive-dock-state="collapsed"] .alive-dock__header>span:not([data-ai-mark]){position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
.alive-dock--mini[data-alive-dock-state="collapsed"] .alive-dock__toggle{position:absolute;inset:0;width:100%;height:100%;min-height:0;padding:0;border:2px solid #a2f1cd;border-radius:50%;background:#101e24;color:transparent;text-indent:100%;white-space:nowrap;overflow:hidden}
.alive-dock--mini[data-alive-dock-state="collapsed"] .alive-dock__toggle::before{content:"";position:absolute;top:50%;left:50%;width:18px;height:18px;margin:-9px 0 0 -9px;border-radius:50%;background:#8be3be;box-shadow:0 0 14px #8be3be}body:has(.auth-card) .alive-dock--corner[data-alive-dock-auth-clear="1"][data-alive-dock-state="collapsed"]>.ns-stage-adapter-mount:not([hidden]){display:block;position:absolute;top:0;right:calc(100% + 8px);width:calc(100vw - 88px);max-width:300px;margin:0}.alive-dock--corner[data-alive-dock-auth-clear="1"][data-alive-dock-state="collapsed"] .ns-stage-adapter{display:flex;align-items:flex-start;gap:6px;width:auto;padding:4px 8px;border-radius:12px;font-size:12px;line-height:15px}.alive-dock--corner[data-alive-dock-auth-clear="1"][data-alive-dock-state="collapsed"] .ns-stage-adapter__ai{flex:none;margin-top:1px}.alive-dock--corner[data-alive-dock-auth-clear="1"][data-alive-dock-state="collapsed"] .ns-stage-adapter__caption{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}}
@media (min-width: 481px){body:has(.auth-page):has(.alive-dock--corner[data-alive-dock-state="collapsed"]:not(.alive-dock--voice-first)){padding-bottom:calc(56px + 24px + env(safe-area-inset-bottom))}}
/* Line 11853 (ai.features.auth_pill_clear_tablet, login-pill-clear-of-card-tablet-r1): the live check at 0ce1513462b found the closed 'Mrs. NetShow · AI / Talk with your guide' pill on the sign-in card's bottom edge at 768, touching 'Create one free': line 6971's corner button acts only at 480 px and below, and line 8472's 481 px reserve only pads the page end, which never moves a card that already reaches the first screen's foot. With the key on, /login and /register mark the dock data-alive-dock-auth-tablet="1" and from 481 px to 1199.98 px the closed pill folds to that same 48 px round face with its AI mark on its top-right edge (the phone block's paint, measured on a card page only). On /login from 700 px up the 520 px card ends at least 16 px left of the face (a 15 px scrollbar included; measured 18 px at 700), so the face keeps the pill's bottom-right corner (16 px, or 84 px over the help teaser) and the card stays where it is. Under 700 px on /login (it touched the card's right edge at 664), and across the whole band on /register (whose plan and sign-up cards run the full width under 1200 px), it rests in line 9624's gutter above the cards as it does on a phone: the cards start 80 px down, the face 14 px below the landing header (css/landing.css: 122 px to 640 px, 108 px to 760 px, 73 px above; top 136, 122 or 88 px, 18 px or more above the first card, measured) or 16 px below the one top menu. Her name and the invitation leave sight only (the aside keeps its aria-label, the toggle its words); a tap opens the same dock; an open dock is untouched; 1200 px up and phones keep main. Key off: no marker, no change. */
@media (min-width: 481px) and (max-width: 1199.98px){body:has(.auth-card) .alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"]{width:48px;height:48px;max-width:48px;border-radius:50%;padding:0;overflow:visible}body:has(.auth-card) .alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"] .alive-dock__header{position:relative;width:48px;height:48px;padding:0;gap:0;justify-content:center}body:has(.auth-card) .alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"] .alive-dock__header>img.alive-dock__corner-face{display:block!important;width:44px;height:44px;border-radius:50%;object-fit:cover;object-position:50% 18%;background:#0c151b;pointer-events:none}body:has(.auth-card) .alive-dock.alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"] .alive-dock__header>.ns-ai-mark{display:inline-block!important;top:-6px!important;right:-10px!important;left:auto!important;bottom:auto!important;transform:none!important;padding:0 3px!important;font-size:12px!important;line-height:14px!important}body:has(.auth-card) .alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"] .alive-dock__header>span:not(.ns-ai-mark){position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}body:has(.auth-card) .alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"] .alive-dock__toggle{position:absolute;inset:0;width:48px;height:48px;min-height:48px;padding:0;border:2px solid #a2f1cd;border-radius:50%;background:transparent;color:transparent;font-size:0}}
@media (min-width: 481px) and (max-width: 699.98px){body:has(.auth-page) .alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"]{position:absolute;top:136px;bottom:auto;z-index:1}body:has(.auth-page):has(.ns-tm) .alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"]{top:80px}body:has(.alive-dock--corner[data-alive-dock-auth-tablet="1"]) .auth-page{padding-top:80px}}
@media (min-width: 700px) and (max-width: 1199.98px){body:has(.auth-register-page) .alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"]{position:absolute;top:136px;bottom:auto;z-index:1}body:has(.auth-register-page):has(.ns-tm) .alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"]{top:80px}body:has(.alive-dock--corner[data-alive-dock-auth-tablet="1"]) .auth-register-page{padding-top:80px}}
@media (min-width: 640.02px) and (max-width: 699.98px){body:has(.auth-page):not(:has(.ns-tm)) .alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"]{top:122px}}
@media (min-width: 700px) and (max-width: 760px){body:has(.auth-register-page):not(:has(.ns-tm)) .alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"]{top:122px}}
@media (min-width: 760.02px) and (max-width: 1199.98px){body:has(.auth-register-page):not(:has(.ns-tm)) .alive-dock--corner[data-alive-dock-auth-tablet="1"][data-alive-dock-state="collapsed"]{top:88px}}
.alive-dock[data-alive-dock-auth-clear="1"] .ns-stage-adapter__face{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
/* Line 7993 (ai.features.dock_corner_own_stage_pages): on /meet and /meet/{host} the closed dock is that same 48px round face button at every width (it also carries line 6971's class, so the phone block above paints it identically at 480px and below), so a host's own name on the page is never under it. The sign-in pages never carry this class and keep the phone-only rule. Her face is display:block !important because the page's Bootstrap 5.3.3 reboot hides every [hidden] with !important (measured on /meet and /login); this heavier selector wins that tie. */
.alive-dock--own-stage[data-alive-dock-state="collapsed"]{width:48px;height:48px;max-width:48px;inset-inline-end:16px;bottom:calc(16px + env(safe-area-inset-bottom));border-radius:50%;padding:0;overflow:visible}.alive-dock--own-stage[data-alive-dock-state="collapsed"] .alive-dock__header{position:relative;width:48px;height:48px;padding:0;gap:0;justify-content:center}.alive-dock--own-stage[data-alive-dock-state="collapsed"] .alive-dock__header>img{display:block!important;width:44px;height:44px;border-radius:50%;object-fit:cover;object-position:50% 18%;background:#0c151b;pointer-events:none}.alive-dock--own-stage[data-alive-dock-state="collapsed"] .alive-dock__header>span:not(.ns-ai-mark){position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.alive-dock--own-stage[data-alive-dock-state="collapsed"] .alive-dock__toggle{position:absolute;inset:0;width:48px;height:48px;min-height:48px;padding:0;border:2px solid #a2f1cd;border-radius:50%;background:transparent;color:transparent;font-size:0}
@media (min-width: 768px) and (max-width: 1199.98px){body:has(.netshow-help-unavailable, #ns-live-human) .alive-dock[data-alive-dock-state="open"]{bottom:auto;max-height:calc(100dvh - 184px)}body:has(.netshow-help-unavailable, #ns-live-human) .alive-dock[data-alive-dock-state="open"] .alive-dock__body{max-height:calc(100dvh - 252px)}}
/* Line 7011 (ai.features.dock_yields_to_hero): while a selling page's hero is on a phone screen the closed pill tucks into a 40 px tab at the right edge, clear of the hero's buttons (measured at 375: /live-avatars' full-width buttons end 40 px from the edge, /pricing-overview's 'See plans' sits at the left). Her light stays, her words leave sight (alive-dock.js names her in the toggle's aria-label) and the whole tab is the toggle. Line 8432 (ai.features.dock_yield_tab_says_talk, read only with line 7011 lit): the dock carries alive-dock--yield-talk and the tab says 'Talk' ('Habla' on a Spanish dock) in 13 px #a2f1cd on #101e24 (about 13:1), still flush right; the word is drawn by the toggle's ::after, so the button keeps its words and alive-dock.js keeps its aria-label. Line 9749 (dock-edge-tab-clear-of-card-text-phone-r1): the 52 px tab covered the end of a step card's line on /features/agent-creator at 375, so the tab is 24 px wide (the page's 16 px gutter plus 8 px) and 76 px tall, its word turned to run top to bottom below the light; the whole tab stays the toggle. Line 10140 (dock-edge-tab-toggle-24px-target-r1): the live check measured that toggle 23 px wide, inside the tab's 1 px left border, so the Talk tab's toggle reaches 1 px out over that border and the tap area is the whole 24 px (WCAG 2.5.8); the tab does not move. */
@media (max-width: 640px){.alive-dock[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"]{right:0;width:40px;max-width:40px;border-right:0;border-radius:26px 0 0 26px}.alive-dock[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__header{position:relative;justify-content:center;gap:0;min-height:52px;padding:0}.alive-dock[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__identity{gap:0;font-size:0}.alive-dock--pill-ai[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__who{gap:0}.alive-dock--pill-ai[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__names{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.alive-dock[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__light{width:12px;height:12px}.alive-dock[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__toggle{position:absolute;inset:0;width:auto;min-height:0;padding:0;border:0;border-radius:inherit;background:transparent;color:transparent;font-size:0;overflow:hidden}.alive-dock.alive-dock--yield-talk[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"]{width:24px;max-width:24px;height:auto;background:#101e24;border-color:#a2f1cd;border-radius:12px 0 0 12px}.alive-dock.alive-dock--yield-talk[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__header{align-items:flex-start;min-height:76px;padding-top:10px}.alive-dock.alive-dock--yield-talk[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__toggle{inset:0 0 0 -1px}.alive-dock.alive-dock--yield-talk[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__toggle::before{top:21px}.alive-dock.alive-dock--yield-talk[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__toggle::after{content:"Talk";position:absolute;top:28px;left:0;right:0;width:16px;margin:0 auto;writing-mode:vertical-rl;font:700 13px/16px system-ui,sans-serif;letter-spacing:0;color:#a2f1cd;text-align:start;text-indent:0;white-space:nowrap}.alive-dock.alive-dock--yield-talk-es[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__toggle::after{content:"Habla"}html:has(.alive-dock[data-alive-dock-yielding="1"]) [data-alive-dock-yield] .ns-content-card{padding-inline-end:44px}}
/* Line 9766 (features-agent-creator-cards-whole-beside-tab-r2, fix forward of line 9037, same dock_yields_to_hero key): at 375 the edge tab still covered the right end of step card 1 on /features/agent-creator, and at 1440 the full pill sat over card 3's last line. While the dock yields, a card inside the yield band keeps 44 px clear on its right at 640 px and under (the last rule of line 7011's phone block above); from 641 px up the closed classic pill folds to her 48 px round face with its AI mark (the line 7993 own-stage corner face; alive-dock.js draws the face from her still) and unfolds when the band leaves. An open dock never folds; a page without a yield band never yields. */
@media (min-width: 641px){.alive-dock:not(.alive-dock--voice-first)[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"]{width:48px;height:48px;max-width:48px;inset-inline-end:16px;bottom:calc(16px + env(safe-area-inset-bottom));border-radius:50%;padding:0;overflow:visible}.alive-dock:not(.alive-dock--voice-first)[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__header{position:relative;width:48px;height:48px;min-height:0;padding:0;gap:0;justify-content:center}.alive-dock:not(.alive-dock--voice-first)[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__header>img{display:block!important;width:44px;height:44px;border-radius:50%;object-fit:cover;object-position:50% 18%;background:#0c151b;pointer-events:none}.alive-dock:not(.alive-dock--voice-first)[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__header>span:not(.ns-ai-mark){position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.alive-dock:not(.alive-dock--voice-first)[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__header>.ns-ai-mark{display:inline-block!important}.alive-dock:not(.alive-dock--voice-first)[data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__toggle{position:absolute;inset:0;width:48px;height:48px;min-height:48px;padding:0;border:2px solid #a2f1cd;border-radius:50%;background:transparent;color:transparent;font-size:0}}
@media (prefers-reduced-motion:reduce){.alive-dock *{scroll-behavior:auto}}
/* Line 7234 (ai.features.feature_talk_open_answers): a page's Talk door tapped while the dock is already open rings the dock's Tap to talk control for 1.5 s (feature-talk-opener.js adds and removes is-called-out); with reduced motion the ring is a static outline. */
.alive-dock [data-alive-dock-talk].is-called-out{outline:3px solid #f59e0b;outline-offset:3px;animation:alive-dock-called-out .75s ease-out 2}
@keyframes alive-dock-called-out{from{box-shadow:0 0 0 0 #f59e0bb3}to{box-shadow:0 0 0 14px #f59e0b00}}
@media (prefers-reduced-motion:reduce){.alive-dock [data-alive-dock-talk].is-called-out{animation:none}}
/* Line 8396: the voice-first dock's Talk (live /help guides) takes the same call-out. */
.alive-dock [data-door-voice-talk].is-called-out{outline:3px solid #f59e0b;outline-offset:3px;animation:alive-dock-called-out .75s ease-out 2}
@media (prefers-reduced-motion:reduce){.alive-dock [data-door-voice-talk].is-called-out{animation:none}}
/* Line 9038 (quiet-pages-classic-pill-clear-of-reading-text-wide-r2, fix forward of line 8820, whose rule reaches only the voice-first rest pill): from 768 px up the closed classic pill that /docs and the help guides render never sits on a line of text. A page that publishes the gutter right of its reading column (--ns-reading-right, in a <style data-ns-reading-measure>) gets the pill no wider than that gutter less 32 px and never over 420 px; under a 288 px gutter (the docs' 112 px at 1440) the step term (gutter - 287px) * 1000 is 0 or less and the pill folds to a 56 px round light with 'Talk' ('Habla' on a Spanish dock). The name leaves sight only (the aside keeps its aria-label, the toggle its words) and the AI mark comes back on the face. --alive-dock-pill-room (the pill + its 16 px offset + 16 px) is what the page's own column yields on its right where its gutter is narrower, and the page keeps room below its last line (56 px + its offset + 16 px; 84 px offset over the help-unavailable bar). A page without the measure keeps main's pill; the phone blocks above are untouched. */
@media (min-width: 768px){@supports (container-type: inline-size){
:root:has(style[data-ns-reading-measure]):has(.alive-dock--pill-ai[data-alive-dock-state="collapsed"]){--alive-dock-pill-w:max(56px,min(420px,calc(var(--ns-reading-right) - 32px),calc((var(--ns-reading-right) - 287px) * 1000)));--alive-dock-pill-room:calc(var(--alive-dock-pill-w) + 32px)}
:root:has(style[data-ns-reading-measure]) .alive-dock.alive-dock--pill-ai[data-alive-dock-state="collapsed"]{container:ns-reading-pill/inline-size;width:var(--alive-dock-pill-w)}
:root:has(style[data-ns-reading-measure]) body:has(.alive-dock--pill-ai[data-alive-dock-state="collapsed"]){padding-bottom:calc(56px + 16px + 16px + env(safe-area-inset-bottom))}
:root:has(style[data-ns-reading-measure]) body:has(.netshow-help-unavailable, #ns-live-human):has(.alive-dock--pill-ai[data-alive-dock-state="collapsed"]){padding-bottom:calc(56px + 84px + 16px + env(safe-area-inset-bottom))}
@container ns-reading-pill (max-width: 339.98px){.alive-dock.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__toggle{padding:10px 14px}.alive-dock.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__toggle-long{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}}
@container ns-reading-pill (max-width: 199.98px){.alive-dock.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__header{position:relative;justify-content:center;align-items:flex-start;gap:0;height:54px;padding:13px 0 0}.alive-dock.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__who{gap:0}.alive-dock.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__names{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.alive-dock.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__light{width:10px;height:10px}.alive-dock.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__toggle{position:absolute;inset:0;width:auto;min-height:0;padding:0;border:0;border-radius:50%;background:transparent;color:transparent;font-size:0;overflow:hidden}.alive-dock.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__toggle::after{content:"Talk";position:absolute;left:0;right:0;bottom:11px;font:700 13px/16px system-ui,sans-serif;letter-spacing:0;color:#a2f1cd;text-align:center;white-space:nowrap}.alive-dock.alive-dock--pill-ai[data-alive-dock-lang="es"][data-alive-dock-state="collapsed"] .alive-dock__toggle::after{content:"Habla"}.alive-dock.alive-dock--pill-ai[data-alive-dock-state="collapsed"] .alive-dock__header>.ns-ai-mark{display:inline-block!important;top:-6px!important;right:-10px!important;left:auto!important;bottom:auto!important;transform:none!important;padding:0 3px!important;font-size:12px!important;line-height:14px!important}}
}}
/* Line 9683 (ai.features.help_dock_greeting_bubble, help-pages-guide-greeting-visible-at-rest-r1): live check 80543a2ce3b found 'Ask me how to do anything in NetShow.' only inside the hidden body of the closed classic pill on /help and the help guides (0 of 9 widths). With the key on, the dock view prints the same words once more in .alive-dock__bubble outside the body (aria-hidden: the body copy stays the live region). It carries hidden, so it stays out of sight while the dock is open and wherever this sheet is not loaded; only the closed pill shows it (!important over the page's Bootstrap [hidden], as line 8472 does): 8 px above the pill's right edge, at most two lines (the 68-character line fits one line at 375 only below 11 px), never wider than the pill column (100vw - 32px), and it never takes a tap. The page keeps room below its last line for it too (its 52 px + 8 px on top of line 6008's reserve). From 768 px up it is exactly the pill's width (two lines beside the 371 px 'Talk with your guide' pill), and on a page that publishes its reading measure (the help guides, whose pill folds to 56 px under 1294 px) it takes line 8820's bound beside the reading column (--ns-docs-reading) with a 320 px floor, the two-line width of the 464 px line in the Linux headless font; where that gutter is narrower than the bubble (under 1424 px) line 9038's --alive-dock-pill-room grows to the bubble + 32 px, so the column's text ends 16 px short of it. Main's phone blocks are untouched. */
.alive-dock[data-alive-dock-state="collapsed"]>.alive-dock__bubble{position:absolute;right:0;bottom:calc(100% + 8px);display:-webkit-box!important;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;width:max-content;max-width:calc(100vw - 32px);margin:0;padding:7px 12px;border:1px solid #36515a;border-radius:14px;background:#101e24;color:#edf7f5;font-size:13px;line-height:18px;text-align:left;box-shadow:0 8px 24px #0006;pointer-events:none}
body:has(.alive-dock[data-alive-dock-state="collapsed"]>.alive-dock__bubble){padding-bottom:calc(var(--alive-dock-h,56px) + 84px + env(safe-area-inset-bottom))}body:has(.netshow-help-unavailable, #ns-live-human):has(.alive-dock[data-alive-dock-state="collapsed"]>.alive-dock__bubble){padding-bottom:calc(var(--alive-dock-h,56px) + 152px + env(safe-area-inset-bottom))}
@media (min-width: 768px){.alive-dock[data-alive-dock-state="collapsed"]>.alive-dock__bubble{left:0;width:auto}:root:has(style[data-ns-reading-measure]) .alive-dock[data-alive-dock-state="collapsed"]>.alive-dock__bubble{left:auto;width:max-content;max-width:min(420px,calc(100vw - 32px),max(320px,calc((100vw - var(--ns-docs-reading,-100vw)) / 2 - 32px)))}@supports (container-type: inline-size){
:root:has(style[data-ns-reading-measure]):has(.alive-dock--pill-ai[data-alive-dock-state="collapsed"]>.alive-dock__bubble){--alive-dock-pill-room:max(calc(var(--alive-dock-pill-w) + 32px),calc(min(420px,calc(100vw - 32px),max(320px,calc((100vw - var(--ns-docs-reading,-100vw)) / 2 - 32px))) + 32px))}
}}

/* Line 11305: the trade shell owns a fixed viewport and scrolls its own reading plane.
   Dock measurements must never resize that plane. Reading cards stay fixed overlays;
   the classic pill keeps one box and opens its body above it, without a height transition.
   Important overrides the shared voice sheet's later, state-dependent room selectors. */
body.ns-stage-body:has(.ns-trade[data-trade-dock-holds-still]) { padding-bottom: 0 !important; }
body.ns-stage-body:has(.ns-trade[data-trade-dock-holds-still]) :is(#main-content, main:not(#main-content main)) { padding-bottom: 0 !important; }
body:has(.ns-trade[data-trade-dock-holds-still]) .alive-dock:not(.alive-dock--voice-first)[data-alive-dock-state] {
    inset: auto 16px calc(16px + env(safe-area-inset-bottom)) auto;
    width: min(360px, calc(100vw - 32px));
    max-width: calc(100vw - 32px);
    height: 64px;
    max-height: none;
    padding: 0;
    border-radius: 999px;
    overflow: visible;
    transition: transform .2s ease-out;
}
body:has(.ns-trade[data-trade-dock-holds-still]) .alive-dock:not(.alive-dock--voice-first)[data-alive-dock-state] .alive-dock__header {
    height: 62px;
    padding: 4px 4px 4px 14px;
}
body:has(.ns-trade[data-trade-dock-holds-still]) .alive-dock:not(.alive-dock--voice-first) .alive-dock__body {
    position: absolute;
    inset: auto 0 calc(100% + 8px);
    max-height: calc(100dvh - 112px - env(safe-area-inset-bottom));
    overflow: auto;
    background: #101e24;
    border: 1px solid #36515a;
    border-radius: 18px;
    box-shadow: 0 12px 48px #0006;
}
/* Anchor the voice overlay at one layout coordinate. Its upward expansion uses a
   transform, so reading-card growth cannot move the dock's layout origin either. */
body:has(.ns-trade[data-trade-dock-holds-still]) .alive-dock.alive-dock--voice-first[data-alive-dock-state] {
    position: fixed;
    width: min(420px, calc(100vw - 32px)) !important;
    left: auto !important;
    right: 16px !important;
    top: calc(100dvh - 16px - env(safe-area-inset-bottom)) !important;
    bottom: auto !important;
    translate: 0 -100% !important;
}
/* SEED-0441 follow-up: on a wide trade door the live caption grows upward from a
   fixed anchor instead of adding a row before the face and lifting it. The phone
   sheet keeps its grid caption; only the already-marked hold-still trade shell is
   affected. */
@media (min-width: 768px) {
    body:has(.ns-trade[data-trade-dock-holds-still]) .alive-dock.alive-dock--voice-first[data-alive-dock-state] > .ns-door-voice-controls > [data-door-voice-caption] {
        position: absolute;
        right: 0;
        bottom: calc(100% + 8px);
        width: min(420px, calc(100vw - 32px));
        max-width: none;
        margin: 0;
        padding: 10px 14px;
        border: 1px solid #36515a;
        border-radius: 14px;
        background: #101e24;
        color: #edf7f5;
        box-shadow: 0 8px 24px #0006;
    }
}
@media (prefers-reduced-motion: reduce) {
    body:has(.ns-trade[data-trade-dock-holds-still]) .alive-dock:not(.alive-dock--voice-first)[data-alive-dock-state] { transition: none; }
}
/* Line 13803 (ai.features.register_free_path_login_greets, register-free-path-plain-and-login-greets-wide-r1): launch walk L6 met a 'Talk with your guide' pill waiting for a tap on /login at 1024 and 1440. With the key on, /login's closed dock carries data-alive-dock-greets-wide="1" and her words in .alive-dock__greets-wide, above the closed dock's right edge; public/js/alive-dock.js shows them from 481 px up only while they clear every .auth-card (the hidden attribute otherwise, which also keeps them off phones: no second phone block). An open dock never shows them. Key off: no marker, no change. */
.alive-dock[data-alive-dock-greets-wide="1"]>.alive-dock__greets-wide{position:absolute;right:0;bottom:calc(100% + 8px);width:max-content;max-width:min(320px,calc(100vw - 32px));margin:0;padding:7px 12px;border:1px solid #36515a;border-radius:14px;background:#101e24;color:#edf7f5;font-size:13px;line-height:18px;text-align:left;box-shadow:0 8px 24px #0006;pointer-events:none}.alive-dock[data-alive-dock-greets-wide="1"]>.alive-dock__greets-wide[hidden],.alive-dock[data-alive-dock-greets-wide="1"][data-alive-dock-state="open"]>.alive-dock__greets-wide{display:none}
/* Line 15843 (upskill-voice-12-r1): inside the Google-path token scope ([data-ns-tokens], the split shell with shell_design_tokens
   lit, or a .ns-page) the guide dock reads the --ns-* tokens: surface, text, lines and the speaking accent follow light and dark.
   Every var() carries main's colour as its fallback, so a dock outside a scope that declares the tokens paints as before. */
[data-ns-tokens] .alive-dock{color:var(--ns-text,#edf7f5);background:var(--ns-surface,#101e24);border-color:var(--ns-border-strong,#36515a)}
[data-ns-tokens] .alive-dock__toggle{border-color:var(--ns-border-strong,#52717a);color:var(--ns-text,#edf7f5)}
[data-ns-tokens] .alive-dock__greeting{color:var(--ns-text-2,#c3dcd7)}
[data-ns-tokens] .alive-dock__still{background:var(--ns-bg-deep,#0c151b)}
[data-ns-tokens] .alive-dock__light{background:var(--ns-speaking,#8be3be)}
[data-ns-tokens] .alive-dock[data-alive-dock-state="collapsed"] .alive-dock__toggle{border-color:var(--ns-speaking,#a2f1cd);background:var(--ns-speaking,#a2f1cd);color:var(--ns-bg,#102720)}
[data-ns-tokens] .alive-dock--pill-ai .alive-dock__ai-words{color:var(--ns-speaking,#a2f1cd)}
[data-ns-tokens] .alive-dock--pill-ai .alive-dock__full-line{background:var(--ns-surface,#101e24)}
[data-ns-tokens] .alive-dock--mini[data-alive-dock-state="collapsed"] .alive-dock__toggle{border-color:var(--ns-speaking,#a2f1cd);background:var(--ns-surface,#101e24);color:transparent}
[data-ns-tokens] .alive-dock[data-alive-dock-state="collapsed"]>.alive-dock__bubble,[data-ns-tokens] .alive-dock[data-alive-dock-greets-wide="1"]>.alive-dock__greets-wide{border-color:var(--ns-border-strong,#36515a);background:var(--ns-surface,#101e24);color:var(--ns-text,#edf7f5)}
[data-ns-tokens] .alive-dock [data-alive-dock-talk].is-called-out,[data-ns-tokens] .alive-dock [data-door-voice-talk].is-called-out{outline-color:var(--ns-gold,#f59e0b)}
/* Line 16214 (live check of the Google-path pages): the Google-path scope (.ns-gp, a .ns-doors-gp body; css/ns-tokens.css)
   declares --ns-bg, white in light, but no --ns-speaking, so the lit /live-avatars/look-9 in a light browser paired white ink
   with the fallback mint on the closed pill (1.31:1) and drew its AI words mint on white. Inside that scope the dock carries a
   light-scheme speaking teal (5.3:1 under white ink, 4.8:1 on the #f1f3f4 surface); under a dark scheme the token is reset to
   initial, so every var(--ns-speaking, ...) above paints main's fallback as before. */
[data-ns-tokens] :is(.ns-gp, body:has(.ns-doors-gp)) .alive-dock{--ns-speaking:#00796b}
@media (prefers-color-scheme: dark){[data-ns-tokens] :is(.ns-gp, body:has(.ns-doors-gp)) .alive-dock{--ns-speaking:initial}}

/* Line 9014: reuse line 9038's container treatment when a reading page has no published measure.
   Keep the reserved gutter stable when the panel opens, so the article does not move. */
@media (min-width: 768px) and (max-width: 1199.98px){
:root:not(:has(style[data-ns-reading-measure])) body:has(.alive-dock--pill-ai[data-alive-dock-reading-clear="1"]) main[data-alive-dock-reading-clear="1"]{box-sizing:border-box;padding-inline-end:88px}
:root:not(:has(style[data-ns-reading-measure])) .alive-dock.alive-dock--pill-ai[data-alive-dock-reading-clear="1"][data-alive-dock-state="collapsed"]{container:ns-reading-pill/inline-size;width:56px;max-width:56px}
body:has(.alive-dock--pill-ai[data-alive-dock-reading-clear="1"][data-alive-dock-state="collapsed"]){padding-bottom:calc(var(--alive-dock-h,56px) + 16px + 16px + env(safe-area-inset-bottom))}
body:has(.netshow-help-unavailable, #ns-live-human):has(.alive-dock--pill-ai[data-alive-dock-reading-clear="1"][data-alive-dock-state="collapsed"]){padding-bottom:calc(var(--alive-dock-h,56px) + 84px + 16px + env(safe-area-inset-bottom))}
}

/* Line 16079 (fix_stage_03, data-alive-dock-reading-wide): above 1199 px an unmeasured reading page folds the closed
   classic pill to line 9014's 56 px tab and keeps its 88 px gutter, so the full pill never sits beside long lines. */
@media (min-width: 1200px){
:root:not(:has(style[data-ns-reading-measure])) body:has(.alive-dock--pill-ai[data-alive-dock-reading-wide="1"]) main[data-alive-dock-reading-clear="1"]{box-sizing:border-box;padding-inline-end:88px}
:root:not(:has(style[data-ns-reading-measure])) .alive-dock.alive-dock--pill-ai[data-alive-dock-reading-wide="1"][data-alive-dock-state="collapsed"]{container:ns-reading-pill/inline-size;width:56px;max-width:56px}
body:has(.alive-dock--pill-ai[data-alive-dock-reading-wide="1"][data-alive-dock-state="collapsed"]){padding-bottom:calc(var(--alive-dock-h,56px) + 16px + 16px + env(safe-area-inset-bottom))}
}

@media (max-width: 639.98px){
.alive-dock--pill-ai[data-alive-dock-reading-clear="1"][data-alive-dock-state="collapsed"][data-alive-dock-yielding="1"] .alive-dock__toggle::after{content:"AI";position:absolute;top:4px;right:5px;font:700 9px/12px system-ui,sans-serif;color:#a2f1cd}
body:has(.alive-dock--pill-ai[data-alive-dock-reading-clear="1"]) main[data-alive-dock-reading-clear="1"]{box-sizing:border-box;padding-inline-end:48px}
}
.alive-dock[data-door-live-hello="1"] .alive-dock__full-line,body:has(.ns-trade[data-trade-dock-holds-still]) .alive-dock[data-door-live-hello="1"]:not(.alive-dock--voice-first) .alive-dock__body{color:#edf7f5}
/* Line 5644 (dock_never_opens_itself): the hello tip hangs above the closed pill, outside its box, so the pill never moves and the page underneath stays clickable. */
.alive-dock__tip{display:none}
@media (min-width: 1200px){.alive-dock[data-alive-dock-state="collapsed"] .alive-dock__tip:not([hidden]){display:block;position:absolute;right:0;bottom:calc(100% + 10px);width:max-content;max-width:min(300px, calc(100vw - 48px));margin:0;padding:10px 14px;border:1px solid #36515a;border-radius:14px;background:#101e24;color:#edf7f5;font:500 14px/1.4 system-ui,sans-serif;box-shadow:0 8px 28px #0006;pointer-events:none;animation:alive-dock-tip .25s ease-out both}}
@keyframes alive-dock-tip{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){.alive-dock__tip{animation:none}}
