/* 鲸选RPA 管理后台 · 功能模块：日期时间选择、时间段、业务详情、任务中心、任务下发、群分组、手动建任务 */

/* ---------- 日期时间选择器（date-time-picker.js） ---------- */

.jxdt-field { position: relative; display: flex; flex-direction: column; gap: 4px; width: 100%; min-width: 0; font: inherit; }
.jxdt-clock-field { width: auto; }
.clock-control > .jxdt-clock-field { flex: 1 1 0; }

button.jxdt-trigger {
  justify-content: space-between;
  gap: 10px;
  width: 100%;
  height: var(--control-height);
  padding: 0 10px 0 12px;
  border: 1px solid var(--input);
  border-radius: var(--radius-md);
  background: var(--card);
  color: var(--foreground);
  font-weight: 400;
  font-variant-numeric: tabular-nums;
  text-align: left;
}
button.jxdt-trigger:hover:not(:disabled), button.jxdt-trigger:active:not(:disabled) { border-color: var(--input-hover); background: var(--card); }
button.jxdt-trigger[aria-expanded="true"] { border-color: var(--primary); box-shadow: 0 0 0 3px var(--ring); }
button.jxdt-trigger:focus-visible { border-color: var(--primary); outline: none; box-shadow: 0 0 0 3px var(--ring); }
button.jxdt-trigger:disabled, button.jxdt-trigger[aria-readonly="true"] { background: var(--muted); color: var(--muted-foreground); opacity: 1; cursor: default; }
button.jxdt-trigger[aria-invalid="true"] { border-color: var(--destructive); }
.jxdt-value { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.jxdt-empty .jxdt-value { color: var(--placeholder); }
.jxdt-icon { display: flex; flex-shrink: 0; color: var(--muted-foreground); }
button.jxdt-trigger .jxdt-icon .icon { width: 16px; height: 16px; }
.jxdt-clock-field > button.jxdt-trigger { gap: 6px; padding: 0 8px 0 10px; }
.jxdt-clock-field .jxdt-value { white-space: nowrap; }

/* Kept separate from the :popover-open rule: browsers without the Popover API would drop a combined selector list. */
.jxdt-popover {
  position: fixed;
  inset: auto;
  z-index: 2147483000;
  display: flex;
  flex-direction: column;
  gap: 12px;
  width: 340px;
  max-width: calc(100vw - 24px);
  max-height: calc(100vh - 24px);
  margin: 0;
  padding: 16px;
  overflow: auto;
  overscroll-behavior: contain;
  border: 0;
  border-radius: var(--radius-xl);
  background: var(--card);
  color: var(--foreground);
  box-shadow: var(--shadow-popover);
  font-family: var(--font-sans);
  font-size: 14px;
  line-height: 1.5;
  text-align: left;
  color-scheme: light;
  /* 只做淡入：位置由脚本按面板实际尺寸计算，缩放/位移动画会让测量出的位置偏几像素 */
  animation: fade-in 0.12s ease-out;
}
.jxdt-popover:popover-open { inset: auto; margin: 0; }
.jxdt-popover[popover]:not(:popover-open) { display: none; }
.jxdt-popover::backdrop { background: transparent; }

.jxdt-popover button {
  min-height: 34px;
  height: auto;
  padding: 6px 8px;
  border: 1px solid transparent;
  border-radius: var(--radius-md);
  background: transparent;
  color: var(--foreground);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
}
.jxdt-popover button:hover:not(:disabled) { background: var(--muted); }
.jxdt-popover button:active:not(:disabled) { background: var(--secondary); }
.jxdt-popover button:disabled { opacity: 0.35; }
.jxdt-popover button[aria-pressed="true"], .jxdt-popover button[aria-selected="true"] { background: var(--primary); color: var(--primary-foreground); }
.jxdt-popover button[aria-pressed="true"]:hover:not(:disabled), .jxdt-popover button[aria-selected="true"]:hover:not(:disabled) { background: var(--primary-hover); }
.jxdt-popover .icon { width: 16px; height: 16px; }

.jxdt-header { display: flex; flex-shrink: 0; align-items: center; gap: 8px; }
.jxdt-navigation { display: flex; flex: 1; align-items: center; justify-content: space-between; gap: 8px; min-width: 0; }
.jxdt-navigation strong { flex: 1; font-size: 15px; font-weight: 600; text-align: center; white-space: nowrap; font-variant-numeric: tabular-nums; }
.jxdt-popover .jxdt-navigation > [data-jxdt-nav], .jxdt-popover .jxdt-header > .jxdt-close { width: 32px; min-height: 32px; padding: 0; color: var(--muted-foreground); }
.jxdt-popover .jxdt-navigation > [data-jxdt-nav]:hover:not(:disabled), .jxdt-popover .jxdt-header > .jxdt-close:hover:not(:disabled) { color: var(--foreground); }

.jxdt-switch { display: flex; flex-shrink: 0; gap: 2px; padding: 3px; border-radius: var(--radius-md); background: var(--muted); }
.jxdt-popover .jxdt-switch > button { flex: 1; min-height: 28px; padding: 4px 8px; color: var(--muted-foreground); font-size: 13px; }
.jxdt-popover .jxdt-switch > button:hover:not(:disabled) { background: rgb(255 255 255 / 0.65); color: var(--foreground); }
.jxdt-popover .jxdt-switch > button[aria-pressed="true"], .jxdt-popover .jxdt-switch > button[aria-pressed="true"]:hover:not(:disabled) {
  background: var(--card);
  color: var(--foreground);
  box-shadow: 0 1px 2px rgb(20 41 60 / 0.1), 0 0 0 1px rgb(20 41 60 / 0.06);
}

.jxdt-body { flex: 0 0 auto; min-height: 0; }
.jxdt-week, .jxdt-days { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 2px; }
.jxdt-week { padding-bottom: 6px; color: var(--muted-foreground); font-size: 13px; text-align: center; }
.jxdt-popover .jxdt-days > button { min-height: 36px; padding: 0; font-weight: 400; }
.jxdt-popover .jxdt-days > .jxdt-other-month { color: var(--placeholder); }
.jxdt-popover .jxdt-days > .jxdt-today { border-color: rgb(29 111 184 / 0.35); color: var(--primary); font-weight: 600; }
.jxdt-popover .jxdt-days > button[aria-selected="true"] { color: var(--primary-foreground); }
.jxdt-month-grid, .jxdt-year-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; }
.jxdt-popover .jxdt-month-grid > button, .jxdt-popover .jxdt-year-grid > button { min-height: 40px; }
.jxdt-number-grid { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 4px; }
.jxdt-popover .jxdt-number-grid > button { min-height: 34px; padding: 0; }

.jxdt-time { display: flex; flex-shrink: 0; align-items: center; gap: 6px; padding-top: 12px; border-top: 1px solid var(--border-soft); }
.jxdt-time > span:first-child { margin-right: auto; color: var(--muted-foreground); }
.jxdt-time > span[aria-hidden="true"] { color: var(--muted-foreground); font-weight: 600; }
.jxdt-popover .jxdt-time > button { flex: 1; gap: 4px; max-width: 80px; min-height: 36px; border-color: var(--input); background: var(--card); font-size: 15px; }
.jxdt-time > button small { font-size: 12px; font-weight: 400; opacity: 0.75; }
.jxdt-popover .jxdt-time > button[aria-pressed="true"] { border-color: var(--primary); background: var(--primary-soft); color: var(--primary); }
.jxdt-popover .jxdt-time > button[aria-pressed="true"]:hover:not(:disabled) { background: var(--primary-soft-hover); }

