/* ============================================================================
   tech_visual_v2.css 鈥?gugu8858.icu 璁惧绠＄悊鍚庡彴 路 椤剁骇绉戞妧鎰熻瑙?v2
   ----------------------------------------------------------------------------
   绾楗板眰銆傚彧浣跨敤锛歜order / box-shadow / background(鍚笎鍙? / backdrop-filter
   / text-shadow / filter / font-family / font-feature-settings / animation
   (浠?transform + opacity) / transition(浠呭彲瑙嗗睘鎬?銆?
   涓ユ牸绂佺敤甯冨眬灞炴€э紙缁濅笉瑙︾鍑犱綍/浣嶇疆/灏哄/鏂囧瓧鎺掔増锛夛細
   width / height / min-* / max-* / margin / padding / position / top/right/
   bottom/left / display / flex / grid / overflow / line-height / z-index /
   float / clear / vertical-align / gap / inset銆?
   浣滅敤鍩熷墠缂€锛歨tml body:has(.brand-lockup)锛堜粎瀛樺湪鍝佺墝閿佸畾鐨勫悗鍙伴〉闈㈢敓鏁堬級
   涓婚鍩鸿壊锛氭殫鑹?#0b0c0e + 闈涜摑绱?#6366f1 鈫?#8b5cf6
   ========================================================================== */

/* ============================================================================
   0) 璁捐浠ょ墝锛堜粎鏈枃浠跺唴閮ㄤ娇鐢級
   ========================================================================== */
html body:has(.brand-lockup) {
  --tv2-indigo: #6366f1;
  --tv2-violet: #8b5cf6;
  --tv2-indigo-rgb: 99, 102, 241;
  --tv2-violet-rgb: 139, 92, 246;
  --tv2-line: rgba(148, 163, 184, .13);
  --tv2-line-soft: rgba(148, 163, 184, .07);
  --tv2-line-bright: rgba(129, 140, 248, .38);
  --tv2-card-hi: inset 0 1px 0 rgba(255, 255, 255, .05);
  --tv2-card-hi-bright: inset 0 1px 0 rgba(255, 255, 255, .09);
  --tv2-depth: 0 10px 36px rgba(0, 0, 0, .38);
  --tv2-inner-glow: inset 0 0 28px rgba(99, 102, 241, .035);
  --tv2-ok: #22c55e;
  --tv2-err: #ef4444;
  --tv2-warn: #f59e0b;
  --tv2-cyan: #22d3ee;
  --tv2-glass-bg: rgba(16, 16, 20, .82);
  --tv2-glass-blur: blur(10px) saturate(150%);
  --tv2-mono: "SFMono-Regular", "JetBrains Mono", "Fira Code", "Cascadia Mono",
             "Roboto Mono", ui-monospace, "Menlo", "Consolas", monospace;
}

/* ============================================================================
   1) 澶┖鑸?/ 璧涘崥璐ㄦ劅 鈥?鍗＄墖澶氬眰娓愬彉 + 椤堕儴楂樺厜 + 娣卞闃村奖 + 寰鍐呭彂鍏?   ========================================================================== */
html body:has(.brand-lockup) .ant-card,
html body:has(.brand-lockup) .ctrl-card,
html body:has(.brand-lockup) .inj-panel,
html body:has(.brand-lockup) .dashboard-card,
html body:has(.brand-lockup) .stat-card,
html body:has(.brand-lockup) .panel,
html body:has(.brand-lockup) .ant-statistic,
html body:has(.brand-lockup) [class*="dashboard"] .ant-card,
html body:has(.brand-lockup) [class*="panel-"],
html body:has(.brand-lockup) [class*="-panel"] {
  background-image:
    linear-gradient(160deg, rgba(255, 255, 255, .028), transparent 52%),
    linear-gradient(200deg, rgba(99, 102, 241, .045), transparent 60%),
    linear-gradient(340deg, rgba(139, 92, 246, .035), transparent 55%);
  border: 1px solid var(--tv2-line);
  box-shadow:
    var(--tv2-card-hi),
    inset 0 -1px 0 rgba(0, 0, 0, .30),
    var(--tv2-inner-glow),
    var(--tv2-depth);
  transition: border-color .28s ease, box-shadow .28s ease;
}

