/* ============================================================
 * arco-vi.css · 第 1 部分：Arco 官方令牌层（机器生成，勿手改）
 * 来源 arco-design/arco-design @ c2b050d9c7ce94bebba94f616a0721344231caac
 * 由 scripts/gen-arco-vi-tokens.py 生成
 * ============================================================ */

/* ---------- 1.1 官方原始色板（13 族 × 10 档）---------- */
html:root {
  --arcoblue-1: 232, 243, 255;
  --arcoblue-2: 190, 218, 255;
  --arcoblue-3: 148, 191, 255;
  --arcoblue-4: 106, 161, 255;
  --arcoblue-5: 64, 128, 255;
  --arcoblue-6: 22, 93, 255;
  --arcoblue-7: 14, 66, 210;
  --arcoblue-8: 7, 44, 166;
  --arcoblue-9: 3, 26, 121;
  --arcoblue-10: 0, 13, 77;
  --red-1: 255, 236, 232;
  --red-2: 253, 205, 197;
  --red-3: 251, 172, 163;
  --red-4: 249, 137, 129;
  --red-5: 247, 101, 96;
  --red-6: 245, 63, 63;
  --red-7: 203, 39, 45;
  --red-8: 161, 21, 30;
  --red-9: 119, 8, 19;
  --red-10: 77, 0, 10;
  --orangered-1: 255, 243, 232;
  --orangered-2: 253, 221, 195;
  --orangered-3: 252, 197, 159;
  --orangered-4: 250, 172, 123;
  --orangered-5: 249, 144, 87;
  --orangered-6: 247, 114, 52;
  --orangered-7: 204, 81, 32;
  --orangered-8: 162, 53, 17;
  --orangered-9: 119, 31, 6;
  --orangered-10: 77, 14, 0;
  --orange-1: 255, 247, 232;
  --orange-2: 255, 228, 186;
  --orange-3: 255, 207, 139;
  --orange-4: 255, 182, 93;
  --orange-5: 255, 154, 46;
  --orange-6: 255, 125, 0;
  --orange-7: 210, 95, 0;
  --orange-8: 166, 69, 0;
  --orange-9: 121, 46, 0;
  --orange-10: 77, 27, 0;
  --gold-1: 255, 252, 232;
  --gold-2: 253, 244, 191;
  --gold-3: 252, 233, 150;
  --gold-4: 250, 220, 109;
  --gold-5: 249, 204, 69;
  --gold-6: 247, 186, 30;
  --gold-7: 204, 146, 19;
  --gold-8: 162, 109, 10;
  --gold-9: 119, 75, 4;
  --gold-10: 77, 45, 0;
  --yellow-1: 254, 255, 232;
  --yellow-2: 254, 254, 190;
  --yellow-3: 253, 250, 148;
  --yellow-4: 252, 242, 107;
  --yellow-5: 251, 232, 66;
  --yellow-6: 250, 220, 25;
  --yellow-7: 207, 175, 15;
  --yellow-8: 163, 132, 8;
  --yellow-9: 120, 93, 3;
  --yellow-10: 77, 56, 0;
  --lime-1: 252, 255, 232;
  --lime-2: 237, 248, 187;
  --lime-3: 220, 241, 144;
  --lime-4: 201, 233, 104;
  --lime-5: 181, 226, 65;
  --lime-6: 159, 219, 29;
  --lime-7: 126, 183, 18;
  --lime-8: 95, 148, 10;
  --lime-9: 67, 112, 4;
  --lime-10: 42, 77, 0;
  --green-1: 232, 255, 234;
  --green-2: 175, 240, 181;
  --green-3: 123, 225, 136;
  --green-4: 76, 210, 99;
  --green-5: 35, 195, 67;
  --green-6: 0, 180, 42;
  --green-7: 0, 154, 41;
  --green-8: 0, 128, 38;
  --green-9: 0, 102, 34;
  --green-10: 0, 77, 28;
  --cyan-1: 232, 255, 251;
  --cyan-2: 183, 244, 236;
  --cyan-3: 137, 233, 224;
  --cyan-4: 94, 223, 214;
  --cyan-5: 55, 212, 207;
  --cyan-6: 20, 201, 201;
  --cyan-7: 13, 165, 170;
  --cyan-8: 7, 130, 139;
  --cyan-9: 3, 97, 108;
  --cyan-10: 0, 66, 77;
  --blue-1: 232, 247, 255;
  --blue-2: 195, 231, 254;
  --blue-3: 159, 212, 253;
  --blue-4: 123, 192, 252;
  --blue-5: 87, 169, 251;
  --blue-6: 52, 145, 250;
  --blue-7: 32, 108, 207;
  --blue-8: 17, 75, 163;
  --blue-9: 6, 48, 120;
  --blue-10: 0, 26, 77;
  --purple-1: 245, 232, 255;
  --purple-2: 221, 190, 246;
  --purple-3: 195, 150, 237;
  --purple-4: 168, 113, 227;
  --purple-5: 141, 78, 218;
  --purple-6: 114, 46, 209;
  --purple-7: 85, 29, 176;
  --purple-8: 60, 16, 143;
  --purple-9: 39, 6, 110;
  --purple-10: 22, 0, 77;
  --pinkpurple-1: 255, 232, 251;
  --pinkpurple-2: 247, 186, 239;
  --pinkpurple-3: 240, 142, 230;
  --pinkpurple-4: 232, 101, 223;
  --pinkpurple-5: 225, 62, 219;
  --pinkpurple-6: 217, 26, 217;
  --pinkpurple-7: 176, 16, 182;
  --pinkpurple-8: 138, 9, 147;
  --pinkpurple-9: 101, 3, 112;
  --pinkpurple-10: 66, 0, 77;
  --magenta-1: 255, 232, 241;
  --magenta-2: 253, 194, 219;
  --magenta-3: 251, 157, 199;
  --magenta-4: 249, 121, 183;
  --magenta-5: 247, 84, 168;
  --magenta-6: 245, 49, 157;
  --magenta-7: 203, 30, 131;
  --magenta-8: 161, 16, 105;
  --magenta-9: 119, 6, 79;
  --magenta-10: 77, 0, 52;
  --gray-1: 247, 248, 250;
  --gray-2: 242, 243, 245;
  --gray-3: 229, 230, 235;
  --gray-4: 201, 205, 212;
  --gray-5: 169, 174, 184;
  --gray-6: 134, 144, 156;
  --gray-7: 107, 119, 133;
  --gray-8: 78, 89, 105;
  --gray-9: 39, 46, 59;
  --gray-10: 29, 33, 41;
}

/* 暗色：官方在 body[arco-theme=dark] 下整块反转色板 */
html[data-theme="dark"] {
  --arcoblue-1: 0, 13, 77;
  --arcoblue-2: 4, 27, 121;
  --arcoblue-3: 14, 50, 166;
  --arcoblue-4: 29, 77, 210;
  --arcoblue-5: 48, 110, 255;
  --arcoblue-6: 60, 126, 255;
  --arcoblue-7: 104, 159, 255;
  --arcoblue-8: 147, 190, 255;
  --arcoblue-9: 190, 218, 255;
  --arcoblue-10: 234, 244, 255;
  --red-1: 77, 0, 10;
  --red-2: 119, 6, 17;
  --red-3: 161, 22, 31;
  --red-4: 203, 46, 52;
  --red-5: 245, 78, 78;
  --red-6: 247, 105, 101;
  --red-7: 249, 141, 134;
  --red-8: 251, 176, 167;
  --red-9: 253, 209, 202;
  --red-10: 255, 240, 236;
  --orangered-1: 77, 14, 0;
  --orangered-2: 119, 30, 5;
  --orangered-3: 162, 55, 20;
  --orangered-4: 204, 87, 41;
  --orangered-5: 247, 126, 69;
  --orangered-6: 249, 146, 90;
  --orangered-7: 250, 173, 125;
  --orangered-8: 252, 198, 161;
  --orangered-9: 253, 222, 197;
  --orangered-10: 255, 244, 235;
  --orange-1: 77, 27, 0;
  --orange-2: 121, 48, 4;
  --orange-3: 166, 75, 10;
  --orange-4: 210, 105, 19;
  --orange-5: 255, 139, 31;
  --orange-6: 255, 150, 38;
  --orange-7: 255, 179, 87;
  --orange-8: 255, 205, 135;
  --orange-9: 255, 227, 184;
  --orange-10: 255, 247, 232;
  --gold-1: 77, 45, 0;
  --gold-2: 119, 75, 4;
  --gold-3: 162, 111, 15;
  --gold-4: 204, 150, 31;
  --gold-5: 247, 192, 52;
  --gold-6: 249, 204, 68;
  --gold-7: 250, 220, 108;
  --gold-8: 252, 233, 149;
  --gold-9: 253, 244, 190;
  --gold-10: 255, 252, 232;
  --yellow-1: 77, 56, 0;
  --yellow-2: 120, 94, 7;
  --yellow-3: 163, 134, 20;
  --yellow-4: 207, 179, 37;
  --yellow-5: 250, 225, 60;
  --yellow-6: 251, 233, 75;
  --yellow-7: 252, 243, 116;
  --yellow-8: 253, 250, 157;
  --yellow-9: 254, 254, 198;
  --yellow-10: 254, 255, 240;
  --lime-1: 42, 77, 0;
  --lime-2: 68, 112, 6;
  --lime-3: 98, 148, 18;
  --lime-4: 132, 183, 35;
  --lime-5: 168, 219, 57;
  --lime-6: 184, 226, 75;
  --lime-7: 203, 233, 112;
  --lime-8: 222, 241, 152;
  --lime-9: 238, 248, 194;
  --lime-10: 253, 255, 238;
  --green-1: 0, 77, 28;
  --green-2: 4, 102, 37;
  --green-3: 10, 128, 45;
  --green-4: 18, 154, 55;
  --green-5: 29, 180, 64;
  --green-6: 39, 195, 70;
  --green-7: 80, 210, 102;
  --green-8: 126, 225, 139;
  --green-9: 178, 240, 183;
  --green-10: 235, 255, 236;
  --cyan-1: 0, 66, 77;
  --cyan-2: 6, 97, 108;
  --cyan-3: 17, 131, 139;
  --cyan-4: 31, 166, 170;
  --cyan-5: 48, 201, 201;
  --cyan-6: 63, 212, 207;
  --cyan-7: 102, 223, 215;
  --cyan-8: 144, 233, 225;
  --cyan-9: 190, 244, 237;
  --cyan-10: 240, 255, 252;
  --blue-1: 0, 26, 77;
  --blue-2: 5, 47, 120;
  --blue-3: 19, 76, 163;
  --blue-4: 41, 113, 207;
  --blue-5: 70, 153, 250;
  --blue-6: 90, 170, 251;
  --blue-7: 125, 193, 252;
  --blue-8: 161, 213, 253;
  --blue-9: 198, 232, 254;
  --blue-10: 234, 248, 255;
  --purple-1: 22, 0, 77;
  --purple-2: 39, 6, 110;
  --purple-3: 62, 19, 143;
  --purple-4: 90, 37, 176;
  --purple-5: 123, 61, 209;
  --purple-6: 142, 81, 218;
  --purple-7: 169, 116, 227;
  --purple-8: 197, 154, 237;
  --purple-9: 223, 194, 246;
  --purple-10: 247, 237, 255;
  --pinkpurple-1: 66, 0, 77;
  --pinkpurple-2: 101, 3, 112;
  --pinkpurple-3: 138, 13, 147;
  --pinkpurple-4: 176, 27, 182;
  --pinkpurple-5: 217, 46, 217;
  --pinkpurple-6: 225, 61, 219;
  --pinkpurple-7: 232, 102, 223;
  --pinkpurple-8: 240, 146, 230;
  --pinkpurple-9: 247, 193, 240;
  --pinkpurple-10: 255, 242, 253;
  --magenta-1: 77, 0, 52;
  --magenta-2: 119, 8, 80;
  --magenta-3: 161, 23, 108;
  --magenta-4: 203, 43, 136;
  --magenta-5: 245, 69, 166;
  --magenta-6: 247, 86, 169;
  --magenta-7: 249, 122, 184;
  --magenta-8: 251, 158, 200;
  --magenta-9: 253, 195, 219;
  --magenta-10: 255, 232, 241;
  --gray-1: 23, 23, 26;
  --gray-2: 46, 46, 48;
  --gray-3: 72, 72, 73;
  --gray-4: 95, 95, 96;
  --gray-5: 120, 120, 122;
  --gray-6: 146, 146, 147;
  --gray-7: 171, 171, 172;
  --gray-8: 197, 197, 197;
  --gray-9: 223, 223, 223;
  --gray-10: 246, 246, 246;
}

/* ---------- 1.2 中性色阶 --color-neutral-N（= gray-N）---------- */
html:root {
  --color-neutral-1: rgb(var(--gray-1));
  --color-neutral-2: rgb(var(--gray-2));
  --color-neutral-3: rgb(var(--gray-3));
  --color-neutral-4: rgb(var(--gray-4));
  --color-neutral-5: rgb(var(--gray-5));
  --color-neutral-6: rgb(var(--gray-6));
  --color-neutral-7: rgb(var(--gray-7));
  --color-neutral-8: rgb(var(--gray-8));
  --color-neutral-9: rgb(var(--gray-9));
  --color-neutral-10: rgb(var(--gray-10));
}
html[data-theme="dark"] {
  --color-neutral-1: rgb(var(--gray-1));
  --color-neutral-2: rgb(var(--gray-2));
  --color-neutral-3: rgb(var(--gray-3));
  --color-neutral-4: rgb(var(--gray-4));
  --color-neutral-5: rgb(var(--gray-5));
  --color-neutral-6: rgb(var(--gray-6));
  --color-neutral-7: rgb(var(--gray-7));
  --color-neutral-8: rgb(var(--gray-8));
  --color-neutral-9: rgb(var(--gray-9));
  --color-neutral-10: rgb(var(--gray-10));
}

/* ---------- 1.3 背景 / 容器 ---------- */
html:root {
  --color-bg-1: #FFFFFF;
  --color-bg-2: #FFFFFF;
  --color-bg-3: #FFFFFF;
  --color-bg-4: #FFFFFF;
  --color-bg-5: #FFFFFF;
  --color-bg-white: #FFFFFF;
  --color-bg-layout: #F7F8FA;
  --color-bg-container: #FFFFFF;
  --color-bg-elevated: #FFFFFF;
  --color-bg-popup: var(--color-bg-5);
  --color-border: #E5E6EB;
}
html[data-theme="dark"] {
  --color-bg-1: #17171A;
  --color-bg-2: #232324;
  --color-bg-3: #2A2A2B;
  --color-bg-4: #313132;
  --color-bg-5: #373739;
  --color-bg-white: #F6F6F6;
  --color-bg-layout: #17171A;
  --color-bg-container: #232324;
  --color-bg-elevated: #2A2A2B;
  --color-bg-popup: var(--color-bg-5);
  --color-border: #333335;
}

/* ---------- 1.4 文本 / 填充 / 边框 ---------- */
html:root {
  --color-text-1: var(--color-neutral-10);
  --color-text-2: var(--color-neutral-8);
  --color-text-3: var(--color-neutral-6);
  --color-text-4: var(--color-neutral-4);
  --color-fill-1: var(--color-neutral-1);
  --color-fill-2: var(--color-neutral-2);
  --color-fill-3: var(--color-neutral-3);
  --color-fill-4: var(--color-neutral-4);
  --color-border-1: var(--color-neutral-2);
  --color-border-2: var(--color-neutral-3);
  --color-border-3: var(--color-neutral-4);
  --color-border-4: var(--color-neutral-6);
}
html[data-theme="dark"] {
  --color-text-1: rgba(255,255,255,.9);
  --color-text-2: rgba(255,255,255,.7);
  /* 2026-09-15 S2 修复（OPT-dark）：深色 text-3 原 .5 落在浮起面上实测仅 3.76~4.49（<4.5）。提到 .58。
     注意 text-4(.3) 是**有意的规范演示档**，不动。 */
  --color-text-3: rgba(255,255,255,.58);
  --color-text-4: rgba(255,255,255,.3);
  --color-fill-1: rgba(255,255,255,.04);
  --color-fill-2: rgba(255,255,255,.08);
  --color-fill-3: rgba(255,255,255,.12);
  --color-fill-4: rgba(255,255,255,.16);
  --color-border-1: var(--color-neutral-2);
  --color-border-2: var(--color-neutral-3);
  --color-border-3: var(--color-neutral-4);
  --color-border-4: var(--color-neutral-6);
}

/* ---------- 1.5 主色 / 功能色 / 链接 / secondary ---------- */
html:root {
  --color-primary-1: rgb(var(--arcoblue-1));
  --color-primary-2: rgb(var(--arcoblue-2));
  --color-primary-3: rgb(var(--arcoblue-3));
  --color-primary-4: rgb(var(--arcoblue-4));
  --color-primary-5: rgb(var(--arcoblue-5));
  --color-primary-6: rgb(var(--arcoblue-6));
  --color-primary-7: rgb(var(--arcoblue-7));
  --color-primary-8: rgb(var(--arcoblue-8));
  --color-primary-9: rgb(var(--arcoblue-9));
  --color-primary-10: rgb(var(--arcoblue-10));
  --color-success-1: rgb(var(--green-1));
  --color-warning-1: rgb(var(--orange-1));
  --color-danger-1: rgb(var(--red-1));
  --color-link-1: rgb(var(--arcoblue-1));
  --color-success-2: rgb(var(--green-2));
  --color-warning-2: rgb(var(--orange-2));
  --color-danger-2: rgb(var(--red-2));
  --color-link-2: rgb(var(--arcoblue-2));
  --color-success-3: rgb(var(--green-3));
  --color-warning-3: rgb(var(--orange-3));
  --color-danger-3: rgb(var(--red-3));
  --color-link-3: rgb(var(--arcoblue-3));
  --color-success-4: rgb(var(--green-4));
  --color-warning-4: rgb(var(--orange-4));
  --color-danger-4: rgb(var(--red-4));
  --color-link-4: rgb(var(--arcoblue-4));
  --color-success-5: rgb(var(--green-5));
  --color-warning-5: rgb(var(--orange-5));
  --color-danger-5: rgb(var(--red-5));
  --color-link-5: rgb(var(--arcoblue-5));
  --color-success-6: rgb(var(--green-6));
  --color-warning-6: rgb(var(--orange-6));
  --color-danger-6: rgb(var(--red-6));
  --color-link-6: rgb(var(--arcoblue-6));
  --color-success-7: rgb(var(--green-7));
  --color-warning-7: rgb(var(--orange-7));
  --color-danger-7: rgb(var(--red-7));
  --color-link-7: rgb(var(--arcoblue-7));
  --color-success-8: rgb(var(--green-8));
  --color-warning-8: rgb(var(--orange-8));
  --color-danger-8: rgb(var(--red-8));
  --color-link-8: rgb(var(--arcoblue-8));
  --color-success-9: rgb(var(--green-9));
  --color-warning-9: rgb(var(--orange-9));
  --color-danger-9: rgb(var(--red-9));
  --color-link-9: rgb(var(--arcoblue-9));
  --color-success-10: rgb(var(--green-10));
  --color-warning-10: rgb(var(--orange-10));
  --color-danger-10: rgb(var(--red-10));
  --color-link-10: rgb(var(--arcoblue-10));
  --color-primary-light-1: rgb(var(--arcoblue-1));
  --color-danger-light-1: rgb(var(--red-1));
  --color-success-light-1: rgb(var(--green-1));
  --color-warning-light-1: rgb(var(--orangered-1));
  --color-link-light-1: rgb(var(--arcoblue-1));
  --color-primary-light-2: rgb(var(--arcoblue-2));
  --color-danger-light-2: rgb(var(--red-2));
  --color-success-light-2: rgb(var(--green-2));
  --color-warning-light-2: rgb(var(--orangered-2));
  --color-link-light-2: rgb(var(--arcoblue-2));
  --color-primary-light-3: rgb(var(--arcoblue-3));
  --color-danger-light-3: rgb(var(--red-3));
  --color-success-light-3: rgb(var(--green-3));
  --color-warning-light-3: rgb(var(--orangered-3));
  --color-link-light-3: rgb(var(--arcoblue-3));
  --color-primary-light-4: rgb(var(--arcoblue-4));
  --color-danger-light-4: rgb(var(--red-4));
  --color-success-light-4: rgb(var(--green-4));
  --color-warning-light-4: rgb(var(--orangered-4));
  --color-link-light-4: rgb(var(--arcoblue-4));
  --color-secondary: var(--color-neutral-2);
  --color-secondary-hover: var(--color-neutral-3);
  --color-secondary-active: var(--color-neutral-4);
  --color-secondary-disabled: var(--color-neutral-1);
  --color-white: #FFFFFF;
  --color-black: #000000;
  --color-transparent: transparent;
  --color-text-muted: var(--color-text-3);
}
html[data-theme="dark"] {
  --color-primary-light-1: rgba(var(--arcoblue-6), .2);
  --color-danger-light-1: rgba(var(--red-6), .2);
  --color-success-light-1: rgba(var(--green-6), .2);
  --color-warning-light-1: rgba(var(--orangered-6), .2);
  --color-link-light-1: rgba(var(--arcoblue-6), .2);
  --color-primary-light-2: rgba(var(--arcoblue-6), .35);
  --color-danger-light-2: rgba(var(--red-6), .35);
  --color-success-light-2: rgba(var(--green-6), .35);
  --color-warning-light-2: rgba(var(--orangered-6), .35);
  --color-link-light-2: rgba(var(--arcoblue-6), .35);
  --color-primary-light-3: rgba(var(--arcoblue-6), .5);
  --color-danger-light-3: rgba(var(--red-6), .5);
  --color-success-light-3: rgba(var(--green-6), .5);
  --color-warning-light-3: rgba(var(--orangered-6), .5);
  --color-link-light-3: rgba(var(--arcoblue-6), .5);
  --color-primary-light-4: rgba(var(--arcoblue-6), .65);
  --color-danger-light-4: rgba(var(--red-6), .65);
  --color-success-light-4: rgba(var(--green-6), .65);
  --color-warning-light-4: rgba(var(--orangered-6), .65);
  --color-link-light-4: rgba(var(--arcoblue-6), .65);
  --color-secondary: rgba(var(--gray-9), 0.08);
  --color-secondary-hover: rgba(var(--gray-8), 0.16);
  --color-secondary-active: rgba(var(--gray-7), 0.24);
  --color-secondary-disabled: rgba(var(--gray-9), 0.08);
}

