/* ══════════════════════════════════════════════════════════════
   项目浏览器（2026-07-29 重做）：两栏 = 左「分组内嵌项目」树 + 右「对话（带摘要）」

   设计约定（改动前请先读）：
   1. 外壳刻意**无彩色**。分组色（slate/sage/umber/mist/clay/gold）是用户自己选的
      数据，是这个界面唯一的彩色来源；若在这里再加产品紫，颜色就不承载信息了。
   2. **不画竖直分栏线**，靠底色差（--pbx-paper2 侧栏 / --pbx-paper 主区）+ 留白分隔。
      原三栏用等宽竖线切格子，是"像表格"的直接来源。
   3. 唯一的活跃彩色 --pbx-live 只用来表示"在动"，不做装饰。
   ══════════════════════════════════════════════════════════════ */
#project-browser {
  --pbx-paper:  #FCFCFB;
  --pbx-paper2: #F8F8F6;   /* 2026-07-29 用户反馈：原 #F4F4F2 夹在侧栏淡紫白与右栏近白之间
                              色温对不上、显暗显脏；提亮后仍保留「靠底色差分隔、不画竖线」的原设计 */
  --pbx-ink:    #1A1A18;
  --pbx-ink2:   #5C5C58;
  --pbx-ink3:   #9A9A95;
  --pbx-rule:   #E8E8E4;
  --pbx-live:   #2F6F6A;
  --pbx-hover:  rgba(0,0,0,0.035);
  --pbx-sel:    rgba(0,0,0,0.062);
  background: var(--pbx-paper);
}
/* 私密态（"夜曲"皮肤保留）：只翻纸面与墨色，结构与彩色规则不变 */
body.private-active #project-browser {
  --pbx-paper:  #14121C;
  --pbx-paper2: #1A1725;
  --pbx-ink:    #ECE9F5;
  --pbx-ink2:   #A7A2B8;
  --pbx-ink3:   #6E6980;
  --pbx-rule:   rgba(167,139,250,0.14);
  --pbx-live:   #6FB3AC;
  --pbx-hover:  rgba(255,255,255,0.045);
  --pbx-sel:    rgba(255,255,255,0.085);
}

/* ── 左栏：导航树 ───────────────────────────────────────────── */
.pbx-nav {
  width: 272px; flex-shrink: 0;
  display: flex; flex-direction: column; min-height: 0;
  background: var(--pbx-paper2);
}
.pbx-head {
  display: flex; align-items: center; gap: 2px;
  padding: 20px 16px 12px; flex-shrink: 0;
}
/* 侧栏收起时，fixed 的「展开侧边栏」按钮（top/left:14px, 32px 宽）正好压在
   中栏「项目」标题上 → 整个头部右移让位。只对项目浏览器生效，聊天态左上是空的。 */
body.sidebar-collapsed #project-browser .pbx-head { padding-left: 56px; }
.pbx-head > span {
  flex: 1; min-width: 0;
  font-family: 'Noto Serif SC', Georgia, serif;
  font-size: 17px; font-weight: 600; color: var(--pbx-ink);
  letter-spacing: 0.02em;
}
.pbx-add {
  flex-shrink: 0; background: none; border: none; cursor: pointer;
  color: var(--pbx-ink3); padding: 5px; border-radius: 7px;
  display: flex; transition: background 0.15s, color 0.15s;
}
.pbx-add:hover { background: var(--pbx-hover); color: var(--pbx-ink); }
.pbx-add:focus-visible { outline: 2px solid var(--pbx-live); outline-offset: 1px; }

.pbx-search {
  display: flex; align-items: center; gap: 8px;
  margin: 0 14px 10px; padding: 8px 11px; flex-shrink: 0;
  background: var(--pbx-paper); border: 1px solid var(--pbx-rule);
  border-radius: 9px; transition: border-color 0.15s;
}
.pbx-search:focus-within { border-color: var(--pbx-live); }
.pbx-search > svg { flex-shrink: 0; color: var(--pbx-ink3); }
#pb-search {
  flex: 1; min-width: 0; border: none; background: none; outline: none;
  font-family: 'Noto Sans SC', var(--font); font-size: 13px; color: var(--pbx-ink);
}
#pb-search::placeholder { color: var(--pbx-ink3); }
.pbx-search-clear {
  flex-shrink: 0; background: none; border: none; cursor: pointer;
  color: var(--pbx-ink3); padding: 2px; border-radius: 5px; display: flex;
}
.pbx-search-clear:hover { background: var(--pbx-hover); color: var(--pbx-ink); }