html body:has(.brand-lockup) .ant-card:hover,
html body:has(.brand-lockup) .ctrl-card:hover,
html body:has(.brand-lockup) .inj-panel:hover,
html body:has(.brand-lockup) .dashboard-card:hover,
html body:has(.brand-lockup) .stat-card:hover,
html body:has(.brand-lockup) .panel:hover,
html body:has(.brand-lockup) [class*="panel-"]:hover,
html body:has(.brand-lockup) [class*="-panel"]:hover {
  border-color: var(--tv2-line-bright);
  box-shadow:
    var(--tv2-card-hi),
    inset 0 -1px 0 rgba(0, 0, 0, .30),
    inset 0 0 34px rgba(99, 102, 241, .06),
    0 10px 38px rgba(0, 0, 0, .42),
    0 0 26px rgba(99, 102, 241, .12);
}

html body:has(.brand-lockup) .ant-card .ant-card-head {
  border-bottom-color: var(--tv2-line-soft);
  background-image: linear-gradient(180deg, rgba(255, 255, 255, .02), transparent);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .04);
}

/* ============================================================================
   2) 渚ф爮 / 椤舵爮鐜荤拑鎷熸€侊紙backdrop-filter 浠呴檺杩欎袱澶勪笌寮瑰眰锛?   ========================================================================== */
html body:has(.brand-lockup) .ant-layout-sider,
html body:has(.brand-lockup) [class*="sider"],
html body:has(.brand-lockup) [class*="sidebar"],
html body:has(.brand-lockup) [class*="side-bar"],
html body:has(.brand-lockup) .ant-layout-header,
html body:has(.brand-lockup) [class*="topbar"],
html body:has(.brand-lockup) [class*="top-bar"],
html body:has(.brand-lockup) [class*="header-bar"] {
  background-color: var(--tv2-glass-bg);
  -webkit-backdrop-filter: var(--tv2-glass-blur);
  backdrop-filter: var(--tv2-glass-blur);
  border-color: var(--tv2-line);
  box-shadow: var(--tv2-card-hi), 0 2px 18px rgba(0, 0, 0, .28);
}

html body:has(.brand-lockup) .ant-layout-sider {
  border-right: 1px solid var(--tv2-line);
}

html body:has(.brand-lockup) .ant-layout-header,
html body:has(.brand-lockup) [class*="topbar"],
html body:has(.brand-lockup) [class*="top-bar"],
html body:has(.brand-lockup) [class*="header-bar"] {
  border-bottom: 1px solid var(--tv2-line);
}

/* ============================================================================
   3) 闇撹櫣鍏夋晥 鈥?涓绘寜閽?/ 閫変腑鑿滃崟 / 鐘舵€佺偣
   ========================================================================== */

/* 鍛煎惛鍏夋檿锛堜粎 box-shadow + transform:scale锛孏PU 鍙嬪ソ锛沚ox-shadow 鏃犲嚑浣曞奖鍝嶏級 */
@keyframes tv2Pulse {
  0%, 100% {
    box-shadow:
      var(--tv2-card-hi-bright),
      0 0 0 0 rgba(99, 102, 241, .38),
      0 0 18px rgba(99, 102, 241, .28);
    transform: scale(1);
  }
  50% {
    box-shadow:
      var(--tv2-card-hi-bright),
      0 0 0 7px rgba(99, 102, 241, 0),
      0 0 32px rgba(139, 92, 246, .46);
    transform: scale(1.02);
  }
}