.jxdt-preview { display: block; flex-shrink: 0; padding: 8px 12px; border-radius: var(--radius-md); background: var(--muted); color: var(--muted-foreground); font-size: 13px; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
.jxdt-footer { display: flex; flex-shrink: 0; gap: 8px; }
.jxdt-popover .jxdt-footer > button { padding: 6px 12px; border-color: var(--input); background: var(--card); }
.jxdt-popover .jxdt-footer > button:hover:not(:disabled) { background: var(--muted); }
.jxdt-popover .jxdt-footer > .jxdt-confirm { min-width: 88px; margin-left: auto; border-color: transparent; background: var(--primary); color: var(--primary-foreground); }
.jxdt-popover .jxdt-footer > .jxdt-confirm:hover:not(:disabled) { background: var(--primary-hover); }
.jxdt-panel-error { color: var(--destructive); font-size: 13px; }
.jxdt-panel-error[hidden] { display: none; }

@media (max-width: 430px) {
  .jxdt-popover { width: calc(100vw - 24px); gap: 10px; padding: 12px; }
  .jxdt-popover .jxdt-days > button { min-height: 34px; }
  .jxdt-popover .jxdt-time > button { font-size: 14px; }
}
@media (max-height: 560px) {
  .jxdt-popover { gap: 8px; padding: 12px; }
  .jxdt-popover .jxdt-days > button { min-height: 30px; }
}

/* ---------- 时间段 / 时长 / 绝对时间控件（time-controls.js） ---------- */

.temporal-field, .duration-field { min-width: 0; }
.time-ranges-panel {
  grid-column: 1 / -1;
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-width: 0;
  padding: 16px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: #f8fafc;
}
.time-ranges-panel > legend { float: left; width: 100%; font-size: 14px; font-weight: 600; }
.time-control-heading { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 12px; font-size: 13px; }
.time-zone-label { color: var(--muted-foreground); }
.time-control-heading output { color: var(--primary); font-weight: 600; }
.time-mode-options { display: flex; flex-wrap: wrap; gap: 8px; }
.time-mode-options label {
  flex-direction: row;
  align-items: center;
  gap: 8px;
  height: var(--control-height);
  padding: 0 12px;
  border: 1px solid var(--input);
  border-radius: var(--radius-md);
  background: var(--card);
  cursor: pointer;
  transition: border-color 0.15s, background-color 0.15s;
}
.time-mode-options label:hover { border-color: var(--input-hover); }
.time-mode-options label.is-selected { border-color: var(--primary); background: var(--primary-soft); color: var(--primary); }
.time-range-list { display: flex; flex-direction: column; gap: 10px; }
.time-range-list:empty { display: none; }
.time-range-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr) auto;
  align-items: end;
  gap: 8px 12px;
  min-width: 0;
  padding: 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--card);
}
.clock-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; color: var(--muted-foreground); font-size: 13px; font-weight: 500; }
.clock-control { display: flex; align-items: center; gap: 6px; min-width: 0; font-variant-numeric: tabular-nums; }
.clock-control select { flex: 1 1 0; width: 0; min-width: 0; }
.clock-control > span { color: var(--muted-foreground); font-weight: 600; }
.time-range-separator { height: var(--control-height); color: var(--muted-foreground); line-height: var(--control-height); }
.time-range-row [data-time-range-summary] { grid-column: 1 / -1; color: var(--primary); font-size: 13px; line-height: 1.6; }
.time-range-row [data-time-range-summary]:empty { display: none; }
.time-range-legacy { grid-column: 1 / 4; }
.time-range-add { align-self: flex-start; }
@media (max-width: 479px) {
  .time-range-row { grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); }
  .time-range-remove { grid-column: 1 / -1; }
  .time-range-legacy { grid-column: 1 / -1; }
}

.duration-control {
  display: flex;
  align-items: center;
  min-width: 0;
  overflow: hidden;
  border: 1px solid var(--input);
  border-radius: var(--radius-md);
  background: var(--card);
  transition: border-color 0.15s, box-shadow 0.15s;
}
.duration-control:hover { border-color: var(--input-hover); }
.duration-control:focus-within { border-color: var(--primary); box-shadow: 0 0 0 3px var(--ring); }
/* The bordered wrapper draws the field; the theme's input chrome would double it. */
.duration-control input { flex: 1 1 auto; width: 100%; min-width: 0; border: 0 !important; border-radius: 0; background: transparent !important; box-shadow: none !important; }
.duration-unit { flex: none; align-self: stretch; display: flex; align-items: center; padding: 0 12px; border-left: 1px solid var(--border); background: var(--muted); color: var(--muted-foreground); font-size: 13px; white-space: nowrap; }

/* ---------- 任务中心（task-management.js） ---------- */
/* 显示顺序：状态标签 → 筛选面板（标题 + 机器人 / 记录 / 创建时间 / 操作）→ 批量操作。
   app.js 把筛选项移进了 .task-filter-inspector，标题留在 .task-filter-card，两块拼成一个面板。 */
.task-center-controls-shell { display: flex; flex-direction: column; margin-bottom: 16px; }
.task-browse-filters { display: contents; }
.task-status-navigation { order: 1; }
.task-filter-card { order: 2; }
.task-filter-inspector { order: 3; }
.task-batch-actions { order: 4; }

.task-status-navigation,
.dispatch-status-nav {
  --tab-px: 12px;
  display: flex;
  margin-bottom: 16px;
  overflow-x: auto;
  scrollbar-width: none;
  box-shadow: inset 0 -1px 0 var(--border);
}
.task-status-navigation::-webkit-scrollbar, .dispatch-status-nav::-webkit-scrollbar { display: none; }
.task-status-navigation button,
.dispatch-status-nav button {
  position: relative;
  flex: none;
  height: 40px;
  padding: 0 var(--tab-px);
  border: 0;
  border-radius: 0;
  background: transparent;
  color: var(--muted-foreground);
}
.task-status-navigation button:hover:not(:disabled),
.task-status-navigation button:active:not(:disabled),
.dispatch-status-nav button:hover:not(:disabled),
.dispatch-status-nav button:active:not(:disabled) { background: transparent; color: var(--foreground); }
.task-status-navigation button[aria-pressed="true"], .dispatch-status-nav button[aria-pressed="true"] { color: var(--primary); }
.task-status-navigation button[aria-pressed="true"]::after,
.dispatch-status-nav button[aria-pressed="true"]::after {
  content: "";
  position: absolute;
  inset: auto var(--tab-px) 0;
  height: 2px;
  border-radius: 2px 2px 0 0;
  background: var(--primary);
}
/* The strip scrolls, so an outset focus ring would be clipped. */
.task-status-navigation button:focus-visible, .dispatch-status-nav button:focus-visible { outline: 2px solid var(--primary); outline-offset: -2px; border-radius: var(--radius-sm); box-shadow: none; }
@media (max-width: 1279px) { .task-status-navigation, .dispatch-status-nav { --tab-px: 7px; } }
@media (max-width: 639px) {
  .task-status-navigation,
  .dispatch-status-nav {
    padding-right: 24px;
    -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent);
    mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent);
  }
}