/* ---------- 1.6 图表数据色 --color-data-1..20（成对：深档 + 浅档）---------- */
html:root {
  --color-data-1: rgb(var(--arcoblue-5));
  --color-data-2: rgb(var(--arcoblue-3));
  --color-data-3: rgb(var(--blue-5));
  --color-data-4: rgb(var(--blue-3));
  --color-data-5: rgb(var(--orange-6));
  --color-data-6: rgb(var(--orange-3));
  --color-data-7: rgb(var(--green-4));
  --color-data-8: rgb(var(--green-3));
  --color-data-9: rgb(var(--purple-4));
  --color-data-10: rgb(var(--purple-3));
  --color-data-11: rgb(var(--gold-6));
  --color-data-12: rgb(var(--gold-4));
  --color-data-13: rgb(var(--lime-6));
  --color-data-14: rgb(var(--lime-4));
  --color-data-15: rgb(var(--magenta-4));
  --color-data-16: rgb(var(--magenta-3));
  --color-data-17: rgb(var(--cyan-6));
  --color-data-18: rgb(var(--cyan-3));
  --color-data-19: rgb(var(--pinkpurple-4));
  --color-data-20: rgb(var(--pinkpurple-2));
}

/* ---------- 1.7 圆角 / 尺寸 / 间距 / 字阶 / 字重 / 行高 ---------- */
html:root {
  /* 圆角：官方只有这 5 个 */
  --radius-none: 0;
  --radius-small: 2px;
  --radius-medium: 4px;
  --radius-large: 8px;
  --radius-circle: 50%;
  /* 组件尺寸档位：官方四档 */
  --size-mini: 24px;
  --size-small: 28px;
  --size-default: 32px;
  --size-large: 36px;
  /* 间距序列：官方基数 2px */
  --spacing-1: 2px;
  --spacing-2: 4px;
  --spacing-3: 6px;
  --spacing-4: 8px;
  --spacing-5: 10px;
  --spacing-6: 12px;
  --spacing-7: 16px;
  --spacing-8: 20px;
  --spacing-9: 24px;
  --spacing-10: 32px;
  --spacing-11: 36px;
  --spacing-12: 40px;
  --spacing-13: 48px;
  --spacing-14: 56px;
  --spacing-15: 60px;
  --spacing-16: 64px;
  --spacing-17: 72px;
  --spacing-18: 80px;
  --spacing-19: 84px;
  --spacing-20: 96px;
  --spacing-21: 100px;
  --spacing-22: 120px;
  --spacing-none: 0;
  /* 字阶 */
  --font-size-display-3: 56px; --font-size-display-2: 48px; --font-size-display-1: 36px;
  --font-size-title-3: 24px; --font-size-title-2: 20px; --font-size-title-1: 16px;
  --font-size-body-3: 14px; --font-size-body-2: 13px; --font-size-body-1: 12px;
  --font-size-caption: 12px;
  --font-size: 14px;
  /* 字重（官方只有整百档，无 650） */
  --font-weight-100: 100;
  --font-weight-200: 200;
  --font-weight-300: 300;
  --font-weight-400: 400;
  --font-weight-500: 500;
  --font-weight-600: 600;
  --font-weight-700: 700;
  --font-weight-800: 800;
  --font-weight-900: 900;
  /* 行高（实现层口径 1.5715；设计规范正文写 1.4，本项目取实现口径） */
  --line-height-base: 1.5715;
  /* 字体族（实现层口径） */
  --font-family: Inter,-apple-system,BlinkMacSystemFont,'PingFang SC','Hiragino Sans GB','Microsoft YaHei','Helvetica Neue',Helvetica,Arial,sans-serif;
  /* 控件 */
  --control-height: 32px;
  --control-padding-h: 12px;       /* 输入类 */
  --control-padding-h-btn: 15px;   /* 按钮类（官方与输入不同）*/
  /* 图标 */
  --icon-size: 1em;
  --icon-hit-size: 20px;
}

/* ---------- 1.8 阴影（官方 3 级，各含 9 方向；此处给 down 方向）---------- */
html:root {
  --shadow-special: 0 0 1px rgba(0,0,0,.3);
  --shadow-1-down: 0 2px 5px rgba(0,0,0,.1);
  --shadow-2-down: 0 4px 10px rgba(0,0,0,.1);
  --shadow-3-down: 0 8px 20px rgba(0,0,0,.1);
  --shadow-1-left: -2px 0 5px rgba(0,0,0,.1);
  --shadow-1-right: 2px 0 5px rgba(0,0,0,.1);
  --shadow-1-up: 0 -2px 5px rgba(0,0,0,.1);
}

/* ---------- 1.9 动效（官方 5 条曲线 + 5 档时长）---------- */
html:root {
  --motion-duration-1: 0.1s;
  --motion-duration-2: 0.2s;
  --motion-duration-3: 0.3s;
  --motion-duration-4: 0.4s;
  --motion-duration-5: 0.5s;
  --motion-duration-loading: 1s;
  --motion-linear: cubic-bezier(0, 0, 1, 1);
  --motion-standard: cubic-bezier(0.34, 0.69, 0.1, 1);
  --motion-overshoot: cubic-bezier(0.3, 1.3, 0.3, 1);
  --motion-decelerate: cubic-bezier(0.4, 0.8, 0.74, 1);
  --motion-accelerate: cubic-bezier(0.26, 0, 0.6, 0.2);
}

/* ---------- 1.10 z-index（官方体系）---------- */
html:root {
  --z-index-affix: 999;
  --z-index-popup-base: 1000;
  --z-index-popup: 1000;
  --z-index-drawer: 1001;
  --z-index-modal: 1001;
  --z-index-message: 1003;
  --z-index-notification: 1003;
}

/* ---------- 1.11 遮罩 / 焦点环 / 禁用态（官方原值）---------- */
html:root {
  --color-mask-bg: rgba(29,33,41,0.6);
  --color-focus-ring: 0 0 0 2px var(--color-primary-3);
  --color-focus-ring-danger: 0 0 0 2px var(--color-danger-3);
  --color-focus-ring-warning: 0 0 0 2px var(--color-warning-3);
  --color-focus-ring-success: 0 0 0 2px var(--color-success-3);
  --color-disabled-bg: #F2F3F5;
  --color-disabled-text: #C9CDD4;
}
html[data-theme="dark"] {
  /* 2026-09-15 S1 修复（OPT-dark 真机实测 · P1）：原值 rgba(23,23,26,.6) 与深色页面底色 rgb(23,23,26)
     逐通道同值（0.6*23+0.4*23=23）⇒ 遮罩**数学上等于不存在**，连累 index/assets/history/admin 共 29 个
     弹窗的层级塌陷（叠加 .users-modal 被 spec 定为无阴影无边框后更明显）。改为纯黑半透明，
     在深底与浮起面（#232324/#1E2C48 等）上均能形成可辨的压暗层。 */
  --color-mask-bg: rgba(0,0,0,0.6);
  --color-disabled-bg: #2A2A2B;
  --color-disabled-text: #5A5A5C;
}

/* ------------------------------------------------------------------
 * 特异性提升说明（重要）
 * 本仓历史 CSS 存在 #adminBody 等 ID 作用域规则（含 !important），
 * 其特异性高于任何「元素 + 类/属性」选择器。为使本层成为唯一权威，
 * 组件规则统一挂 :not(#arco-vi-boost-a):not(#arco-vi-boost-b)（两个永不存在于 DOM 的 id），
 * 使特异性达到「2 个 ID + 元素」级，足以压过现存最深 2-ID 规则。
 * 该写法不改变匹配范围（恒为真），仅提升权重。
 * ------------------------------------------------------------------ */


/* ============================================================
 * arco-vi.css · 第 2 部分：兼容别名层 + 组件层（手写）
 * 基准：docs/arco-vi-20260914/PLAN.md §1
 * 定位：本文件是 Arco 视觉识别系统的唯一权威执行层，最后加载、优先级最高。
 * 原则：任何组件规格以官方为唯一来源；本层只做「映射 + 落地」，不发明新风格。
 * ============================================================ */

/* ============================================================
 * 2.1 兼容别名层：旧令牌 → 官方令牌（改名映射，保持语义与观感）
 *     说明：--arco-border-1 的语义 = 官方 border-2（默认描边 #E5E6EB），
 *           故映射到 --color-border-2；--arco-border-3 的值 #f7f8fa 实为官方 fill-1。
 * ============================================================ */
html:root,
html[data-theme="dark"] {
  /* DPI 字号缩放基准；js/dpi-autoscale.js 会以行内样式覆盖 */
  --fs-scale: 1;

  /* --- 旧 --arco-* 族 --- */
  --arco-color-primary: var(--color-primary-6);
  --arco-color-primary-hover: var(--color-primary-5);
  --arco-color-primary-press: var(--color-primary-7);
  --arco-color-primary-bg: var(--color-primary-light-1);

  --arco-bg-layout: var(--color-bg-layout);
  --arco-bg-container: var(--color-bg-container);
  --arco-bg-elevated: var(--color-bg-elevated);
  --arco-bg-2: var(--color-fill-2);

  --arco-border-1: var(--color-border-2);
  --arco-border-2: var(--color-border-1);
  --arco-border-3: var(--color-fill-1);

  --arco-text-1: var(--color-text-1);
  --arco-text-2: var(--color-text-2);
  --arco-text-3: var(--color-text-3);
  --arco-text-4: var(--color-text-4);

  --arco-success: var(--color-success-6);
  --arco-warning: var(--color-warning-6);
  --arco-danger: var(--color-danger-6);
  --arco-link: var(--color-link-6);

  --arco-radius: var(--radius-medium);
  --arco-radius-lg: var(--radius-large);
  --arco-radius-sm: var(--radius-small);
  --arco-round: 999px;

  --arco-font-size: 14px;
  --arco-font-size-lg: 16px;
  --arco-font-size-sm: 12px;

  --arco-control-height: var(--control-height);
  --arco-control-padding-h: var(--control-padding-h);

  --arco-shadow: var(--shadow-2-down);
  --arco-shadow-sm: var(--shadow-1-down);
  --arco-shadow-xs: var(--shadow-special);

  --arco-ease: var(--motion-standard);
  --arco-duration: var(--motion-duration-2);
  /* ⚠️ 本仓把 --arco-icon-size 挪用为 SVG 的 stroke-width（见 styles.css:21688），
     它不是"图标尺寸"而是"图标描边宽度"。必须保持 1.5px，否则图标会糊成实心块。 */
  --arco-icon-size: 1.5px;

  /* --- 旧 --rs-* 族（全部指向官方令牌）--- */
  --rs-bg: var(--color-bg-layout);
  --rs-bg-2: var(--color-bg-container);
  --rs-card: var(--color-bg-container);
  --rs-line-04: var(--color-border-1);
  --rs-line-10: var(--color-border-1);
  --rs-line-12: var(--color-border-2);
  --rs-line-16: var(--color-border-3);
  --rs-t1: var(--color-text-1);
  --rs-t2: var(--color-text-2);
  --rs-t3: var(--color-text-3);
  --rs-t4: var(--color-text-4);
  --rs-blue: var(--color-primary-6);
  --rs-blue-500: var(--color-primary-5);
  --rs-logo: var(--color-primary-6);
  --rs-ok: var(--color-success-6);
  --rs-warn: var(--color-warning-6);
  --rs-err: var(--color-danger-6);
  --rs-radius: var(--radius-large);
  --rs-radius-s: var(--radius-medium);
  --rs-radius-pill: 999px;
  --rs-shadow-2: var(--shadow-1-down);
  --rs-shadow-3: var(--shadow-2-down);
  --rs-container: 1200px;
  --rs-font: var(--font-family);
  --rs-ease: var(--motion-standard);
  --rs-fs-h1: 24px;
  --rs-fs-h2: 20px;
  --rs-fs-card: 16px;
  --rs-fs-body: 14px;
  --rs-fs-label: 12px;
  --rs-fs-badge: 12px;

  /* --- 旧设计系统族（--bg-* / --t* / --line / --card / --r-* / --shadow-* / --fs-*）--- */
  --bg-0: var(--color-bg-layout);
  --bg-1: var(--color-bg-container);
  --bg-2: var(--color-fill-2);
  --bg-3: var(--color-fill-3);
  --bg-4: var(--color-fill-4);
  --bg: var(--bg-1);
  --card: var(--color-bg-container);
  --glass-bg: var(--color-bg-container);
  --glass-bg-hover: var(--color-fill-2);
  --topbar-bg: var(--color-bg-container);
  --glass-border: var(--color-border-2);
  --glass-border-strong: var(--color-border-3);
  --line: var(--color-border-2);
  --line-strong: var(--color-border-3);
  --line-subtle: var(--color-border-1);
  --border: var(--color-border-2);
  --t1: var(--color-text-1);
  --t2: var(--color-text-2);
  --t3: var(--color-text-3);
  --t-muted: var(--color-text-3);
  --t-1: var(--color-text-1);
  --t-2: var(--color-text-2);

  --brand: var(--color-primary-6);
  --brand-text: var(--color-primary-6);
  --brand-text-strong: var(--color-primary-7);
  --brand-soft: var(--color-primary-5);
  --brand-cyan: var(--color-primary-6);
  --brand-bg-soft: var(--color-primary-light-1);
  --brand-bg-soft2: var(--color-primary-light-1);
  --accent: var(--color-primary-6);
  --p: var(--color-primary-6);
  --info: var(--color-primary-6);
  --primary: var(--color-primary-6);
  --c-primary: var(--color-primary-6);
  --color-primary: var(--color-primary-6);
  --color-text: var(--color-text-1);
  --color-text-muted: var(--color-text-3);
  --color-bg-muted: var(--color-fill-2);
  --grad-brand: linear-gradient(135deg, var(--color-primary-5) 0%, var(--color-primary-6) 100%);
  --grad-warm: linear-gradient(135deg, var(--color-primary-5) 0%, var(--color-primary-6) 100%);
  --grad-aurora: none;

  --ok: var(--color-success-6);
  --err: var(--color-danger-6);
  --warn: var(--color-warning-6);

  --r-xs: var(--radius-small);
  --r-sm: var(--radius-medium);
  --r-md: var(--radius-large);
  --r-lg: var(--radius-large);
  --r-xl: var(--radius-large);
  --r-full: 999px;

  --shadow-xs: var(--shadow-special);
  --shadow-sm: var(--shadow-1-down);
  --shadow-card: var(--shadow-1-down);
  --shadow-soft: var(--shadow-2-down);
  --shadow-lg: var(--shadow-3-down);
  --shadow-glow: var(--shadow-special);
  --shadow-glow-brand: var(--shadow-1-down);
  --ring: var(--color-focus-ring);

  --font-ui: var(--font-family);
  --font-display: var(--font-family);

  --ease: var(--motion-standard);
  --ease-bounce: var(--motion-overshoot);
  --duration-fast: var(--motion-duration-1);
  --duration-normal: var(--motion-duration-2);
  --duration-slow: var(--motion-duration-3);

  /* 旧字阶：对齐官方档位，去掉 10/11px 与半像素 */
  --fs-display: calc(24px * var(--fs-scale));
  --fs-h1: calc(20px * var(--fs-scale));
  --fs-h2: calc(16px * var(--fs-scale));
  --fs-h3: calc(14px * var(--fs-scale));
  --fs-body: calc(14px * var(--fs-scale));
  --fs-small: calc(12px * var(--fs-scale));
  --fs-nano: calc(12px * var(--fs-scale));
  --fs-micro: calc(12px * var(--fs-scale));
  --fs-xs: calc(12px * var(--fs-scale));

  /* 旧 z-index：对齐官方体系 */
  --z-base: 1;
  --z-sticky: 50;
  --z-step: 60;
  --z-toast: var(--z-index-message);
  --z-modal: var(--z-index-modal);
  --z-tooltip: var(--z-index-popup);

  /* --- 旧 --badge-* 徽章三元组 → 官方语义色 --- */
  --badge-success-bg: var(--color-success-1);
  --badge-success-fg: var(--color-success-6);
  --badge-warning-bg: var(--color-warning-1);
  --badge-warning-fg: var(--color-warning-6);
  --badge-danger-bg: var(--color-danger-1);
  --badge-danger-fg: var(--color-danger-6);
  --badge-info-bg: var(--color-primary-1);
  --badge-info-fg: var(--color-primary-6);
  --badge-neutral-bg: var(--color-fill-2);
  --badge-neutral-fg: var(--color-text-2);
}

/* ============================================================
 * 2.1b D6 修复（2026-09-15 · 样式与设计系统分区）
 *     浅色 12px 次要文本对比度 —— **只调令牌，不逐处加样式**
 * ------------------------------------------------------------
 * 症状（真实浏览器实测 · _scan/fix-styles/probe-pre.json）：
 *   浅色主题 12px 次要文本大面积不达 WCAG AA 4.5:1（12px 不享受大字豁免）：
 *   前台 1440 step0 57/161、step2 116/356；后台 admin 57/246；assets 33；history 24。
 *   失败色集中在 rgb(134,144,156) = #86909C：白底 3.24:1 / --bg-layout #f7f8fa 3.05 /
 *   #f2f3f5 2.92 / --bg-3 #e9eff6 2.90。
 * 归属（命中规则 → 令牌，见 diag-contrast.mjs）：绝大多数的 color 声明是
 *   `var(--t3)` / `var(--arco-text-3)` / `var(--t-muted)` —— 而本文件 §2.1 的别名块
 *   把它们都指向官方 `--color-text-3`（#86909C）。**其中 73/116 处来自 index.html 的页面级
 *   内联 <style>（.step-panel .opt-card .opt-sub { color: var(--t3) }），本分区无权改页面文件**
 *   ⇒ 只有改令牌才能一次覆盖（逐处加样式既改不到内联页、又违背「只调令牌」）。
 * 处置（方案 a：加深令牌）：
 *   浅色档 `--t3` / `--arco-text-3` / `--t-muted`（含同义别名 `--rs-t3` / `--muted` /
 *   `--color-text-muted`）→ **#5B6572**：**保持原 #86909C 的色相/饱和度（H 212.7° / S 10%）只降明度**，
 *   取「实测 8 种浅色底全部 ≥4.5」的最浅一档：
 *     白 5.92 · #f7f8fa 5.57 · #f2f3f5 5.33 · --bg-2 #f4f7fb 5.51 · #E8F3FF 5.27 ·
 *     --bg-3 #e9eff6 5.11 · #E5E6EB 4.75 · --bg-4 #dbe3ee 4.57 ⇒ 全部 ≥4.5。
 *   （更浅的档位实测不够：#6B7280 在 #f2f3f5 只有 4.35；#5F6B7A 在 #E5E6EB（资产卡缩略图占位底）
 *     只有 4.35 —— 修后实测 6 处残留，故再降一档。）
 *   ⚠️ 官方令牌 `--color-text-3` **保持 #86909C 不动**：它是 Arco 官方色阶（accept-vi 的令牌
 *      断言钉住它），本仓只在「别名族」上做无障碍加深，官方语义档位不失真。
 *   ⚠️ 暗色档不动：--color-text-3 暗色 = rgba(255,255,255,.5)/#8D8D90，在 #232324 上 4.75:1 已达标
 *      （§2.23 已记录；probe 实测暗色仅 :disabled 控件不达标，WCAG 1.4.3 豁免）。
 *   ⚠️ 副作用面（实测）：同时被加深的还有「用 --t3 当图标/箭头色」的元素 —— 图标随文字一起变深，
 *      属同一语义族的可接受变化；逐元素前后对比度与受影响元素数见
 *      docs/nextcoder/2026-09-15-FIX-styles.md。
 *   ⚠️ styles.css 的 :root（--t3 / --arco-text-3）已同步同值（双写）。
 * ============================================================ */
