/* 工作台轻工业材质：标题细斜纹、低对比颗粒与局部轮廓线。
   所有规则限定在工作台，避免改变图鉴、寻访与其他页面。 */
[data-view-panel="dashboard"] {
  --dash-header: #edf0f3;
  --dash-warm: #e9e5d3;
  --dash-cool: #dfe5e9;
  --dash-mint: #dce6e0;
  /* 四张资源卡的主色：嵌晶玉＝红、源石＝黄（quota/permit 仍用 cool / mint）。
     只影响工作台这四张卡，不动别处的配色。 */
  --dash-red: #ecdbdb;
  --dash-yellow: #ece4c4;
  --dash-red-line: #c0685f;
  --dash-yellow-line: #c3a12c;
  --dash-dot: #51627812;
  --dash-soft: #ffffffa8;
  --machining: #26344509;
  --edge-light: #ffffff65;
  --edge-dark: #16202b12;
  --grain: url("industrial-grain.svg");
  --hatch: repeating-linear-gradient(125deg, transparent 0 11px, var(--machining) 11px 12px);
}
html[data-theme="dark"] [data-view-panel="dashboard"] {
  --dash-header: #232529;
  --dash-warm: #2c2a21;
  --dash-cool: #232a31;
  --dash-mint: #222e28;
  --dash-red: #2f2323;
  --dash-yellow: #2e2a1e;
  --dash-red-line: #b0615a;
  --dash-yellow-line: #b3922b;
  --dash-dot: #a7b8ca12;
  --dash-soft: #15181ca8;
  --machining: #dce6f00b;
  --edge-light: #ffffff0c;
  --edge-dark: #00000024;
}

/* 内容面保留轻颗粒，不在数字下叠加密集线纹。 */
[data-view-panel="dashboard"] .card,
[data-view-panel="dashboard"] .metric {
  background-image: var(--grain);
  background-size: auto;
  background-position: center;
  box-shadow: var(--shadow);
  border-radius: .875rem;
}

/* 标题是独立的面层；负边距与现有卡片内边距保持一致。 */
[data-view-panel="dashboard"] .card > .card__head,
[data-view-panel="dashboard"] .card > .hero__head {
  padding: .8rem var(--card-pad-x);
  margin: calc(-1 * var(--card-pad)) calc(-1 * var(--card-pad-x)) .9rem;
  border-radius: .875rem .875rem 0 0;
  border-bottom: 1px solid var(--edge-dark);
  background: var(--grain), var(--hatch), linear-gradient(180deg, var(--edge-light), transparent 45%), var(--dash-header);
  box-shadow: inset 0 1px 0 var(--edge-light);
  align-items: center;
  flex-wrap: wrap;
  gap: .65rem 1rem;
}
[data-view-panel="dashboard"] .card > .card__head .card__title,
[data-view-panel="dashboard"] .hero__head .hero__title {
  padding-left: .65rem;
  border-left: 3px solid var(--accent-strong);
  line-height: 1.4;
}
[data-view-panel="dashboard"] .card__foot {
  background: var(--grain), var(--dash-soft);
  border-top: 1px solid var(--line);
  border-radius: 0 0 .875rem .875rem;
}

/* 资源卡：标题细斜纹，内容仅保留微色与轻颗粒。 */
[data-view-panel="dashboard"] #metrics .metric {
  --resource-tint: var(--dash-warm);
  --resource-glow-center: 120% 120%;
  background-image: var(--grain), radial-gradient(ellipse at var(--resource-glow-center), var(--resource-tint), transparent 75%);
  border-top: 2px solid var(--accent-strong);
}
/* 嵌晶玉＝红 */
[data-view-panel="dashboard"] #metrics [data-resource="jade"] {
  --resource-tint: var(--dash-red);
  border-top-color: var(--dash-red-line);
}
/* 源石＝黄 */
[data-view-panel="dashboard"] #metrics [data-resource="src"] {
  --resource-tint: var(--dash-yellow);
  border-top-color: var(--dash-yellow-line);
}
[data-view-panel="dashboard"] #metrics [data-resource="quota"] {
  --resource-tint: var(--dash-cool);
  border-top-color: #648db7;
}
[data-view-panel="dashboard"] #metrics [data-resource="permit"] {
  --resource-tint: var(--dash-mint);
  border-top-color: #4c9b80;
}
[data-view-panel="dashboard"] #metrics .metric__label {
  background: var(--grain), var(--hatch), linear-gradient(180deg, var(--edge-light), transparent 55%), var(--resource-tint);
  border-bottom: 1px solid var(--line);
  border-radius: .75rem .75rem 0 0;
  padding: .65rem var(--card-pad-x);
  margin: calc(-1 * var(--card-pad)) calc(-1 * var(--card-pad-x)) .65rem;
}
[data-view-panel="dashboard"] #metrics .metric__foot {
  color: var(--ink-2);
}