html body:has(.brand-lockup) .ant-btn-primary,
html body:has(.brand-lockup) button[type="submit"].ant-btn,
html body:has(.brand-lockup) .btn-primary,
html body:has(.brand-lockup) [class*="btn-primary"] {
  background-image: linear-gradient(135deg, var(--tv2-indigo), var(--tv2-violet));
  border-color: rgba(129, 140, 248, .5);
  box-shadow:
    var(--tv2-card-hi-bright),
    0 0 18px rgba(99, 102, 241, .30),
    0 4px 16px rgba(99, 102, 241, .24);
  text-shadow: none;
  animation: none;
  transition: box-shadow .28s ease, border-color .28s ease, filter .28s ease;
}

html body:has(.brand-lockup) .ant-btn-primary:hover,
html body:has(.brand-lockup) button[type="submit"].ant-btn:hover,
html body:has(.brand-lockup) .btn-primary:hover,
html body:has(.brand-lockup) [class*="btn-primary"]:hover {
  animation-play-state: paused;
  filter: brightness(1.1);
  border-color: rgba(129, 140, 248, .85);
  box-shadow:
    var(--tv2-card-hi-bright),
    0 0 0 3px rgba(99, 102, 241, .2),
    0 0 32px rgba(139, 92, 246, .44),
    0 6px 22px rgba(99, 102, 241, .34);
}

html body:has(.brand-lockup) .ant-btn-primary:active,
html body:has(.brand-lockup) [class*="btn-primary"]:active {
  filter: brightness(.94);
  transform: scale(.98);
}

/* 閫変腑鑿滃崟锛氬乏渚ч湏铏规爣 + 娓愬彉搴?*/
html body:has(.brand-lockup) .ant-menu-item-selected {
  background-image: linear-gradient(90deg, rgba(99, 102, 241, .22), rgba(139, 92, 246, .07));
  box-shadow:
    inset 2px 0 0 var(--tv2-indigo),
    inset 0 0 18px rgba(99, 102, 241, .10);
  text-shadow: none;
}

html body:has(.brand-lockup) .ant-menu-item:hover,
html body:has(.brand-lockup) .ant-menu-submenu-title:hover,
html body:has(.brand-lockup) .ant-menu-item-selected:hover {
  text-shadow: none;
  background-image: linear-gradient(90deg, rgba(99, 102, 241, .12), transparent);
}

/* 鍦ㄧ嚎/绂荤嚎/鍛婅鐘舵€佺偣闇撹櫣 */
@keyframes tv2DotGlow {
  0%, 100% { opacity: 1; }
  50%      { opacity: .7; }
}

html body:has(.brand-lockup) .ant-badge-status-success .ant-badge-status-dot,
html body:has(.brand-lockup) .status-online::before,
html body:has(.brand-lockup) [class*="dot-online"] {
  background-color: var(--tv2-ok);
  box-shadow: 0 0 10px rgba(34, 197, 94, .7), 0 0 3px rgba(34, 197, 94, .95);
  animation: none;
}

html body:has(.brand-lockup) .ant-badge-status-error .ant-badge-status-dot,
html body:has(.brand-lockup) .status-offline::before,
html body:has(.brand-lockup) [class*="dot-offline"] {
  background-color: var(--tv2-err);
  box-shadow: 0 0 10px rgba(239, 68, 68, .65), 0 0 3px rgba(239, 68, 68, .9);
}

html body:has(.brand-lockup) .ant-badge-status-warning .ant-badge-status-dot,
html body:has(.brand-lockup) .status-warning::before,
html body:has(.brand-lockup) [class*="dot-warning"] {
  background-color: var(--tv2-warn);
  box-shadow: 0 0 10px rgba(245, 158, 11, .65), 0 0 3px rgba(245, 158, 11, .9);
}

html body:has(.brand-lockup) .ant-badge-status-success,
html body:has(.brand-lockup) .status-online,
html body:has(.brand-lockup) [class*="status-online"],
html body:has(.brand-lockup) [class*="online"] {
  color: var(--tv2-ok);
  text-shadow: none;
}

