/* ==========================================================================
   QQBot Manager - 全局样式表
   现代简约科技风 · 深紫/靛蓝主色 · CSS 变量化
   ========================================================================== */

:root {
    /* ===== 主题色 ===== */
    --color-primary:        #4338ca;        /* 深靛蓝(主色) */
    --color-primary-hover:  #3730a3;
    --color-primary-soft:   #eef2ff;        /* 主色淡背景 */
    --color-primary-light:  #e0e7ff;
    --color-accent:         #6d28d9;        /* 深紫(强调) */
    --color-accent-soft:    #f5f3ff;

    --color-success:        #10b981;        /* 薄荷绿 */
    --color-success-hover:  #059669;
    --color-success-soft:   #d1fae5;

    --color-danger:         #ef4444;        /* 红色 */
    --color-danger-hover:   #dc2626;
    --color-danger-soft:    #fee2e2;

    --color-warning:        #f59e0b;
    --color-warning-soft:   #fef3c7;

    --color-info:           #0ea5e9;
    --color-info-soft:      #e0f2fe;

    /* ===== 中性色 ===== */
    --color-bg:             #f5f7fb;        /* 页面背景 */
    --color-surface:        #ffffff;        /* 卡片背景 */
    --color-surface-2:      #fafafa;
    --color-border:         #e5e7eb;
    --color-border-strong:  #d1d5db;

    --color-text:           #111827;        /* 主文字 */
    --color-text-soft:      #4b5563;        /* 次要文字 */
    --color-text-muted:     #9ca3af;        /* 辅助文字 */
    --color-text-inverse:   #ffffff;

    /* ===== 排版 ===== */
    --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
                 "Hiragino Sans GB", "Microsoft YaHei", system-ui, sans-serif;
    --font-mono: "SF Mono", Monaco, Menlo, Consolas, "Liberation Mono", "Courier New", monospace;

    /* ===== 间距 ===== */
    --space-1:   4px;
    --space-2:   8px;
    --space-3:  12px;
    --space-4:  16px;
    --space-5:  20px;
    --space-6:  24px;
    --space-8:  32px;
    --space-10: 40px;
    --space-12: 48px;

    /* ===== 圆角 ===== */
    --radius-sm: 6px;
    --radius-md: 10px;
    --radius-lg: 14px;
    --radius-xl: 20px;
    --radius-full: 9999px;

    /* ===== 阴影 ===== */
    --shadow-sm:  0 1px 2px rgba(17, 24, 39, .05);
    --shadow-md:  0 2px 8px rgba(17, 24, 39, .06), 0 1px 2px rgba(17, 24, 39, .04);
    --shadow-lg:  0 10px 30px rgba(17, 24, 39, .08), 0 4px 12px rgba(17, 24, 39, .05);
    --shadow-primary: 0 8px 24px rgba(67, 56, 202, .25);

    /* ===== 布局 ===== */
    --sidebar-width:        240px;
    --sidebar-width-mobile: 280px;
    --topbar-height:        60px;
    --transition:           150ms cubic-bezier(.4,0,.2,1);
    --transition-slow:      280ms cubic-bezier(.4,0,.2,1);
}

/* ==========================================================================
   全局重置 & 基础
   ========================================================================== */
*, *::before, *::after { box-sizing: border-box; }
html, body { height: 100%; }
body {
    margin: 0;
    font-family: var(--font-sans);
    background: var(--color-bg);
    color: var(--color-text);
    font-size: 14px;
    line-height: 1.6;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}
a { color: var(--color-primary); text-decoration: none; transition: color var(--transition); }
a:hover { color: var(--color-primary-hover); }
h1, h2, h3, h4, h5, h6 { margin: 0 0 var(--space-3); color: var(--color-text); font-weight: 600; }
h1 { font-size: 24px; }
h2 { font-size: 20px; }
h3 { font-size: 17px; }
p { margin: 0 0 var(--space-3); }
code {
    font-family: var(--font-mono);
    background: var(--color-primary-soft);
    color: var(--color-accent);
    padding: 2px 6px;
    border-radius: var(--radius-sm);
    font-size: 0.9em;
}
pre {
    margin: 0;
    font-family: var(--font-mono);
    background: var(--color-surface-2);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    padding: var(--space-3);
    overflow: auto;
    font-size: 12.5px;
    line-height: 1.6;
}
pre code { background: transparent; color: var(--color-text); padding: 0; }
hr { border: 0; border-top: 1px solid var(--color-border); margin: var(--space-5) 0; }

/* ==========================================================================
   App 布局 - 侧边栏 + 顶部栏 + 内容
   ========================================================================== */