/* 资源卡背面水印：该货币官方英文名的前 4 个字母（OROB / ORIG / ARSE / CHAR），
   右对齐贴着卡片右边。四个字母宽度固定，四张卡的观感天然一致。 */
[data-view-panel="dashboard"] #metrics .metric {
  overflow: hidden;
}
[data-view-panel="dashboard"] #metrics .metric__mark {
  position: absolute;
  /* 让水印层撑满整张卡片（而不是只有 4 个字母那么宽）：
     渐隐是按百分比分布的，铺满卡片才能得到一条横跨卡片的软过渡。
     文字用 text-align:right 贴着右缘，所以看起来仍然是「4 个字母靠右」。 */
  inset: 0;
  z-index: 0;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  pointer-events: none;
  user-select: none;
  white-space: nowrap;
  font-family: var(--font-mono);
  font-weight: 700;
  /* 四张卡共用一个字号 —— 视觉大小必须一致，不能按词长各算一套。
     字号只跟着卡片宽度走：4 列时卡片宽约视口的 14%，3.4vw 约等于卡片宽度的 24%。
     卡片宽度随视口与列数变化，断点系数见下。 */
  --mark-size: 3.4vw;
  font-size: var(--mark-size);
  line-height: 1;
  letter-spacing: .02em;
  color: var(--ink);
  /* 浓度不再写死：由 app.js 的 paintMetricMarkOpacity() 按「卡片背景的亮度 + 灰度占比」
     逐卡设置内联 opacity（灰黑背景直接 0，即不显示；有色且明亮则显示得更清楚）。
     这里给一个兜底值，万一 JS 未执行也不会是一片实心字。 */
  opacity: .09;
  /* 右端渐隐。起点必须正好落在 4 个字母的左缘（--mark-fade，按断点算好），
     这样渐隐只作用于「字母本身」这一段：最左字母实心、往后逐个变淡，
     而不是整块字一起被削。若起点落在字母左侧，虚化带会被浪费在没有字的区域，
     字母反而被整体压淡（看起来像没做虚化）。 */
  -webkit-mask-image: linear-gradient(90deg, #000 0%, #000 var(--mark-fade, 52%), transparent 100%);
          mask-image: linear-gradient(90deg, #000 0%, #000 var(--mark-fade, 52%), transparent 100%);
}
/* 完整英文名放在缩写下方，共享父层遮罩与透明度，原缩写位置不变。 */
[data-view-panel="dashboard"] #metrics .metric__mark-sub {
  position: absolute;
  top: calc(50% + var(--mark-size) * .62);
  right: .15rem;
  max-width: calc(100% - .3rem);
  font-size: clamp(.4rem, .2em, .6rem);
  line-height: 1.2;
  letter-spacing: .06em;
  font-weight: 600;
}
/* 4 列 → 2 列（styles.css 的 .metrics 断点同为 1100px）：卡片占视口比例变大，字号同步放大。
   --mark-fade 是「4 个字母左缘」在卡片宽度里的比例，必须随字号一起改：
   字母宽 = 4 × 0.566em ≈ 2.264 × 字号，除以卡片宽（约 24.6vw / 32.6vw / 56.3vw）即得。 */
@media (max-width: 1100px) {
  [data-view-panel="dashboard"] #metrics .metric__mark {
    --mark-size: 6.5vw;
    --mark-fade: 45.2%;
  }
}
/* 2 列 → 1 列；上限 2.3rem 防止超宽屏字过大 */
@media (max-width: 640px) {
  [data-view-panel="dashboard"] #metrics .metric__mark {
    --mark-size: min(10.5vw, 2.3rem);
    --mark-fade: 62.7%;
  }
}
/* 正文压在 ... 之上，避免水印盖住数字 */
[data-view-panel="dashboard"] #metrics .metric__label,
[data-view-panel="dashboard"] #metrics .metric__value,
[data-view-panel="dashboard"] #metrics .metric__foot {
  position: relative;
  z-index: 1;
}
/* 深色水印与背景共享椭圆中心和尺寸；55% 外完全透明，
   早于背景色在 75% 处消失，给灰黑区域留下完整的无字缓冲带。 */