.task-filter-card,
.task-filter-inspector {
  border: 1px solid var(--border);
  background: rgb(239 243 248 / 0.5);
}
.task-filter-card {
  padding: 14px 16px 2px;
  border-bottom: 0;
  border-radius: var(--radius) var(--radius) 0 0;
}
.task-filter-card-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 10px; }
.task-filter-card-head strong { font-size: 14px; font-weight: 600; }
.task-filter-card-head span { color: var(--muted-foreground); font-size: 13px; }
.task-filter-inspector {
  display: flex;
  flex-direction: column;
  gap: 14px;
  min-width: 0;
  padding: 12px 16px 16px;
  border-top: 0;
  border-radius: 0 0 var(--radius) var(--radius);
}
.task-filter-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px 16px; }
.task-filter-fields label,
.task-time-custom label { color: var(--muted-foreground); font-size: 13px; }

.task-time-filter { display: flex; flex-direction: column; gap: 12px; padding-top: 14px; border-top: 1px solid var(--border); }
.task-time-heading { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.task-time-heading strong { color: var(--muted-foreground); font-size: 13px; font-weight: 500; }
.task-time-heading > span { padding: 1px 6px; border-radius: var(--radius-sm); background: var(--secondary); color: var(--muted-foreground); font-size: 12px; }
.task-time-presets,
.dispatch-time-presets {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 2px;
  margin-left: auto;
  padding: 3px;
  border-radius: var(--radius);
  background: rgb(20 41 60 / 0.06);
}
.task-time-presets button,
.dispatch-time-presets button {
  height: 28px;
  padding: 0 10px;
  border: 0;
  border-radius: 7px;
  background: transparent;
  color: var(--muted-foreground);
  font-size: 13px;
}
.task-time-presets button:hover:not(:disabled),
.task-time-presets button:active:not(:disabled),
.dispatch-time-presets button:hover:not(:disabled),
.dispatch-time-presets button:active:not(:disabled) { background: rgb(255 255 255 / 0.7); color: var(--foreground); }
.task-time-presets button[aria-pressed="true"], .dispatch-time-presets button[aria-pressed="true"] { background: var(--card); color: var(--foreground); box-shadow: 0 1px 2px rgb(20 41 60 / 0.1), 0 0 0 1px rgb(20 41 60 / 0.05); }
.task-time-custom { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 8px 10px; }
.task-time-custom label { flex: 1 1 180px; max-width: 240px; }
.task-time-separator,
.task-time-custom output { display: inline-flex; align-items: center; height: var(--control-height); color: var(--muted-foreground); font-size: 13px; }
.task-time-error { margin: 0; color: var(--destructive); font-size: 13px; }

.task-filter-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; padding-top: 14px; border-top: 1px solid var(--border); }
.task-filter-actions [role="status"] { flex: 1 1 200px; color: var(--muted-foreground); font-size: 13px; overflow-wrap: anywhere; }
.task-filter-actions [role="status"]:empty { display: none; }

@media (max-width: 639px) {
  .task-filter-card { padding-inline: 14px; }
  .task-filter-inspector { padding-inline: 14px; }
  .task-time-presets { display: flex; width: 100%; margin-left: 0; }
  .task-time-presets button { flex: 1 1 auto; padding: 0 6px; }
  .task-time-custom label { flex: 1 1 110px; max-width: none; }
  .task-time-custom > button { flex: 1 1 100%; }
  .task-filter-actions > button { flex: 1 1 auto; }
}

.task-batch-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 12px 16px;
  margin-top: 12px;
  padding: 12px 16px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--card);
}
.task-selection-summary { display: flex; flex: 1 1 280px; flex-direction: column; gap: 2px; min-width: 0; }
.task-selection-summary strong { font-size: 14px; font-weight: 600; font-variant-numeric: tabular-nums; }
.task-selection-summary span { color: var(--muted-foreground); font-size: 13px; line-height: 1.5; text-wrap: pretty; }
.task-selection-buttons { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.task-selection-buttons button { height: var(--control-height-sm); padding: 0 12px; font-size: 13px; }
.task-selection-buttons [data-task-selection-clear] { border-color: transparent; background: transparent; color: var(--primary); }
.task-selection-buttons [data-task-selection-clear]:hover:not(:disabled) { border-color: transparent; background: var(--primary-soft); }
[data-task-batch-result] { flex-basis: 100%; margin: 0; padding-top: 10px; border-top: 1px solid var(--border-soft); color: var(--muted-foreground); font-size: 13px; line-height: 1.6; }
@media (max-width: 639px) {
  .task-selection-buttons { width: 100%; }
  .task-selection-buttons > button { flex: 1 1 auto; }
}

#task-backlog-notice, .task-list-status { margin-bottom: 16px; }
.task-list-status { padding: 10px 14px; border-radius: var(--radius); background: var(--muted); color: var(--muted-foreground); font-size: 13px; line-height: 1.6; }

/* 列表：宽屏是固定高度的表格视口（高度由 task-management.js 写入 --task-table-height），
   表头与操作列固定；视口窄于 1280px（表格放不下 8 列）时每行改成记录卡，不再横向滚动。 */
body[data-page="tasks"] #generic .table-wrap .task-content-preview-text {
  display: -webkit-box;
  overflow: hidden;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  overflow-wrap: anywhere;
}
body[data-page="tasks"] #generic .task-message-kind {
  display: inline-flex;
  align-items: center;
  width: max-content;
  height: 20px;
  margin-top: 6px;
  padding: 0 6px;
  border-radius: 4px;
  background: var(--secondary);
  color: var(--muted-foreground);
  font-size: 12px;
}
body[data-page="tasks"] #generic .task-cell-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
body[data-page="tasks"] #generic strong.task-cell-name { display: block; font-weight: 500; }
body[data-page="tasks"] #generic .task-time-cell { font-variant-numeric: tabular-nums; white-space: nowrap; }
body[data-page="tasks"] #generic .task-time-cell small { display: inline; margin: 0 6px 0 0; }
body[data-page="tasks"] #generic tbody tr.task-row-selected td { background: var(--primary-soft); }

@media (min-width: 1280px) {
  body[data-page="tasks"] #generic .table-wrap {
    height: var(--task-table-height, 60vh);
    min-height: 360px;
    overflow: auto;
    overscroll-behavior: contain;
  }
  body[data-page="tasks"] #generic .table-wrap:has(tbody:empty) { height: auto; min-height: 0; }
  body[data-page="tasks"] #generic .table-wrap table { min-width: 1040px; }
  body[data-page="tasks"] #generic thead th { position: sticky; top: 0; z-index: 2; }
  body[data-page="tasks"] #generic th:last-child,
  body[data-page="tasks"] #generic td:last-child { position: sticky; right: 0; z-index: 1; background: var(--card); box-shadow: inset 1px 0 0 var(--border-soft); }
  body[data-page="tasks"] #generic thead th:last-child { z-index: 3; }
  body[data-page="tasks"] #generic tbody tr:hover td:last-child { background: #f8fafd; }
  body[data-page="tasks"] #generic tbody tr.task-row-selected td:last-child { background: var(--primary-soft); }
  body[data-page="tasks"] #generic .task-selection-cell { width: 40px; padding-right: 4px; }
  body[data-page="tasks"] #generic td.content-preview { min-width: 220px; max-width: 360px; }
  body[data-page="tasks"] #generic td.task-name-cell { min-width: 130px; max-width: 200px; }
  body[data-page="tasks"] #generic small.task-cell-name { margin-top: 2px; }
  body[data-page="tasks"] #generic .task-time-cell { font-size: 13px; }
  body[data-page="tasks"] #generic .task-time-cell > span { display: block; }
  body[data-page="tasks"] #generic .task-time-cell > span + span { margin-top: 2px; color: var(--muted-foreground); }
  body[data-page="tasks"] #generic .task-result-note { max-width: 200px; }
  body[data-page="tasks"] #generic td.task-failure-cell { min-width: 140px; max-width: 220px; color: var(--muted-foreground); font-size: 13px; }
}

