/* ===================================================================
   Haresora 现代设计层  (modern.css)
   -------------------------------------------------------------------
   叠在 styles.css 之上，负责全部视觉身份：圆角、层次、动效、排版。
   只使用 --hrs-* 设计 token（在 styles.css 的 :root / html.dark-mode
   中定义），因此明暗两套主题无需在这里写第二遍。
   加载顺序：styles.css -> modern.css（见 templates/includes/layout.html）

   约定：
   · 动效一律用贝塞尔曲线，不用 linear / ease
   · 圆角一律走 --r-* 变量，不写字面量
   · 层级靠「底色差 + 边框 + 阴影」三者配合，不靠描边
   =================================================================== */

/* ============ 1. 滚动条 ============ */
* {
  scrollbar-width: thin;
  scrollbar-color: var(--hrs-scrollbar) transparent;
}
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: var(--hrs-scrollbar);
  border-radius: var(--r-pill);
  border: 3px solid transparent;
  background-clip: content-box;
  transition: background-color var(--t) var(--ease);
}
::-webkit-scrollbar-thumb:hover { background-clip: content-box; background-color: var(--hrs-scrollbar-hover); }

/* ============ 2. 焦点可见性（键盘可达性） ============ */
:focus-visible {
  outline: 2px solid var(--hrs-accent);
  outline-offset: 2px;
  border-radius: var(--r-sm);
}
.button:focus-visible, .btn:focus-visible { outline-offset: 1px; }

/* 仅供读屏的标题：模板里有若干 <h1 class="voice">，而 .voice 的隐藏规则
   并不在编译后的样式里，所以必须由设计层补上 —— 少了它，页面结构标题会
   变成一个巨大的可见标题，还会作为 flex 项把登录卡片挤离视觉中心。 */
.voice {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  padding: 0 !important;
  margin: -1px !important;
  overflow: hidden !important;
  clip-path: inset(50%) !important;
  white-space: nowrap !important;
  border: 0 !important;
}
/* 浮层消息容器不参与布局 */
#messagestack:empty { display: none !important; }

/* ============ 3. 应用外壳 ============ */
html, body, #layout {
  background: var(--hrs-bg) !important;
  color: var(--hrs-text);
  font-family: var(--hrs-sans) !important;
  font-size: 14px;
  line-height: 1.55;
  letter-spacing: 0;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

#layout {
  background: var(--hrs-bg) !important;
  gap: var(--s-3);
  padding: var(--s-3);
  box-sizing: border-box;
}

/* ---- 三块面板统一成「悬浮卡片」 ---- */
#layout-sidebar,
#layout-list,
#layout-content {
  background: var(--hrs-surface) !important;
  border: 1px solid var(--hrs-border) !important;
  border-radius: var(--r-lg) !important;
  box-shadow: var(--hrs-shadow-sm);
  overflow: hidden;
  transition: box-shadow var(--t) var(--ease), border-color var(--t) var(--ease);
  margin: 0;
}
#layout-sidebar:hover,
#layout-list:hover,
#layout-content:hover { box-shadow: var(--hrs-shadow-md); }

/* 面板标题栏：更高、留白更足、底边更含蓄 */
.listbox > .header,
#layout-content > .header {
  background: transparent !important;
  border-bottom: 1px solid var(--hrs-border);
  padding: var(--s-3) var(--s-4);
  min-height: 52px;
  box-sizing: border-box;
  display: flex;
  align-items: center;
  gap: var(--s-2);
}
.header-title {
  font-size: 13px;
  font-weight: 600;
  letter-spacing: .01em;
  color: var(--hrs-text) !important;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.header .header-title.username {
  font-size: 14px;
  font-weight: 600;
  color: var(--hrs-text) !important;
  display: block;
  max-width: 100%;
  line-height: 1.3;
}

/* 面板底部（配额） */
.listbox > .footer {
  background: transparent !important;
  border-top: 1px solid var(--hrs-border) !important;
  padding: var(--s-3) var(--s-4);
  font-size: 12px;
  color: var(--hrs-text-2) !important;
}
.quota-widget { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); }
.quota-widget .count { font-variant-numeric: tabular-nums; font-weight: 600; color: var(--hrs-text); }

/* ============ 4. 左侧导航（原 elastic 的任务栏图标条） ============ */
/* 改成一条有品牌、有文字的现代导航栏 —— 这是和原版观感差别最大的地方。
   要点：<roundcube:button> 渲染出来是 <a class="compose/mail/contacts/...">，
   并不带 .button 类，所以必须按结构选（#taskmenu 下的直接子 a）。写成
   a.button 的话整套导航样式一条都不会生效。 */
#layout-menu {
  background: var(--hrs-rail) !important;
  border: 1px solid var(--hrs-border);
  border-radius: var(--r-lg);
  box-shadow: var(--hrs-shadow-sm);
  width: var(--rail-w);
  flex: 0 0 var(--rail-w);
  padding: var(--s-3) var(--s-2);
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  min-height: 0;
}

/* 品牌区：elastic 的 .popover-header 原本只是个弹层标题（logo + 关闭按钮），
   这里改造成导航栏顶部的品牌行。
   ⚠ 背景必须显式清成透明：elastic 给这一层铺的是「深色面」底色，换色时被
   映射成 Latte 的文字色，于是浅色模式下变成深底压深字，整块读不出来。 */
