  :root{ /* Mirrors static/main.css so the app and the courses share a voice. */
         --font-ui-latin:'DM Sans';
         --font-ui-cjk-tw:'Noto Sans TC','PingFang TC','Microsoft JhengHei';
         --font-heading-latin:var(--font-ui-latin),var(--font-ui-cjk-tw),-apple-system,sans-serif;
         --font-learning-content:var(--font-ui-latin),var(--font-ui-cjk-tw),-apple-system,sans-serif;
         --bg:#281720; --bg-soft:#3a2230; --panel:#452936; --panel-2:#51313f;
         --line:rgba(239,211,194,.16); --ink:#fffaf5; --dim:#d5b9c4; --said:#d5b9c4;
         --gold:#f0bf58; --gold-soft:#ffe2a1; --mint:#a8e6cf; --red:#ee5b63; --success:#2f9e6f;
         --shadow:0 22px 60px rgba(12,4,8,.28); }
  *{ box-sizing:border-box; -webkit-tap-highlight-color:transparent; }
  body{ margin:0; background:
        radial-gradient(circle at 82% 8%,rgba(240,191,88,.12),transparent 25%),
        radial-gradient(circle at 12% 90%,rgba(168,230,207,.08),transparent 28%),
        linear-gradient(155deg,var(--bg-soft),var(--bg) 64%); color:var(--ink);
        /* 拉丁排在中文前面：中文字在拉丁字型裡找不到，會自然落到 Noto Sans TC，
           但英文就不會被中文字型的拉丁字取代。 */
        font-family:var(--font-ui-latin),var(--font-ui-cjk-tw),-apple-system,sans-serif; }
  body::before{ content:attr(data-city); position:fixed; right:-18px; bottom:4vh; color:rgba(255,255,255,.018);
                font-family:Georgia,serif; font-size:clamp(90px,24vw,190px); font-weight:600; letter-spacing:-8px;
                writing-mode:vertical-rl; pointer-events:none; }
  /* 100dvh, with 100vh as the fallback for browsers that lack it. On iOS
     Safari 100vh is the height WITHOUT the toolbars, so the last thing on
     the page — the start button — sat underneath the bottom bar. */
  .wrap{ max-width:540px; margin:0 auto; min-height:100vh; min-height:100dvh;
         display:flex; flex-direction:column; position:relative; }
  header{ padding:18px 20px 10px; }
  .course-nav{ display:flex; align-items:stretch; gap:5px; margin:0 -2px 14px; overflow-x:auto;
               padding:2px 2px 6px; scrollbar-width:none; }
  .course-nav::-webkit-scrollbar{ display:none; }
  .course-nav.has-scenarios{ flex-direction:column; align-items:stretch; gap:7px; }
  .nav-row{ display:flex; justify-content:center; gap:6px; overflow-x:auto; scrollbar-width:none; }
  .nav-row::-webkit-scrollbar{ display:none; }
  .scenario-row .course-link{ min-height:36px; flex-direction:row; gap:5px; }
  .step-row .course-link{ min-height:42px; }
  .scenario-select-wrap{ width:100%; max-width:430px; margin:0 auto; position:relative; }
  .scenario-select{ width:100%; appearance:none; border:1px solid rgba(255,255,255,.3); border-radius:13px;
                    background:rgba(255,255,255,.1); color:#fff; padding:9px 38px 9px 14px;
                    font:700 13px/1.2 inherit; cursor:pointer; }
  .scenario-select-wrap::after{ content:"⌄"; position:absolute; right:14px; top:50%; transform:translateY(-58%);
                                color:#fff; pointer-events:none; font-size:17px; }
  .scenario-select option{ color:#24383d; background:#fff; }
  .course-label{ display:none; }
  .course-link{ min-width:56px; min-height:43px; display:flex; flex-direction:column; justify-content:center; gap:1px;
                border-radius:14px; border:1px solid var(--line); color:var(--dim); text-align:center;
                text-decoration:none; font-size:9px; background:rgba(255,255,255,.025); padding:5px; }
  .course-link .mission-icon{ font-size:14px; line-height:1; font-weight:700; }
  .course-link .mission-name{ white-space:nowrap; }
  .course-link.on{ background:linear-gradient(145deg,var(--gold-soft),var(--gold)); border-color:var(--gold);
                   color:var(--bg); font-weight:700; box-shadow:0 8px 24px rgba(240,191,88,.2); }
  .course-link.locked{ opacity:.38; cursor:not-allowed; }
  header h1{ font-size:22px; margin:0; letter-spacing:.01em; }
  header p{ margin:4px 0 0; color:var(--dim); font-size:13px; }
  body.intro-mode header{ padding-bottom:2px; }
  body.intro-mode header h1,body.intro-mode header p{ display:none; }
  .stage{ flex:1; padding:8px 20px calc(24px + env(safe-area-inset-bottom, 0px)); }
  .btn{ display:block; width:100%; border:0; border-radius:14px; padding:15px;
        font-size:17px; font-weight:600; cursor:pointer; text-decoration:none; }
  .btn.gold{ background:var(--gold); color:#3a2230; }
  .btn.start-cta{ width:auto; min-width:210px; max-width:82%; margin-left:auto; margin-right:auto;
                  padding:10px 20px; border-radius:14px; font-size:16px; }
  .orientation-actions{ width:min(100%,360px); margin:22px auto 0; display:grid; gap:10px; }
  .orientation-actions.single-action{ width:min(100%,320px); }
  /* Flat, single fill, no lift. A gradient plus an inner highlight plus a
     coloured drop shadow is three tricks doing the job one solid colour does,
     and it is the loudest thing dating this screen. */
  .btn.orientation-start{ width:100%; min-width:0; max-width:none; margin:0; padding:14px 24px;
                          border:0; border-radius:14px;
                          background:var(--gold); color:#34232c;
                          text-align:center; letter-spacing:-.01em;
                          transition:background-color .16s ease; }
  .btn.orientation-start:hover{ background:#eecb5f; }
  .start-choice{ width:auto; margin:0 auto; display:flex; align-items:center; justify-content:center; gap:12px; }
  .start-choice .dog-action{ width:fit-content; max-width:90%; padding:10px 18px; border-radius:12px;
                             font-size:.92rem; font-weight:600; white-space:nowrap; }
  .start-choice .dog-action.secondary{ background:#fff; color:var(--gold-ink); border:2px solid rgba(209,157,43,.55); }
  .start-choice .dog-action.primary{ background:var(--gold); color:#3a2230; border:2px solid var(--gold); }
  /* The compact sizing above is for the two-button row. A lone button — the
     section transition, or a mission start with no opener — carries a longer
     label and looks squat at that size, so it takes the mission CTA's shape. */
  /* The lone continue button. Same treatment as .btn.orientation-start, which
     is the point: this rule carried its own copy of the gradient, the inset
     highlight and the coloured drop, so flattening one button left this one
     behind on a screen the learner sees between every section. */
  .start-choice .dog-action:only-child{ width:min(100%,320px); max-width:100%;
                                        padding:15px 26px; border-radius:14px;
                                        font-size:17px; letter-spacing:-.01em;
                                        border:0;
                                        background:var(--gold); color:#34232c;
                                        transition:background-color .16s ease; }
  .start-choice .dog-action:only-child:hover{ background:#eecb5f; }
  .btn.teal{ background:#08a0bc; color:#fff; }
  .center>.btn.teal{ max-width:420px; margin-left:auto; margin-right:auto; }
  .btn.next-compact{ display:inline-block; width:auto; min-width:150px; margin:18px auto 10px; padding:13px 28px;
                     background:#fff; color:#0793ad; border:2px solid #62b8cc; border-radius:18px; text-decoration:none; }
  .completion-stage{ min-height:620px; }
  /* 按鈕跟著內容走。原本釘在舞台 60% 的位置，內容一少中間就開一個大洞。 */
  .completion-actions{ margin:30px auto 0; width:min(420px,calc(100% - 40px));
                       display:flex; flex-direction:column; align-items:center; position:relative; z-index:3; }
  .completion-actions .btn.completion-compact{ width:min(100%,280px); min-width:0; margin:8px auto;
                                                padding:13px 24px; border-radius:18px; }
  .completion-secondary{ display:flex; flex-direction:row; gap:12px;
                         width:min(100%,420px); margin:10px auto 0; }
  .completion-secondary .btn.completion-compact{ flex:1; width:auto; min-width:0; margin:0;
                                                 padding:13px 12px; font-size:15px; border-radius:18px;
                                                 color:#fffaf5; border:1px solid rgba(255,255,255,.16);
                                                 background-color:var(--teal);
                                                 background-image:
                                                   linear-gradient(145deg,rgba(255,255,255,.07),rgba(0,35,43,.10)),
                                                   repeating-linear-gradient(135deg,transparent 0 12px,rgba(255,255,255,.045) 12px 13px);
                                                 box-shadow:0 8px 20px rgba(8,120,139,.16);
                                                 transition:transform .16s ease,box-shadow .16s ease,filter .16s ease; }
  .completion-secondary .btn.completion-compact:hover{ transform:translateY(-1px); filter:saturate(1.06);
                                                        box-shadow:0 11px 24px rgba(8,120,139,.22); }
  .btn.ghost{ background:transparent; color:var(--ink); border:1.5px solid var(--line); }
  .btn:disabled{ opacity:.4; cursor:default; }
  /* 選做的關卡：看得到、點得到，但視覺上不跟必走的關卡搶。 */
  .course-link.optional{ opacity:.72; border-style:dashed; }
  .roadmap-item.optional{ opacity:.72; }
  .card{ background:linear-gradient(145deg,rgba(255,255,255,.045),rgba(255,255,255,.018)),var(--panel);
         border:1px solid var(--line); border-radius:18px; padding:14px 16px; margin:10px 0;
         box-shadow:0 9px 26px rgba(12,4,8,.12); transition:box-shadow .18s,border-color .18s,transform .18s; }
  .card.glow{ box-shadow:inset 0 0 0 2px var(--gold); border-color:var(--gold); }
  /* Was transform:scale(1.05) — the card jumped and shoved its neighbours a
     pixel each way. The ring says the same thing without moving the layout. */
  .card.now{ box-shadow:inset 0 0 0 2px var(--gold); border-color:var(--gold); z-index:1; }
  .bigcard{ background:linear-gradient(150deg,var(--panel-2),var(--panel)); border:1px solid var(--line); border-radius:26px;
            padding:38px 22px 46px; min-height:200px; display:flex; flex-direction:column;
            align-items:center; justify-content:center; gap:14px; text-align:center; position:relative; box-shadow:var(--shadow); overflow:hidden; }
  .orientation-hero{ min-height:440px; align-items:stretch; text-align:left; padding:30px 26px; }
  .orientation-hero.orientation-hero--unframed{ min-height:0; padding:0; border:0; border-radius:0; background:none; box-shadow:none; overflow:visible; }
  .orientation-hero.orientation-hero--unframed::before{ display:none; }
  .orientation-hero::before{ content:attr(data-location); white-space:pre; position:absolute; right:20px; top:18px;
                             color:rgba(255,255,255,.05); font:800 33px/1 Georgia,serif; text-align:right; }
  .passport-stamp{ width:max-content; color:var(--gold-soft);
                   font-size:var(--text-meta); font-weight:600; letter-spacing:.12em; text-transform:uppercase; }
  .hero-kicker{ color:var(--mint); font-size:15px; font-weight:600; margin-top:auto; }
  .hero-title{ font-family:var(--font-heading-latin); font-size:var(--text-display); line-height:var(--lh-display);
               margin:7px 0 10px; font-weight:600; letter-spacing:-.025em; }
  [data-hl="zh"] .hero-title{ font-weight:500; letter-spacing:0; }
  /* Sits on the title's own baseline rather than above it: a course badge
     stacked over the name reads as a second heading. */
  .hero-icon{ margin-right:10px; font-size:.85em; vertical-align:.04em; }

  .hero-copy{ color:var(--dim); font-size:var(--text-body); line-height:var(--lh-body); margin:0 0 22px; }
  .scenario-task-lead{ margin:10px 0 2px; color:var(--dim); font-size:var(--text-meta); font-weight:650;
                       letter-spacing:.04em; text-transform:uppercase; }
  .scenario-task{ margin:0 0 4px; color:var(--ink); font-size:var(--text-body); line-height:var(--lh-body); font-weight:600; }
  /* Amber = not yet, green = done — the same legend the bulb topic list uses,
     so a learner reads both lists the same way. */
  .roadmap-legend{ display:flex; gap:18px; margin:6px 0 2px; font-size:var(--text-meta); color:var(--dim); }
  .roadmap-legend .dot{ display:inline-block; width:11px; height:11px; border-radius:50%;
                        margin-right:6px; vertical-align:-1px; }
  /* Named for what they mean, not what colour they carry: `dot.amber` had to be
     renamed the moment the colour was questioned, and a class that has to be
     renamed to change a colour is a class that was named wrong. */
  .roadmap-legend .dot.pending{ background:var(--gold); }
  .roadmap-legend .dot.done{ background:var(--success); }
  /* Tighter between rows, looser above the list. Even gaps everywhere made
     the list read as six unrelated bars instead of one block. */
  .mission-roadmap{ display:grid; gap:6px; margin-top:14px; }
  /* Translucent material rather than a solid box: a thin wash of the ink
     colour, a hairline at low alpha, and a blur so whatever passes behind
     (the city watermark) shows through instead of being covered. Opaque white
     on white needed a hard border to exist at all — this does not. */
  .roadmap-item{ display:flex; align-items:center; gap:12px; padding:11px 14px; border-radius:13px;
                 background:rgba(255,255,255,.04); border:1px solid var(--line);
                 -webkit-backdrop-filter:saturate(160%) blur(14px);
                 backdrop-filter:saturate(160%) blur(14px); }
  .roadmap-number{ width:26px; height:26px; display:grid; place-items:center; border-radius:50%; flex:0 0 auto;
                   color:var(--gold-ink); background:var(--gold); font-size:12px; font-weight:700; }
  .roadmap-item.complete .roadmap-number{ color:#fff; background:var(--success); }
  .roadmap-check{ flex:0 0 auto; width:26px; height:26px; display:grid; place-items:center;
                  border-radius:50%; background:rgba(47,158,111,.16); color:var(--success);
                  font-size:14px; font-weight:800; }
  .roadmap-text{ min-width:0; flex:1; font-size:var(--text-body); color:var(--ink); font-weight:500; letter-spacing:-.01em; }
  .roadmap-free-badge{ flex:0 0 auto; padding:4px 8px; border-radius:999px;
                       background:rgba(240,185,68,.16); color:#9a6500;
                       font-size:10px; font-weight:750; letter-spacing:.08em; }
  .scenario-title-row{ display:flex; align-items:center; gap:10px; }
  .scenario-title-row .hero-title{ flex:0 1 auto; }
  .mission-intro{ background:linear-gradient(145deg,rgba(255,255,255,.055),rgba(255,255,255,.018)),var(--panel);
                  border:1px solid var(--line); border-radius:22px; padding:20px; margin-bottom:12px; box-shadow:var(--shadow); }
  .mission-eyebrow{ color:var(--gold); font-size:11px; font-weight:600; letter-spacing:.12em; text-transform:uppercase; }
  .mission-title{ font-size:25px; line-height:1.25; margin:7px 0 5px; font-weight:600; }
  .mission-subtitle{ color:var(--dim); font-size:14px; line-height:1.55; }
  .compact-mission-title{ margin:2px 0 14px; color:var(--ink); font-size:25px; line-height:1.25; font-weight:600; }
  /* Fills whatever the stage has left, rather than a fixed 620px. That number
     was tuned on one screen: on a phone whose visible area is 700px it made
     header + padding + 620 = 746, so the start button hung 46px below the fold.
     `.stage` is already flex:1 inside a 100dvh wrap, so stretching to it is the
     same intent without the magic number. */
  /* The class both screens that use this layout set — the mission opener and
     the section transition. `body.intro-mode` covered only the first. */
  .stage.mission-start-stage{ display:flex; flex-direction:column; }
  .mission-start-layout{ flex:1; min-height:0; display:flex; flex-direction:column; }
  .mission-start-content{ width:100%; }
  .mission-start-layout .compact-mission-title{ text-align:center; margin-top:4px; }
  .mission-start-layout .mission-overview{ width:100%; }
  .intro-text-copy{ white-space:pre-line; line-height:1.75; }
  .mission-start-layout .mission-start-spacer{ flex:1; min-height:24px; }
  /* The mission opener and the two section transitions have to land in exactly
     the same place: you cross between them in a single tap, and anything that
     moves reads as the page jumping. Three things used to move — a title of one
     line or two, a tip of one line or two, and the opener's row of dots, which
     the transitions did not have. Each is reserved, so the block is a constant
     height and centring it puts all three at the same y. */
  /* Bottom-aligned inside the reserved two lines, not centred: a one-line title
     centred in a two-line box put half a line of air between it and the tip
     below, and those two are one thought. The spare line goes above instead. */
  .mission-start-layout .compact-mission-title{ min-height:2.5em; display:flex;
                                                align-items:flex-end; justify-content:center;
                                                margin-bottom:10px; }
  /* The box hugs its own text; the space for a second line is reserved on the
     row around it instead. A `min-height` on the box itself made every one-line
     tip sit in a two-line panel — which is what "too tall" was. Reserving it one
     level up keeps the three screens identical without inflating the box. */
  .mission-start-layout .mission-overview{ min-height:92px; }
  .mission-start-layout .start-summary{ min-height:0; margin:0; padding:14px 18px; }
  .mission-start-layout .dots{ min-height:8px; }
  .mission-start-layout.sparse .mission-start-content{ flex:1; display:flex; flex-direction:column;
                                                       justify-content:center; }
  .mission-start-layout.sparse .mission-start-spacer{ display:none; }
  .mission-start-layout .btn.gold{ flex:0 0 auto; }
  .mission-brief{ display:grid; gap:10px; }
  .brief-row{ background:rgba(255,255,255,.045); border:1px solid var(--line); border-radius:15px; padding:14px; }
  .brief-label{ color:var(--gold); font-size:11px; font-weight:600; letter-spacing:.08em; margin-bottom:4px; }
  .brief-value{ color:var(--ink); font-size:16px; font-weight:600; }
  /* Bigger than a note: on these screens this line is the only content there
     is, and it was set at footnote size. */
  .start-summary{ background:var(--panel); border:1px solid var(--line); border-radius:16px;
                  padding:18px; margin:10px 0; text-align:center; color:var(--dim); font-size:18px; }
  .start-summary strong{ color:var(--gold); font-size:20px; }
  .rule-t.big{ font-size:27px; }
  .rule-n.big{ font-size:17px; color:var(--dim); line-height:1.7; }
  .rule-t{ font-weight:600; color:var(--gold); font-size:15px; }
  .rule-n{ color:var(--dim); font-size:13px; margin-top:2px; }
  .rule-x{ font-family:var(--font-learning-content); color:var(--mint);
           font-size:15px; font-weight:600; margin-top:6px; }
  .phrase{ font-family:var(--font-learning-content); font-size:40px;
           font-weight:600; letter-spacing:-.015em; text-align:center; text-wrap:balance; color:var(--mint); }
  .phrase-row{ display:flex; align-items:center; justify-content:center; gap:12px; margin:16px 0 6px; }
  /* Both practice cards put playback and copy on one left-aligned reading axis.
     The warm-up card used to centre its phrase instead, and a centred block is
     what made the play button look orphaned the moment a word wrapped: the
     glyphs pulled to the middle of a full-width box while the button stayed out
     at the edge, lined up against nothing. Left-aligned, the first line starts
     right beside it — and step 1 and step 2 now read the same way. */
  .sentence-card .phrase-row,
  .pronun-card .phrase-row{ width:100%; display:grid;
                            grid-template-columns:auto minmax(0,1fr);
                            align-items:start; justify-content:initial;
                            margin:2px 0 4px; }
  .sentence-card .phrase,
  .pronun-card .phrase{ min-width:0; text-align:left; text-wrap:pretty; }
  .pronun-card{ --play-gutter:58px; }
  .pronun-card .word-meta{ align-items:stretch; }
  /* `.word-meta .meaning{margin:0}` further down carries the same weight and
     comes later, so the gutter needs one more class to survive it. */
  .pronun-card .word-meta .meaning{ text-align:left; margin:0 0 0 var(--play-gutter); }
  .sentence-card .phrase{ font-size:29px; line-height:1.18; font-weight:500;
                          letter-spacing:-.01em; }
  /* The meaning reads under the sentence it translates, so it starts where the
     sentence starts: past the play button's column and the gap beside it. It
     was centred while the sentence was left-aligned, so it slid left and right
     with every phrase's length. */
  .sentence-card{ --play-gutter:58px; }
  .sentence-card .word-meta{ align-items:stretch; }
  .sentence-card .meaning{ font-size:18px; margin:0 0 4px var(--play-gutter); text-align:left; }
  .sentence-card .chunks{ gap:0; margin:2px 0 8px; padding:3px 0; }
  .sentence-card .chunks-fold{ margin:2px 0 8px; }
  .sentence-card .chunks-fold .chunks{ margin:0; padding:0 13px 8px; }
  .sentence-card .chunk{ padding:4px 11px; }
  .sentence-card .structure{ padding:9px 11px; margin-bottom:9px; }
  .playbtn{ width:46px; height:46px; border-radius:50%; border:0; background:var(--gold);
            color:#3a2230; font-size:15px; cursor:pointer; flex:0 0 auto; }
  .playbtn:active{ transform:scale(.92); }
  .meaning{ text-align:center; color:var(--mint); font-size:20px; margin:2px 0 5px; }
  .word-meta{ display:flex; flex-direction:column; justify-content:center; align-items:center; gap:6px; margin:2px 0 14px; }
  .word-meta .meaning{ margin:0; }
  /* A tint, not a panel. The framed box it used to sit in read as "this is the
     important part", which is backwards for a note — but with nothing at all
     the lines float loose under the bubble. A faint band with no border groups
     them without competing with the sentence above. */
  .notes{ list-style:none; display:flex; flex-wrap:wrap; align-items:center; gap:6px 0;
          padding:9px 13px; margin:6px 0 16px; overflow:hidden; border-radius:10px;
          background:rgba(255,255,255,.05); border:0; }
  .notes:empty{ display:none; }
  .notes li{ display:flex; align-items:center; padding:0; margin:0; font-size:17px; color:#f0dbe6;
             transition:box-shadow .2s,background .2s,transform .2s; }
  .note-icon{ align-self:flex-start; margin-right:6px; }
  .note-copy{ display:block; min-width:0; }
  .notes li+li::before{ content:"/"; padding:0 10px; color:var(--dim); font-weight:400; }
  .pronun-card .notes{ flex-direction:column; align-items:stretch; gap:4px; }
  /* Both rows the same size, weight and colour. The phonetic hint was set a
     notch smaller and paler to mark it as secondary, but two lines sitting on
     one another at different sizes is harder to read than either — and the
     emoji scale with the type, so the markers came out mismatched too. */
  .pronun-card .notes li+li::before{ display:none; }
  /* Back above the mic, on its own line. Parked in the notes panel's corner it
     read as part of the note rather than as a way out to a dictionary — but it
     stays small: it was a 32px emoji, which is a lot of weight for a link most
     people never press. */
  .pronun-link{ display:block; width:max-content; margin:2px auto 12px;
                font-size:22px; line-height:1; text-decoration:none; opacity:.7; }
  .pronun-link:hover{ opacity:1; }
  .teaching{ background:rgba(232,184,75,.16)!important; box-shadow:0 0 0 3px var(--gold),0 0 24px rgba(232,184,75,.28); transform:scale(1.025); }
  .usage-note{ background:#ead8c7; color:#563b39; border:1px solid #f3e6da;
               border-radius:12px; padding:12px 14px; margin:4px 0 16px;
               font-size:16px; line-height:1.55; box-shadow:0 5px 16px rgba(20,8,14,.14); }
  .scene-label{ display:inline-block; color:var(--gold); border:1px solid var(--line); border-radius:999px;
                padding:6px 11px; font-size:13px; margin-bottom:12px; }
  .dialogue-bubble{ border-radius:22px; padding:18px; margin:8px 0; line-height:1.5; position:relative;
                    box-shadow:none; }
  .dialogue-bubble.replayable{ cursor:pointer; transition:transform .16s,border-color .16s,background .16s; }
  .dialogue-bubble.replayable:active{ transform:scale(.99); }
  .dialogue-bubble.ai{ background:linear-gradient(145deg,rgba(168,230,207,.18),rgba(168,230,207,.07));
                       border:1px solid rgba(168,230,207,.38); border-bottom-left-radius:7px; }
  .dialogue-bubble.you{ background:linear-gradient(145deg,rgba(240,191,88,.16),rgba(240,191,88,.06));
                        border:1px solid rgba(240,191,88,.35); border-bottom-right-radius:7px;
                        padding:13px 18px; margin-top:14px; }
  .dialogue-bubble.you.guided-answer{ background:#fffaf0; border-color:#eee0b9; }
  @keyframes learner-turn-glow{
    0%,100%{ box-shadow:0 0 0 2px rgba(222,170,43,.34),0 7px 22px rgba(222,170,43,.10); }
    50%{ box-shadow:0 0 0 4px rgba(222,170,43,.58),0 8px 28px rgba(222,170,43,.22); }
  }
  .dialogue-bubble.you.your-turn{
    border-color:#d9aa36;
    animation:learner-turn-glow 1.8s ease-in-out infinite;
  }
  @keyframes learner-listening-glow{
    0%,100%{ box-shadow:0 0 0 3px color-mix(in srgb,var(--gold) 48%,transparent),0 8px 24px rgba(222,170,43,.16); }
    50%{ box-shadow:0 0 0 7px color-mix(in srgb,var(--gold) 68%,transparent),0 10px 34px rgba(222,170,43,.30); }
  }
  .dialogue-bubble.you.is-listening{
    border-color:var(--gold);
    animation:learner-listening-glow 1.15s ease-in-out infinite;
  }
  /* 自動播放被瀏覽器擋掉時的提示：輕輕呼吸，告訴人這裡可以點。 */
  .needs-tap{ animation:needs-tap 1.6s ease-in-out infinite; }
  @keyframes needs-tap{ 0%,100%{ transform:scale(1); } 50%{ transform:scale(1.06); } }

  @media (prefers-reduced-motion:reduce){
    .needs-tap{ animation:none; outline:2px solid var(--gold); outline-offset:3px; }
    .dialogue-bubble.you.your-turn{
      animation:none;
      box-shadow:0 0 0 3px rgba(222,170,43,.46);
    }
    .dialogue-bubble.you.is-listening{
      animation:none;
      box-shadow:0 0 0 5px color-mix(in srgb,var(--gold) 58%,transparent);
    }
  }
  .guided-answer-line{ font-size:17px; line-height:1.45; }
  .guided-answer-line:first-child{ font-size:14px; color:var(--dim); }
  .guided-answer-line+.guided-answer-line{ margin-top:6px; }
  .guided-answer-phrase{ color:var(--mint); font-family:var(--font-learning-content);
                         font-size:24px; font-weight:600; line-height:1.25; }
  .challenge-prompt{ color:var(--ink); font-size:17px; line-height:1.45; }
  .challenge-hint-answer{ display:none; width:100%; margin-top:10px; padding:0; border:0; background:transparent;
                          color:#987019; text-align:left; cursor:pointer;
                          font-family:var(--font-learning-content);
                          font-size:22px; font-weight:600; }
  .challenge-hint-answer.visible{ display:block; }
  .challenge-hint-play{ margin-right:8px; color:#6e858a; font-size:17px; }
  .speaker{ color:var(--dim); font-size:12px; margin-bottom:5px; }
  .dialogue-speaker-label{ color:var(--dim); font-size:13px; font-weight:600; margin:0 0 -7px 14px;
                           position:relative; z-index:1; width:max-content; background:#fff; padding:0 6px; }
  .dialogue-you-label{ color:#987019; }
  .dialogue-bubble.ai{ padding:14px 18px 14px 52px; }
  .bubble-play{ position:absolute; left:18px; top:50%; transform:translateY(-50%); color:#6e858a;
                font-size:20px; line-height:1; }
  .dialogue-text{ font-family:var(--font-learning-content);
                  color:var(--mint); font-size:22px; font-weight:600; }
  .dialogue-bubble.ai .dialogue-text{ font-size:24px; line-height:1.25; }
  .sentence-continuation{ display:inline-block; margin-top:.12em; }
  .dialogue-meaning{ color:#f0dbe6; font-size:15px; line-height:1.4; margin-top:5px; }
  /* Steps 1 and 2 present their line in the dialogue's own bubble: the sentence
     big, its meaning directly under it, both inside one panel. They used to put
     the sentence loose on the page and its notes in a tinted box — which framed
     the footnote and left the sentence unframed, exactly backwards. */
  .phrase-bubble{ margin:10px 0 6px; }
  /* The gold disc, not the dialogue's bare triangle: on these two steps the
     sentence is the thing you play over and over, and a filled circle says
     "press me" from across the room. Anchored to the first line, because a
     sentence here often wraps and a vertically centred disc then floats. */
  .dialogue-bubble.ai.phrase-bubble{ padding:16px 18px 16px 66px; }
  .phrase-bubble .bubble-play{ left:16px; top:19px; transform:none;
                               display:grid; place-items:center; width:36px; height:36px;
                               border-radius:50%; background:var(--gold);
                               color:#3a2230; font-size:13px; }
  .pronun-card .phrase-bubble .dialogue-text{ font-size:32px; line-height:1.2; }
  .sentence-card .phrase-bubble .dialogue-text{ font-size:26px; line-height:1.28; font-weight:600; }
  .phrase-bubble .dialogue-meaning{ font-size:17px; line-height:1.45; margin-top:7px; }
  .dialogue-bubble.you .dialogue-meaning{ font-size:17px; line-height:1.4; }

  /* 中文密度高，同樣的 px 讀起來比拉丁字大一號。英文介面把幾個「意思」層級
     的字稍微加大，才壓得住上面的目標語句子。 */
  [data-hl="en"] .dialogue-meaning{ font-size:16px; }
  /* The notes read at the meaning's size, so they follow it down here too. */
  [data-hl="en"] .notes li{ font-size:16px; }
  [data-hl="en"] .guided-answer-line:first-child{ font-size:15px; }
  [data-hl="en"] .challenge-prompt{ font-size:18px; }
  /* The fold owns the panel now; the list inside it is plain. Folded, the
     summary alone is the panel — the chunk words on one line, and a question
     mark that says the meanings are one tap away. */
  /* Folded, this is one question mark and nothing else — no band, no words.
     Open, it becomes the tinted panel with its label and rows. */
  .chunks-fold{ margin:6px 0 14px; overflow:hidden; border-radius:10px;
                background:transparent; border:0; }
  .chunks-fold[open]{ background:rgba(255,255,255,.05); }
  .chunks-fold > summary{ display:flex; align-items:center; justify-content:center; gap:10px;
                          padding:8px 0; cursor:pointer; list-style:none; }
  .chunks-fold[open] > summary{ padding:9px 13px 2px; }
  .chunks-fold > summary::-webkit-details-marker{ display:none; }
  /* Gold, not grey on grey: it is the one thing in this panel you can press. */
  .chunks-toggle{ flex:0 0 auto; display:grid; place-items:center; width:24px; height:24px;
                  border-radius:50%; background:rgba(232,184,75,.16); color:var(--gold);
                  font-size:13px; font-weight:700; line-height:1; }
  .chunks-toggle::after{ content:'?'; }
  /* Open, the caret sits alone at the top right. No heading: the rows under it
     say what they are, and a label would only name what is already legible. */
  .chunks-fold[open] > summary{ justify-content:flex-end; }
  .chunks-fold[open] .chunks-toggle{ background:transparent; }
  .chunks-fold[open] .chunks-toggle::after{ content:'▴'; }
  .chunks{ display:flex; flex-direction:column; gap:0; margin:4px 0 14px; padding:5px 0;
           background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.08);
           border-radius:12px; overflow:hidden; }
  .chunks-fold .chunks{ margin:0; padding:0 13px 8px; background:transparent; border:0; border-radius:0; }
  .chunk{ width:100%; display:flex; align-items:center; gap:9px; background:transparent; border:0; border-radius:0;
          padding:5px 0; text-align:left; color:#f0dbe6; font:inherit; font-size:18px; cursor:pointer; }
  .chunk:hover{ background:rgba(255,255,255,.05); }
  .chunk.chunk-static{ cursor:default; }
  .chunk.chunk-static:hover{ background:transparent; }
  .chunk-play{ flex:0 0 auto; color:#987019; font-size:12px; }
  .chunk strong{ color:var(--mint); font-size:18px; }
  .chunk span{ color:#f0dbe6; font-size:18px; }
  .dialogue-chunks{
    width:auto;
    display:flex;
    flex-flow:row wrap;
    align-items:center;
    gap:3px 16px;
    margin:3px 18px 11px 52px;
    padding:0;
    background:transparent;
    border:0;
    border-radius:0;
    overflow:visible;
  }
  .dialogue-chunks .chunk{
    width:auto;
    flex:0 1 auto;
    gap:5px;
    padding:2px 0;
    color:var(--dim);
    line-height:1.25;
  }
  .dialogue-chunks .chunk strong{
    font-size:14px;
    font-weight:600;
  }
  .dialogue-chunks .chunk span{
    font-size:14px;
    color:var(--dim);
  }
  .structure{ color:#563b39; background:#ead8c7; border:1px solid #f3e6da;
              border-left:4px solid #bd8a4a; border-radius:12px; padding:12px 14px;
              margin:0 0 16px; line-height:1.55; box-shadow:0 5px 16px rgba(20,8,14,.14); }
  .row{ display:flex; justify-content:center; gap:10px; margin-top:8px; }
  .row .btn{ flex:0 1 150px; width:auto; padding:10px 16px; font-size:14px; }
  .dots{ display:flex; justify-content:center; gap:6px; margin:16px 0 8px; }
  .dot{ width:8px; height:8px; border-radius:50%; background:var(--line); }
  .dot.on{ background:var(--gold); }
  .legend{ text-align:center; color:var(--dim); font-size:12.5px; line-height:1.9;
           margin-top:6px; padding-top:10px; border-top:1px solid var(--line); }
  .score{ text-align:center; margin:12px 0; min-height:44px; }
  .score .big{ font-size:30px; font-weight:700; }
  .result-one-line{ margin-top:10px; display:flex; align-items:baseline; justify-content:center;
                    gap:10px; flex-wrap:wrap; text-align:center; font-size:clamp(11px,2.8vw,15px); }
  .result-transcript{ color:var(--said); }
  .result-score{ display:inline-flex; align-items:baseline; gap:4px; color:var(--teal); }
  .result-score strong{ font-size:clamp(25px,5vw,34px); line-height:1; font-weight:750; letter-spacing:-.04em; }
  .result-score small{ color:var(--dim); font-size:12px; font-weight:400; }
  .result-feedback{ font-weight:650; }
  @media (max-width:1024px){
    .result-one-line{ flex-wrap:wrap; justify-content:center; align-items:baseline;
                      gap:6px 10px; font-size:16px; }
    .result-one-line .result-transcript{
      flex-basis:100%;
      max-width:100%;
      overflow-wrap:anywhere;
      line-height:1.4;
    }
  }
  .said{ color:var(--dim); font-size:13px; }
  .result-detail{ display:flex; justify-content:center; align-items:center; gap:8px; flex-wrap:wrap; }
  .answer-reference{ width:auto; margin:12px auto 4px; padding:10px 16px; border:1px solid var(--line); border-radius:14px;
                     background:var(--panel); color:var(--gold); cursor:pointer; box-shadow:0 8px 22px rgba(12,4,8,.1);
                     display:inline-flex; align-items:center; justify-content:center; gap:9px; }
  .answer-reference span{ font-size:15px; line-height:1; }
  .answer-reference strong{ font-family:var(--font-learning-content);
                            font-size:18px; font-weight:600; }
  /* 結業成績卡裡的重練清單：靠左等寬，讀起來才像一份清單而不是幾顆散開的按鈕。 */
  .completion-stage .card .answer-reference{ display:flex; width:100%; margin:6px 0 0;
                                             justify-content:flex-start; text-align:left; box-shadow:none;
                                             color:var(--ink); }
  .completion-stage .card .answer-reference strong{ font-size:16px; }
  /* 結業的解鎖面板：第一列是剛完成的，其餘鎖著，整塊連到課程目錄。 */
  .unlock-panel{ display:block; padding:0; color:#fffaf5; text-align:left; text-decoration:none; }
  .unlock-grid{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:10px; }
  .unlock-course{ min-height:142px; display:flex; flex-direction:column; align-items:flex-start;
                  padding:15px; border:1px solid rgba(255,255,255,.15); border-radius:14px;
                  background:rgba(255,255,255,.055); }
  .unlock-course-icon{ font-size:27px; line-height:1; }
  .unlock-course strong{ margin-top:18px; color:#fffaf5; font-size:17px; line-height:1.25; }
  .unlock-course-copy{ margin-top:7px; color:rgba(255,250,245,.64); font-size:12px; line-height:1.4; }
  .unlock-course.suggested{ border-color:rgba(240,191,88,.38); background:rgba(240,191,88,.09); }
  .unlock-course .unlock-badge{ display:block; margin-top:auto; padding-top:9px; color:#ffe2a1;
                               font-size:10px; font-weight:600; letter-spacing:.05em; text-transform:uppercase; }
  .unlock-course.coming-soon{ color:rgba(255,250,245,.52); }
  .unlock-course.coming-soon strong{ color:rgba(255,250,245,.58); }
  .unlock-row{ display:flex; align-items:center; gap:8px; padding:7px 0; font-size:15px; }
  .unlock-row + .unlock-row{ border-top:1px solid rgba(255,255,255,.12); }
  .unlock-row strong{ font-weight:600; flex:1; min-width:0; }
  .unlock-row > span{ flex:0 0 auto; }
  /* 有標籤的那一堂是建議的下一步——給它一點底色，讓三堂不再長得一樣。 */
  .unlock-row.suggested{ margin:0 -8px; padding-left:8px; padding-right:8px; border-radius:10px;
                         background:rgba(240,191,88,.12); }
  .unlock-row .unlock-badge{ color:#ffe2a1; opacity:1; }
  /* 課程目錄不該只能從結業頁進去——任務頁固定留一個入口。 */
  /* The way out sits last, under the offer. It used to come between the start
     button and the unlock card, so the page put an exit between the thing you
     came to do and the thing being sold. */
  .catalog-link{ display:block; width:fit-content; margin:16px auto 0; padding:9px 14px;
                 border:0; border-radius:12px; background:none;
                 text-align:center; text-decoration:none; color:var(--teal);
                 font-weight:650; font-size:14px;
                 transition:color .16s ease,background-color .16s ease; }
  .catalog-link:hover{ background-color:rgba(8,120,139,.08); }
  /* Quieter than the catalogue link above it: leaving is a smaller
     decision than browsing, and this is the last thing on the page. */
  /* The way back into the app, so it is a control rather than a caption:
     --dim at this size was the quietest thing on the screen. */
  .catalog-link.app-link{ margin-top:6px; padding:7px 14px; border:1px solid var(--line);
                          border-radius:999px; color:var(--teal); font-weight:600; }
  .catalog-link.app-link:hover{ border-color:var(--teal); }
  /* 結業頁只剩這一個出口。跟課程裡的主要行動鈕同一個填色，讓它讀起來是同一個
     產品的東西，不是另外貼上去的促銷按鈕。 */
  /* Signed out this is an <a> and signed in a <button>; without the explicit
     reset the same control arrived underlined for half the visitors. */
  /* Full width, at the bottom, carrying its own price. A pill in the corner
     with a number on it reads as a tag; the one thing on the panel you press
     should look like the one thing on the panel you press. */
  .unlock-cta{ display:block; width:100%; margin:18px auto 0; padding:13px 22px;
               border-radius:12px; background:var(--gold); text-decoration:none;
               color:#2b2026; font-weight:700; font-size:16px; text-align:center; }
  .unlock-purchase-note{ margin-top:9px; color:rgba(255,250,245,.68); font-size:12px; text-align:center; }
  .product-unlock-panel form{ margin:0; }
  /* Dark on purpose. A tinted version was tried and lost the panel: on a page
     that is now white end to end, the one block asking for money has to read
     as a different surface, not as another card. The completion screen is
     already dark, so there it stays transparent rather than stacking a card
     on a card. */
  /* Card-sized, not page-wide. Stretched across a 680px stage it read as a
     banner; the website's own offer card is about this wide and that is the
     size this was asked to match. */
  /* The header's teal, not a one-off grey-green: this panel is the product
     speaking, and it should be the same colour the product already is. */
  .product-unlock-panel{ width:min(100%,464px); margin:22px auto 0; padding:22px;
                         border-radius:18px;
                         background:linear-gradient(150deg,#0b7386,#0a5a6b); }
  body.free-course-complete .product-unlock-panel{ margin-top:0; padding:0;
                                                   background:none; box-shadow:none; }
  .unlock-cta-copy{ margin-bottom:12px; color:rgba(255,250,245,.78); text-align:center; }
  /* The course's name is the biggest thing in the panel. It was 14px over a
     16px list — a heading smaller than the lines it heads. */
  .unlock-offer-icon{ font-style:normal; margin-right:8px; }
  .unlock-offer-eyebrow{ color:#fffaf5; font-size:20px; font-weight:700;
                         letter-spacing:-.01em; line-height:1.3; margin-bottom:10px; }
  /* The lapsed-buyer line. Larger than the eyebrow above it because it is the
     headline of this panel — but not bold: it is Chinese first, and weight on
     CJK at this size closes the strokes up. */
  .unlock-offer-expired{ margin-top:6px; color:#fffaf5; font-size:18px; line-height:1.5; }
  /* One reading axis down the left edge. Centred, the list floated in the
     middle of the panel with nothing on either side of it. Quieter than the
     name above it: these are the terms, not the thing being named. */
  .unlock-offer-list{ width:auto; margin:0; padding:0; list-style:none;
                      color:rgba(255,250,245,.86); font-size:15px; line-height:1.8; text-align:left; }
  .unlock-offer-list li::before{ content:'・'; color:var(--gold); }
  .course-can-list li::before{ content:'✓ '; color:var(--mint); font-weight:700; }
  .unlock-decline{ display:block; margin-top:14px; color:rgba(255,250,245,.6);
                   font-size:13px; text-align:center; text-decoration:underline; }
  button.unlock-purchase{ border:0; cursor:pointer; font:inherit; }
  .unlock-row.done em{ font-style:normal; font-size:12px; color:#a8e6cf; white-space:nowrap; }
  .unlock-row.coming-soon{ color:rgba(255,250,245,.62); }
  .unlock-more{ margin-top:8px; font-size:13px; color:rgba(255,250,245,.62); text-align:right; }
  @media (max-width:560px){
    .unlock-grid{ grid-template-columns:1fr; }
    .unlock-course{ min-height:0; }
    .unlock-course strong{ margin-top:10px; }
  }
  /* Final check reuses the established chat-quiz visual contract: one prompt,
     one speaking action, one result.  The course still owns its curated data
     and completion state; only the presentation is shared. */
  .course-chat-quiz{ width:100%; min-height:100%; margin:0; padding:24px 20px 20px;
                     display:flex; flex-direction:column; align-items:center;
                     color:#fff8ee; border-radius:0; background:transparent; box-shadow:none; }
  .course-chat-quiz .quiz-rail{ width:min(100%,var(--quiz-rail-width)); min-height:100%; flex:1;
                                display:flex; flex-direction:column; align-items:center; margin:0 auto; }
  .course-chat-quiz .quiz-eyebrow{ align-self:flex-start; padding:5px 12px; border-radius:999px;
                                   color:#f0c979; background:rgba(227,184,95,.16);
                                   font-size:12px; font-weight:600; letter-spacing:.05em; }
  .course-chat-quiz .quiz-question-wrap{ width:100%; flex:0 0 auto; margin-top:clamp(28px,5vh,54px);
                                         display:flex; flex-direction:column; align-items:center; text-align:center; }
  .course-chat-quiz .quiz-instruction{ margin-bottom:12px; color:rgba(255,248,238,.64); font-size:14px; }
  .course-chat-quiz .quiz-question{ display:flex; flex-direction:column; align-items:center; gap:8px; }
  .course-chat-quiz .quiz-question-latin{ color:#fff8ee; font-family:var(--font-learning-content);
                                          font-size:clamp(38px,9vw,58px); line-height:1.08;
                                          font-weight:600; letter-spacing:-.025em; }
  .course-chat-quiz .quiz-question-zh{ color:rgba(255,248,238,.82); font-size:clamp(24px,5vw,34px);
                                       line-height:1.35; font-weight:600; }
  /* The whole result group (score / 你說 / answer card) drops as one block — a bounded
     nudge, not flex:1 centring, which would strand it mid-screen on tall viewports.
     The mic shares this box, so nothing jumps when the result replaces it. */
  .course-chat-quiz .quiz-response{ width:100%; min-height:166px;
                                    margin-top:clamp(38px,9vh,104px);
                                    display:flex; flex-direction:column;
                                    align-items:center; justify-content:flex-start; }
  .course-chat-quiz .quiz-mic{ width:104px; height:104px; display:grid; place-items:center; flex:0 0 auto;
                               border:0; border-radius:50%; background:#f2c9c9; color:#5c2f3a;
                               cursor:pointer; box-shadow:0 10px 28px rgba(0,0,0,.20);
                               transition:background-color .15s; }
  .course-chat-quiz .quiz-mic:hover{ background:#f7dcdc; }
  .course-chat-quiz .quiz-mic.recording{ color:#fff; background:#d75e66; animation:micPulse 1.15s ease-in-out infinite; }
  .course-chat-quiz .quiz-mic-hint{ min-height:22px; margin:12px 0 0; color:rgba(255,248,238,.68); font-size:14px; }
  .course-chat-quiz .quiz-recording-state{ margin-top:32px; color:rgba(255,248,238,.72); font-size:14px; }
  .course-chat-quiz .quiz-result{ width:100%; display:flex; flex-direction:column; align-items:center; }
  .course-chat-quiz .quiz-result-score{ display:flex; align-items:baseline; justify-content:center; gap:10px;
                                        color:#a9ead2; line-height:1; }
  .course-chat-quiz .quiz-result-score strong{ font-size:clamp(42px,10vw,58px); font-weight:700; letter-spacing:-.04em; }
  .course-chat-quiz .quiz-result-score span{ color:#fff8ee; font-size:16px; font-weight:600; }
  .course-chat-quiz .quiz-result-said{ max-width:100%; margin-top:10px; overflow:hidden; text-overflow:ellipsis;
                                      color:rgba(255,248,238,.68); font-size:13px; white-space:nowrap; }
  .course-chat-quiz .answer-reference{ width:100%; max-width:100%; margin:16px auto 0; padding:12px 16px;
                                       color:#d9f3e6; background:rgba(255,248,238,.08);
                                       border-color:rgba(255,248,238,.16); box-shadow:none; }
  .course-chat-quiz .answer-reference strong{ min-width:0; overflow-wrap:anywhere; text-align:center;
                                               font-size:clamp(20px,4.6vw,28px); line-height:1.2; }
  .course-chat-quiz .quiz-retry{ margin-top:8px; padding:4px 8px; border:0; background:transparent;
                                 color:rgba(255,248,238,.68); font-size:13px; cursor:pointer; }
  .course-chat-quiz .quiz-retry-slot{ width:100%; margin-top:auto; display:flex; justify-content:center; }
  .course-chat-quiz .quiz-nav{ width:100%; padding-top:14px; }
  .course-chat-quiz .quiz-nav .btn{ color:rgba(255,248,238,.92); border-color:rgba(255,248,238,.28); background:transparent; }
  .course-chat-quiz .quiz-nav .btn.gold{ color:#19343b; border-color:transparent; background:#e3b85f; }
  /* The row lost its back button, so the one that stays is the only action
     on the screen and takes the width a lone action should. */
  .course-chat-quiz .quiz-nav .btn:only-child{ flex:0 1 240px; }
  .course-chat-quiz .dots{ margin-bottom:0; }
  .course-chat-quiz .dot{ background:rgba(255,248,238,.20); }
  .course-chat-quiz .dot.on{ background:#e3b85f; }
  /* `.btn.mic`, not `.mic!important`: the mic is always a `.btn gold mic`, and
     two classes beat one — so it wins on specificity and order, the way a
     variant should, instead of on a keyword that the next override has to
     escalate past. Flat fill, no gradient, no coloured drop: the same
     treatment every other button on this screen got.
     The pink stays. It is the only "your turn to speak" signal in the player
     and it is meant to be findable at a glance — what was too heavy was the
     button's weight, not its identity. */
  .btn.mic{ background:var(--red); color:#fff; position:relative; overflow:hidden; }
  .mic.practice-compact{ width:auto; min-width:210px; margin:14px auto; padding:11px 26px; }
  .mic.dialogue-compact{ width:auto; min-width:200px; margin:14px auto; padding:12px 22px;
                         font-size:17px; font-weight:600; }
  .dialogue-response{ margin-top:22px; }
  .dialogue-response .mic.dialogue-compact{ margin:0 auto; }
  .dialogue-response .score{ margin:14px 0 18px; }
  .dialogue-response + .row{ margin-top:0; }
  .btn.dialogue-action-compact{ display:block; width:auto; min-width:136px; max-width:82%;
                                margin:12px auto; padding:8px 16px; font-size:14px; }
  .btn.dialogue-action-compact.hint-icon-only{ min-width:0; padding:3px 8px; border:0;
                                                background:transparent; box-shadow:none; font-size:32px; }
  .mic.recording::after{ content:"▂  ▅  ▇  ▃  ▆"; display:block; height:18px; margin-top:4px;
                         font-size:14px; letter-spacing:2px; animation:wave 650ms ease-in-out infinite alternate; }
  @keyframes wave{ from{ transform:scaleY(.55); opacity:.65; } to{ transform:scaleY(1.15); opacity:1; } }
  .mic.attention{ animation:micPulse 1.15s ease-in-out infinite; }
  @keyframes micPulse{
    0%,100%{ transform:scale(1); box-shadow:0 0 0 0 rgba(238,91,99,.15); }
    50%{ transform:scale(1.025); box-shadow:0 0 0 8px rgba(238,91,99,.22); }
  }
  .quiz-tally{ margin-top:18px; text-align:center; color:rgba(255,248,238,.45);
               font-size:12px; letter-spacing:.02em; }
  .center{ text-align:center; }
  .lead{ color:var(--dim); font-size:14px; line-height:1.6; }
  .menu-grid{ display:grid; gap:14px; margin-top:16px; }
  .course-card{ display:block; color:var(--ink); text-decoration:none; background:var(--panel);
                position:relative; border:1px solid var(--line); border-radius:20px; padding:22px; }
  .course-card:hover{ border-color:var(--gold); }
  .course-card .icon{ font-size:34px; }
  .course-badge{ position:absolute; top:22px; right:22px; padding:5px 9px; border-radius:999px;
                 color:#76520a; background:#fff1c8; font-size:10px; font-weight:700; letter-spacing:.06em; }
  .course-price{ position:absolute; top:22px; right:22px; color:#76520a; font-size:15px; font-weight:700; }
  .course-level{ display:block; width:max-content; margin:0 0 8px; color:#08788b;
                 font-size:11px; font-weight:600; letter-spacing:.03em; }
  .course-card h2{ margin:10px 0 5px; font-size:22px; }
  .course-card p{ color:var(--dim); margin:0; line-height:1.55; }
  .course-arrow{ display:inline-block; margin-left:8px; color:#987019; font-weight:700; }
  .catalog-shell{ padding:8px 0 18px; }
  .locale-switch{ width:max-content; display:flex; gap:3px; margin:24px auto 0; padding:3px;
                  border:1px solid var(--line); border-radius:999px; background:#f3f7f7; }
  .locale-option{ display:block; min-width:64px; padding:7px 12px; border-radius:999px; color:var(--dim);
                  text-align:center; text-decoration:none; font-size:12px; font-weight:600; line-height:1.2; }
  .locale-option.active{ color:#fff; background:#08788b; box-shadow:0 3px 9px rgba(8,120,139,.18); }
  .locale-option:not(.active):hover{ color:#08788b; background:#fff; }
  .catalog-kicker{ color:#08788b; font-size:12px; font-weight:600; letter-spacing:.14em; text-transform:uppercase; }
  .catalog-title{ margin:8px 0 6px; font-size:30px; line-height:1.12; color:#24383d; }
  .catalog-copy{ margin:0 0 22px; color:var(--dim); line-height:1.6; }
  .language-grid{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:12px; }
  .language-card{ min-height:190px; display:flex; flex-direction:column; justify-content:space-between; padding:20px 18px;
                  position:relative; overflow:hidden; text-decoration:none; text-align:left; color:var(--ink); border:1px solid var(--line); border-radius:22px;
                  background:linear-gradient(160deg,#fff,#f4faf9); box-shadow:0 10px 28px rgba(25,71,78,.08);
                  transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease; }
  .language-card::after{ content:""; position:absolute; width:110px; height:110px; right:-44px; top:-48px; border-radius:50%;
                         background:rgba(8,120,139,.07); }
  .language-card:hover{ transform:translateY(-3px); border-color:#65b7ba; box-shadow:0 16px 34px rgba(25,71,78,.14); }
  .language-flag{ width:50px; height:50px; display:grid; place-items:center; margin:0 0 20px; font-size:29px;
                  border-radius:15px; background:#fff; border:1px solid #e5eeee; box-shadow:0 7px 18px rgba(25,71,78,.09); }
  .language-card strong{ display:block; font-size:22px; }
  .language-card span{ display:block; margin-top:5px; color:var(--dim); font-size:13px; }
  .language-card b{ margin-top:14px; color:#987019; font-size:13px; }
  .catalog-back{ display:inline-flex; margin-bottom:18px; color:#08788b; text-decoration:none; font-weight:600; }
  .course-card.coming-soon{ opacity:.62; cursor:default; border-style:dashed; box-shadow:none; }
  .course-card .status{ display:inline-flex; padding:5px 9px; border-radius:999px; background:#edf3f3; color:#64777b;
                        font-size:11px; font-weight:600; letter-spacing:.05em; }
  /* 桌機／大螢幕：欄位加寬、字放大（手機維持原樣） */
  @media (min-width:768px){
    .wrap{ max-width:620px; }
    header h1{ font-size:26px; }
    header p{ font-size:15px; }
    .phrase{ font-size:56px; }
    .pronun-card .phrase{ font-size:46px; line-height:1.16; }
    .sentence-card .phrase-row{ margin:10px 0 14px; }
    .sentence-card .phrase{ font-size:38px; line-height:1.18; font-weight:600; }
    .sentence-card .word-meta{ margin:6px 0 22px; }
    .sentence-card .chunks{ margin:6px 0 18px; }
    .sentence-card .mic.practice-compact{ margin:20px auto; }
    .meaning{ font-size:22px; }
    .rule-t{ font-size:19px; }
    .rule-n{ font-size:15px; }
    .rule-t.big{ font-size:30px; }
    .rule-n.big{ font-size:19px; }
    /* Not stepped up on a wide screen: these read at the same size as the
       meaning inside the bubble, which is the line they belong with. */
    .notes li{ font-size:17px; }
    .sentence-card .chunk,
    .sentence-card .chunk strong,
    .sentence-card .chunk span{ font-size:19px; line-height:1.35; }
    .btn{ font-size:20px; padding:18px; }
    .btn.dialogue-action-compact{ min-width:150px; padding:9px 18px; font-size:15px; }
    .playbtn{ width:56px; height:56px; font-size:18px; }
    .lead{ font-size:16px; }
    .start-choice .dog-action{ padding:12px 22px; font-size:1rem; }
  }
  @media (max-width:420px){
    .dialogue-speaker-label{ margin-left:12px; font-size:12px; }
    /* The play button stays on the sentence's own line. Stacked above it, it
       spent a whole row of a phone screen on a 42px circle — and the row it
       took came out of the sentence, which is the thing you are here to read. */
    /* Top-aligned, not centred: beside a phrase that wraps to two lines a
       vertically centred circle floats in the gutter with nothing to line up
       against. On the first line it reads as that line's play button. */
    .sentence-card .phrase-row,
    .pronun-card .phrase-row{ align-items:start; gap:10px; margin:4px 0 8px; }
    .sentence-card .playbtn,
    .pronun-card .playbtn{ margin-top:4px; }
    .sentence-card .playbtn,
    .pronun-card .playbtn{ width:38px; height:38px; font-size:13px; }
    .pronun-card{ --play-gutter:48px; }
    .sentence-card .phrase{ font-size:29px; line-height:1.22; letter-spacing:-.01em; }
    .sentence-card{ --play-gutter:48px; }
    .sentence-card .meaning{ margin:0 0 10px var(--play-gutter); font-size:16px; line-height:1.4; }
    .sentence-card .chunks-fold{ margin:8px 0 14px; }
    .sentence-card .chunks-fold .chunks{ margin:0; padding:0 13px 8px; }
    .sentence-card .chunk{ padding:4px 0; line-height:1.35; }
    .dialogue-bubble.ai.phrase-bubble{ padding:14px 16px 14px 58px; }
    .phrase-bubble .bubble-play{ left:14px; top:17px; width:33px; height:33px; }
    .language-grid{ grid-template-columns:1fr; }
    .language-card{ min-height:0; flex-direction:row; align-items:center; text-align:left; padding:16px; }
    .language-flag{ width:52px; height:52px; margin:0 14px 0 0; font-size:30px; flex:0 0 auto; }
    .language-card b{ margin:0 0 0 auto; }
    .catalog-title{ font-size:27px; }
    .course-link{ min-width:57px; }
    .course-link .mission-name{ font-size:9px; }
    .hero-title{ font-size:27px; }
    .orientation-hero{ min-height:410px; padding:25px 21px; }
    .start-choice{ width:100%; gap:8px; }
    .start-choice .dog-action{ padding:9px 11px; font-size:13px; }
  }

  /* ParoMe course shell: teal navigation, calm white learning surface */
  :root{ --bg:#f4f1ed; --bg-soft:#f4f1ed; --panel:#ffffff; --panel-2:#f8f4ef;
         --line:#dce7e8; --ink:#24383d; --dim:#71858a; --mint:#087f83;
         /* What the learner actually said, which is not a caption. --dim is
            3.87:1 on white — under the 4.5 a 16px line needs, and the dimmest
            thing in a block whose other two lines are 5.2 and 12.3. Indoors it
            reads; on a phone in daylight the one piece of evidence that you
            opened your mouth is the part that disappears. 5.16:1 — level with
            the score beside it, still below the verdict under it. */
         --said:#5b7176;
         --gold:#f4d579; --gold-soft:#ffeab4; --shadow:0 16px 42px rgba(25,71,78,.10); --teal:#08788b;
         /* --gold is a fill, never a text colour: on white it is 1.4:1. This is
            the readable ink for both — 7.9:1 on white, 5.5:1 on the gold itself. */
         --gold-ink:#6f4a0c;
         --rose-soft:#f7e1e5; --rose-active:#efcbd2; --rose-ink:#754651;
         --completion-surface-start:#28545c; --completion-surface-end:#193b42;
         --quiz-rail-width:520px;
         /* One scale, four steps, roughly 1.3× apart. Everything used to pick
            its own number — 30, 28, 22, 21, 18, 15, 13, 12 — which is why the
            screens read as "big text and small text" rather than as a
            hierarchy. Sizes step up at 768px in the media query below. */
         --text-display:30px;   /* the one thing a screen is about */
         --text-title:20px;     /* section and lesson headings */
         --text-body:15px;      /* everything you read */
         --text-meta:12px;      /* eyebrows, stamps, legends */
         --lh-display:1.12; --lh-body:1.55; }
  body{ background:#f4f1ed; color:var(--ink); }
  body::before{ display:none; }
  .wrap{ max-width:100%; background:#fff; }
  /* The teal band stays: it is the course player's colour, and the white page
     below reads as a working surface because something above it does not.
     What went is the weight — the active tab no longer casts a 22px shadow. */
  header{ padding:18px 18px 12px; background:linear-gradient(135deg,#096f82,var(--teal)); }
  body.intro-mode header{ padding-bottom:16px; }
  .course-nav{ max-width:680px; margin:0 auto; padding:0; justify-content:center; gap:8px; }
  .course-link{ min-width:58px; min-height:50px; color:rgba(255,255,255,.78);
                border-color:rgba(255,255,255,.22); background:rgba(255,255,255,.06); }
  .course-link .mission-icon{ font-weight:600; }
  .course-link.on{ color:#174047; background:#fff; border-color:#fff; }
  .course-link.locked{ opacity:.42; }
  .lesson-heading{ padding:8px 20px 4px; background:#fff; }
  .lesson-heading h1{ font-family:var(--font-ui-latin),var(--font-ui-cjk-tw),sans-serif; max-width:680px; margin:0 auto; font-size:var(--text-title); letter-spacing:.01em; }
  .lesson-heading p{ max-width:680px; margin:4px auto 0; color:var(--dim); font-size:var(--text-body); }
  body.intro-mode .lesson-heading{ display:none; }
  body.quiz-mode .lesson-heading{ display:none; }
  body.practice-mode .lesson-heading h1{ font-size:var(--text-body); color:#536a70; font-weight:600; }
  body.practice-mode .lesson-heading p{ display:none; }
  .stage{ width:100%; max-width:680px; margin:0 auto; padding:8px 20px 30px; background:#fff;
          position:relative; isolation:isolate; overflow:hidden; }
  /* Watermark: the city this course is set in, keyed off body[data-city] (the
     player already stamps it from config/course_languages.yaml). Paris was the
     default for every language, so Italian courses had an Eiffel Tower on them. */
  /* Tilted 30°, not sitting flat in the corner: at this opacity a straight-on
     shape half-cropped by the edge reads as a smudge. */
  .stage::before{ content:""; position:absolute; z-index:-2; width:230px; height:410px; right:-18px; bottom:34px;
                  transform:rotate(30deg); transform-origin:center; opacity:.032; background:center/contain no-repeat url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 240 440'%3E%3Cg fill='none' stroke='%2308788b' stroke-width='8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M120 15L78 170 40 395M120 15l42 155 38 225M65 220h110M50 300h140M24 410h192M92 170h56M105 95h30'/%3E%3Cpath d='M75 395c20-45 70-45 90 0M94 220c8-25 44-25 52 0'/%3E%3C/g%3E%3C/svg%3E"); }
  /* Italy — an espresso cup. The Colosseum drawing read as a fence at this
     opacity; a cup is one shape, and it is what these courses are about. */
  body[data-city="ROME"] .stage::before{ width:300px; height:250px; bottom:30px; right:-24px;
                  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 300 250'%3E%3Cg fill='none' stroke='%2308788b' stroke-width='8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M52 96h150v52c0 34-28 62-62 62h-26c-34 0-62-28-62-62z'/%3E%3Cpath d='M202 112h22c18 0 32 14 32 32s-14 32-32 32h-24'/%3E%3Cpath d='M34 226h190'/%3E%3Cpath d='M96 64c0-14 14-14 14-28M136 60c0-16 16-16 16-32M176 64c0-14 14-14 14-28'/%3E%3C/g%3E%3C/svg%3E"); }
  /* Spain — a Spanish guitar. The Puerta de Alcalá was more accurate and less
     legible: at 3.5% opacity a shape has one chance to be recognised. */
  body[data-city="MADRID"] .stage::before{
                  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 240 440'%3E%3Cg fill='none' stroke='%2308788b' stroke-width='7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M120 158c-58 0-62 48-56 76 6 26-24 32-26 68-2 50 34 96 82 96s84-46 82-96c-2-36-32-42-26-68 6-28 2-76-56-76z'/%3E%3Ccircle cx='120' cy='302' r='26'/%3E%3Cpath d='M106 158V66h28v92M100 66h40V28h-40z'/%3E%3Cpath d='M92 358h56M112 358V66M128 358V66'/%3E%3C/g%3E%3C/svg%3E"); }
  /* London — Big Ben, for the English courses. */
  body[data-city="LONDON"] .stage::before{ background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 240 440'%3E%3Cg fill='none' stroke='%2308788b' stroke-width='8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M120 12l34 58h-68z'/%3E%3Cpath d='M86 70h68v40H86zM78 110h84v70H78zM86 180h68v230H86z'/%3E%3Cpath d='M60 414h120'/%3E%3Ccircle cx='120' cy='145' r='22'/%3E%3Cpath d='M120 132v13l9 7M96 230h48M96 280h48M96 330h48'/%3E%3C/g%3E%3C/svg%3E"); }
  /* The quiz dims the room on purpose — no hints left, this is the test — but
     it used to bottom out at #112226, which is near black in a player that is
     otherwise white. Lifted into the same deep teal the completion screen
     uses, so the two dark moments read as one family instead of a hole. */
  body.quiz-mode .stage{ max-width:none; min-height:0; padding:0; display:flex; overflow:visible;
                         background:radial-gradient(110% 65% at 50% 0%,rgba(255,248,238,.10),transparent 62%),
                                    linear-gradient(165deg,#2a555f,#1a3b43); }
  body.quiz-mode .stage::before{ display:none; }
  body.quiz-mode .course-chat-quiz{ flex:1; }

  /* A 22px drop shadow on every card is what made a page of them look like
     a stack of paper. One hairline, one almost-invisible lift. */
  .card{ background:#fff; border-color:var(--line); box-shadow:0 1px 2px rgba(25,71,78,.05); }
  /* 免費體驗的最後一頁延續 quiz 的深色場景：完成與選購是同一個高潮，
     不跳回安靜的白色工作表。只套在免費課最後一步，不影響正式課結業。 */
  body.free-course-complete{ background:#f4f1ed; color:#fffaf5; }
  body.free-course-complete .wrap{ background:#fff; }
  body.free-course-complete .lesson-heading{ display:none; }
  body.free-course-complete .stage{ max-width:none; min-height:calc(100vh - 120px); min-height:calc(100dvh - 120px);
    display:flex; align-items:center; justify-content:center;
    background:radial-gradient(circle at 78% 12%,rgba(240,191,88,.10),transparent 28%),
               linear-gradient(165deg,var(--completion-surface-start),var(--completion-surface-end) 68%); }
  body.free-course-complete .stage::before{ display:none; }
  body.free-course-complete .phrase{ color:#f0bf58; }
  body.free-course-complete .center{ width:min(100%,620px); }
  .free-complete-hero{ margin:0 auto 24px; text-align:center; }
  .free-complete-kicker{ color:#f0bf58; font-size:18px; font-weight:600; }
  .free-complete-hero h2{ margin:8px 0 10px; color:#fffaf5; font-size:clamp(23px,4vw,30px);
                          line-height:1.1; letter-spacing:-.03em; }
  .free-complete-hero p{ margin:0; color:rgba(255,250,245,.70); font-size:16px; line-height:1.55; }
  .bigcard{ color:var(--ink); background:linear-gradient(145deg,#fffaf4,#f7f2ec); border-color:#eadfd6; }
  .orientation-hero::before{ color:rgba(8,120,139,.055); }
  .passport-stamp{ color:#9a6b12; }
  .hero-kicker,.mission-eyebrow,.rule-t{ color:#987019; }
  .hero-title,.roadmap-text,.brief-value{ color:var(--ink); }
  .roadmap-item,.brief-row{ background:rgba(36,56,61,.018); border-color:rgba(36,56,61,.055); }
  .mission-intro{ background:linear-gradient(145deg,#f9fbfb,#f3f8f8); border-color:#d8e8e9; box-shadow:var(--shadow); }
  .start-summary{ background:#f6f9f9; border-color:var(--line); }
  .start-summary strong{ color:#987019; }
  .rule-n,.lead,.speaker,.said{ color:var(--dim); }
  .phrase,.meaning,.dialogue-text,.chunk strong{ color:var(--mint); }
  .chunks-toggle{ background:rgba(185,131,44,.14); color:#8a6320; }
  /* `[open]` out-specifies a bare class, so painting `.chunks-fold` here made
     the folded state carry the band and the open one lose it — exactly
     backwards. Both states are named. */
  .notes{ background:#f1f5f6; }
  .chunks-fold{ background:transparent; }
  .chunks-fold[open]{ background:#f1f5f6; }
  .notes li{ color:#41575c; background:transparent; }
  .chunks{ background:#f4f7f7; border-color:#e4eded; }
  .chunks-fold .chunks{ background:transparent; border:0; }
  .chunk{ color:#41575c; background:transparent; border:0; }
  .chunk:hover{ background:#edf3f3; }
  .chunk span,.dialogue-meaning{ color:#42585d; }
  .dialogue-bubble.ai{ background:#eef9f6; border-color:#bfe4d9; }
  .dialogue-bubble.you{ background:#fff7e5; border-color:#ecd79f; }
  .dialogue-bubble.you.guided-answer{ background:#fffaf0; border-color:#eee0b9; }
  .btn.mic{ background:var(--rose-soft); color:var(--rose-ink); border:0; }
  .btn.mic.recording{ background:var(--rose-active); }
  .btn.ghost{ background:#fff; border-color:#cbdcde; color:#315158; }
  .dot{ background:#d6e1e2; }
  .course-card{ background:#fff; border-color:var(--line); }
  @media (min-width:768px){
    body{ padding:28px; }
    /* The frame stays — it is what makes the white a working surface rather
       than the whole page. What went is the colour: a 1.5px saturated teal
       outline drew a line around everything and competed with the header it
       sat under. A neutral hairline does the same job and says nothing. */
    .wrap{ max-width:820px; min-height:calc(100vh - 56px); min-height:calc(100dvh - 56px);
           border:1px solid #e4ded7; border-radius:18px;
           overflow:hidden; box-shadow:0 1px 2px rgba(40,30,20,.04); }
    header{ padding:22px 32px 20px; }
    .course-nav{ gap:12px; }
    .course-link{ min-width:82px; min-height:58px; font-size:12px; }
    .course-link .mission-icon{ font-size:17px; }
    .lesson-heading{ padding:20px 38px 0; }
    /* One step up for the whole scale. */
    :root{ --text-display:38px; --text-title:26px; --text-body:16px; --text-meta:12px; }
    .stage{ max-width:720px; padding:10px 28px 42px; }
    .phrase-row{ margin-top:4px; }
    .stage::before{ width:290px; height:510px; right:-18px; bottom:26px; }
    .orientation-hero{ min-height:510px; padding:38px 42px; }
    .mission-intro{ padding:26px 28px; }
    .mission-title{ font-size:30px; }
    .compact-mission-title{ font-size:30px; margin-bottom:18px; }
    .btn.start-cta{ min-width:240px; padding:11px 24px; font-size:17px; }
    .btn.orientation-start{ min-width:0; padding:14px 24px; }
    .dialogue-bubble.ai .dialogue-text{ font-size:26px; }
    .pronun-card .phrase-bubble .dialogue-text{ font-size:40px; }
    .sentence-card .phrase-bubble .dialogue-text{ font-size:32px; }
    /* The meaning does not scale with the headline. It is the supporting line,
       and stepped up to 19px beside a 40px sentence it started reading as a
       second sentence rather than as a gloss. */
    .phrase-bubble .dialogue-meaning{ font-size:17px; }
    .guided-answer-phrase{ font-size:26px; }
    .course-chat-quiz .quiz-eyebrow{ padding:7px 15px; font-size:15px; }
    .course-chat-quiz .quiz-instruction{ font-size:18px; }
    .course-chat-quiz .quiz-mic-hint{ font-size:17px; }
    .course-chat-quiz .quiz-nav .btn{ font-size:17px; }
  }
  @media (max-width:767px){
    header{ position:sticky; top:0; z-index:20; }
    .lesson-heading{ padding-left:14px; padding-right:14px; }
    body.practice-mode .lesson-heading h1{ font-size:16px; }
    .stage{ padding-left:14px; padding-right:14px; }
    .course-nav{ width:100%; justify-content:stretch; gap:6px; }
    .course-link{ flex:1 1 0; min-width:0; min-height:44px; padding:6px 2px; }
    .course-link .mission-icon{ font-size:16px; }
    .course-link .mission-name{ display:none; }
    /* The first tab shows its name instead of its ◎, because "1 2 3 4" with a
       ring in front reads as five numbers. It used to be a CSS `content:
       "Mission"` — hardcoded English, so the Chinese player said Mission too.
       The name is already translated in the markup; just stop hiding it. */
    .course-link:first-child .mission-icon{ display:none; }
    .course-link:first-child .mission-name{ display:block; font-size:12px; font-weight:600; }
    .course-nav.has-scenarios .course-link:first-child .mission-icon{ display:block; }
    .course-nav.has-scenarios .course-link:first-child .mission-name{ display:none; }
  }
  /* Six tabs still fit an iPhone SE (42px each, no scroll) — the word "Mission"
     does not: at 320px the label is 46px inside a 42px tab and spills over its
     own pill. Below 360 the first tab goes back to its ◎. */
  @media (max-width:359px){
    .course-link:first-child .mission-icon{ display:block; }
    .course-link:first-child .mission-name{ display:none; }
    .stage::before{ width:175px; height:310px; right:-38px; bottom:22px; }
    .course-chat-quiz{ padding:18px 18px 16px; }
    .course-chat-quiz .quiz-eyebrow,
    .course-chat-quiz .quiz-instruction,
    .course-chat-quiz .quiz-mic-hint{ display:none; }
    .course-chat-quiz .quiz-question-wrap{ margin-top:clamp(16px,3vh,28px); }
    .course-chat-quiz .quiz-response{ margin-top:clamp(26px,5vh,52px); }
  }