.app {
    display: flex;
    min-height: 100vh;
}
.sidebar {
    position: fixed;
    inset: 0 auto 0 0;
    width: var(--sidebar-width);
    background: var(--color-surface);
    border-right: 1px solid var(--color-border);
    display: flex;
    flex-direction: column;
    z-index: 30;
    transition: transform var(--transition-slow);
}
/* 品牌区:左侧 logo+标题,右侧关闭按钮(移动端) */
.sidebar__brand {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
    padding: 18px var(--space-5) 16px;
    color: var(--color-text);
}
.sidebar__brand-link {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    color: var(--color-text);
    min-width: 0;
    flex: 1;
}
.sidebar__brand-link:hover { color: var(--color-text); }
.sidebar__logo {
    width: 36px; height: 36px;
    border-radius: var(--radius-md);
    background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-accent) 100%);
    color: #fff;
    display: grid; place-items: center;
    font-weight: 700;
    box-shadow: var(--shadow-primary);
    flex-shrink: 0;
}
.sidebar__brand-text { min-width: 0; }
.sidebar__title {
    font-weight: 700;
    font-size: 16px;
    line-height: 1.2;
    color: var(--color-primary);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.sidebar__subtitle {
    font-size: 11px;
    color: var(--color-text-muted);
    margin-top: 3px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
/* 关闭按钮 - 仅移动端展示 */
.sidebar__close {
    display: none;
    width: 36px; height: 36px;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    border: none;
    background: transparent;
    color: var(--color-text-soft);
    border-radius: var(--radius-md);
    cursor: pointer;
    transition: background var(--transition), color var(--transition);
}
.sidebar__close:hover {
    background: var(--color-primary-soft);
    color: var(--color-primary);
}
.sidebar__close:active { transform: scale(.94); }

/* 头部下方的细分隔线 */
.sidebar__divider {
    height: 1px;
    margin: 0 var(--space-5) var(--space-3);
    background: var(--color-border);
}

.sidebar__nav {
    flex: 1;
    overflow-y: auto;
    padding: var(--space-2) var(--space-3) var(--space-4);
    display: flex;
    flex-direction: column;
    gap: 2px;
}

/* 一级菜单项 与 折叠组的标题按钮 - 统一外观 */
.sidebar__item,
.sidebar__group-toggle {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    width: 100%;
    padding: 11px 14px;
    border-radius: var(--radius-md);
    border: none;
    background: transparent;
    color: var(--color-text-soft);
    font-family: inherit;
    font-size: 14px;
    font-weight: 500;
    line-height: 1.2;
    text-align: left;
    text-decoration: none;
    cursor: pointer;
    transition: background var(--transition), color var(--transition);
    -webkit-tap-highlight-color: transparent;
}
.sidebar__item:hover,
.sidebar__group-toggle:hover {
    background: var(--color-primary-soft);
    color: var(--color-primary);
}
.sidebar__group-toggle:focus { outline: none; }
.sidebar__group-toggle:focus-visible {
    outline: 2px solid var(--color-primary-light);
    outline-offset: -2px;
}
/* 标签文字铺满中间,挤压 chevron 至最右 */
.sidebar__label {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* 活动项 - 满宽柔色背景 */
.sidebar__item.is-active {
    background: var(--color-primary-soft);
    color: var(--color-primary);
    font-weight: 600;
}
/* 组内包含活动项时,组标题也呼应高亮 */
.sidebar__group.has-active > .sidebar__group-toggle {
    color: var(--color-primary);
    font-weight: 600;
}

/* 图标 - 描边风格 */
.sidebar__icon {
    width: 20px;
    height: 20px;
    flex-shrink: 0;
}

/* 折叠箭头 - 默认向下,展开时旋转 180° 向上 */
.sidebar__chevron {
    flex-shrink: 0;
    opacity: .55;
    transition: transform .25s ease;
}
.sidebar__group.is-open .sidebar__chevron {
    transform: rotate(180deg);
    opacity: .8;
}

/* 二级菜单容器 - 使用 grid-template-rows 实现高度自适应的折叠动画 */
.sidebar__sub {
    display: grid;
    grid-template-rows: 0fr;
    transition: grid-template-rows .25s ease;
}
.sidebar__sub > .sidebar__sub-inner {
    overflow: hidden;
    min-height: 0;
}
.sidebar__group.is-open .sidebar__sub {
    grid-template-rows: 1fr;
}
/* 旧浏览器降级:不支持 grid 行高动画时改用 max-height */
@supports not (grid-template-rows: 1fr) {
    .sidebar__sub {
        display: block;
        max-height: 0;
        overflow: hidden;
        transition: max-height .25s ease;
    }
    .sidebar__sub > .sidebar__sub-inner { overflow: visible; }
    .sidebar__group.is-open .sidebar__sub { max-height: 600px; }
}

/* 二级菜单项 - 缩进对齐父级文字 */
.sidebar__item--sub {
    padding: 9px 14px 9px 44px;
    font-size: 13px;
    font-weight: 500;
    gap: var(--space-2);
}
.sidebar__item--sub .sidebar__icon {
    width: 16px;
    height: 16px;
    opacity: .9;
}

/* 旧版组标题(留作兼容,目前未渲染) */
.sidebar__group-title {
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: .08em;
    color: var(--color-text-muted);
    padding: var(--space-3) var(--space-3) var(--space-1);
    font-weight: 600;
}

.sidebar__footer {
    padding: var(--space-3) var(--space-4);
    border-top: 1px solid var(--color-border);
    font-size: 11px;
    color: var(--color-text-muted);
    text-align: center;
}

/* 顶部栏 */
.topbar {
    position: sticky;
    top: 0;
    height: var(--topbar-height);
    background: rgba(255,255,255,.85);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
    border-bottom: 1px solid var(--color-border);
    display: flex;
    align-items: center;
    padding: 0 var(--space-6);
    z-index: 20;
    gap: var(--space-3);
}
.topbar__menu-btn {
    display: none;
    width: 36px; height: 36px;
    border-radius: var(--radius-md);
    border: 1px solid var(--color-border);
    background: var(--color-surface);
    cursor: pointer;
    align-items: center;
    justify-content: center;
}
.topbar__title {
    font-size: 16px;
    font-weight: 600;
    color: var(--color-text);
}
.topbar__spacer { flex: 1; }
.topbar__user {
    display: flex;
    align-items: center;
    gap: var(--space-3);
}
.avatar {
    width: 36px; height: 36px;
    border-radius: var(--radius-full);
    background: linear-gradient(135deg, var(--color-primary), var(--color-accent));
    color: #fff;
    display: grid; place-items: center;
    font-weight: 600;
    font-size: 13px;
    flex-shrink: 0;
}
.avatar--sm { width: 28px; height: 28px; font-size: 12px; }
.avatar--lg { width: 60px; height: 60px; font-size: 22px; }
/* 真实头像图片:走 object-fit 等比裁,清掉渐变背景 */
.avatar--img,
img.avatar, img.avatar--sm, img.avatar--lg {
    background: var(--color-bg-soft);
    object-fit: cover;
    border: 2px solid #fff;
    box-shadow: var(--shadow-xs, 0 1px 2px rgba(0,0,0,.04));
    display: block;
}

/* 内容区 */
.app-main {
    flex: 1;
    margin-left: var(--sidebar-width);
    min-width: 0;
    display: flex;
    flex-direction: column;
}
.content {
    padding: var(--space-6);
    flex: 1;
}

/* 移动端 */
.sidebar__backdrop {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(17,24,39,.5);
    z-index: 25;
    opacity: 0;
    transition: opacity var(--transition-slow);
}
@media (max-width: 768px) {
    .sidebar {
        transform: translateX(-100%);
        width: var(--sidebar-width-mobile);
    }
    body.sidebar-open .sidebar { transform: translateX(0); box-shadow: var(--shadow-lg); }
    body.sidebar-open .sidebar__backdrop { display: block; opacity: 1; }
    .sidebar__close { display: inline-flex; }
    .app-main { margin-left: 0; }
    .topbar { padding: 0 var(--space-4); }
    .topbar__menu-btn { display: inline-flex; }
    .content { padding: var(--space-4); }
}

/* ==========================================================================
   卡片
   ========================================================================== */
.card {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm);
    overflow: hidden;
    transition: box-shadow var(--transition), transform var(--transition);
}
.card--hover:hover {
    box-shadow: var(--shadow-md);
    transform: translateY(-1px);
}
.card__header {
    padding: var(--space-4) var(--space-5);
    border-bottom: 1px solid var(--color-border);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
    background: var(--color-surface);
}
.card__header h3, .card__header h2, .card__header h4 { margin: 0; font-size: 15px; }
.card__body { padding: var(--space-5); }
.card__body--compact { padding: var(--space-4); }
.card__footer {
    padding: var(--space-4) var(--space-5);
    border-top: 1px solid var(--color-border);
    background: var(--color-surface-2);
}

/* 统计卡片 */
.stat-card { padding: var(--space-5); }
.stat-card__label {
    font-size: 12px;
    color: var(--color-text-muted);
    text-transform: uppercase;
    letter-spacing: .6px;
    margin-bottom: var(--space-2);
    display: flex; align-items: center; gap: var(--space-2);
}
.stat-card__value {
    font-size: 30px;
    font-weight: 700;
    color: var(--color-text);
    line-height: 1.1;
    font-variant-numeric: tabular-nums;
}
.stat-card__value--sm { font-size: 18px; }
.stat-card__sub { margin-top: var(--space-2); color: var(--color-text-muted); font-size: 12px; }
.stat-card__icon {
    width: 38px; height: 38px;
    border-radius: var(--radius-md);
    display: grid; place-items: center;
    color: var(--color-primary);
    background: var(--color-primary-soft);
    margin-bottom: var(--space-3);
}
.stat-card__icon--success { color: var(--color-success); background: var(--color-success-soft); }
.stat-card__icon--warning { color: var(--color-warning); background: var(--color-warning-soft); }
.stat-card__icon--info    { color: var(--color-info); background: var(--color-info-soft); }

/* ==========================================================================
   Grid
   ========================================================================== */
.grid { display: grid; gap: var(--space-4); }
.grid--2 { grid-template-columns: repeat(2, minmax(0,1fr)); }
.grid--3 { grid-template-columns: repeat(3, minmax(0,1fr)); }
.grid--4 { grid-template-columns: repeat(4, minmax(0,1fr)); }
.grid--auto-260 { grid-template-columns: repeat(auto-fill, minmax(260px,1fr)); }
.grid--auto-320 { grid-template-columns: repeat(auto-fill, minmax(320px,1fr)); }
@media (max-width: 992px) {
    .grid--4 { grid-template-columns: repeat(2, minmax(0,1fr)); }
    .grid--3 { grid-template-columns: repeat(2, minmax(0,1fr)); }
}
@media (max-width: 600px) {
    .grid--2, .grid--3, .grid--4 { grid-template-columns: 1fr; }
}

/* ==========================================================================
   按钮
   ========================================================================== */
.btn {
    --btn-bg: var(--color-surface);
    --btn-fg: var(--color-text);
    --btn-bd: var(--color-border-strong);
    --btn-bg-hover: var(--color-surface-2);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--space-2);
    padding: 8px 16px;
    background: var(--btn-bg);
    color: var(--btn-fg);
    border: 1px solid var(--btn-bd);
    border-radius: var(--radius-md);
    font-family: inherit;
    font-size: 13.5px;
    font-weight: 500;
    cursor: pointer;
    transition: all var(--transition);
    line-height: 1.4;
    white-space: nowrap;
    user-select: none;
}
.btn:hover {
    background: var(--btn-bg-hover);
    transform: translateY(-1px);
    box-shadow: var(--shadow-sm);
}
.btn:active { transform: translateY(0); }
.btn:disabled, .btn.is-loading {
    opacity: .6;
    cursor: not-allowed;
    transform: none !important;
}
.btn.is-loading { position: relative; color: transparent !important; }
.btn.is-loading::after {
    content: "";
    position: absolute;
    width: 14px; height: 14px;
    border: 2px solid currentColor;
    border-bottom-color: transparent;
    border-radius: 50%;
    animation: spin .7s linear infinite;
    color: var(--btn-fg);
}
@keyframes spin { to { transform: rotate(360deg); } }

.btn--primary {
    --btn-bg: var(--color-primary);
    --btn-fg: #fff;
    --btn-bd: var(--color-primary);
    --btn-bg-hover: var(--color-primary-hover);
}
.btn--primary:hover { box-shadow: var(--shadow-primary); }

.btn--secondary {
    --btn-bg: var(--color-primary-soft);
    --btn-fg: var(--color-primary);
    --btn-bd: transparent;
    --btn-bg-hover: var(--color-primary-light);
}

.btn--success {
    --btn-bg: var(--color-success);
    --btn-fg: #fff;
    --btn-bd: var(--color-success);
    --btn-bg-hover: var(--color-success-hover);
}

.btn--danger {
    --btn-bg: var(--color-danger);
    --btn-fg: #fff;
    --btn-bd: var(--color-danger);
    --btn-bg-hover: var(--color-danger-hover);
}

.btn--ghost {
    --btn-bg: transparent;
    --btn-bd: transparent;
    --btn-bg-hover: var(--color-primary-soft);
}

.btn--outline-danger {
    --btn-bg: var(--color-surface);
    --btn-fg: var(--color-danger);
    --btn-bd: var(--color-danger);
    --btn-bg-hover: var(--color-danger-soft);
}

.btn--sm { padding: 5px 12px; font-size: 12.5px; }
.btn--lg { padding: 12px 20px; font-size: 15px; }
.btn--block { width: 100%; }
.btn--icon { padding: 8px; }
.btn-group { display: inline-flex; gap: var(--space-2); flex-wrap: wrap; }

/* ==========================================================================
   表单
   ========================================================================== */
.form-group { margin-bottom: var(--space-4); }
.form-row {
    display: grid;
    gap: var(--space-4);
    grid-template-columns: repeat(2, minmax(0,1fr));
}
@media (max-width: 600px) { .form-row { grid-template-columns: 1fr; } }

.label {
    display: block;
    margin-bottom: 6px;
    font-size: 13px;
    font-weight: 500;
    color: var(--color-text);
}
.label .req { color: var(--color-danger); margin-left: 2px; }

.input, .select, .textarea {
    width: 100%;
    padding: 9px 12px;
    border: 1px solid var(--color-border-strong);
    border-radius: var(--radius-md);
    background: var(--color-surface);
    font-family: inherit;
    font-size: 14px;
    color: var(--color-text);
    transition: border-color var(--transition), box-shadow var(--transition);
}
.input:focus, .select:focus, .textarea:focus {
    outline: none;
    border-color: var(--color-primary);
    box-shadow: 0 0 0 3px var(--color-primary-soft);
}
.input::placeholder { color: var(--color-text-muted); }
.input--lg { padding: 12px 16px; font-size: 15px; }
.textarea { resize: vertical; min-height: 80px; font-family: var(--font-sans); }

.input-group {
    display: flex;
    gap: var(--space-2);
}
.input-group .input { flex: 1; }

.field-hint { margin-top: 6px; font-size: 12px; color: var(--color-text-muted); }

/* 开关 */
.switch {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    cursor: pointer;
    user-select: none;
}
.switch input { display: none; }
.switch__slot {
    width: 38px; height: 22px;
    background: var(--color-border-strong);
    border-radius: var(--radius-full);
    position: relative;
    transition: background var(--transition);
}
.switch__slot::after {
    content: "";
    position: absolute;
    top: 2px; left: 2px;
    width: 18px; height: 18px;
    background: #fff;
    border-radius: 50%;
    box-shadow: var(--shadow-sm);
    transition: transform var(--transition);
}
.switch input:checked + .switch__slot { background: var(--color-primary); }
.switch input:checked + .switch__slot::after { transform: translateX(16px); }

/* ==========================================================================
   徽章 / 标签
   ========================================================================== */
.badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 8px;
    border-radius: var(--radius-full);
    font-size: 11.5px;
    font-weight: 600;
    line-height: 1.5;
    border: 1px solid transparent;
}
.badge--primary { color: var(--color-primary); background: var(--color-primary-soft); }
.badge--success { color: var(--color-success-hover); background: var(--color-success-soft); }
.badge--danger  { color: var(--color-danger-hover);  background: var(--color-danger-soft); }
.badge--warning { color: #92400e; background: var(--color-warning-soft); }
.badge--info    { color: #0369a1; background: var(--color-info-soft); }
.badge--neutral { color: var(--color-text-soft); background: #f3f4f6; }
.badge--dot::before {
    content: "";
    width: 6px; height: 6px;
    border-radius: 50%;
    background: currentColor;
}

/* ==========================================================================
   表格
   ========================================================================== */
.table-wrap { overflow-x: auto; }
.table {
    width: 100%;
    border-collapse: separate;
    border-spacing: 0;
    font-size: 14px;
}
.table th, .table td {
    padding: var(--space-3) var(--space-4);
    text-align: left;
    border-bottom: 1px solid var(--color-border);
    vertical-align: middle;
}
.table th {
    color: var(--color-text-muted);
    font-weight: 600;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: .5px;
    background: var(--color-surface-2);
}
.table tbody tr { transition: background var(--transition); }
.table tbody tr:hover { background: var(--color-primary-soft); }
.table .actions {
    display: flex; gap: var(--space-2); justify-content: flex-end;
}
.table-empty {
    text-align: center;
    padding: var(--space-10) var(--space-4) !important;
    color: var(--color-text-muted);
}

/* ==========================================================================
   Flash 提示
   ========================================================================== */
.flash-stack {
    position: fixed;
    top: 76px;
    right: var(--space-5);
    z-index: 60;
    display: flex; flex-direction: column;
    gap: var(--space-2);
    max-width: 380px;
}
@media (max-width: 768px) {
    .flash-stack { top: 70px; right: var(--space-3); left: var(--space-3); max-width: none; }
}
.flash {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-left: 4px solid var(--color-primary);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-lg);
    padding: var(--space-3) var(--space-4);
    display: flex; align-items: flex-start; gap: var(--space-3);
    animation: flashIn .28s ease;
}
.flash--success { border-left-color: var(--color-success); }
.flash--error   { border-left-color: var(--color-danger); }
.flash--info    { border-left-color: var(--color-info); }
.flash__msg { flex: 1; font-size: 13.5px; color: var(--color-text); line-height: 1.5; }
.flash__close {
    cursor: pointer;
    border: 0;
    background: transparent;
    color: var(--color-text-muted);
    font-size: 18px;
    line-height: 1;
}
@keyframes flashIn {
    from { transform: translateY(-8px); opacity: 0; }
    to   { transform: translateY(0);    opacity: 1; }
}

/* ==========================================================================
   Modal
   ========================================================================== */
.modal-backdrop {
    position: fixed; inset: 0;
    background: rgba(17,24,39,.5);
    display: none;
    align-items: center; justify-content: center;
    z-index: 50;
    padding: var(--space-4);
    overflow: hidden;
}
.modal-backdrop.is-open { display: flex; animation: fadeIn .2s ease; }
.modal {
    background: var(--color-surface);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    width: 100%;
    max-width: 560px;
    max-height: calc(100dvh - var(--space-8));
    overflow: hidden;
    display: flex;
    flex-direction: column;
    animation: modalIn .28s cubic-bezier(.4,0,.2,1);
}
.modal > form {
    min-height: 0;
    max-height: inherit;
    display: flex;
    flex-direction: column;
}
.modal__header {
    padding: var(--space-4) var(--space-5);
    border-bottom: 1px solid var(--color-border);
    display: flex; justify-content: space-between; align-items: center;
    flex: 0 0 auto;
}
.modal__header h3 { margin: 0; font-size: 16px; }
.modal__close {
    background: none; border: 0; cursor: pointer;
    width: 32px; height: 32px; line-height: 1;
    font-size: 22px; color: var(--color-text-soft);
    border-radius: var(--radius-md);
    display: grid; place-items: center;
    transition: background .15s, color .15s;
}
.modal__close:hover { background: var(--color-bg-soft); color: var(--color-text); }
.modal__body {
    padding: var(--space-5);
    min-height: 0;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    overscroll-behavior: contain;
}
.modal__footer {
    padding: var(--space-4) var(--space-5);
    border-top: 1px solid var(--color-border);
    background: var(--color-surface-2);
    display: flex; gap: var(--space-3); justify-content: flex-end;
    flex: 0 0 auto;
}
@media (max-width: 640px) {
    .modal-backdrop { padding: var(--space-3); }
    .modal {
        max-width: none;
        max-height: calc(100dvh - var(--space-6));
        margin: auto 0;
    }
    .modal__header { padding: var(--space-3) var(--space-4); }
    .modal__body { padding: var(--space-4); }
    .modal__footer {
        padding: var(--space-3) var(--space-4);
        flex-wrap: wrap;
    }
    .modal__footer .btn { flex: 1 1 120px; }
}
@keyframes modalIn { from { transform: translateY(12px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
@keyframes fadeIn  { from { opacity: 0; } to { opacity: 1; } }

/* ==========================================================================
   登录/注册页(空白布局)
   ========================================================================== */
.auth-page {
    min-height: 100vh;
    display: grid;
    grid-template-columns: 1fr 1fr;
    background: var(--color-bg);
}
.auth-hero {
    background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-accent) 100%);
    color: #fff;
    padding: var(--space-12);
    display: flex; flex-direction: column; justify-content: space-between;
    position: relative;
    overflow: hidden;
}
.auth-hero::before, .auth-hero::after {
    content: ""; position: absolute;
    border-radius: 50%;
    filter: blur(60px);
    opacity: .35;
}
.auth-hero::before {
    width: 320px; height: 320px;
    background: #c4b5fd;
    top: -100px; right: -80px;
}
.auth-hero::after {
    width: 260px; height: 260px;
    background: #818cf8;
    bottom: -80px; left: -40px;
}
.auth-hero__brand { display: flex; align-items: center; gap: var(--space-3); z-index: 1; position: relative; }
.auth-hero__brand-logo {
    width: 40px; height: 40px;
    background: rgba(255,255,255,.18);
    border-radius: var(--radius-md);
    display: grid; place-items: center;
    font-weight: 700; font-size: 16px;
    backdrop-filter: blur(8px);
}
.auth-hero__title { font-size: 36px; font-weight: 700; line-height: 1.25; margin: 0 0 var(--space-3); position: relative; z-index: 1; }
.auth-hero__desc { font-size: 15px; opacity: .85; margin: 0; max-width: 420px; position: relative; z-index: 1; }
.auth-hero__features { margin-top: var(--space-6); display: grid; gap: var(--space-2); position: relative; z-index: 1; }
.auth-hero__feature { display: flex; align-items: center; gap: var(--space-2); font-size: 14px; opacity: .9; }
.auth-hero__footer { font-size: 12px; opacity: .7; position: relative; z-index: 1; }

.auth-form-wrap {
    display: flex; align-items: center; justify-content: center;
    padding: var(--space-8);
}
.auth-form {
    width: 100%;
    max-width: 380px;
}
.auth-form__title { font-size: 26px; font-weight: 700; margin-bottom: var(--space-2); }
.auth-form__subtitle { color: var(--color-text-muted); margin-bottom: var(--space-6); }
.auth-form__switch { text-align: center; margin-top: var(--space-5); color: var(--color-text-muted); font-size: 13px; }

@media (max-width: 900px) {
    .auth-page { grid-template-columns: 1fr; }
    .auth-hero { display: none; }
    .auth-form-wrap { padding: var(--space-5); }
}

/* 极验容器 */
.captcha-slot {
    min-height: 44px;
    width: 100%;
}
.captcha-slot__loading {
    padding: 10px 14px;
    color: var(--color-text-muted);
    font-size: 13px;
    background: var(--color-surface-2);
    border: 1px dashed var(--color-border-strong);
    border-radius: var(--radius-md);
    display: flex; align-items: center; gap: var(--space-2);
}
.captcha-slot__loading::before {
    content: ""; width: 14px; height: 14px;
    border: 2px solid var(--color-border-strong);
    border-bottom-color: var(--color-primary);
    border-radius: 50%;
    animation: spin .7s linear infinite;
}

/* ==========================================================================
   Tabs
   ========================================================================== */
.tabs {
    display: flex;
    gap: var(--space-2);
    border-bottom: 1px solid var(--color-border);
    overflow-x: auto;
}
.tab {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    padding: 10px var(--space-4);
    color: var(--color-text-soft);
    font-weight: 500;
    font-size: 14px;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    transition: all var(--transition);
    white-space: nowrap;
}
.tab:hover { color: var(--color-primary); background: var(--color-primary-soft); border-top-left-radius: var(--radius-md); border-top-right-radius: var(--radius-md); }
.tab.is-active {
    color: var(--color-primary);
    border-bottom-color: var(--color-primary);
    font-weight: 600;
}

/* ==========================================================================
   管理员组 - 视觉强化
   ========================================================================== */
.sidebar__group--admin .sidebar__group-title {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    color: var(--color-accent);
}
.sidebar__group--admin .sidebar__group-title::after {
    content: "ADMIN";
    font-size: 9px;
    padding: 1px 6px;
    background: var(--color-accent-soft);
    color: var(--color-accent);
    border-radius: var(--radius-full);
    font-weight: 700;
    letter-spacing: 0.6px;
}

/* ==========================================================================
   工具类
   ========================================================================== */
.text-muted { color: var(--color-text-muted) !important; }
.text-soft  { color: var(--color-text-soft) !important; }
.text-primary { color: var(--color-primary) !important; }
.text-success { color: var(--color-success-hover) !important; }
.text-danger  { color: var(--color-danger-hover) !important; }
.text-center  { text-align: center; }
.text-right   { text-align: right; }
.text-sm { font-size: 12.5px; }
.text-xs { font-size: 11.5px; }
.fw-bold { font-weight: 600; }
.mono { font-family: var(--font-mono); font-size: 12.5px; }

.flex { display: flex; }
.flex-col { flex-direction: column; }
.items-center { align-items: center; }
.justify-between { justify-content: space-between; }
.gap-2 { gap: var(--space-2); }
.gap-3 { gap: var(--space-3); }
.gap-4 { gap: var(--space-4); }
.flex-1 { flex: 1; }
.flex-wrap { flex-wrap: wrap; }

.mt-2 { margin-top: var(--space-2); }
.mt-3 { margin-top: var(--space-3); }
.mt-4 { margin-top: var(--space-4); }
.mb-2 { margin-bottom: var(--space-2); }
.mb-3 { margin-bottom: var(--space-3); }
.mb-4 { margin-bottom: var(--space-4); }
.mb-5 { margin-bottom: var(--space-5); }
.mb-6 { margin-bottom: var(--space-6); }

.page-header {
    display: flex; justify-content: space-between; align-items: center;
    margin-bottom: var(--space-5); flex-wrap: wrap; gap: var(--space-3);
}
.page-header h1 { margin: 0; }
.page-header__desc { color: var(--color-text-muted); font-size: 13px; margin-top: 4px; }

/* details */
details summary { cursor: pointer; user-select: none; color: var(--color-text-soft); }
details summary:hover { color: var(--color-primary); }

/* 全局动画 */
.fade-in { animation: fadeIn .28s ease; }
.slide-in-up { animation: slideUp .28s ease; }
@keyframes slideUp { from { transform: translateY(10px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }

/* 滚动条 */
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--color-border-strong); border-radius: 4px; }
::-webkit-scrollbar-thumb:hover { background: var(--color-text-muted); }

/* ==========================================================================
   插件市场卡片
   ========================================================================== */
.plugin-card {
    display: flex;
    flex-direction: column;
    transition: transform .2s ease, box-shadow .2s ease;
}
.plugin-card .card__body {
    display: flex;
    flex-direction: column;
    flex: 1;
}
.plugin-card__head {
    display: flex;
    align-items: flex-start;
    gap: var(--space-3);
    margin-bottom: var(--space-3);
}
.plugin-card__icon {
    width: 44px;
    height: 44px;
    flex: 0 0 44px;
    border-radius: var(--radius-md);
    background: linear-gradient(135deg, var(--color-primary-soft), var(--color-primary-light, #c7d2fe));
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 22px;
}
.plugin-card__title-wrap {
    flex: 1;
    min-width: 0;
}
.plugin-card__title {
    display: block;
    font-weight: 700;
    font-size: 16px;
    text-decoration: none;
    color: var(--color-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.plugin-card__title:hover {
    color: var(--color-primary);
}
.plugin-card__meta {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    margin-top: 4px;
    flex-wrap: wrap;
}
.plugin-card__desc {
    color: var(--color-text-soft);
    font-size: 13px;
    line-height: 1.55;
    margin-bottom: var(--space-3);
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    min-height: 2.8em;
}
.plugin-card__events {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin-bottom: var(--space-3);
}
.plugin-card__footer {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-top: auto;
    padding-top: var(--space-2);
    border-top: 1px solid var(--color-border);
}
.plugin-card__stats {
    display: flex;
    align-items: center;
    gap: 4px;
    color: var(--color-text-muted);
    font-size: 13px;
}

/* ==========================================================================
   侧边栏折叠分组 - 主样式已统一移至 .sidebar 主区块,此处保持空白以兼容
   ========================================================================== */

/* 机器人详情页 tab 二级导航 */
.bot-tabs {
    display: flex; gap: 2px;
    border-bottom: 1px solid var(--color-border);
    margin-bottom: var(--space-4);
    overflow-x: auto; -webkit-overflow-scrolling: touch;
}
.bot-tabs__item {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 10px 16px; text-decoration: none; color: var(--color-text-soft);
    border-bottom: 2px solid transparent;
    font-size: 14px; font-weight: 500; white-space: nowrap;
    transition: color .15s ease, border-color .15s ease;
}
.bot-tabs__item:hover { color: var(--color-text); }
.bot-tabs__item.is-active {
    color: var(--color-primary); border-bottom-color: var(--color-primary);
}
.bot-tabs__item .badge { margin-left: 4px; }

/* 调试器结果 */
.debugger-result {
    background: #0f172a; color: #e2e8f0; border-radius: var(--radius-md);
    padding: var(--space-4); font-family: var(--font-mono, monospace);
    font-size: 12px; line-height: 1.6; max-height: 520px; overflow-y: auto;
}
.debugger-result .ok { color: #4ade80; }
.debugger-result .err { color: #f87171; }
.debugger-result .meta { color: #94a3b8; }
.debugger-result .step { padding: 4px 0; border-bottom: 1px solid rgba(255,255,255,.05); }
.kbd {
    display: inline-block; padding: 2px 6px;
    background: var(--color-bg-soft); border: 1px solid var(--color-border);
    border-radius: 4px;
    font-family: var(--font-mono, monospace); font-size: 12px;
}

/* ===== 机器人详情页 Tab 导航 ===== */
.bot-tabs {
    background: var(--color-bg-card, #fff);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-lg);
    margin-bottom: var(--space-4);
    overflow: hidden;
}
.bot-tabs__head {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    padding: var(--space-3) var(--space-4);
    border-bottom: 1px solid var(--color-border);
    background: linear-gradient(180deg, var(--color-bg-soft), transparent);
}
.bot-tabs__back {
    color: var(--color-text-soft);
    font-size: 20px;
    text-decoration: none;
    padding: 0 var(--space-2);
    border-radius: var(--radius-sm);
}
.bot-tabs__back:hover { background: var(--color-bg-soft); color: var(--color-primary); }
.bot-tabs__bot { display: flex; align-items: center; gap: var(--space-2); }
.bot-tabs__name { font-weight: 700; font-size: 15px; line-height: 1.2; }
.bot-tabs__appid { font-size: 11px; color: var(--color-text-muted); font-family: var(--font-mono, monospace); }
.bot-tabs__nav {
    display: flex;
    overflow-x: auto;
    padding: 0 var(--space-3);
    gap: 2px;
}
.bot-tabs__tab {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: var(--space-3) var(--space-3);
    color: var(--color-text-soft);
    text-decoration: none;
    font-size: 14px;
    border-bottom: 2px solid transparent;
    white-space: nowrap;
    transition: color .15s, border-color .15s;
}
.bot-tabs__tab:hover { color: var(--color-text); }
.bot-tabs__tab.is-active {
    color: var(--color-primary);
    border-bottom-color: var(--color-primary);
    font-weight: 600;
}

/* ==========================================================================
   落地页 / 首页 (Landing Page)
   公开访问页面,介绍产品功能,与主后台风格保持一致
   ========================================================================== */

.landing {
    background: var(--color-bg);
    min-height: 100vh;
}

/* ---------- 顶部导航 ---------- */
.landing-nav {
    position: sticky;
    top: 0;
    z-index: 100;
    background: rgba(255, 255, 255, .82);
    backdrop-filter: saturate(180%) blur(14px);
    -webkit-backdrop-filter: saturate(180%) blur(14px);
    border-bottom: 1px solid var(--color-border);
}
.landing-nav__inner {
    max-width: 1200px;
    margin: 0 auto;
    padding: var(--space-3) var(--space-6);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-6);
}
.landing-nav__brand {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    font-size: 16px;
    color: var(--color-text);
}
.landing-nav__brand:hover { color: var(--color-text); }
.landing-nav__logo {
    width: 32px; height: 32px;
    background: linear-gradient(135deg, var(--color-primary), var(--color-accent));
    color: #fff;
    border-radius: var(--radius-md);
    display: grid; place-items: center;
    font-weight: 700;
    box-shadow: var(--shadow-primary);
}
.landing-nav__links {
    display: flex;
    gap: var(--space-6);
}
.landing-nav__links a {
    color: var(--color-text-soft);
    font-size: 14px;
    font-weight: 500;
}
.landing-nav__links a:hover { color: var(--color-primary); }
.landing-nav__cta {
    display: flex;
    gap: var(--space-2);
    align-items: center;
}
.btn--ghost {
    background: transparent;
    color: var(--color-text-soft);
    border: 1px solid transparent;
}
.btn--ghost:hover {
    background: var(--color-primary-soft);
    color: var(--color-primary);
}
.btn--ghost-light {
    background: rgba(255, 255, 255, .12);
    color: #fff;
    border: 1px solid rgba(255, 255, 255, .35);
}
.btn--ghost-light:hover {
    background: rgba(255, 255, 255, .22);
    color: #fff;
}

/* ---------- Hero ---------- */
.landing-hero {
    position: relative;
    max-width: 1200px;
    margin: 0 auto;
    padding: var(--space-12) var(--space-6);
    display: grid;
    grid-template-columns: 1.05fr 1fr;
    gap: var(--space-10);
    align-items: center;
    overflow: visible;
}
.landing-hero__bg {
    position: absolute;
    pointer-events: none;
    inset: -40px 0 0 0;
    background:
        radial-gradient(600px 320px at 12% 18%, rgba(67, 56, 202, .14), transparent 60%),
        radial-gradient(500px 320px at 88% 30%, rgba(109, 40, 217, .12), transparent 60%);
    z-index: 0;
}
.landing-hero__inner {
    position: relative;
    z-index: 1;
}
.landing-badge {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    padding: 6px 12px;
    background: var(--color-primary-soft);
    color: var(--color-primary);
    border-radius: var(--radius-full);
    font-size: 12px;
    font-weight: 600;
    margin-bottom: var(--space-5);
}
.landing-badge__dot {
    width: 6px; height: 6px;
    background: var(--color-success);
    border-radius: 50%;
    box-shadow: 0 0 0 4px rgba(16, 185, 129, .2);
    animation: landingPulse 2s ease-in-out infinite;
}
@keyframes landingPulse {
    0%, 100% { box-shadow: 0 0 0 4px rgba(16, 185, 129, .2); }
    50%      { box-shadow: 0 0 0 8px rgba(16, 185, 129, 0); }
}
.landing-hero__title {
    font-size: 52px;
    line-height: 1.1;
    font-weight: 800;
    letter-spacing: -0.02em;
    margin: 0 0 var(--space-5);
    color: var(--color-text);
}
.landing-hero__title-grad {
    background: linear-gradient(135deg, var(--color-primary), var(--color-accent));
    -webkit-background-clip: text;
    background-clip: text;
    -webkit-text-fill-color: transparent;
    color: transparent;
}
.landing-hero__desc {
    font-size: 17px;
    color: var(--color-text-soft);
    line-height: 1.7;
    margin: 0 0 var(--space-8);
    max-width: 560px;
}
.landing-hero__cta {
    display: flex;
    gap: var(--space-3);
    flex-wrap: wrap;
    margin-bottom: var(--space-6);
}
.landing-hero__meta {
    font-size: 13px;
    color: var(--color-text-muted);
}

/* Hero 右侧装饰(模拟仪表盘) */
.landing-hero__visual {
    position: relative;
    z-index: 1;
}
.landing-mockup {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    overflow: hidden;
    transform: perspective(1400px) rotateY(-6deg) rotateX(3deg);
    transition: transform var(--transition-slow);
}
.landing-mockup:hover {
    transform: perspective(1400px) rotateY(-3deg) rotateX(1deg);
}
.landing-mockup__bar {
    background: var(--color-surface-2);
    border-bottom: 1px solid var(--color-border);
    padding: 10px var(--space-4);
    display: flex;
    align-items: center;
    gap: 6px;
}
.landing-mockup__dot {
    width: 10px; height: 10px;
    border-radius: 50%;
}
.landing-mockup__dot--r { background: #ff5f57; }
.landing-mockup__dot--y { background: #febc2e; }
.landing-mockup__dot--g { background: #28c840; }
.landing-mockup__title {
    margin-left: var(--space-3);
    font-size: 12px;
    color: var(--color-text-muted);
    font-family: var(--font-mono);
}
.landing-mockup__body {
    padding: var(--space-5);
}
.landing-mockup__grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--space-3);
    margin-bottom: var(--space-5);
}
.landing-mockup__stat {
    padding: var(--space-3);
    background: var(--color-primary-soft);
    border-radius: var(--radius-md);
}
.landing-mockup__stat-label {
    font-size: 11px;
    color: var(--color-text-muted);
    margin-bottom: 4px;
}
.landing-mockup__stat-value {
    font-size: 20px;
    font-weight: 700;
    color: var(--color-primary);
}
.landing-mockup__bars {
    display: flex;
    align-items: flex-end;
    gap: var(--space-2);
    height: 120px;
    padding: var(--space-3);
    background: var(--color-surface-2);
    border-radius: var(--radius-md);
}
.landing-mockup__bar-item {
    flex: 1;
    background: linear-gradient(180deg, var(--color-primary), var(--color-accent));
    border-radius: 4px 4px 0 0;
    min-height: 8px;
    transition: opacity var(--transition);
}
.landing-mockup__bar-item:hover { opacity: .8; }
.landing-mockup__caption {
    margin-top: var(--space-2);
    font-size: 11px;
    color: var(--color-text-muted);
    text-align: center;
}

/* ---------- 通用 section ---------- */
.landing-section {
    padding: var(--space-12) var(--space-6);
    max-width: 1200px;
    margin: 0 auto;
}
.landing-section--alt {
    background: var(--color-surface);
    max-width: none;
    border-top: 1px solid var(--color-border);
    border-bottom: 1px solid var(--color-border);
}
.landing-section--alt > * { max-width: 1200px; margin-left: auto; margin-right: auto; }
.landing-section__head {
    text-align: center;
    margin-bottom: var(--space-10);
}
.landing-eyebrow {
    display: inline-block;
    color: var(--color-primary);
    font-size: 13px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    margin-bottom: var(--space-3);
}
.landing-section__title {
    font-size: 36px;
    font-weight: 700;
    letter-spacing: -0.02em;
    margin: 0 0 var(--space-3);
}
.landing-section__desc {
    font-size: 16px;
    color: var(--color-text-soft);
    max-width: 620px;
    margin: 0 auto;
}

/* ---------- 功能卡片 grid ---------- */
.landing-features {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--space-5);
}
.landing-feature {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-lg);
    padding: var(--space-6);
    transition: transform var(--transition), box-shadow var(--transition), border-color var(--transition);
}
.landing-feature:hover {
    transform: translateY(-4px);
    box-shadow: var(--shadow-lg);
    border-color: transparent;
}
.landing-feature__icon {
    width: 48px; height: 48px;
    border-radius: var(--radius-md);
    display: grid; place-items: center;
    font-size: 22px;
    margin-bottom: var(--space-4);
    color: #fff;
}
.landing-feature__title {
    font-size: 17px;
    font-weight: 600;
    margin: 0 0 var(--space-2);
}
.landing-feature__desc {
    font-size: 14px;
    color: var(--color-text-soft);
    line-height: 1.65;
    margin: 0;
}

/* ---------- 使用流程 ---------- */
.landing-steps {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--space-5);
    counter-reset: step;
}
.landing-step {
    position: relative;
    padding: var(--space-5);
    background: var(--color-bg);
    border-radius: var(--radius-lg);
    border: 1px solid var(--color-border);
}
.landing-step__num {
    font-size: 28px;
    font-weight: 800;
    color: var(--color-primary);
    opacity: 0.5;
    margin-bottom: var(--space-3);
    font-family: var(--font-mono);
}
.landing-step h3 {
    font-size: 16px;
    margin: 0 0 var(--space-2);
}
.landing-step p {
    font-size: 13px;
    color: var(--color-text-soft);
    line-height: 1.6;
    margin: 0;
}
.landing-step code {
    font-size: 12px;
    padding: 1px 6px;
    background: var(--color-primary-soft);
    color: var(--color-primary);
    border-radius: 4px;
}

/* ---------- 技术栈 ---------- */
.landing-stack {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: var(--space-4);
}
.landing-stack__item {
    display: flex;
    gap: var(--space-5);
    padding: var(--space-5);
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-lg);
    align-items: center;
}
.landing-stack__k {
    flex: 0 0 140px;
    font-weight: 700;
    color: var(--color-primary);
    font-family: var(--font-mono);
    font-size: 15px;
}
.landing-stack__v {
    color: var(--color-text-soft);
    font-size: 14px;
}

/* ---------- CTA 区段 ---------- */
.landing-cta {
    background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-accent) 100%);
    color: #fff;
    position: relative;
    overflow: hidden;
}
.landing-cta::before, .landing-cta::after {
    content: "";
    position: absolute;
    border-radius: 50%;
    filter: blur(80px);
    opacity: 0.4;
    pointer-events: none;
}
.landing-cta::before {
    width: 400px; height: 400px;
    background: #c4b5fd;
    top: -120px; right: -100px;
}
.landing-cta::after {
    width: 300px; height: 300px;
    background: #818cf8;
    bottom: -80px; left: -60px;
}
.landing-cta__inner {
    max-width: 800px;
    margin: 0 auto;
    padding: var(--space-12) var(--space-6);
    text-align: center;
    position: relative;
    z-index: 1;
}
.landing-cta h2 {
    color: #fff;
    font-size: 32px;
    margin: 0 0 var(--space-3);
    letter-spacing: -0.02em;
}
.landing-cta p {
    color: rgba(255, 255, 255, .85);
    font-size: 16px;
    margin: 0 0 var(--space-6);
}
.landing-cta__btns {
    display: flex;
    gap: var(--space-3);
    justify-content: center;
    flex-wrap: wrap;
}

/* ---------- 页脚 ---------- */
.landing-footer {
    border-top: 1px solid var(--color-border);
    background: var(--color-surface);
}
.landing-footer__inner {
    max-width: 1200px;
    margin: 0 auto;
    padding: var(--space-6);
    display: flex;
    justify-content: space-between;
    align-items: center;
    color: var(--color-text-muted);
    font-size: 13px;
    flex-wrap: wrap;
    gap: var(--space-3);
}
.landing-footer__meta {
    font-family: var(--font-mono);
}

/* ---------- 响应式 ---------- */
@media (max-width: 980px) {
    .landing-hero {
        grid-template-columns: 1fr;
        padding: var(--space-8) var(--space-5);
    }
    .landing-hero__visual { display: none; }
    .landing-hero__title { font-size: 38px; }
    .landing-section { padding: var(--space-10) var(--space-5); }
    .landing-section__title { font-size: 26px; }
    .landing-features { grid-template-columns: repeat(2, 1fr); }
    .landing-steps { grid-template-columns: repeat(2, 1fr); }
    .landing-stack { grid-template-columns: 1fr; }
    .landing-nav__links { display: none; }
}
@media (max-width: 600px) {
    .landing-hero__title { font-size: 30px; }
    .landing-features { grid-template-columns: 1fr; }
    .landing-steps { grid-template-columns: 1fr; }
    .landing-cta h2 { font-size: 24px; }
    .landing-nav__inner { padding: var(--space-3); }
    .landing-mockup__grid { grid-template-columns: repeat(2, 1fr); }
}