#layout-menu .popover-header {
  display: flex !important;
  align-items: center;
  gap: var(--s-3);
  padding: var(--s-2) var(--s-3) var(--s-4) !important;
  margin: 0 0 var(--s-3);
  border-bottom: 1px solid var(--hrs-border);
  background: transparent !important;
  border-radius: 0 !important;
  position: static !important;
  width: 100% !important;
  height: auto !important;
}
#layout-menu .popover-header #logo,
#layout-menu .popover-header .hrs-brand-mark {
  width: 34px !important;
  height: 34px !important;
  flex: 0 0 34px;
  margin: 0 !important;
  border-radius: var(--r-sm);
  box-shadow: 0 2px 8px var(--hrs-accent-glow);
  animation: none;
}
#layout-menu .popover-header .hrs-rail-name {
  font-size: 15px;
  font-weight: 700;
  letter-spacing: -.015em;
  color: var(--hrs-text) !important;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* 这个关闭按钮是给移动端抽屉用的，常驻桌面导航栏里没有意义 */
#layout-menu .popover-header a.cancel { display: none !important; }

#taskmenu {
  display: flex !important;
  flex-direction: column;
  gap: 2px;
  flex: 1 1 auto;
  min-height: 0;
  background: transparent !important;
  border: 0 !important;
  padding: 0 !important;
  position: static !important;
  overflow: hidden;
}
#taskmenu .action-buttons {
  display: block !important;
  width: 100% !important;
  max-width: none !important;
  margin-bottom: var(--s-3);
}
/* elastic 把这一组做成绝对定位（给折叠抽屉用），会溢出导航栏底部被裁掉，
   这里改回正常流并靠 margin-top:auto 贴底。 */
#taskmenu .special-buttons {
  position: static !important;
  display: flex !important;
  flex-direction: column;
  gap: 2px;
  width: 100% !important;
  margin-top: auto;
  padding-top: var(--s-3);
  border-top: 1px solid var(--hrs-border);
  background: transparent !important;   /* elastic 在这层铺了深色底（见品牌区注释） */
  border-radius: 0 !important;
  height: auto !important;
  inset: auto !important;
}

/* 导航项：图标 + 文字，圆角胶囊 */
#taskmenu > a,
#taskmenu .action-buttons > a,
#taskmenu .special-buttons > a {
  display: flex !important;
  align-items: center;
  gap: var(--s-3);
  width: 100% !important;
  /* elastic 在桌面档给 #taskmenu a 写死了 width: 78px，还带一个 max-width
     （算出来 84px）。width 我们的 !important 能压过，max-width 不能 —— 少了
     这一行，导航项永远是 84px 宽，文字被挤成一团。 */
  max-width: none !important;
  min-width: 0 !important;
  float: none !important;
  box-sizing: border-box;
  padding: 9px var(--s-3) !important;
  height: auto !important;
  min-height: 0 !important;
  border-radius: var(--r-md);
  color: var(--hrs-text-2) !important;
  background: transparent !important;
  border: 0 !important;
  font-size: 13.5px;
  font-weight: 500;
  line-height: 1.25;
  white-space: nowrap;
  text-decoration: none;
  position: relative;
  transition: background-color var(--t-fast) var(--ease),
              color var(--t-fast) var(--ease),
              transform var(--t-fast) var(--ease);
}
/* elastic 给折叠态做的文字旋转/缩进在这里必须全部中和 */
#taskmenu > a .inner,
#taskmenu .action-buttons > a .inner,
#taskmenu .special-buttons > a .inner {
  display: flex !important;
  align-items: center;
  gap: var(--s-3);
  width: auto !important;
  padding: 0 !important;
  margin: 0 !important;
  background: none !important;
  text-indent: 0 !important;
  overflow: visible !important;
  transform: none !important;
  writing-mode: horizontal-tb !important;
  font-size: inherit !important;
  line-height: inherit !important;
  white-space: nowrap;
  text-align: left;
}
/* 图标槽：固定宽，保证所有导航项文字左对齐在同一条线上 */
#taskmenu > a:before,
#taskmenu .action-buttons > a:before,
#taskmenu .special-buttons > a:before {
  font-family: 'Icons' !important;
  font-size: 15px;
  width: 20px;
  min-width: 20px;
  text-align: center;
  display: inline-block;
  color: inherit;
  opacity: .9;
  transition: transform var(--t) var(--ease-spring);
}
#taskmenu > a:hover,
#taskmenu .action-buttons > a:hover,
#taskmenu .special-buttons > a:hover {
  background: var(--hrs-hover) !important;
  color: var(--hrs-text) !important;
}
#taskmenu a:hover:before { transform: scale(1.14); }
#taskmenu a:active { transform: scale(.985); }

/* 选中态：强调色胶囊 + 左侧色条 */
#taskmenu a.selected {
  background: var(--hrs-accent-tint) !important;
  color: var(--hrs-accent) !important;
  font-weight: 600;
}
#taskmenu a.selected:before { color: var(--hrs-accent); opacity: 1; }
#taskmenu a.selected:after {
  content: "";
  position: absolute;
  left: 0; top: 50%;
  width: 3px; height: 18px;
  margin-top: -9px;
  border-radius: var(--r-pill);
  background: var(--hrs-accent);
  animation: hrs-grow-y var(--t) var(--ease);
}
@keyframes hrs-grow-y { from { height: 0; opacity: 0; } to { height: 18px; opacity: 1; } }

