/* components.css — 对话流内容：msg气泡/思考历史/文件chip/composer/MergePreview */
  .stream-inner { max-width: 880px; margin: 0 auto; }
  .msg { margin-bottom: var(--gap-lg); animation: fadeup .5s var(--ease-out) both; }
  /* 标题行：可点击折叠；左侧角色名 + 右侧折叠开关 */
  .msg-role { display: flex; align-items: center; gap: 8px; cursor: pointer;
            font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em;
            text-transform: uppercase; color: var(--ink-faint); margin-bottom: 6px;
            user-select: none; }
  .msg-role .role-name { flex: 1; }
  .msg-role .collapse-btn { display: inline-flex; align-items: center; justify-content: center;
            width: 18px; height: 18px; border: 1px solid var(--line-strong); border-radius: var(--r-md);
            background: var(--surface); color: var(--ink-faint); font-size: 11px; line-height: 1;
            transition: transform .2s var(--ease-out), color .2s var(--ease-out); }
  .msg-role:hover .collapse-btn { color: var(--ink); border-color: var(--ink-faint); }
  .msg.collapsed .collapse-btn { transform: rotate(-90deg); }
  .msg.collapsed .bubble { display: none; }
  /* 用户气泡：navy 左条标识，去底色块（与结果卡一致：留左条+角色名色，不填底） */
  .msg.user .bubble { background: none; border-left: 3px solid var(--navy);
            border-radius: var(--r-sm); padding: 4px 0 4px 16px; }
  .msg.user .msg-role .role-name { color: var(--navy); }
  .msg.user .bubble .files { margin-top: 6px; display: flex; flex-wrap: wrap; gap: 6px; }
  /* AI 气泡：仅用橙色左边条 + 橙色角色名做身份标识；背景透明，
     让内部结果卡片（口径/澄清/表格，多为蓝调）自然显示，不被整块橙底包裹套色 */
  .msg.assistant .bubble { background: none; border-left: 3px solid var(--orange);
            border-radius: var(--r-sm); padding: 4px 0 4px 16px; }
  .msg.assistant .msg-role .role-name { color: var(--orange); }
  /* 对话回答(chat-reply)：纯对话轮，去掉青色卡片左条与内距，内容直接并入 AGENT 橙条结构 */
  .chat-reply { border-left: none; padding: 0; }
  .msg.system .bubble { background: var(--surface); border: 1px dashed var(--line-strong);
            border-radius: var(--r-sm); padding: 10px 14px; color: var(--text-muted); font-size: 13.5px; }
  .thinking { font-family: var(--mono); font-size: 12.5px; color: var(--orange); }
  .thinking::after { content: "…"; animation: blink 1.2s steps(3) infinite; }
  @keyframes blink { 0%,100% { opacity: .3 } 50% { opacity: 1 } }
  /* 思考历史：堆叠展示各阶段，已完成灰色带耗时，进行中橙色高亮 */
  .think-log { font-family: var(--mono); font-size: 12.5px; }
  .think-step { display: flex; align-items: baseline; gap: 8px; padding: 2px 0; line-height: 1.6; }
  .think-step .ts-msg { flex: 1; }
  .think-step .ts-sec { color: var(--ink-faint); font-size: 11px; white-space: nowrap; }
  .think-step.done .ts-msg { color: var(--ink-faint); }
  .think-step.done::before { content: "✓"; color: var(--up); font-size: 11px; }
  .think-step.active .ts-msg { color: var(--orange); }
  .think-step.active::before { content: "▸"; color: var(--orange); }
  .think-step.active .ts-msg::after { content: "…"; animation: blink 1.2s steps(3) infinite; }
  /* 生成后的思考小结：浅灰、默认折叠，点击展开看每步+耗时 */
  .think-summary { margin-bottom: 10px; }
  .think-summary > summary { cursor: pointer; font-family: var(--mono); font-size: 11.5px;
       color: var(--ink-faint); padding: 2px 0; list-style: none; user-select: none; }
  .think-summary > summary::-webkit-details-marker { display: none; }
  .think-summary > summary::before { content: "▸ "; }
  .think-summary[open] > summary::before { content: "▾ "; }
  .think-summary .done-log { margin: 6px 0 2px; padding: 6px 10px;
       background: var(--surface); border-radius: var(--r-md); border-left: 2px solid var(--line-strong); }
  .think-summary .done-log .think-step.active::before { content: "✓"; color: var(--up); }
  .think-summary .done-log .think-step.active .ts-msg { color: var(--ink-faint); }
  .think-summary .done-log .think-step.active .ts-msg::after { content: ""; animation: none; }

  /* 文件 chip */
  .chip { display: inline-flex; align-items: center; gap: 6px; font-size: 12px;
          font-family: var(--mono); background: var(--surface); border: var(--bw-hair) solid var(--line-strong);
          border-radius: var(--r-pill); padding: 3px 11px; color: var(--ink-soft); }
  .chip .x { cursor: pointer; color: var(--ink-faint); font-size: 13px; line-height: 1; }
  .chip .x:hover { color: var(--down); }

  /* 探索模式 banner：复用 card--warn 容器，仅补充紧凑内距与 b 排版 */
  .explore-banner { padding: 8px 14px; margin-bottom: var(--gap-sm);
          font-size: 13px; color: var(--ink-soft); }
  .explore-banner b { color: var(--st-warn); font-family: var(--mono); font-size: 11px;
          letter-spacing: 0.06em; text-transform: uppercase; }
  /* ---- 底部输入区（composer）---- */
  .composer { border-top: 1px solid var(--line); background: var(--paper-raised);
              padding: var(--gap-sm) var(--gap-md); }
  .composer-inner { max-width: 880px; margin: 0 auto; }
  .drop { position: relative; border: 1.5px dashed var(--line-strong); border-radius: var(--r-sm);
          background: var(--surface); padding: 8px 12px; cursor: pointer; margin-bottom: var(--gap-sm);
          transition: border-color .35s var(--ease-out), background .35s var(--ease-out); }
  .drop:hover, .drop.over { border-color: var(--navy); background: var(--navy-wash); }
  .drop input[type=file] { position: absolute; inset: 0; opacity: 0; cursor: pointer; }
  .drop .dz-main { font-size: 13px; color: var(--ink-soft); }
  .drop .staged { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
  .composer-row { display: flex; gap: var(--gap-sm); align-items: flex-end; }
  .composer-row textarea { flex: 1; }
  #status { font-size: 12.5px; font-family: var(--mono); letter-spacing: 0.02em; margin-top: 4px; min-height: 16px; }
  #status .ok { color: var(--up); } #status .err { color: var(--down); white-space: pre-line; }
  #status .run { color: var(--navy); }

  textarea { width: 100%; padding: 10px 12px; border: 1.5px solid var(--line-strong);
             border-radius: var(--r-sm); background: var(--surface); color: var(--text);
             font-family: var(--sans); font-size: 14px; resize: vertical; min-height: 50px; max-height: 180px;
             transition: border-color .3s var(--ease-out); }
  textarea:focus { outline: none; border-color: var(--navy); }
  textarea::placeholder { color: var(--ink-faint); }

  .btn { font-family: var(--sans); font-size: 14px; font-weight: 500; cursor: pointer;
         border: none; border-radius: var(--r-sm); padding: 11px 26px; background: var(--navy);
         color: #fff; letter-spacing: 0.02em; position: relative; white-space: nowrap;
         transition: background .25s var(--ease-out), transform .15s var(--ease-out); }
  .btn:hover:not(:disabled) { background: var(--navy-soft); }
  .btn:active:not(:disabled) { transform: translateY(1px); }
  .btn:disabled { background: var(--line-strong); color: var(--paper-raised); cursor: not-allowed; }
  .btn.ghost { background: none; color: var(--navy); padding: 9px 14px; border: 1.5px solid var(--line-strong); }
  .btn.ghost:hover:not(:disabled) { color: var(--navy-soft); background: var(--navy-wash); }
  .btn.gold { background: var(--accent); }
  .btn.gold:hover:not(:disabled) { background: var(--accent-deep); }
  .btn.sm { padding: 7px 14px; font-size: 13px; }
  .btn.full { width: 100%; }
  /* 通知铃铛开关：复用 ghost 按钮；开启态用金色（accent）点亮，关闭/不支持置灰 */
  .btn.bell { padding: 7px 12px; }
  .btn.bell.on { color: var(--accent-deep); border-color: var(--accent); background: var(--accent-wash); }
  .btn.bell.on:hover:not(:disabled) { color: var(--accent-deep); background: var(--accent-wash); }
  .btn.bell:disabled { opacity: .55; }

  /* MergePreview 合并确认：容器用 .card.card--warn，此处仅定义子元素 */
  .merge-card .stat { font-size: 14px; color: var(--ink); margin-bottom: 8px; }
  .merge-card .stat b { font-family: var(--mono); }
  .merge-card .unmatched { font-family: var(--mono); font-size: 11.5px; color: var(--text-muted);
          background: var(--surface); border: var(--bw-hair) solid var(--line); border-radius: var(--r-sm);
          padding: 8px 10px; max-height: 120px; overflow-y: auto; margin-bottom: 10px; white-space: pre-wrap; }
  .merge-card .merge-actions { display: flex; gap: var(--gap-sm); }

  /* ---- 会话运行指示：三个点跳动（左侧列表项「分析进行中」，含后台跑的会话）---- */
  .sess-item { position: relative; }
  .sess-run { position: absolute; top: 10px; right: 10px; display: inline-flex; gap: 3px;
              align-items: center; pointer-events: none; }
  .sess-run i { width: 4px; height: 4px; border-radius: 50%; background: var(--orange);
                animation: sessDot 1.1s infinite ease-in-out both; }
  .sess-run i:nth-child(2) { animation-delay: .15s; }
  .sess-run i:nth-child(3) { animation-delay: .3s; }
  @keyframes sessDot { 0%, 80%, 100% { opacity: .25; transform: translateY(0); }
                       40% { opacity: 1; transform: translateY(-3px); } }