html[data-theme="dark"] [data-view-panel="dashboard"] #metrics .metric__mark {
  color: color-mix(in srgb, var(--resource-tint) 50%, #ffffff);
  opacity: 0;
}
/* 浅色用染色灰墨而非发光白字，英文副行降低一档浓度。 */
html:not([data-theme="dark"]) [data-view-panel="dashboard"] #metrics .metric__mark {
  color: #92752f;
}
html:not([data-theme="dark"]) [data-view-panel="dashboard"] #metrics [data-resource="jade"] .metric__mark { color: #a0504a; }
html:not([data-theme="dark"]) [data-view-panel="dashboard"] #metrics [data-resource="src"] .metric__mark { color: #8f7420; }
html:not([data-theme="dark"]) [data-view-panel="dashboard"] #metrics [data-resource="quota"] .metric__mark { color: #497ca6; }
html:not([data-theme="dark"]) [data-view-panel="dashboard"] #metrics [data-resource="permit"] .metric__mark { color: #40876d; }
html:not([data-theme="dark"]) [data-view-panel="dashboard"] #metrics .metric__mark-sub {
  opacity: .7;
  letter-spacing: .09em;
}

/* 兑换跟随站点面层，保留黄色细分隔与局部斜纹。 */
[data-view-panel="dashboard"] .card--calc {
  background-image: var(--grain), linear-gradient(135deg, var(--surface), var(--surface-2));
}
[data-view-panel="dashboard"] .card--calc > .card__head {
  background: var(--grain), var(--hatch), var(--dash-header);
  border-bottom: 1px solid var(--accent-strong);
  color: var(--ink);
}
[data-view-panel="dashboard"] .card--calc > .card__head .card__sub { color: var(--ink-3); }
[data-view-panel="dashboard"] .card--calc .conv-tab {
  background: var(--surface);
  color: var(--ink-2);
  border-color: var(--line);
}
[data-view-panel="dashboard"] .card--calc .conv-tab.is-active {
  background: var(--accent);
  color: #161a20;
  border-color: var(--accent);
}
[data-view-panel="dashboard"] .conv-sum {
  background: var(--grain), linear-gradient(110deg, var(--dash-warm), var(--surface));
  border-color: var(--line-strong);
  border-left: 2px solid var(--accent-strong);
  box-shadow: none;
}

/* 收入主卡：暖色大片面层，右侧用极淡的圆弧替代全幅网格。 */
[data-view-panel="dashboard"] .hero:not(.hero--chart) {
  background-image: var(--grain), repeating-radial-gradient(ellipse at 110% 120%, transparent 0 22px, var(--machining) 23px 24px, transparent 25px 44px),
    linear-gradient(115deg, var(--surface) 30%, var(--dash-warm));
}
[data-view-panel="dashboard"] .hero:not(.hero--chart) > .hero__head { background-color: var(--dash-warm); }
[data-view-panel="dashboard"] .hero::before,
[data-view-panel="dashboard"] .hero__glow { display: none; }
[data-view-panel="dashboard"] .hero__stats { background: var(--dash-soft); }

/* 趋势：淡点阵只放在图表卡，文字与标题仍为实体面层。 */
[data-view-panel="dashboard"] .hero--chart {
  background-image: var(--grain), radial-gradient(circle, var(--dash-dot) .9px, transparent 1.2px);
  background-size: 160px 160px, .65rem .65rem;
}
[data-view-panel="dashboard"] .hero--chart > .hero__head { background-color: var(--dash-cool); }
[data-view-panel="dashboard"] #trendMetrics .metric { background-image: var(--grain); }
[data-view-panel="dashboard"] #trendMetrics .metric__label {
  padding: .55rem var(--card-pad-x);
  margin: calc(-1 * var(--card-pad)) calc(-1 * var(--card-pad-x)) .65rem;
  border-radius: .875rem .875rem 0 0;
  border-bottom: 1px solid var(--line);
  background: var(--grain), var(--hatch), var(--dash-header);
}
[data-view-panel="dashboard"] #trendMetrics .metric:last-child .metric__label { background-color: var(--dash-mint); }