/* 「撰写」是主行动，做成实心强调色按钮 */
#taskmenu a.compose {
  background: var(--hrs-accent) !important;
  color: var(--hrs-accent-ink) !important;
  font-weight: 600;
  justify-content: flex-start;
  box-shadow: 0 2px 10px var(--hrs-accent-glow);
}
#taskmenu a.compose:before { color: var(--hrs-accent-ink) !important; opacity: 1; }
#taskmenu a.compose:hover {
  filter: brightness(1.07);
  box-shadow: 0 4px 16px var(--hrs-accent-glow);
  color: var(--hrs-accent-ink) !important;
  background: var(--hrs-accent) !important;
}
#taskmenu a.compose.selected { background: var(--hrs-accent) !important; }
#taskmenu a.compose.selected:after { display: none; }

/* ============ 5. 文件夹树 ============ */
#folderlist-content { padding: var(--s-2); }
#mailboxlist.listing {
  background: transparent !important;
  border: 0 !important;
  width: 100%;
  border-collapse: separate;
  border-spacing: 0 1px;
}
#mailboxlist li,
#mailboxlist tr { transition: background-color var(--t-fast) var(--ease); }
#mailboxlist li a,
#mailboxlist a {
  display: flex !important;
  align-items: center;
  gap: var(--s-2);
  padding: 8px 10px;
  border-radius: var(--r-sm);
  color: var(--hrs-text-2) !important;
  font-size: 13.5px;
  text-decoration: none;
  transition: background-color var(--t-fast) var(--ease),
              color var(--t-fast) var(--ease),
              transform var(--t-fast) var(--ease);
}
#mailboxlist a:hover { background: var(--hrs-hover) !important; color: var(--hrs-text) !important; }
#mailboxlist a:active { transform: scale(.99); }
#mailboxlist .selected > a,
#mailboxlist li.selected > a,
#mailboxlist a.selected {
  background: var(--hrs-accent-tint) !important;
  color: var(--hrs-accent) !important;
  font-weight: 600;
}
/* 未读计数做成小胶囊 */
#mailboxlist .unreadcount,
#mailboxlist .count,
#mailboxlist a .unreadcount {
  margin-left: auto;
  background: var(--hrs-accent);
  color: var(--hrs-accent-ink);
  font-size: 11px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  line-height: 1;
  padding: 4px 7px;
  border-radius: var(--r-pill);
  min-width: 18px;
  text-align: center;
  box-sizing: border-box;
}
#mailboxlist .totalcount { color: var(--hrs-text-3) !important; font-size: 11px; }
#mailboxlist .folder-icon:before, #mailboxlist .icon:before { font-family: 'Icons' !important; }

/* ============ 6. 邮件列表 ============ */
#messagelist-content { padding: 0 var(--s-2) var(--s-2); }
#messagelist.listing {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0 2px;
  background: transparent !important;
  border: 0 !important;
  table-layout: fixed;
}

/* 表头：吸顶 + 毛玻璃 */
#messagelist thead th,
#messagelist .sortheader thead th {
  position: sticky;
  top: 0;
  z-index: 3;
  background: var(--hrs-surface-blur) !important;
  backdrop-filter: blur(12px) saturate(1.4);
  -webkit-backdrop-filter: blur(12px) saturate(1.4);
  border-bottom: 1px solid var(--hrs-border) !important;
  color: var(--hrs-text-3) !important;
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .06em;
  padding: var(--s-2) var(--s-3);
  text-align: left;
}
#messagelist thead th a { color: inherit !important; }

/* 行：圆角、悬停浮起 */
#messagelist tbody tr {
  cursor: pointer;
  transition: background-color var(--t-fast) var(--ease),
              box-shadow var(--t) var(--ease),
              transform var(--t-fast) var(--ease);
}
#messagelist tbody tr > td {
  background: transparent;
  border: 0 !important;
  padding: 10px var(--s-3);
  vertical-align: middle;
  transition: background-color var(--t-fast) var(--ease);
}
#messagelist tbody tr:hover > td { background: var(--hrs-hover); }
#messagelist tbody tr:hover { transform: translateX(2px); }
#messagelist tbody tr:hover > td:first-child { border-radius: var(--r-md) 0 0 var(--r-md); }
#messagelist tbody tr:hover > td:last-child { border-radius: 0 var(--r-md) var(--r-md) 0; }

/* 选中行 */
#messagelist tbody tr.selected > td,
#messagelist tbody tr.focused > td { background: var(--hrs-accent-tint) !important; }
#messagelist tbody tr.selected > td:first-child { border-radius: var(--r-md) 0 0 var(--r-md); }
#messagelist tbody tr.selected > td:last-child { border-radius: 0 var(--r-md) var(--r-md) 0; }
#messagelist tbody tr.selected td.subject a { color: var(--hrs-accent) !important; }

/* 未读：加粗 + 主色圆点 */
#messagelist tbody tr.unread td.fromto,
#messagelist tbody tr.unread td.subject a {
  font-weight: 600;
  color: var(--hrs-text) !important;
}
#messagelist tbody tr.unread td.fromto:before {
  content: "";
  display: inline-block;
  width: 6px; height: 6px;
  margin-right: 8px;
  border-radius: var(--r-pill);
  background: var(--hrs-accent);
  box-shadow: 0 0 0 3px var(--hrs-accent-tint);
  vertical-align: middle;
  animation: hrs-pop var(--t) var(--ease-spring);
}
@keyframes hrs-pop { from { transform: scale(0); } to { transform: scale(1); } }
#messagelist tbody tr:not(.unread) td.fromto { color: var(--hrs-text-2) !important; }