html:root:not([data-theme="dark"]) {
  --t3: #5B6572;
  --arco-text-3: #5B6572;
  --t-muted: #5B6572;
  /* 上面三个是「旧族」主令牌；下面三个是它们的别名/同义族 —— 不一起改会漏掉仍然读到 #86909C 的那批元素
     （实测残留：body .step0-col-title .step0-col-hint / .brief-drop-sub / .pc-auto-pool 走 --rs-t3；
       index.html 内联的 #scenePurposeHint 走 --color-text-muted；.copy-care 走 --muted 的 fallback）。
     全部指向同一语义（次要文本），故同值 —— 这是「只调令牌」而非逐处加样式。 */
  --rs-t3: #5B6572;
  --muted: #5B6572;
  --color-text-muted: #5B6572;
}

/* ============================================================
 * 2.2 基础层：字体 / 行高 / 焦点可见性 / 按钮与输入的原生外观重置
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) {
  font-family: var(--font-family);
  color: var(--color-text-1);
}

/* 官方：全站可聚焦控件统一焦点环 0 0 0 2px <语义色3档> */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) :focus-visible {
  outline: 2px solid var(--color-primary-6);
  outline-offset: 1px;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) button:focus-visible,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) a:focus-visible,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [role="button"]:focus-visible,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input:focus-visible,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) select:focus-visible,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) textarea:focus-visible {
  outline: none !important;
  box-shadow: var(--color-focus-ring) !important;
}