/* 目标用绿调柔光，记录保持纸面感，构成与近期获得各有不同标题色。 */
[data-view-panel="dashboard"] .target-card {
  background-image: var(--grain), radial-gradient(ellipse at right bottom, var(--dash-mint), transparent 65%);
}
[data-view-panel="dashboard"] .target-card > .card__head { background-color: var(--dash-mint); }
[data-view-panel="dashboard"] .target-card .stat-row {
  padding: .75rem;
  border: 1px solid var(--line);
  border-radius: .5rem;
  background: var(--dash-soft);
  box-shadow: none;
}
/* 变动记录正文不铺纹理：颗粒与 40px 横线原本盖在卡片上，条目压到 49px 后
   线条密度显得比内容还抢眼。标题栏的背景是独立的一层，不受这里影响。 */
[data-view-panel="dashboard"] .dashboard-ledger { background-image: none; }
[data-view-panel="dashboard"] .dashboard-composition > .card__head { background-color: var(--dash-cool); }
[data-view-panel="dashboard"] .dashboard-gains > .card__head { background-color: var(--dash-mint); }
[data-view-panel="dashboard"] .dashboard-gains {
  background-image: var(--grain), linear-gradient(180deg, transparent 65%, var(--dash-mint));
}
/* 限制货币构成整体高度，保留网格原有的并排等高行为。
   标题与页脚不压缩，只有明细表参与收缩并在内部滚动。 */
[data-view-panel="dashboard"] .dashboard-composition {
  max-height: 24rem;
  min-height: 0;
}
[data-view-panel="dashboard"] .dashboard-composition > .card__head,
[data-view-panel="dashboard"] .dashboard-composition > .stackbar,
[data-view-panel="dashboard"] .dashboard-composition > .card__foot { flex-shrink: 0; }
[data-view-panel="dashboard"] .dashboard-composition .table-wrap {
  min-height: 0;
  max-height: 16rem;
  margin: 0 calc(-1 * var(--card-pad-x));
  overflow: auto;
  scrollbar-width: thin;
  scrollbar-color: var(--line-strong) transparent;
  scroll-padding-top: 2.5rem;
}
[data-view-panel="dashboard"] .dashboard-composition .table th {
  position: sticky; top: 0; z-index: 1; background: var(--surface-2);
}
[data-view-panel="dashboard"] .dashboard-composition .table td { padding-block: .55rem; }
[data-view-panel="dashboard"] .dashboard-composition .stackbar { margin-block: .25rem .75rem; }
[data-view-panel="dashboard"] .dashboard-composition > .card__foot { margin-bottom: 0; }
[data-view-panel="dashboard"] .dashboard-composition .table-wrap:focus-visible {
  outline: 2px solid var(--accent-strong); outline-offset: -2px;
}

/* 变动记录：与「货币构成」用同一条高度线。
   条目原先的 0.875rem 内边距 + 跨两行的时间列，把单条记录抬到约 109px，
   远超构成表一行的 49.7px，一屏只看得到三条半。
   这里让时间列退回单行，条目改成一行排布并把内边距压到与表格同档，
   单条约 49.7px；卡片本身上限也收到 24rem，与货币构成卡上下对齐。 */