#messagelist td.fromto { font-size: 13.5px; }
#messagelist td.subject { font-size: 13.5px; }
#messagelist td.subject a { color: var(--hrs-text); text-decoration: none; }
#messagelist td.date {
  font-size: 12px;
  color: var(--hrs-text-3) !important;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  text-align: right;
}
#messagelist td.size { font-size: 11.5px; color: var(--hrs-text-3) !important; white-space: nowrap; }
#messagelist td.attachment span.attachment:before { font-family: 'Icons' !important; color: var(--hrs-text-3); }
#messagelist td.flags span { opacity: .85; }
#messagelist .msgicon, #messagelist .icon { font-family: 'Icons' !important; }
#messagelist tr.deleted > td { opacity: .45; text-decoration: line-through; }

/* 列表里的部件（未读圆点/头像由 JS 注入） */
.hrs-avatar {
  width: 32px; height: 32px;
  flex: 0 0 32px;
  border-radius: var(--r-pill);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 12.5px;
  font-weight: 700;
  color: #fff;
  letter-spacing: .02em;
  user-select: none;
  background: var(--hrs-accent);
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .18);
}
.hrs-fromto { display: inline-flex; align-items: center; gap: 9px; min-width: 0; }
.hrs-fromto .hrs-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ============ 7. 工具栏与按钮 ============ */
/* ⚠ 必须 :not(.popupmenu)。elastic 在手机端把邮件列表工具栏做成
   <ul class="menu toolbar popupmenu">，靠 .popupmenu{display:none} 隐藏，
   点菜单时才搬进 .popover 里显示。本表加载在 elastic 之后，同为单类选择器
   时会直接赢过那条 display:none，把一个本该隐藏的弹层强行显示成横向溢出的一排。 */
.toolbar:not(.popupmenu) {
  background: transparent !important;
  border: 0 !important;
  padding: var(--s-2) var(--s-3) !important;
  display: flex;
  align-items: center;
  gap: var(--s-1);
  flex-wrap: wrap;
}
.toolbar .spacer { flex: 1 1 auto; }

.button, .btn,
/* 工具栏里的按钮由 <roundcube:button> 渲染成 <a class="reply all disabled">，
   不带 .button 类，所以按结构补选，否则整条工具栏都是浏览器默认样式 */
.toolbar > a, .toolbar > button, .toolbar .dropbutton > a, .toolbar > span > a,
.header > a, .header > button, .header .dropbutton > a, .header > span > a,
.header > ul.toolbar > li > a,
.listbox > .header > ul.toolbar > li > a,
#layout-content > .header > ul.toolbar > li > a {
  border-radius: var(--r-sm) !important;
  border: 1px solid transparent !important;
  background: transparent !important;
  color: var(--hrs-text-2) !important;
  font-size: 13px;
  font-weight: 500;
  padding: 7px 11px;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  text-decoration: none;
  cursor: pointer;
  transition: background-color var(--t-fast) var(--ease),
              color var(--t-fast) var(--ease),
              border-color var(--t-fast) var(--ease),
              box-shadow var(--t) var(--ease),
              transform var(--t-fast) var(--ease);
}
.button .inner, .btn .inner, .toolbar > a .inner, .toolbar .dropbutton > a .inner,
.header > a .inner, .header .dropbutton > a .inner,
.header > ul.toolbar > li > a .inner {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 0 !important;
  background: none !important;
  text-indent: 0 !important;
  overflow: visible !important;
}
.button:before, .btn:before, .toolbar > a:before, .toolbar .dropbutton > a:before,
.header > a:before, .header .dropbutton > a:before,
.header > ul.toolbar > li > a:before {
  font-family: 'Icons' !important;
  font-size: 14px;
  line-height: 1;
  opacity: .85;
  transition: transform var(--t) var(--ease-spring);
}
.button:hover, .btn:hover, .toolbar > a:hover, .toolbar .dropbutton > a:hover,
.header > a:hover, .header .dropbutton > a:hover,
.header > ul.toolbar > li > a:hover {
  background: var(--hrs-hover) !important;
  color: var(--hrs-text) !important;
}
.button:hover:before, .toolbar > a:hover:before, .header > a:hover:before,
.header > ul.toolbar > li > a:hover:before { transform: scale(1.1); }
.button:active, .btn:active, .toolbar > a:active, .header > a:active,
.header > ul.toolbar > li > a:active { transform: scale(.96); }
.button.disabled, .btn.disabled, .button[disabled],
.toolbar > a.disabled, .toolbar .dropbutton > a.disabled,
.header > a.disabled, .header .dropbutton > a.disabled,
.header > ul.toolbar > li > a.disabled {
  opacity: .38 !important;
  pointer-events: none;
  filter: grayscale(.4);
}
/* 主按钮 */
.button.submit, .btn-primary, input[type="submit"].button, button.submit, .mainaction {
  background: var(--hrs-accent) !important;
  color: var(--hrs-accent-ink) !important;
  border-color: transparent !important;
  font-weight: 600;
  box-shadow: 0 2px 10px var(--hrs-accent-glow);
}
.button.submit:before, .btn-primary:before { color: var(--hrs-accent-ink) !important; opacity: 1; }
.button.submit:hover, .btn-primary:hover {
  filter: brightness(1.07);
  color: var(--hrs-accent-ink) !important;
  box-shadow: 0 4px 18px var(--hrs-accent-glow);
}
/* 危险操作 */
.button.delete:hover { background: var(--hrs-red-tint) !important; color: var(--hrs-red) !important; }
.button.delete:before { color: var(--hrs-red); }
/* 分段控件：一串按钮贴在一起 */
.toolbar .button + .button { margin-left: 0; }
.dropbutton { display: inline-flex; align-items: center; }
.dropbutton .button { border-radius: var(--r-sm) !important; }

