/* ai-chat-sheet.css — 全站移动端【底部上拉 sheet】单一真源
 * ★ 提取自 settings 移动 sheet(92dvh / 圆角 32px / slide 动画)。任何移动端上拉 sheet
 *   (settings / studio 会议室 / 未来的)都加 class="duo-sheet",不各自新建。
 *   开 = .duo-sheet-open,关 = .duo-sheet-closing。只在移动端(≤768)sheet 化;桌面维持元素自身布局。
 * JS 开关唯一入口 = ui-chat-sheet.js(DuoSheet.open / close),别处不许直接加减这三个类。
 */
:root {
  --duo-sheet-radius: calc(32px * var(--corner-k));   /* ★ 上拉 sheet 顶部圆角唯一真源:本表与需要"让位给 sheet"的表(如 ai-chat-studio.css 的 .studio-meeting)共用,别各写数字 */
  /* ★矮 sheet 高度唯一真源:查看器的图层 sheet 与 3D 材质 sheet 共用 —— 两个从同一个位置升起来的面板
     高度必须一样,各写一份数值迟早分家 */
  /* ★两档都取 dvh 与 svh 的【较小者】:sheet 贴着底边,只要它高过【当前真正看得见】的那块,
     多出来的部分连同自己的输入框一起沉到浏览器 UI 底下,而且它没有溢出、滚也滚不出来
     (owner 2026-08-10 手机横屏实拍:输入框一半在屏幕外)。dvh 在 UI 收起时会给到大值,
     svh 是"UI 全展开时"的下界 —— 取小的那个,任何时候都不会伸出可见区。 */
  --duo-sheet-h-short: min(50dvh, 50svh);
  --duo-sheet-h-tall: min(92dvh, 92svh);   /* 满屏档(设置页那档):矮 sheet 的搜索态升到这里 */
  /* ★sheet 这一层的层号唯一源。凡是要跟 sheet 比高低的(它自己的遮罩、压在它上面的东西)
     都从这里算,别各写一个数:两个字面量靠【谁后加载】决出胜负,而那是看不见的
     —— 设置页的 Memory 子面板写了 9999 想压过自己的遮罩 9998,却被本表 .duo-sheet 的
     160 覆盖(本表后加载、特异性相同),于是遮罩反过来盖住面板,整页压暗
     (owner 2026-09-02 手机实拍,本机 A/B 复现)。 */
  --duo-sheet-z: 160;
}
@media (max-width: 768px), (max-height: 500px) {
  .duo-sheet {
    position: fixed;
    left: 0; right: 0; bottom: 0;
    /* 被 sheet 化的元素常自带"居中弹窗"的尺寸(如 .project-modal-content 的 90% / 400px),
       不让位的话 sheet 会缩在屏幕中间一条 —— 贴底全宽是这套形态的前提,写进真源而不是各处覆盖 */
    width: auto; max-width: none;
    height: var(--duo-sheet-h-tall);
    max-height: var(--duo-sheet-h-tall);
    /* 高度被钉死了,内容就必须能滚 —— 否则比 92dvh 高的那些(人多时的 agent 选择器、作品详情)
       超出部分永远够不着。项目设置那个手机 sheet 早就是这么写的,这里照搬,别只搬一半。 */
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    border-radius: var(--duo-sheet-radius) var(--duo-sheet-radius) 0 0;
    transform: translateY(100%);
    /* ★sheet 是模态面:必须压过页面上的 fixed 控件(汉堡 .mobile-menu-trigger 是 150),又必须留在下拉(200)、
       侧栏抽屉(9999)之下。横屏时 sheet 只有 26px 顶边,正好插进汉堡那块 —— 以前靠藏汉堡避开,
       owner 否掉(2026-08-22):盖住就好,不藏。层序是根因,藏控件是绕路。 */
    z-index: var(--duo-sheet-z);
  }
  /* ── 有头 sheet 的壳形契约【唯一真源】(owner 2026-08-27 立契约 · 2026-09-02 定终形:
     与桌面弹窗同一款 —— 头在流内、体在其下滚,不再玻璃渐变)──
     壳(.duo-sheet)【永不自滚】:头(.duo-sheet-head)是流内第一段(实底,与 sheet 同色),
     唯一滚动区 = .duo-sheet-body(flex:1,箱体从头的下沿开始)。于是滚动条 / iOS 原生
     指示条的起点【天生】在头之下、顶部圆角之外 —— 起止位置调矮,不是埋进玻璃、不是
     渐变消失、不是拿掉(owner 2026-09-02 定标准;08-28 的浮头玻璃形态废止)。
     内容起点 = 头高 + 各壳自留的呼吸距(body 的 padding-top 只写呼吸距,头高由流内自动占)。
     包装动作只归 ui-chat-sheet.js 的 DuoSheet.open(有头且没现成 body 时自动收拢),
     别再各壳自 wrap。滚动条样子仍 = .duo-scroll 模板(ai-chat-base.css),此处零外观规则。
     无头的 sheet(壳自己滚)沿用上面的 overflow-y:auto。 */
  /* ★这里绝不写 position:本组合选择器特异性高于 .duo-sheet,写 relative 会把 sheet 的
     fixed 顶掉 → 壳掉回流内、底下整页漏出(owner 2026-08-28 实拍)。 */
  .duo-sheet.has-sheet-head { display: flex; flex-direction: column; overflow: hidden; }
  .duo-sheet-body {
    flex: 1 1 auto; min-height: 0;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
  }

  .duo-sheet.duo-sheet-open { animation: duoSheetSlideUp 0.3s ease-out forwards; }
  .duo-sheet.duo-sheet-closing { animation: duoSheetSlideDown 0.25s ease-in forwards; }
}
@keyframes duoSheetSlideUp { from { transform: translateY(100%); } to { transform: translateY(0); } }
@keyframes duoSheetSlideDown { from { transform: translateY(0); } to { transform: translateY(100%); } }