/* ============================================================
 * 2.3 Button —— 官方：圆角 2px / 字重 400 / 四档高 24·28·32·36 / padding-h 11·15·15·19
 *     并把历史遗留的十余个按钮族全部映射到同一套
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lib-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .vt-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn-primary,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn-ghost,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn-sm,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn-block,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn-row,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-upload-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-theme-toggle,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-filter-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-proj-page-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sb-step-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sb-opt-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sb-one-click-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pm-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .copy-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .copy-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .td-nav-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .ref-upload-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tuner-wb-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .adv-undo-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .adv-preview-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .adv-creator-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .adv-copy-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .adv-apply-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .fix-roll-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .fix-apply-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-trigger-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .act-agent-roster-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .act-collapse-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .hs-add,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .task-more,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pa-del,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pa-confirm,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mv-mode-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tab-btn {
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  box-sizing: border-box !important;
  height: var(--size-default) !important;
  min-height: var(--size-default) !important;
  padding: 0 var(--control-padding-h-btn) !important;
  border: 1px solid var(--color-border-2) !important;
  border-radius: var(--radius-small) !important;
  background: var(--color-bg-container) !important;
  color: var(--color-text-1) !important;
  font-family: var(--font-family) !important;
  font-size: var(--font-size-body-3) !important;
  font-weight: var(--font-weight-400) !important;
  line-height: 1 !important;
  white-space: nowrap !important;
  cursor: pointer !important;
  box-shadow: none !important;
  text-decoration: none !important;
  transition: all var(--motion-duration-1) var(--motion-linear) !important;
}
/* ✅ D1 修复（2026-09-15 · 样式与设计系统分区）：把上面那条 `display: inline-flex !important` 的
   作用域**收窄到「不覆盖内联 display」**。
   ------------------------------------------------------------
   症状：工作台最后一步（视频生成）的 `#btnNext` 被 js/app.js 的 showStep() 用**内联**
   `style.display='none'` 隐藏，但上面 §2.3 的 `display:inline-flex!important` 在层叠里压过内联样式
   （同源下 !important 恒胜过 inline 普通声明）⇒ 修前实测：inline display=none，computed display=flex，
   rect 91×32@(965,857)、可点、点击无反应（出现一颗「点不动的死按钮」）。
   styles.css 尾部的 `body .btn[style*="display: none"]{display:none!important}`
   特异性 (0,2,1) **低于** 本层 §2.3 的 (2,1,2)，所以那条守卫实测无效（这也是该缺陷长期存在的原因）。
   ------------------------------------------------------------
   修法（最小作用域）：只对「自带内联 display:none 的元素」强制 display:none —— 特异性与 §2.3 的
   `.btn` 规则**完全相同**（2 个 id + 1 个类级 + 2 个元素），同为 !important 时由**源序**决定 ⇒ 本块在
   §2.3 之后，必胜；且因为带属性选择器条件，它只影响「内联明确要求隐藏」的元素，不动任何其它按钮形态。
   覆盖面刻意写成通配（而不仅是 .btn）：§2.3 把 45 个按钮族一起钉成 inline-flex，任何一个被内联隐藏都会
   出现同样的死按钮；用一条规则覆盖全部族，避免下次漏改。作用面实测（明/暗 × 6 页）见
   docs/nextcoder/2026-09-15-FIX-styles.md §D1「受影响元素数」。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [style*="display: none"],
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [style*="display:none"] {
  display: none !important;
}
/* 小号 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.sm, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.tiny, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.xs, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn-sm,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lib-btn.sm, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn.sm {
  height: var(--size-small) !important;
  min-height: var(--size-small) !important;
  padding: 0 12px !important;
  font-size: var(--font-size-body-1) !important;
}
/* 表格内小号按钮（官方 mini 24px）*/
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table .btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table .users-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table .evo-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table .arco-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-table .btn {
  height: var(--size-mini) !important;
  min-height: var(--size-mini) !important;
  padding: 0 8px !important;
  font-size: var(--font-size-body-1) !important;
}
/* 大号 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.lg, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn-size-lg, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn-lg {
  height: var(--size-large) !important;
  min-height: var(--size-large) !important;
  padding: 0 19px !important;
  font-size: var(--font-size-body-3) !important;
}
/* 主按钮 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.primary, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn.primary, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-btn.primary,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lib-btn.primary, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn-primary, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-btn.primary,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.btn-primary, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn-primary,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn.primary, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sb-one-click-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .adv-apply-btn {
  background: var(--color-primary-6) !important;
  border-color: transparent !important;
  color: var(--color-white) !important;
  box-shadow: none !important;
}
/* 危险按钮 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.danger, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn.danger, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-btn.danger,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn-danger, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.btn-danger, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .fix-apply-btn {
  background: var(--color-danger-6) !important;
  border-color: transparent !important;
  color: var(--color-white) !important;
}
/* 次要（官方 secondary = 灰底无边框）*/
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.secondary, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn-secondary, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.btn-secondary {
  background: var(--color-secondary) !important;
  border-color: transparent !important;
  color: var(--color-text-2) !important;
}
/* 文字按钮 / 幽灵（官方 text 类型）*/
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.ghost, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.text, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn.ghost,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn-text, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.btn-ghost, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .act-collapse-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pa-del, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .task-more, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .hs-add {
  background: transparent !important;
  border-color: transparent !important;
  color: var(--color-text-2) !important;
  padding: 0 8px !important;
}
/* 五态：hover / active */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lib-btn:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .vt-btn:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-filter-btn:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sb-step-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pm-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .copy-btn:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .td-nav-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .ref-upload-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tuner-wb-btn:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .adv-preview-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .adv-creator-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .adv-copy-btn:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .adv-undo-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .fix-roll-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-trigger-btn:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .act-agent-roster-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .act-collapse-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .hs-add:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .task-more:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pa-del:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pa-confirm:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-upload-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sb-opt-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-proj-page-btn:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mv-mode-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tab-btn:hover {
  border-color: transparent !important;
  background: var(--color-secondary-hover) !important;
  box-shadow: none !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.primary:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn.primary:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-btn.primary:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lib-btn.primary:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn-primary:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-btn.primary:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.btn-primary:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn-primary:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn.primary:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sb-one-click-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .adv-apply-btn:hover {
  background: var(--color-primary-5) !important;
  box-shadow: none !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.danger:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn.danger:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-btn.danger:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.btn-danger:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn-danger:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .fix-apply-btn:hover {
  background: var(--color-danger-5) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.ghost:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.text:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn.ghost:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn-text:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .act-collapse-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pa-del:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .task-more:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .hs-add:hover {
  background: var(--color-secondary-hover) !important;
  color: var(--color-text-1) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn:active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn:active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lib-btn:active,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-btn:active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-btn:active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn:active {
  transform: none !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.primary:active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn.primary:active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn-primary:active {
  background: var(--color-primary-7) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.danger:active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn.danger:active {
  background: var(--color-danger-7) !important;
}
/* 禁用态（官方：底 #F2F3F5 + 字 #C9CDD4 + 无 hover）*/
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn:disabled, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.disabled, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn:disabled,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn-disabled, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-btn:disabled, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn:disabled,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) button[disabled] {
  background: var(--color-disabled-bg) !important;
  border-color: transparent !important;
  color: var(--color-disabled-text) !important;
  cursor: not-allowed !important;
  box-shadow: none !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn:disabled:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) button[disabled]:hover {
  background: var(--color-disabled-bg) !important;
}

/* ============================================================
 * 2.4 分段控件 / 胶囊（Tabs capsule 语义）—— 官方 28px、圆角 2px、选中主色浅底
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .seg-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lang-opt, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-tab,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mv-mode-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tab-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .filter-toggle,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .hs-toggle, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .theme-toggle, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .org-theme-toggle,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-chip, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .filter-chip, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .part-chip {
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  height: var(--size-small) !important;
  min-height: var(--size-small) !important;
  padding: 0 10px !important;
  border: 1px solid transparent !important;
  border-radius: var(--radius-small) !important;
  background: transparent !important;
  color: var(--color-text-2) !important;
  font-size: var(--font-size-body-3) !important;
  font-weight: var(--font-weight-400) !important;
  white-space: nowrap !important;
  cursor: pointer !important;
  box-shadow: none !important;
  transition: background-color var(--motion-duration-1) var(--motion-linear),
              color var(--motion-duration-1) var(--motion-linear) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .seg-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lang-opt:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-tab:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mv-mode-btn:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .filter-toggle:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .hs-toggle:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .theme-toggle:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .org-theme-toggle:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-chip:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .filter-chip:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .part-chip:hover {
  background: var(--color-fill-2) !important;
  color: var(--color-text-1) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .seg-btn.active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .seg-btn.selected, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lang-opt.active,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lang-opt.selected, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-tab.active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mv-mode-btn.active,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tab-btn.active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .part-chip.active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .part-chip.selected,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-chip.active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .filter-chip.active {
  background: var(--color-primary-light-1) !important;
  color: var(--color-primary-6) !important;
  font-weight: var(--font-weight-400) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .part-chip.active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .part-chip.selected {
  color: var(--color-primary-6) !important;
  background: var(--color-primary-light-1) !important;
}

/* ============================================================
 * 2.5 Input / Select / Textarea —— 官方「面性设计」：灰底 + 透明边框
 *     focus 只换边框色（无外环）；圆角 2px；高 24/28/32/36；padding-h 12px
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input[type="text"], html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input[type="search"], html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input[type="email"],
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input[type="password"], html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input[type="number"], html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input[type="url"],
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input[type="tel"], html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input[type="date"], html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input[type="time"],
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input:not([type]), html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) textarea,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .settings-input, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .brief-input, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sf-rect-input,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-input, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-input, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .activity-filter,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-search, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-filter, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sort-select,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .nc-m3-select, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .org-perm, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .search-input {
  box-sizing: border-box !important;
  height: var(--size-default) !important;
  min-height: var(--size-default) !important;
  padding: 0 var(--control-padding-h) !important;
  border: 1px solid transparent !important;
  border-radius: var(--radius-small) !important;
  background: var(--color-fill-2) !important;
  color: var(--color-text-1) !important;
  font-family: var(--font-family) !important;
  font-size: var(--font-size-body-3) !important;
  line-height: var(--line-height-base) !important;
  box-shadow: none !important;
  outline: none !important;
  transition: background-color var(--motion-duration-2) var(--motion-standard),
              border-color var(--motion-duration-2) var(--motion-standard) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) textarea, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-textarea, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .brief-input,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-textarea, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .structure-notes-body textarea {
  height: auto !important;
  min-height: 64px !important;
  padding: 4px var(--control-padding-h) !important;
  resize: vertical !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) select, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-select select {
  box-sizing: border-box !important;
  height: var(--size-default) !important;
  min-height: var(--size-default) !important;
  padding: 0 28px 0 var(--control-padding-h) !important;
  border: 1px solid transparent !important;
  border-radius: var(--radius-small) !important;
  background-color: var(--color-fill-2) !important;
  color: var(--color-text-1) !important;
  font-size: var(--font-size-body-3) !important;
  box-shadow: none !important;
  outline: none !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input::placeholder, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) textarea::placeholder {
  color: var(--color-text-4) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) textarea:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) select:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .settings-input:hover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-input:hover {
  background: var(--color-fill-3) !important;
  border-color: transparent !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input:focus, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) textarea:focus, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) select:focus,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .settings-input:focus, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-input:focus,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .activity-filter:focus, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-search:focus {
  background: var(--color-bg-container) !important;
  border-color: var(--color-primary-6) !important;
  box-shadow: none !important;
  outline: none !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input:disabled, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) textarea:disabled, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) select:disabled {
  background: var(--color-disabled-bg) !important;
  color: var(--color-text-4) !important;
  cursor: not-allowed !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input[type="checkbox"], html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input[type="radio"] {
  accent-color: var(--color-primary-6) !important;
  width: 16px !important;
  height: 16px !important;
}

/* ============================================================
 * 2.6 Table —— 官方：表头 14px/500/text-2/底 neutral-2(#F2F3F5)，单元格 9px·16px
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-table,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-table,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .org-table,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .dash-table,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-table,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .activity-table {
  width: 100% !important;
  border-collapse: separate !important;
  border-spacing: 0 !important;
  color: var(--color-text-1) !important;
  font-size: var(--font-size-body-3) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table thead th,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-table th {
  height: auto !important;
  padding: 9px 16px !important;
  background: var(--color-neutral-2) !important;
  color: var(--color-text-2) !important;
  font-size: var(--font-size-body-3) !important;
  font-weight: var(--font-weight-500) !important;
  text-align: left !important;
  border: none !important;
  border-bottom: 1px solid var(--color-border-2) !important;
  white-space: nowrap !important;
  line-height: var(--line-height-base) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table tbody td,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-table td {
  padding: 9px 16px !important;
  background: transparent !important;
  color: var(--color-text-1) !important;
  font-size: var(--font-size-body-3) !important;
  font-weight: var(--font-weight-400) !important;
  border: none !important;
  border-bottom: 1px solid var(--color-border-1) !important;
  vertical-align: middle !important;
  line-height: var(--line-height-base) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table tbody tr:hover > td {
  background: var(--color-fill-1) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table tbody tr:last-child > td {
  border-bottom: none !important;
}

/* ============================================================
 * 2.7 Tag / Badge —— 官方：24px / 圆角 2px / 12px / 字重 500 / 语义用不透明 -1 档
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tag, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-tag, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .badge, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .opt-badge,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .score-badge, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .status-badge, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .role-tag,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .status-tag, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pa-badge,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .org-role-chip, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .badge-role, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .chip,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .chip-label, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mini-chip, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-status,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .task-card-status, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .demo-card-status, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .demo-card-imgcount {
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  box-sizing: border-box !important;
  height: var(--size-mini) !important;
  min-height: var(--size-mini) !important;
  padding: 0 8px !important;
  border: 1px solid transparent !important;
  border-radius: var(--radius-small) !important;
  background: var(--color-fill-2) !important;
  color: var(--color-text-1) !important;
  font-size: var(--font-size-body-1) !important;
  font-weight: var(--font-weight-500) !important;
  line-height: 1 !important;
  white-space: nowrap !important;
  vertical-align: middle !important;
}
/* ⚠️ B2-D5（2026-09-26 · W7）：`.evo-chip` 已被**移出**上面 §2.7 的基础选择器与 `.tag.info` 语义选择器。
   原因：本规则特异度 (2,1,1) + `!important` 会压死 `js/admin-evolution.js` 注入的 `.evo-chip.primary/.warn/.danger/.success`
   （(0,2,0)、无 !important）⇒ 观测台「品类教训」队列所有理由徽标同为中性灰，语义全丢。
   取舍：`.evo-chip` 全仓仅由 `js/admin-evolution.js` 产出，故由其**独占**形态与语义色（含 nowrap 等几何），
   本层只保留其余 tag/badge —— 两套圆角（999 胶囊 vs 官方 2px）不再互相覆盖。
   反向对照：若把 `.evo-chip` 加回本规则，四态颜色会立刻再次全等（tests/w7-self-evolve-ui.test.mjs 有守卫）。 */
/* ✅ D11 修复（2026-09-15 · 样式与设计系统分区）：工作台左栏「下一步建议 / 素材完整度」的 chip 允许换行。
   ------------------------------------------------------------
   上面 §2.7 把 .chip 一并钉了 `white-space: nowrap !important` + 固定 24px 高。
   工作台左栏只有 219px 宽（内容盒 191px），任何一颗长 chip（例如建议项「至少上传 1 张产品图（六视图更稳）」）
   都超过容器且**既不能换行也不能收缩**（min-width:auto）⇒ 撑出横向溢出，面板因
   `overflow-y:auto`（规范上把另一轴 visible 提升为 auto）出现横向滚动条并裁掉内容
   （修前实测 .sidebar-recipe clientW 219 / scrollW 232；#recipe 与 .chips clientW 191 / scrollW 218，裁掉 27px）。
   修法：**只作用于工作台左栏内的 chip**（.sidebar-recipe 作用域），恢复可换行 + 自适应高度；
   其余页面/位置的 .chip 仍是官方的 24px 单行形态（不动）。同时 styles.css 侧给 .sidebar-recipe 显式
   `overflow-x: hidden`，从容器侧消除横向滚动条。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sidebar-recipe .chip {
  height: auto !important;
  min-height: var(--size-mini) !important;
  padding: 4px 10px !important;
  white-space: normal !important;
  overflow-wrap: anywhere;
  max-width: 100%;
  justify-content: flex-start !important;
  text-align: left;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tag.success, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tag.ok, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pa-badge.ok,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .status-tag.active, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .badge-role.ok {
  background: var(--color-success-1) !important;
  color: var(--color-success-6) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tag.warning, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tag.warn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pa-badge.warning, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pa-badge.draft {
  background: var(--color-warning-1) !important;
  color: var(--color-warning-6) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tag.danger, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tag.err, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .role-tag.admin {
  background: var(--color-danger-1) !important;
  color: var(--color-danger-6) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tag.info, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .opt-badge, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .badge-role,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .org-role-chip {
  background: var(--color-primary-1) !important;
  color: var(--color-primary-6) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tag.neutral, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .role-tag, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .status-tag {
  background: var(--color-fill-2) !important;
  color: var(--color-text-2) !important;
}

/* ============================================================
 * 2.8 Modal —— 官方：遮罩 rgba(29,33,41,.6)/z1001、卡 520px·圆角 4px·无阴影·无边框、
 *     头部 48px 标题 16px/500 居中、内容 24/20 text-1、footer 右对齐 border-top、
 *     关闭 12px 图标 @ right20/top18、动画 0.4s overshoot、卡片 top:100px
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-overlay,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-mask,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-mask,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #modalMask,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #confirmModal,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #settingsModal,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #promptModal,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #forcePwdModal,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mv-lightbox-backdrop,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lightbox-backdrop,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .user-detail-mask,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mask {
  background: var(--color-mask-bg) !important;
  z-index: var(--z-index-modal) !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  /* 官方 alignCenter 默认 true（Modal/modal.tsx:60 defaultProps: alignCenter: true；
     README.zh-CN.md:17 亦记 `true`）⇒ 弹窗【垂直 + 水平居中】。
     官方另有一条 @modal-margin-top:100px 只用于非居中变体，此处不采用。 */
  align-items: center !important;
  justify-content: center !important;
  padding: 16px !important;
  box-sizing: border-box !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-overlay.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-mask.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-mask.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #modalMask.hidden {
  display: none !important;
}

/* 卡片 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-card,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #modalCard,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal {
  box-sizing: border-box !important;
  position: relative !important;
  width: 520px !important;
  max-width: calc(100vw - 32px) !important;
  margin: auto !important;
  padding: 0 !important;
  background: var(--color-bg-3) !important;
  border: none !important;
  border-radius: var(--radius-medium) !important;
  box-shadow: none !important;
  text-align: left !important;
  overflow: hidden !important;
  animation: arcoViModalIn var(--motion-duration-4) var(--motion-overshoot) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #confirmModal .modal-card,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #promptModal .modal-card,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-card.small {
  width: 464px !important;
}
/* 官方 zoomModal（Modal/style/index.less:181-187）：opacity + transform .4s overshoot，
   scale(.5,.5) → scale(1,1)。原实现写成 translateY(-12px) scale(.98) 与官方不符。 */
@keyframes arcoViModalIn {
  from { opacity: 0; transform: scale(.5); }
  to   { opacity: 1; transform: scale(1); }
}

/* 头部 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-head,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-head,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-card > .modal-head {
  box-sizing: border-box !important;
  display: flex !important;
  align-items: center !important;
  height: 48px !important;
  min-height: 48px !important;
  padding: 0 20px !important;
  margin: 0 !important;
  background: transparent !important;
  border-bottom: 1px solid var(--color-border) !important;
  position: relative !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-title,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #modalTitle,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-head h3,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-head h1, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-head h2, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-head h3 {
  flex: 1 !important;
  margin: 0 !important;
  color: var(--color-text-1) !important;
  font-size: var(--font-size-title-1) !important;
  font-weight: var(--font-weight-500) !important;
  line-height: 1.4 !important;
  text-align: center !important;
}

/* 关闭控件 → 12px 图标（官方 close-icon），命中区 20px */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-close,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #modalClose,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-close,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-card [class*="close"] {
  position: absolute !important;
  right: 20px !important;
  top: 18px !important;
  width: 20px !important;
  height: 20px !important;
  min-width: 0 !important;
  min-height: 0 !important;
  padding: 0 !important;
  margin: 0 !important;
  border: 0 !important;
  border-radius: var(--radius-small) !important;
  background-color: var(--color-text-1) !important;
  color: transparent !important;
  font-size: 0 !important;
  line-height: 0 !important;
  overflow: hidden !important;
  cursor: pointer !important;
  box-shadow: none !important;
  -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M1.6 1.6l8.8 8.8M10.4 1.6l-8.8 8.8' stroke='%23000' stroke-width='1.3' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / 12px 12px !important;
  mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M1.6 1.6l8.8 8.8M10.4 1.6l-8.8 8.8' stroke='%23000' stroke-width='1.3' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / 12px 12px !important;
  z-index: 3 !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-close:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #modalClose:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-close:hover {
  background-color: var(--color-text-1) !important;
  opacity: .7;
}

/* 内容 / 底部 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-body,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #modalBody,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-body,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .settings-body {
  box-sizing: border-box !important;
  padding: 24px 20px !important;
  margin: 0 !important;
  color: var(--color-text-1) !important;
  font-size: var(--font-size-body-3) !important;
  line-height: var(--line-height-base) !important;
  overflow: visible !important;
  max-height: calc(100vh - 260px) !important;
  overflow-y: auto !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-foot,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-foot,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-actions,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-footer {
  box-sizing: border-box !important;
  display: flex !important;
  align-items: center !important;
  justify-content: flex-end !important;
  gap: 12px !important;
  padding: 16px 20px !important;
  margin: 0 !important;
  background: transparent !important;
  border-top: 1px solid var(--color-border) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-foot > * + *, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-actions > * + *,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-foot > * + * {
  margin-left: 0 !important;
}
/* 弹窗内表单：官方 Form 布局（标签在上、控件在下、块间距 16px）*/
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-body label,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-body label {
  display: block !important;
  margin: 0 0 4px !important;
  color: var(--color-text-1) !important;
  font-size: var(--font-size-body-3) !important;
  font-weight: var(--font-weight-400) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-body input, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-body select, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-body textarea,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-body input, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-body select, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-body textarea {
  width: 100% !important;
  margin: 0 0 16px !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-body > *:last-child, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-body > *:last-child {
  margin-bottom: 0 !important;
}

/* ============================================================
 * 2.9 Message / Toast —— 官方：圆角 2px、阴影 shadow2、padding 10px 16px、
 *     bg-popup、边框 neutral-3、图标 20px、内容 14px
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #voiceToast, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #toast,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-message, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #global-error-toast, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .voice-toast {
  box-sizing: border-box !important;
  padding: 10px 16px !important;
  border-radius: var(--radius-small) !important;
  background: var(--color-bg-5) !important;
  border: 1px solid var(--color-border-2) !important;
  box-shadow: var(--shadow-2-down) !important;
  color: var(--color-text-1) !important;
  font-size: var(--font-size-body-3) !important;
  line-height: var(--line-height-base) !important;
  z-index: var(--z-index-message) !important;
}

/* ============================================================
 * 2.10 Empty / Skeleton / Spin —— 官方：空态图标与文字 gray-5、文字 14px
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .empty-state, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-empty {
  padding: 32px 16px !important;
  color: var(--color-neutral-5) !important;
  font-size: var(--font-size-body-3) !important;
  text-align: center !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-empty svg, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .empty-state svg {
  color: var(--color-neutral-5) !important;
}

/* ============================================================
 * 2.11 卡片 / 面板 —— 官方：圆角 2px、1px border-2 描边替代阴影
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .card, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .panel,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-table-card, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .data-table-card,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .quick-card, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-card {
  border: 1px solid var(--color-border-2) !important;
  border-radius: var(--radius-small) !important;
  background: var(--color-bg-container) !important;
  box-shadow: none !important;
}

/* ============================================================
 * 2.12 P0 可用性修复：users 表「状态」列徽标竖排/截断 + 越界
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-table {
  table-layout: auto !important;
  min-width: 1040px !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-table th, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-table td {
  white-space: nowrap !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-table .status-tag,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-table .role-tag,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-table .badge {
  white-space: nowrap !important;
  writing-mode: horizontal-tb !important;
  word-break: keep-all !important;
  height: var(--size-mini) !important;
  min-height: var(--size-mini) !important;
  max-height: var(--size-mini) !important;
  line-height: 1 !important;
  padding: 0 8px !important;
}
/* 后台卡片正文：宽表格需要可横向滚动，否则右侧列被裁掉不可达（实测 .admin-card-body 858 > 677 且父级 overflow hidden）*/
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-card-body,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-table-wrap,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .table-wrap,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-table-wrap {
  overflow-x: auto !important;
}

/* ============================================================
 * 2.13 行内小工具动作（官方 mini 24px 档）
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pa-del, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .task-more, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .hs-add,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .act-collapse-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .copy-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .task-more,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .act-agent-roster-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .hs-toggle, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .filter-toggle {
  height: var(--size-mini) !important;
  min-height: var(--size-mini) !important;
  padding: 0 8px !important;
  font-size: var(--font-size-body-1) !important;
}

/* ============================================================
 * 2.14 官方不使用的效果一律清除（渐变按钮底、发光、玻璃模糊、过饱和描边）
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lib-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .seg-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lang-opt, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-tab, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tag,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-tag, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .badge, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .chip {
  background-image: none !important;
  text-shadow: none !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .card, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .panel, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-table-card, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .data-table-card {
  background-image: none !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}

/* ============================================================
 * 2.15 落地页（home.html）与认证流（login/signup/…）的私有旧样式收编
 *     这两类页面此前保留了自己的「极光 + 玻璃拟态 + 渐变」实现，与 Arco 冲突。
 *     官方基准：无渐变文字、无极光装饰、无玻璃模糊、无发光；
 *     字阶上限 display-3 = 56px；卡片圆角 4/8px + 1px 描边、无阴影。
 * ============================================================ */

/* 渐变文字 → 实心；去掉闪烁动画与发光投影 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .title {
  background: none !important;
  background-image: none !important;
  -webkit-background-clip: border-box !important;
  background-clip: border-box !important;
  -webkit-text-fill-color: var(--color-text-1) !important;
  color: var(--color-text-1) !important;
  animation: none !important;
  filter: none !important;
  font-family: var(--font-family) !important;
  font-size: var(--font-size-display-3) !important;
  font-weight: var(--font-weight-600) !important;
  letter-spacing: 0 !important;
  line-height: 1.2 !important;
  margin-bottom: var(--spacing-9) !important;
}
/* 极光装饰 / 网格光效一律移除（Arco 无此视觉语言） */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .aurora,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="aurora"],
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .grid-overlay,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="glow-"] {
  display: none !important;
}

/* 落地页排版归 Arco 字阶 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .subtitle {
  font-size: var(--font-size-title-3) !important;
  font-weight: var(--font-weight-400) !important;
  color: var(--color-text-2) !important;
  line-height: 1.5 !important;
  margin-bottom: var(--spacing-6) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .subtitle b { color: var(--color-text-1) !important; font-weight: var(--font-weight-500) !important; }
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .desc {
  font-size: var(--font-size-body-3) !important;
  color: var(--color-text-3) !important;
  line-height: var(--line-height-base) !important;
  margin-bottom: var(--spacing-9) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .desc b { color: var(--color-text-2) !important; font-weight: var(--font-weight-500) !important; }

/* 落地页卡片/图标块：去玻璃、去发光、圆角与描边归 Arco */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .stat {
  border-radius: var(--radius-large) !important;
  background: var(--color-bg-container) !important;
  border: 1px solid var(--color-border-2) !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  box-shadow: none !important;
  padding: var(--spacing-7) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .stat-ico {
  width: 40px !important;
  height: 40px !important;
  border-radius: var(--radius-medium) !important;
  background: var(--color-primary-light-1) !important;
  border: 1px solid transparent !important;
  color: var(--color-primary-6) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .stat-num {
  font-family: var(--font-family) !important;
  font-size: var(--font-size-title-3) !important;
  font-weight: var(--font-weight-500) !important;
  color: var(--color-text-1) !important;
  letter-spacing: 0 !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .stat-num .unit {
  font-size: var(--font-size-body-1) !important;
  color: var(--color-text-3) !important;
  font-weight: var(--font-weight-400) !important;
  vertical-align: baseline !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .stat-label {
  font-size: var(--font-size-body-3) !important;
  color: var(--color-text-3) !important;
  font-weight: var(--font-weight-400) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pipe-ico {
  width: 48px !important;
  height: 48px !important;
  border-radius: var(--radius-medium) !important;
  background: var(--color-primary-light-1) !important;
  border: 1px solid transparent !important;
  color: var(--color-primary-6) !important;
  box-shadow: none !important;
  animation: none !important;
  font-size: var(--font-size-title-1) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pipe-node:nth-child(3) .pipe-ico { animation-delay: 0s !important; }

/* 落地页按钮：把私有的 .btn-primary / .btn-secondary 并入统一按钮族 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn-primary,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn-primary:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn-primary:active {
  background: var(--color-primary-6) !important;
  background-image: none !important;
  color: var(--color-white) !important;
  border-color: transparent !important;
  box-shadow: none !important;
  transform: none !important;
  border-radius: var(--radius-small) !important;
  height: var(--size-default) !important;
  min-height: var(--size-default) !important;
  padding: 0 var(--control-padding-h-btn) !important;
  font-size: var(--font-size-body-3) !important;
  font-weight: var(--font-weight-400) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn-primary:hover { background: var(--color-primary-5) !important; }
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn-primary:active { background: var(--color-primary-7) !important; }
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn-secondary,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn-secondary:hover {
  background: var(--color-secondary) !important;
  background-image: none !important;
  color: var(--color-text-2) !important;
  border: 1px solid transparent !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  box-shadow: none !important;
  transform: none !important;
  border-radius: var(--radius-small) !important;
  height: var(--size-default) !important;
  min-height: var(--size-default) !important;
  padding: 0 var(--control-padding-h-btn) !important;
  font-size: var(--font-size-body-3) !important;
  font-weight: var(--font-weight-400) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn-secondary:hover { background: var(--color-secondary-hover) !important; color: var(--color-text-1) !important; }

/* 认证流：卡片与语言切换归 Arco */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-card {
  border-radius: var(--radius-small) !important;
  background: var(--color-bg-container) !important;
  border: 1px solid var(--color-border-2) !important;
  box-shadow: none !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-lang-toggle {
  border-radius: var(--radius-small) !important;
  background: var(--color-fill-2) !important;
  border: 1px solid transparent !important;
  height: var(--size-default) !important;
  padding: 2px !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-lang-toggle .lang-opt { border-radius: var(--radius-small) !important; }
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-lang-toggle .lang-opt.active {
  background: var(--color-bg-container) !important;
  color: var(--color-primary-6) !important;
  font-weight: var(--font-weight-400) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-field label {
  font-size: var(--font-size-body-3) !important;
  font-weight: var(--font-weight-400) !important;
  color: var(--color-text-1) !important;
}

/* 通用：任何带「卡片/面板」语义的容器都不再使用阴影与超大圆角 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="card"],
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="panel"] {
  border-radius: var(--radius-small) !important;
  box-shadow: none !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .card, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .panel,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-card, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-card,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-table-card, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .data-table-card,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .quick-card, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-card {
  border: 1px solid var(--color-border-2) !important;
  background: var(--color-bg-container) !important;
}

/* ============================================================
 * 2.16 兜底：通用通配规则之后，重申组件级官方规格
 * 起因（实测回归，由 design-system 页巡检发现）：
 *   1) 2.15 的 [class*="card"]（属性选择器，与 .modal-card 同特异性）
 *      因在源序中更靠后，把弹窗卡片圆角从官方 4px 压成 2px；
 *   2) 2.3 的 .btn.primary 等按钮类型规则设了 box-shadow: none，
 *      其「类数」多于 2.2 的 :focus-visible 规则（同为 2 个 id），
 *      导致 primary/danger/secondary 按钮丢失官方焦点环（裸 .btn 正常，
 *      故粗测会误判通过）—— 属无障碍缺陷。
 * 修法：本段置于文件最末，重申组件级规格；焦点环改用 3 个假 id 提升权重。
 * ============================================================ */

/* 1) 弹窗卡片：圆角 4px / 无阴影 / 无边框（官方 Modal 规格，见 2.8） */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-card,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #modalCard,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #confirmModal .modal-card,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #promptModal .modal-card {
  border-radius: var(--radius-medium) !important;
  box-shadow: none !important;
  border: none !important;
  /* 定位三件事：页面曾用 `left:704px / right:-704px / transform:translate(-260px)`
     把某些弹窗"凑"到居中；一旦 position 变为 relative，这些偏移就会把卡片推离中线
     （实测 index 设置弹窗 x=904，视口中线 720）。必须显式清掉，改用官方做法：
     遮罩 flex 居中 + 卡片 margin-top 100px。 */
  left: auto !important;
  right: auto !important;
  top: auto !important;
  bottom: auto !important;
  /* ⚠️ transform 上【不能】加 !important：CSS 级联里 !important 的作者声明
     高于 @keyframes 动画，会让下面的 arcoViModalIn 的位移/缩放整段失效（只剩淡入）。
     实测：带 !important 时 transform 恒为 none；去掉后动画恢复正常。
     去掉后仍然够用 —— 动画本就高于普通声明，而本规则的特异性高于页面里的
     transform: translate(...) 之类"凑居中"写法。 */
  transform: none;
  margin: auto !important;
}

/* 2) 弹窗标题：置 block + 居中。旧 styles.css 的 display:inline-flex 会让
      text-align 失效（inline-flex 的子项不受 text-align 影响），实测标题被拉左。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-title,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #modalTitle,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-head h3,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-head h1,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-head h2,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-head h3 {
  display: block !important;
  flex: 1 1 auto !important;
  width: 100% !important;
  margin: 0 !important;
  padding: 0 !important;
  text-align: center !important;
  color: var(--color-text-1) !important;
  font-size: var(--font-size-title-1) !important;
  font-weight: var(--font-weight-500) !important;
}

/* 3) 按钮焦点环：官方 0 0 0 2px <语义色 3 档>。3 个假 id 使其权重高于
      任何 .btn.<type> 的 box-shadow:none 与 #adminBody 级规则。 */
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .btn:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .arco-btn:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .users-btn:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .lib-btn:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .admin-btn:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .evo-btn:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .as-btn:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .auth-btn:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .btn-primary:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .btn-secondary:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) a.btn:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) button:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) [role="button"]:focus-visible {
  box-shadow: var(--color-focus-ring) !important;
  outline: none !important;
}
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .btn.danger:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .users-btn.danger:focus-visible,
html body:not(#arco-vi-focus-a):not(#arco-vi-focus-b):not(#arco-vi-focus-c) .admin-btn.danger:focus-visible {
  box-shadow: var(--color-focus-ring-danger) !important;
}

/* ============================================================
 * 2.17 style-preview：装饰性浮动手机模型的处置
 * 实测：.phone-float（right:-180px）/ .phone-float-2（right:-120px）故意挂在
 * 右侧视口外，造成 61px 页面级横向溢出 + 22 个越界元素（1440 视口实测）。
 * 该装饰（带 drop-shadow 的倾斜手机模型）不属于 Arco 视觉语言，
 * 且违反「无横向溢出」不变式 ⇒ 按 Q3「完全照官方」移除。
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .phone-float,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .phone-float-2 {
  display: none !important;
}

/* ============================================================
 * 2.18 动效接线（官方曲线/时长 + 进/退场 + loading 周期 + z-index）
 * 起因（实测复核，非转述）：
 *   官方 5 条曲线在整个仓库各只出现 1 次、且全在 §1.9 的声明本身
 *   ⇒ **令牌有值但从未接到任何组件上**；仍残留 Material 曲线 5 处；
 *   spin 动画周期混用 .6s/.7s（官方 loading 统一 1s）；
 *   浮层 z-index 出现硬编码 9999。
 * 官方口径：时长 0.1/0.2/0.3/0.4/0.5s、loading 1s；5 条曲线；
 *   z-index affix999 / popup1000 / modal·drawer1001 / message·notification1003。
 * ============================================================ */

/* 1) 按钮：官方实测过渡 = all .1s cubic-bezier(0,0,1,1)（线性） */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lib-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn-primary, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn-secondary,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .vt-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-filter-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sb-step-btn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pm-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .td-nav-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .ref-upload-btn {
  transition: all var(--motion-duration-1) var(--motion-linear) !important;
}

/* 2) 输入类：底色/边框走官方「标准」曲线，0.2s */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) input, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) textarea, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) select,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-input, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .settings-input, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .brief-input,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .activity-filter, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-search, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-filter,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sort-select, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .nc-m3-select, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .org-perm {
  transition: background-color var(--motion-duration-2) var(--motion-standard),
              border-color var(--motion-duration-2) var(--motion-standard) !important;
}

/* 3) 分段控件 / 胶囊 / 标签 / 链接：0.2s 标准曲线 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .seg-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lang-opt, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-tab,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mv-mode-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tab-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .filter-toggle,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .hs-toggle, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .theme-toggle, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .org-theme-toggle,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-chip, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .filter-chip, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .part-chip,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tag, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .badge, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .chip,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) a, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .link {
  transition: background-color var(--motion-duration-2) var(--motion-standard),
              border-color var(--motion-duration-2) var(--motion-standard),
              color var(--motion-duration-2) var(--motion-standard) !important;
}

/* 4) 卡片 / 表格行：hover 反馈 0.2s 标准曲线 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .card, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .panel, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-card,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-table-card, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .data-table-card, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .quick-card {
  transition: background-color var(--motion-duration-2) var(--motion-standard),
              border-color var(--motion-duration-2) var(--motion-standard),
              box-shadow var(--motion-duration-2) var(--motion-standard) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table tbody tr {
  transition: background-color var(--motion-duration-2) var(--motion-standard) !important;
}

/* 5) 浮层 z-index 归位官方体系（含页面里硬编码的 9999） */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-overlay, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-mask, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-mask,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #modalMask, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #confirmModal, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #settingsModal,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #promptModal, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #recPlayerMask,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mv-lightbox-backdrop, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lightbox-backdrop {
  z-index: var(--z-index-modal) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #voiceToast, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .voice-toast,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #toast, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-message {
  z-index: var(--z-index-message) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tooltip, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .popover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .dropdown-menu,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [role="tooltip"] {
  z-index: var(--z-index-popup) !important;
}

/* 6) 浮层进/退场动画（官方为进/退场成对；此处补齐此前"瞬现瞬灭"的几类）
      说明：退场需要 JS 延迟 display:none 才能播完，本层只负责进场的 keyframes，
      退出动画的挂载见 05 报告 §五 的 P0 待办（需 JS 改动）。 */
@keyframes arcoViFadeIn  { from { opacity: 0; } to { opacity: 1; } }
@keyframes arcoViSlideUp { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@keyframes arcoViZoomIn  { from { opacity: 0; transform: scale(.96); } to { opacity: 1; transform: none; } }

/* Message / Toast：官方进场 0.1s、退场 0.3s */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #voiceToast, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #toast,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .voice-toast, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-message {
  animation: arcoViSlideUp var(--motion-duration-1) var(--motion-decelerate) !important;
  transition: opacity var(--motion-duration-3) var(--motion-standard) !important;
}
/* Tooltip / Popover / Dropdown：进场 0.2s 标准曲线 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tooltip, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .popover, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .dropdown-menu,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [role="tooltip"] {
  animation: arcoViFadeIn var(--motion-duration-2) var(--motion-standard) !important;
}
/* 抽屉 / 侧滑面板 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .drawer, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .side-panel, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .agent-panel {
  animation: arcoViZoomIn var(--motion-duration-3) var(--motion-decelerate) !important;
}

/* 7) loading 周期归官方 1s（此前混用 .6s/.7s/.8s） */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .loading, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .spinner, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .spin,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="spinner"], html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="loading"] svg,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-spin {
  animation-duration: var(--motion-duration-loading) !important;
  animation-timing-function: var(--motion-linear) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .chain-btn, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .task-more, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pa-del {
  transition: border-color var(--motion-duration-2) var(--motion-standard),
              color var(--motion-duration-2) var(--motion-standard),
              background-color var(--motion-duration-2) var(--motion-standard) !important;
}

/* 8) 无障碍兜底：尊重系统「减少动态效果」
      注：官方源码 259 个样式文件 0 处 prefers-reduced-motion；本项是**优于官方**的
      可访问性加法，不覆盖任何官方取值。 */
@media (prefers-reduced-motion: reduce) {
  /* ⚠️ 必须用【3 个假 id + !important】：
     本层给 .btn/.tag/卡片等接了 `transition: ... !important`（特异性 2-id + 类），
     原先写 `html body *`（0,0,2）根本压不过它 ⇒ 兜底形同不存在
     （实测因果：提权后 transition-duration 由 0.1s → 1e-06s）。
     这里同时覆盖 animation 与 transition，并把无限循环动画压成单次。 */
  html body:not(#arco-vi-motion-a):not(#arco-vi-motion-b):not(#arco-vi-motion-c),
  html body:not(#arco-vi-motion-a):not(#arco-vi-motion-b):not(#arco-vi-motion-c) *,
  html body:not(#arco-vi-motion-a):not(#arco-vi-motion-b):not(#arco-vi-motion-c) *::before,
  html body:not(#arco-vi-motion-a):not(#arco-vi-motion-b):not(#arco-vi-motion-c) *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    animation-delay: 0ms !important;
    transition-duration: 0.01ms !important;
    transition-delay: 0ms !important;
    scroll-behavior: auto !important;
  }
  /* 例外：进度类指示器保留极短循环，避免"看起来卡死"（官方 loading 1s 的降级形态） */
  html body:not(#arco-vi-motion-a):not(#arco-vi-motion-b):not(#arco-vi-motion-c) [class*="spinner"],
  html body:not(#arco-vi-motion-a):not(#arco-vi-motion-b):not(#arco-vi-motion-c) [class*="spin"],
  html body:not(#arco-vi-motion-a):not(#arco-vi-motion-b):not(#arco-vi-motion-c) .loading,
  html body:not(#arco-vi-motion-a):not(#arco-vi-motion-b):not(#arco-vi-motion-c) .arco-spin {
    animation-duration: 1s !important;
    animation-iteration-count: infinite !important;
  }
}

/* ============================================================
 * 2.18 图标按钮族（从 2.3 的按钮族里拆出来）+ 认证流主按钮语义
 * 起因（R2 认证流巡检发现，我实测确认）：
 *   2.3 把「图标按钮 / 文字按钮 / 主按钮」混成一族，统一下了
 *   `padding: 0 var(--control-padding-h-btn)`（=15px）。
 *   实测 .auth-theme-toggle 只有 32px 宽 ⇒ 内容盒只剩 2px：
 *     - login / value：内嵌 svg 被 flex 收缩成 0×16 ⇒ 按钮变成【空白方块】
 *     - signup / invite / forgot / reset：文字「主题」溢出框外
 *   官方图标按钮的正确定义是【方形 + padding 0 + 居中 + 图标不收缩】。
 *
 *   同一轮还实测到：认证流 5 页的 #loginBtn/#signupBtn/#rpBtn/#fpBtn 都只写
 *   `class="auth-btn"`（无 primary），而 #toLogin 写 `auth-btn secondary`，
 *   两者 computed 8 项全等 ⇒ 认证页【没有主按钮】，主次动作像素级同款。
 *   ⇒ 本仓语义是「裸 .auth-btn = 页面主动作」，故按 :not(.secondary) 给主色。
 * ============================================================ */

/* 1) 图标按钮族：方形 / padding 0 / 居中 / 图标不参与收缩 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-theme-toggle,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .theme-toggle {
  width: var(--size-default) !important;
  min-width: var(--size-default) !important;
  height: var(--size-default) !important;
  padding: 0 !important;
  gap: 0 !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  background: var(--color-secondary) !important;
  border-color: transparent !important;
  color: var(--color-text-2) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-theme-toggle:hover,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .theme-toggle:hover {
  background: var(--color-secondary-hover) !important;
  color: var(--color-text-1) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-theme-toggle > svg,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .theme-toggle > svg,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .org-theme-toggle > svg {
  flex: 0 0 auto !important;
  width: var(--icon-size-lg) !important;
  height: var(--icon-size-lg) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-theme-toggle .ico-sun,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-theme-toggle .ico-moon,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .theme-toggle .ico-sun,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .theme-toggle .ico-moon {
  flex: 0 0 auto !important;
}
/* 带文字的主题切换（signup 等）保留可容纳「主题」二字的最小内边距 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .org-theme-toggle {
  min-width: var(--size-default) !important;
  height: var(--size-default) !important;
  padding: 0 8px !important;
}

/* 2) 认证流主按钮：裸 .auth-btn = 页面主动作 ⇒ 主色实心 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn:not(.secondary) {
  background: var(--color-primary-6) !important;
  border-color: transparent !important;
  color: var(--color-white) !important;
  font-weight: var(--font-weight-400) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn:not(.secondary):hover {
  background: var(--color-primary-5) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn:not(.secondary):active {
  background: var(--color-primary-7) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn:not(.secondary):disabled {
  background: var(--color-disabled-bg) !important;
  color: var(--color-disabled-text) !important;
}
/* 次级：灰底无边框（官方 secondary），确保与主按钮可区分 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn.secondary {
  background: var(--color-secondary) !important;
  border-color: transparent !important;
  color: var(--color-text-2) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn.secondary:hover {
  background: var(--color-secondary-hover) !important;
  color: var(--color-text-1) !important;
}

/* ============================================================
 * 2.19 后台「示范案例」卡：暗色下白底岛 + 白字压白底（1:1，读不到）
 * 实测（admin.html#panel=demos，dark）：
 *   .demo-card-thumb 的生效背景 = rgb(255,255,255)（暗色下未跟随主题）
 *   其上的 .demo-card-status / .demo-card-imgcount 文字 = rgba(255,255,255,.9)
 *   ⇒ 白字压白底，对比度 ≈ 1:1，内容实际【不可见】
 * 修法两条：① 缩略图底跟随主题，消除暗色白底岛；
 *           ② 浮在媒体上的徽标改用官方遮罩同源的深色半透明底 + 白字，
 *              这样无论缩略图是白底还是照片都读得到。
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .demo-card-thumb,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="demo-card"] [class*="thumb"] {
  background: var(--color-fill-2) !important;
  background-image: none !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .demo-card-status,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .demo-card-imgcount,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="demo-card"] [class*="status"],
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="demo-card"] [class*="imgcount"] {
  display: inline-flex !important;
  align-items: center !important;
  height: var(--size-mini) !important;
  min-height: var(--size-mini) !important;
  padding: 0 8px !important;
  border: 1px solid transparent !important;
  border-radius: var(--radius-small) !important;
  background: rgba(29, 33, 41, 0.6) !important;   /* = 官方遮罩色 */
  color: #FFFFFF !important;
  font-size: var(--font-size-body-1) !important;
  font-weight: var(--font-weight-400) !important;
  line-height: 1 !important;
  white-space: nowrap !important;
}

/* ============================================================
 * 2.19 角色相关缺陷修复（源自 docs/arco-vi-20260914/10-R2-ROLE-MATRIX-AUDIT.md）
 * ============================================================ */

/* R-4：错误类 toast 的危险语义 —— **最终口径以 §2.20 为准**
   （§2.20 采用官方 Alert/Message 的浅色变体：danger-1 作底 + danger-6 作字，
     比本段原先"实心 danger-6 + 白字"更贴合官方。
     为避免留下互相矛盾的死声明，此处不再重复 background/color。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #global-error-toast,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast.danger, html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast.error,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .voice-toast.danger {
  border-radius: var(--radius-small) !important;
}

/* R-2（样式半边）：权限拦截横幅此前是内联金银色系 + 圆角 8px + z-index 9999，
   且 top:14px 与工作台顶栏几何重叠。收编为官方 warning 语义 + message 层。
   （语义半边已在 js/auth.js：只读统计类 403 静默降级，不再弹此横幅） */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #permissionDeniedBanner {
  background: var(--color-warning-light-1) !important;
  color: var(--color-warning-6) !important;
  border: 1px solid var(--color-warning-3) !important;
  border-radius: var(--radius-small) !important;
  box-shadow: var(--shadow-2-down) !important;
  padding: 10px 16px !important;
  font-size: var(--font-size-body-3) !important;
  line-height: var(--line-height-base) !important;
  z-index: var(--z-index-message) !important;
  /* 顶栏实测高约 56px，原 top:14px 会压住顶栏中部 ⇒ 下移到顶栏之下 */
  top: 70px !important;
  left: 50% !important;
  transform: translateX(-50%) !important;
  max-width: 540px !important;
  animation: arcoViSlideUp var(--motion-duration-2) var(--motion-decelerate) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #permissionDeniedBanner b {
  color: var(--color-warning-6) !important;
  font-weight: var(--font-weight-500) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #permissionDeniedBanner span {
  color: var(--color-text-2) !important;
  font-size: var(--font-size-body-1) !important;
}

/* ============================================================
 * 2.20 修正 §2.9 对「错误/危险 toast」的误压（R2 角色矩阵巡检发现的我方回归）
 * 现象：§2.9 给 `.toast` 统一下了 `background: var(--color-bg-5)`（= 白），
 *   把页面级「全局错误提示」原本的**红色语义底**一起压成了白色
 *   ⇒ id=global-error-toast 看起来和普通提示一样，错误语义完全丢失。
 * 口径澄清：
 *   - 官方 Message 的底色确实统一是 --color-bg-popup（白），语义靠**图标**承载；
 *     所以 §2.9 对「普通提示」的写法没错，不该整条改。
 *   - 但本仓的 global-error-toast 是页面级告警条，其设计意图就是「红色底」。
 *     按 Q3「完全照官方」的映射应是 **Arco 危险色系**：
 *     danger-1 作底、danger-6 作字，而不是把语义抹成中性白。
 * ⇒ 本条只把「错误/危险」变体单独映射到官方 danger 令牌，不动普通提示。
 * ============================================================ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #global-error-toast,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast.error,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast.err,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast.danger,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast-danger,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="toast"][class*="error"],
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="toast"][class*="danger"] {
  background: var(--color-danger-1) !important;
  border-color: transparent !important;
  color: var(--color-danger-6) !important;
  box-shadow: var(--shadow-2-down) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast.success,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast.ok,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="toast"][class*="success"] {
  background: var(--color-success-1) !important;
  border-color: transparent !important;
  color: var(--color-success-6) !important;
}
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast.warning,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .toast.warn,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="toast"][class*="warn"] {
  background: var(--color-warning-1) !important;
  border-color: transparent !important;
  color: var(--color-warning-6) !important;
}

/* ------------------------------------------------------------
 * 2.20 补：把内联写死的错误 toast 归到官方 Message 规格
 * 现状（三处页面内联 cssText）：border-radius:8px / z-index:99 /
 *   transition:opacity .2s / box-shadow:0 4px 12px rgba(0,0,0,.2)。
 * 官方 Message：圆角 2px、阴影 shadow-2(=0 4px 10px rgba(0,0,0,.1))、
 *   内容 14px、enter 100ms / exit 300ms、消息层 z-index 1003。
 * 内联样式优先于普通声明，故此处必须用 !important 才能归位。
 * ------------------------------------------------------------ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #global-error-toast,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="toast"][class*="error"],
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="toast"][class*="danger"] {
  border-radius: var(--radius-small) !important;
  z-index: var(--z-index-message) !important;
  padding: 10px 16px !important;
  font-size: var(--font-size-body-3) !important;
  max-width: 380px !important;
  transition: opacity var(--motion-duration-1) var(--motion-linear),
              visibility var(--motion-duration-1) var(--motion-linear) !important;
}

/* ============================================================
 * 2.21 动效复验（§11-R2-MOTION-VERIFICATION）落实：三条真修 + 一条撤结论
 * ============================================================ */

/* ① `.skip-link` 的 z-index:9999 —— 上一版我把它从度量里"排除"掉让断言转绿，
      复验同事指出这等于"看不见"（度量作弊）。此处改为【真修】：
      内联样式优先于普通声明，故必须 !important 才能把它降到官方层级。
      跳转链接只需高于顶栏、低于浮层 ⇒ 用官方 popup 层 1000。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .skip-link {
  z-index: var(--z-index-popup) !important;
}

/* ② 旋转类动画周期统一为官方 loading 1s
      实测唯一未接线者：.agent-roster-status[data-status=active] .agent-roster-dot
      与 .board-legend .blg-dot.active，均写死 .8s（styles.css:20181 / 20207）。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .agent-roster-status[data-status="active"] .agent-roster-dot,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .board-legend .blg-dot.active,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .agent-board .agent-spinner,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="loading"][class*="dot"] {
  animation-duration: 1s !important;
}

/* ③ 表格单元格补齐过渡 —— 官方 Table 给 tr 与 td 都下了
      `background-color @transition-duration-1 @transition-timing-function-linear`
      （Table/style/index.less:23 与 :426）。本层只接了 tr，td 仍是 0s
      ⇒ 表现为"td 瞬时跳变盖住 tr 的 0.2s"，半接线。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table tbody tr,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table tbody td,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) table tbody th {
  transition: background-color var(--motion-duration-1) var(--motion-linear) !important;
}

/* 空态动作区（官方 Empty + 按钮族；行内间距用官方 spacing） */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .org-empty-actions {
  display: flex !important;
  gap: var(--spacing-6) !important;
  justify-content: center !important;
  align-items: center !important;
  flex-wrap: wrap !important;
  margin-top: var(--spacing-7) !important;
}

/* ============================================================
 * 2.22 z-index 归位官方体系（把 JS/内联写死的 9999·99999 拉回官方 7 层）
 * 实测全仓超官方最大档(1003)的内联/JS z-index 共 **17 处**，分布：
 *   js/admin-evolution.js:125(9999) · js/app.js:1858(2000) · js/assets.js:244(9999)
 *   js/assets.js:1802(99999) · js/auth.js:124(99999) · js/auth.js:551/574/602/1263(9999)
 *   js/history.js:2018(9999) · admin.html:714(99999)/1079/2140(9999)/5404(10000)
 * 这些是运行时内联样式，普通声明压不过 ⇒ 必须 !important。
 * 官方层级：affix 999 / popup 1000 / drawer·modal 1001 / message·notification 1003。
 * ============================================================ */
/* 提示类 → message 层 1003 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-toast,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .org-toast,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #global-error-toast,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .bb-page .toast,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .voice-toast,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #voiceToast,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-message,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="toast"] {
  z-index: var(--z-index-message) !important;
}
/* 浮层/遮罩/灯箱 → modal 层 1001 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-modal,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-overlay,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-mask,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-mask,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #modalMask,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #confirmModal,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #settingsModal,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #promptModal,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #recPlayerMask,
/* 灯箱【仅根容器级】→ modal 层 1001。
   ⚠️ 原写法是子串通配 `[class*="lightbox"]`，会把灯箱的**全部后代**
   （.mv-lightbox-inner / -arrow / -close / -cap / -thumbs）一并提到 1001，
   抹平容器内的层内相对次序（inner 原 1、arrow 原 2、close 原 auto）。
   实测未致害（箭头/关闭键几何不与内容重叠），但正确性依赖"DOM 顺序恰好正确"，
   属结构性脆弱 ⇒ 收窄到容器级：**只提根容器** `.mv-lightbox`。
   注意：遮罩 `.mv-lightbox-backdrop`（index.html:1401，灯箱容器的子节点）**也必须排除**——
   它一旦也被提到 1001，就会盖住容器内的翻页/关闭键（实测 elementFromPoint 命中
   `.mv-lightbox-backdrop` 而不是按钮）；下一段专门把它的 z-index 还原为 auto。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mv-lightbox {
  z-index: var(--z-index-modal) !important;
}
/* 灯箱遮罩：还原为 auto，让容器内的原始层内次序（backdrop 0 < inner 1 < arrow 2）回来。
   选择器为"容器内遮罩"(0-2-0)，比特异性高于 §2.6/§2.18 里裸的 `.mv-lightbox-backdrop`
   (0-1-0)，两条同为 !important 时本条胜；只作用于位于灯箱容器内的遮罩，不动任何独立遮罩。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mv-lightbox .mv-lightbox-backdrop {
  z-index: auto !important;
}
/* ✅ P0 修复（2026-09-15 · 样式与设计系统分区）：资产库预览灯箱被**自己的遮罩整块盖住**，鼠标完全失效。
   ------------------------------------------------------------
   归属：assets.html 的灯箱根容器是 `<div class="asset-preview-wrap" id="previewWrap" hidden>`，
   而遮罩 `#previewMask.modal-mask` 是它的**兄弟节点、且排在它之前**（assets.html:608/609）。
   §2.6/§2.8/§2.22 把 .modal-mask 提到 --z-index-modal(1001)，但上面 §2.22 的灯箱白名单**只收了 .mv-lightbox**，
   .asset-preview-wrap 仍是 styles.css 的 z-index:61 ⇒ 遮罩盖住整个灯箱。
   修前实测（elementFromPoint，1440×900）：× / ‹ / › / 缩略图条 / 图片中心 5 点**全部命中 #previewMask**；
   Playwright 点 #previewLbNext 直接超时「previewMask intercepts pointer events」，只有键盘 Esc/←/→ 还能用。
   修法（与 .mv-lightbox 同法）：把灯箱根容器提回官方 modal 档 1001。与遮罩同为 1001 时，层内次序由
   **DOM 顺序**决定（#previewWrap 在 #previewMask 之后）⇒ 灯箱在上，符合预期；灯箱内控件都在该容器
   的叠层上下文内，不会再被兄弟遮罩截胡。
   ⚠️ assets.html 另有页面级兜底 `#previewWrap{z-index:1002}`（无 !important、仅 1 个 id）：本条特异性更高，
   会把生效值收敛回 1001。两者同时存在时行为一致（都 ≥ 遮罩且 DOM 在后），不冲突、不打架。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .asset-preview-wrap,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #previewWrap {
  z-index: var(--z-index-modal) !important;
}
/* 下拉/浮出菜单 → popup 层 1000 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lib-dropdown,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .artbus-user-menu,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="dropdown-panel"],
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) [class*="popover"] {
  z-index: var(--z-index-popup) !important;
}

/* ============================================================
 * 2.22b z-index 归位 · 补漏 + 单处例外
 * ------------------------------------------------------------------
 * 上游 §2.22 的自述口径是「具名 class/ID 白名单 + 3 个 [class*] 通配」，
 * 它同时存在「漏」与「过」两类相反偏差（见 11-R2-MOTION-VERIFICATION §7.2/§7.3）。
 * 本节处理 §2.22 射程外、**类名不在白名单**的 6 个静态超标项（值 9999/10000）：
 *   .tuner-workbench(9999) · .as-modal(10000) · .pcv-backdrop(10000)
 *   .pc-panel-backdrop(9999) · .frame-zoom-overlay(9999) · .user-detail-modal(9999)
 * 6 者均为浮层/遮罩语义 ⇒ 统一归入官方 modal 层 1001（drawer 与 modal 同值）。
 * 来源文件（我无写权，故在此层以 !important 归位）：
 *   styles.css:7683 / :17614 / :18240 / :18557 / :20927 · js/ai-studio.css:109
 * JS 侧动态创建、无 class 的元素（#assetToast/#_assetsToast/#authExpiredBanner/
 *   #quotaExceededBanner/#permissionDeniedBanner/#permGateHintBanner/#imgLightbox）
 *   已在 JS 里改挂官方令牌（见各 js 文件），不在此处兜。
 * ------------------------------------------------------------ */
/* 类名超标的 6 处 → modal 层 1001 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tuner-workbench,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-modal,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pcv-backdrop,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pc-panel-backdrop,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .frame-zoom-overlay,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .user-detail-modal {
  z-index: var(--z-index-modal) !important;
}
/* ✅ P0 修复（2026-09-15 · 接力轮）：**用户 / 租户详情面板被自己的遮罩整块盖住** —— 面板发灰 + 鼠标完全失效。
   ------------------------------------------------------------------
   归属：admin.html 的两个详情面板结构是 `<div class="user-detail-modal">` 内含
         `<div class="user-detail-mask"> + <div class="user-detail-card">`（遮罩在卡**之前**、同一容器）。
   而 §2.8（本文件 1368 行）把 `.user-detail-mask` 一律提到 --z-index-modal(1001)，
   而卡片的 z-index 是 1（src/components.css / styles.css 的 .user-detail-card）⇒ **遮罩盖住卡**。
   修前实测（chromium 1440×900，用户管理 → 点用户行打开详情）：
     · elementFromPoint(租户名中心) 命中 `DIV.user-detail-mask`，不是卡里的元素；
     · Playwright 点面板内任何元素 ⇒「user-detail-mask intercepts pointer events」；
     · 遮罩带 data-close-detail / data-close-tenant ⇒ **面板内点任何地方都会把面板关掉**。
   修法与 `.mv-lightbox-backdrop`(本文件 2345) 同：**只**把「位于 .user-detail-modal 容器内的遮罩」
   还原为 auto，让层内次序回到 DOM 顺序（遮罩在前、卡在后）⇒ 卡片在上、遮罩仍能接住「点外部关闭」。
   不动任何独立遮罩。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .user-detail-modal .user-detail-mask {
  z-index: auto !important;
}
/* 单处【例外·有意高于 modal 档】：#assetPreviewModal 原 1100（styles.css:9991），
   §2.22 的 .modal-overlay 通配把它一并压到 1001 —— 这是全站唯一"被 §2.22 下调"
   的元素。1100 是刻意高于其它弹窗一层（资产预览要能盖在别的弹窗之上），
   故此处撤销降级、恢复 1100。#id 特异性(1-0-0) 高于 .modal-overlay(0-1-0)，
   两条同为 !important 时后者胜；位置也排在其后，双保险。
   ⚠️ 1100 是**对官方 7 层档位的显式例外**，与 .skip-link 一样按单点登记。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #assetPreviewModal {
  z-index: 1100 !important;
}

/* ============================================================
 * 2.22c 浮层栈契约 —— 「后打开的浮层一定在上面」（2026-09-15 · 前台工作台布局分区 P0）
 * ------------------------------------------------------------------
 * 起因（老板原话）：「点击 Agent 状态之后，再点里面的某些东西就显示不出来了，可能是卡片的
 *   层级排列有问题……把这种问题全部杜绝掉。」
 * 实测根因（index.html，1440×900，修前）：
 *   #agentRosterModal(z-index:1001, body 子节点序 8) 内点「查看详情」→ 打开 #agentThinkModal
 *   (z-index:1001, body 子节点序 7) —— **同层同值时由 DOM 顺序决胜**，名册 DOM 在后 ⇒
 *   名册整块盖住思考详情。elementFromPoint(720,510) 命中 .agent-rm-out-wrap（在名册内），
 *   Playwright 点 #agentThinkModalClose 直接超时（intercepted）。
 * 契约（本设计系统层的口径，改动前必读）：
 *   ① 浮层层级只有一档：z-index = --z-index-modal = 1001。**不得为了压过兄弟而抬高 z**
 *      —— 全仓不变式是「computed z-index ≤ message 档 1003」
 *      （_scan/arco-vi/accept-motion.mjs:73、mv-verify.mjs:36 的 Z_MAX 断言）。
 *   ② 同层同值时，**DOM 顺序 = 叠放顺序**（后出现者画在上面）。因此「后打开者必须 DOM 在后」。
 *   ③ 落地方式（两层保险，缺一不可）：
 *      · 静态：index.html 里「会从弹窗内再弹出来的弹窗」必须写在它的父弹窗**之后**
 *        （二级浮层区 → 三级浮层区，见 index.html 内的顺序契约注释）。
 *      · 运行期：index.html 页尾「浮层栈管理器」把已可见的根级浮层按**实际打开顺序**
 *        重排到 <body> 末尾，覆盖任何静态顺序写错 / 后续新增浮层的情况。
 *        （逃生开关 window.__ovStackOff = true 可关闭重排。）
 *   ④ 唯一登记例外：#assetPreviewModal 的 z 为 1100（见上 §2.22b）。它高于 1001 的兄弟，
 *      故「在素材预览打开后再弹的系统对话」会被它盖住 —— 当前该容器内只有 上/下一张/关闭
 *      三个按钮（index.html #assetPreviewModal），**无任何可再开浮层的入口**，实测不可达。
 *      ⚠️ 若将来在素材预览里加入 confirm/prompt 类动作，必须同时把系统对话的 z 提到 >1100
 *         并同步更新上述 Z_MAX 不变式，否则会复现同一类「点了没反应」。
 * ============================================================ */

/* 关闭态浮层：同时 display:none + pointer-events:none。
   历史同类事故（index.html 全局错误 toast 注释）：只置 opacity:0 的「隐形浮层」仍是
   position:fixed/pointer-events:auto ⇒ 一个看不见的遮罩吞掉整页点击。此处对浮层做兜底，
   把「已关闭」从「看不见」升级为「不参与命中测试」。 */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-overlay.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-mask.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-modal-mask.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #modalMask.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-modal.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .user-detail-modal.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-modal.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mv-lightbox.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tuner-workbench.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pc-panel-backdrop.hidden,
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-overlay[hidden],
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .modal-mask[hidden],
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .obs-modal[hidden] {
  display: none !important;
  pointer-events: none !important;
}

/* ============================================================
 * 2.23 暗色前景色归位（把 WCAG AA 不达标的前景色拉回官方语义档）
 * ------------------------------------------------------------------
 * 起因：暗色下 22 面板逐面板复测（_scan/arco-vi/verify-darktext-panels.mjs）
 *   只剩 3 个根因色不达标，逐一定性：
 *   · rgb(90,90,92)  = 官方 --color-disabled-text 的**暗色档**（#5A5A5C）
 *                      ⇒ 全部落在 disabled 控件上，WCAG 1.4.3 明确豁免
 *                        「disabled / inactive 控件」，且本身就是官方语义档
 *                        ⇒ **判定为非缺陷，本层刻意不动**（不要"为绿而改"）。
 *   · rgb(120,120,122) = 暗色 --color-neutral-5
 *   · rgb(151,112,10)  = #97700A（js/agent-panels.css:216 手写死色）
 *   · rgb(14,66,210)   = #0E42D2（官方 primary-7 = 按压态色，被本仓当**前景色**硬编码）
 * 口径（严守"只改文字色、不碰背景/边框/按压态"）：
 *   ① 只改「当前被当作前景文字色 / 图标色」的那些；
 *   ② 作背景、边框、:active 按压态用的 #0E42D2 一律保持原样；
 *   ③ 浅色主题一律不动（#0E42D2 压浅底是好的）。
 * 作用域说明：产品七处主题引导只挂 documentElement，全仓
 *   `body.setAttribute('data-theme',…)` 0 处 ⇒ 本段统一写 `html[data-theme="dark"] …`。
 * ============================================================ */

/* ------------------------------------------------------------
 * 2.23.1 空态文字（第 1 类：rgb(120,120,122)）
 *   官方 Empty 的 @empty-color-text 就是 gray-5（Empty/style/token.less），
 *   §2.10 照抄没错；但官方**暗色** gray-5 = #78787A 压在官方暗底 #17171A 上
 *   只有 4.06:1 —— 官方自身即差 0.44，属"照抄官方也不达标"的擦线项。
 *   暗色只上**一档**到 gray-6（--color-neutral-6 暗色 = rgb(146,146,147)）= 5.75:1，
 *   仍是官方灰阶语义，不新造颜色。浅色侧保持 §2.10 的官方 gray-5 原样。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .empty-state,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-empty,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .empty-state svg,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-empty svg {
  color: var(--color-neutral-6) !important;
}

/* ------------------------------------------------------------
 * 2.23.2 「不可调用 · 仅内部」徽标（第 2 类：rgb(151,112,10)）
 *   来源 js/agent-panels.css:216 手写死色 `color:#97700a`（11px/600 属小字），
 *   暗色底上只有 3.95:1 < 4.5。归位到官方**警示语义** --color-warning-6
 *   （暗色 = rgb(255,150,38)）= 5.57:1。
 *   只改文字色，徽标自身的琥珀底/描边保持原样（不在本次缺陷口径内）。
 *   浅色下 #97700A 压浅底 4.26:1 尚可，按"浅色不动"原则不碰。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .no-call-badge {
  color: var(--color-warning-6) !important;
}

/* ------------------------------------------------------------
 * 2.23.3 #0E42D2 前景归位（第 3 类：rgb(14,66,210)）
 *   ⚠️ 口径纠正（有实测证据，见 §2.23 尾注）：暗色下这一类失败**不是**
 *      "深蓝字压暗底"，而是"深蓝字压**品牌蓝底**"。取证探针逐元素 dump 自身底色：
 *        .top-dropdown .td-new      ownBg = rgb(60,126,255) = 官方暗色 primary-6
 *        .io-tab.active             ownBg = rgb(60,126,255)
 *        .artbus-avatar             ownBgImg = linear-gradient(primary-5 → primary-6)
 *      #0E42D2 压这类底只有 1.48~2.06:1。
 *   ⇒ 若按"换成 --color-primary-6"改，在这些元素上会变成 **1.0:1（文字直接消失）**；
 *     品牌填充底上的官方正解是 --color-white（Arco 实心主按钮即 bg primary-6 + 字 #fff，
 *     本层 §2.3 主按钮同样落 `color: var(--color-white) !important`）。
 *   下列元素的浅色基线本就如此，暗色下被 `color:#0E42D2` 覆盖/写坏，故统一归位为白：
 *     ① .top-dropdown .td-new / .td-asset-statusbar .st-btn.st-active
 *        —— 同一条规则里基线就是 `color:#fff`，仅多出一条
 *           `[data-theme="dark"] …{color:#0E42D2}` 把它写坏（styles.css:19781 / 19442）。
 *     ② .io-tab.active / .artbus-avatar / .pc-btn-add / .picker-card-score-tag
 *        —— 基底态即"品牌实心填充 + #0E42D2 字"，暗色下压的是暗色版品牌蓝。
 * 刻意排除者（经实测，改之会**抹掉正确的既有语义**）：
 *   .admin-body .seg-btn.active —— 已被本层 §2.4「官方胶囊选中态」归位为
 *     `bg --color-primary-light-1 + color --color-primary-6`（品牌浅底 + 品牌字），
 *     其 components.css:10103 的 `#0E42D2` 早已是死声明；此处再置白会抹掉选中态。
 *   .provider-tab.active —— 真实上下文里**不是品牌填充**：providers 面板被
 *     `#adminBody #panel-providers .provider-tab.active`（js/agent-panels.css:1158）
 *     改写为 `bg --bg-1 + color --brand-text`（中性底 + 品牌字），是本仓正确的
 *     "选中标签"写法；置白会把选中态抹成和未选中一样白。
 *     它另有一条 borderline：品牌字压在 `--bg-2` 容器底上约 4.2:1，
 *     属"前景色压中性底"而非本段口径，留待与 lead 确认后再定，不在此处擅改。
 * 未纳入者（同根因但已被更高优先级规则覆盖，改之无益或有害）：
 *   .btn.primary / .users-btn.primary（styles.css:9455·14508·14861 的暗色覆盖）
 *     —— 已被本层 §2.3 与 styles.css:22045 的 `color:#fff !important` 压掉，实际就是白；
 *   .free-upload-icon（styles.css:21532·22153 等 `color:#fff !important` 已归位）；
 *   .users-stat-icon / .quick-icon / .type-icon / .model-pick-icon / .users-avatar
 *     —— 各有 .ok / .warn / .muted / .kind-*(通配) / .admin / .creator / .viewer 变体底色
 *        （tint + 语义字色），一律置白会把这些语义一起抹掉，故只报告、不在此段处理。
 *        注：写通配类名时**严禁**直接跟上斜杠（星号+斜杠即注释闭合符），
 *        那一对字符会提前闭合本注释块，让后面整条选择器列表变成非法 CSS 而被
 *        解析器**整条静默丢弃**（本次即因此踩坑；已由 build-arco-vi.py 新增守卫拦截）。
 * ------------------------------------------------------------ */
/* ① 暗色覆盖把基线 #fff 写坏的两条 */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .top-dropdown .td-new,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .td-asset-statusbar .st-btn.st-active,
/* ② 品牌实心填充块（基底态即写死 #0E42D2） */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .io-tab.active,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .artbus-avatar,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pc-btn-add,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .picker-card-score-tag {
  color: var(--color-white) !important;
}

/* ============================================================
 * 2.24 暗色对比度反转收编（新口径重算出的 474 处，见 20 / 23 号报告）
 * ------------------------------------------------------------------
 * 起因：`20-DARK-CONTRAST-RECOUNT.md` 用新口径（EFFBG=composite：
 *   从元素自身往祖先合成、`background-image` 按停点取最差、`url()` 一律
 *   UNMEASURABLE）重算后，新增 474 条「旧口径判达标 → 新口径判不达标」的反转。
 * 本节与 §2.23 同一口径，只做一件事：把暗色下**当前被当作前景文字色**的
 *   那几个值抬到官方语义档的更高一档。四条硬约束：
 *   ① 只改前景文字色；背景 / 边框 / `:active` 按压态一律不动；
 *   ② 浅色主题一律不动（本节全部以 `html[data-theme="dark"]` 作用域）；
 *   ③ 不新造颜色，全部落在官方令牌（primary-8 / neutral-7）；
 *   ④ 底不可测（`url()` 位图等）⇒ 标 UNMEASURABLE、不许猜，本轮实测 = 0。
 *
 * 为什么品牌字取 primary-8 而不是 primary-7：
 *   暗色色阶是**反转**的（档位越高越亮）—— primary-6 = rgb(60,126,255)、
 *   primary-7 = rgb(104,159,255)、primary-8 = rgb(147,190,255)。
 *   最差底 `rgb(54,67,94)`（顶栏上 `--color-primary-light-1` 的合成底）实测：
 *     primary-6 → 2.65（现状，不达标） · primary-7 → 3.77（仍不达标）
 *     primary-8 → 5.21（达标）
 *   故暗色下品牌字统一取 primary-8，全族不留 borderline。
 *
 * 本节不含「白字压品牌实心填充」（#FFFFFF on rgb(60,126,255) = 3.74）那一族：
 *   其前景已是最亮的 --color-white，按口径①（背景不动）无法再靠改前景收口，
 *   属授权边界外，单独登记在 23 号报告，不在本节改。
 * ============================================================ */

/* ------------------------------------------------------------
 * 2.24.1 选中态胶囊 / 分段控件：品牌浅底 + 品牌字（primary-6 → primary-8）
 *   与 §2.4「官方胶囊选中态」同选择器族，只把暗色下的字色抬一档；
 *   背景（--color-primary-light-1）与边框（transparent）保持原样。
 *   实测：`.lang-opt.active` 在 index/admin 顶栏 2.65 → 5.21；
 *         `.seg-btn.active`（basics 面板速度档位「极速/~8s」）2.65 → 5.21。
 *   同族在页面底上的合成底（约 rgb(30,44,72)）原本也只有 3.72，一并归位。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .seg-btn.active,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .seg-btn.selected,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lang-opt.active,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lang-opt.selected,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-tab.active,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .mv-mode-btn.active,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tab-btn.active,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .part-chip.active,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .part-chip.selected,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-chip.active,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .filter-chip.active {
  color: var(--color-primary-8) !important;
}

/* ------------------------------------------------------------
 * 2.24.2 品牌蓝前景字：压在**非页面底**的容器上（primary-6 → primary-8）
 *   这些元素的字色在暗色下都落在 `--brand-text` / `--ds-accent`（= primary-6
 *   = rgb(60,126,255)），而它们的生效底比页面底亮得多（实测 33 种底里最亮的
 *   是 rgb(54,67,94)，最暗 rgb(35,35,36)），于是 2.65~4.20 全线不达标。
 *   逐族实测（旧值 → primary-8 后的最差底比值）：
 *     .lang-opt.active / .seg-btn.active   2.65 → 5.21
 *     .provider-models code                3.09 → 6.07
 *     .artbus-credit-pill > span           3.22 → 6.33
 *     .arch-arrow                          3.25 → 6.39
 *     .skill-meta .meta-chip b             3.28 → 6.45
 *     .skill-tag / .skill-tag.default      3.28 → 6.44
 *     .provider-id                         3.09 → 6.07
 *     .temp-value                          3.28 → 6.45
 *     .provider-tab.active                 3.28 → 6.45
 *     .step-dot.active .label              3.28 → 6.44
 *     #topProjectName.lib-cur              3.28 → 6.44
 *     .act-kw-count                        3.28 → 6.45
 *     .role-card-level                     3.84 → 7.54
 *     .skill-card-foot .icon-btn（编辑）    3.94 → 7.76
 *     .evo-title                           4.04 → 7.95
 *     .agent-title                         4.20 → 8.26
 *     .evo-flow b / .obsEvoChip b          4.20 → 8.26
 *     .sn-empty b                          4.20 → 8.26
 *     .admin-card-link                     4.20 → 8.26
 *     .evo-more > summary                  4.20 → 8.26
 *     .cat-filter.active                   4.20 → 8.26
 *     .pm-sub-tab.active                   4.20 → 8.26
 *     .demo-card-cat                       3.28 → 7.76
 *     .skill-count-badge                   3.28 → 6.44
 *   `.skill-card-foot .icon-btn` 用 `:not(.danger)` 排除同族红色删除键
 *   （#F53F3F 是语义色，不是本节的品牌字，一律不动）；
 *   `.pm-sub-tab.active` / `.cat-filter.active` 用 `:not(:hover)` 保留既有
 *   「悬停转 --t1」的反馈，避免把交互态抹平。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .demo-card-cat,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .provider-models code,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .provider-id,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .agent-title,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .role-card-level,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arch-arrow,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .provider-tab.active,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-title,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-flow b,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-more > summary,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .temp-value,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .skill-count-badge,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-card-link,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sn-empty b,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .step-dot.active .label,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) #topProjectName.lib-cur,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .artbus-credit-pill > span,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .act-kw-count,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .skill-meta .meta-chip b,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .skill-tag,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .skill-tag.default,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .skill-card-foot .icon-btn:not(.danger),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .skill-card-foot .icon-btn:not(.danger) span {
  color: var(--color-primary-8) !important;
}
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .cat-filter.active:not(:hover),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pm-sub-tab.active:not(:hover) {
  color: var(--color-primary-8) !important;
}

/* ------------------------------------------------------------
 * 2.24.3 中性灰前景压在卡片底（neutral-6 → neutral-7）
 *   §2.23.1 把空态文字从官方暗色 gray-5（rgb(120,120,122) on 页面底 = 4.06）
 *   抬到 gray-6 = rgb(146,146,147)，那只算了**页面底**；当空态落在卡片底
 *   （`--color-bg-2` + `--color-fill-2` 合成 = rgb(53,53,54)）上时只有 3.94。
 *   暗色再上一档到 gray-7 = rgb(171,171,172)：卡底 5.34 / 页面底 7.80，两处都达标。
 *   浅色侧 §2.10 的官方 gray-5 原样保留，不受本节影响。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .empty-state,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-empty,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .empty-state svg,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-empty svg {
  color: var(--color-neutral-7) !important;
}

/* ------------------------------------------------------------
 * 2.24.4 observability 面板的次级说明字（--ds-sub）
 *   `js/agent-panels.css:1351` 在暗色下把 `--ds-sub` 定成手写死色 #8b97a8
 *   = rgb(139,151,168)，压同一卡片底只有 4.14（`.obs-projects .l` /
 *   `.obs-group .g-stat .l` 等 30 处）。该变量在全仓**只作 color 用**
 *   （无一处作 background / border），属纯前景字色 ⇒ 归位到官方
 *   --color-neutral-7（卡底 5.34）。浅色侧的 #868b98 不动。
 *   特异性说明：来源是 `[data-theme="dark"] #adminBody`（1,1,0），本节用
 *   `html[data-theme="dark"] #adminBody`（1,1,1）并显式 !important ⇒ 稳定胜出；
 *   且 arco-vi.css 在 admin.html 中的 link 位置（第 1397 行）晚于
 *   js/agent-panels.css（第 46 行），层叠顺序亦占优。
 * ------------------------------------------------------------ */
html[data-theme="dark"] #adminBody {
  --ds-sub: var(--color-neutral-7) !important;
}

/* ============================================================
 * 2.25 (b) 白字压品牌实心填充：暗色下把**填充**定向降到 primary-4
 * ------------------------------------------------------------------
 * 🟡 本项为 **Aaron 2026-09-14 正式批准的越界改动**。
 *    §2.23 的口径第 ② 条明令「作背景、边框、:active 按压态用的颜色一律保持原样」；
 *    本节**显式越界改背景**，且**仅限**「承载白字的品牌实心填充」这一角色、
 *    **仅在暗色**生效。除这一节外，全层仍守「只改前景」。
 *
 * 为什么这 80 处只能改填充：
 *   它们的前景已经是 `--color-white`（最亮档），按原口径（背景不动）
 *    在 CSS 上**无解** —— 白字 on primary-6 = 3.74 < 4.5。
 *    官方暗色色阶里最近的一档是 primary-4（= rgb(29,77,210)）：
 *      白字 on primary-6 = 3.74（现状，不达标）
 *      白字 on primary-5 = 4.37（用 --color-primary-5 仍差 0.13）
 *      白字 on primary-4 = 6.90 ✓
 *    故全族统一降到 primary-4，不留 borderline。
 *
 * 🔴 硬约束（逐条对应 lead 指令）：
 *   ① **不全局重定义 `--color-primary-6`**：它在本仓还兼作**边框、焦点环、
 *      前景字**（`--brand-text` / `--ds-accent` / `--ds-sub` 之外的 `--p` / `--info`
 *      等，见本节上方 §2.2 令牌别名），全局下沉会把已达标的前景字一起拖黑。
 *      `--brand` 同理：它既作填充（`.chain-idx` / `.num` / `.sb-step-num` /
 *      `.cm-badge` / `.io-tab.active` / `.td-new`）又作**前景/描边**
 *      （`.chain-btn:hover{color:var(--brand)}` 等）⇒ **按族定向改填充**，
 *      绝不动令牌本身。
 *   ② 浅色主题一律不动：本节全部以 `html[data-theme="dark"]` 作用域开头。
 *   ③ 不新造颜色：只用官方 `--color-primary-4` / `--color-primary-3`。
 *   ④ 禁用态不误伤：按钮族显式排除 `:disabled` / `.disabled` / `.arco-btn-disabled`
 *      （§2.3 的禁用态给的是灰底 + 灰字，若被本节 2-ID 提升压掉会变成
 *       「亮蓝底 + 灰字」的更严重缺陷）。
 *   ⑤ 交互态不被抹平：按钮族加 `:not(:hover):not(:active)`，让既有
 *      hover（`--color-primary-5`）/ `:active`（`--color-primary-7`）档位原样生效。
 *      不加这个排除，本节的 2-ID 提升（(2,4,2)）会同时压过 §2.3 的
 *      `.btn.primary:hover`（(2,2,3)）与 `:active`，把悬停/按压反馈一起压平。
 *      `.td-new` 同理（styles.css:19819 的 `.top-dropdown .td-new:hover`
 *      会换成 `--brand-soft`），故只排除 `:hover`。
 *   已先读并**刻意保留**的两个 §2.23 排除判例：
 *      `.admin-body .seg-btn.active`（品牌浅底 + 品牌字，不是品牌实心填充）、
 *      `.provider-tab.active`（中性底 + 品牌字，不是品牌实心填充）——
 *      两者**不在本节选择器内**，原样不受影响。
 *
 * ⚠️ 反向检查（必验第 ② 条）的**实测结论**（见 23 号报告 §7）：
 *      填充 vs 暗色页面底 `#17171a`：primary-6 = 4.79  →  primary-4 = 2.59
 *      填充 vs 卡片底     `#232324`：primary-6 = 4.20  →  primary-4 = 2.28
 *   即 WCAG 1.4.11（非文本对比 3:1）由"过线"变为"不过线"。观感上仍是高饱和蓝、
 *   **不融底**（明暗两态改前/改后截图已读），但**数值上确实越过了 1.4.11 参考线**。
 *   本节**未擅自补边框**（那会是第二处越界，`§2.3` 已写 `border-color: transparent`）；
 *   如实上报，等 lead / Aaron 裁定是否接受或另行授权补描边。
 * ============================================================ */

/* ------------------------------------------------------------
 * 2.25.1 品牌实心主按钮族（对应 §2.3 的 11 个族）
 *   实测白字 on primary-4 = 6.90。禁用态已排除；hover/active 档位原样保留。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.primary:not(:hover):not(:active):not(:disabled):not(.disabled):not(.arco-btn-disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn.primary:not(:hover):not(:active):not(:disabled):not(.disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-btn.primary:not(:hover):not(:active):not(:disabled):not(.disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .lib-btn.primary:not(:hover):not(:active):not(:disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .as-btn-primary:not(:hover):not(:active):not(:disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .evo-btn.primary:not(:hover):not(:active):not(:disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.btn-primary:not(:hover):not(:active):not(:disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn-primary:not(:hover):not(:active):not(:disabled):not(.arco-btn-disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .auth-btn.primary:not(:hover):not(:active):not(:disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sb-one-click-btn:not(:hover):not(:active):not(:disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .adv-apply-btn:not(:hover):not(:active):not(:disabled) {
  background: var(--color-primary-4) !important;
}

/* ------------------------------------------------------------
 * 2.25.2 品牌实心圆形/胶囊徽标（`background: var(--brand)` 家族）+ 选中胶囊
 *   这一族与 2.25.1 **同源**：都是「品牌实心填充 + #fff 字」，只是填充来自
 *   `--brand`（不是 `--color-primary-6`），且多为一次性渲染的小徽标、
 *   没有 hover/active 档位，故不加 `:not()`（`.td-new` 除外，见上）。
 *   来源逐一实测（探针 cf-fill-owner3 的层叠胜出者）：
 *     .chain-idx            ← admin.html:3637 运行时注入 <style id="modelStepsCss">
 *     .skip-link            ← index.html:867 元素 inline style（!important 可覆盖 inline）
 *     .step-dot.active .num ← styles.css:.step-dot.active .num
 *     .cf-step.cf-active    ← index.html 运行时注入 <style>（带 !important）
 *     .sb-step-num / .cm-badge ← styles.css
 *     .io-tab.active        ← js/agent-panels.css:633
 *     .top-dropdown .td-new ← styles.css:19806
 *     .pc-btn-add / .picker-card-score-tag / .td-asset-statusbar .st-btn.st-active
 *                           ← §2.23.3 已置白字的同批品牌实心填充块
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .chain-idx,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .skip-link,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .step-dot.active .num,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .cf-step.cf-active,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .sb-step-num,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .cm-badge,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .io-tab.active:not(:hover):not(:active),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .top-dropdown .td-new:not(:hover):not(:active),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .pc-btn-add,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .picker-card-score-tag,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .td-asset-statusbar .st-btn.st-active {
  background: var(--color-primary-4) !important;
}

/* ------------------------------------------------------------
 * 2.25.3 渐变填充的实心头像（`.artbus-avatar`）
 *   它的底不是纯色而是 `--grad-brand`（暗色 = primary-5 → primary-6，
 *   实测 computed = `linear-gradient(135deg, rgb(48,110,255) 0%, rgb(60,126,255) 100%)`），
 *   按新口径「渐变按停点取最差」⇒ 白字最差停点 3.74。
 *   官方色阶里两档都让白字达标的最近组合：
 *     primary-3 = rgb(14,50,166) → 白字 10.37
 *     primary-4 = rgb(29,77,210) → 白字  6.90
 *   保持原渐变的**明暗方向**（起点略深、终点略浅），只整体下沉两档。
 *   只改 background-image，不动 box-shadow / 圆角 / 字号。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .artbus-avatar {
  background-image: linear-gradient(135deg, var(--color-primary-3) 0%, var(--color-primary-4) 100%) !important;
}

/* ------------------------------------------------------------
 * 2.25.4 同源补漏：品牌浅底 + 品牌字（与 §2.24.2 完全同源，只改前景、不越界）
 *   这两族与 §2.24.2 是同一个根因（`color: var(--brand-text)` = primary-6
 *   压在品牌浅底 tint 上），上一轮漏在 §2.24.2 选择器之外，本轮一并补上。
 *   `.users-avatar.creator` 的底是 `rgba(22,93,255,.10)` 压在卡片底上
 *   （实测合成 rgb(34,41,58)）；`.users-user-self` 是 `.12`（合成 rgb(33,42,62)）。
 *   暗色再上一档到官方 gray 之外的品牌档 primary-8 = rgb(147,190,255)：
 *     3.89 → 7.64 / 3.84 → 7.62，两处都达标。浅色侧原样不动。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-avatar.creator,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-user-self {
  color: var(--color-primary-8) !important;
}

/* ------------------------------------------------------------
 * 2.25.5 🔴 语义色令牌族（**与上面几族性质不同，请分开读**）
 *   ⚠️ 本小节改的是**语义色令牌**，不是"普通前景色"：
 *     · `.users-avatar.admin` 的前景写死 `#F53F3F`（= **浅色** red-6 的十六进制），
 *       压在 `rgba(245,63,63,.10)` 的浅红 tint 上（实测合成 rgb(56,38,39)）= 3.84。
 *       归位到**官方危险语义档** `--color-danger-6` —— 它在暗色下解析为
 *       rgb(247,105,101)（仍是红，仍是同一语义档位），比值 4.86 ✓；
 *       浅色下 `--color-danger-6` 解析回 rgb(245,63,63)，与写死值**逐字节相同**，
 *       但本节仍按"浅色不动"原则只作用于暗色作用域。
 *     · `.status-tag.active` 是 `--badge-success-fg`（= `--color-success-6`
 *       = 暗色 rgb(39,195,70)）压 `--badge-success-bg`（= `--color-success-1`
 *       = 暗色 rgb(0,77,28)）= 4.32。归位到**官方成功语义档**更高一档
 *       `--color-success-7`（= 暗色 rgb(80,210,102)）= 5.17 ✓。
 *   两族都**只改前景 `color`**（守原口径①），不碰背景/边框，也不重定义
 *   `--color-danger-6` / `--color-success-6` / `--badge-*-fg` 令牌本身
 *   （它们还被 `.task-card-status` / `.demo-card-status` / `.role-tag` / `.evo-chip`
 *     等兄弟组件共用；本轮**只按 lead 点名的这两族**定向归位）。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-avatar.admin {
  color: var(--color-danger-6) !important;
}
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-table .status-tag.active {
  color: var(--color-success-7) !important;
}

/* ============================================================
 * 2.26 dashboard 两族收编（第 3 批）—— Aaron 2026-09-14 批准解冻后追加
 *
 * 背景：第 2 批（§2.25）收口后，全量重算仍剩 **16 条反转**，逐条都在
 *   `panel:dashboard` 的 `div.admin-card` 里，且都**不在报告 20 的 474 清单内**。
 *   第 2 批按"授权边界"只登记未改；lead 转达 Aaron 裁定「一并修」，故本批收编。
 *
 * 2.26.1 `.activity-action code`（12 条）—— 品牌蓝前景
 *   · 实测：`rgb(60,126,255)`（暗色 `--brand-text`）压 `rgb(53,53,54)` = **3.28** ✗
 *   · 胜出规则（探针 cf-owner16.mjs 给出层叠胜出者）：
 *       styles.css:18935  `.activity-action code { color: var(--brand-text, #165DFF) }`
 *   · 🔴 **为什么按族定向、不重定义 `--brand-text`**：该变量在全仓被 60+ 处引用，
 *     且**兼作 `border-color` / `border-top-color` / `border-left-color` /
 *     `accent-color`**（styles.css:613/662/691/1697/2202/3880/4286/4729 …）。
 *     全局改它 = 把边框/强调色一起拖下水 ⇒ 与 §2.25 对 `--color-primary-6` 的处置同理。
 *   · 归位到**官方品牌前景档** `--color-primary-8`（= 暗色 rgb(147,190,255)）
 *     ⇒ 对 `rgb(53,53,54)` = **6.45** ✓（与 §2.24.2 所有品牌蓝前景**同一档位**）。
 *
 * 2.26.2 `.health-label.is-ok`（4 条）—— 语义成功色前景
 *   · 实测：`rgb(77,158,128)`（`#4d9e80` 写死值）压 `rgb(53,53,54)` = **3.80** ✗
 *   · 胜出规则：styles.css:17935 `.health-label.is-ok { color: #4d9e80 }`
 *     （🔴 是**写死的十六进制**，不是令牌 ⇒ 与 §2.25.5 那两个"语义色令牌族"不同，
 *       这一族是"本该用语义令牌却写死了颜色"）
 *   · 归位到**官方成功语义档** `--color-success-6`（= 暗色 rgb(39,195,70)）
 *     ⇒ 对 `rgb(53,53,54)` = **5.24** ✓。
 *     为什么取 6 而不是 §2.25.5 用过的 7：这里选**官方为"成功前景"定义的那一档**
 *     —— `--badge-success-fg` 在令牌层就 `= var(--color-success-6)`
 *     （arco-vi.css §令牌区），即"语义上就应该是它"；且 5.24 距 4.5 有 16% 余量，
 *     不属于 borderline（§2.24 判 borderline 的 k 是"余量 < 5%"）。
 *     （`--color-success-7` = 6.27 也达标；本批不选它，是为了"用官方给该语义的档"。）
 *
 * 2.26.3 同族兄弟状态的**实测**（`cf-healthstates.mjs`：运行时强制切换 className，
 *   与 `dark-composite.mjs` 同口径合成底 ⇒ 生效底 = `rgb(53,53,54)`）
 *   ┌──────────────────────────┬──────────────────────────┬───────┬────┐
 *   │ 状态                     │ 前景                      │ 比值  │ 判定│
 *   ├──────────────────────────┼──────────────────────────┼───────┼────┤
 *   │ `.is-ok`（**本批已修**） │ `--color-success-6`      │ 5.27  │ ✓  │
 *   │ `.is-warn`               │ `#FF7D00`（写死）        │ 4.80  │ ✓  │
 *   │ `.is-down`               │ `#F53F3F`（写死）        │ 3.33  │ ✗  │
 *   │ `.is-pending`            │ `var(--t3)`=rgba(255,255,255,.5) │ 4.37 │ ✗ │
 *   └──────────────────────────┴──────────────────────────┴───────┴────┘
 *   ⇒ **`.is-down` 与 `.is-pending` 也是同类缺陷，但本批采样时都没被渲染**
 *     （健康检查全为 `is-ok`），所以它们不在 Aaron 批的那 16 条里。
 *     **本批如实记录、未擅自扩大范围**；修法同形（`is-down` 归位
 *     `--color-danger-*` 官方档；`is-pending` 需要换掉 `--t3` 或改用更亮的
 *     中性档，因为 `--t3` 是全局「弱化文本」令牌，**不能全局改它** →
 *     须按族定向）。**等一句话。**
 *   （`.is-warn` 4.80 达标，不用改。）
 *
 * 约束遵守：只改**前景 `color`**（0 条 background/border/box-shadow 声明）；
 *   全部走官方语义档、不新造颜色；28 个选择器片段全部以
 *   `html[data-theme="dark"]` 起头 ⇒ 浅色一律不动；不重定义任何令牌本身
 *   （`--brand-text` / `--t3` / `--color-*` 定义均未动）。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .activity-action code {
  color: var(--color-primary-8) !important;
}
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .health-label.is-ok {
  color: var(--color-success-6) !important;
}

/* ============================================================
 * 2.27 `.health-label` 另两个同族状态收编（第 4 批）
 *      —— Aaron 2026-09-14 裁定「一并修」
 *
 * 背景：第 3 批（§2.26）修 `.is-ok` 时，我用 `cf-healthstates.mjs` 顺手实测了同族四个状态，
 *   发现 `.is-down` / `.is-pending` 也是同类缺陷，但**不在 Aaron 批的 16 条内**
 *   （采样时健康检查全为 `is-ok`，这两个状态**根本没被渲染**）⇒ 当时只登记未改。
 *   Aaron 裁定「一并修」，本批按族定向收编。**两个族都是 `color` 前景色，原口径①范围内，不越界。**
 *
 * 胜出规则定位（只读探针 `cf-owner27.mjs`，层叠排序口径与 `cf-owner16.mjs` 逐字相同；
 *   因为这两个状态运行时不被渲染，探针**先强制切 className 再解析层叠**）：
 *   · `.is-down`    ← styles.css:17948 `.health-label.is-down    { color: #F53F3F }`   spec=200 非 important
 *   · `.is-pending` ← styles.css:17951 `.health-label.is-pending { color: var(--t3) }` spec=200 非 important
 *   · 同批复核：`.is-ok` 的胜出者**确为 §2.26 那条**（spec=20502, !important）⇒ 上一批确实压住了；
 *              `.is-warn` 的胜出者**仍是 styles.css 的 `#FF7D00`**（实测 4.78 ✓ 达标）⇒ **本批不动它**。
 *   · ⚠️ 该探针的 `effBgGuess` 是「首个不透明祖先」的**粗估**（与 `cf-owner16.mjs` 同源缺陷，
 *     会在 `html` 处早停 ⇒ 报 rgb(23,23,26)）；**权威生效底以 `cf-healthstates.mjs` /
 *     `dark-composite.mjs` 的合成口径为准 = rgb(53,53,54)**，本节所有比值都用后者。
 *
 * 2.27.1 `.is-down`（3.33 → 5.39）—— 归位官方危险语义档
 *   · 现值 `#F53F3F` = rgb(245,63,63) 是 **Arco 浅色主题的 `--red-6`**（arco-vi.css 浅色令牌块
 *     `--red-6: 245, 63, 63`），被**写死**在暗色页面上 ⇒ 对生效底 rgb(53,53,54) 只有 3.33 ✗。
 *     ⟵ 与 §2.26.2 的 `#4d9e80` **同一类成因**：本该用令牌，却写死了（而且是**浅色档**的）值。
 *   · 官方**暗色**危险阶梯（对**取整底** rgb(53,53,54) 的闭式计算）：
 *       danger-5 = rgb(245, 78,78)   3.55 ✗
 *       danger-6 = rgb(247,105,101)  4.18 ✗  ⟵ 「语义前景档」`--badge-danger-fg` = danger-6 **不达标**
 *       danger-7 = rgb(249,141,134)  **5.36 ✓**  ⟵ **本批采用**
 *       danger-8 = rgb(251,176,167)  6.93 ✓
 *     ⚠️ 上表是**取整底** rgb(53,53,54) 的闭式值。`cf-healthstates.mjs` 探针保留**未取整**的
 *        合成底浮点值（`0.08×255 + 0.92×35 = 52.6`），同一公式给出 danger-7 = **5.39**。
 *        两个数都对，差 0.03 只来自「底是否取整」（§2.26 已有同款说明）⇒ 结论不受影响。
 *   · 🔴 **为什么取 7（而不是 6、也不是 8）**：
 *     (a) 若照搬 §2.26.2「用官方给该语义的前景档」的思路，红族的对应档是 danger-6
 *         （令牌层 `--badge-danger-fg` = `--color-danger-6`）—— **但实测只有 4.18，不达标**。
 *         同一底 rgb(53,53,54) 上，**绿-6 达标（5.24）而红-6 不达标（4.18）**，
 *         这是官方两级台阶本身的亮度差（绿-6 的 G=195 亮度贡献大、红-6 的 R 主导）⇒
 *         「照搬语义档」在这里**不成立**，必须**按实测上移一档**。
 *     (b) 不取 danger-8：6.93 的余量（+54%）会把「故障红」明显推向粉白，
 *         与 `.is-warn` 的橙（4.78）在**观感上更接近**，反而**削弱状态区分度**（这是可读性之外的代价）。
 *     (c) danger-7 余量 +19%，既远离 4.5 边界（§2.24 把「余量 <5%」判为 borderline），
 *         又保持**明确的红相**。⇒ 判据统一为「**同语义阶梯上，取实测能达标的最低官方档**」。
 *
 * 2.27.2 `.is-pending`（4.37 → 6.94）—— 🔴 **按族定向换掉 `--t3`，不重定义全局 `--t3`**
 *   · 现值 `var(--t3)` ⇒ 暗色解析为 `--color-text-3` = `rgba(255,255,255,.5)` ⇒ **4.37** ✗。
 *     （4.37 是 `cf-healthstates.mjs` 的探针读数；取整底闭式值为 4.35。）
 *   · 🔴 **为什么绝不能直接改 `--t3`**：`--t3` 是**全站「弱化文本」令牌**
 *     （arco-vi.css:756 `--t3: var(--color-text-3)`；同源的还有
 *      `--t-muted` / `--color-text-muted` / `--color-text-3` 自身），全仓引用极广 ⇒
 *     重定义它会把**所有**次级/弱化文本一起改掉（范围远超「一个健康检查徽标」），且**未获授权**。
 *     ⇒ 只按族定向覆盖 `.health-label.is-pending`。
 *   · 归位到 **`--color-text-2`**（暗色 = `rgba(255,255,255,.7)` → 生效约 rgb(194,194,195) = **≈6.9 ✓**）：
 *     现值 `--t3` 本身就是 `--color-text-3` ⇒ 这是**同一「中性文本」阶梯上移一档**
 *     （text-3 → text-2），**语义不变**（仍是「中性弱化文本」）。🔴 **没有**把它染成
 *     warning 橙 / danger 红 —— 那会**谎报状态**（`is-pending` 不是「有问题」）。
 *   · 备选 `--color-neutral-7`（5.34）也达标，但那是**灰阶调色板**令牌而非**文本语义**令牌；
 *     本族改的是**文本颜色** ⇒ 用**文本阶梯**更正。
 *
 * 同族兄弟**未连坐**（本批逐条比对，见报告 §4.13-③）：
 *   `.is-ok`（§2.26 已修）/ `.is-warn`（4.78 达标，未动）/ 本批 2 条 —— **四条互不干扰**。
 *
 * ⚠️ 顺带登记、**未改**（不在 Aaron 批的范围内）：基底 `.health-label { color: var(--t3) }`
 *   （styles.css:17938-17941）单独成立时也 <4.5（4.35），但**本轮所有采样里每个实例都带状态类**
 *   ⇒ 该基底规则实测**从未被渲染**，标 `NO-SAMPLE`，**不擅自扩大范围**。
 *
 * 约束遵守：只改**前景 `color`**（0 条 background / background-image / border / box-shadow）；
 *   全部走官方语义档、不新造颜色；2 个选择器片段全部以 `html[data-theme="dark"]` 起头
 *   ⇒ 浅色一律不动；**未改动任何令牌的定义**（`--t3` / `--color-text-*` / `--color-danger-*`
 *     的**定义行**一行未改）。
 *   ⚠️ 精确化：本文件第 127 行本就有 `--t3: var(--color-text-3);`，那是组件层**同值别名块**
 *     里的一条**既有**声明（HEAD 即存在，**非本批引入**），其值与令牌层定义**逐字相同**
 *     ⇒ 在层叠上是 no-op，**不构成「重定义」**。本批的唯一改动是新增 §2.27 这 2 个规则块。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .health-label.is-down {
  color: var(--color-danger-7) !important;
}
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .health-label.is-pending {
  color: var(--color-text-2) !important;
}

/* ============================================================
 * 2.28 第 5 批：**穷举式收口**（Aaron 2026-09-14 两条裁定 + lead 三条直接定）
 *
 * 背景：前四批都是「按家族逐个撞见」⇒ 每批都又发现「同源的下一条」。
 *   本批先做了**两条互相独立的穷举**（判据与完整表见 `23-CONTRAST-FIX-474.md` §12）：
 *     路径①「块形态穷举」`cf-blockhunt.mjs` → `styles.css` 22621 行里 1623 条含
 *       `color` 的规则 / 1857 个选择器项 → **60 个块**（110 基类 + 201 变体）；
 *       逐块实测 `cf-blockmeasure.mjs`（3 页 + 22 面板 + 强制切类）→ 176 行表：
 *       **✗ 22 / ✓ 72 / NO-SAMPLE 82 / 不可测 0**，可达 9 / 不可达 13。
 *     路径②「值域穷举」（补路径① 的盲区「一条规则、多个**平级**基类」）：
 *       `cf-fgalpha2.mjs` 修正主判据 `lum()` 只取前 3 个数的缺陷后，扫全站
 *       **240 个带 alpha 前景的可见文本元素** → 真实不达标 **20 类 / 78 处**。
 *   两路合并 `cf-union.mjs` → **42 项**。本批按裁定收掉其中的 18 条。
 *
 * 本节的四条硬约束（与前四批一致）：
 *   ① 只改**前景 `color`**；唯一例外是 2.28.4（填充底），**且已获 Aaron 单独批准**；
 *   ② 浅色主题一律不动（所有片段以 `html[data-theme="dark"]` 起头）；
 *   ③ 只用官方语义档，不新造颜色；
 *   ④ **不重定义任何全局令牌**（`--t3` / `--t2` / `--color-text-*` / `--color-danger-6`
 *      的定义行一行未改）—— 组 ⑤ 全部**按族定向**。
 *
 * 组 ③ 与 §2.23 那个「不改」判例的关系（lead 要求写清）：
 *   §2.23 刻意排除 `.admin-body .seg-btn.active`，理由是它**已经是**
 *   「品牌浅底 + `--color-primary-6` 字」并且**已被 §2.4 归位过**——那条判例讲的是
 *   「不要再把它置白」。本批这 8 条是**另一个版本**：它们的生效字色是
 *   `--brand-text` / `--arco-color-primary` 解析出的 **primary-6（rgb(60,126,255)）**，
 *   压在 `rgba(60,126,255,.2)` 之类的品牌 tint 上只有 **3.28 / 3.84**。
 *   **「已是 primary-8 的版本」与「还是 primary-6 的版本」不是同一件事** ⇒ 本批上移。
 * ============================================================ */

/* ------------------------------------------------------------
 * 2.28.1 组 ③：品牌蓝前景压品牌浅底（primary-6 → primary-8）—— 8 行 / 5 个片段
 *   胜出规则（`cf-owner5.mjs` 强制切类后解析层叠，22/22 全部定位到）：
 *     `.step-dot.active`     ← styles.css `body .step-dot.active { color: var(--arco-color-primary,#165DFF) !important }` spec=201
 *     `.users-stat-icon.*`   ← **inline `<style>`** `.users-stat-icon,.quick-icon,.tenant-detail-icon
 *                              { color: var(--brand-text) !important }` spec=300
 *     `.users-avatar.viewer` / `.health-label` 等见各自小节
 *   逐族实测（现值 → primary-8 后的生效底比值）：
 *     .step-dot.active            3.28 → 6.44
 *     .quota-pill（base）          3.28 → 6.44
 *     .quota-pill.quota-warn       3.28 → 6.44   （⚠️ 其 `#F53F3F` 声明是**死**的，实测生效色就是 primary-6）
 *     .users-stat-icon（base）     3.28 → 6.44
 *     .users-stat-icon.ok          3.28 → 6.44   （同上，`#00B42A` 被 inline `<style>` 压掉）
 *     .users-stat-icon.warn        3.28 → 6.44   （同上，`#FF7D00` 被 inline `<style>` 压掉）
 *     .tuner-wb-tab.active         3.28 → 6.44
 *     .demo-filter-tag.is-on       3.84 → 7.54
 *   为什么取 primary-8 而不是 primary-7（同 §2.24.1 判据）：
 *     本族最亮的底实测是 `rgb(54,67,94)`（顶栏 `--color-primary-light-1` 合成底），
 *     那里 primary-7 只有 **3.77（仍不达标）** ⇒ 全族统一 primary-8，不留 borderline。
 *   🔴 `.users-stat-icon` 必须写 `:not(.muted)`：
 *     `.users-stat-icon.muted` 的 `--t3` 来自一条 **inline `<style>`** 的通用工具类
 *     `.users-stat-icon.muted, .muted { color: var(--t3) !important }`（spec 300），
 *     本层的 2-ID 提升（spec ≈20203）会**压过它** ⇒ 不加 `:not(.muted)` 会把
 *     「弱化」变体误染成品牌蓝（连坐）。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .step-dot.active,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .quota-pill,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-stat-icon:not(.muted),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tuner-wb-tab.active,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .demo-filter-tag.is-on {
  color: var(--color-primary-8) !important;
}

/* ------------------------------------------------------------
 * 2.28.2 组 ⑤-1：`.health-label` **基底行**（Aaron 点名收掉）—— 4.36 → 6.88
 *   基底规则 = styles.css `.health-label { color: var(--t3) }`（spec 100，非 important）
 *   ⇒ 暗色解析为 `--color-text-3` = `rgba(255,255,255,.5)` ⇒ 压生效底
 *   `rgb(53,53,54)` 只有 **4.36 ✗**（取整底闭式值 4.35）。
 *   🔴 **按族定向**：`--t3` 是全站「弱化文本」令牌，**绝不重定义**（第 4 批的红线）。
 *   🔴 **必须显式排除 4 个状态类**：本族只有 is-ok / is-warn / is-down / is-pending
 *     四个状态（全仓 grep 核实）。若写成裸 `.health-label`，本层 2-ID 提升
 *     （spec 20202+）会**压过** `styles.css .health-label.is-warn { color:#FF7D00 }`
 *     （spec 200）⇒ **把「警告橙」连坐成灰**；`:not()` 让本规则对这些元素**根本不匹配**，
 *     从而与 §2.26 / §2.27 已修的 `is-ok` / `is-down` / `is-pending` 也互不干扰。
 *   归位 `--color-text-2`（同一「中性文本」阶梯上移一档 text-3 → text-2，语义不变）
 *   ⇒ 取整底 **6.88** / 探针未取整 ≈**6.94** ✓
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .health-label:not(.is-ok):not(.is-warn):not(.is-down):not(.is-pending) {
  color: var(--color-text-2) !important;
}

/* ------------------------------------------------------------
 * 2.28.3 组 ⑤-2：口径洞的 **3 条可达项**（Aaron 裁定「收 3 条可达」）—— 按族定向
 *   这三条的**现值都是 `rgba(255,255,255,.5)`**（= `--color-text-3`），是主判据
 *   `lum()` 只取前 3 个数的盲区（旧口径把它们读成 12.25「达标」）：
 *     `.hint`（base）        4.36 ✗（旧读 12.25）
 *     `.hint.sm`             4.36 ✗（旧读 12.25）
 *     `.users-stat-icon.muted` 4.34 ✗（旧读 12.24）
 *   胜出规则：
 *     `.hint` / `.hint.sm` ← styles.css
 *        `body .form-sub, body .form-hint, #adminBody .form-hint, body .hint, #adminBody .hint
 *         { color: var(--arco-text-3,#86909c) !important }` spec=20503
 *        ⚠️ 这是**一条规则、多个平级基类**的族 —— 也正是路径① 判据的盲区
 *        （见 §12.1）。本条只覆盖**实测 ✗ 的** `.hint`（含 `.hint.sm`，因为
 *        `.hint.sm` 元素同时也带 `.hint`）；同规则的 `.form-sub` / `.form-hint`
 *        **在本轮全部采样里都没有出现违规读数**（既不在 20 类 alpha 缺陷里，
 *        也不在 60 块表里）⇒ **按实测不动**，不做无读数的"顺手一起改"。
 *     `.users-stat-icon.muted` ← inline `<style>`
 *        `.users-stat-icon.muted, .muted { color: var(--t3) !important }` spec=300
 *        ⚠️ 按族定向**只写 `.users-stat-icon.muted`**，不写通用的 `.muted`
 *        （后者是全站工具类，动它会波及未知面）。
 *   统一归位 `--color-text-2`（与 2.28.2 同判据：同一「中性文本」阶梯上移一档）。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .hint,
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-stat-icon.muted {
  color: var(--color-text-2) !important;
}

/* ------------------------------------------------------------
 * 2.28.4 组 ①：白字压 **danger 实心填充** —— 填充 `danger-6 → danger-4`
 *   🟡 本项为 **Aaron 2026-09-14 正式批准的越界改动**（同 §2.25 对品牌实心填充的处置）。
 *     原硬口径 ② 明令「作背景用的颜色一律保持原样」；本节**显式越界改填充**，
 *     **仅限**「承载白字的危险实心填充」这一角色、**仅暗色**生效。
 *
 *   为什么只能改填充：前景已经是 `--color-white`（最亮档），按口径①在 CSS 上无解
 *     —— 白字 on danger-6 `rgb(247,105,101)` = **2.93 < 4.5**。
 *     官方暗色危险阶梯反解（白字 ≥4.5 ⇔ 填充亮度 L ≤ 1.05/4.5 − 0.05 = 0.18333）：
 *       danger-3 rgb(161,22,31)    白字 7.92 ✓ ｜ **对暗色页底 1.4.11 = 2.26 ✗ 越线**
 *       danger-4 rgb(203,46,52)    白字 5.28 ✓ ｜ 对暗色页底 = **3.39 ✓**  ⟵ **本批采用**
 *       danger-5 rgb(245,78,78)    白字 3.45 ✗
 *       danger-6 rgb(247,105,101)  白字 2.93 ✗（现状）
 *     同第 2 批判据：**取"白字达标"与"填充对底仍可辨（1.4.11 ≥ 3.0）"能同时满足的最低档**
 *     ⇒ danger-4。danger-3 会让填充与暗色页底掉到 2.26，是**第二次越线**，不取。
 *
 *   胜出规则（`cf-danger-fill.mjs` 只读定位）：填充来自**本层 §2.3「危险按钮」块**
 *     `… .btn.danger, … .users-btn.danger, … .admin-btn.danger, … .arco-btn-danger,
 *        … .btn.btn-danger, … .fix-apply-btn { background: var(--color-danger-6) !important;
 *        border-color: transparent !important; color: var(--color-white) !important }`
 *     ⇒ 本节沿用**同一条规则的同一组 6 个选择器**（lead 点名的 4 个 +
 *       同规则里的 `.arco-btn-danger` / `.btn.btn-danger` / `.fix-apply-btn`：
 *       它们是**同一条声明**作用到的同一角色，只改 4 个会让另外 3 个停在 2.93，
 *       下批必然再撞一次）。`.btn.danger.sm` 由 `.btn.danger` 覆盖。
 *
 *   🔴 **不重定义 `--color-danger-6`**：它在本仓还兼作前景色
 *     （`.users-avatar.admin` 的 `--color-danger-6` 字、§2.3 的 outline 危险按钮字等），
 *     全局下沉会把已达标的前景色一起拖暗。
 *   🔴 **交互态不被抹平**：加 `:not(:hover):not(:active)`，让既有
 *     hover（`--color-danger-5`）/ `:active`（`--color-danger-7`）档位原样生效
 *     （不加会被本节的 2-ID 提升压平）。禁用态同样显式排除（`:disabled` / `.disabled`
 *     / `.arco-btn-disabled`），避免把 §2.3 的「灰底灰字」压成「红底」。
 *     ⚠️ 因此 hover / active 的读数**不在本节的改动范围**，其白字比值见报告 §13（3.45 / 2.29）。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.danger:not(:hover):not(:active):not(:disabled):not(.disabled):not(.arco-btn-disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-btn.danger:not(:hover):not(:active):not(:disabled):not(.disabled):not(.arco-btn-disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .admin-btn.danger:not(:hover):not(:active):not(:disabled):not(.disabled):not(.arco-btn-disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .arco-btn-danger:not(:hover):not(:active):not(:disabled):not(.disabled):not(.arco-btn-disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .btn.btn-danger:not(:hover):not(:active):not(:disabled):not(.disabled):not(.arco-btn-disabled),
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .fix-apply-btn:not(:hover):not(:active):not(:disabled):not(.disabled):not(.arco-btn-disabled) {
  background: var(--color-danger-4) !important;
}

/* ------------------------------------------------------------
 * 2.28.5 同源补漏：第 5 轮 §12 总表里的另 3 条**口径内**项（lead 的 5 组清单未逐条列出）
 *   ⚠️ 这 3 条**不在** lead 点名的 5 组里，但**都在我上一份回报的 §12 组表内**，
 *      且都是**纯前景改色、非越界、判据与前四批逐字相同**。若不收，本批就无法给出
 *      「已穷举、除以下 N 条外无遗漏」的终局清单（会立刻变成第 6 批）。
 *      ⇒ 一并收编，并在报告 §13 单列一节标明"5 组之外额外收编 3 条"，
 *        lead / Aaron 若要收窄，**删掉本小节这一个规则块即可完全回退**。
 *
 *   · `.status.err`（4.18 → 5.36）：胜出 `styles.css .status.err { color: var(--err) }`（spec 200）；
 *     `--err` 暗色 = danger-6 = `rgb(247,105,101)`，压生效底 `rgb(53,53,54)` 只有 4.18。
 *     归位 **`--color-danger-7`** —— 与 §2.27.1 的 `.health-label.is-down` **同一档、同一判据**
 *     （danger-6 = 4.18 不达标；danger-8 = 6.93 余量 +54% 会削弱与 `.is-warn` 橙的区分度）。
 *   · `.tag.success`（4.32 → 5.17）：胜出 `styles.css body .tag.success … { color: var(--arco-success,#00b42a)
 *     !important }`（spec 20602）；`--arco-success` 暗色 = green-6 = `rgb(39,195,70)`，
 *     压绿 tint 生效底 `rgb(0,77,28)` 只有 4.32。归位 **`--color-success-7`** ——
 *     与 §2.25.5 的 `.users-table .status-tag.active` **同一档**。
 *     ⚠️ 只写 `.tag.success`，**不**把 `.tag.ok` / `.pa-badge.ok` 一起带上：
 *        它们虽然与 `.tag.success` 共用 arco-vi.css 里那条 success-6 的规则，
 *        但**本轮两路穷举都没有它们的违规读数** ⇒ 按实测不动（不猜）。
 *   · `.users-avatar.viewer`（1.69 → ≈7.11）：胜出 `styles.css .users-avatar.viewer
 *     { color: rgb(71,85,105) }`（spec 200）—— 现值是**浅色主题的次级文本色** `#475569`
 *     被写死在暗色上，压 `rgba(148,163,184,.12)` 合成底 `rgb(49,50,54)` 只有 1.69
 *     （本批 22 条里**最严重**的一条，也是**可达**的，46 处）。
 *     归位 **`--color-text-2`**：现值是**文本色** ⇒ 走**文本阶梯**；同环境算过
 *     `--color-text-3` 在该底上只有 **4.47 ✗**，故上移一档到 text-2（与 §2.27.2 同判据）。
 *     ⚠️ 同族的 `.users-avatar`（**基底**，1.76）**不在本批**：它的底是自身品牌实心填充
 *     `rgb(48,110,255)`，白字也只有 4.37 ✗ ⇒ 必须**同时改填充 + 字色**（越界且会新增一处
 *     1.4.11 越线），且该族**运行时不可达** ⇒ 单列，等 lead / Aaron 裁定。
 * ------------------------------------------------------------ */
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .status.err {
  color: var(--color-danger-7) !important;
}
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .tag.success {
  color: var(--color-success-7) !important;
}
html[data-theme="dark"] body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .users-avatar.viewer {
  color: var(--color-text-2) !important;
}


/* ══════════════════════════════════════════════════════════════════════════════
   A23 R8 · 角标/状态胶囊圆角对齐用户基准（「来源/集数角标胶囊 12px/radius12」）
   ──────────────────────────────────────────────────────────────────────────────
   为什么改这里：夺冠规则在本文件 —— html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b)
   .tag, …, .opt-badge, …, .task-card-status, … { border-radius: var(--radius-small) !important; }
   （本文件 :1287 起；--radius-small = 2px，定义于 :517）。本文件在 <link> 顺序上**晚于 styles.css**，
   故前几轮把覆盖追加到 styles.css 末尾一律无效；而同文件内**更靠后 + 同特异性**即可胜出。
   诊断：docs/nextcoder/probes/r3-aesthetics/diag-cdp-matched.mjs（CDP getMatchedStylesForNode）。
   只覆盖这两个类，**不动 --radius-small 令牌**（它被 .tag/.chip/.badge/.lang-opt 等 20 处共用，改它会全站连带）。
   ══════════════════════════════════════════════════════════════════════════════ */
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .opt-badge { border-radius: 999px !important; }
html body:not(#arco-vi-boost-a):not(#arco-vi-boost-b) .task-card-status { border-radius: 12px !important; }