/* 搜索框 */
.searchbar, .searchbar form { display: flex; align-items: center; gap: var(--s-2); }
.searchbar input[type="search"], .searchbar input[type="text"], #mailsearchform input {
  background: var(--hrs-field) !important;
  border: 1px solid var(--hrs-border) !important;
  border-radius: var(--r-pill) !important;
  padding: 7px 14px !important;
  color: var(--hrs-text) !important;
  font-size: 13px;
  transition: border-color var(--t) var(--ease), box-shadow var(--t) var(--ease),
              background-color var(--t) var(--ease);
}
.searchbar input:focus {
  border-color: var(--hrs-accent) !important;
  box-shadow: 0 0 0 3px var(--hrs-accent-tint) !important;
  outline: none !important;
}

/* ============ 8. 阅读区 ============ */
#messagecontent, .message-content, .scroller, .iframe-wrapper { background: transparent !important; }
#layout-sidebar .scroller, #layout-list .scroller { background: var(--hrs-surface) !important; }
.message-part, .message-htmlpart, .message-htmlbody { background: transparent !important; }
.message-header {
  padding: var(--s-4) var(--s-5) var(--s-3) !important;
  border-bottom: 1px solid var(--hrs-border) !important;
  background: transparent !important;
}
.message-header .subject, .message-header h2 {
  font-size: 19px !important;
  font-weight: 650 !important;
  line-height: 1.35 !important;
  letter-spacing: -.01em;
  color: var(--hrs-text) !important;
  margin: 0 0 var(--s-3) !important;
}
.message-header .header-links { color: var(--hrs-text-3); font-size: 12.5px; }
.message-header .header-links a { color: var(--hrs-text-2) !important; }
.message-header table.headers-table { font-size: 12.5px; color: var(--hrs-text-2); }
.message-header table.headers-table th, .message-header .header-title {
  color: var(--hrs-text-3) !important;
  font-weight: 500 !important;
  text-align: left;
  padding-right: var(--s-3);
  white-space: nowrap;
  vertical-align: top;
}
.message-header .adr a, .message-header .adr { color: var(--hrs-text) !important; }
.message-header .fromto { font-weight: 600; color: var(--hrs-text); }

/* 正文排版：行高与字号按阅读优化 */
.message-htmlbody, .message-part.htmlpart, #messagebody {
  font-size: 15px;
  line-height: 1.7;
  color: var(--hrs-text);
}
.message-htmlbody p { margin: 0 0 1em; }
.message-htmlbody a { color: var(--hrs-accent); text-decoration: none; border-bottom: 1px solid var(--hrs-accent-tint); }
.message-htmlbody a:hover { border-bottom-color: var(--hrs-accent); }
.message-htmlbody img { max-width: 100%; height: auto; border-radius: var(--r-sm); }
.message-htmlbody blockquote {
  margin: 1em 0;
  padding: var(--s-3) var(--s-4);
  border-left: 3px solid var(--hrs-border-strong);
  border-radius: 0 var(--r-sm) var(--r-sm) 0;
  background: var(--hrs-field);
  color: var(--hrs-text-2);
}
.message-htmlbody pre, .message-htmlbody code {
  font-family: var(--hrs-mono) !important;
  background: var(--hrs-field);
  border-radius: var(--r-xs);
  padding: 2px 6px;
  font-size: .88em;
}
.message-htmlbody pre { padding: var(--s-3); overflow: auto; }
.message-htmlbody table { border-collapse: collapse; max-width: 100%; }
.message-htmlbody td, .message-htmlbody th {
  border: 1px solid var(--hrs-border) !important;
  padding: 6px 10px;
}

/* 附件条：卡片式 */
.attachmentslist, #attachment-list {
  display: flex !important;
  flex-wrap: wrap;
  gap: var(--s-2);
  padding: var(--s-3) var(--s-5) !important;
  border-top: 1px solid var(--hrs-border) !important;
  background: transparent !important;
}
.attachmentslist li, #attachment-list li {
  list-style: none;
  margin: 0 !important;
}
.attachmentslist li a, #attachment-list li a {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  padding: 7px 12px;
  border-radius: var(--r-pill);
  background: var(--hrs-field) !important;
  border: 1px solid var(--hrs-border) !important;
  color: var(--hrs-text-2) !important;
  font-size: 12.5px;
  text-decoration: none;
  transition: transform var(--t) var(--ease), box-shadow var(--t) var(--ease),
              border-color var(--t) var(--ease), color var(--t) var(--ease);
}
.attachmentslist li a:hover, #attachment-list li a:hover {
  transform: translateY(-2px);
  box-shadow: var(--hrs-shadow-sm);
  border-color: var(--hrs-accent) !important;
  color: var(--hrs-accent) !important;
}
.attachmentslist .attachment-name, .attachmentslist .attachment-size { white-space: nowrap; }
.attachmentslist .attachment-size { color: var(--hrs-text-3); }