@media (max-width: 1279px) {
  body[data-page="tasks"] #generic .table-wrap table,
  body[data-page="tasks"] #generic .table-wrap thead,
  body[data-page="tasks"] #generic .table-wrap tbody { display: block; }
  /* 只保留“全选本页”勾选框作为列表头。 */
  body[data-page="tasks"] #generic thead tr { display: flex; align-items: center; padding: 10px var(--card-px); border-bottom: 1px solid var(--border); background: rgb(239 243 248 / 0.5); }
  body[data-page="tasks"] #generic thead th { display: none; }
  body[data-page="tasks"] #generic thead th.task-selection-cell { display: inline-flex; align-items: center; gap: 10px; height: auto; padding: 0; border: 0; background: transparent; font-size: 13px; }
  body[data-page="tasks"] #generic thead th.task-selection-cell::after { content: "全选本页"; }
  body[data-page="tasks"] #generic thead:not(:has(.task-selection-cell)),
  body[data-page="tasks"] #generic table:has(tbody:empty) thead { display: none; }

  body[data-page="tasks"] #generic tbody tr {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    row-gap: 8px;
    padding: 14px var(--card-px);
    border-bottom: 1px solid var(--border-soft);
    transition: background-color 0.12s;
  }
  body[data-page="tasks"] #generic tbody tr:last-child { border-bottom: 0; }
  body[data-page="tasks"] #generic tbody tr:hover { background: #f8fafd; }
  body[data-page="tasks"] #generic tbody tr.task-row-selected { background: var(--primary-soft); }
  body[data-page="tasks"] #generic tbody td { display: block; grid-column: 2 / -1; min-width: 0; max-width: none; padding: 0; border: 0; background: transparent; }
  body[data-page="tasks"] #generic tbody td.task-selection-cell { grid-column: 1; grid-row: 1; padding: 2px 12px 0 0; }
  body[data-page="tasks"] #generic tbody td.content-preview { grid-column: 2; grid-row: 1; font-weight: 500; }
  /* 状态单元格拆开：徽标放右上角，结果说明跟在时间后面。 */
  body[data-page="tasks"] #generic tbody td.task-time-cell + td { display: contents; }
  body[data-page="tasks"] #generic tbody td.task-time-cell + td > .badge { grid-column: 3; grid-row: 1; align-self: start; margin-left: 12px; }
  body[data-page="tasks"] #generic tbody td.task-time-cell + td > .task-result-note { grid-column: 2 / -1; margin: 0; font-size: 13px; }

  body[data-page="tasks"] #generic tbody td.task-name-cell,
  body[data-page="tasks"] #generic tbody td.task-failure-cell { display: flex; align-items: baseline; gap: 8px; font-size: 14px; }
  body[data-page="tasks"] #generic tbody td.task-name-cell::before,
  body[data-page="tasks"] #generic tbody td.task-failure-cell::before { flex: none; width: 56px; color: var(--muted-foreground); font-size: 13px; }
  body[data-page="tasks"] #generic tbody td.content-preview + td.task-name-cell::before { content: "来源"; }
  body[data-page="tasks"] #generic tbody td.task-name-cell + td.task-name-cell::before { content: "发送目标"; }
  body[data-page="tasks"] #generic tbody td.task-failure-cell::before { content: "失败原因"; }
  body[data-page="tasks"] #generic tbody td.task-failure-empty { display: none; }
  body[data-page="tasks"] #generic tbody td.task-name-cell strong.task-cell-name { flex: 0 1 auto; min-width: 0; }
  body[data-page="tasks"] #generic tbody td.task-name-cell small.task-cell-name { flex: 1 1 0; min-width: 0; margin: 0; font-size: 13px; }
  body[data-page="tasks"] #generic tbody td.task-name-cell small.task-cell-name::before { content: "·"; margin-right: 8px; }
  body[data-page="tasks"] #generic tbody td.task-time-cell { display: flex; flex-wrap: wrap; gap: 2px 16px; color: var(--muted-foreground); font-size: 13px; }
  body[data-page="tasks"] #generic tbody td:has(> .row-actions) { margin-top: 4px; }
}

/* ---------- 任务下发管理（task-dispatch-management.js） ---------- */
/* 与任务中心同一套筛选面板与状态页签；宽屏为表格，窄于 1280px 时每行改为记录卡。 */
.dispatch-page-actions { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: 12px 24px; margin-bottom: 16px; }
.dispatch-page-actions > div { flex: 1 1 320px; min-width: 0; }
.dispatch-page-actions > button { flex: none; }
.dispatch-explanation { color: var(--muted-foreground); font-size: 14px; line-height: 1.6; text-wrap: pretty; }

.dispatch-filter-bar {
  display: flex;
  flex-direction: column;
  gap: 14px;
  margin-bottom: 16px;
  padding: 14px 16px 16px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: rgb(239 243 248 / 0.5);
}
.dispatch-filter-primary { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 12px 16px; }
.dispatch-filter-primary > label { flex: 1 1 180px; color: var(--muted-foreground); font-size: 13px; }
.dispatch-filter-primary > .dispatch-keyword { flex-basis: 240px; }
.dispatch-query-actions { display: flex; flex: none; gap: 8px; }
.dispatch-filter-dates { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 12px; padding-top: 14px; border-top: 1px solid var(--border); }
.dispatch-date-caption { display: inline-flex; align-items: center; gap: 8px; color: var(--muted-foreground); font-size: 13px; font-weight: 500; }
.dispatch-date-caption small { padding: 1px 6px; border-radius: var(--radius-sm); background: var(--secondary); font-size: 12px; font-weight: 400; }
.dispatch-date-range { display: flex; flex: 1 1 300px; align-items: center; gap: 8px; min-width: 0; }
.dispatch-date-range > label { flex: 1 1 140px; max-width: 200px; }
.dispatch-date-range > span { color: var(--muted-foreground); }
.dispatch-refresh-options { margin-left: auto; }
@media (max-width: 639px) {
  .dispatch-filter-bar { padding-inline: 14px; }
  .dispatch-query-actions { flex: 1 1 100%; }
  .dispatch-query-actions > button { flex: 1; }
  .dispatch-time-presets { display: flex; width: 100%; }
  .dispatch-time-presets button { flex: 1 1 auto; padding: 0 6px; }
  .dispatch-date-range > label { max-width: none; }
  .dispatch-refresh-options { flex: 1 1 100%; margin-left: 0; }
}

.dispatch-status-nav { margin-bottom: 12px; }
.dispatch-status-nav [data-dispatch-count] {
  min-width: 20px;
  margin-left: 6px;
  padding: 0 6px;
  border-radius: 999px;
  background: var(--secondary);
  color: var(--muted-foreground);
  font-size: 12px;
  line-height: 18px;
  text-align: center;
  font-variant-numeric: tabular-nums;
}
.dispatch-status-nav [data-dispatch-count]:empty { display: none; }
.dispatch-status-nav button[aria-pressed="true"] [data-dispatch-count] { background: var(--primary-soft); color: var(--primary); }

.dispatch-feedback { margin-bottom: 12px; color: var(--muted-foreground); font-size: 13px; line-height: 1.6; }
.dispatch-list-card > p:empty { display: none; }
.dispatch-list-card > p[role="alert"] { margin-bottom: 12px; color: var(--destructive); font-size: 13px; }
.dispatch-list-card > p.subtle { margin-top: 12px; font-size: 12px; overflow-wrap: anywhere; }
.dispatch-list-card > button.secondary { margin-bottom: 12px; }