[data-view-panel="dashboard"] .dashboard-ledger {
  max-height: 24rem;
  min-height: 0;
  overflow: hidden;
}
[data-view-panel="dashboard"] .dashboard-ledger .ledger {
  flex: 1 1 auto;
  min-height: 0;
  max-height: none;
  margin: 0 calc(-1 * var(--card-pad-x));
  overflow: auto;
  scrollbar-width: thin;
  scrollbar-color: var(--line-strong) transparent;
}
[data-view-panel="dashboard"] .dashboard-ledger .ledger:focus-visible {
  outline: 2px solid var(--accent-strong); outline-offset: -2px;
}
[data-view-panel="dashboard"] .dashboard-ledger .ledger__item {
  /* 五列排成一行：时间｜货币（吸收余量）｜增减｜前后值｜类型 */
  grid-template-columns: 3.25rem minmax(4.5rem, 1fr) 3.25rem 6.5rem 2.75rem;
  gap: .5rem;
  padding: .6rem var(--card-pad-x);
  border-bottom: 1px solid var(--line-soft);
  font-size: .75rem;
}
[data-view-panel="dashboard"] .dashboard-ledger .ledger__item:last-child { border-bottom: 0; }
[data-view-panel="dashboard"] .dashboard-ledger .ledger__time {
  grid-row: auto;
  font-size: .625rem;
  line-height: 1.5;
}
[data-view-panel="dashboard"] .dashboard-ledger .ledger__cur {
  grid-column: 2;
  font-size: .75rem;
  line-height: 1.5;
}
[data-view-panel="dashboard"] .dashboard-ledger .ledger__delta {
  font-size: .8125rem;
  line-height: 1.5;
}
[data-view-panel="dashboard"] .dashboard-ledger .ledger__flow {
  grid-column: auto;
  font-size: .6875rem;
  line-height: 1.5;
}
[data-view-panel="dashboard"] .dashboard-ledger .ledger__kind {
  font-size: .625rem;
  justify-self: center;
  line-height: 1.5;
}
[data-view-panel="dashboard"] .dashboard-ledger .thumb--xs { width: 1.125rem; height: 1rem; }
[data-view-panel="dashboard"] .dashboard-ledger .thumb--xs .thumb__img { width: .875rem; height: .875rem; }

@media (max-width: 640px) {
  [data-view-panel="dashboard"] .card > .card__head,
  [data-view-panel="dashboard"] .card > .hero__head { padding-block: .7rem; }
  [data-view-panel="dashboard"] .card--calc .card__actions { width: 100%; }
  [data-view-panel="dashboard"] .metric__label { line-height: 1.5; }
}