/* ============ 9. 表单、输入、对话框 ============ */
.form-control, input[type="text"], input[type="password"], input[type="email"],
input[type="search"], input[type="number"], select, textarea {
  background: var(--hrs-field) !important;
  border: 1px solid var(--hrs-border) !important;
  border-radius: var(--r-sm) !important;
  color: var(--hrs-text) !important;
  padding: 9px 12px !important;
  font-size: 13.5px !important;
  font-family: var(--hrs-sans) !important;
  line-height: 1.4 !important;
  transition: border-color var(--t) var(--ease), box-shadow var(--t) var(--ease),
              background-color var(--t) var(--ease);
  box-shadow: none !important;
}
.form-control:focus, input:focus, select:focus, textarea:focus {
  border-color: var(--hrs-accent) !important;
  box-shadow: 0 0 0 3px var(--hrs-accent-tint) !important;
  outline: none !important;
  background: var(--hrs-surface) !important;
}
.form-control::placeholder, input::placeholder, textarea::placeholder { color: var(--hrs-text-3) !important; }
label, .col-form-label, .form-label { font-size: 13px; color: var(--hrs-text-2); font-weight: 500; }
.proplist td.title { color: var(--hrs-text-2); font-size: 13px; }
input[type="checkbox"], input[type="radio"] { accent-color: var(--hrs-accent); width: 15px; height: 15px; }

/* ⚠ 同样排除 .popupmenu：它是尚未打开的弹层（display:none），
   给它铺底 + 圆角 + 阴影会让它在被显示时变成一张浮在页面上的白卡片。
   真正打开时 elastic 会把菜单整体搬进 .popover，由下面这条覆盖到。 */
.ui-dialog, .popover, .menu:not(.popupmenu), .dropdown-menu, .ui-datepicker, .box {
  background: var(--hrs-surface) !important;
  border: 1px solid var(--hrs-border) !important;
  border-radius: var(--r-md) !important;
  box-shadow: var(--hrs-shadow-lg) !important;
  color: var(--hrs-text) !important;
  overflow: hidden;
}
.ui-dialog { animation: hrs-dialog-in var(--t-slow) var(--ease); }
@keyframes hrs-dialog-in {
  from { opacity: 0; transform: translateY(8px) scale(.985); }
  to { opacity: 1; transform: none; }
}
.popover, .dropdown-menu, .popupmenu { animation: hrs-menu-in 160ms var(--ease); transform-origin: top left; }
@keyframes hrs-menu-in {
  from { opacity: 0; transform: translateY(-4px) scale(.98); }
  to { opacity: 1; transform: none; }
}
.ui-dialog .ui-dialog-titlebar, .ui-dialog-titlebar {
  background: transparent !important;
  border: 0 !important;
  border-bottom: 1px solid var(--hrs-border) !important;
  padding: var(--s-3) var(--s-4) !important;
  font-weight: 600;
  font-size: 14px;
  color: var(--hrs-text) !important;
  border-radius: 0 !important;
}
.menu ul li a, .popupmenu ul li a, .dropdown-menu li a {
  padding: 8px 14px !important;
  color: var(--hrs-text-2) !important;
  font-size: 13px;
  border-radius: 0;
  transition: background-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.menu ul li a:hover, .popupmenu ul li a:hover, .dropdown-menu li a:hover {
  background: var(--hrs-hover) !important;
  color: var(--hrs-text) !important;
}
.ui-dialog .ui-dialog-buttonpane, .ui-dialog-buttonpane {
  background: var(--hrs-field) !important;
  border-top: 1px solid var(--hrs-border) !important;
  padding: var(--s-3) var(--s-4) !important;
}
.ui-widget-content, .ui-widget-header { background: transparent !important; border-color: var(--hrs-border) !important; }
.ui-state-default, .ui-widget-content .ui-state-default {
  background: var(--hrs-field) !important;
  border: 1px solid var(--hrs-border) !important;
  color: var(--hrs-text) !important;
  border-radius: var(--r-xs) !important;
}
.ui-state-hover { background: var(--hrs-hover) !important; border-color: var(--hrs-accent) !important; }
.ui-state-active, .ui-state-highlight, .ui-widget-content .ui-state-active {
  background: var(--hrs-accent) !important;
  border-color: var(--hrs-accent) !important;
  color: var(--hrs-accent-ink) !important;
}

/* 提示条 */
.alert, .boxinformation, .ui-alert, .messagestack .alert {
  border-radius: var(--r-md) !important;
  border: 1px solid var(--hrs-border) !important;
  background: var(--hrs-field) !important;
  color: var(--hrs-text) !important;
  padding: var(--s-3) var(--s-4) !important;
  font-size: 13px;
  box-shadow: var(--hrs-shadow-sm);
}
.alert-success, .ui-alert-success { background: var(--hrs-green-tint) !important; border-color: transparent !important; color: var(--hrs-green) !important; }
.alert-error, .ui-alert-error, .alert-danger { background: var(--hrs-red-tint) !important; border-color: transparent !important; color: var(--hrs-red) !important; }
.alert-warning, .ui-alert-warning { background: var(--hrs-yellow-tint) !important; border-color: transparent !important; color: var(--hrs-yellow) !important; }

/* 浮层消息堆叠 */
#messagestack { display: flex; flex-direction: column; gap: var(--s-2); }
#messagestack > * { animation: hrs-toast-in var(--t-slow) var(--ease); }
@keyframes hrs-toast-in {
  from { opacity: 0; transform: translateY(10px) scale(.97); }
  to { opacity: 1; transform: none; }
}

/* ============ 10. 分页 ============ */
.pagenav, .pagenav a, #pagenav {
  font-size: 12.5px;
  color: var(--hrs-text-2);
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
}
.pagenav a {
  padding: 4px 9px;
  border-radius: var(--r-xs);
  transition: background-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.pagenav a:hover { background: var(--hrs-hover); color: var(--hrs-text); }

/* ============ 11. 设置页 ============ */
#settings-menu, .settings-menu { background: var(--hrs-rail) !important; }
.proplist tr td, .proplist tr th { padding: 10px 8px; border-color: var(--hrs-border) !important; }
.proplist tr { transition: background-color var(--t-fast) var(--ease); }
.proplist tr:hover td { background: var(--hrs-hover); }
.nav-tabs, .tabsbar {
  border-bottom: 1px solid var(--hrs-border) !important;
  gap: var(--s-1);
  display: flex;
}
.nav-tabs > li > a, .tabsbar a {
  border: 0 !important;
  border-radius: var(--r-sm) var(--r-sm) 0 0 !important;
  color: var(--hrs-text-2) !important;
  font-size: 13px;
  font-weight: 500;
  padding: 8px 14px !important;
  transition: background-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.nav-tabs > li > a:hover { background: var(--hrs-hover) !important; color: var(--hrs-text) !important; }
.nav-tabs > li.active > a, .nav-tabs > li > a.active {
  background: var(--hrs-accent-tint) !important;
  color: var(--hrs-accent) !important;
  font-weight: 600;
}
.sections-table td.section, .sections-table tr td:first-child { font-weight: 500; }
.sections-table tr { transition: background-color var(--t-fast) var(--ease); }
.sections-table tr:hover td { background: var(--hrs-hover) !important; }
table.records-table, table.listing {
  border-collapse: separate;
  border-spacing: 0 2px;
}
table.records-table tbody tr > td, table.listing tbody tr > td {
  background: transparent;
  border: 0 !important;
  padding: 9px var(--s-3) !important;
}
table.records-table tbody tr:hover > td, table.listing tbody tr:hover > td { background: var(--hrs-hover) !important; }
table.records-table thead th, table.listing thead th {
  background: transparent !important;
  border-bottom: 1px solid var(--hrs-border) !important;
  color: var(--hrs-text-3) !important;
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: .06em;
  padding: var(--s-2) var(--s-3) !important;
  text-align: left;
}

/* ============ 12. 写信 ============ */
#compose-content, .compose-headers { background: var(--hrs-surface) !important; }
#composeform, #compose-content { border-radius: 0; }
.compose-headers .row, #compose-headers .row { gap: var(--s-2); }
#compose-subject, input#compose-subject {
  font-size: 16px !important;
  font-weight: 600 !important;
  border: 0 !important;
  border-bottom: 1px solid var(--hrs-border) !important;
  border-radius: 0 !important;
  background: transparent !important;
  padding: 10px 0 !important;
}
#compose-subject:focus { border-bottom-color: var(--hrs-accent) !important; box-shadow: none !important; }
#composebodycontainer, #composebody {
  font-family: var(--hrs-sans) !important;
  font-size: 14.5px !important;
  line-height: 1.7 !important;
  background: var(--hrs-surface) !important;
  color: var(--hrs-text) !important;
}
.mce-tinymce, .mce-panel { border-color: var(--hrs-border) !important; background: var(--hrs-surface) !important; }
.mce-toolbar-grp { background: var(--hrs-field) !important; border-bottom: 1px solid var(--hrs-border) !important; }