.dispatch-table-wrap { width: calc(100% + 2 * var(--card-px)); margin-inline: calc(-1 * var(--card-px)); }
.dispatch-table-wrap td { vertical-align: top; }
.dispatch-task-name { display: block; font-weight: 600; overflow-wrap: anywhere; }
.dispatch-task-id { font-family: var(--font-mono); overflow-wrap: anywhere; }
.dispatch-origin {
  display: inline-flex;
  align-items: center;
  height: 20px;
  margin-top: 6px;
  padding: 0 6px;
  border-radius: 4px;
  background: var(--secondary);
  color: var(--muted-foreground);
  font-size: 12px;
  font-weight: 500;
  white-space: nowrap;
}
.dispatch-origin-manual { background: var(--primary-soft); color: var(--primary); }
.dispatch-cell-pair, .dispatch-evidence-time { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.dispatch-cell-pair + .dispatch-cell-pair { margin-top: 4px; }
.dispatch-cell-pair > span, .dispatch-evidence-time > span { flex: none; color: var(--muted-foreground); font-size: 12px; }
.dispatch-cell-value { min-width: 0; font-weight: 500; overflow-wrap: anywhere; }
.dispatch-cell-pair time, .dispatch-evidence-time time { font-size: 13px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.dispatch-evidence-time { margin-top: 2px; }
.dispatch-evidence-time time { color: var(--muted-foreground); }
td small.dispatch-status-basis { margin: 6px 0 4px; font-size: 12px; line-height: 1.5; }
.dispatch-failure-reason { color: var(--muted-foreground); font-size: 13px; }
.dispatch-table-wrap .row-actions { flex-wrap: nowrap; }

.badge.dispatch-state-acknowledged { background: rgb(19 120 74 / 0.1); color: var(--success); }
.badge.dispatch-state-acknowledged::before { background: var(--success); }
.badge.dispatch-state-in_progress { background: rgb(29 111 184 / 0.1); color: var(--primary); }
.badge.dispatch-state-in_progress::before { background: var(--primary); }
.badge.dispatch-state-failed { background: rgb(191 58 58 / 0.1); color: var(--destructive); }
.badge.dispatch-state-failed::before { background: var(--destructive); }
.badge.dispatch-state-unknown, .badge.dispatch-state-paused { background: rgb(180 83 9 / 0.1); color: var(--warning); }
.badge.dispatch-state-unknown::before, .badge.dispatch-state-paused::before { background: var(--warning); }

@media (min-width: 1280px) {
  .dispatch-table-wrap table { min-width: 1080px; }
  .dispatch-table-wrap th:first-child, .dispatch-table-wrap td:first-child { padding-left: var(--card-px); }
  .dispatch-table-wrap td:first-child { min-width: 170px; max-width: 220px; }
  .dispatch-table-wrap td:nth-child(2) { min-width: 200px; max-width: 260px; }
  .dispatch-table-wrap td:nth-child(4) { min-width: 200px; max-width: 240px; }
  .dispatch-table-wrap td:nth-child(6) { min-width: 120px; max-width: 200px; }
  .dispatch-table-wrap th:last-child, .dispatch-table-wrap td:last-child {
    position: sticky;
    right: 0;
    z-index: 1;
    padding-right: var(--card-px);
    background: var(--card);
    box-shadow: inset 1px 0 0 var(--border-soft);
  }
  .dispatch-table-wrap tbody tr:hover td:last-child { background: #f8fafd; }
}

/* 记录卡：标题 + 右上角下发状态，其余信息两列排布（手机上单列）；单元格内自带列名，只给结果与原因补上标题。 */
@media (max-width: 1279px) {
  .dispatch-table-wrap table, .dispatch-table-wrap tbody { display: block; }
  .dispatch-table-wrap colgroup, .dispatch-table-wrap thead { display: none; }
  .dispatch-table-wrap tbody { border-top: 1px solid var(--border); }
  .dispatch-table-wrap tbody tr {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto;
    gap: 6px 24px;
    padding: 14px var(--card-px);
    border-bottom: 1px solid var(--border-soft);
    transition: background-color 0.12s;
  }
  .dispatch-table-wrap tbody tr:last-child { border-bottom: 0; }
  .dispatch-table-wrap tbody tr:hover { background: #f8fafd; }
  .dispatch-table-wrap tbody td { display: block; min-width: 0; padding: 0; border: 0; background: transparent; }
  .dispatch-table-wrap tbody td:nth-child(2), .dispatch-table-wrap tbody td:nth-child(3), .dispatch-table-wrap tbody td:nth-child(4) { display: contents; }
  .dispatch-table-wrap tbody td:first-child { display: flex; flex-wrap: wrap; align-items: center; grid-column: 1 / 3; grid-row: 1; gap: 4px 10px; margin-bottom: 4px; }
  .dispatch-table-wrap .dispatch-task-name { font-size: 15px; }
  .dispatch-table-wrap td small.dispatch-task-id { margin: 0; }
  .dispatch-table-wrap .dispatch-origin { margin: 0; }
  .dispatch-table-wrap tbody td:nth-child(4) > .badge { grid-column: 3; grid-row: 1; align-self: start; justify-self: end; }
  .dispatch-table-wrap .dispatch-cell-pair, .dispatch-table-wrap .dispatch-evidence-time { grid-column: 1; margin: 0; }
  .dispatch-table-wrap .dispatch-cell-pair + .dispatch-cell-pair,
  .dispatch-table-wrap .dispatch-evidence-time + .dispatch-evidence-time { grid-column: 2 / -1; }
  .dispatch-table-wrap .dispatch-cell-pair > span, .dispatch-table-wrap .dispatch-evidence-time > span { font-size: 13px; }
  .dispatch-table-wrap td small.dispatch-status-basis { display: flex; grid-column: 1 / -1; gap: 8px; margin: 0; color: var(--foreground); font-size: 13px; }
  .dispatch-table-wrap td small.dispatch-status-basis::before { content: "状态依据"; flex: none; color: var(--muted-foreground); }
  .dispatch-table-wrap tbody td:nth-child(5), .dispatch-table-wrap tbody td:nth-child(6) { display: flex; align-items: baseline; gap: 8px; }
  .dispatch-table-wrap tbody td:nth-child(6) { grid-column: 2 / -1; }
  .dispatch-table-wrap tbody td:nth-child(5)::before, .dispatch-table-wrap tbody td:nth-child(6)::before { flex: none; color: var(--muted-foreground); font-size: 13px; }
  .dispatch-table-wrap tbody td:nth-child(5)::before { content: "最终发送结果"; }
  .dispatch-table-wrap tbody td:nth-child(6)::before { content: "下发失败原因"; }
  .dispatch-table-wrap tbody td:last-child:not(:first-child) { grid-column: 1 / -1; margin-top: 6px; }
  .dispatch-table-wrap tbody tr:has(> td[colspan]) { display: block; }
  .dispatch-table-wrap tbody td[colspan] { display: block; color: var(--muted-foreground); }
}
@media (max-width: 639px) {
  .dispatch-table-wrap tbody tr { grid-template-columns: minmax(0, 1fr) auto; column-gap: 12px; }
  .dispatch-table-wrap tbody td:first-child { grid-column: 1; }
  .dispatch-table-wrap tbody td:nth-child(4) > .badge { grid-column: 2; }
  .dispatch-table-wrap .dispatch-cell-pair, .dispatch-table-wrap .dispatch-evidence-time,
  .dispatch-table-wrap .dispatch-cell-pair + .dispatch-cell-pair,
  .dispatch-table-wrap .dispatch-evidence-time + .dispatch-evidence-time,
  .dispatch-table-wrap tbody td:nth-child(5), .dispatch-table-wrap tbody td:nth-child(6) { grid-column: 1 / -1; }
  .dispatch-table-wrap .dispatch-cell-pair > span, .dispatch-table-wrap .dispatch-evidence-time > span { min-width: 3em; }
}

/* ---------- 群分组管理（group-management.js） ---------- */
.group-sets-card > p.subtle:first-child { margin-bottom: 16px; font-size: 14px; line-height: 1.6; text-wrap: pretty; }
.group-sets-card .toolbar [data-set-create] { margin-left: auto; }
.group-sets-card [data-set-error], .group-sets-card [data-set-status] { margin-bottom: 12px; font-size: 13px; }
.group-sets-card [data-set-error] { color: var(--destructive); }
.group-sets-card [data-set-status] { color: var(--muted-foreground); }
.group-sets-card [data-set-error]:empty, .group-sets-card [data-set-status]:empty { display: none; }
.group-sets-card > .table-wrap { width: calc(100% + 2 * var(--card-px)); margin-inline: calc(-1 * var(--card-px)); }
.group-sets-card > .table-wrap th:first-child, .group-sets-card > .table-wrap td:first-child { padding-left: var(--card-px); }
.group-sets-card > .table-wrap th:last-child, .group-sets-card > .table-wrap td:last-child { padding-right: var(--card-px); }
.group-sets-card tbody td:first-child { font-weight: 500; }
.group-sets-card tbody td[colspan] { color: var(--muted-foreground); font-weight: 400; }
@media (min-width: 1024px) {
  .group-sets-card tbody td:not(:first-child) { white-space: nowrap; }
}
@media (max-width: 1023px) {
  .group-sets-card > .table-wrap table, .group-sets-card > .table-wrap tbody { display: block; }
  .group-sets-card > .table-wrap thead { display: none; }
  .group-sets-card > .table-wrap tbody { border-top: 1px solid var(--border); }
  .group-sets-card tbody tr { display: grid; grid-template-columns: minmax(0, 1fr); row-gap: 6px; padding: 14px var(--card-px); border-bottom: 1px solid var(--border-soft); }
  .group-sets-card tbody tr:last-child { border-bottom: 0; }
  .group-sets-card tbody td { display: flow-root; min-width: 0; padding: 0 0 0 96px; border: 0; background: transparent; overflow-wrap: anywhere; }
  .group-sets-card > .table-wrap tbody td:first-child { padding-left: 0; font-size: 15px; font-weight: 600; }
  .group-sets-card tbody td::before { float: left; width: 84px; margin-left: -96px; color: var(--muted-foreground); font-size: 13px; }
  .group-sets-card tbody td:nth-child(2)::before { content: "发送机器人"; }
  .group-sets-card tbody td:nth-child(3)::before { content: "目标群数量"; }
  .group-sets-card tbody td:nth-child(4)::before { content: "更新时间"; }
  .group-sets-card > .table-wrap tbody td:last-child:not(:first-child) { margin-top: 4px; padding-left: 0; }
  .group-sets-card tbody tr:has(> td[colspan]) { display: block; }
  .group-sets-card > .table-wrap tbody td[colspan] { padding: 0; font-size: 14px; font-weight: 400; }
}

/* ---------- 目标群选择（群分组、群映射、手工建任务共用） ---------- */
.group-selector { min-width: 0; }
.group-selector > legend { margin-bottom: 10px; font-size: 14px; font-weight: 600; }
.group-selector > p.subtle { padding: 24px 12px; border: 1px dashed var(--input); border-radius: var(--radius); color: var(--muted-foreground); font-size: 13px; text-align: center; }
.target-picker-heading { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; width: 100%; }
.target-picker-workspace > .target-picker-heading { margin-bottom: 10px; }
.target-picker-heading b { font-weight: 600; }
.target-picker-heading output { color: var(--primary); font-size: 13px; font-weight: 500; white-space: nowrap; }
.group-selector-toolbar { display: flex; gap: 8px; margin-bottom: 8px; }
.group-selector-toolbar > input { flex: 1; }
.target-picker-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 8px; }
.target-picker-actions button { height: var(--control-height-sm); padding: 0 10px; font-size: 13px; }
.target-picker-actions button[aria-pressed="true"] { border-color: var(--primary); background: var(--primary-soft); color: var(--primary); }
.target-picker-hint { margin-bottom: 8px; color: var(--muted-foreground); font-size: 13px; line-height: 1.5; }
.target-picker-hint:empty { display: none; }
.group-selector-options {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 180px), 1fr));
  align-content: start;
  gap: 4px;
  max-height: 320px;
  padding: 6px;
  overflow-y: auto;
  overscroll-behavior: contain;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--card);
}
label.group-selector-option {
  flex-direction: row;
  align-items: center;
  gap: 10px;
  min-height: 36px;
  padding: 6px 10px;
  border-radius: var(--radius-md);
  font-weight: 400;
  cursor: pointer;
  transition: background-color 0.12s;
}
label.group-selector-option > span { min-width: 0; font-weight: 400; overflow-wrap: anywhere; }
label.group-selector-option:hover { background: var(--muted); }
label.group-selector-option:has(input:checked) { background: var(--primary-soft); }
label.group-selector-option:has(input:disabled) { color: var(--placeholder); cursor: not-allowed; }
.target-picker-empty { grid-column: 1 / -1; padding: 28px 12px; text-align: center; }
.target-picker-empty b { display: block; font-size: 14px; }
.target-picker-empty p { margin-top: 4px; color: var(--muted-foreground); font-size: 13px; line-height: 1.6; }
.group-selector .mapping-pagination { margin-top: 8px; }
.mapping-pagination > span:last-child { display: inline-flex; flex-wrap: wrap; gap: 8px; }