html body:has(.brand-lockup) .ant-badge-status-error,
html body:has(.brand-lockup) .status-offline,
html body:has(.brand-lockup) [class*="status-offline"],
html body:has(.brand-lockup) [class*="offline"] {
  color: var(--tv2-err);
  text-shadow: none;
}

html body:has(.brand-lockup) .ant-badge-status-warning,
html body:has(.brand-lockup) .status-warning,
html body:has(.brand-lockup) [class*="status-warning"],
html body:has(.brand-lockup) [class*="warning"] {
  color: var(--tv2-warn);
  text-shadow: none;
}

/* 澶勭悊涓細闈涜摑绱懠鍚哥偣 */
@keyframes tv2ProcessPulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(99, 102, 241, .5); opacity: 1; }
  50%      { box-shadow: 0 0 0 6px rgba(99, 102, 241, 0);  opacity: .72; }
}

html body:has(.brand-lockup) .ant-badge-status-processing .ant-badge-status-dot {
  background-color: var(--tv2-indigo);
  animation: none;
}

/* 杈规 hover 娴佸厜锛坆ackground 娓愬彉 + 鍏抽敭甯э紝浠呭奖鍝嶈儗鏅粯鍒讹紝鎬ц兘鍙帶锛?*/
@keyframes tv2BorderFlow {
  0%   { background-position: 0% 50%; }
  100% { background-position: 200% 50%; }
}

html body:has(.brand-lockup) .ant-btn-primary,
html body:has(.brand-lockup) [class*="btn-primary"] {
  background-image:
    linear-gradient(135deg, var(--tv2-indigo), var(--tv2-violet));
}

/* ============================================================================
   4) 鏁版嵁闈㈡澘璐ㄦ劅 鈥?绛夊绉戞妧瀛椾綋 + 澶у瓧鍙锋暟瀛楀彂鍏?   ========================================================================== */
html body:has(.brand-lockup) .ant-statistic-content,
html body:has(.brand-lockup) .ant-statistic-content-value,
html body:has(.brand-lockup) [class*="stat"] [class*="value"],
html body:has(.brand-lockup) [class*="metric"],
html body:has(.brand-lockup) [class*="metrics"] [class*="num"],
html body:has(.brand-lockup) [class*="count"],
html body:has(.brand-lockup) [class*="number"] {
  font-family: var(--tv2-mono);
  font-feature-settings: "tnum" 1, "lnum" 1, "cv01" 1;
  font-variant-numeric: tabular-nums;
  letter-spacing: .01em;
  color: #eef0ff;
  text-shadow: none;
}

html body:has(.brand-lockup) .ant-statistic-title {
  letter-spacing: .06em;
  text-shadow: none;
}

/* ============================================================================
   5) 鎵弿绾?/ 缃戞牸绾圭悊锛堝彲閫夛紝鏋?subtle锛宱pacity 鏋佷綆涓嶅枾瀹惧ず涓伙級
   ========================================================================== */

/* 缃戞牸鑳屾櫙锛氫粎瀵逛华琛?缁熻瀹瑰櫒鍔犻潪甯告贰鐨勭綉鏍硷紙绾?background锛屼笉鏀瑰嚑浣曪級 */
html body:has(.brand-lockup) [class*="dashboard"],
html body:has(.brand-lockup) [class*="metrics"],
html body:has(.brand-lockup) [class*="stat-card"] {
  background-image:
    linear-gradient(rgba(99, 102, 241, .035) 1px, transparent 1px),
    linear-gradient(90deg, rgba(99, 102, 241, .03) 1px, transparent 1px);
  background-size: 24px 24px;
}

/* 椤堕儴鎵弿绾垮姩鐢伙紙鐢ㄤ吉鍏冪礌鏃犳硶寮曞叆鍐呭浼氳Е纰板竷灞€锛屾敼涓哄浠〃瀹瑰櫒鍙犲姞鏌斿拰绉诲姩楂樺厜甯︼級 */
@keyframes tv2Scanline {
  0%   { transform: translateY(-120%); opacity: 0; }
  12%  { opacity: .5; }
  50%  { opacity: .28; }
  88%  { opacity: .5; }
  100% { transform: translateY(120%); opacity: 0; }
}