/* ============ 13. 登录页 ============ */
body.task-login, body.task-login html {
  background: var(--hrs-login-bg) !important;
}
body.task-login #layout {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--s-5);
  min-height: 100dvh;
  background: transparent !important;
}
body.task-login #layout-content {
  background: var(--hrs-surface) !important;
  border: 1px solid var(--hrs-border);
  border-radius: var(--r-xl);
  box-shadow: var(--hrs-shadow-lg);
  padding: var(--s-8) var(--s-8) var(--s-6) !important;
  width: 100%;
  max-width: 420px;
  box-sizing: border-box;
  animation: hrs-login-in 560ms var(--ease);
  position: relative;
  overflow: hidden;
}
/* 顶部一条渐变光带，作为品牌识别 */
body.task-login #layout-content:before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 3px;
  background: linear-gradient(90deg, var(--hrs-accent), var(--hrs-accent-soft), var(--hrs-accent));
  background-size: 200% 100%;
  animation: hrs-sheen 6s var(--ease-in-out) infinite;
}
@keyframes hrs-sheen { 0%,100% { background-position: 0% 0; } 50% { background-position: 100% 0; } }
@keyframes hrs-login-in {
  from { opacity: 0; transform: translateY(18px) scale(.975); }
  to { opacity: 1; transform: none; }
}
body.task-login #logo, body.task-login .hrs-brand-mark {
  width: 60px !important;
  height: 60px !important;
  margin: 0 !important;              /* 间距交给 .hrs-login-brand 的 gap，避免叠加 */
  display: block !important;
  animation: hrs-mark-in 700ms var(--ease-spring) both;
}
@keyframes hrs-mark-in {
  from { opacity: 0; transform: scale(.8) rotate(-6deg); }
  to { opacity: 1; transform: none; }
}
.hrs-login-brand {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--s-1);
  margin-bottom: var(--s-6);
  text-align: center;
}
.hrs-login-brand strong {
  font-size: 22px;
  font-weight: 700;
  letter-spacing: -.02em;
  color: var(--hrs-text);
}
.hrs-login-brand span { font-size: 13px; color: var(--hrs-text-2); }

