/*!
 * md-components.css — SHARED Material UI component styles (acg-faka).
 * Extracted from the admin material.css so BOTH the admin AND the buyer/merchant frontend can load
 * the SAME styling for the shared JS components in assets/common/js/ (component.js popup/drawer,
 * form.js fields, table.js bootstrap-table, search.js toolbar, format.js badges) + generic primitives
 * (alerts, tooltips, toasts, select2, layui buttons, .text-* utilities).
 *   • Load AFTER md-tokens.css (this file references the --md-* design tokens).
 *   • All rules are scoped :root[data-theme] — the host page must set <html data-theme="light|dark">.
 * (Admin-shell styles — sidebar/header/layout/stat-cards/config — stay in assets/admin/css/material.css.)
 */

/* ============================================================= *
 * 7. UNIFIED CHIPS — one Material tonal-chip style for every badge
 *    system: .a-badge*, .badge-light-*, .acg-badge, .table-item*.
 *    Clickable action pills (.a-badge-glass) → MUI Outlined 按钮 (further down).
 * ============================================================= */

/* --- base chip shape --- */
:root[data-theme] .a-badge,
:root[data-theme] .acg-badge,
:root[data-theme] .table-item {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 5px;
  padding: 3px 10px;
  font-size: 12px;
  font-weight: 500;
  line-height: 1.6;
  border-radius: var(--md-radius);
  white-space: nowrap;
  vertical-align: middle;
  box-shadow: none !important;
  text-shadow: none !important;
  transition: background-color var(--md-dur-fast) var(--md-ease), border-color var(--md-dur-fast) var(--md-ease);
}
/* status/state badges → OUTLINED (thin semantic border + faint tint + semantic text);
   entity chips (.table-item*: 会员等级/分类/用户 — carry an <img> icon) stay FILLED tonal */
:root[data-theme] .a-badge,
:root[data-theme] .acg-badge { border: 1px solid var(--md-outline); background-color: transparent; color: var(--md-on-surface-med); }
:root[data-theme] .table-item { border: none; background-color: var(--md-hover-overlay); color: var(--md-on-surface-med); }

/* user: 状态 badge 不要单独加图标 — hide font-icons inside status badges (.table-item uses <img>, untouched) */
:root[data-theme] .a-badge > i,
:root[data-theme] .acg-badge > i { display: none !important; }
:root[data-theme] .table-item i { font-size: 12px; }
:root[data-theme] .table-item .table-item-name { color: inherit !important; text-shadow: none !important; font-size: 12px; }

/* --- semantic variants: OUTLINED for status badges (.a-badge .badge-light), FILLED for entity chips (.table-item*) --- */
:root[data-theme] .a-badge-primary,
:root[data-theme] .badge-light-primary { background-color: rgba(var(--md-primary-rgb), .10) !important; border: 1px solid rgba(var(--md-primary-rgb), .45) !important; color: var(--md-primary) !important; }
:root[data-theme] .table-item-cate { background-color: rgba(var(--md-primary-rgb), .12) !important; color: var(--md-primary) !important; }

:root[data-theme] .a-badge-success,
:root[data-theme] .badge-light-success { background-color: rgba(var(--md-success-rgb), .10) !important; border: 1px solid rgba(var(--md-success-rgb), .45) !important; color: var(--md-success) !important; }
:root[data-theme] .table-item-user { background-color: rgba(var(--md-success-rgb), .14) !important; color: var(--md-success) !important; }

:root[data-theme] .a-badge-danger,
:root[data-theme] .badge-light-danger { background-color: rgba(var(--md-error-rgb), .10) !important; border: 1px solid rgba(var(--md-error-rgb), .45) !important; color: var(--md-error) !important; }

:root[data-theme] .a-badge-warning,
:root[data-theme] .badge-light-warning { background-color: rgba(var(--md-warning-rgb), .12) !important; border: 1px solid rgba(var(--md-warning-rgb), .50) !important; color: var(--md-warning) !important; }

:root[data-theme] .a-badge-info,
:root[data-theme] .badge-light-info { background-color: rgba(var(--md-info-rgb), .10) !important; border: 1px solid rgba(var(--md-info-rgb), .45) !important; color: var(--md-info) !important; }