/* 鍏滃簳锛氭棤浼厓绱狅紝鐩存帴缁欎华琛ㄥ鍣ㄤ竴涓瀬娣＄殑鍛ㄦ湡鎬ц儗鏅Щ鍔ㄥ厜甯︼紙涓嶅奖鍝嶅嚑浣曪級 */
html body:has(.brand-lockup) [class*="dashboard"] {
  background-image:
    linear-gradient(115deg,
      transparent 0%,
      rgba(99, 102, 241, .04) 48%,
      rgba(139, 92, 246, .05) 50%,
      transparent 52%),
    linear-gradient(rgba(99, 102, 241, .035) 1px, transparent 1px),
    linear-gradient(90deg, rgba(99, 102, 241, .03) 1px, transparent 1px);
  background-size: 300% 100%, 24px 24px, 24px 24px;
  animation: none;
}

/* ============================================================================
   6) 缁嗚妭 鈥?婊氬姩鏉?/ 閫変腑 / 鑱氱劍 / logo 寰厜
   ========================================================================== */
html body:has(.brand-lockup) ::-webkit-scrollbar-track {
  background: rgba(11, 12, 14, .55);
}

html body:has(.brand-lockup) ::-webkit-scrollbar-thumb {
  background: linear-gradient(180deg, rgba(99, 102, 241, .42), rgba(139, 92, 246, .32));
  border: 2px solid rgba(11, 12, 14, .82);
  border-radius: 8px;
}

html body:has(.brand-lockup) ::-webkit-scrollbar-thumb:hover {
  background: linear-gradient(180deg, rgba(99, 102, 241, .62), rgba(139, 92, 246, .52));
}

html body:has(.brand-lockup) ::selection {
  background-color: rgba(99, 102, 241, .4);
  color: #fff;
}

/* 鑱氱劍闇撹櫣鐜?*/
html body:has(.brand-lockup) .ant-input:focus,
html body:has(.brand-lockup) .ant-input-focused,
html body:has(.brand-lockup) .ant-input-affix-wrapper:focus,
html body:has(.brand-lockup) .ant-input-affix-wrapper-focused,
html body:has(.brand-lockup) .ant-select-focused .ant-select-selector,
html body:has(.brand-lockup) .ant-picker-focused,
html body:has(.brand-lockup) .ant-input-number-focused,
html body:has(.brand-lockup) textarea:focus,
html body:has(.brand-lockup) input:focus {
  border-color: rgba(129, 140, 248, .68) !important;
  box-shadow:
    0 0 0 3px rgba(99, 102, 241, .22),
    0 0 20px rgba(99, 102, 241, .32),
    inset 0 0 8px rgba(99, 102, 241, .06) !important;
}

html body:has(.brand-lockup) .ant-input,
html body:has(.brand-lockup) .ant-input-affix-wrapper,
html body:has(.brand-lockup) .ant-select-selector,
html body:has(.brand-lockup) .ant-picker,
html body:has(.brand-lockup) .ant-input-number {
  border-color: var(--tv2-line);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .02);
  transition: border-color .22s ease, box-shadow .22s ease;
}

html body:has(.brand-lockup) .ant-input:hover,
html body:has(.brand-lockup) .ant-input-affix-wrapper:hover,
html body:has(.brand-lockup) .ant-select:hover .ant-select-selector,
html body:has(.brand-lockup) .ant-picker:hover {
  border-color: var(--tv2-line-bright);
}

/* logo / 鍝佺墝鍖哄井鍏?*/
html body:has(.brand-lockup) .brand-lockup,
html body:has(.brand-lockup) [class*="logo"],
html body:has(.brand-lockup) [class*="brand"] {
  filter: drop-shadow(0 0 10px rgba(99, 102, 241, .35));
  text-shadow: none;
}