.pbx-tree { flex: 1; min-height: 0; overflow-y: auto; padding: 2px 8px 20px; }

/* 分组行（可折叠的上级目录）：视觉上当「小节标题」——无衬线粗体深色，
   与下级项目的衬线常规体形成字重/字体双层对比，再加分组间距与右侧计数。 */
.pbx-group {
  display: flex; align-items: center; gap: 7px;
  padding: 7px 8px; margin-top: 10px; border-radius: 7px;
  cursor: pointer; user-select: none;
  transition: background 0.12s;
}
.pbx-tree > .pbx-group:first-child { margin-top: 2px; }
.pbx-group:hover { background: var(--pbx-hover); }
.pbx-group.active { background: var(--pbx-sel); }
.pbx-group:focus-visible { outline: 2px solid var(--pbx-live); outline-offset: -2px; }
.pbx-caret {
  flex-shrink: 0; display: flex; color: var(--pbx-ink3);
  transition: transform 0.15s;
}
.pbx-group.collapsed .pbx-caret { transform: rotate(-90deg); }
.pbx-group-name {
  flex: 1; min-width: 0; font-size: 13px; font-weight: 700;
  letter-spacing: 0.04em; color: var(--pbx-ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* 分组内项目计数：悬停时让位给 ··· 菜单（同脊线/相对时间的惯例） */
.pbx-group-count {
  flex-shrink: 0; font-family: 'Inter', var(--font);
  font-size: 11px; font-weight: 500; font-variant-numeric: tabular-nums;
  color: var(--pbx-ink3); letter-spacing: 0.02em;
}
.pbx-group:hover .pbx-group-count { display: none; }
.pbx-group-menu {
  flex-shrink: 0; background: none; border: none; color: var(--pbx-ink3);
  cursor: pointer; padding: 1px 4px; border-radius: 5px;
  opacity: 0; font-size: 13px; line-height: 1; letter-spacing: 1.3px;
  transition: opacity 0.12s, background 0.12s;
}
.pbx-group:hover .pbx-group-menu, .pbx-group-menu.open { opacity: 1; }
.pbx-group-menu:hover { background: var(--pbx-hover); }

/* 项目行（缩进在分组之下）：衬线常规体 + 更深缩进，与分组标题拉开层级 */
.pbx-proj {
  display: flex; align-items: center; gap: 9px;
  padding: 8px 9px 8px 27px; border-radius: 7px;
  cursor: pointer; user-select: none;
  transition: background 0.12s;
}
.pbx-proj:hover { background: var(--pbx-hover); }
.pbx-proj.active { background: var(--pbx-sel); }
.pbx-proj:focus-visible { outline: 2px solid var(--pbx-live); outline-offset: -2px; }
.pbx-proj-bar {
  flex-shrink: 0; width: 3px; height: 15px; border-radius: 2px;
  background: var(--pbx-ink3); opacity: 0.45;
}
.pbx-proj-bar[data-color="slate"] { background: #8A8F98; opacity: 0.95; }
.pbx-proj-bar[data-color="sage"]  { background: #7A9A7E; opacity: 0.95; }
.pbx-proj-bar[data-color="umber"] { background: #B08858; opacity: 0.95; }
.pbx-proj-bar[data-color="mist"]  { background: #7C93B0; opacity: 0.95; }
.pbx-proj-bar[data-color="clay"]  { background: #BC7A66; opacity: 0.95; }
.pbx-proj-bar[data-color="gold"]  { background: #BFA059; opacity: 0.95; }
.pbx-proj-name {
  flex: 1; min-width: 0;
  font-family: 'Noto Serif SC', Georgia, serif;
  font-size: 13.5px; font-weight: 400; color: var(--pbx-ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pbx-proj.active .pbx-proj-name { font-weight: 600; }
.pbx-proj-menu {
  flex-shrink: 0; background: none; border: none; color: var(--pbx-ink3);
  cursor: pointer; padding: 1px 4px; border-radius: 5px;
  opacity: 0; font-size: 13px; line-height: 1; letter-spacing: 1.3px;
  transition: opacity 0.12s, background 0.12s;
}
.pbx-proj:hover .pbx-proj-menu, .pbx-proj-menu.open { opacity: 1; }
.pbx-proj-menu:hover { background: var(--pbx-hover); }

/* ── 签名元素：活跃度脊线 ──────────────────────────────────────
   12 格 = 最近 12 周，格高/浓度 = 该周对话数。回答"哪几个项目在动"。
   悬停项目行时隐藏（让位给 ··· 菜单），避免两者抢同一处空间。 */
.pbx-spine {
  flex-shrink: 0; display: flex; align-items: flex-end; gap: 1px;
  height: 13px; opacity: 0.85;
}
.pbx-proj:hover .pbx-spine { display: none; }
.pbx-spine i {
  width: 2px; border-radius: 1px;
  background: var(--pbx-ink3); height: 2px; opacity: 0.3;
}
/* 数据不足时替代脊线的相对时间文字（「3 天前」）。与脊线同一处位置、同样在
   悬停时让位给 ··· 菜单，保证两种形态切换不影响行内布局。 */
.pbx-proj-when {
  flex-shrink: 0; font-family: 'Inter', var(--font);
  font-size: 11.5px; font-variant-numeric: tabular-nums;
  color: var(--pbx-ink3); letter-spacing: 0.01em;
}
.pbx-proj:hover .pbx-proj-when { display: none; }

.pbx-spine i[data-l="1"] { height: 4px;  opacity: 0.5;  background: var(--pbx-live); }
.pbx-spine i[data-l="2"] { height: 7px;  opacity: 0.68; background: var(--pbx-live); }
.pbx-spine i[data-l="3"] { height: 10px; opacity: 0.84; background: var(--pbx-live); }
.pbx-spine i[data-l="4"] { height: 13px; opacity: 1;    background: var(--pbx-live); }

.pbx-tree-empty, .pbx-nores {
  padding: 22px 12px; font-size: 12.5px; color: var(--pbx-ink3);
  text-align: center; line-height: 1.7;
}

/* ── 右栏：项目详情 + 对话流 ────────────────────────────────── */
.pbx-detail {
  flex: 1; min-width: 0;
  display: flex; flex-direction: column; min-height: 0;
  background: var(--pbx-paper);
}
.pbx-detail-head {
  display: flex; align-items: center; gap: 13px;
  padding: 22px 30px 16px; flex-shrink: 0;
  border-bottom: 1px solid var(--pbx-rule);
}
/* 让出右上角悬浮图标那条带（2026-07-29）。
   #main 上有 4 个绝对定位图标（私密/公告/分享/更多工具），top:12px、height:32px
   → 占据 top 12–44px、right 0–156px，且在 project-mode 下**不隐藏**。
   详情头原 padding-top:22px，右端的「新建对话」正好撞进去；把整个头下移到 52px
   （图标底边 44px + 留白），按用户要求「往下调整一些」，
   不动那 4 个图标的全局定位——聊天区还在用同一套坐标。
   ⚠️ 只写 padding-top，禁用 padding 简写：@media(max-width:900px) 里
   .pbx-detail-head 的 padding-left/right 是低优先级选择器，简写会把它整条盖掉。 */
#main.project-mode .pbx-detail-head { padding-top: 52px; }

.pbx-detail-titles { flex: 1; min-width: 0; }
#pb-chats-head {
  font-family: 'Noto Serif SC', Georgia, serif;
  font-size: 21px; font-weight: 600; color: var(--pbx-ink);
  line-height: 1.25; letter-spacing: 0.01em;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pbx-detail-meta {
  margin-top: 3px;
  font-family: 'Inter', var(--font); font-size: 12px; color: var(--pbx-ink3);
  font-variant-numeric: tabular-nums;
}
.pbx-menu-btn {
  flex-shrink: 0; background: none; border: none; color: var(--pbx-ink3);
  cursor: pointer; padding: 4px 9px; border-radius: 8px;
  font-size: 17px; line-height: 1; letter-spacing: 1.5px;
  transition: background 0.15s, color 0.15s;
}
.pbx-menu-btn:hover { background: var(--pbx-hover); color: var(--pbx-ink); }
.pbx-newchat {
  flex-shrink: 0; display: flex; align-items: center; gap: 7px;
  padding: 8px 14px; border-radius: 9px; cursor: pointer;
  border: 1px solid var(--pbx-rule); background: var(--pbx-paper2);
  font-family: 'Noto Sans SC', var(--font); font-size: 13px; color: var(--pbx-ink2);
  transition: border-color 0.15s, color 0.15s, background 0.15s;
}
.pbx-newchat:hover {
  border-color: var(--pbx-live); color: var(--pbx-live);
  background: var(--pbx-paper);
}
.pbx-newchat:focus-visible { outline: 2px solid var(--pbx-live); outline-offset: 1px; }
.pbx-newchat svg { flex-shrink: 0; }

.pbx-detail-body { flex: 1; min-height: 0; overflow-y: auto; padding: 6px 30px 40px; }

/* 对话流的按天/按周分组标签 */
.pbx-daylabel {
  padding: 20px 2px 8px;
  font-family: 'Inter', var(--font);
  font-size: 11px; font-weight: 600; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--pbx-ink3);
}
.pbx-daylabel:first-child { padding-top: 10px; }

/* 对话行：标题 + 2 行摘要 + 相对时间 */
.pbx-chat {
  display: flex; align-items: flex-start; gap: 16px;
  padding: 13px 14px; margin: 0 -14px; border-radius: 10px;
  cursor: pointer; transition: background 0.12s;
}
.pbx-chat:hover { background: var(--pbx-hover); }
.pbx-chat.active { background: var(--pbx-sel); }
.pbx-chat:focus-visible { outline: 2px solid var(--pbx-live); outline-offset: -2px; }
.pbx-chat-main { flex: 1; min-width: 0; }
.pbx-chat-title {
  font-family: 'Noto Sans SC', var(--font);
  font-size: 14px; font-weight: 500; color: var(--pbx-ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pbx-chat-preview {
  margin-top: 3px;
  font-family: 'Noto Sans SC', var(--font);
  font-size: 12.5px; line-height: 1.55; color: var(--pbx-ink2);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.pbx-chat-preview em { font-style: normal; color: var(--pbx-live); font-weight: 600; }
.pbx-chat-title em   { font-style: normal; color: var(--pbx-live); }
.pbx-chat-time {
  flex-shrink: 0; padding-top: 1px;
  font-family: 'Inter', var(--font); font-size: 11.5px; color: var(--pbx-ink3);
  font-variant-numeric: tabular-nums;
}
.pbx-chat-proj {
  display: inline-block; margin-left: 8px; padding: 1px 6px;
  border-radius: 5px; background: var(--pbx-sel);
  font-family: 'Inter', var(--font); font-size: 10.5px; color: var(--pbx-ink3);
  vertical-align: 1px;
}
.pb-empty {
  padding: 44px 14px; font-size: 13px; color: var(--pbx-ink3);
  text-align: center; line-height: 1.8;
}

/* 窄屏：左栏收窄，脊线让位 */
@media (max-width: 900px) {
  .pbx-nav { width: 216px; }
  .pbx-spine { display: none; }
  .pbx-detail-head, .pbx-detail-body { padding-left: 18px; padding-right: 18px; }
}

/* projects-btn 激活态 */
#projects-btn.active { background: rgba(0,0,0,0.055); color: var(--text); font-weight: 600; }  /* 2026-07-29 紫色收敛：紧邻项目浏览器的无彩色界面，紫底最刺眼，改中性灰 */
.pv-inner { max-width: 760px; margin: 0 auto; padding: 60px 28px 60px; }
.pv-header { display: flex; align-items: center; gap: 14px; margin-bottom: 26px; }
.pv-bar { flex-shrink: 0; width: 4px; height: 27px; border-radius: 3px; background: var(--text-3); opacity: 0.5; }
.pv-bar[data-group-color="slate"] { background: #8A8F98; opacity: 0.9; }
.pv-bar[data-group-color="sage"]  { background: #7A9A7E; opacity: 0.9; }
.pv-bar[data-group-color="umber"] { background: #B08858; opacity: 0.9; }
.pv-bar[data-group-color="mist"]  { background: #7C93B0; opacity: 0.9; }
.pv-bar[data-group-color="clay"]  { background: #BC7A66; opacity: 0.9; }
.pv-bar[data-group-color="gold"]  { background: #BFA059; opacity: 0.9; }
.pv-title {
  font-size: 27px; font-weight: 650; color: var(--text);
  flex: 1; min-width: 0; word-break: break-word; line-height: 1.2;
}
.pv-menu-btn {
  flex-shrink: 0; background: none; border: none; color: var(--text-3);
  cursor: pointer; padding: 4px 9px; border-radius: 8px;
  font-size: 18px; line-height: 1; letter-spacing: 1.5px;
  transition: background 0.15s, color 0.15s;
}
.pv-menu-btn:hover { background: rgba(0,0,0,0.05); color: var(--text-2); }
.pv-new-chat {
  display: flex; align-items: center; gap: 10px;
  width: 100%; padding: 15px 18px; margin-bottom: 30px;
  border: 1px solid var(--border); border-radius: 14px;
  background: #fff; color: var(--text-2);
  font-size: 14.5px; font-family: var(--font); cursor: pointer; text-align: left;
  box-shadow: 0 1px 3px rgba(0,0,0,0.04);
  transition: border-color 0.15s, box-shadow 0.15s, background 0.15s;
}
.pv-new-chat:hover { border-color: var(--accent); background: rgba(139,92,246,0.03); box-shadow: 0 2px 10px rgba(139,92,246,0.10); }
.pv-new-chat svg { color: var(--accent); flex-shrink: 0; }
.pv-section-label {
  font-size: 12px; font-weight: 600; color: var(--text-3);
  letter-spacing: 0.4px; margin-bottom: 8px; padding-left: 2px;
}
.pv-chats { display: flex; flex-direction: column; gap: 2px; }
.pv-chat {
  display: flex; align-items: baseline; gap: 14px;
  padding: 13px 14px; border-radius: 11px; cursor: pointer;
  transition: background 0.13s;
}
.pv-chat:hover { background: rgba(0,0,0,0.04); }
.pv-chat-title {
  flex: 1; min-width: 0; font-size: 14px; color: var(--text);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pv-chat-date { flex-shrink: 0; font-size: 12px; color: var(--text-3); }
.pv-empty { padding: 28px 14px; font-size: 13.5px; color: var(--text-3); text-align: center; }

/* 侧栏 #conv-list：滚动已统一交给 .sidebar-scroll（2026-08-07），此处不再独立滚动 */
#conv-list {
  min-height: 0;
}

.conv-item { flex-wrap: wrap; }
.conv-snippet {
  flex-basis: 100%;
  font-size: 11px;
  color: var(--text-3);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  pointer-events: none;
  margin-top: 2px;
  padding-right: 6px;
}
.conv-snippet mark {
  background: rgba(232,180,90,0.35);
  color: inherit;
  border-radius: 2px;
  padding: 0 1px;
}
.conv-search-empty {
  padding: 14px 12px;
  font-size: 12px;
  color: var(--text-3);
  text-align: center;
}

.conv-item {
  display: flex;
  align-items: center;
  padding: 10px 10px;
  border-radius: 8px;
  cursor: pointer;
  position: relative;
  transition: background 0.15s;
  user-select: none;
}
.conv-item:hover { background: rgba(0,0,0,0.05); }
.conv-item.active { background: rgba(0,0,0,0.07); }

.conv-title {
  flex: 1;
  min-width: 0;
  font-size: 13px;
  color: var(--text-2);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: clip;
  pointer-events: none;
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: nowrap;
  -webkit-mask-image: linear-gradient(to right, black calc(100% - 26px), transparent 100%);
  mask-image: linear-gradient(to right, black calc(100% - 26px), transparent 100%);
}
.conv-item:hover .conv-title,
.conv-item:has(.conv-menu-btn.open) .conv-title {
  -webkit-mask-image: linear-gradient(to right, black calc(100% - 52px), transparent calc(100% - 20px));
  mask-image: linear-gradient(to right, black calc(100% - 52px), transparent calc(100% - 20px));
}
.conv-item.active .conv-title { color: var(--text); font-weight: 500; }
/* 未命名对话（等 GLM 自动标题）：灰色弱化，active 时也不提色提粗 */
.conv-title.conv-title-pending { color: var(--text-3); }
.conv-item.active .conv-title.conv-title-pending { color: var(--text-3); font-weight: 400; }
.conv-project-tag {
  display: inline-block;
  flex-shrink: 0;
  font-size: 10px;
  color: var(--text-3);
  background: rgba(0,0,0,0.045);
  padding: 1.5px 7px;
  border-radius: 999px;
  font-weight: 500;
  letter-spacing: 0.01em;
  max-width: 80px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
body.private-active .conv-project-tag { background: rgba(255,255,255,0.08); }

/* 侧栏「项目对话」组底部的全部入口 */
.proj-chats-more {
  display: block;
  width: 100%;
  border: none;
  background: none;
  cursor: pointer;
  text-align: left;
  padding: 7px 10px;
  font-size: 12px;
  color: var(--text-3);
  border-radius: 8px;
}
.proj-chats-more:hover { background: rgba(0,0,0,0.05); color: var(--text-2); }

/* ─── 「未发送」占位条 ─────────────────────────────────────────────
   点了「新建对话」但还没发第一条消息时，对话尚未落库（见 createConversation
   的 pending_ 占位）。此前侧栏此刻一片空白，用户会以为对话没建上。
   形制与真实条目完全一致（2026-07-30 去掉虚线框，原样式与其他条目风格断裂），
   只靠灰标题 + 「未发送」标注区分；发出第一条消息后原地换成实线条目，零跳动。 */
.conv-item.conv-ghost {
  background: none;
}
.conv-item.conv-ghost:hover  { background: rgba(0,0,0,0.03); }
.conv-item.conv-ghost.active { background: rgba(0,0,0,0.045); }
.conv-item.conv-ghost .conv-title { color: var(--text-3); }
.conv-ghost-note {
  flex-shrink: 0; font-size: 10.5px; color: var(--text-3);
  opacity: 0.75; letter-spacing: 0.2px;
}

/* ─── 「正在回复」呼吸点 ───────────────────────────────────────────
   切到别的对话后，原对话是否还在跑，此前完全看不出来。
   复用项目浏览器已确立的「在动」色 #2F6F6A，不引入新的装饰色。 */
.conv-live-dot {
  flex-shrink: 0;
  width: 6px; height: 6px; border-radius: 50%;
  background: #2F6F6A;
  margin-right: 16px;          /* 让位给绝对定位在 right:6px 的 ··· 按钮 */
  animation: convLivePulse 1.5s ease-in-out infinite;
}
@keyframes convLivePulse { 0%, 100% { opacity: 0.28; } 50% { opacity: 1; } }
body.private-active .conv-live-dot { background: #7FB5AE; }

/* 落库瞬间的定位提示：让人看清「它出现在这里了」 */
@keyframes convJustSaved {
  0%   { background: rgba(47,111,106,0.18); }
  100% { background: transparent; }
}
.conv-item.just-saved { animation: convJustSaved 1.6s ease-out; }

@media (prefers-reduced-motion: reduce) {
  .conv-live-dot { animation: none; opacity: 0.9; }
  .conv-item.just-saved { animation: none; }
}


.conv-menu-btn {
  position: absolute;
  right: 6px; top: 50%;
  transform: translateY(-50%);
  background: none; border: none;
  color: var(--text-3);
  cursor: pointer; padding: 3px 6px;
  border-radius: 5px;
  opacity: 0.4;
  transition: opacity 0.15s, background 0.15s;
  font-size: 15px; line-height: 1; letter-spacing: 1.5px;
}
.conv-item:hover .conv-menu-btn,
.conv-item .conv-menu-btn.open { opacity: 1; }
.conv-menu-btn:hover { background: rgba(0,0,0,0.07); }