:root[data-theme] .badge-light-cambridgeBlue { background-color: rgba(0, 137, 123, .10) !important; border: 1px solid rgba(0, 137, 123, .45) !important; color: #00897B !important; }

/* neutral / dark variants → outlined neutral */
:root[data-theme] .a-badge-secondary,
:root[data-theme] .a-badge-dark,
:root[data-theme] .a-badge-light,
:root[data-theme] .a-badge-muted,
:root[data-theme] .badge-light-dark { background-color: transparent !important; border: 1px solid var(--md-outline) !important; color: var(--md-on-surface-med) !important; }

/* previously-undefined classes → sensible mappings (no longer "lost") */
:root[data-theme] .a-badge-blue,
:root[data-theme] .a-badge-link { background-color: rgba(var(--md-primary-rgb), .10) !important; border: 1px solid rgba(var(--md-primary-rgb), .45) !important; color: var(--md-primary) !important; }
:root[data-theme] .a-badge-check { background-color: rgba(var(--md-success-rgb), .10) !important; border: 1px solid rgba(var(--md-success-rgb), .45) !important; color: var(--md-success) !important; }
:root[data-theme] .a-badge-dollar { background-color: rgba(var(--md-warning-rgb), .12) !important; border: 1px solid rgba(var(--md-warning-rgb), .50) !important; color: var(--md-warning) !important; }

/* text-color helper spans inside chips shouldn't fight the chip color */
:root[data-theme] .a-badge .text-dark,
:root[data-theme] .table-item .text-dark { color: inherit !important; }

/* --- badge-group wrapper --- */
:root[data-theme] .a-badge-group,
:root[data-theme] .badge-group {
  display: inline-flex; flex-wrap: wrap; gap: 4px; align-items: center;
}

/* --- Bootstrap solid .badge-{color} keep solid fills --- */
:root[data-theme] .badge { border-radius: var(--md-radius); font-weight: 500; }
:root[data-theme] .badge.badge-primary { background-color: var(--md-primary) !important; color: var(--md-on-primary) !important; }
:root[data-theme] .badge.badge-success { background-color: var(--md-success) !important; color: #fff !important; }
:root[data-theme] .badge.badge-danger  { background-color: var(--md-error) !important; color: #fff !important; }

/* --- clickable action pills (.a-badge-glass) → MUI Outlined 按钮(通用,所有表格操作/控制列) ---
   边框/文字都取按钮自身语义色(currentColor,由 .text-primary/.text-success/.text-danger… 决定),
   静止态描边淡一档(~40%)、hover 描边转实 + 同色微染背景。color-mix 不支持的老浏览器回退到实色边+中性 hover。 */
:root[data-theme] .a-badge-glass {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 4px 11px;
  border-radius: var(--md-radius) !important;
  border: 1px solid currentColor !important;
  border-color: color-mix(in srgb, currentColor 40%, transparent) !important;
  background: transparent !important;
  box-shadow: none !important;
  text-shadow: none !important;
  font-weight: 500;
  transition: background-color var(--md-dur-fast) var(--md-ease), border-color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .a-badge-glass:hover,
:root[data-theme] .table .action-col .a-badge-glass:hover {
  background-color: var(--md-hover-overlay) !important;
  background-color: color-mix(in srgb, currentColor 9%, transparent) !important;
  border-color: currentColor !important;
}
:root[data-theme] .table .action-col .a-badge-glass { background: transparent !important; }
/* 纯图标按钮(无文字,.btn-title 为空):去掉 icon 与空 span 之间的 gap,否则右侧多留 5px、图标偏左 */
:root[data-theme] .a-badge-glass:has(.btn-title:empty) { gap: 0; }

/* --- semantic text-color utilities → Material palette (this build hard-codes
 *     Bootstrap defaults like #0d6efd on .text-*, ignoring --bs-* vars) --- */
:root[data-theme] .text-primary { color: var(--md-primary) !important; }
:root[data-theme] .text-success { color: var(--md-success) !important; }
:root[data-theme] .text-danger  { color: var(--md-error) !important; }
:root[data-theme] .text-warning { color: var(--md-warning) !important; }
:root[data-theme] .text-info    { color: var(--md-info) !important; }

/* ============================================================= *
 * 9. Scrollbars / links / dark legibility
 * ============================================================= */
:root[data-theme] ::-webkit-scrollbar { width: 10px; height: 10px; }
:root[data-theme] ::-webkit-scrollbar-track { background: transparent; }
:root[data-theme] ::-webkit-scrollbar-thumb {
  background: var(--md-on-surface-dis);
  border-radius: var(--md-radius-pill);
  border: 2px solid transparent;
  background-clip: content-box;
}
:root[data-theme] ::-webkit-scrollbar-thumb:hover { background: var(--md-on-surface-med); background-clip: content-box; }
:root[data-theme] body { scrollbar-color: var(--md-on-surface-dis) transparent; scrollbar-width: thin; }

:root[data-theme] a { color: var(--md-primary); }
:root[data-theme] .text-hover-primary:hover { color: var(--md-primary) !important; }
/* ============================================================= *
 * PHASE 3 — Forms (Layui) + faithful MUI outlined floating labels
 * ============================================================= */

/* ---- Layer dialog shell (forms live here). Surface bg makes the
 *      floating-label notch seamless; elevation comes from the shadow. ---- */
:root[data-theme] .layui-layer.layui-layer-page,
:root[data-theme] .layui-layer.component-popup,
:root[data-theme] .layui-layer-page {
  background: var(--md-surface) !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  border-radius: var(--md-radius-lg);
  box-shadow: var(--md-e24);
  border: none;
}
:root[data-theme="dark"] .layui-layer.layui-layer-page,
:root[data-theme="dark"] .layui-layer.component-popup { border: 1px solid var(--md-divider); }
:root[data-theme] .layui-layer-page .layui-layer-title {
  background: transparent;
  color: var(--md-on-surface);
  font-weight: 600;
  font-size: 16px;
  border-bottom: 1px solid var(--md-divider);
  /* component.css glass-skin gives the title a 25px radius + card shadow → its corners
     poke OUTSIDE the layer's 12px corners (the "double rounded corner"). Flatten it. */
  border-radius: var(--md-radius-lg) var(--md-radius-lg) 0 0 !important;
  box-shadow: none !important;
}
:root[data-theme] .layui-layer-page .layui-layer-content,
:root[data-theme] .component-popup .layui-card-body { background: var(--md-surface); color: var(--md-on-surface); }
/* 收紧弹窗左右内边距(component.css 原为 35px,偏大 → 内容显得被挤在中间、右侧留白多);
   24px 更紧凑,所有 tab 一致(覆写 component.css,免改打包文件) */
:root[data-theme] .component-popup .layui-card-body { padding-left: 24px !important; padding-right: 24px !important; }
/* 无按钮栏的弹窗(如查看卡密):content 是最底部,它的方角会盖住 layer 的圆角 → 给 content 补底部圆角。
   有 .layui-layer-btn 的弹窗由按钮栏(上面)负责底部圆角,故排除。 */
:root[data-theme] .layui-layer-page:not(:has(.layui-layer-btn)) .layui-layer-content { border-radius: 0 0 var(--md-radius-lg) var(--md-radius-lg); }
:root[data-theme] .layui-layer-page .layui-layer-btn { border-top: 1px solid var(--md-divider); padding: 12px 20px; box-shadow: none !important; border-radius: 0 0 var(--md-radius-lg) var(--md-radius-lg) !important; }
:root[data-theme] .layui-layer-page .layui-layer-btn .layui-layer-btn0 {
  background: var(--md-primary) !important; border-color: var(--md-primary) !important; color: var(--md-on-primary) !important;
  border-radius: var(--md-radius); box-shadow: var(--md-e2); font-weight: 500;
}
:root[data-theme] .layui-layer-page .layui-layer-btn .layui-layer-btn0:hover { background: var(--md-primary-hover); box-shadow: var(--md-e4); }
:root[data-theme] .layui-layer-page .layui-layer-btn .layui-layer-btn1 {
  background: transparent; border: 1px solid var(--md-outline); color: var(--md-on-surface-med) !important;
  border-radius: var(--md-radius);
}
/* popup button icons follow the button's OWN text colour — the defaults hardcode
 * `text-success` (green save) / `text-warning` (orange cancel) which never matched
 * the button or adapted to light/dark. `inherit` fixes every popup at once. */
:root[data-theme] .layui-layer-btn a i,
:root[data-theme] .layui-layer-btn button i { color: inherit !important; }
:root[data-theme] .layui-layer-page .layui-layer-setwin .layui-layer-close { color: var(--md-on-surface-med); }
:root[data-theme] .layui-layer-shade { background-color: var(--md-scrim) !important; }

/* dialog tabs = MUI Tabs — popup tabs are <span> in .layui-layer-title (not <li>) */
:root[data-theme] .layui-layer-tab .layui-layer-title {
  background: var(--md-surface) !important;
  border-bottom: 1px solid var(--md-divider) !important;
}
:root[data-theme] .layui-layer-tab .layui-layer-title span {
  height: 42px !important;
  width: auto !important;          /* layui 基础 CSS 给每个 tab 定死 width:80px → 短标签(控件)右侧空一块;改成按内容自适应 */
  min-width: 0 !important;
  padding: 0 18px !important;
  color: var(--md-on-surface-med) !important;
  font-weight: 500;
  font-size: 14px;
  border: none !important;
  border-radius: 0 !important;
  background: transparent !important;
  position: relative;
  justify-content: center;
  transition: color var(--md-dur-fast) var(--md-ease), background-color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .layui-layer-tab .layui-layer-title span:first-child { padding-left: 20px !important; }
:root[data-theme] .layui-layer-tab .layui-layer-title span i { color: var(--md-on-surface-med) !important; }
:root[data-theme] .layui-layer-tab .layui-layer-title span:hover {
  color: var(--md-on-surface) !important;
  background: var(--md-hover-overlay) !important;
}
:root[data-theme] .layui-layer-tab .layui-layer-title span.layui-this {
  color: var(--md-primary) !important;
  background: transparent !important;
  border-radius: 0 !important;
}
:root[data-theme] .layui-layer-tab .layui-layer-title span.layui-this i { color: var(--md-primary) !important; }
:root[data-theme] .layui-layer-tab .layui-layer-title span.layui-this::after {
  content: "";
  position: absolute;
  left: 14px; right: 14px; bottom: 0;
  height: 2px;
  background: var(--md-primary);
  border-radius: 2px 2px 0 0;
}

/* ===== Right-side drawer variant of the popup form (opt.drawer:true) — identical
 *       component / tabs / submit as the modal; only the presentation differs. ===== */
:root[data-theme] .layui-layer.component-drawer {
  right: 0 !important; left: auto !important; top: 0 !important;   /* flush to the right edge */
  height: 100vh !important;
  border-radius: var(--md-radius-lg) 0 0 var(--md-radius-lg) !important;
  box-shadow: -12px 0 44px rgba(0,0,0,.32) !important;
  display: flex !important;
  flex-direction: column;
  max-height: 100vh;
  overflow: visible;
  animation: md-drawer-in var(--md-dur) var(--md-ease);
}
:root[data-theme="dark"] .layui-layer.component-drawer { border: 1px solid var(--md-divider); border-right: none; }
/* title / tab-strip pinned top, content scrolls, footer pinned bottom */
:root[data-theme] .component-drawer .layui-layer-title { flex: 0 0 auto; }
:root[data-theme] .component-drawer .layui-layer-content {
  flex: 1 1 auto !important;
  height: auto !important;
  max-height: none !important;
  overflow-y: auto !important;
}
:root[data-theme] .component-drawer .layui-layer-btn { flex: 0 0 auto; margin: 0 !important; }
/* many-tab support: the narrower drawer can't fit 8 tabs on one row, so wrap the tab
 * strip to multiple rows (keeps EVERY tab visible instead of clipping the overflow). */
:root[data-theme] .component-drawer.layui-layer-tab .layui-layer-title {
  display: flex !important;
  flex-wrap: wrap;
  height: auto !important;
  min-height: 42px;
  align-content: flex-start;
  padding-right: 40px;                 /* keep row-1 tabs clear of the close button */
  overflow: visible !important;
}
:root[data-theme] .component-drawer.layui-layer-tab .layui-layer-title span { float: none !important; }
/* slide in / out from the right (layer's own anim disabled via anim:-1 in JS) */
@keyframes md-drawer-in  { from { transform: translateX(100%); } to { transform: translateX(0); } }
@keyframes md-drawer-out { from { transform: translateX(0); } to { transform: translateX(100%); } }
:root[data-theme] .layui-layer.component-drawer.layer-anim-close { animation: md-drawer-out var(--md-dur) var(--md-ease) forwards; }

/* ---- Layui inputs / textarea — MUI outlined ---- */
:root[data-theme] .layui-input,
:root[data-theme] .layui-textarea,
:root[data-theme] .layui-select {
  background: transparent !important;                 /* defeat component.css glass !important */
  border: 1px solid var(--md-outline) !important;
  border-radius: var(--md-radius) !important;
  color: var(--md-on-surface);
  transition: border-color var(--md-dur-fast) var(--md-ease), box-shadow var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .layui-input::placeholder,
:root[data-theme] .layui-textarea::placeholder { color: var(--md-on-surface-dis); }
:root[data-theme] .layui-input:hover,
:root[data-theme] .layui-textarea:hover { border-color: var(--md-on-surface); }
:root[data-theme] .layui-input:focus,
:root[data-theme] .layui-textarea:focus,
:root[data-theme] .layui-input.layui-input-focus {
  border-color: var(--md-primary);
  box-shadow: 0 0 0 1px var(--md-primary);
  outline: none;
}
:root[data-theme] .layui-input:-webkit-autofill {
  -webkit-text-fill-color: var(--md-on-surface);
  -webkit-box-shadow: 0 0 0 1000px var(--md-surface) inset;
  caret-color: var(--md-on-surface);
}

/* ===== Custom control (控件) builder — card-per-control, labeled fields ===== */
/* neutralise the legacy component.css inline layout (fixed pixel widths / dashed line) */
:root[data-theme] .widget-general { width: 100% !important; display: block; }
:root[data-theme] .widget-w120, :root[data-theme] .widget-w140,
:root[data-theme] .widget-w160, :root[data-theme] .widget-w180 { width: 100% !important; }
/* card (the 1px solid border replaces the old dashed red separator) */
:root[data-theme] .widget-block {
  background: var(--md-surface-2);
  border: 1px solid var(--md-divider) !important;
  border-radius: var(--md-radius-lg);
  padding: 14px 16px 16px;
  margin-bottom: 12px !important;
}
/* header: title + delete icon-button */
:root[data-theme] .widget-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
:root[data-theme] .widget-title { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 600; color: var(--md-on-surface-med); }
:root[data-theme] .widget-title i { color: var(--md-primary); font-size: 15px; }
:root[data-theme] .widget-btn {
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; border-radius: 8px; cursor: pointer;
  color: var(--md-on-surface-med);
  transition: background-color var(--md-dur-fast) var(--md-ease), color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .widget-del:hover { background: rgba(var(--md-error-rgb), .12); color: var(--md-error); }
/* labeled fields grid */
:root[data-theme] .widget-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 12px; }
/* labeled fields → MUI outlined "notched" floating label (matches the rest of the admin's inputs).
   .widget-data-field is excluded — it wraps the option editor, not one input. */
:root[data-theme] .widget-field:not(.widget-data-field) { position: relative; display: block; min-width: 0; }
:root[data-theme] .widget-field:not(.widget-data-field) > label {
  position: absolute; left: 8px; top: 50%; transform: translateY(-50%);
  transform-origin: left center; z-index: 1; margin: 0; padding: 0 4px;
  font-size: 14px; line-height: 1; font-weight: 400;
  color: var(--md-on-surface-med); pointer-events: none; background: transparent;
  max-width: calc(100% - 22px); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  transition: top var(--md-dur-fast) var(--md-ease), transform var(--md-dur-fast) var(--md-ease),
              color var(--md-dur-fast) var(--md-ease), background-color var(--md-dur-fast) var(--md-ease);
}
/* lift on focus, when filled (input showing a value), or for a <select> field (always has a value) */
:root[data-theme] .widget-field:not(.widget-data-field):focus-within > label,
:root[data-theme] .widget-field:not(.widget-data-field):has(> .layui-input:not(:placeholder-shown)) > label,
:root[data-theme] .widget-field:not(.widget-data-field):has(.widget-general) > label {
  top: 0; transform: translateY(-50%) scale(.82); background: var(--md-surface-2);
}
:root[data-theme] .widget-field:not(.widget-data-field):focus-within > label { color: var(--md-primary); }
/* the config-data field keeps a plain label above its option editor */
:root[data-theme] .widget-data-field > label { display: block; margin-bottom: 8px; font-size: 12px; font-weight: 500; color: var(--md-on-surface-med); }
:root[data-theme] .widget-field .layui-input,
:root[data-theme] .widget-field .layui-textarea,
:root[data-theme] .widget-field .widget-general,
:root[data-theme] .widget-field .layui-form-select { width: 100% !important; }
/* config-data field (下拉/多选/单选 only) */
:root[data-theme] .widget-data-field { margin-top: 12px; }
/* visual option editor (下拉/多选/单选 options): rows of 显示名称 + 值 */
:root[data-theme] .widget-options { display: flex; flex-direction: column; gap: 8px; margin-bottom: 8px; }
:root[data-theme] .widget-option-row { display: grid; grid-template-columns: 1fr 1fr 30px; gap: 8px; align-items: center; }
:root[data-theme] .widget-option-row .layui-input { width: 100% !important; }
:root[data-theme] .widget-opt-del:hover { background: rgba(var(--md-error-rgb), .12); color: var(--md-error); }
:root[data-theme] .widget-option-add {
  display: inline-flex; align-items: center; gap: 6px;
  cursor: pointer; user-select: none;
  font-size: 12.5px; font-weight: 500; color: var(--md-primary);
  padding: 5px 8px; border-radius: var(--md-radius);
  transition: background-color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .widget-option-add:hover { background: rgba(var(--md-primary-rgb), .08); }
/* floating-label fields: placeholder appears only once the label has lifted (on focus) — the
 * label itself sits inside the empty field acting as the placeholder. Option-row inputs have no
 * label, so they keep their placeholders always visible. (Both override material.js's .mui-float
 * transparent-placeholder rule per-state.) */
:root[data-theme] .widget-field:not(.widget-data-field) > .layui-input::placeholder,
:root[data-theme] .widget-field:not(.widget-data-field) > .layui-textarea::placeholder { color: transparent !important; }
:root[data-theme] .widget-field:not(.widget-data-field):focus-within > .layui-input::placeholder,
:root[data-theme] .widget-field:not(.widget-data-field):focus-within > .layui-textarea::placeholder { color: var(--md-on-surface-dis) !important; }
/* only the ACTUALLY-focused widget input shows the blue focus ring. material.js marks the whole
 * widget form-item .mui-focused (it holds many inputs), which would otherwise ring every input. */
:root[data-theme] .mui-focused .widget-block .layui-input:not(:focus),
:root[data-theme] .mui-focused .widget-block .layui-textarea:not(:focus) { box-shadow: none !important; }
/* advanced collapse (正则/error) */
:root[data-theme] .widget-advanced { margin-top: 14px; border-top: 1px solid var(--md-divider); padding-top: 10px; }
:root[data-theme] .widget-advanced-toggle {
  display: inline-flex; align-items: center; gap: 6px; cursor: pointer; user-select: none;
  font-size: 12.5px; font-weight: 500; color: var(--md-on-surface-med);
  transition: color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .widget-advanced-toggle:hover { color: var(--md-primary); }
:root[data-theme] .widget-advanced-toggle i { font-size: 12px; transition: transform var(--md-dur) var(--md-ease); }
:root[data-theme] .widget-advanced.open .widget-advanced-toggle i { transform: rotate(90deg); }
:root[data-theme] .widget-advanced-body { max-height: 0; overflow: hidden; transition: max-height var(--md-dur) var(--md-ease); }
/* once expanded, drop overflow:hidden (delayed to the end of the expand) so focused inputs'
 * blue focus ring isn't clipped on the left/right/bottom; on collapse it hides immediately */
:root[data-theme] .widget-advanced.open .widget-advanced-body {
  max-height: 320px; margin-top: 12px; overflow: visible;
  transition: max-height var(--md-dur) var(--md-ease), overflow 0s var(--md-dur);
}
/* add-control button */
:root[data-theme] .widget-add-control {
  display: inline-flex; align-items: center; gap: 6px;
  margin: 2px 0 4px; padding: 9px 18px;
  border: 1px dashed var(--md-outline); border-radius: var(--md-radius);
  background: transparent; color: var(--md-primary);
  font-size: 13px; font-weight: 500; cursor: pointer;
  transition: background-color var(--md-dur-fast) var(--md-ease), border-color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .widget-add-control:hover { background: rgba(var(--md-primary-rgb), .08); border-color: var(--md-primary); }

/* flatten the form-pane side-label box (fallback for non-floating fields) */
:root[data-theme] .layui-form-pane .layui-form-label {
  background: transparent;
  border-right: none;
  color: var(--md-on-surface-med);
}
:root[data-theme] .layui-form-pane .layui-form-item { border: none; }
:root[data-theme] .layui-form-item { margin-bottom: 18px; }

/* ---- Faithful MUI outlined + floating label ---- */
:root[data-theme] .layui-form-item.mui-float { position: relative; margin-bottom: 22px; }
:root[data-theme] .mui-float .layui-input-block { margin-left: 0 !important; }
:root[data-theme] .mui-float > .layui-form-label {
  position: absolute;
  left: 10px; top: 9px;
  width: auto; max-width: calc(100% - 28px);
  margin: 0; padding: 0 4px;
  float: none; text-align: left;
  font-size: 14px; line-height: 20px; height: auto;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  color: var(--md-on-surface-med);
  background: var(--md-surface);
  pointer-events: none;
  transform-origin: left top;
  transition: transform var(--md-dur-fast) var(--md-ease), color var(--md-dur-fast) var(--md-ease);
  z-index: 2;
}
:root[data-theme] .mui-float.mui-focused > .layui-form-label,
:root[data-theme] .mui-float.mui-filled > .layui-form-label {
  transform: translateY(-18px) scale(.75);
  color: var(--md-primary);
}
:root[data-theme] .mui-float.mui-filled:not(.mui-focused) > .layui-form-label { color: var(--md-on-surface-med); }
/* the label doubles as the placeholder while resting → hide native placeholder */
:root[data-theme] .mui-float .layui-input::placeholder,
:root[data-theme] .mui-float .layui-textarea::placeholder { color: transparent; }
:root[data-theme] .mui-float.mui-focused .layui-input::placeholder,
:root[data-theme] .mui-float.mui-focused .layui-textarea::placeholder { color: var(--md-on-surface-dis); }
/* focused outline = 2px primary (emulate MUI notched outline weight) */
:root[data-theme] .mui-float.mui-focused .layui-input,
:root[data-theme] .mui-float.mui-focused .layui-textarea { box-shadow: 0 0 0 1px var(--md-primary); }

/* ---- Layui select + dropdown panel ---- */
:root[data-theme] .layui-form-select dl {
  background: var(--md-surface-2) !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  border: 1px solid var(--md-divider);
  border-radius: var(--md-radius);
  box-shadow: var(--md-e8);
  padding: 4px 0;
  overflow-x: hidden;
}
/* long options wrap within the dropdown instead of forcing a horizontal scrollbar */
:root[data-theme] .layui-form-select dl dd {
  color: var(--md-on-surface);
  white-space: normal;
  word-break: break-word;
  line-height: 1.6;
  height: auto;
  padding: 7px 15px;
}
:root[data-theme] .layui-form-select dl dd:hover { background: var(--md-hover-overlay) !important; box-shadow: none !important; }
:root[data-theme] .layui-form-select dl dd.layui-this { background: var(--md-selected-overlay) !important; box-shadow: none !important; color: var(--md-primary); }
:root[data-theme] .layui-form-select .layui-edge { border-top-color: var(--md-on-surface-med); }

/* ---- Select2 ---- */
:root[data-theme] .select2-container--default .select2-selection--single,
:root[data-theme] .select2-container--default .select2-selection--multiple {
  background: transparent; border: 1px solid var(--md-outline); border-radius: var(--md-radius);
}
:root[data-theme] .select2-container--default .select2-selection--single .select2-selection__rendered { color: var(--md-on-surface); }
:root[data-theme] .select2-container--default.select2-container--open .select2-selection { border-color: var(--md-primary); box-shadow: 0 0 0 1px var(--md-primary); }
:root[data-theme] .select2-dropdown { background: var(--md-surface-2); border: 1px solid var(--md-divider); border-radius: var(--md-radius-lg); box-shadow: var(--md-e8); overflow: hidden; }
:root[data-theme] .select2-dropdown .select2-results__options { padding: 6px; }
:root[data-theme] .select2-results__option { color: var(--md-on-surface); padding: 9px 12px; border-radius: var(--md-radius); font-size: 14px; transition: background-color var(--md-dur-fast) var(--md-ease); }
:root[data-theme] .select2-container--default .select2-results__option[aria-selected="true"] { background: rgba(var(--md-primary-rgb), .10); color: var(--md-on-surface); font-weight: 500; }
:root[data-theme] .select2-container--default .select2-results__option--highlighted[aria-selected] { background: rgba(var(--md-primary-rgb), .18) !important; color: var(--md-on-surface) !important; }
:root[data-theme] .select2-container--default .select2-search--dropdown .select2-search__field { background: transparent; color: var(--md-on-surface); border: 1px solid var(--md-outline); border-radius: var(--md-radius); }

/* ---- Layui switch → authentic MD2 Switch (thin track + overhanging thumb) ---- */
:root[data-theme] .layui-form-switch {
  position: relative;
  display: inline-block;
  box-sizing: border-box;
  min-width: 36px; width: 36px; height: 14px; line-height: normal;
  border: none; border-radius: 7px; padding: 0; margin: 6px 0;
  vertical-align: middle;
  background-color: var(--md-on-surface-dis) !important;
  cursor: pointer;
  transition: background-color var(--md-dur) var(--md-ease);
}
/* hide the ON/OFF state text (rendered as a <div> or <em> depending on layui version) */
:root[data-theme] .layui-form-switch > div,
:root[data-theme] .layui-form-switch em { display: none !important; }
/* thumb overhangs the track (MD2 look); shadow for elevation */
:root[data-theme] .layui-form-switch i {
  display: block !important;
  position: absolute; width: 20px; height: 20px; top: 50%; left: 0 !important; right: auto;
  margin: 0; border: none; transform: translateY(-50%);
  border-radius: 50%; background-color: #fff; box-shadow: var(--md-e2);
  transition: left var(--md-dur) var(--md-ease), background-color var(--md-dur) var(--md-ease);
}
:root[data-theme] .layui-form-onswitch { background-color: rgba(var(--md-primary-rgb), .5) !important; }
:root[data-theme] .layui-form-onswitch i { left: 16px !important; background-color: var(--md-primary); }

/* ---- Layui checkbox / radio → MUI ---- */
:root[data-theme] .layui-form-checkbox[lay-skin="primary"] i { border: 2px solid var(--md-on-surface-med); border-radius: 3px; color: transparent; }
:root[data-theme] .layui-form-checked[lay-skin="primary"] i { background-color: var(--md-primary) !important; border-color: var(--md-primary) !important; color: #fff !important; }
:root[data-theme] .layui-form-checkbox.layui-form-checked span,
:root[data-theme] .layui-form-checkbox span { color: var(--md-on-surface); }
/* radio → CSS-drawn MUI radio (ring + inner dot); layui's glyph <i> is hidden via font-size:0 */
:root[data-theme] .layui-form-radio { display: inline-flex; align-items: center; padding: 6px 0; margin: 0 22px 0 0; line-height: normal; }
:root[data-theme] .layui-form-radio > i {
  font-size: 0 !important;
  display: inline-block; box-sizing: border-box; flex: 0 0 auto;
  width: 18px; height: 18px; margin: 0 8px 0 0;
  border: 2px solid var(--md-on-surface-med); border-radius: 50%;
  position: relative; background: transparent;
  transition: border-color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .layui-form-radio > i::after {
  content: ""; position: absolute; top: 50%; left: 50%;
  width: 10px; height: 10px; border-radius: 50%; background: var(--md-primary);
  transform: translate(-50%, -50%) scale(0);
  transition: transform var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .layui-form-radio:hover > i { border-color: var(--md-primary); }
:root[data-theme] .layui-form-radioed > i { border-color: var(--md-primary) !important; }
:root[data-theme] .layui-form-radioed > i::after { transform: translate(-50%, -50%) scale(1); }
:root[data-theme] .layui-form-radio > div { color: var(--md-on-surface); font-size: 14px; line-height: 1; }

/* ---- popup form: non-floating rows and rich controls → stacked caption label on top
        (consistent with the floating-label text inputs; kills layui's dated left-label gap).
        `:not(.hide)` is CRITICAL: a `type:custom` field whose content contains switches (e.g. the
        商品 会员等级 table's 绝对显示 column) also matches :has(.layui-form-switch); without :not(.hide)
        this rule's display:block would override .hide{display:none} on that field's title-less label
        and reveal a literal "undefined" (form.title is undefined). ---- */
:root[data-theme] .component-popup .layui-form-item:has(.layui-form-radio) > .layui-form-label:not(.hide),
:root[data-theme] .component-popup .layui-form-item:has(.layui-form-switch) > .layui-form-label:not(.hide),
:root[data-theme] .component-popup .layui-form-item:has(.layui-form-checkbox) > .layui-form-label:not(.hide),
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > .ev2-editor) > .layui-form-label:not(.hide),
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > .editor-wrapper) > .layui-form-label:not(.hide) {
  display: block; float: none; text-align: left;
  width: auto; max-width: 100%; height: auto;
  margin: 0; padding: 0 0 8px 1px;
  position: static; z-index: auto;
  overflow: visible; white-space: normal; text-overflow: clip;
  background: transparent;
  font-size: 12.5px; line-height: 1.4; font-weight: 500;
  color: var(--md-on-surface-med);
  pointer-events: auto; transform: none; transform-origin: initial;
}
:root[data-theme] .component-popup .layui-form-item:has(.layui-form-radio) > .layui-input-block,
:root[data-theme] .component-popup .layui-form-item:has(.layui-form-switch) > .layui-input-block,
:root[data-theme] .component-popup .layui-form-item:has(.layui-form-checkbox) > .layui-input-block,
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > .ev2-editor) > .layui-input-block,
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > .editor-wrapper) > .layui-input-block,
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block {
  margin-left: 0 !important; min-height: 0;
}
/* radio group items sit in a tidy row */
:root[data-theme] .component-popup .layui-form-item:has(.layui-form-radio) > .layui-input-block { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 4px; }

/* popup xm-select / remoteSelect follows the same MUI field states as an input:
   empty = caption inside, focused/open/selected = caption in the outline notch. */
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) {
  position: relative; margin-bottom: 22px;
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-form-label:not(.hide) {
  position: absolute; z-index: 2;
  left: 10px; top: 9px;
  float: none; width: auto; max-width: calc(100% - 28px); height: auto;
  margin: 0; padding: 0 4px;
  overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
  color: var(--md-on-surface-med); background: var(--md-surface);
  font-size: 14px; line-height: 20px; text-align: left;
  pointer-events: none; transform: none; transform-origin: left top;
  transition: top var(--md-dur-fast) var(--md-ease),
              transform var(--md-dur-fast) var(--md-ease),
              color var(--md-dur-fast) var(--md-ease),
              background-color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select):focus-within > .layui-form-label:not(.hide),
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select.xm-select-show) > .layui-form-label:not(.hide),
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select .xm-label-block) > .layui-form-label:not(.hide) {
  transform: translateY(-18px) scale(.75);
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select):focus-within > .layui-form-label:not(.hide),
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select.xm-select-show) > .layui-form-label:not(.hide) {
  color: var(--md-primary);
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block > xm-select {
  box-sizing: border-box;
  height: 38px !important; min-height: 38px !important; line-height: 38px !important;
  border: 1px solid var(--md-outline); border-radius: var(--md-radius);
  background: transparent !important; color: var(--md-on-surface);
  font-size: 13px;
  transition: border-color var(--md-dur-fast) var(--md-ease), box-shadow var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block > xm-select > .xm-label,
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block > xm-select > .xm-label > .scroll,
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block > xm-select > .xm-label .label-content {
  box-sizing: border-box; height: 36px; min-height: 36px; align-items: center;
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block > xm-select .xm-label .xm-label-block {
  display: inline-flex;
  max-width: 100%; min-width: 0;
  height: 26px; min-height: 26px;
  align-items: center !important;
  line-height: 1 !important;
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block > xm-select .xm-label .xm-label-block > span {
  display: inline-flex !important;
  width: auto !important; min-width: 0; height: 100% !important;
  flex: 1 1 auto; align-items: center;
  overflow: hidden;
  line-height: 1.35 !important;
  text-overflow: ellipsis; white-space: nowrap;
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block > xm-select .xm-label .xm-label-block > i {
  display: inline-flex !important;
  width: 20px; height: 100% !important;
  flex: 0 0 20px; align-items: center; justify-content: center;
  margin-left: 4px;
  line-height: 1 !important;
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block > xm-select .xm-label .xm-label-block > i::before {
  display: block;
  line-height: 1;
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block > xm-select > .xm-tips {
  height: 36px; padding: 0 42px 0 10px !important;
  color: transparent !important; font-size: 13px; line-height: 36px;
  opacity: 0;
  transition: color var(--md-dur-fast) var(--md-ease), opacity var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select):focus-within > .layui-input-block > xm-select > .xm-tips,
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select.xm-select-show) > .layui-input-block > xm-select > .xm-tips {
  color: var(--md-on-surface-dis) !important; opacity: 1;
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block > xm-select > .xm-icon {
  top: 50% !important; right: 10px; margin-top: -6px;
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block > xm-select > .xm-body.absolute:not(.up) {
  top: calc(100% + 4px) !important; bottom: auto !important;
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select) > .layui-input-block > xm-select > .xm-body.absolute.up {
  top: auto !important; bottom: calc(100% + 4px) !important;
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select):hover > .layui-input-block > xm-select {
  border-color: var(--md-on-surface);
}
:root[data-theme] .component-popup .layui-form-item:has(> .layui-input-block > xm-select):focus-within > .layui-input-block > xm-select {
  border-color: var(--md-primary) !important; box-shadow: 0 0 0 1px var(--md-primary);
}

/* ---- popup image / file upload → MUI (stacked caption + clean drop-zone / preview) ---- */
/* label → caption on top (image/file rows are blocked from float, like radio/switch) */
:root[data-theme] .component-popup .layui-form-item:has(.image-render) > .layui-form-label:not(.hide),
:root[data-theme] .component-popup .layui-form-item:has(.file-render) > .layui-form-label:not(.hide) {
  display: block; float: none; text-align: left;
  width: auto; max-width: 100%; height: auto;
  margin: 0; padding: 0 0 8px 1px;
  font-size: 12.5px; line-height: 1.4; font-weight: 500; color: var(--md-on-surface-med);
}
:root[data-theme] .component-popup .layui-form-item:has(.image-render) > .layui-input-block,
:root[data-theme] .component-popup .layui-form-item:has(.file-render) > .layui-input-block { margin-left: 0 !important; min-height: 0; }
/* the album / external-url action icons in the caption → uniform muted icon-buttons */
:root[data-theme] .component-popup .photo-album,
:root[data-theme] .component-popup .external-input {
  display: inline-flex !important; align-items: center; justify-content: center;
  width: 24px; height: 24px; border-radius: 50%; margin-left: 4px !important; top: 0 !important;
  vertical-align: middle; transition: background-color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .component-popup .photo-album:hover,
:root[data-theme] .component-popup .external-input:hover { background: var(--md-hover-overlay); }
:root[data-theme] .component-popup .photo-album i,
:root[data-theme] .component-popup .external-input i {
  color: var(--md-on-surface-med) !important; font-size: 15px !important; margin: 0 !important;
  --fa-primary-color: currentColor; --fa-secondary-color: currentColor; --fa-secondary-opacity: .38;
}
:root[data-theme] .component-popup .photo-album:hover i,
:root[data-theme] .component-popup .external-input:hover i { color: var(--md-primary) !important; }
/* filled image preview → clean rounded card (kill the glass drop-shadow) */
:root[data-theme] .component-popup .image-render img.image-upload {
  height: auto !important; width: auto; max-height: 108px; max-width: 100%;
  border-radius: var(--md-radius-lg); border: 1px solid var(--md-divider);
  box-shadow: none !important; cursor: pointer; display: block;
  transition: border-color var(--md-dur-fast) var(--md-ease), opacity var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .component-popup .image-render img.image-upload:hover { border-color: var(--md-primary); opacity: .88; }
/* empty image state → dashed MUI drop-zone */
:root[data-theme] .component-popup .image-render .btn-upload {
  display: inline-flex !important; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
  width: 108px; height: 108px; padding: 0 !important;
  background: transparent !important; box-shadow: none !important;
  border: 1.5px dashed var(--md-outline) !important; border-radius: var(--md-radius-lg) !important;
  color: var(--md-on-surface-med) !important; font-size: 12.5px; font-weight: 500; line-height: 1.3;
  transition: border-color var(--md-dur-fast) var(--md-ease), background-color var(--md-dur-fast) var(--md-ease), color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .component-popup .image-render .btn-upload:hover { border-color: var(--md-primary) !important; background: rgba(var(--md-primary-rgb), .05) !important; color: var(--md-primary) !important; }
:root[data-theme] .component-popup .image-render .btn-upload i {
  color: inherit !important; font-size: 20px !important; margin: 0 !important;
  --fa-primary-color: currentColor; --fa-secondary-color: currentColor; --fa-secondary-opacity: 1;
}
/* file upload → MUI outlined button */
:root[data-theme] .component-popup .file-render .file-upload {
  display: inline-flex !important; align-items: center; gap: 8px; height: auto !important;
  padding: 8px 16px !important; min-width: 0;
  background: transparent !important; box-shadow: none !important;
  border: 1px solid var(--md-outline) !important; border-radius: var(--md-radius) !important;
  color: var(--md-on-surface-med) !important; font-size: 13px; font-weight: 500;
  transition: border-color var(--md-dur-fast) var(--md-ease), background-color var(--md-dur-fast) var(--md-ease), color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .component-popup .file-render .file-upload:hover { border-color: var(--md-primary) !important; background: rgba(var(--md-primary-rgb), .05) !important; color: var(--md-primary) !important; }
:root[data-theme] .component-popup .file-render .file-upload i { color: inherit !important; --fa-primary-color: currentColor; --fa-secondary-color: currentColor; --fa-secondary-opacity: 1; }

/* ---- 相册 (photo-album picker) → centered grid + rounded bottom corners ---- */
/* the album content is overflow:auto with radius 0 → its square bottom corners poked
   inside the layer's 12px corners; round them (scoped to the album popup only). */
:root[data-theme] .component-popup:has(.photo-album-selected) .layui-layer-content { border-radius: 0 0 var(--md-radius-lg) var(--md-radius-lg); }
/* centre the thumbnail grid (was flex-start → left-aligned with a right gap) */
:root[data-theme] #photo-album-table,
:root[data-theme] #photo-album-table tbody { justify-content: center !important; }
:root[data-theme] #photo-album-table img { border-radius: var(--md-radius); }
:root[data-theme] #photo-album-table img:hover { transform: scale(1.06); }

/* ---- treeSelect (layui.treeSelect + zTree) → MUI dropdown ---- */
/* panel: kill the glass/blur skin (component.css `#e2e2e266` + blur) → solid MUI surface */
:root[data-theme] .layui-treeSelect.layui-form-select .layui-anim,
:root[data-theme] .layui-treeSelect .layui-anim {
  background: var(--md-surface-2) !important;
  backdrop-filter: none !important; -webkit-backdrop-filter: none !important;
  border: 1px solid var(--md-divider) !important;
  border-radius: var(--md-radius-lg) !important;
  box-shadow: var(--md-e8) !important;
  padding: 6px !important;
}
:root[data-theme] .layui-treeSelect .ztree { background: transparent; padding: 0; margin: 0; }
:root[data-theme] .layui-treeSelect .ztree li { line-height: normal; }
:root[data-theme] .layui-treeSelect .ztree li ul { padding: 0 0 0 18px; margin: 0; background: none !important; }
/* node link → MUI row (color, hover overlay, rounded); override zTree's default text + yellow hover */
:root[data-theme] .layui-treeSelect .ztree li a {
  color: var(--md-on-surface) !important;
  height: auto; min-height: 20px; line-height: 20px;
  padding: 4px 8px; margin: 1px 2px 1px 0;
  border: none !important; border-radius: var(--md-radius);
  display: inline-block; vertical-align: middle; width: auto;
  transition: background-color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .layui-treeSelect .ztree li a:hover {
  background: var(--md-hover-overlay) !important; color: var(--md-on-surface) !important;
  text-decoration: none !important; border: none !important;
}
:root[data-theme] .layui-treeSelect .ztree li a.curSelectedNode,
:root[data-theme] .layui-treeSelect .ztree li a.curSelectedNode:hover {
  background: rgba(var(--md-primary-rgb), .12) !important;
  color: var(--md-primary) !important; font-weight: 500 !important; border: none !important;
}
:root[data-theme] .layui-treeSelect .ztree li a .node_name { font-size: 14px; }
/* hide the leaf file glyph (layui draws a file icon on ico_docu::before) → clean text tree */
:root[data-theme] .layui-treeSelect .ztree li a span.button.ico_open,
:root[data-theme] .layui-treeSelect .ztree li a span.button.ico_close,
:root[data-theme] .layui-treeSelect .ztree li a span.button.ico_docu { display: none !important; }
/* expand/collapse arrow → 优雅可旋转的 chevron(前后台 + 明暗通用).
   layui.treeSelect(tree.select.js 注入的 <style ztree>)在 .switch::before 上画的是**实心** layui-icon
   三角(\e623 收起▶ / \e625 展开▼)。这里把那个字形清空(content:'' 靠 !important 压过注入的非 !important 规则),
   在**同一个 ::before** 上用 CSS 边框画一条细 chevron —— 不叠加第二个伪元素(叠加正是当年的「双箭头」bug)。
   只给父节点的开合态(root/roots/center/bottom/noline 的 _open/_close)画箭头;叶子节点(_docu)保持无箭头。 */
:root[data-theme] .layui-treeSelect .ztree li span.button.switch {
  position: relative; top: 0 !important;
  width: 20px; height: 20px; vertical-align: middle;
  background: none !important;
}
/* 收起态 → chevron 指向右(›) */
:root[data-theme] .layui-treeSelect .ztree li span.button.root_close::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.roots_close::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.center_close::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.bottom_close::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.noline_close::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.root_open::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.roots_open::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.center_open::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.bottom_open::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.noline_open::before {
  content: "" !important;
  position: absolute; top: 50%; left: 50%;
  width: 6px; height: 6px; box-sizing: border-box;
  border: 1.5px solid var(--md-on-surface-med);
  border-top: 0; border-left: 0; border-radius: 0 0 1.5px 0;
  transform: translate(-60%, -50%) rotate(-45deg);
  transform-origin: center;
  transition: transform .24s cubic-bezier(.4, 0, .2, 1),
              border-color var(--md-dur-fast, .15s) var(--md-ease, ease);
}
/* 展开态 → chevron 旋转到指向下(⌄) */
:root[data-theme] .layui-treeSelect .ztree li span.button.root_open::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.roots_open::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.center_open::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.bottom_open::before,
:root[data-theme] .layui-treeSelect .ztree li span.button.noline_open::before {
  transform: translate(-50%, -60%) rotate(45deg);
}
/* 悬停箭头本身时略微加深 */
:root[data-theme] .layui-treeSelect .ztree li span.button.switch:hover::before {
  border-color: var(--md-on-surface) !important;
}

/* ---- 树形表格(jquery.treegrid)展开箭头 → 与 treeSelect 同款旋转 chevron(前后台 + 明暗) ---- */
/* 表格树(category 等)由 table.js setTree() → $.treegrid() 渲染,展开器结构:
   <span class="treegrid-expander treegrid-expander-expanded"><i class="fa-...-chevrons-down"></i></span>
   插件默认塞了个 FontAwesome 双箭头(fa-chevrons-*)在 vendor 压缩包里(不改它)。这里隐藏那个 <i> 字形,
   在 .treegrid-expander 上画一条会旋转的边框 chevron(几何同上面的 treeSelect,视觉统一)。
   只画开合态(-collapsed/-expanded);叶子/子行是无后缀的 .treegrid-expander(空,只占位) → 不画。 */
:root[data-theme] .treegrid-expander > i { display: none !important; }
:root[data-theme] .treegrid-expander-collapsed::before,
:root[data-theme] .treegrid-expander-expanded::before {
  content: ""; display: inline-block; box-sizing: border-box;
  width: 6px; height: 6px;
  border: 1.5px solid var(--md-on-surface-med);
  border-top: 0; border-left: 0; border-radius: 0 0 1.5px 0;
  transform: rotate(-45deg);
  transition: transform .24s cubic-bezier(.4, 0, .2, 1),
              border-color var(--md-dur-fast, .15s) var(--md-ease, ease);
  vertical-align: middle; margin: 0 8px 2px 3px;
}
:root[data-theme] .treegrid-expander-expanded::before { transform: rotate(45deg); }
:root[data-theme] .treegrid-expander:hover::before { border-color: var(--md-on-surface) !important; }

/* ---- laydate date-picker panel ---- */
:root[data-theme] .layui-laydate { border: none; border-radius: var(--md-radius-lg); box-shadow: var(--md-e8); }
:root[data-theme] .layui-laydate .layui-laydate-main { background: var(--md-surface-2); border-radius: var(--md-radius-lg); }
:root[data-theme] .layui-laydate .layui-laydate-header { border-bottom: 1px solid var(--md-divider); color: var(--md-on-surface); }
:root[data-theme] .layui-laydate .layui-laydate-header i,
:root[data-theme] .layui-laydate .layui-laydate-header span { color: var(--md-on-surface-med); }
:root[data-theme] .layui-laydate .layui-laydate-content th { color: var(--md-on-surface-med); }
:root[data-theme] .layui-laydate .layui-laydate-content td { color: var(--md-on-surface); }
:root[data-theme] .layui-laydate .layui-laydate-content td:hover { background: var(--md-hover-overlay); }
:root[data-theme] .layui-laydate .layui-laydate-content td.laydate-selected { background: var(--md-selected-overlay); color: var(--md-primary); }
:root[data-theme] .layui-laydate .layui-laydate-content td.layui-this { background: var(--md-primary) !important; color: var(--md-on-primary) !important; border-radius: 50%; }
:root[data-theme] .layui-laydate .laydate-day-now { color: var(--md-primary); }
:root[data-theme] .layui-laydate .layui-laydate-footer { border-top: 1px solid var(--md-divider); }
:root[data-theme] .layui-laydate-footer span { color: var(--md-on-surface-med); }
:root[data-theme] .layui-laydate .layui-laydate-footer span.laydate-btns-confirm { color: var(--md-primary); }

/* ---- Search toolbar + state filter ---- */
:root[data-theme] .table-search .layui-input { background: var(--md-surface); }
/* xm-select (member-search multi-select) → match the MUI outlined fields (was a 1px dashed / 5px-radius box) */
:root[data-theme] xm-select {
  border: 1px solid var(--md-outline) !important;
  border-radius: var(--md-radius) !important;
  background-color: var(--md-surface) !important;
  min-height: 32px !important;
  transition: border-color var(--md-dur-fast) var(--md-ease), box-shadow var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] xm-select:hover { border-color: var(--md-on-surface) !important; }
:root[data-theme] xm-select.xm-select-show { border-color: var(--md-primary) !important; box-shadow: 0 0 0 1px var(--md-primary) inset; }
:root[data-theme] xm-select > .xm-icon { border-top-color: var(--md-on-surface-med) !important; }
:root[data-theme] xm-select .xm-tips {
  padding: 0 42px 0 13px !important;
  color: var(--md-on-surface-med) !important;
  font-size: 14px;
}
:root[data-theme] xm-select .xm-label .xm-label-block {
  background-color: rgba(var(--md-primary-rgb), .12) !important;
  color: var(--md-primary) !important;
  border: none !important;
  border-radius: 6px !important;
}
:root[data-theme] xm-select .xm-label .xm-label-block > span,
:root[data-theme] xm-select .xm-label .xm-label-block > i {
  color: var(--md-primary) !important;
}
:root[data-theme] xm-select > .xm-label.auto-row > .scroll {
  overflow: visible !important;
}
:root[data-theme] xm-select > .xm-label.single-row,
:root[data-theme] xm-select > .xm-label.single-row > .scroll {
  scrollbar-width: none;
}
:root[data-theme] xm-select > .xm-label.single-row::-webkit-scrollbar,
:root[data-theme] xm-select > .xm-label.single-row > .scroll::-webkit-scrollbar {
  display: none;
}
:root[data-theme] xm-select .xm-body {
  box-sizing: border-box;
  width: 100% !important;
  min-width: 0 !important;
  max-width: 100% !important;
  padding: 8px !important;
  border: 1px solid var(--md-divider) !important;
  border-radius: var(--md-radius-lg) !important;
  box-shadow: var(--md-e8) !important;
  background-color: var(--md-surface-2) !important;
  color: var(--md-on-surface) !important;
}
:root[data-theme] xm-select .xm-body .xm-search {
  display: flex;
  min-height: 42px;
  align-items: center;
  gap: 9px;
  margin: 0 0 6px !important;
  border: 1px solid var(--md-outline);
  border-radius: var(--md-radius);
  padding: 0 12px !important;
  background: var(--md-surface) !important;
  cursor: text;
}
:root[data-theme] xm-select .xm-body .xm-search > i {
  position: static !important;
  flex: 0 0 auto;
  color: var(--md-on-surface-med) !important;
}
:root[data-theme] xm-select .xm-body .xm-search-input {
  min-width: 0;
  height: 40px;
  flex: 1 1 auto;
  border: 0 !important;
  padding: 0 !important;
  background: transparent !important;
  color: var(--md-on-surface) !important;
  box-shadow: none !important;
}
:root[data-theme] xm-select .xm-body .xm-search-input::placeholder {
  color: var(--md-on-surface-dis) !important;
  opacity: 1;
}
:root[data-theme] xm-select .xm-body .xm-option {
  min-height: 40px;
  border-radius: calc(var(--md-radius) - 2px);
  color: var(--md-on-surface) !important;
}
:root[data-theme] xm-select .xm-body .xm-option-content {
  color: var(--md-on-surface) !important;
}
:root[data-theme] xm-select .xm-body .xm-option[style*="background-color"] {
  background-color: var(--md-hover-overlay) !important;
}
:root[data-theme] xm-select .xm-body .xm-option:hover,
:root[data-theme] xm-select .xm-body .xm-option.xm-select-this {
  background-color: var(--md-hover-overlay) !important;
}
:root[data-theme] xm-select .xm-body .xm-option.selected {
  background-color: var(--md-selected-overlay) !important;
}
:root[data-theme] xm-select .xm-body .xm-option.selected .xm-option-content,
:root[data-theme] xm-select .xm-body .xm-option.xm-select-this .xm-option-content {
  color: var(--md-primary) !important;
}
:root[data-theme] xm-select .xm-body .xm-option-icon {
  border-color: var(--md-outline) !important;
}
:root[data-theme] xm-select .xm-body .xm-option.selected > .xm-option-icon {
  border-color: var(--md-primary) !important;
  background: var(--md-primary) !important;
  color: var(--md-on-primary) !important;
}
:root[data-theme] xm-select .xm-body .xm-select-empty {
  display: flex;
  min-height: 56px;
  align-items: center;
  justify-content: center;
  padding: 8px 12px;
  color: var(--md-on-surface-med) !important;
  font-size: 13px;
}
:root[data-theme] xm-select .xm-body .scroll-body {
  scrollbar-color: var(--md-on-surface-dis) transparent;
  scrollbar-width: thin;
}
:root[data-theme] xm-select .xm-body .scroll-body::-webkit-scrollbar-track { background: transparent !important; }
:root[data-theme] xm-select .xm-body .scroll-body::-webkit-scrollbar-thumb { background-color: var(--md-on-surface-dis) !important; }
:root[data-theme] .layui-btn.query-button {
  background: transparent; border: 1px solid var(--md-primary); color: var(--md-primary);
  border-radius: var(--md-radius); box-shadow: none; font-weight: 500;
}
:root[data-theme] .layui-btn.query-button:hover { background: rgba(var(--md-primary-rgb), .08); }
/* state filter = separate MUI outlined toggle chips (buttons keep a 10px gap) */
:root[data-theme] .bootstrap-table .table-switch-state { gap: 8px; }
:root[data-theme] .bootstrap-table .table-switch-state button {
  border: 1px solid var(--md-outline) !important;
  border-radius: var(--md-radius) !important;
  background: transparent !important;
  color: var(--md-on-surface-med) !important;
  box-shadow: none !important;
  padding: 6px 16px;
  font-weight: 500;
  transition: background-color var(--md-dur-fast) var(--md-ease), color var(--md-dur-fast) var(--md-ease), border-color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .bootstrap-table .table-switch-state button:hover {
  background: var(--md-hover-overlay) !important;
  color: var(--md-on-surface) !important;
  border-color: var(--md-on-surface) !important;
  transform: none !important;
}
:root[data-theme] .bootstrap-table .table-switch-state button.active,
:root[data-theme] .bootstrap-table .table-switch-state button.active:focus {
  background: rgba(var(--md-primary-rgb), .10) !important;
  color: var(--md-primary) !important;
  border-color: var(--md-primary) !important;
  font-weight: 600;
}
:root[data-theme] .bootstrap-table .table-switch-state button:focus:not(.active) {
  background: transparent !important;
  color: var(--md-on-surface-med) !important;
}

/* ---- generic Layui buttons inside popups/forms ---- */
:root[data-theme] .layui-btn:not(.query-button):not(.layui-btn-primary) { border-radius: var(--md-radius); font-weight: 500; }
:root[data-theme] .layui-btn.layui-btn-primary { background: transparent; border: 1px solid var(--md-outline); color: var(--md-on-surface); border-radius: var(--md-radius); }

/* ============================================================= *
 * PHASE 4 — Tables (bootstrap-table) + overlays (toast/swal/tips) + editors
 * ============================================================= */

/* ---- bootstrap-table ---- */
:root[data-theme] .bootstrap-table .table,
:root[data-theme] .fixed-table-container { color: var(--md-on-surface); border-color: var(--md-divider); }
:root[data-theme] .fixed-table-container { border: none; }
:root[data-theme] .bootstrap-table thead th {
  background-color: transparent;
  color: var(--md-on-surface-med);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: .3px;
  border-top: none;
  border-bottom: 1px solid var(--md-divider);
}
:root[data-theme] .bootstrap-table thead th .th-inner { padding: 14px 16px; font-size: 13px; }
:root[data-theme] .bootstrap-table tbody td {
  background-color: transparent;
  color: var(--md-on-surface);
  font-size: 14px;
  padding: 13px 16px;
  border-top: none;
  border-bottom: 1px solid var(--md-divider);
  vertical-align: middle;
}
/* edge breathing room (align with card padding) + clean last row */
:root[data-theme] .bootstrap-table thead th:first-child .th-inner,
:root[data-theme] .bootstrap-table tbody td:first-child { padding-left: 24px; }
:root[data-theme] .bootstrap-table thead th:last-child .th-inner,
:root[data-theme] .bootstrap-table tbody td:last-child { padding-right: 24px; }
:root[data-theme] .bootstrap-table tbody tr:last-child td { border-bottom: none; }
:root[data-theme] .bootstrap-table tbody tr { background-color: transparent; transition: background-color var(--md-dur-fast) var(--md-ease); }
:root[data-theme] .bootstrap-table tbody tr:hover td { background-color: var(--md-hover-overlay); }
:root[data-theme] .bootstrap-table tbody tr.selected td { background-color: var(--md-selected-overlay); }
/* zebra off (Material tables use dividers, not stripes) */
:root[data-theme] .table-striped > tbody > tr:nth-of-type(odd) > * { background-color: transparent; box-shadow: none; color: var(--md-on-surface); }
/* sort affordance */
:root[data-theme] .bootstrap-table th .btn-sort,
:root[data-theme] .bootstrap-table th.sortable .sort { color: var(--md-on-surface-dis); }
:root[data-theme] .bootstrap-table th.sortable:hover { color: var(--md-primary); }
/* selection checkboxes */
/* MUI checkbox (table select-all + row select) */
:root[data-theme] .bootstrap-table input[type="checkbox"] {
  appearance: none !important; -webkit-appearance: none !important;
  width: 18px !important; height: 18px !important;
  margin: 0 !important;
  border: 2px solid var(--md-on-surface-med) !important;
  border-radius: 3px !important;
  background: transparent !important;
  box-shadow: none !important;
  cursor: pointer;
  position: relative;
  vertical-align: middle;
  transition: background-color var(--md-dur-fast) var(--md-ease), border-color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .bootstrap-table input[type="checkbox"]:hover { border-color: var(--md-primary) !important; }
:root[data-theme] .bootstrap-table input[type="checkbox"]:checked {
  background-color: var(--md-primary) !important;
  border-color: var(--md-primary) !important;
}
:root[data-theme] .bootstrap-table input[type="checkbox"]:checked::after {
  content: ""; position: absolute;
  left: 5px; top: 1.5px; width: 4px; height: 8px;
  border: solid var(--md-on-primary); border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}
:root[data-theme] .bootstrap-table input[type="radio"] { accent-color: var(--md-primary); }

/* pagination bar: single centred row (was floated → detail + buttons misaligned).
 * bootstrap-table gives .pagination-detail a full-width, so shrink it (flex 0 1 auto)
 * and keep the buttons on the same line with nowrap. */
:root[data-theme] .fixed-table-pagination {
  display: flex !important;
  align-items: center;
  justify-content: space-between;
  flex-wrap: nowrap;
  gap: 12px;
  padding: 8px 4px;
}
:root[data-theme] .fixed-table-pagination > div { float: none !important; margin: 0 !important; }
:root[data-theme] .fixed-table-pagination .pagination-detail {
  display: flex; align-items: center; gap: 8px;
  width: auto !important; flex: 0 1 auto;
}
:root[data-theme] .fixed-table-pagination .pagination { flex: 0 0 auto; margin: 0 0 0 auto !important; }
/* inline-edit cells */
:root[data-theme] .metadata-text {
  background: transparent !important; border: none; border-bottom: 1px solid var(--md-outline);
  border-radius: 0 !important; color: var(--md-on-surface); box-shadow: none;
}
:root[data-theme] .metadata-text:focus { border-bottom-color: var(--md-primary); box-shadow: 0 1px 0 0 var(--md-primary); outline: none; }
:root[data-theme] .metadata-select { background: transparent !important; border: 1px solid var(--md-outline) !important; border-radius: var(--md-radius) !important; color: var(--md-on-surface); }
/* rendered thumbnails */
:root[data-theme] .render-image,
:root[data-theme] .bootstrap-table td .image-render img { border-radius: var(--md-radius); box-shadow: var(--md-e1); }
/* treegrid + detail rows */
:root[data-theme] .treegrid-expander,
:root[data-theme] .treegrid-indent { color: var(--md-on-surface-med); }
:root[data-theme] tr.detail-view > td { background: var(--md-hover-overlay); }
:root[data-theme] .bootstrap-table .card-view { border-bottom: 1px solid var(--md-divider); }
:root[data-theme] .bootstrap-table .card-view .card-view-title { color: var(--md-on-surface-med); }

/* ---- pagination ---- */
:root[data-theme] .fixed-table-pagination .pagination .page-link {
  border: none; background: transparent; color: var(--md-on-surface-med);
  border-radius: var(--md-radius-pill); min-width: 32px; height: 32px; line-height: 32px; text-align: center; margin: 0 2px;
  transition: background-color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .fixed-table-pagination .pagination .page-link { border-radius: var(--md-radius-pill) !important; }
:root[data-theme] .fixed-table-pagination .pagination .page-link:hover { background: var(--md-hover-overlay); color: var(--md-on-surface); }
:root[data-theme] .fixed-table-pagination .pagination .page-item.active .page-link { background: var(--md-primary) !important; color: var(--md-on-primary) !important; box-shadow: var(--md-e1); }
:root[data-theme] .fixed-table-pagination .pagination-info,
:root[data-theme] .fixed-table-pagination .pagination-detail { color: var(--md-on-surface-med); }
:root[data-theme] .fixed-table-pagination .page-list .btn {
  background: transparent; border: 1px solid var(--md-outline); color: var(--md-on-surface); border-radius: var(--md-radius);
}
:root[data-theme] .fixed-table-pagination .page-list .dropdown-menu { background: var(--md-surface-2); border: 1px solid var(--md-divider); border-radius: var(--md-radius); box-shadow: var(--md-e8); }
:root[data-theme] .fixed-table-pagination .page-list .dropdown-item { color: var(--md-on-surface); }
:root[data-theme] .fixed-table-pagination .page-list .dropdown-item:hover { background: var(--md-hover-overlay); }
/* mobile: the desktop nowrap + space-between row (≥768px) overflows a narrow card —
 * stack it (detail on top, page-buttons below) + wrap/center so it never runs off screen.
 * Each .page-item ships an extra margin-right:6px on top of the .page-link's own 2px
 * margins → the 9-button row (~360px) overflowed a ~344px card by ~16px and wrapped ugly;
 * zeroing the li margin + trimming the link to 30px keeps one clean centred row (falls back
 * to a wrapped, centred block on very narrow phones — still no horizontal overflow). */
@media (max-width: 767.98px) {
  :root[data-theme] .fixed-table-pagination { flex-direction: column; flex-wrap: wrap; justify-content: center; gap: 6px; padding: 8px 0; }
  :root[data-theme] .fixed-table-pagination .pagination-detail { justify-content: center; flex-wrap: wrap; margin: 0 !important; }
  :root[data-theme] .fixed-table-pagination .pagination { flex: 0 1 auto; flex-wrap: wrap; justify-content: center; margin: 0 !important; }
  :root[data-theme] .fixed-table-pagination .pagination li { margin: 0 !important; }
  :root[data-theme] .fixed-table-pagination .pagination .page-link { min-width: 30px; height: 30px; line-height: 30px; margin: 2px; padding-left: 0; padding-right: 0; }
}

/* ---- Toastr → 高端提示(Sonner 风格):顶部居中 + 中性玻璃面 + 彩色圆形图标徽章 +
       深/浅墨字 + 柔和层叠阴影 + 丝滑滑入。前台+admin 共用。 ---- */
:root[data-theme] #toast-container {
  top: 26px !important; bottom: auto !important;
  left: 50% !important; right: auto !important;
  transform: translateX(-50%) !important;
  width: auto !important;
}
:root[data-theme] #toast-container > div {
  width: auto !important; min-width: 200px; max-width: 460px;
  margin: 0 auto 12px !important;
  padding: 15px 22px 15px 54px !important;
  border-radius: 14px !important;
  background-color: rgba(255, 255, 255, 0.94) !important;
  -webkit-backdrop-filter: blur(18px) saturate(180%); backdrop-filter: blur(18px) saturate(180%);
  border: 1px solid rgba(17, 24, 39, 0.06) !important;
  box-shadow: 0 1px 2px rgba(17,24,39,.05), 0 10px 24px -8px rgba(17,24,39,.18), 0 20px 52px -16px rgba(17,24,39,.16) !important;
  opacity: 1 !important;
  background-repeat: no-repeat !important;
  background-position: 18px center !important;
  background-size: 22px 22px !important;
  animation: uc-toast-in .42s cubic-bezier(.16, 1, .3, 1) both;
  transition: box-shadow .2s ease, transform .2s ease;
}
:root[data-theme] #toast-container > div:hover {
  transform: translateY(-1px);
  box-shadow: 0 2px 4px rgba(17,24,39,.07), 0 16px 32px -8px rgba(17,24,39,.24), 0 28px 64px -16px rgba(17,24,39,.2) !important;
}
/* 中性面 → 深/浅墨字(随主题) */
:root[data-theme] #toast-container .toast-title { color: var(--md-on-surface) !important; font-weight: 700 !important; font-size: 14px; }
:root[data-theme] #toast-container .toast-message { color: var(--md-on-surface) !important; font-size: 14.5px; font-weight: 600 !important; letter-spacing: .01em; line-height: 1.4; }
/* 进度条:细、圆、低调(徽标主色) */
:root[data-theme] #toast-container .toast-progress { background: var(--md-primary) !important; opacity: .45; height: 3px !important; border-radius: 999px; margin: 6px 6px 0; }
/* 彩色圆形图标徽章(替换 toastr 默认白色图标;固定 hex,浅/暗面都清晰) */
:root[data-theme] #toast-container > .toast,
:root[data-theme] #toast-container > .toast-info {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='11' fill='%233b82f6'/%3E%3Cpath d='M12 10.8v6.6' stroke='white' stroke-width='2.3' stroke-linecap='round'/%3E%3Ccircle cx='12' cy='7' r='1.35' fill='white'/%3E%3C/svg%3E") !important;
}
:root[data-theme] #toast-container > .toast-success {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='11' fill='%2322a95b'/%3E%3Cpath d='M6.6 12.5l3.2 3.2L17 7.9' fill='none' stroke='white' stroke-width='2.3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") !important;
}
:root[data-theme] #toast-container > .toast-error {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='11' fill='%23e5484d'/%3E%3Cpath d='M8.3 8.3l7.4 7.4M15.7 8.3l-7.4 7.4' stroke='white' stroke-width='2.3' stroke-linecap='round'/%3E%3C/svg%3E") !important;
}
:root[data-theme] #toast-container > .toast-warning {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='11' fill='%23f0a81e'/%3E%3Cpath d='M12 6.6v7.2' stroke='white' stroke-width='2.4' stroke-linecap='round'/%3E%3Ccircle cx='12' cy='17.2' r='1.35' fill='white'/%3E%3C/svg%3E") !important;
}
/* 暗色玻璃面 */
:root[data-theme="dark"] #toast-container > div {
  background-color: rgba(28, 32, 41, 0.9) !important;
  border-color: rgba(255, 255, 255, 0.09) !important;
  box-shadow: 0 1px 2px rgba(0,0,0,.3), 0 10px 24px -8px rgba(0,0,0,.5), 0 20px 52px -16px rgba(0,0,0,.42) !important;
}
@keyframes uc-toast-in {
  from { opacity: 0; transform: translateY(-16px) scale(.93); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}

/* ---- SweetAlert2 → MUI Dialog ---- */
:root[data-theme] .swal2-popup { background: var(--md-surface-2); border-radius: var(--md-radius-lg); box-shadow: var(--md-e24); color: var(--md-on-surface); }
:root[data-theme] .swal2-title { color: var(--md-on-surface); }
:root[data-theme] .swal2-html-container { color: var(--md-on-surface-med); }
:root[data-theme] .swal2-actions .swal2-confirm.swal2-styled { background: var(--md-primary) !important; color: var(--md-on-primary) !important; border-radius: var(--md-radius); box-shadow: var(--md-e2); font-weight: 500; }
:root[data-theme] .swal2-actions .swal2-cancel.swal2-styled { background: transparent !important; color: var(--md-on-surface-med) !important; border: 1px solid var(--md-outline); border-radius: var(--md-radius); box-shadow: none; }
:root[data-theme] .swal2-container { background: var(--md-scrim); }
:root[data-theme] .swal2-input, :root[data-theme] .swal2-textarea {
  background: transparent; border: 1px solid var(--md-outline); border-radius: var(--md-radius); color: var(--md-on-surface); box-shadow: none;
}

/* ---- layer.tips tooltip → MUI dark chip ---- */
:root[data-theme] .layui-layer-tips .layui-layer-content {
  background: rgba(33,33,33,.92) !important; color: #fff !important;
  border-radius: var(--md-radius); box-shadow: var(--md-e2); font-size: 12px; padding: 6px 10px; line-height: 1.4;
}
/* drop the layui tips arrow — as a bordered triangle on the rounded MUI chip it reads
 * as a detached wedge; a clean floating chip is the modern MUI tooltip look */
:root[data-theme] .layui-layer-tips i.layui-layer-TipsG,
:root[data-theme] .layui-layer-tips i.layui-layer-TipsB,
:root[data-theme] .layui-layer-tips i.layui-layer-TipsT,
:root[data-theme] .layui-layer-tips i.layui-layer-TipsR,
:root[data-theme] .layui-layer-tips i.layui-layer-TipsL { display: none !important; }

/* ---- editors (frame only; wangEditor glass bg defeated) ---- */
:root[data-theme] .editor-wrapper { border: 1px solid var(--md-divider); border-radius: var(--md-radius-lg); overflow: hidden; }
:root[data-theme] .w-e-toolbar { background: var(--md-surface) !important; border-bottom: 1px solid var(--md-divider) !important; }
:root[data-theme] .w-e-text-container, :root[data-theme] .w-e-menu-panel { background: var(--md-surface) !important; }
:root[data-theme="dark"] .w-e-text-container .w-e-text { color: var(--md-on-surface); }
:root[data-theme] .ace_editor { border-radius: var(--md-radius); }
/* the ACE HTML-source view sits flush under the "写作"/HTML header bar inside the
 * frame — square its top corners so the header + code read as one panel (the inner
 * top rounding otherwise notched away from the header, looking split). */
:root[data-theme] .editor-wrapper .ace_editor { border-top-left-radius: 0; border-top-right-radius: 0; }

/* ---- editorv2: self-built Markdown editor (CodeMirror source + marked preview) ---- */
:root[data-theme] .ev2-editor { border: 1px solid var(--md-divider); border-radius: var(--md-radius-lg); overflow: hidden; background: var(--md-surface); }
/* top bar: markdown toolbar (left) + actions (right) */
:root[data-theme] .ev2-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 5px 8px; background: var(--md-surface-2); border-bottom: 1px solid var(--md-divider); }
:root[data-theme] .ev2-tools { display: flex; flex-wrap: wrap; gap: 1px; }
:root[data-theme] .ev2-actions { display: flex; align-items: center; gap: 2px; margin-left: auto; }
:root[data-theme] .ev2-tb,
:root[data-theme] .ev2-preview-toggle { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border: none; background: transparent; color: var(--md-on-surface-med); border-radius: var(--md-radius); cursor: pointer; font-size: 14px; transition: background-color var(--md-dur-fast) var(--md-ease), color var(--md-dur-fast) var(--md-ease); }
:root[data-theme] .ev2-tb:hover,
:root[data-theme] .ev2-preview-toggle:hover { background: var(--md-hover-overlay); color: var(--md-on-surface); }
:root[data-theme] .ev2-preview-toggle.active { color: var(--md-primary); background: rgba(var(--md-primary-rgb), .1); }
:root[data-theme] .ev2-mode-toggle { display: inline-flex; align-items: center; height: 30px; padding: 0 12px; border: none; background: transparent; color: var(--md-on-surface-med); border-radius: var(--md-radius); font-size: 13px; cursor: pointer; transition: background-color var(--md-dur-fast) var(--md-ease), color var(--md-dur-fast) var(--md-ease); }
:root[data-theme] .ev2-mode-toggle:hover { background: var(--md-hover-overlay); color: var(--md-primary); }

/* body: split source | preview */
:root[data-theme] .ev2-body { display: flex; align-items: stretch; }
:root[data-theme] .ev2-cm { position: relative; flex: 1 1 50%; min-width: 0; border-right: 1px solid var(--md-divider); }
:root[data-theme] .ev2-preview { flex: 1 1 50%; min-width: 0; overflow: auto; padding: 14px 16px; color: var(--md-on-surface); background: var(--md-surface); }
:root[data-theme] .ev2-editor[data-preview="off"] .ev2-preview { display: none; }
:root[data-theme] .ev2-editor[data-preview="off"] .ev2-cm { border-right: none; }

/* placeholder overlay (CodeMirror placeholder addon isn't shipped) */
:root[data-theme] .ev2-ph { position: absolute; top: 8px; left: 12px; z-index: 1; pointer-events: none; color: var(--md-on-surface-med); opacity: .55; font-size: 13px; }

/* CodeMirror (default theme, tokenised for light/dark) */
:root[data-theme] .ev2-cm .CodeMirror { background: var(--md-surface); color: var(--md-on-surface); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 13px; line-height: 1.7; }
:root[data-theme] .ev2-cm .CodeMirror-gutters { background: var(--md-surface); border-right: none; }
:root[data-theme] .ev2-cm .CodeMirror-cursor { border-left-color: var(--md-on-surface); }
:root[data-theme] .ev2-cm .CodeMirror-selected { background: var(--md-selected-overlay) !important; }
:root[data-theme] .ev2-cm .cm-header { color: var(--md-primary); font-weight: 600; }
:root[data-theme] .ev2-cm .cm-link,
:root[data-theme] .ev2-cm .cm-url { color: var(--md-primary); }
:root[data-theme] .ev2-cm .cm-quote { color: var(--md-on-surface-med); font-style: italic; }
:root[data-theme] .ev2-cm .cm-comment { color: var(--md-on-surface-med); }

/* preview = a faithful GitHub-flavoured markdown render (matches standard markdown).
 * NOTE: the admin's global reset forces `li { list-style: none }`, so the marker rules
 * below need `!important` to restore bullets/numbers. */
:root[data-theme] .ev2-preview { font-size: 14px; line-height: 1.7; word-wrap: break-word; }
:root[data-theme] .ev2-preview > *:first-child { margin-top: 0 !important; }
:root[data-theme] .ev2-preview > *:last-child { margin-bottom: 0 !important; }
/* headings (h1/h2 get the GitHub underline rule) */
:root[data-theme] .ev2-preview h1,
:root[data-theme] .ev2-preview h2,
:root[data-theme] .ev2-preview h3,
:root[data-theme] .ev2-preview h4,
:root[data-theme] .ev2-preview h5,
:root[data-theme] .ev2-preview h6 { margin: 24px 0 16px; font-weight: 600; line-height: 1.25; color: var(--md-on-surface); }
:root[data-theme] .ev2-preview h1 { font-size: 1.8em; padding-bottom: .3em; border-bottom: 1px solid var(--md-divider); }
:root[data-theme] .ev2-preview h2 { font-size: 1.45em; padding-bottom: .3em; border-bottom: 1px solid var(--md-divider); }
:root[data-theme] .ev2-preview h3 { font-size: 1.2em; }
:root[data-theme] .ev2-preview h4 { font-size: 1em; }
:root[data-theme] .ev2-preview h5 { font-size: .9em; }
:root[data-theme] .ev2-preview h6 { font-size: .85em; color: var(--md-on-surface-med); }
/* paragraphs & inline */
:root[data-theme] .ev2-preview p { margin: 0 0 16px; }
:root[data-theme] .ev2-preview a { color: var(--md-primary); text-decoration: none; }
:root[data-theme] .ev2-preview a:hover { text-decoration: underline; }
:root[data-theme] .ev2-preview strong { font-weight: 600; }
:root[data-theme] .ev2-preview em { font-style: italic; }
:root[data-theme] .ev2-preview del { text-decoration: line-through; }
/* lists — restore the markers the admin `li{list-style:none}` reset stripped */
:root[data-theme] .ev2-preview ul,
:root[data-theme] .ev2-preview ol { margin: 0 0 16px; padding-left: 2em; }
:root[data-theme] .ev2-preview ul { list-style: disc outside !important; }
:root[data-theme] .ev2-preview ol { list-style: decimal outside !important; }
:root[data-theme] .ev2-preview li { display: list-item !important; margin: .25em 0; }
:root[data-theme] .ev2-preview ul > li { list-style-type: disc !important; }
:root[data-theme] .ev2-preview ol > li { list-style-type: decimal !important; }
:root[data-theme] .ev2-preview ul ul > li { list-style-type: circle !important; }
:root[data-theme] .ev2-preview ul ul ul > li { list-style-type: square !important; }
:root[data-theme] .ev2-preview li > ul,
:root[data-theme] .ev2-preview li > ol { margin: .25em 0; }
:root[data-theme] .ev2-preview li > p { margin: 0 0 .5em; }
:root[data-theme] .ev2-preview ul > li.task-list-item { list-style: none !important; margin-left: -1.3em; }
:root[data-theme] .ev2-preview li.task-list-item input { margin: 0 .45em 0 0; }
/* blockquote */
:root[data-theme] .ev2-preview blockquote { margin: 0 0 16px; padding: 0 1em; border-left: .25em solid var(--md-divider); color: var(--md-on-surface-med); }
:root[data-theme] .ev2-preview blockquote > :last-child { margin-bottom: 0; }
/* code */
:root[data-theme] .ev2-preview code { background: var(--md-surface-2); border-radius: 6px; padding: .2em .4em; font-size: 85%; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
:root[data-theme] .ev2-preview pre { background: var(--md-surface-2); border-radius: var(--md-radius); padding: 14px 16px; overflow: auto; margin: 0 0 16px; line-height: 1.45; }
:root[data-theme] .ev2-preview pre code { background: transparent; padding: 0; font-size: 100%; border-radius: 0; }
/* tables — GitHub zebra + horizontal scroll for wide tables */
:root[data-theme] .ev2-preview table { border-collapse: collapse; margin: 0 0 16px; display: block; width: max-content; max-width: 100%; overflow: auto; }
:root[data-theme] .ev2-preview th,
:root[data-theme] .ev2-preview td { border: 1px solid var(--md-divider); padding: 6px 13px; }
:root[data-theme] .ev2-preview th { font-weight: 600; background: var(--md-surface-2); }
:root[data-theme] .ev2-preview tr:nth-child(2n) td { background: rgba(var(--md-primary-rgb), .04); }
/* media & rules */
:root[data-theme] .ev2-preview img { max-width: 100%; border-radius: var(--md-radius); }
:root[data-theme] .ev2-preview hr { height: .25em; margin: 24px 0; background: var(--md-divider); border: 0; }

/* HTML-source (ACE) inside ev2: square corners so it reads flush under the bar */
:root[data-theme] .ev2-editor .ace_editor { border-radius: 0; }

/* responsive: drawer becomes full-screen below 700px → stack, cap the preview */
@media (max-width: 700px) {
  :root[data-theme] .ev2-body { flex-direction: column; }
  :root[data-theme] .ev2-cm { border-right: none; border-bottom: 1px solid var(--md-divider); }
  :root[data-theme] .ev2-preview { max-height: 200px; flex: 0 0 auto; }
}

/* ---- misc: loading spinner colour ---- */
:root[data-theme] .layui-layer-loading .layui-layer-content { filter: none; }

/* A request still needs visible progress when the OS reduces decorative motion. */
@media (prefers-reduced-motion: reduce) {
  :root[data-theme] .chahuo-ring { animation: chahuo-ring-spin 1.8s infinite linear; }
  :root[data-theme] .chahuo-ring::before { animation: chahuo-ring-spin 2.4s infinite linear; }
  :root[data-theme] .chahuo-ring::after { animation: chahuo-ring-spin 3s infinite linear; }
}

/* search toolbar carries a faint green→blue gradient in _admin.css → flatten */
:root[data-theme] .table-search { background: transparent !important; background-image: none !important; }
/* query/search button: keep it primary-outlined (beats the generic .layui-btn-primary tie) */
:root[data-theme] .table-search .layui-btn.query-button,
:root[data-theme] .layui-btn.query-button {
  background: transparent !important;
  border: 1px solid var(--md-primary) !important;
  color: var(--md-primary) !important;
}
/* (.table-item* row chips are now unified theme-tonal chips in §7 — no dark
 * force-black workaround needed; the tonal bg + semantic color are theme-aware.) */

/* --- bootstrap-table empty state --- */
:root[data-theme] .bootstrap-table .no-records-found td { color: var(--md-on-surface-med); padding: 40px 0; }

/* MUI user cell: avatar (left) + name on top / id below — 供货商 table 商家 column */
:root[data-theme] .md-user-cell { display: flex; align-items: center; gap: 12px; text-align: left; }
:root[data-theme] .md-user-cell__avatar { width: 38px; height: 38px; border-radius: 50%; object-fit: cover; flex: 0 0 auto; background: var(--md-surface-2); }
:root[data-theme] .md-user-cell__avatar--ph { display: inline-flex; align-items: center; justify-content: center; font-size: 15px; font-weight: 600; color: var(--md-on-surface-med); }
:root[data-theme] .md-user-cell__text { display: flex; flex-direction: column; min-width: 0; line-height: 1.35; }
:root[data-theme] .md-user-cell__name { font-size: 14px; font-weight: 500; color: var(--md-on-surface); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
:root[data-theme] .md-user-cell__id { font-size: 12px; color: var(--md-on-surface-med); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* 第二行为普通文本(如邮箱)时用 __sub —— 同 __id 但非等宽字体 */
:root[data-theme] .md-user-cell__sub { font-size: 12px; color: var(--md-on-surface-med); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* MUI commodity cell: rounded-square 商品图标 (left) + 商品名称 (上) / 分类层级路径 (下) — 商品列表合并列 */
:root[data-theme] .md-commodity-cell { display: flex; align-items: center; gap: 12px; text-align: left; }
:root[data-theme] .md-commodity-cell__cover { width: 44px; height: 44px; border-radius: var(--md-radius); object-fit: cover; flex: 0 0 auto; background: var(--md-surface-2); box-shadow: var(--md-e1); cursor: zoom-in; }
:root[data-theme] .md-commodity-cell__cover--ph { display: inline-flex; align-items: center; justify-content: center; box-shadow: none; color: var(--md-on-surface-med); font-size: 18px; cursor: default; }
:root[data-theme] .md-commodity-cell__text { display: flex; flex-direction: column; min-width: 0; gap: 3px; line-height: 1.35; }
:root[data-theme] .md-commodity-cell__name { font-size: 14px; font-weight: 500; color: var(--md-on-surface); }
:root[data-theme] .md-commodity-cell__cat { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; font-size: 12px; color: var(--md-on-surface-med); }
:root[data-theme] .md-commodity-cell__cat-sep { color: var(--md-on-surface-dis); font-size: 11px; line-height: 1; }
/* 第二行为普通文本(如所属者)时用 __sub；--sm 为密集表格的紧凑尺寸(卡密管理等) */
:root[data-theme] .md-commodity-cell__sub { font-size: 12px; color: var(--md-on-surface-med); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
:root[data-theme] .md-commodity-cell--sm { gap: 10px; }
:root[data-theme] .md-commodity-cell--sm .md-commodity-cell__cover { width: 36px; height: 36px; box-shadow: none; cursor: default; }

/* 通用「标签-值」成对单元格 (md-pair) — 表格里把两三个相关字段并成一格并各带小标签
   (卡密管理: 加价/成本、创建/出售、类别/SKU)；标签弱化、值主色,明暗 token 驱动。 */
:root[data-theme] .md-pair { display: flex; flex-direction: column; gap: 4px; text-align: left; }
:root[data-theme] .md-pair__row { display: flex; align-items: center; gap: 8px; line-height: 1.4; }
:root[data-theme] .md-pair__k { flex: 0 0 auto; min-width: 30px; font-size: 11px; font-weight: 500; letter-spacing: .2px; color: var(--md-on-surface-dis); }
:root[data-theme] .md-pair__v { font-size: 13px; color: var(--md-on-surface); white-space: nowrap; }
:root[data-theme] .md-pair__v--muted { color: var(--md-on-surface-med); }

/* 商品订单号：保留双击详情，并提供独立的复制入口。 */
:root[data-theme] .md-order-trade-no {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
:root[data-theme] .md-order-trade-no__copy {
  display: inline-grid;
  width: 30px;
  height: 30px;
  flex: 0 0 30px;
  place-items: center;
  border: 0;
  border-radius: 50%;
  padding: 0;
  background: transparent;
  color: var(--md-on-surface-med);
  cursor: pointer;
  transition: background .15s ease, color .15s ease;
}
:root[data-theme] .md-order-trade-no__copy i {
  color: inherit;
  font-size: 14px;
  line-height: 1;
}
:root[data-theme] .md-order-trade-no__copy:is(:hover, :active) {
  background: var(--md-hover-overlay);
  color: var(--md-primary);
}
:root[data-theme] .md-order-trade-no__copy:focus-visible {
  outline: 2px solid var(--md-primary);
  outline-offset: 1px;
}
@media (max-width: 991.98px) {
  :root[data-theme] .md-order-trade-no__copy {
    width: 44px;
    height: 44px;
    flex-basis: 44px;
  }
}

/* 支付方式 pay 芯片 — 覆盖 component.css 的重阴影 + 粉色 text-shadow(很丑),改成干净 MUI outlined 芯片 */
:root[data-theme] .pay-item {
  box-shadow: none !important;
  background: none;
  border: 1px solid var(--md-outline);
  padding: 3px 10px 3px 8px;
  border-radius: var(--md-radius-pill);
  gap: 6px;
}
:root[data-theme] .pay-item:hover { transform: none; background: var(--md-hover-overlay); border-color: rgba(var(--md-primary-rgb), .4); }
:root[data-theme] .pay-item img { width: 16px; height: 16px; border-radius: 50%; }
:root[data-theme] .pay-item span { color: var(--md-on-surface) !important; text-shadow: none !important; font-size: 12.5px; font-weight: 500; }

/* 查看卡密弹窗内容 (.md-secret) — 代码块 + 复制/下载,token 驱动明暗;外层 layer 复用 .layui-layer-page 的 MUI 皮肤 */
:root[data-theme] .md-secret { display: flex; flex-direction: column; gap: 14px; padding: 18px 20px 20px; }
:root[data-theme] .md-secret__code {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 13px; line-height: 1.7; color: var(--md-on-surface);
  background: var(--md-bg); border: 1px solid var(--md-divider);
  border-radius: var(--md-radius); padding: 14px 16px;
  white-space: pre-wrap; word-break: break-all;
  max-height: 320px; overflow: auto; user-select: all; -webkit-user-select: all;
}
:root[data-theme] .md-secret__meta { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
:root[data-theme] .md-secret__bar { display: flex; justify-content: flex-end; gap: 10px; }
:root[data-theme] .md-secret__btn {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 7px 18px; border-radius: var(--md-radius);
  font-size: 13px; font-weight: 500; line-height: 1.4; cursor: pointer;
  border: 1px solid var(--md-outline); background: transparent; color: var(--md-on-surface);
  transition: background .15s ease, border-color .15s ease;
}
:root[data-theme] .md-secret__btn:hover { background: var(--md-hover-overlay); border-color: rgba(var(--md-primary-rgb), .45); }
:root[data-theme] .md-secret__btn--primary { background: var(--md-primary); border-color: var(--md-primary); color: var(--md-on-primary); box-shadow: var(--md-e1); }
:root[data-theme] .md-secret__btn--primary:hover { filter: brightness(1.06); }

/* 卡密上传示例/提示块 (.uc-cardtip) — 前后台通用、token 驱动明暗(替换裸 bootstrap .translucent 白框/.text-dark/.alert-warning) */
:root[data-theme] .uc-cardtip { color: var(--md-on-surface-med); font-size: 13px; line-height: 1.7; }
:root[data-theme] .uc-cardtip p { margin: 0 0 8px; }
:root[data-theme] .uc-cardtip b, :root[data-theme] .uc-cardtip strong { color: var(--md-on-surface); font-weight: 700; }
:root[data-theme] .uc-cardtip code { padding: 1px 6px; border-radius: 5px; font-family: ui-monospace, Menlo, Consolas, monospace; background: rgba(var(--md-primary-rgb), .09); color: var(--md-primary); }
:root[data-theme] .uc-cardtip__label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; color: var(--md-on-surface-dis); margin-bottom: 6px; }
:root[data-theme] .uc-cardtip__code {
  margin: 4px 0 0; padding: 12px 14px; border-radius: var(--md-radius);
  background: var(--md-bg); border: 1px solid var(--md-divider); color: var(--md-on-surface);
  font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 12.5px; line-height: 1.9;
  white-space: pre-wrap; word-break: break-all;
}
:root[data-theme] .uc-cardtip__legend { list-style: none; padding: 0; margin: 10px 0 0; display: flex; flex-direction: column; gap: 8px; }
:root[data-theme] .uc-cardtip__legend li { font-size: 12.5px; color: var(--md-on-surface-med); display: flex; align-items: center; gap: 7px; }
:root[data-theme] .uc-cardtip__warn {
  display: flex; align-items: center; gap: 8px; margin-top: 12px; padding: 10px 14px; border-radius: var(--md-radius);
  font-size: 12.5px; font-weight: 500; color: var(--md-warning);
  background: rgba(var(--md-warning-rgb), .10); border: 1px solid rgba(var(--md-warning-rgb), .28);
}
:root[data-theme] .uc-cardtip__warn .material-icons-outlined { font-size: 17px; flex: 0 0 auto; }
:root[data-theme] .uc-cardtip__warn strong { color: var(--md-warning); }

/* 通用插件列表: 插件名做成 MUI 药丸芯片(图标+名字同框,主色微染,像"Pro"chip) + 版本号/作者芯片,token 驱动明暗 */
/* 中性磨砂玻璃胶囊:半透明 + backdrop 模糊 + 顶部玻璃高光 + 弥散柔光,不抢插件图标颜色 */
:root[data-theme] .md-plugin {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 4px 10px;
  border-radius: var(--md-radius-pill);
  border: 1px solid var(--md-divider);
  backdrop-filter: blur(12px) saturate(1.4);
  -webkit-backdrop-filter: blur(12px) saturate(1.4);
  transition: box-shadow .22s ease, transform .22s ease, border-color .22s ease, background .22s ease;
}
:root[data-theme="light"] .md-plugin {
  background: rgba(255, 255, 255, .55);
  border-color: rgba(15, 23, 42, .08);
  box-shadow: 0 1px 2px rgba(16,24,40,.05), 0 4px 12px -4px rgba(16,24,40,.10), inset 0 1px 0 rgba(255,255,255,.75);
}
:root[data-theme="dark"] .md-plugin {
  background: rgba(255, 255, 255, .055);
  border-color: rgba(255, 255, 255, .11);
  box-shadow: 0 1px 2px rgba(0,0,0,.25), 0 4px 12px -4px rgba(0,0,0,.40), inset 0 1px 0 rgba(255,255,255,.10);
}
:root[data-theme] .md-plugin:hover { transform: translateY(-1px); }
:root[data-theme="light"] .md-plugin:hover {
  background: rgba(255, 255, 255, .72);
  border-color: rgba(15, 23, 42, .12);
  box-shadow: 0 2px 4px rgba(16,24,40,.06), 0 12px 26px -6px rgba(16,24,40,.16), inset 0 1px 0 rgba(255,255,255,.85);
}
:root[data-theme="dark"] .md-plugin:hover {
  background: rgba(255, 255, 255, .09);
  border-color: rgba(255, 255, 255, .18);
  box-shadow: 0 2px 4px rgba(0,0,0,.30), 0 12px 26px -6px rgba(0,0,0,.50), inset 0 1px 0 rgba(255,255,255,.14);
}
/* 正常圆角方形图标(app-icon 形),无描边环,仅一丝微阴影 */
:root[data-theme] .md-plugin__icon { width: 20px; height: 20px; flex: 0 0 auto; border-radius: 6px; object-fit: cover; box-shadow: 0 1px 2px rgba(0,0,0,.12); }
:root[data-theme] .md-plugin__name { font-size: 12px; font-weight: 600; color: var(--md-on-surface); white-space: nowrap; letter-spacing: .1px; }
/* 支付接口"支付名称"单元:圆头像 + 名称的平铺样式(无胶囊/边框),与所属插件的磨砂胶囊明显区分 */
:root[data-theme] .md-pay { display: inline-flex; align-items: center; gap: 9px; text-align: left; }
:root[data-theme] .md-pay__icon { width: 26px; height: 26px; flex: 0 0 auto; border-radius: 50%; object-fit: cover; background: var(--md-surface-2); box-shadow: 0 1px 2px rgba(0,0,0,.14); }
:root[data-theme] .md-pay__name { font-size: 14px; font-weight: 500; color: var(--md-on-surface); }

/* 文件管理:预览缩略图 + 文件名/备注 合并单元(双击预览图片) */
:root[data-theme] .md-file { display: flex; align-items: center; gap: 11px; text-align: left; }
:root[data-theme] .md-file__thumb { width: 40px; height: 40px; flex: 0 0 auto; border-radius: var(--md-radius); object-fit: cover; background: var(--md-surface-2); border: 1px solid var(--md-divider); }
:root[data-theme] .md-file__thumb--icon { display: inline-flex; align-items: center; justify-content: center; font-size: 20px; color: var(--md-primary); }
:root[data-theme] .md-file--previewable { user-select: none; -webkit-user-select: none; }
:root[data-theme] .md-file--previewable .md-file__thumb { cursor: zoom-in; }
:root[data-theme] .md-file__text { display: flex; flex-direction: column; min-width: 0; gap: 2px; line-height: 1.4; }
:root[data-theme] .md-file__name { font-size: 13.5px; font-weight: 500; color: var(--md-on-surface); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 320px; }
:root[data-theme] .md-file__note { font-size: 12px; color: var(--md-primary); }
/* 版本号: 等宽 + 主色微染药丸(技术感) */
:root[data-theme] .md-version { display: inline-flex; align-items: center; padding: 2px 9px; border-radius: var(--md-radius-pill); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; font-weight: 500; letter-spacing: .2px; color: var(--md-primary); background: rgba(var(--md-primary-rgb), .10); }
/* 作者: 中性药丸 + 小人像图标 */
:root[data-theme] .md-author { display: inline-flex; align-items: center; gap: 5px; padding: 3px 11px 3px 9px; border-radius: var(--md-radius-pill); font-size: 12.5px; font-weight: 500; color: var(--md-on-surface-med); background: var(--md-hover-overlay); border: 1px solid var(--md-divider); }
:root[data-theme] .md-author i { font-size: 12px; opacity: .75; }

/* ===== 列详情弹窗 (.md-detail) — table.js setColumnDetail 的 MUI label→value 展示 =====
   渲染在 component.popup 内（.component-popup 外壳已 MUI 化）；token 驱动，light/dark 自适应。
   随 table.js 打进 _.js → 生产需重建 _.js；material.css 直接加载无需重建。 */
/* 双击触发列仍允许拖选和复制文字；详情行为由 dblclick 事件独立处理。 */
:root[data-theme] .md-detail-trigger { user-select: text; -webkit-user-select: text; }
:root[data-theme] .md-detail { display: flex; flex-direction: column; padding: 4px 4px 2px; color: var(--md-on-surface); }
:root[data-theme] .md-detail__header { padding: 6px 8px 14px; margin-bottom: 6px; border-bottom: 1px solid var(--md-divider); }
:root[data-theme] .md-detail__header .md-user-cell { gap: 14px; }
:root[data-theme] .md-detail__header .md-user-cell__avatar { width: 46px; height: 46px; }
:root[data-theme] .md-detail__header .md-user-cell__name { font-size: 16px; font-weight: 600; }
:root[data-theme] .md-detail__header .md-user-cell__id { font-size: 12px; }
:root[data-theme] .md-detail__body { display: flex; flex-direction: column; }
:root[data-theme] .md-detail__row { display: grid; grid-template-columns: 116px 1fr; align-items: baseline; gap: 14px; padding: 10px 8px; border-bottom: 1px solid var(--md-divider); }
:root[data-theme] .md-detail__row:last-child { border-bottom: none; }
:root[data-theme] .md-detail__label { font-size: 13px; font-weight: 500; color: var(--md-on-surface-med); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
:root[data-theme] .md-detail__value { font-size: 14px; color: var(--md-on-surface); min-width: 0; word-break: break-word; overflow-wrap: anywhere; line-height: 1.5; }
:root[data-theme] .md-detail__value a { color: var(--md-primary); }
:root[data-theme] .md-detail__value .icon-spin { color: var(--md-on-surface-med); }
:root[data-theme] .md-detail-trigger { display: block; cursor: text; }

/* ---- search toolbar (.table-search) → MUI floating labels (shared search.js; prod needs _.js rebuild) ---- */
:root[data-theme] .table-search .mui-sf { position: relative; }
:root[data-theme] .table-search .mui-sf > .layui-input { padding-left: 12px; }
:root[data-theme] .table-search .mui-sf--select .layui-form-select { position: static; }
:root[data-theme] .table-search .mui-sf__label {
  position: absolute; left: 11px; top: 50%; transform: translateY(-50%);
  transform-origin: left center; z-index: 2; margin: 0; padding: 0 5px;
  max-width: calc(100% - 24px); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  font-size: 13px; line-height: 1; font-weight: 400;
  color: var(--md-on-surface-med); background: var(--md-surface); pointer-events: none;
  transition: top var(--md-dur-fast) var(--md-ease), transform var(--md-dur-fast) var(--md-ease), color var(--md-dur-fast) var(--md-ease);
}
/* float up: on focus, when the input is filled, or it's a select (always has a value) */
:root[data-theme] .table-search .mui-sf:focus-within > .mui-sf__label,
:root[data-theme] .table-search .mui-sf:has(input:not(:placeholder-shown)) > .mui-sf__label,
:root[data-theme] .table-search .mui-sf--select > .mui-sf__label {
  top: 0; transform: translateY(-50%) scale(.82); max-width: calc((100% / .82) - 22px);
}
:root[data-theme] .table-search .mui-sf:focus-within > .mui-sf__label { color: var(--md-primary); }
/* Bootstrap `.alert-*` (e.g. the app-store password popup's warning) — Metronic ships them light-mode-
   only (dark text `rgb(102,80,0)` on a pale cream tint) → in dark mode that's dark-on-dark = UNREADABLE.
   Re-skin with the semantic tokens: soft tint + matching border + the semantic colour as text/icon,
   which contrasts BOTH themes (dark → light accent on dark tint; light → dark accent on light tint).
   Global — fixes the alert wherever it appears (popups, config pages, …). */
:root[data-theme] .alert { border-radius: var(--md-radius); border: 1px solid transparent; }
:root[data-theme] .alert p { color: inherit; margin-bottom: 0; }
:root[data-theme] .alert i { color: inherit !important; }
:root[data-theme] .alert.alert-warning { background: rgba(var(--md-warning-rgb), .13) !important; border-color: rgba(var(--md-warning-rgb), .38) !important; color: var(--md-warning) !important; }
:root[data-theme] .alert.alert-danger  { background: rgba(var(--md-error-rgb), .13) !important;   border-color: rgba(var(--md-error-rgb), .38) !important;   color: var(--md-error) !important; }
:root[data-theme] .alert.alert-success { background: rgba(var(--md-success-rgb), .13) !important; border-color: rgba(var(--md-success-rgb), .38) !important; color: var(--md-success) !important; }
:root[data-theme] .alert.alert-info    { background: rgba(var(--md-info-rgb), .13) !important;    border-color: rgba(var(--md-info-rgb), .38) !important;    color: var(--md-info) !important; }
:root[data-theme] .alert.alert-primary { background: rgba(var(--md-primary-rgb), .13) !important; border-color: rgba(var(--md-primary-rgb), .38) !important; color: var(--md-primary) !important; }

/* ===== Shared message preview — admin and Cartoon use the same Layer markup ===== */
:root[data-theme] .layui-layer.md-message-layer {
  overflow: hidden;
  border: 1px solid var(--md-divider);
  border-radius: 20px;
  background: var(--md-surface);
  box-shadow: var(--md-e24);
}
:root[data-theme] .md-message-layer .layui-layer-content {
  max-height: min(72vh, 720px);
  overflow: auto;
  background: var(--md-surface);
}
:root[data-theme] .md-message-preview { color: var(--md-on-surface); }
:root[data-theme] .md-message-preview__header {
  position: sticky; top: 0; z-index: 2;
  display: grid; grid-template-columns: 48px minmax(0, 1fr) 40px; align-items: center; gap: 14px;
  padding: 22px 24px 18px;
  background: color-mix(in srgb, var(--md-surface) 92%, transparent);
  border-bottom: 1px solid var(--md-divider);
  backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px);
}
:root[data-theme] .md-message-preview__icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 48px; height: 48px; border-radius: 15px;
  color: var(--md-primary); background: rgba(var(--md-primary-rgb), .12);
  box-shadow: inset 0 0 0 1px rgba(var(--md-primary-rgb), .16);
}
:root[data-theme] .md-message-preview__icon .material-icons-outlined { font-size: 25px; }
:root[data-theme] .md-message-preview__heading { min-width: 0; }
:root[data-theme] .md-message-preview__heading > span {
  display: block; margin-bottom: 3px; color: var(--md-primary);
  font-size: 10px; line-height: 1.2; font-weight: 800; letter-spacing: .15em;
}
:root[data-theme] .md-message-preview__heading h2 {
  margin: 0; color: var(--md-on-surface); font-size: 20px; line-height: 1.35; font-weight: 750;
  overflow-wrap: anywhere;
}
:root[data-theme] .md-message-preview__heading time {
  display: block; margin-top: 5px; color: var(--md-on-surface-med); font-size: 12px;
}
:root[data-theme] .md-message-preview__close {
  display: inline-flex; align-items: center; justify-content: center;
  width: 40px; height: 40px; padding: 0; border: 0; border-radius: 50%;
  color: var(--md-on-surface-med); background: transparent; cursor: pointer;
  transition: color var(--md-dur-fast) var(--md-ease), background-color var(--md-dur-fast) var(--md-ease);
}
:root[data-theme] .md-message-preview__close:hover,
:root[data-theme] .md-message-preview__close:focus-visible { color: var(--md-on-surface); background: var(--md-hover-overlay); outline: none; }
:root[data-theme] .md-message-preview__close .material-icons-outlined { font-size: 22px; }
:root[data-theme] .md-message-preview__content {
  min-height: 150px; padding: 26px 28px 32px;
  color: var(--md-on-surface); font-size: 15px; line-height: 1.78;
  overflow-wrap: anywhere;
}
:root[data-theme] .md-message-preview__content > :first-child { margin-top: 0 !important; }
:root[data-theme] .md-message-preview__content > :last-child { margin-bottom: 0 !important; }
:root[data-theme] .md-message-preview__content p { margin: 0 0 14px; }
:root[data-theme] .md-message-preview__content h1,
:root[data-theme] .md-message-preview__content h2,
:root[data-theme] .md-message-preview__content h3,
:root[data-theme] .md-message-preview__content h4,
:root[data-theme] .md-message-preview__content h5,
:root[data-theme] .md-message-preview__content h6 { margin: 1.1em 0 .55em; color: var(--md-on-surface); line-height: 1.35; font-weight: 750; }
:root[data-theme] .md-message-preview__content h1 { font-size: 1.55em; }
:root[data-theme] .md-message-preview__content h2 { font-size: 1.35em; }
:root[data-theme] .md-message-preview__content h3 { font-size: 1.18em; }
:root[data-theme] .md-message-preview__content ul,
:root[data-theme] .md-message-preview__content ol { margin: 0 0 14px; padding-left: 1.8em; }
:root[data-theme] .md-message-preview__content ul { list-style: disc outside !important; }
:root[data-theme] .md-message-preview__content ol { list-style: decimal outside !important; }
:root[data-theme] .md-message-preview__content li { display: list-item !important; margin: .25em 0; }
:root[data-theme] .md-message-preview__content blockquote {
  margin: 16px 0; padding: 10px 15px; border-left: 3px solid var(--md-primary);
  border-radius: 0 var(--md-radius) var(--md-radius) 0;
  color: var(--md-on-surface-med); background: rgba(var(--md-primary-rgb), .07);
}
:root[data-theme] .md-message-preview__content code {
  padding: 2px 6px; border-radius: 6px; color: var(--md-primary);
  background: rgba(var(--md-primary-rgb), .09); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
:root[data-theme] .md-message-preview__content pre {
  overflow: auto; margin: 16px 0; padding: 15px; border: 1px solid var(--md-divider);
  border-radius: var(--md-radius); background: var(--md-bg);
}
:root[data-theme] .md-message-preview__content pre code { padding: 0; color: inherit; background: transparent; }
:root[data-theme] .md-message-preview__content a { color: var(--md-primary); text-decoration: none; }
:root[data-theme] .md-message-preview__content a:hover { text-decoration: underline; }
:root[data-theme] .md-message-preview__content img {
  display: block; max-width: 100%; max-height: 460px; margin: 18px auto;
  border-radius: 14px; object-fit: contain; cursor: zoom-in;
  border: 1px solid var(--md-divider); box-shadow: var(--md-e2);
}
:root[data-theme] .md-message-preview__content table { display: block; max-width: 100%; overflow-x: auto; border-collapse: collapse; }
:root[data-theme] .md-message-preview__content th,
:root[data-theme] .md-message-preview__content td { padding: 8px 10px; border: 1px solid var(--md-divider); white-space: nowrap; }
:root[data-theme] .md-message-preview__content th { background: var(--md-bg); font-weight: 700; }
:root[data-theme] .md-message-layer .layui-layer-btn {
  margin: 0 !important; padding: 14px 22px !important; border-top: 1px solid var(--md-divider) !important;
  background: var(--md-surface) !important;
}
:root[data-theme] .md-message-layer .layui-layer-btn .layui-layer-btn0 {
  display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  height: 40px; padding: 0 18px; border: 0 !important; border-radius: var(--md-radius) !important;
  color: var(--md-on-primary) !important; background: var(--md-primary) !important; box-shadow: var(--md-e2) !important;
}

@media (max-width: 640px) {
  :root[data-theme] .layui-layer.md-message-layer { border: 0; border-radius: 0; }
  :root[data-theme] .md-message-layer .layui-layer-content { max-height: calc(100vh - 69px); height: 100%; }
  :root[data-theme] .md-message-preview__header { grid-template-columns: 42px minmax(0, 1fr) 38px; gap: 11px; padding: 18px 16px 15px; }
  :root[data-theme] .md-message-preview__icon { width: 42px; height: 42px; border-radius: 13px; }
  :root[data-theme] .md-message-preview__heading h2 { font-size: 18px; }
  :root[data-theme] .md-message-preview__content { min-height: 0; padding: 22px 18px 36px; font-size: 14.5px; }
  :root[data-theme] .md-message-preview__content img { max-height: 55vh; }
  :root[data-theme] .md-message-layer .layui-layer-btn { position: sticky; bottom: 0; padding: 12px 16px calc(12px + env(safe-area-inset-bottom)) !important; }
  :root[data-theme] .md-message-layer .layui-layer-btn .layui-layer-btn0 { width: 100%; box-sizing: border-box; }
}

@media (prefers-reduced-motion: reduce) {
  :root[data-theme] .md-message-preview__close { transition: none; }
}