/* ---------- 编辑弹窗变体（openEditor 的 layout：群映射 / 设备配置 / 时间设置） ---------- */

/* 带选群区域的弹窗放宽；宽屏左右两栏（设置 | 选群），窄屏保持单列。 */
#editor-dialog.mapping-editor-dialog,
#editor-dialog.device-config-dialog { width: min(1120px, calc(100vw - 32px)); }
/* ID 选择器优先级高于 components.css 的手机端底部弹层宽度，这里单独铺满。 */
@media (max-width: 639px) {
  #editor-dialog.mapping-editor-dialog,
  #editor-dialog.device-config-dialog { width: 100vw; }
}

.mapping-settings, .device-config-settings { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.device-config-identity { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr)); gap: 16px; }

@media (min-width: 960px) {
  #editor-dialog.mapping-editor-dialog .editor-fields {
    grid-template-columns: minmax(280px, 340px) minmax(0, 1fr);
    align-items: start;
    gap: 20px 28px;
  }
  #editor-dialog.device-config-dialog .editor-fields {
    grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
    align-items: start;
    gap: 20px 28px;
  }
  #editor-dialog.device-config-dialog .editor-fields > * { grid-column: 1 / -1; }
  #editor-dialog.device-config-dialog .editor-fields > [data-group-selector] { grid-column: 1; }
  #editor-dialog.device-config-dialog .editor-fields > .device-config-settings { grid-column: 2; }
}