/* ============================================================================
   7) 寮瑰眰鐜荤拑鎷熸€侊紙backdrop-filter 浠呭脊灞傦級
   ========================================================================== */
html body:has(.brand-lockup) .ant-modal-content,
html body:has(.brand-lockup) .ant-drawer-content,
html body:has(.brand-lockup) .ant-select-dropdown,
html body:has(.brand-lockup) .ant-dropdown-menu,
html body:has(.brand-lockup) .ant-picker-dropdown,
html body:has(.brand-lockup) .ant-popover-inner,
html body:has(.brand-lockup) .ant-tooltip-inner,
html body:has(.brand-lockup) .ant-message-notice-content,
html body:has(.brand-lockup) .ant-notification-notice {
  background-color: var(--tv2-glass-bg);
  -webkit-backdrop-filter: var(--tv2-glass-blur);
  backdrop-filter: var(--tv2-glass-blur);
  border: 1px solid rgba(148, 163, 184, .17);
  box-shadow:
    var(--tv2-card-hi),
    0 14px 44px rgba(0, 0, 0, .48),
    0 0 26px rgba(99, 102, 241, .07);
}

html body:has(.brand-lockup) .ant-modal-header {
  background-color: transparent;
  border-bottom-color: var(--tv2-line-soft);
}

/* ============================================================================
   8) 琛ㄦ牸 / 鎻忚堪 / 娆＄骇瀹瑰櫒杈规缁熶竴
   ========================================================================== */
html body:has(.brand-lockup) .ant-table,
html body:has(.brand-lockup) .ant-table-container,
html body:has(.brand-lockup) .ant-descriptions-bordered .ant-descriptions-view,
html body:has(.brand-lockup) .ant-tabs-content-holder,
html body:has(.brand-lockup) .ant-segmented,
html body:has(.brand-lockup) .ant-alert,
html body:has(.brand-lockup) .ant-tag,
html body:has(.brand-lockup) .ant-list,
html body:has(.brand-lockup) .ant-collapse,
html body:has(.brand-lockup) .ant-timeline,
html body:has(.brand-lockup) .ant-divider {
  border-color: var(--tv2-line);
}

html body:has(.brand-lockup) .ant-table-thead > tr > th {
  background-image: linear-gradient(180deg, rgba(255, 255, 255, .025), transparent);
  border-bottom-color: rgba(148, 163, 184, .16);
}

html body:has(.brand-lockup) .ant-table-tbody > tr > td {
  border-bottom-color: var(--tv2-line-soft);
}

html body:has(.brand-lockup) .ant-table-tbody > tr:hover > td {
  background-color: rgba(99, 102, 241, .05);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .025);
}

html body:has(.brand-lockup) .ant-table-tbody > tr > td.ant-table-cell-fix-left,
html body:has(.brand-lockup) .ant-table-tbody > tr > td.ant-table-cell-fix-right {
  background-color: rgba(11, 12, 14, .92);
}

/* ============================================================================
   9) prefers-reduced-motion 鍏滃簳 鈥?鍏抽棴鎵€鏈夊姩鐢?   ========================================================================== */
@media (prefers-reduced-motion: reduce) {
  html body:has(.brand-lockup) .ant-btn-primary,
  html body:has(.brand-lockup) button[type="submit"].ant-btn,
  html body:has(.brand-lockup) .btn-primary,
  html body:has(.brand-lockup) [class*="btn-primary"],
  html body:has(.brand-lockup) .ant-badge-status-processing .ant-badge-status-dot,
  html body:has(.brand-lockup) .ant-badge-status-success .ant-badge-status-dot,
  html body:has(.brand-lockup) [class*="dashboard"] {
    animation: none;
  }
  html body:has(.brand-lockup) * {
    transition-duration: .01ms !important;
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
  }
}

/* ============================================================================
   EOF 鈥?tech_visual_v2.css
   ========================================================================== */

