/* layout.css — component 全局基础 + 对话骨架/侧栏/主区/档位/对话流/数据源面板 */
  /* ---- component：统一 label（替代散落 8+ 处的 mono-uppercase 定义）---- */
  .u-label { font-family: var(--mono); font-size: var(--label-size);
             letter-spacing: var(--label-tracking); text-transform: uppercase;
             color: var(--ink-faint); }
  /* ---- component：统一卡片系统（.card + 语义变体）----
     基类管圆角/内距/左边条；变体只换边条色与标签文字色（底色已删，保留文字识别）。
     info=口径/澄清 · success=审判通过 · warn=需确认/缺数据/存疑
     danger=审判不符 · neutral=未审/系统 · accent=方法论 */
  .card { border-radius: var(--r-md); padding: 12px 16px;
          border-left: var(--bw-edge) solid var(--st-neutral);
          background: none; margin-bottom: var(--gap-md); }
  .card__label { font-family: var(--mono); font-size: var(--label-size);
          letter-spacing: var(--label-tracking); text-transform: uppercase;
          font-weight: 600; margin-bottom: 4px; color: var(--ink-faint); }
  .card__body  { font-size: 13.5px; line-height: 1.7; color: var(--ink); }
  .card--info    { border-left-color: var(--st-info); }
  .card--info    .card__label { color: var(--st-info); }
  .card--success { border-left-color: var(--st-success); }
  .card--success .card__label { color: var(--st-success); }
  .card--warn    { border-left-color: var(--st-warn); }
  .card--warn    .card__label { color: var(--st-warn); }
  .card--danger  { border-left-color: var(--st-danger); }
  .card--danger  .card__label { color: var(--st-danger); }
  .card--neutral { border-left-color: var(--st-neutral); }
  .card--accent  { border-left-color: var(--accent); }
  .card--accent  .card__label { color: var(--accent); }
  * { box-sizing: border-box; }
  html, body { height: 100%; -webkit-font-smoothing: antialiased; }
  body {
    margin: 0; background: var(--bg); color: var(--text);
    font-family: var(--sans); font-size: 15px; line-height: 1.6;
    font-feature-settings: "tnum" 0;
  }
  ::selection { background: var(--navy); color: #fff; }
  /* ---- 对话式骨架：左会话列表 + 右对话流 ---- */
  .app { display: grid; grid-template-columns: 268px 1fr; height: 100vh; }

  /* 侧栏 */
  .side { border-right: 1px solid var(--line); background: var(--paper-raised);
          display: flex; flex-direction: column; min-height: 0; }
  .side-head { padding: var(--gap-md) var(--gap-md) var(--gap-sm);
               border-bottom: 1px solid var(--line); }
  .side-head .brand { font-family: var(--serif); font-weight: 600; font-size: 19px;
               line-height: 1.1; margin: 0; }
  .side-head .brand em { font-style: italic; color: var(--navy); }
  .side-head .org { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.16em;
               text-transform: uppercase; color: var(--ink-faint); margin-top: 3px; }
  .side-new { margin: var(--gap-sm) var(--gap-md); }
  .side-search { margin: 0 var(--gap-md) var(--gap-sm); }
  .side-search input { width: 100%; box-sizing: border-box; font: inherit; font-size: 12.5px;
               padding: 7px 10px; border: 1px solid var(--line-strong); border-radius: var(--r-md);
               background: var(--surface); color: var(--ink); outline: none;
               transition: border-color .15s var(--ease-out); }
  .side-search input:focus { border-color: var(--navy); }
  .side-search input::placeholder { color: var(--ink-faint); }
  .side-list { flex: 1; overflow-y: auto; padding: 4px var(--gap-sm) var(--gap-md); min-height: 0; }
  .side-list .sl-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em;
               text-transform: uppercase; color: var(--ink-faint); padding: 8px 10px 4px; }
  .sess-item { padding: 9px 11px; border-radius: var(--r-md); cursor: pointer; margin-bottom: 2px;
               transition: background .18s var(--ease-out); border: 1px solid transparent; }
  .sess-item:hover { background: var(--navy-wash); }
  .sess-item.active { background: var(--navy-wash); border-color: var(--line-strong); }
  .sess-item .t { font-size: 13.5px; color: var(--ink); overflow: hidden;
               text-overflow: ellipsis; white-space: nowrap; }
  .sess-item .m { font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); margin-top: 2px; }
  .sess-item .snip { font-size: 11.5px; color: var(--ink-soft, var(--ink-faint)); margin-top: 3px;
               overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: 1.35; }
  .sess-item .snip mark, .sess-item .t mark { background: var(--brand-wash, #ffe9a8);
               color: var(--navy); padding: 0 1px; border-radius: 2px; }

  /* 主区 */
  .main { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
  .topbar { display: flex; align-items: center; gap: var(--gap-md);
            padding: var(--gap-sm) var(--gap-md); border-bottom: 1px solid var(--line);
            background: var(--paper-raised); flex-wrap: wrap; }
  .topbar .tb-title { font-family: var(--serif); font-size: 16px; font-weight: 600;
            margin-right: auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
            cursor: text; padding: 2px 6px; border-radius: var(--r-md); border: 1px solid transparent;
            max-width: 46ch; }
  .topbar .tb-title:hover { border-color: var(--line-strong); }
  .topbar .tb-title:focus { outline: none; border-color: var(--navy); background: var(--surface);
            cursor: text; white-space: nowrap; overflow-x: auto; }
  .topbar .tb-edit { font-family: var(--mono); font-size: 11px; color: var(--ink-faint);
            cursor: pointer; border: none; background: none; padding: 2px 4px; margin-right: auto; }
  .topbar .tb-edit:hover { color: var(--navy); }
  .ctrl { display: flex; align-items: center; gap: 6px; }
  .ctrl label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em;
            text-transform: uppercase; color: var(--ink-faint); }
  select, .seg { font-family: var(--sans); font-size: 13px; }
  select { padding: 6px 8px; border: 1.5px solid var(--line-strong); border-radius: var(--r-sm);
           background: var(--surface); color: var(--text); }
  select:focus { outline: none; border-color: var(--navy); }
  /* 档位切换 */
  .seg { display: inline-flex; border: 1.5px solid var(--line-strong); border-radius: var(--r-sm); overflow: hidden; }
  .seg button { border: none; background: var(--surface); color: var(--ink-soft);
           padding: 6px 12px; cursor: pointer; font-size: 12.5px; font-family: var(--sans); }
  .seg button[aria-pressed="true"] { background: var(--navy); color: #fff; }

  /* 对话流 */
  .stream { flex: 1; overflow-y: auto; padding: var(--gap-md) var(--gap-md) var(--gap-lg);
            min-height: 0; scroll-behavior: smooth; }

  /* 数据源面板：固定在对话流上方，常驻展示本会话已上传文件 */
  .datasource { border-bottom: 1px solid var(--line); background: var(--paper-raised);
            padding: var(--gap-sm) var(--gap-md); flex-shrink: 0; }
  .datasource.empty { display: none; }
  .datasource .ds-inner { max-width: 880px; margin: 0 auto;
            display: flex; align-items: center; gap: var(--gap-sm); flex-wrap: wrap; }
  .datasource .ds-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em;
            text-transform: uppercase; color: var(--ink-faint); white-space: nowrap; }
  .datasource .ds-files { display: flex; flex-wrap: wrap; gap: 6px; }
  .datasource .ds-chip { display: inline-flex; align-items: center; gap: 6px; font-size: 12px;
            font-family: var(--mono); background: var(--navy-wash); border: 1px solid var(--line-strong);
            border-radius: var(--r-pill); padding: 3px 11px; color: var(--ink-soft); }
  .datasource .ds-chip .b { font-size: 9.5px; color: var(--accent); letter-spacing: .04em; }