/* ── 手机上拉 sheet 的关闭钮【唯一真源】(owner 2026-08-06 以会议室那颗定版)──
   挂法:class="chat-header-btn duo-sheet-close" + 内容 icon-close-button —— 盒子(36×36/hover)
   The box comes from chat-header-btn; here only the glyph size (the small icon size). Its stroke is the one every line
   icon has (--icon-stroke in ai-chat-base.css). Each sheet positions it in its own top-right corner. */
.duo-sheet-close svg { width: var(--icon-size-sm); height: var(--icon-size-sm); }

/* ★没点名的也收编(owner):双形态弹窗(桌面 modal/手机 sheet)共用一颗 .project-modal-close,
   The box differs by device (28 desktop / 36 touch); on touch the glyph takes the same small size as above. This file
   loads after sidebar-projects, so at equal specificity it wins over the rule there. */
@media (hover: none) and (pointer: coarse) {
  .project-modal-close svg { width: var(--icon-size-sm); height: var(--icon-size-sm); }
}

/* ── 手机上拉 sheet 的钉死标题栏【唯一真源】(与 .duo-sheet-close 配对)──
   挂法:class="settings-memory-subpanel-header duo-sheet-bar" + 内含 .settings-memory-subpanel-title。
   桌面不出(sheet 是手机形态,桌面靠位置自明身份);钉在壳顶、压渐变之上,内容从它下面滚过去;
   两侧留白给关闭钮/入口按钮(绝对定位的那批),标题居中由 subpanel-title 自己的样式给。 */
/* ── 手机 sheet 的流内头【唯一真源】(owner 2026-08-23 收编;原先项目设置 / 分享 / Studio 各持一份同形副本)──
   挂法:头元素加 class="duo-sheet-head"(里面放返回/关闭钮 + 标题 + 占位),它必须是【壳的流内第一段】。
   底色走 --duo-sheet-bg,暗色是 sheet 自己的 #212121(不是面板 token 的 #2a2a2a,
   那会在头下露一条色差)。桌面不出。(.duo-sheet-bar 那条是给【浮条覆盖】形态的壳用的,两条各管一种壳。) */
.duo-sheet-head { display: none; }
@media (max-width: 768px), (max-height: 500px) {
  .duo-sheet-head {
    --duo-sheet-bg: var(--color-bg-panel);
    display: flex; align-items: center; gap: 4px; padding: 16px 16px 20px;
    /* 流内实底头:体的箱体从头下沿开始,内容和指示条在头下【裁掉】而不是滑进玻璃里淡出。 */
    flex-shrink: 0;
    background: var(--duo-sheet-bg);
  }
  .dark-mode .duo-sheet-head, .dark-mode-active .duo-sheet-head { --duo-sheet-bg: #212121; }
}

.duo-sheet-bar { display: none; }
@media (max-width: 768px), (max-height: 500px) {
  .duo-sheet-bar {
    display: flex; position: absolute; top: 16px; left: 0; right: 0; z-index: 2;
    padding: 0 16px; margin: 0; min-height: 26px; align-items: center;
  }
}