body.task-login form#login-form { display: flex; flex-direction: column; gap: var(--s-4); }
body.task-login form#login-form .form-group,
body.task-login form#login-form .input-group { display: flex; flex-direction: column; gap: 6px; margin: 0; }
body.task-login form#login-form label { font-size: 12.5px; font-weight: 600; color: var(--hrs-text-2); }
body.task-login form#login-form input.form-control,
body.task-login form#login-form input {
  width: 100% !important;
  height: auto !important;           /* 压掉 bootstrap 的 calc() 固定高度，否则内边距会把文字挤扁 */
  padding: 13px 15px !important;
  font-size: 14.5px !important;
  line-height: 1.4 !important;
  border-radius: var(--r-md) !important;
  box-sizing: border-box;
}
/* 输入框左侧那枚 bootstrap 的装饰性图标槽：图标字体没落到它身上，只会渲染成
   一个灰色空盒子。登录页靠占位文字已经足够表意，直接去掉更干净。 */
body.task-login form#login-form .input-group-prepend,
body.task-login form#login-form .input-group-text { display: none !important; }
body.task-login form#login-form table,
body.task-login form#login-form tbody,
body.task-login form#login-form tr,
body.task-login form#login-form td { display: block !important; width: 100% !important; }
body.task-login form#login-form input[type="submit"],
body.task-login form#login-form button[type="submit"],
body.task-login form#login-form .button.submit {
  width: 100%;
  justify-content: center;
  padding: 13px 16px !important;
  font-size: 14.5px !important;
  font-weight: 650 !important;
  border-radius: var(--r-md) !important;
  margin-top: var(--s-2);
  transition: transform var(--t) var(--ease-spring), filter var(--t) var(--ease),
              box-shadow var(--t) var(--ease);
}
body.task-login form#login-form input[type="submit"]:hover,
body.task-login form#login-form .button.submit:hover {
  transform: translateY(-1px);
  box-shadow: 0 8px 22px var(--hrs-accent-glow);
}
body.task-login #login-footer {
  margin-top: var(--s-5);
  padding-top: var(--s-4);
  border-top: 1px solid var(--hrs-border);
  font-size: 11.5px;
  color: var(--hrs-text-3);
  text-align: center;
}
body.task-login #login-footer a { color: var(--hrs-text-2); }
body.task-login .noscriptwarning {
  max-width: 420px;
  margin: var(--s-4) auto;
  padding: var(--s-3) var(--s-4);
  border-radius: var(--r-md);
  background: var(--hrs-red-tint);
  color: var(--hrs-red);
  font-size: 13px;
}

/* ============ 14. 进场动画（页面级） ============ */
#layout-sidebar, #layout-list, #layout-content, #layout-menu {
  animation: hrs-panel-in 380ms var(--ease) backwards;
}
#layout-menu { animation-delay: 0ms; }
#layout-sidebar { animation-delay: 40ms; }
#layout-list { animation-delay: 80ms; }
#layout-content { animation-delay: 120ms; }
@keyframes hrs-panel-in {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: none; }
}
/* 列表行逐个淡入 */
#messagelist tbody tr { animation: hrs-row-in 300ms var(--ease) backwards; }
@keyframes hrs-row-in {
  from { opacity: 0; transform: translateX(-6px); }
  to { opacity: 1; transform: none; }
}
#messagelist tbody tr:nth-child(1) { animation-delay: 20ms; }
#messagelist tbody tr:nth-child(2) { animation-delay: 34ms; }
#messagelist tbody tr:nth-child(3) { animation-delay: 48ms; }
#messagelist tbody tr:nth-child(4) { animation-delay: 62ms; }
#messagelist tbody tr:nth-child(5) { animation-delay: 76ms; }
#messagelist tbody tr:nth-child(6) { animation-delay: 90ms; }
#messagelist tbody tr:nth-child(7) { animation-delay: 104ms; }
#messagelist tbody tr:nth-child(8) { animation-delay: 118ms; }

/* ============ 15. 响应式 ============ */
@media screen and (max-width: 1100px) {
  #layout { gap: var(--s-2); padding: var(--s-2); }
}
@media screen and (max-width: 900px) {
  /* 导航栏收成纯图标，给内容让位 */
  #layout-menu { width: 56px; flex-basis: 56px; padding: var(--s-2) 6px; }
  #taskmenu > a,
  #taskmenu .action-buttons > a,
  #taskmenu .special-buttons > a { justify-content: center; padding: 10px 0 !important; font-size: 0; gap: 0; }
  #taskmenu > a:before,
  #taskmenu .action-buttons > a:before,
  #taskmenu .special-buttons > a:before { font-size: 16px; width: auto; min-width: 0; }
  #taskmenu a.selected:after { display: none; }
}
@media screen and (max-width: 640px) {
  #layout { padding: 0; gap: 0; }
  #layout-sidebar, #layout-list, #layout-content, #layout-menu {
    border-radius: 0;
    border-left: 0;
    border-right: 0;
  }
  #layout-menu { width: 100%; flex-basis: auto; flex-direction: row; }
  #taskmenu { flex-direction: row; align-items: center; }
  #taskmenu .action-buttons { margin: 0; }
  #taskmenu .special-buttons { flex-direction: row; margin: 0 0 0 auto; padding: 0; border: 0; }
}

/* ============ 16. 尊重「减少动态效果」 ============ */
@media (prefers-reduced-motion: reduce) {
  *, *:before, *:after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}

/* ============ 17. 打印 ============ */
@media print {
  #layout-menu, #layout-sidebar, #layout-list, .toolbar { display: none !important; }
  #layout-content { box-shadow: none; border: 0; }
}