/* 获得来源：一张横向卡片，三列资源共用信息层级。 */
.acquisition-card { margin-top: var(--card-gap); }
[data-view-panel="dashboard"] .acquisition-card > .card__head { display: grid; grid-template-columns: minmax(0,1fr) 14.5rem; align-items: start; gap: .4rem 1rem; }
.acquisition-heading { min-width: 0; }
.acquisition-context { display: flex; align-items: center; flex-wrap: wrap; gap: .2rem .4rem; }
.acquisition-controls { display: flex; align-items: center; gap: .5rem; width: 14.5rem; }
/* 保留选择框的宽度，切换全部 / 赛季时右侧按钮保持原位。 */
.acquisition-season-slot { flex: 0 0 7rem; min-width: 0; }
.acquisition-switch { display: flex; flex: 0 0 7rem; border: 1px solid var(--line-strong); border-radius: .5rem; padding: .15rem; }
.acquisition-switch button { flex: 1; background: transparent; border: 0; color: var(--ink-3); padding: .35rem .5rem; border-radius: .35rem; cursor: pointer; font: inherit; font-size: .75rem; white-space: nowrap; }
.acquisition-switch button[aria-pressed="true"] { background: var(--ink); color: var(--surface); }
#acquisitionSeason { width: 100%; min-width: 0; min-height: 0; max-width: 100%; height: 2rem; padding: .25rem .4rem; font-size: .75rem; }
#acquisitionSeason[hidden], #seasonCancel[hidden] { display: none; }
.acquisition-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); }
.acquisition-resource { min-width: 0; padding: 0 1.25rem; border-left: 1px solid var(--line-soft); }
.acquisition-resource:first-child { padding-left: 0; border-left: 0; }
.acquisition-resource:last-child { padding-right: 0; }
.acquisition-summary { display: flex; justify-content: space-between; align-items: start; gap: .5rem; }
.acquisition-summary h3 { margin: 0 0 .25rem; font-size: .875rem; color: var(--ink); }
.acquisition-summary strong { display: block; font-size: 1.4rem; line-height: 1.2; font-variant-numeric: tabular-nums; }
.acquisition-summary span { display: block; color: var(--ink-3); font-size: .6875rem; margin-top: .3rem; }
.acquisition-summary > div:last-child { text-align: right; }
/* 条带保留真实占比；透明触碰区让细条更容易悬停。 */
.acquisition-chart { position: relative; margin: .45rem 0 .25rem; }
.acquisition-bar { display: flex; height: 1.5rem; gap: 1px; align-items: stretch; }
.acquisition-segment { display: block; position: relative; flex-shrink: 1; min-width: 0; padding: 0; border: 0; border-radius: 0; background: transparent; cursor: pointer; }
.acquisition-segment::before { content: ''; position: absolute; inset: .55rem 0; background: var(--segment-color); }
.acquisition-segment:hover::before, .acquisition-segment.is-highlighted::before { inset-block: .4rem; filter: brightness(1.18); }
.acquisition-segment:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.acquisition-summary-right { position: relative; flex: 1; min-width: 0; align-self: stretch; }
.acquisition-summary > div:first-child { flex-shrink: 0; }
.acquisition-summary-right.has-source-detail .acquisition-total { visibility: hidden; }
.acquisition-tooltip { position: absolute; inset: 0; display: flex; flex-direction: column; justify-content: center; text-align: right; color: var(--ink); font-size: .75rem; min-width: 0; }
.acquisition-tooltip b { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.acquisition-tooltip span { white-space: nowrap; }
.acquisition-tooltip b, .acquisition-tooltip span { display: block; }
.acquisition-tooltip span { margin-top: .25rem; color: var(--ink-2); font-variant-numeric: tabular-nums; }
.acquisition-tooltip[hidden], .acquisition-sources li[hidden] { display: none; }
.acquisition-sources { list-style: none; padding: 0; margin: 0; min-height: 10rem; }
.acquisition-pagination { display: flex; align-items: center; justify-content: flex-end; gap: .65rem; padding-top: .6rem; color: var(--ink-3); font-size: .6875rem; font-variant-numeric: tabular-nums; }
.acquisition-pagination > div { display: flex; gap: .25rem; }
.acquisition-pagination button { display: grid; place-content: center; width: 1.75rem; height: 1.5rem; border: 1px solid var(--line-soft); border-radius: .3rem; background: transparent; color: var(--ink-2); font-size: 1.1rem; cursor: pointer; }
.acquisition-pagination button:hover:not(:disabled) { background: var(--surface-2); border-color: var(--line-strong); }
.acquisition-pagination button:disabled { opacity: .3; cursor: default; }
.acquisition-sources li { display: grid; grid-template-columns: minmax(0, 1fr) auto 3.4rem; gap: .6rem; align-items: center; font-size: .75rem; min-height: 2rem; border-bottom: 1px solid var(--line-soft); font-variant-numeric: tabular-nums; }
.acquisition-source { display: flex; align-items: center; min-width: 0; gap: .45rem; }
.acquisition-source > i { width: .4rem; height: .4rem; flex: 0 0 .4rem; border-radius: 1px; }
.acquisition-source > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.acquisition-sources b { font-weight: 600; }
.acquisition-percent { text-align: right; color: var(--ink-3); }
.acquisition-empty { color: var(--ink-3); padding: 1rem 0; font-size: .8rem; grid-column: 1 / -1; }
.acquisition-note { margin-top: .6rem; padding-top: .5rem; border-top: 1px solid var(--line-soft); font-size: .6875rem; }
.season-row { display: flex; justify-content: space-between; align-items: center; gap: 1rem; padding: .85rem 0; border-bottom: 1px solid var(--line-soft); }
.season-row b { font-size: .875rem; overflow-wrap: anywhere; }
.season-row span { display: block; font-size: .75rem; color: var(--ink-3); margin-top: .3rem; }
.season-row > div:last-child { display: flex; flex-shrink: 0; }
.season-settings-head, .season-settings-head > div { display: flex; align-items: center; gap: .5rem; }
.season-settings-head { justify-content: space-between; flex-wrap: wrap; }
.season-settings-head select { max-width: 100%; min-height: 2rem; font-size: .75rem; }
.season-settings-head [hidden], .season-settings [hidden] { display: none; }
.season-row a { font-size: .75rem; color: var(--ink-3); text-decoration: none; white-space: nowrap; }
.season-row a:hover { color: var(--ink); text-decoration: underline; }
.season-boundary-note { margin: .75rem 0 0; font-size: .6875rem; color: var(--ink-3); line-height: 1.6; }
.season-settings #officialSeasonStatus { margin: .5rem 0; font-size: .75rem; }
.season-settings #officialSeasonStatus.is-error { color: var(--ink-2); }
.season-row--official { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: .25rem .75rem; padding-block: .625rem; }
.season-row--official > div:first-child { display: contents; }
.season-row--official b { grid-column: 1; grid-row: 1; }
.season-row--official span { grid-column: 1 / -1; grid-row: 2; margin-top: 0; }
.season-row--official > div:last-child { grid-column: 2; grid-row: 1; align-self: center; }
@media (max-width: 1000px) {
  .acquisition-resource { padding-inline: .75rem; }
  .acquisition-sources li { gap: .3rem; }
}
@media (max-width: 760px) {
  .acquisition-grid { grid-template-columns: minmax(0, 1fr); }
  .acquisition-resource, .acquisition-resource:first-child, .acquisition-resource:last-child { padding: 1rem 0; border-left: 0; border-bottom: 1px solid var(--line-soft); }
  .acquisition-resource:last-child { border-bottom: 0; }
  .acquisition-summary strong { font-size: 1.3rem; }
  .season-row { align-items: flex-start; flex-wrap: wrap; }
}

/* 周收入详情浮层挂到 body，避免被图表卡片裁切。 */
.weekly-income-tooltip { position: fixed; z-index: 100; width: min(23rem, calc(100vw - 24px)); max-height: calc(100dvh - 24px); overflow: auto; box-sizing: border-box; padding: 1rem; background: var(--surface); color: var(--ink); border: 1px solid var(--line-strong); border-radius: .7rem; box-shadow: 0 10px 32px #0004; font-size: .75rem; }
.weekly-income-tooltip[hidden] { display: none; }
.weekly-income-tooltip header { display: flex; justify-content: space-between; gap: .75rem; align-items: flex-start; }
.weekly-income-tooltip header span { display: block; margin-top: .3rem; color: var(--ink-3); }
.weekly-income-tooltip header button { border: 0; background: transparent; color: var(--ink-3); cursor: pointer; font-size: 1.15rem; min-width: 1.5rem; min-height: 1.5rem; }
.weekly-income-totals { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; padding: 1rem 0; }
.weekly-income-totals span { display: block; color: var(--ink-3); }
.weekly-income-totals strong { display: block; margin-top: .3rem; font-size: 1.5rem; font-variant-numeric: tabular-nums; }
.weekly-income-caption { display: flex; justify-content: space-between; border-top: 1px solid var(--line-soft); padding-top: .75rem; color: var(--ink-3); }
.weekly-income-tooltip ul { list-style: none; padding: 0; margin: .3rem 0 .7rem; min-height: calc(var(--weekly-rows, 4) * 2.7rem); }
.weekly-income-tooltip li[hidden] { display: none; }
.weekly-pagination { padding-top: 0; margin-bottom: .7rem; }
.weekly-income-tooltip li { padding: .4rem 0; min-height: 2.7rem; box-sizing: border-box; }
.weekly-income-tooltip li > div { display: grid; grid-template-columns: minmax(0, 1fr) auto 3.2rem; gap: .5rem; align-items: start; font-variant-numeric: tabular-nums; }
.weekly-income-tooltip li span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.weekly-income-tooltip li em { font-style: normal; text-align: right; color: var(--ink-3); }
.weekly-income-tooltip li i { display: block; height: 3px; margin-top: .4rem; background: linear-gradient(to right, var(--accent) var(--share), var(--line-soft) var(--share)); }
.weekly-income-tooltip footer, .weekly-income-empty { font-size: .6875rem; color: var(--ink-3); }
#chartPlot .bar { cursor: pointer; }
#chartPlot .bar[aria-expanded="true"] .bar__fill { filter: brightness(1.2); }
.chart__empty { pointer-events: none; }

/* 宽屏把来源详情放进标题与总量之间的留白；窄分区临时借用总量位置。 */
.acquisition-resource { container-type: inline-size; }
@container (min-width: 25rem) {
  .acquisition-summary { position: relative; }
  .acquisition-summary-right { position: static; flex: initial; }
  .acquisition-summary-right.has-source-detail .acquisition-total { visibility: visible; }
  .acquisition-tooltip { left: 8rem; right: 8rem; text-align: left; }
}

/* 来源提示引导线：两次圆角转折，在标题与色条之间的留白中走线。 */
.acquisition-leader { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none; z-index: 2; }
.acquisition-leader[hidden] { display: none; }
.acquisition-leader path { fill: none; stroke: currentColor; stroke-width: 1.2; stroke-linecap: round; stroke-linejoin: round; vector-effect: non-scaling-stroke; opacity: .85; }
.acquisition-leader circle { fill: currentColor; stroke: var(--surface); stroke-width: 1; vector-effect: non-scaling-stroke; }

/* 首页信息层级：余额 → 同周期收支 → 趋势 → 来源 → 持有目标 → 最近流水。 */
.dashboard-data-line { display: flex; justify-content: space-between; align-items: center; gap: .75rem; margin: -.2rem 0 1rem; color: var(--ink-3); font-size: .6875rem; line-height: 1.6; }
.dashboard-data-line > span { min-width: 0; }
.dashboard-data-line button { flex-shrink: 0; }
.flow-summary .card__actions select { font-size: .75rem; width: auto; }
.flow-metrics { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); margin-bottom: .75rem; }
.flow-metrics > div { padding: .25rem 1rem; border-left: 1px solid var(--line-soft); }
.flow-metrics > div:first-child { padding-left: 0; border: 0; }
.flow-metrics span { display: block; font-size: .75rem; color: var(--ink-3); }
.flow-metrics strong { display: block; margin-top: .35rem; font-size: clamp(1.2rem,2vw,1.8rem); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
.flow-comparison { padding-top: .7rem; border-top: 1px solid var(--line-soft); margin-bottom: .35rem; }
[data-view-panel="dashboard"] .income-overview { margin-top: var(--card-gap); }
.income-overview .hero__value { font-size: 2rem; margin: .5rem 0; }
.income-overview .hero__sub { margin-bottom: .75rem; }
[data-view-panel="dashboard"] .grid-2--ledger { grid-template-columns: minmax(0, 1fr); }
.target-card .stat-rows { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 1rem; }
[data-view-panel="dashboard"] .dashboard-ledger { max-height: none; }
[data-view-panel="dashboard"] .dashboard-ledger .ledger { overflow: visible; max-height: none; }
[data-view-panel="dashboard"] .dashboard-ledger .ledger__item { grid-template-columns: 4.5rem minmax(5rem,1fr) 6rem 9rem 4rem; }
.dashboard-converter { margin-top: var(--card-gap); border: 1px solid var(--line); border-radius: .875rem; background: var(--surface); }
.dashboard-converter > summary { display: flex; justify-content: space-between; gap: 1rem; padding: 1rem var(--card-pad-x); cursor: pointer; font-size: .875rem; font-weight: 600; }
.dashboard-converter > summary span:last-child { font-size: .75rem; font-weight: 400; color: var(--ink-3); }
.dashboard-converter > summary::after { content: '+'; }
.dashboard-converter[open] > summary::after { content: '−'; }
.dashboard-converter > .card { margin: 0; border: 0; }
@media (max-width: 640px) {
  .dashboard-data-line { align-items: flex-start; }
  .flow-metrics > div { padding-inline: .6rem; }
  .target-card .stat-rows { grid-template-columns: minmax(0,1fr); }
  [data-view-panel="dashboard"] .dashboard-ledger .ledger__item { grid-template-columns: 3rem minmax(0,1fr) 4rem 2.6rem; gap: .4rem; }
  [data-view-panel="dashboard"] .dashboard-ledger .ledger__flow { display: none; }
  .dashboard-converter > summary span:last-child { max-width: 55%; }
}
@media (max-width: 640px) {
  .flow-metrics strong { font-size: clamp(.85rem, 3.8vw, 1.1rem); white-space: nowrap; overflow-wrap: normal; }
}
@media (max-width: 760px) {
  [data-view-panel="dashboard"] .acquisition-card > .card__head { grid-template-columns: minmax(0,1fr) 7rem; column-gap: .5rem; }
  .acquisition-heading { display: contents; }
  .acquisition-heading .card__title { grid-column: 1; grid-row: 1; }
  .acquisition-controls { display: contents; }
  .acquisition-switch { grid-column: 2; grid-row: 1; }
  .acquisition-season-slot { grid-column: 2; grid-row: 2; }
  .acquisition-season-slot:has(select[hidden]) { display: none; }
  #acquisitionSeason { height: 1.3rem; padding: .15rem .25rem; font-size: .625rem; }
  .acquisition-context { grid-column: 1 / -1; grid-row: 2; }
  .acquisition-card:has(#acquisitionSeason:not([hidden])) .acquisition-context { grid-row: 3; }
  .acquisition-sources { min-height: calc(var(--source-rows, 5) * 2rem); }
}
.dashboard-converter > summary::before { display: none; }
.dashboard-converter > summary::-webkit-details-marker { display: none; }