/* 选择目标分组（群映射左栏） */
.mapping-group-set-chooser {
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-width: 0;
  padding: 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: #f8fafc;
}
.mapping-group-set-chooser > legend { float: left; width: 100%; font-size: 14px; font-weight: 600; }
.mapping-group-set-chooser .group-selector-toolbar { margin: 0; }
.mapping-group-set-chooser [data-set-results] { display: flex; flex-direction: column; gap: 10px; color: var(--muted-foreground); font-size: 13px; }
.mapping-group-set-chooser [data-set-results] > label { color: var(--foreground); font-size: 14px; }
.mapping-group-set-chooser .mapping-pagination { padding-top: 0; }
.mapping-group-set-chooser > p.subtle { font-size: 13px; line-height: 1.6; }

.mapping-change-preview {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 4px 16px;
  padding: 10px 12px;
  border-radius: var(--radius-md);
  background: var(--muted);
  color: var(--muted-foreground);
  font-size: 13px;
  font-variant-numeric: tabular-nums;
}
.mapping-change-preview b { color: var(--foreground); font-weight: 600; }

/* 采集谁发的消息（采集电脑配置） */
.source-sender-rules { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.source-sender-rules > legend { float: left; width: 100%; font-size: 14px; font-weight: 600; }
.source-sender-intro { color: var(--muted-foreground); font-size: 13px; line-height: 1.6; }
[data-source-rule-workspace] { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
[data-source-rule-workspace] > p.subtle { padding: 16px 12px; border: 1px dashed var(--input); border-radius: var(--radius); font-size: 13px; text-align: center; }
[data-source-rule-workspace] > .mapping-pagination { padding-top: 0; }
.source-sender-card { display: flex; flex-direction: column; gap: 12px; min-width: 0; padding: 14px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--card); }
.source-sender-card-header { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 12px; }
.source-sender-card-header h3 { min-width: 0; font-size: 14px; overflow-wrap: anywhere; }
.source-member-sync-controls { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.source-member-sync-controls [data-source-member-sync-state] { padding: 2px 8px; border-radius: 999px; background: var(--secondary); color: var(--muted-foreground); font-size: 12px; font-weight: 500; }
.source-member-sync-controls button { height: var(--control-height-sm); padding: 0 10px; font-size: 13px; }
.source-sender-modes { display: flex; flex-wrap: wrap; gap: 8px 20px; }
.source-sender-modes label { flex-direction: row; align-items: center; gap: 8px; font-weight: 400; cursor: pointer; }
.source-sender-modes label:has(input:disabled) { color: var(--placeholder); cursor: not-allowed; }

/* 发送间隔（发送电脑配置）：说明标题 + 两列时长输入 */
.time-section-heading { padding-top: 16px; border-top: 1px solid var(--border); }
.time-section-heading strong { font-size: 14px; font-weight: 600; }
.time-section-heading p { margin-top: 4px; color: var(--muted-foreground); font-size: 13px; line-height: 1.6; }
.device-config-settings:has(> .duration-field) { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); }
.device-config-settings:has(> .duration-field) > :not(.duration-field) { grid-column: 1 / -1; }

/* 角色与权限 */
.permission-set { display: flex; flex-wrap: wrap; gap: 8px; min-width: 0; }
.permission-set > legend { float: left; width: 100%; margin-bottom: 2px; font-size: 14px; font-weight: 600; }
.permission-set label.choice { padding: 6px 10px; border: 1px solid var(--border); border-radius: var(--radius-md); }
.permission-set label.choice:has(input:checked) { border-color: rgb(29 111 184 / 0.35); background: var(--primary-soft); }

/* ---------- 管理弹窗（群分组编辑、任务下发详情） ---------- */
.management-dialog { width: min(720px, calc(100vw - 32px)); }
.management-dialog-header {
  display: flex;
  flex: none;
  align-items: center;
  gap: 12px;
  margin: 0;
  padding: 16px 20px 16px 24px;
  border-bottom: 1px solid var(--border);
}
.management-dialog-header h2 { flex: 1; min-width: 0; font-size: 17px; }
.management-dialog-header > div:first-child { flex: 1; min-width: 0; }
.management-dialog-header .subtle { margin-top: 2px; font-size: 13px; }
.management-dialog-header > button.secondary { flex: none; height: 32px; padding: 0 10px 0 8px; border-color: transparent; background: transparent; color: var(--muted-foreground); }
.management-dialog-header > button.secondary::before {
  content: "";
  width: 16px;
  height: 16px;
  background: currentColor;
  -webkit-mask: var(--icon-x) center / contain no-repeat;
  mask: var(--icon-x) center / contain no-repeat;
}
.management-dialog-header > button.secondary:hover:not(:disabled) { border-color: transparent; background: var(--muted); color: var(--foreground); }
.management-dialog-body { flex: 1; min-height: 0; padding: 20px 24px 24px; overflow-y: auto; }
.management-dialog-footer {
  display: flex;
  flex: none;
  align-items: center;
  justify-content: flex-end;
  gap: 12px;
  padding: 14px 24px;
  border-top: 1px solid var(--border);
  background: #fafbfd;
}
.management-dialog-footer > p[role="alert"] { flex: 1; min-width: 0; color: var(--destructive); font-size: 13px; line-height: 1.5; }
.management-dialog-footer > button { min-width: 96px; }
@media (max-width: 639px) {
  .management-dialog-header { padding: 14px 16px; }
  .management-dialog-body { padding: 16px; }
  .management-dialog-footer { flex-wrap: wrap; padding: 12px 16px; }
  .management-dialog-footer > p[role="alert"]:empty { display: none; }
  .management-dialog-footer > button { flex: 1; }
}

.group-set-dialog { width: min(960px, calc(100vw - 32px)); }
.group-set-workspace { display: grid; grid-template-columns: minmax(0, 300px) minmax(0, 1fr); align-items: start; gap: 24px; }
.group-set-settings { display: flex; flex-direction: column; gap: 14px; }
.group-set-settings > p.subtle { margin-top: -6px; font-size: 13px; line-height: 1.6; }
.group-set-draft-note { padding: 10px 12px; border-radius: var(--radius-md); background: var(--muted); color: var(--muted-foreground); font-size: 13px; line-height: 1.6; }
/* 单列时把「2. 选择目标群」排回 1 和 3 之间（桌面端它在右栏）。 */
@media (max-width: 767px) {
  .group-set-workspace { grid-template-columns: minmax(0, 1fr); gap: 14px; }
  .group-set-settings { display: contents; }
  .group-set-settings > :nth-child(-n + 2) { order: 1; }
  .group-set-workspace > .group-selector { order: 2; margin-top: 6px; }
  .group-set-settings > :nth-child(n + 3) { order: 3; }
}

.dispatch-detail-dialog { width: min(780px, calc(100vw - 32px)); }
.dispatch-detail-panel > p[role="status"], .dispatch-detail-panel > p.subtle { color: var(--muted-foreground); font-size: 14px; }
.dispatch-detail-panel > p[role="alert"] { color: var(--destructive); font-size: 14px; }
.dispatch-detail-notice { margin-bottom: 20px; padding: 10px 12px; border-radius: var(--radius-md); background: var(--muted); font-size: 13px; }
.dispatch-detail-section + .dispatch-detail-section { margin-top: 24px; }
.dispatch-detail-section h3 { margin-bottom: 8px; }
.dispatch-detail-fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 24px; }
.dispatch-detail-fields > div { display: flex; align-items: baseline; gap: 12px; min-width: 0; padding: 9px 0; border-bottom: 1px solid var(--border-soft); }
.dispatch-detail-fields dt { flex: none; width: 112px; color: var(--muted-foreground); font-size: 13px; }
.dispatch-detail-fields dd { flex: 1; min-width: 0; font-size: 14px; overflow-wrap: anywhere; }
.dispatch-timeline { display: flex; flex-direction: column; }
.dispatch-timeline > li { position: relative; display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: 12px; padding: 0 0 16px 22px; }
.dispatch-timeline > li::before { content: ""; position: absolute; top: 6px; left: 3px; width: 9px; height: 9px; border-radius: 50%; background: var(--primary); box-shadow: 0 0 0 3px var(--primary-soft); }
.dispatch-timeline > li::after { content: ""; position: absolute; top: 20px; bottom: 2px; left: 7px; width: 1px; background: var(--border); }
.dispatch-timeline > li:last-child { padding-bottom: 0; }
.dispatch-timeline > li:last-child::after { content: none; }
.dispatch-timeline time { color: var(--muted-foreground); font-size: 13px; font-variant-numeric: tabular-nums; }
.dispatch-event-content { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 8px; min-width: 0; }
.dispatch-event-content strong { font-size: 14px; }
.dispatch-event-content span { color: var(--muted-foreground); font-size: 13px; }
.dispatch-event-content p { flex-basis: 100%; color: var(--muted-foreground); font-size: 13px; line-height: 1.6; }
.dispatch-event-content p:empty { display: none; }
.dispatch-timeline > li.dispatch-timeline-empty { display: block; padding: 16px 0; color: var(--muted-foreground); font-size: 13px; }
.dispatch-timeline > li.dispatch-timeline-empty::before, .dispatch-timeline > li.dispatch-timeline-empty::after { content: none; }
.dispatch-detail-footer { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--border); }
.dispatch-history-pagination { display: flex; align-items: center; gap: 8px; color: var(--muted-foreground); font-size: 13px; }
@media (max-width: 639px) {
  .dispatch-detail-fields { grid-template-columns: minmax(0, 1fr); }
  .dispatch-detail-fields dt { width: 104px; }
  .dispatch-timeline > li { grid-template-columns: minmax(0, 1fr); gap: 2px; }
  .dispatch-detail-footer > button { flex: 1 1 100%; }
}
/* Customer management/support: keep both native scrollbars inside the viewport. */
#customer-management-controls[hidden] { display: none !important; }
#customer-management-controls { display: contents; }
.customer-list-tabs { display: flex; align-items: center; gap: 24px; flex: none; order: 0; margin: -4px 0 16px; border-bottom: 1px solid var(--border); }
.customer-list-tabs button { position: relative; height: 42px; padding-inline: 0; border: 0; border-radius: 0; background: transparent; color: var(--muted-foreground); }
.customer-list-tabs button[aria-selected="true"] { color: var(--primary); font-weight: 600; }
.customer-list-tabs button:hover:not(:disabled), .customer-list-tabs button:focus-visible { background: transparent; color: var(--primary); }
.customer-list-tabs button[aria-selected="true"]::after { position: absolute; content: ""; inset: auto 0 -1px; height: 3px; background: var(--primary); border-radius: 3px 3px 0 0; }
.customer-list-help { margin-left: auto; color: var(--muted-foreground); font-size: 12px; }
.customer-selection-bar { display: flex; flex: none; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px; order: 3; margin: 2px 0 14px; padding: 12px 14px; border: 1px solid var(--border); border-radius: 8px; background: #f5f9fe; }
.customer-selection-copy { display: flex; align-items: baseline; flex-wrap: wrap; gap: 8px 14px; }
.customer-selection-copy strong { font-size: 13px; font-weight: 600; }
.customer-selection-copy span { color: var(--muted-foreground); font-size: 12px; }
.customer-selection-actions { display: flex; gap: 8px; align-items: center; }
.customer-selection-actions button { height: 32px; font-size: 13px; }
.customer-selected > td { background: #edf5ff; }
.customer-action-dialog { width: min(580px, calc(100vw - 32px)); }
.customer-action-content { padding: 20px 24px; max-height: calc(100dvh - 220px); overflow-y: auto; }
.customer-action-warning { padding: 12px 14px; border: 1px solid #f2d8bc; border-radius: 8px; background: #fff8ee; color: #8b4c13; font-size: 14px; line-height: 1.8; }
.customer-purge-dialog .customer-action-warning { border-color: #f4cdcd; background: #fff3f3; color: #b4232d; }
#customer-action-summary { margin: 18px 0 10px; font-size: 13px; color: var(--muted-foreground); }
.customer-confirm-list { max-height: 220px; overflow: auto; border: 1px solid var(--border); border-radius: 8px; }
.customer-confirm-list th { background: #f6f8fc; position: sticky; top: 0; }
.customer-confirm-list td { padding: 12px; font-size: 13px; }
#customer-confirm-label { margin-top: 18px; display: flex; gap: 8px; }
#customer-confirm-label[hidden] { display: none; }
#customer-confirm-label b { color: #b4232d; }
#customer-action-result { margin-top: 16px; white-space: pre-wrap; font-size: 13px; line-height: 1.8; }
.customer-action-footer { display: flex; justify-content: flex-end; gap: 10px; padding: 16px 24px; border-top: 1px solid var(--border); }
body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic .list-card { display: flex; flex-direction: column; }
body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic .toolbar { order: 1; flex: none; }
body:is([data-page="platform-customers"], [data-page="platform-support"]) #list-date-controls { order: 2; }
body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic .table-wrap { order: 4; }
body:is([data-page="platform-customers"], [data-page="platform-support"]) #mapping-pagination { order: 5; flex: none; }
body:is([data-page="platform-customers"], [data-page="platform-support"]) #empty-state { order: 6; }
@media (min-width: 1024px) {
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic { height: calc(100dvh - var(--header-height)); min-height: 0; padding-block: 20px; }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic .list-card { flex: 1; min-height: 0; }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic .table-wrap { flex: 1; min-height: 80px; overflow: auto; overscroll-behavior: contain; scrollbar-gutter: stable; scrollbar-width: auto; }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic .table-wrap::-webkit-scrollbar { width: 14px; height: 14px; }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic .table-wrap::-webkit-scrollbar-track { background: #edf1f6; }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic .table-wrap::-webkit-scrollbar-thumb { background: #95a9bf; border: 3px solid #edf1f6; border-radius: 8px; }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic table { min-width: 1640px; }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic thead th { position: sticky; top: 0; z-index: 3; background: #f6f8fc; }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic :is(th, td).customer-select-cell { position: sticky; left: 0; width: 54px; min-width: 54px; padding-inline: 18px; z-index: 2; background: var(--card); }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic :is(th, td).customer-name-cell { position: sticky; left: 0; width: 210px; min-width: 210px; max-width: 240px; white-space: normal !important; overflow-wrap: anywhere; z-index: 2; background: var(--card); box-shadow: 1px 0 0 var(--border); }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic table:has(.customer-select-cell) .customer-name-cell { left: 54px; }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic .customer-selected > td { background: #edf5ff; }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic thead :is(th.customer-select-cell, th.customer-name-cell, th:last-child) { z-index: 4; background: #f6f8fc; }
  body:is([data-page="platform-customers"], [data-page="platform-support"]) #generic #generic-head th:last-child { z-index: 4; background: #f6f8fc; }
}
@media (max-width: 1023px) {
  .customer-selection-bar { align-items: flex-start; }
  .customer-list-help { display: none; }
  .customer-selection-actions { flex-wrap: wrap; }
}

