/* :root Variables - 全局设计变量 */ :root { --primary-color: #007aff; --primary-rgb: 0, 122, 255; --secondary-color: #5856d6; --accent-color: #ff9500; --accent-color-rgb: 255, 149, 0; --success-color: #34c759; --error-color: #ff3b30; --info-color: #5ac8fa; --transition-duration: 300ms; --border-radius: 16px; --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; /* Opacity Variables - Added for customization */ --background-opacity: 1.0; --card-opacity: 0.7; --navbar-opacity: 1.0; --success-color-rgb: 52, 199, 89; /* 2025设计:苹果灵动岛风格动画曲线 */ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); --ease-smooth: cubic-bezier(0.25, 0.8, 0.25, 1); --ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55); } /* --- Light Theme - 白天模式 --- */ body[data-theme="light"] { --bg-color-rgb: 247, 247, 249; --card-background-rgb: 255, 255, 255; --text-color: #1d1d1f; --text-secondary: #6e6e73; --border-color: rgba(0, 0, 0, 0.1); --shadow-color: rgba(0, 0, 0, 0.05); --shadow-color-hover: rgba(0, 0, 0, 0.15); --glow-color: rgba(var(--primary-rgb), 0.2); --tag-bg-color: rgba(0, 0, 0, 0.05); transition: background-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), color 0.4s cubic-bezier(0.4, 0, 0.2, 1); } /* --- Dark Theme - 黑夜模式 --- */ body[data-theme="dark"] { --bg-color-rgb: 22, 22, 24; --card-background-rgb: 29, 29, 31; --text-color: #f5f5f7; --text-secondary: #86868b; --border-color: rgba(255, 255, 255, 0.15); --shadow-color: rgba(0, 0, 0, 0.2); --shadow-color-hover: rgba(0, 0, 0, 0.4); --glow-color: rgba(var(--primary-rgb), 0.3); --tag-bg-color: rgba(255, 255, 255, 0.1); transition: background-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), color 0.4s cubic-bezier(0.4, 0, 0.2, 1); } /* --- General Styles & Transitions --- */ * { margin: 0; padding: 0; box-sizing: border-box; font-family: var(--font-family); } /* [重构] 主题过渡期间的特殊处理 */ html.theme-transitioning, html.theme-transitioning * { transition: background-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), color 0.4s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important; } /* 确保文字在过渡期间保持可见 */ html.theme-transitioning body, html.theme-transitioning .text-primary, html.theme-transitioning .text-secondary, html.theme-transitioning h1, html.theme-transitioning h2, html.theme-transitioning h3, html.theme-transitioning p, html.theme-transitioning span, html.theme-transitioning div, html.theme-transitioning button, html.theme-transitioning a { color: inherit !important; opacity: 1 !important; will-change: color, background-color; } html, body { height: 100vh; width: 100vw; color: var(--text-color); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; background-color: transparent; transition: background-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), color 0.4s cubic-bezier(0.4, 0, 0.2, 1); } /* 更新 body#app-body 样式,使其成为一个透明的圆角容器 */ body#app-body { display: flex; position: relative; /* 为伪元素定位提供上下文 */ border-radius: 16px; background: transparent; /* 自身保持透明 */ transition: color var(--transition-duration) ease; overflow: hidden; /* 确保内容不会超出圆角 */ } /* 新增伪元素,用于绘制背景和毛玻璃效果 */ body#app-body::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(var(--bg-color-rgb), var(--background-opacity)); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); z-index: -2; /* 确保它在所有内容甚至背景图层之后 */ transition: background-color var(--transition-duration) ease; border-radius: 16px; /* 匹配外层圆角 */ overflow: hidden; /* 确保内容不超出圆角 */ } /* --- Custom Background Layer --- */ #background-layer { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; z-index: -1; /* z-index -1 会让它显示在伪元素之上,内容之下 */ background-size: cover; background-position: center; background-repeat: no-repeat; transition: opacity 0.5s ease-in-out; } button, .card, .nav-btn, .window-control-btn, .category-card, .subcategory-card, .tool-card { transition: all var(--transition-duration) cubic-bezier(0.25, 0.8, 0.25, 1); } /* [重构] 主题切换期间的特殊处理 */ html.theme-transitioning button, html.theme-transitioning .card, html.theme-transitioning .nav-btn, html.theme-transitioning .window-control-btn, html.theme-transitioning .category-card, html.theme-transitioning .subcategory-card, html.theme-transitioning .tool-card { transition: background-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), color 0.4s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important; } /* --- Enhanced Typography & Gradient Text --- */ h1, h2, h3 { letter-spacing: -0.01em; font-weight: 700; transition: color 0.4s cubic-bezier(0.4, 0, 0.2, 1); } /* [重构] 主题切换期间确保文字可见 */ html.theme-transitioning h1, html.theme-transitioning h2, html.theme-transitioning h3, html.theme-transitioning p, html.theme-transitioning span, html.theme-transitioning div, html.theme-transitioning label { color: inherit !important; opacity: 1 !important; will-change: color; } h1 { font-size: 28px; } h2 { font-size: 22px; } p { color: var(--text-secondary); line-height: 1.6; } .gradient-text { background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; } .category-card:hover h2, .tool-card:hover h2 { color: var(--primary-color); } /* Page Transition */ @keyframes contentFadeIn { from { opacity: 0; transform: translateY(15px); } to { opacity: 1; transform: translateY(0); } } /* Splash Screen */ .splash-container { width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; background-color: rgba(var(--bg-color-rgb), 1); } .splash-logo { font-size: 50px; color: var(--primary-color); margin-bottom: 20px; } .splash-title { font-size: 24px; font-weight: 600; margin-bottom: 20px; } .splash-progress-container { width: 80%; max-width: 300px; height: 8px; background-color: var(--border-color); border-radius: 4px; overflow: hidden; margin-bottom: 15px; } .splash-progress-bar { height: 100%; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); transition: width 0.4s ease; } .splash-status { font-size: 14px; color: var(--text-secondary); } /* Main Layout, Navbar, Title Bar */ .navbar { width: 70px; background-color: rgba(var(--card-background-rgb), var(--navbar-opacity)); display: flex; flex-direction: column; align-items: center; padding: 20px 0; border-right: 1px solid var(--border-color); z-index: 10; flex-shrink: 0; transition: background-color var(--transition-duration) ease; } .main-content { flex: 1; display: flex; flex-direction: column; overflow: hidden; background-color: transparent; border-radius: 16px; overflow: hidden; /* 确保内容不超出圆角 */ } .nav-spacer { flex-grow: 1; } .title-bar { height: 40px; display: flex; justify-content: flex-end; align-items: center; padding: 0 10px; -webkit-app-region: drag; z-index: 5; border-bottom: 1px solid var(--border-color); flex-shrink: 0; } .window-controls { display: flex; -webkit-app-region: no-drag; } .window-control-btn { width: 32px; height: 32px; border: none; background: transparent; color: var(--text-secondary); cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 14px; border-radius: 8px; } .window-control-btn:hover { background-color: var(--border-color); } #close-btn:hover, #close-btn-offline:hover { background-color: var(--error-color); color: white; } .network-status { font-size: 18px; margin-bottom: 8px; } .network-status.online { color: var(--success-color); } .network-status.offline { color: var(--error-color); } .network-speed { font-size: 11px; color: var(--text-secondary); display: flex; align-items: center; gap: 4px; height: 20px; } .content-area { flex: 1; padding: 40px; /* [修复 1] 移除页面滚动条,强制内容在 flex 容器内 */ overflow-y: hidden; /* [修复 1] 确保 flex 布局高度计算正确 */ min-height: 0; border-radius: 0 0 16px 16px; /* 底部圆角 */ } .page-container { width: 100%; height: 100%; } /* --- Enhanced Button Styles & Ripple Effect --- */ .action-btn, .control-btn, .back-btn, .update-button, .view-subcategory-btn, .page-btn { position: relative; overflow: hidden; -webkit-tap-highlight-color: transparent; transition: transform 0.2s cubic-bezier(0.22, 1, 0.36, 1), box-shadow 0.2s cubic-bezier(0.22, 1, 0.36, 1), background-color 0.2s ease; } .action-btn:hover:not(:disabled), .control-btn:hover:not(:disabled), .back-btn:hover, .update-button:hover:not(:disabled), .view-subcategory-btn:hover, .page-btn:hover:not(:disabled) { transform: translateY(-3px); box-shadow: 0 8px 20px var(--shadow-color-hover); } .action-btn:active:not(:disabled), .control-btn:active:not(:disabled), .back-btn:active, .update-button:active:not(:disabled), .view-subcategory-btn:active, .page-btn:active:not(:disabled) { transform: translateY(-1px) scale(0.98); box-shadow: 0 4px 10px var(--shadow-color-hover); transition-duration: 0.1s; } .action-btn.mini-btn { padding: 6px 12px; font-size: 14px; border-radius: 12px; } .ripple-effect { position: absolute; border-radius: 50%; background-color: rgba(255, 255, 255, 0.6); transform: scale(0); animation: ripple-animation 600ms linear; pointer-events: none; } @keyframes ripple-animation { to { transform: scale(4); opacity: 0; } } /* Nav Button Style */ .nav-btn { width: 44px; height: 44px; border-radius: 12px; background-color: transparent; border: none; color: var(--text-secondary); font-size: 20px; margin-bottom: 20px; cursor: pointer; display: flex; align-items: center; justify-content: center; position: relative; overflow: hidden; } .nav-btn:hover:not(.active) { background-color: var(--border-color); color: var(--primary-color); transform: scale(1.1); } .nav-btn.active { color: white; transform: scale(1); background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); animation: gradient-spin 5s linear infinite; background-size: 200% 200%; box-shadow: 0 6px 15px rgba(var(--primary-rgb), 0.4); } @keyframes gradient-spin { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } .nav-btn.active:hover { filter: brightness(1.2); } /* All Cards Style with Glow Effect */ .category-card, .subcategory-card, .tool-card, .announcement-card, .changelog-card, .settings-section, .welcome-card, .dashboard-card { /* dashboard-card inherits base styles */ background-color: rgba(var(--card-background-rgb), var(--card-opacity)); backdrop-filter: blur(12px) saturate(180%); -webkit-backdrop-filter: blur(12px) saturate(180%); border-radius: var(--border-radius); border: 1px solid var(--border-color); box-shadow: 0 4px 15px var(--shadow-color); transition: transform var(--transition-duration) ease, box-shadow var(--transition-duration) ease, border-color var(--transition-duration) ease, background-color var(--transition-duration) ease; } .category-card:hover, .subcategory-card:hover, .tool-card:hover:not(.disabled), .welcome-card:hover, .dashboard-card:hover { transform: translateY(-8px) scale(1.02); box-shadow: 0 12px 25px var(--shadow-color-hover), 0 0 25px var(--glow-color); border-color: rgba(var(--primary-rgb), 0.4); } .category-card, .subcategory-card, .welcome-card, .welcome-header, .dashboard-card { opacity: 0; /* for entrance animation */ } /* Category & Subcategory Card Specifics */ .category-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 24px; } .category-card { padding: 24px; text-align: center; } .category-icon { font-size: 28px; width: 60px; height: 60px; border-radius: 50%; background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); display: flex; align-items: center; justify-content: center; margin: 0 auto 15px; color: white; transition: transform var(--transition-duration) ease; } .category-card:hover .category-icon { transform: rotate(15deg) scale(1.1); } .subcategory-page-container { height: 100%; display: flex; flex-direction: column; } .subcategory-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; flex-grow: 1; overflow-y: auto; padding-right: 10px; align-content: start; } .subcategory-grid::-webkit-scrollbar { display: none; } .subcategory-grid { -ms-overflow-style: none; scrollbar-width: none; } .subcategory-card { overflow: hidden; display: flex; flex-direction: column; } .subcategory-thumbnail { width: 100%; height: 160px; overflow: hidden; } .subcategory-thumbnail img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s ease; } .subcategory-card:hover .subcategory-thumbnail img { transform: scale(1.05); } .subcategory-content { padding: 15px; flex-grow: 1; display: flex; flex-direction: column; } .subcategory-content h3 { margin-bottom: 8px; } .subcategory-content p { flex-grow: 1; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; text-overflow: ellipsis; font-size: 14px; } .view-subcategory-btn { display: block; width: 100%; padding: 12px; background-color: transparent; border: none; border-top: 1px solid var(--border-color); color: var(--primary-color); cursor: pointer; font-size: 14px; font-weight: 600; } /* Media Viewer Layout */ .media-viewer { display: flex; flex-direction: column; height: 100%; animation: contentFadeIn 0.5s cubic-bezier(0.25, 0.8, 0.25, 1) forwards; } .media-viewer .section-header, .media-viewer .media-controls { flex-shrink: 0; } .media-viewer .media-controls { margin-top: 20px; } .media-container { width: 100%; background-color: #000; border-radius: var(--border-radius); overflow: hidden; position: relative; display: flex; align-items: center; justify-content: center; border: 1px solid var(--border-color); flex-grow: 1; min-height: 0; transition: background-image 0.3s ease, filter 0.3s ease, transform 0.3s ease; } .media-content, .media-loading { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; } .media-content img, .media-content video { width: 100%; height: 100%; max-width: 100%; max-height: 100%; object-fit: contain; display: block; } .media-loading { position: absolute; top: 0; left: 0; background-color: rgba(0, 0, 0, 0.5); flex-direction: column; gap: 15px; opacity: 1; transition: opacity 0.3s ease; z-index: 5; } .media-loading.hidden { opacity: 0; pointer-events: none; } .media-progress-container { width: 80%; max-width: 300px; height: 6px; background-color: rgba(255, 255, 255, 0.2); border-radius: 3px; overflow: hidden; } .media-progress-bar { height: 100%; width: 0%; background-color: var(--primary-color); border-radius: 3px; transition: width 0.3s cubic-bezier(0.25, 1, 0.5, 1); } /* 全局加载动画容器 */ .loading-container { display: flex; flex-direction: column; justify-content: center; align-items: center; width: 100%; height: 100%; text-align: center; gap: 20px; } /* 加载GIF动图样式 */ .loading-gif { max-width: 300px; width: 40vw; min-width: 150px; height: auto; object-fit: contain; } /* 加载动画下方的文字 */ .loading-text { color: var(--text-secondary); font-size: 16px; font-weight: 600; animation: contentFadeIn 0.5s; } /* 针对缩略图的加载动画覆盖层 */ .loading-spinner-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(var(--card-background-rgb), 0.5); display: flex; justify-content: center; align-items: center; transition: opacity 0.3s ease; pointer-events: none; /* 确保覆盖层不影响鼠标事件 */ } .loading-spinner-overlay .loading-gif { width: 50px; height: 50px; min-width: auto; } /* Button Base Styles */ .action-btn, .control-btn, .back-btn { border-radius: var(--border-radius); padding: 10px 18px; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 8px; font-weight: 600; font-size: 15px; border: none; } .action-btn { background-color: var(--primary-color); color: white; } .action-btn.error-btn { background-color: var(--error-color); } .control-btn, .back-btn { background-color: var(--card-background); color: var(--text-color); border: 1px solid var(--border-color); } .control-btn:hover, .back-btn:hover { border-color: rgba(var(--primary-rgb), 0.5); } .section-header { display: flex; align-items: center; margin-bottom: 30px; gap: 15px; flex-shrink: 0; } /* 新的设置页面主容器 */ /* 更新style.css中的设置页面样式 */ .settings-page-container { display: grid; grid-template-columns: 240px 1fr; gap: 24px; height: 100%; padding: 20px; box-sizing: border-box; } @media (max-width: 768px) { .settings-page-container { grid-template-columns: 1fr; } .settings-nav { width: 100%; margin-bottom: 20px; } } .settings-nav-group { margin-bottom: 30px; } .settings-nav-group-title { font-size: 12px; text-transform: uppercase; letter-spacing: 1px; color: var(--text-secondary); margin-bottom: 12px; padding-left: 15px; } .settings-search { padding: 10px 15px; margin-bottom: 20px; border-radius: 8px; border: 1px solid var(--border-color); background-color: var(--card-background); color: var(--text-color); width: 100%; box-sizing: border-box; } .settings-content { background-color: var(--card-background); border-radius: var(--border-radius); padding: 30px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); overflow-y: auto; } .setting-item { margin-bottom: 24px; animation: fadeIn 0.3s ease; } .setting-item-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; } .setting-item-title { font-weight: 600; font-size: 16px; } .setting-item-description { color: var(--text-secondary); font-size: 14px; margin-bottom: 12px; max-width: 80%; } /* 左侧导航按钮 */ .settings-nav-item { width: 100%; padding: 12px 15px; border: none; background-color: transparent; color: var(--text-secondary); font-size: 15px; font-weight: 600; cursor: pointer; border-radius: 12px; display: flex; align-items: center; gap: 12px; text-align: left; transition: background-color 0.2s ease, color 0.2s ease; } .settings-nav-item:hover:not(.active) { background-color: rgba(var(--text-color), 0.04); color: var(--text-color); transform: translateX(2px); transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } .settings-nav-item.active { background-color: var(--primary-color); color: white; box-shadow: 0 4px 10px rgba(var(--primary-rgb), 0.3); } /* 右侧内容区 */ .settings-content { flex-grow: 1; overflow-y: auto; /* 只让右侧内容区滚动 */ height: 100%; } /* 右侧的每个独立面板 */ .settings-panel { display: none; /* 默认隐藏 */ animation: contentFadeIn 0.4s forwards; } .settings-panel.active { display: block; /* 点击导航后显示 */ } .settings-panel .settings-section:not(:last-child) { margin-bottom: 20px; } .settings-panel .info-grid { grid-template-columns: 150px 1fr; } .settings-panel .info-grid.horizontal { display: flex; flex-wrap: wrap; gap: 20px; border-bottom: none; padding: 10px 0; } .settings-panel .info-grid.horizontal .info-item { display: flex; flex-direction: column; background-color: var(--border-color); padding: 10px 15px; border-radius: 8px; flex-basis: 200px; flex-grow: 1; } .settings-panel .info-grid.horizontal .info-label { font-size: 13px; } .settings-panel .info-grid.horizontal .info-value { font-size: 16px; font-weight: 600; } /* 左下角的状态监控面板 */ #settings-status-panel { padding: 15px; margin-top: 20px; border-top: 1px solid var(--border-color); } .status-panel-title { font-size: 14px; font-weight: 600; color: var(--text-secondary); margin-bottom: 15px; text-align: center; } .settings-section { padding: 24px; display: flex; flex-direction: column; } .settings-section h2 { margin-bottom: 20px; flex-shrink: 0; } .settings-row { display: flex; justify-content: space-between; align-items: center; padding: 12px 0; border-bottom: 1px solid var(--border-color); flex-shrink: 0; } .info-row { display: flex; justify-content: space-between; align-items: center; padding: 8px 0; border-bottom: 1px solid var(--border-color); flex-shrink: 0; } .info-row span:first-child { color: var(--text-secondary); font-weight: 500; margin-right: 15px; } .settings-section>*:last-child { border-bottom: none; } .about-buttons { display: flex; gap: 15px; margin-top: auto; padding-top: 15px; } .about-buttons .control-btn { flex: 1; } /* --- Collapsible Styles --- */ .collapsible-trigger { cursor: pointer; } .collapsible-trigger .icon-toggle { display: inline-block; margin-left: 10px; transition: transform var(--transition-duration) ease; } .collapsible-trigger .icon-toggle::before { content: '\f078'; font-family: "Font Awesome 6 Free"; font-weight: 900; } .collapsible-trigger.expanded .icon-toggle { transform: rotate(-180deg); } .collapsible-content { max-height: 0; overflow: hidden; transition: max-height 0.35s ease-in-out; padding-left: 15px; border-top: 1px solid transparent; } .collapsible-content.expanded { max-height: 200px; border-top: 1px solid var(--border-color); margin-top: 12px; } .collapsible-content .settings-row { border-bottom: none; padding: 8px 0; } .collapsible-content .settings-row:first-child { padding-top: 12px; } /* Opacity Controls */ .opacity-control { display: flex; align-items: center; gap: 10px; width: 100%; } .opacity-control input[type="range"] { flex: 1; transition: opacity 0.2s ease; } .opacity-control input[type="range"]:disabled { opacity: 0.4; cursor: not-allowed; } .background-controls button { pointer-events: all; } /* Stats Card */ .stats-display { font-size: 28px; font-weight: 700; text-align: center; margin: auto 0; } .stats-label { text-align: center; color: var(--text-secondary); } /* Theme Switch */ .theme-switch { position: relative; display: inline-block; width: 56px; height: 30px; } .theme-switch input { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: var(--border-color); transition: var(--transition-duration); border-radius: 30px; display: flex; align-items: center; } .slider:before { position: absolute; content: ""; height: 22px; width: 22px; left: 4px; bottom: 4px; background-color: white; transition: var(--transition-duration); border-radius: 50%; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } input:checked+.slider:before { transform: translateX(26px); } input:checked+.slider { background-color: var(--primary-color); } .slider::after { font-family: "Font Awesome 6 Free"; font-weight: 900; font-size: 14px; position: absolute; transition: all var(--transition-duration) ease; } body[data-theme="light"] .slider::after { content: '\f185'; color: #f39c12; right: 8px; } body[data-theme="dark"] .slider::after { content: '\f186'; color: #f1c40f; left: 8px; } /* Update Management Card (Internal Scroll) */ .update-section-content { display: flex; flex-direction: column; flex-grow: 1; min-height: 0; } #update-check-wrapper { text-align: center; padding-bottom: 20px; flex-shrink: 0; } #update-button { position: relative; width: 150px; height: 44px; border: none; border-radius: 22px; background-color: var(--primary-color); color: white; font-size: 16px; font-weight: 600; cursor: pointer; overflow: hidden; } #update-button:disabled { opacity: 0.7; cursor: not-allowed; } #update-button.checking .scan-bar { display: block; animation: scan 1.5s ease-in-out infinite; } .scan-bar { display: none; position: absolute; top: 0; left: -50px; width: 40px; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent); transform: skewX(-25deg); } @keyframes scan { from { left: -50px; } to { left: 160px; } } #update-info-container { flex-grow: 1; overflow-y: auto; padding: 0 10px; min-height: 0; } #update-info p.accent { color: var(--accent-color); font-weight: 600; } #update-info p.success { color: var(--success-color); font-weight: 600; } #update-info p.error { color: var(--error-color); font-weight: 600; } .update-notes-container { border: 1px solid var(--border-color); border-radius: 12px; padding: 15px; margin: 15px 0; background-color: rgba(var(--bg-color-rgb), 0.5); } .update-notes-list { list-style-type: none; padding-left: 0; display: flex; flex-direction: column; gap: 12px; } .update-note-item { display: grid; grid-template-columns: 80px 1fr; gap: 10px; align-items: baseline; font-size: 14px; } .note-key { font-weight: 600; color: var(--text-secondary); text-align: right; } .note-value { text-align: left; } .update-actions { display: flex; gap: 15px; margin-top: 20px; justify-content: center; } /* New Update Download UI */ .update-download-ui { border: 1px solid var(--border-color); border-radius: 12px; padding: 20px; text-align: left; } .update-download-ui .version-tag { font-size: 16px; font-weight: bold; color: var(--primary-color); margin-bottom: 10px; } .update-download-ui .status-text { font-size: 14px; margin-bottom: 10px; display: flex; justify-content: space-between; } .download-progress-bar-container { width: 100%; height: 10px; background-color: var(--border-color); border-radius: 5px; overflow: hidden; margin-bottom: 10px; } .download-progress-bar { height: 100%; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); transition: width 0.3s ease; } .download-controls { margin-top: 15px; display: flex; justify-content: center; gap: 15px; } /* Toast Notifications */ #toast-container { position: fixed; bottom: 20px; right: 20px; z-index: 9999; display: flex; flex-direction: column-reverse; align-items: flex-end; gap: 10px; } .toast-notification { min-width: 280px; max-width: 350px; background-color: rgba(var(--card-background-rgb), 0.8); backdrop-filter: blur(12px) saturate(180%); -webkit-backdrop-filter: blur(12px) saturate(180%); color: var(--text-color); padding: 12px 16px; border-radius: var(--border-radius); box-shadow: 0 4px 15px var(--shadow-color); display: flex; align-items: center; gap: 12px; border: 1px solid var(--border-color); pointer-events: auto; opacity: 0; transform: translateY(20px); transition: transform 0.4s cubic-bezier(0.215, 0.610, 0.355, 1), opacity 0.4s cubic-bezier(0.215, 0.610, 0.355, 1); } .toast-notification.show { opacity: 1; transform: translateY(0); } .toast-notification .icon { font-size: 20px; } .toast-notification.success .icon { color: var(--success-color); } .toast-notification.error .icon { color: var(--error-color); } .toast-notification.info .icon { color: var(--info-color); } .toast-notification .content h4 { font-size: 15px; font-weight: 600; margin: 0 0 2px; color: var(--text-color); } .toast-notification .content p, .toast-notification .content div { font-size: 13px; color: var(--text-secondary); line-height: 1.3; } /* Scrollbar */ ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background-color: var(--border-color); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background-color: var(--text-secondary); } /* --- Welcome Page / Dashboard Styles (Re-architected for Full Height) --- */ .welcome-dashboard { display: flex; flex-direction: column; gap: 20px; height: 100%; /* 核心:让仪表盘容器撑满父元素高度 */ } .welcome-dashboard .welcome-header { text-align: left; flex-shrink: 0; /* 不允许头部被压缩 */ } .welcome-dashboard .announcement-card { flex-shrink: 0; /* 不允许公告卡片被压缩 */ } .welcome-dashboard .welcome-header p { font-size: 16px; margin-top: 5px; } /* -- Grid Layout: 占据剩余所有空间 -- */ .dashboard-grid { flex-grow: 1; min-height: 0; display: grid; gap: 20px; grid-template-columns: 1fr 1fr; grid-template-rows: auto 1fr; } @media (max-width: 1024px) { /* 当屏幕宽度小于 1024px 时 */ .dashboard-grid { /* 1. 变为单列布局 */ grid-template-columns: 1fr; /* 2. 定义三行:系统概览(auto), 快捷启动(auto), 更新日志(1fr 占满剩余) */ grid-template-rows: auto auto 1fr; } /* 确保更新日志卡片在单列时仍然横跨 (虽然默认就是 1fr,但显式声明更安全) */ .dashboard-grid .changelog-card { grid-column: 1 / -1; } } .dashboard-card { display: flex; flex-direction: column; overflow: hidden; /* 确保卡片本身不会出现滚动条 */ } .dashboard-card .card-content { padding: 15px 20px; /* 减小内边距,为版本卡片争取空间 */ flex-grow: 1; display: flex; flex-direction: column; gap: 10px; /* 减小间距 */ } .dashboard-card .info-row.compact { padding: 4px 0; border: none; } /* -- 让版本更新卡片横跨两列 -- */ .dashboard-grid .changelog-card { grid-column: 1 / -1; /* 横跨所有列 */ min-height: 0; /* flex容器内的子项需要这个来正确计算高度 */ } /* -- 使版本更新列表内部可以滚动 -- */ .dashboard-card .changelog-list { flex-grow: 1; /* 占据卡片内所有可用垂直空间 */ overflow-y: auto; /* 内容超出时显示滚动条 */ min-height: 0; /* 配合flex-grow,确保正确的高度约束 */ padding: 0 20px 20px; margin-right: -10px; /* 优化滚动条视觉效果 */ padding-right: 10px; } /* -- System Overview Card -- */ .system-overview-card .info-row span:first-child { color: var(--text-color); } /* -- Quick Launch Card -- */ .quick-launch-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; height: 100%; } .quick-launch-btn { background-color: transparent; border: 1px solid var(--border-color); color: var(--text-secondary); border-radius: var(--border-radius); padding: 10px; font-size: 14px; font-weight: 600; cursor: pointer; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; transition: all 0.2s ease-in-out; } .quick-launch-btn i { font-size: 22px; color: var(--text-color); transition: color 0.2s ease-in-out; } .quick-launch-btn:hover { background-color: var(--border-color); color: var(--text-color); border-color: var(--primary-color); } .quick-launch-btn:hover i { color: var(--primary-color); } .welcome-card-header { display: flex; justify-content: space-between; align-items: center; padding: 16px 24px; border-bottom: 1px solid var(--border-color); flex-shrink: 0; } .welcome-card-header h2, .welcome-card-header h3 { margin: 0; display: flex; align-items: center; gap: 10px; } .announcement-content { padding: 24px; } .latest-tag { background-color: var(--success-color); color: white; padding: 4px 10px; font-size: 12px; font-weight: 600; border-radius: 20px; } .changelog-list { display: flex; flex-direction: column; gap: 15px; } .changelog-item { display: block; /* 移除 grid 布局 */ padding-bottom: 15px; margin-bottom: 15px; border-bottom: 1px solid var(--border-color); } .changelog-item:last-child { border-bottom: none; margin-bottom: 0; } .changelog-key { font-weight: 600; color: var(--text-secondary); text-align: left; /* 变为左对齐 */ font-size: 14px; background-color: var(--tag-bg-color); padding: 4px 10px; border-radius: 6px; display: inline-block; /* 变为标签样式 */ margin-bottom: 12px; /* 与下方内容拉开距离 */ } /* --- [修复 2] 更新日志内容自适应换行 --- */ .changelog-value { font-size: 15px; color: var(--text-color); white-space: normal; /* 允许自动换行 */ word-wrap: break-word; /* 强制长单词断开 */ line-height: 1.6; } /* [修复 2] 确保
标签在日志中样式正确 */ .changelog-value br { display: block; content: ""; margin-top: 8px; } .changelog-value b, .changelog-value strong { color: var(--primary-color); font-weight: 600; } .version-display { position: fixed; bottom: 10px; right: 15px; font-size: 12px; color: var(--text-secondary); background-color: rgba(var(--card-background-rgb), var(--card-opacity)); padding: 4px 8px; border-radius: 6px; border: 1px solid var(--border-color); z-index: 100; } /* Toolbox */ .toolbox-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 24px; /* margin-top: 40px; <-- 删除这一行 */ justify-content: start; align-content: start; } .tool-card { padding: 24px; text-align: center; cursor: pointer; } .tool-card.disabled { opacity: 0.5; cursor: not-allowed; filter: grayscale(80%); } .tool-card.disabled:hover { transform: none; box-shadow: 0 4px 15px var(--shadow-color); border-color: var(--border-color); } .tool-icon { font-size: 32px; width: 64px; height: 64px; border-radius: 50%; background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); display: flex; align-items: center; justify-content: center; margin: 0 auto 15px; color: white; transition: transform 0.5s cubic-bezier(0.25, 0.8, 0.25, 1); } .tool-card:hover .tool-icon { transform: rotate(15deg) scale(1.1); } .tool-card h2 { margin-bottom: 8px; } /* Pagination */ .pagination-container { display: flex; justify-content: center; align-items: center; gap: 8px; margin-top: 30px; flex-shrink: 0; } .page-btn { width: 36px; height: 36px; border-radius: 8px; border: 1px solid var(--border-color); background-color: var(--card-background); color: var(--text-color); font-size: 14px; font-weight: 600; cursor: pointer; } .page-btn:hover:not(:disabled) { background-color: var(--primary-color); color: white; border-color: var(--primary-color); } .page-btn.active { background-color: var(--primary-color); color: white; border-color: var(--primary-color); } .page-btn:disabled { opacity: 0.5; cursor: not-allowed; } /* Media Viewer & Volume */ .media-controls { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; } .media-status-text { margin-left: auto; color: var(--text-secondary); font-size: 14px; } .volume-control { display: flex; align-items: center; gap: 10px; color: var(--text-secondary); } #volume-slider { -webkit-appearance: none; appearance: none; width: 120px; height: 6px; background: var(--border-color); border-radius: 3px; outline: none; } #volume-slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 16px; height: 16px; background: var(--text-color); cursor: pointer; border-radius: 50%; border: 2px solid var(--card-background); transition: background-color 0.2s ease; } #volume-slider::-webkit-slider-thumb:hover { background: var(--primary-color); } #volume-slider::-moz-range-thumb { width: 16px; height: 16px; background: var(--text-color); cursor: pointer; border-radius: 50%; border: 2px solid var(--card-background); } /* Navigation Header */ .section-header { display: flex; align-items: center; margin-bottom: 30px; gap: 15px; } .section-header .back-btn { flex-shrink: 0; } .section-header h1 { flex-grow: 1; text-align: center; margin: 0; padding: 0 15px; } /* Logs Page Specifics */ .logs-header { justify-content: flex-start; } .logs-header h1 { text-align: left; flex-grow: 0; margin: 0; } .logs-header::after { display: none; } .logs-controls { margin-left: auto; display: flex; align-items: center; gap: 10px; } .log-entry:last-child { border-bottom: none; } .log-timestamp { color: var(--text-secondary); font-family: monospace; font-size: 13px; } .log-tag { padding: 4px 10px; border-radius: 8px; font-size: 12px; font-weight: 600; display: inline-flex; align-items: center; gap: 6px; background-color: var(--tag-bg-color); } .log-category-system { color: var(--info-color); } .log-category-navigation { color: var(--accent-color); } .log-category-ui { color: var(--secondary-color); } .log-category-media { color: #f51871; } .log-category-update { color: var(--success-color); } .log-category-settings { color: #a25aff; } .log-category-general { color: var(--text-secondary); } .log-category-error { color: var(--error-color); } .log-action { flex: 1; color: var(--text-color); word-break: break-all; white-space: pre-wrap; } .log-category-tool { color: #8e44ad; /* 紫色,代表工具 */ } .log-category-sub { background-color: var(--border-color); color: var(--text-secondary); border: 1px solid var(--border-color); } .empty-logs-placeholder { display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: 60px 20px; color: var(--text-secondary); } .empty-logs-placeholder i { font-size: 40px; margin-bottom: 20px; } .empty-logs-placeholder p { font-size: 16px; font-weight: 600; color: var(--text-color); } .empty-logs-placeholder span { font-size: 13px; margin-top: 5px; } /* Offline Mode */ .offline-container { width: 100vw; height: 100vh; background: linear-gradient(-45deg, #131313, #2c3e50, #34495e, #131313); background-size: 400% 400%; animation: gradientBG 15s ease infinite; display: flex; flex-direction: column; position: relative; overflow: hidden; } @keyframes gradientBG { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } .title-bar-offline { height: 40px; display: flex; justify-content: flex-end; align-items: center; padding: 0 10px; -webkit-app-region: drag; } .offline-content { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: 20px; z-index: 2; } .offline-icon { font-size: 60px; color: var(--primary-color); margin-bottom: 30px; animation: float 3s ease-in-out infinite; } @keyframes float { 0% { transform: translateY(0px); } 50% { transform: translateY(-10px); } 100% { transform: translateY(0px); } } .offline-content h1 { font-size: 32px; color: white; margin-bottom: 15px; } .offline-content p { color: rgba(255, 255, 255, 0.7); max-width: 450px; } .offline-content .error-message { font-size: 12px; margin-top: 10px; color: var(--error-color); } .offline-content #relaunch-btn { margin-top: 30px; } .background-shapes .shape { position: absolute; border-radius: 50%; background: rgba(var(--primary-rgb), 0.1); animation: pulse 7s infinite ease-in-out; } .shape1 { width: 200px; height: 200px; top: 10%; left: 5%; } .shape2 { width: 100px; height: 100px; bottom: 15%; right: 10%; animation-delay: 2s; } .shape3 { width: 150px; height: 150px; top: 50%; right: 40%; animation-delay: 4s; } @keyframes pulse { 0% { transform: scale(0.9); } 50% { transform: scale(1.1); } 100% { transform: scale(0.9); } } /* IP Query Tool Specific Styles */ .ip-input-group { display: flex; gap: 10px; } .ip-input-group input { flex-grow: 1; padding: 10px 15px; font-size: 16px; border: 1px solid var(--border-color); border-radius: var(--border-radius); background-color: rgba(var(--card-background-rgb), 0.5); color: var(--text-color); } .ip-results-container { border: 1px solid var(--border-color); border-radius: var(--border-radius); padding: 24px; background-color: rgba(var(--card-background-rgb), var(--card-opacity)); min-height: 200px; display: flex; align-items: center; justify-content: center; transition: all 0.3s ease; } .ip-result-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; width: 100%; } .ip-result-category { padding-left: 15px; border-left: 3px solid var(--primary-color); } .ip-result-category h3 { margin-bottom: 10px; font-size: 18px; display: flex; align-items: center; gap: 8px; } .ip-result-item { display: flex; justify-content: space-between; padding: 6px 0; font-size: 14px; border-bottom: 1px solid var(--border-color); } .ip-result-item:last-child { border-bottom: none; } .ip-result-key { color: var(--text-secondary); font-weight: 500; } .ip-result-value { color: var(--text-color); font-weight: 600; text-align: right; } .privacy-warning { font-size: 12px; color: var(--accent-color); margin-top: 15px; padding: 10px; border-radius: 8px; background-color: rgba(var(--accent-color-rgb, 255, 149, 0), 0.1); border: 1px solid rgba(var(--accent-color-rgb, 255, 149, 0), 0.2); } .error-message { color: var(--error-color); } /* IP Query Tool - Comparison Table Styles */ .ip-comparison-container { margin-top: 24px; padding-top: 24px; border-top: 1px solid var(--border-color); } .ip-comparison-container h3 { margin-bottom: 15px; font-size: 18px; } .ip-comparison-table { width: 100%; border-collapse: collapse; font-size: 14px; } .ip-comparison-table th, .ip-comparison-table td { padding: 10px 12px; text-align: left; border-bottom: 1px solid var(--border-color); } .ip-comparison-table th { color: var(--text-secondary); font-weight: 600; } .ip-comparison-table tbody tr:last-child td { border-bottom: none; } .ip-comparison-table td.inconsistent { color: var(--error-color); font-weight: 700; } .ip-comparison-table td.consistent { color: var(--text-color); } .comparison-note { font-size: 12px; color: var(--text-secondary); margin-top: 10px; text-align: right; } /* --- 系统信息工具样式 --- */ .sys-info-tabs { display: flex; gap: 10px; border-bottom: 2px solid var(--border-color); margin-bottom: 20px; } .sys-info-tab { padding: 12px 20px; border: none; background-color: transparent; color: var(--text-secondary); font-size: 15px; font-weight: 600; cursor: pointer; position: relative; display: flex; align-items: center; gap: 8px; transition: color 0.3s ease; } .sys-info-tab::after { content: ''; position: absolute; bottom: -2px; left: 0; width: 100%; height: 2px; background-color: var(--primary-color); transform: scaleX(0); transition: transform 0.3s ease; } .sys-info-tab:hover { color: var(--text-color); } .sys-info-tab.active { color: var(--primary-color); } .sys-info-tab.active::after { transform: scaleX(1); } .sys-info-content-container { padding: 10px; } .sys-info-content { display: none; animation: contentFadeIn 0.5s forwards; } .sys-info-content.active { display: block; } .info-grid { display: grid; grid-template-columns: 200px 1fr; border-bottom: 1px solid var(--border-color); padding: 15px 10px; font-size: 15px; } .info-grid:last-child { border-bottom: none; } .info-item { display: contents; /* 让子元素直接参与 grid 布局 */ } .info-label { font-weight: 600; color: var(--text-secondary); } .info-value { word-break: break-all; color: var(--text-color); } .memory-bar-container { display: flex; align-items: center; gap: 10px; width: 100%; } .memory-bar { height: 12px; flex-grow: 1; background-color: var(--border-color); border-radius: 6px; overflow: hidden; } .memory-bar>div { height: 100%; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); border-radius: 6px; transition: width 0.5s ease-out; } .network-card { background-color: rgba(var(--card-background-rgb), 0.5); border: 1px solid var(--border-color); border-radius: var(--border-radius); padding: 20px; margin-bottom: 15px; } .network-card h3 { margin-bottom: 15px; padding-bottom: 10px; border-bottom: 1px solid var(--border-color); } .info-grid.compact { padding: 8px 0; grid-template-columns: 100px 1fr; border-bottom: 1px dashed var(--border-color); } .info-grid.compact:last-child { border-bottom: none; } /* IP Query Tool - Card Wrapper */ .ip-results-wrapper { display: flex; flex-direction: column; gap: 20px; margin-top: 20px; } .ip-results-wrapper .settings-section { margin-bottom: 0; } .ip-results-wrapper .info-grid { grid-template-columns: 120px 1fr; padding-left: 0; padding-right: 0; } /* --- 系统信息工具样式 --- */ .sys-info-tabs { display: flex; gap: 10px; border-bottom: 2px solid var(--border-color); margin-bottom: 20px; } .sys-info-tab { padding: 12px 20px; border: none; background-color: transparent; color: var(--text-secondary); font-size: 15px; font-weight: 600; cursor: pointer; position: relative; display: flex; align-items: center; gap: 8px; transition: color 0.3s ease; } .sys-info-tab::after { content: ''; position: absolute; bottom: -2px; left: 0; width: 100%; height: 2px; background-color: var(--primary-color); transform: scaleX(0); transition: transform 0.3s ease; } .sys-info-tab:hover { color: var(--text-color); } .sys-info-tab.active { color: var(--primary-color); } .sys-info-tab.active::after { transform: scaleX(1); } .sys-info-content-container { padding: 10px; } .sys-info-content { display: none; animation: contentFadeIn 0.5s forwards; } .sys-info-content.active { display: block; } .info-grid { display: grid; grid-template-columns: 200px 1fr; border-bottom: 1px solid var(--border-color); padding: 15px 10px; font-size: 15px; } .info-grid:last-child { border-bottom: none; } .info-item { display: contents; } .info-label { font-weight: 600; color: var(--text-secondary); } .info-value { word-break: break-all; color: var(--text-color); } .memory-bar-container { display: flex; align-items: center; gap: 10px; width: 100%; } .memory-bar { height: 12px; flex-grow: 1; background-color: var(--border-color); border-radius: 6px; overflow: hidden; } .memory-bar>div { height: 100%; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); border-radius: 6px; transition: width 0.5s ease-out; } .network-card { background-color: rgba(var(--card-background-rgb), 0.5); border: 1px solid var(--border-color); border-radius: var(--border-radius); padding: 20px; margin-bottom: 15px; } .network-card h3 { margin-bottom: 15px; padding-bottom: 10px; border-bottom: 1px solid var(--border-color); } .info-grid.compact { padding: 8px 0; grid-template-columns: 100px 1fr; border-bottom: 1px dashed var(--border-color); } .info-grid.compact:last-child { border-bottom: none; } /* --- 新版设置页面样式 --- */ /* 新的设置页面主容器 */ .settings-page-container { display: flex; gap: 30px; /* 左右两栏的间距 */ height: 100%; padding-right: 10px; /* 为右侧内容区预留滚动条空间 */ } /* 左侧导航栏 */ .settings-nav { flex-shrink: 0; width: 200px; display: flex; flex-direction: column; justify-content: space-between; /* 核心:将状态监控推到底部 */ height: 100%; } /* 左侧导航按钮 */ .settings-nav-item { width: 100%; padding: 12px 15px; border: none; background-color: transparent; color: var(--text-secondary); font-size: 15px; font-weight: 600; cursor: pointer; border-radius: 12px; display: flex; align-items: center; gap: 12px; text-align: left; transition: background-color 0.2s ease, color 0.2s ease; position: relative; /* [新增] 使得 z-index 生效 */ z-index: 2; /* [新增] 确保按钮内容在滑块之上 */ } .settings-nav-item:hover:not(.active) { background-color: rgba(var(--text-color), 0.04); color: var(--text-color); transform: translateX(2px); transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } .settings-nav-item.active { background: rgba(var(--primary-rgb), 0.1); color: var(--primary-color); box-shadow: 0 1px 3px rgba(var(--primary-rgb), 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.05); border: 0.5px solid rgba(var(--primary-rgb), 0.2); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); position: relative; overflow: visible; transform: translateX(4px); font-weight: 600; transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); } .settings-nav-item.active::before { content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 3px; height: 60%; background: var(--primary-color); border-radius: 0 2px 2px 0; opacity: 0.8; transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } .settings-nav-item.active > * { position: relative; z-index: 2; } .settings-nav-item.active:hover { background: rgba(var(--primary-rgb), 0.12); color: var(--primary-color); transform: translateX(6px); } @keyframes settingsNavPulse { 0%, 100% { box-shadow: 0 8px 24px rgba(var(--primary-rgb), 0.3), 0 0 0 1px rgba(255, 255, 255, 0.1) inset, 0 4px 12px rgba(var(--primary-rgb), 0.2); } 50% { box-shadow: 0 10px 30px rgba(var(--primary-rgb), 0.4), 0 0 0 1px rgba(255, 255, 255, 0.15) inset, 0 6px 16px rgba(var(--primary-rgb), 0.3); } } @keyframes settingsNavShine { 0% { left: -100%; } 50% { left: 100%; } 100% { left: 100%; } } .settings-content { flex-grow: 1; overflow-y: auto; /* 只让右侧内容区滚动 */ height: 100%; padding-right: 10px; } /* 右侧的每个独立面板 */ .settings-panel { display: none; /* 默认隐藏 */ animation: contentFadeIn 0.4s forwards; } .settings-panel.active { display: block; /* 点击导航后显示 */ } .settings-panel .settings-section:not(:last-child) { margin-bottom: 20px; } .settings-panel .info-grid { grid-template-columns: 150px 1fr; } /* --- 追加以下新样式到文件末尾 --- */ .settings-panel .info-grid.horizontal { display: flex; flex-wrap: wrap; gap: 20px; border-bottom: none; padding: 10px 0; } .settings-panel .info-grid.horizontal .info-item { display: flex; flex-direction: column; background-color: var(--border-color); padding: 10px 15px; border-radius: 8px; flex-basis: 200px; flex-grow: 1; } .settings-panel .info-grid.horizontal .info-label { font-size: 13px; } .settings-panel .info-grid.horizontal .info-value { font-size: 16px; font-weight: 600; } /* --- 设置页面实时状态面板 --- */ .settings-nav { display: flex; flex-direction: column; justify-content: space-between; /* 让状态面板推到底部 */ } #settings-status-panel { padding: 15px; border: 1px solid var(--border-color); border-radius: var(--border-radius); background-color: rgba(var(--card-background-rgb), 0.5); } .status-panel-title { font-size: 14px; font-weight: 600; color: var(--text-secondary); margin-bottom: 15px; padding-bottom: 5px; border-bottom: 1px solid var(--border-color); } .status-item { font-size: 13px; margin-bottom: 12px; } .status-item:last-child { margin-bottom: 0; } .status-label { display: flex; justify-content: space-between; margin-bottom: 6px; color: var(--text-color); } .status-label span:last-child { font-weight: 600; color: var(--text-secondary); } .status-bar-container { width: 100%; height: 8px; background-color: var(--border-color); border-radius: 4px; overflow: hidden; } .status-bar { height: 100%; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); border-radius: 4px; transition: width 0.5s ease-out; } /* --- 找到并修改此规则 --- */ .settings-content .settings-grid { display: grid; /* 修改:使用更具响应性的布局,并限制卡片不会无限拉伸 */ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); gap: 20px; align-content: start; /* 让内容从顶部开始对齐 */ } /* --- 在文件末尾追加以下新样式 --- */ /* 设置页面左侧导航栏的整体布局调整 */ .settings-nav { display: flex; flex-direction: column; justify-content: space-between; /* 核心改动:将内容推向两端 */ height: 100%; } /* 实时状态面板样式 */ #settings-status-panel { padding: 15px; margin-top: 20px; /* 与上方按钮的间距 */ border-top: 1px solid var(--border-color); } .status-panel-title { font-size: 14px; font-weight: 600; color: var(--text-secondary); margin-bottom: 15px; text-align: center; } .status-item { font-size: 13px; margin-bottom: 15px; } .status-item:last-child { margin-bottom: 0; } .status-label { display: flex; justify-content: space-between; margin-bottom: 6px; color: var(--text-color); } .status-label span:last-child { font-weight: 600; color: var(--text-secondary); font-family: monospace; } .status-bar-container { width: 100%; height: 6px; background-color: var(--border-color); border-radius: 3px; overflow: hidden; } .status-bar { height: 100%; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); border-radius: 3px; transition: width 0.5s ease-out; } .settings-panel .info-grid.horizontal { display: flex; flex-wrap: wrap; gap: 20px; border-bottom: none; padding: 10px 0; } .settings-panel .info-grid.horizontal .info-item { display: flex; flex-direction: column; background-color: var(--border-color); padding: 10px 15px; border-radius: 8px; flex-basis: 200px; flex-grow: 1; } .settings-panel .info-grid.horizontal .info-label { font-size: 13px; } .settings-panel .info-grid.horizontal .info-value { font-size: 16px; font-weight: 600; } /* --- 新增 .toolbox-tabs --- */ .toolbox-tabs { flex-shrink: 0; overflow-x: auto; overflow-y: hidden; white-space: nowrap; /* 防止换行 */ scrollbar-width: thin; /* Firefox */ } .toolbox-tabs::-webkit-scrollbar { height: 4px; } .toolbox-tabs::-webkit-scrollbar-thumb { background-color: var(--border-color); border-radius: 2px; } /* --- 日志页面UI重构样式 --- */ .log-day-group { margin-bottom: 25px; } .log-day-group:last-child { margin-bottom: 0; } .log-date-header { font-size: 16px; font-weight: 600; color: var(--text-color); padding-bottom: 12px; margin-bottom: 12px; border-bottom: 2px solid var(--border-color); position: sticky; top: -10px; /* 使其在滚动时能停靠在顶部 */ background-color: rgba(var(--bg-color-rgb), 0.8); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); z-index: 1; padding-left: 15px; } .logs-container { padding: 10px 20px; } .log-entry { display: flex; align-items: center; gap: 15px; font-size: 14px; padding: 15px 10px; /* 增加垂直内边距 */ border-bottom: 1px solid var(--border-color); /* 增加底部边框作为分隔符 */ margin-bottom: 2px; /* 增加外边距 */ border-left: 3px solid transparent; transition: border-left-color 0.3s ease, background-color 0.3s ease; /* 修正边距,使其与日期标题对齐 */ margin-left: -15px; margin-right: -15px; padding-left: 15px; } .log-entry:hover { background-color: rgba(var(--primary-rgb), 0.05); border-left-color: var(--primary-color); } /* --- 日历 (input[type=date]) 样式美化 --- */ #log-date-picker { position: relative; background-color: var(--card-background); color: var(--text-color); border: 1px solid var(--border-color); border-radius: 8px; padding: 8px 12px; font-size: 14px; font-weight: 500; cursor: pointer; -webkit-appearance: none; -moz-appearance: none; appearance: none; transition: border-color 0.3s ease; } #log-date-picker:hover { border-color: var(--primary-color); } /* 自定义日历图标 */ #log-date-picker::-webkit-calendar-picker-indicator { background-image: url('data:image/svg+xml;utf8,'); background-repeat: no-repeat; background-position: center; color: var(--text-secondary); opacity: 0.6; cursor: pointer; transition: opacity 0.3s ease; } #log-date-picker::-webkit-calendar-picker-indicator:hover { opacity: 1; } /* Bili Hot Tool Styles */ .bili-hot-table .rank-cell { display: none; } /* 移除旧的 title-cell 样式 */ .bili-hot-table .title-cell { display: contents; /* 或者直接删除此规则 */ } /* 表格单元格的基础样式 */ .bili-hot-table td { padding: 8px 15px; /* 调整内边距 */ vertical-align: middle; } /* 每一行热搜内容的容器,使用 Flex 布局 */ .bili-hot-item { display: flex; align-items: center; /* 垂直居中对齐 */ gap: 15px; /* 项目之间的间距 */ width: 100%; } /* 排名数字的样式 */ .bili-hot-rank { font-size: 1.2em; font-weight: 700; color: var(--text-secondary); width: 30px; /* 固定宽度,确保对齐 */ text-align: center; flex-shrink: 0; /* 防止被压缩 */ } /* 前三名排名的特殊颜色 */ .bili-hot-rank.rank-top-3 { color: var(--error-color); } .bili-hot-rank.rank-1 { font-size: 1.4em; /* 冠军可以更大一些 */ } /* 热搜标题链接的样式 */ .bili-hot-title { flex-grow: 1; /* 占据所有剩余空间 */ color: var(--text-color); text-decoration: none; font-weight: 500; line-height: 1.5; transition: color 0.2s ease; } .bili-hot-title:hover { color: var(--primary-color); } /* 热搜图片标签的样式 */ .bili-hot-image { height: 22px; /* 固定高度 */ width: auto; /* 宽度自适应 */ max-width: 50px; /* 限制最大宽度,防止图片过宽 */ object-fit: contain; /* 保持图片比例 */ flex-shrink: 0; /* 防止图片被压缩 */ vertical-align: middle; /* 确保与文字基线对齐 */ } /* 移除旧的 status-badge 样式,统一使用 bili-hot-image */ .bili-hot-table .status-badge { display: none; } .baidu-hot-tabs { margin-bottom: 10px; /* 调整标签页和下方内容的间距 */ padding: 0 10px; } /* 自定义输入提示框样式 */ #custom-prompt-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); backdrop-filter: blur(5px); display: flex; justify-content: center; align-items: center; z-index: 10000; animation: contentFadeIn 0.3s; } .custom-prompt-box { background-color: rgba(var(--card-background-rgb), 0.9); padding: 24px; border-radius: var(--border-radius); border: 1px solid var(--border-color); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); width: 90%; max-width: 350px; text-align: center; } .custom-prompt-box h4 { margin-bottom: 8px; } .custom-prompt-box p { margin-bottom: 16px; font-size: 14px; } .custom-prompt-box input { width: 100%; padding: 10px 15px; font-size: 16px; border: 1px solid var(--border-color); border-radius: 12px; background-color: rgba(var(--bg-color-rgb), 0.8); color: var(--text-color); margin-bottom: 20px; text-align: center; } .prompt-buttons { display: flex; justify-content: center; gap: 10px; } #custom-prompt-overlay.fade-out { animation: contentFadeOut 0.3s forwards; } @keyframes contentFadeOut { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(-15px); } } .secret-window-container { width: 100%; height: 100%; overflow: hidden; display: flex; flex-direction: column; } .secret-content { flex: 1; overflow-y: auto; padding: 20px; box-sizing: border-box; } /* 确保所有子元素都能响应式调整 */ .secret-content>* { max-width: 100%; box-sizing: border-box; } /* 为工具箱网格容器添加一个平滑的透明度过渡效果 */ #toolbox-grid { transition: opacity 0.2s ease-in-out; } @keyframes contentFadeOut { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(-15px); /* 向上移动一点再消失,效果更佳 */ } } .tool-card.fade-out { animation: contentFadeOut 0.2s forwards; } .tool-card { opacity: 0; /* 其他 .tool-card 样式保持不变 */ } /* --- Base64 工具特定样式 --- */ .base64-tool-container .content-area { background-color: rgba(var(--bg-color-rgb), 0.5); /* 给内容区一个轻微的背景色 */ } .base64-main-area h2, .base64-image-area h2 { display: flex; align-items: center; gap: 10px; margin-bottom: 15px; padding-bottom: 10px; border-bottom: 1px solid var(--border-color); } .base64-textarea-wrapper { position: relative; margin-bottom: 15px; } #b64-main-textarea { width: 100%; height: 180px; /* 增加高度 */ padding: 12px 15px; padding-right: 50px; /* 为右侧按钮留出空间 */ border-radius: var(--border-radius); border: 1px solid var(--border-color); background-color: rgba(var(--card-background-rgb), 0.8); color: var(--text-color); font-size: 14px; resize: vertical; /* 允许垂直调整大小 */ line-height: 1.6; transition: border-color 0.3s ease, box-shadow 0.3s ease; } #b64-main-textarea:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 2px rgba(var(--primary-rgb), 0.2); } .textarea-actions { position: absolute; top: 10px; right: 10px; display: flex; flex-direction: column; gap: 8px; } .textarea-actions .control-btn.mini-btn { width: 30px; height: 30px; padding: 0; font-size: 14px; border-radius: 8px; /* 稍小圆角 */ } .base64-actions { display: flex; gap: 15px; justify-content: center; /* 居中按钮 */ } .base64-image-area .image-controls { display: flex; gap: 15px; margin-bottom: 15px; } .image-preview-area { border: 1px dashed var(--border-color); border-radius: var(--border-radius); padding: 15px; margin-top: 15px; text-align: center; } .image-preview-area h3 { font-size: 14px; color: var(--text-secondary); margin-bottom: 10px; } .image-output { margin-bottom: 15px; display: flex; justify-content: center; align-items: center; min-height: 100px; } #b64-download-image-btn { margin: 0 auto; /* 居中下载按钮 */ } /* --- 窗口 UI 区分 --- */ /* 为独立窗口添加一个顶层类 */ body.tool-window-body, body.browser-window-body { /* 可以给独立窗口加一个非常细微的边框或背景 */ /* border: 1px solid rgba(var(--primary-rgb), 0.1); */ } /* 独立窗口的标题栏样式调整 */ .tool-window-body .title-bar, .browser-window-body .title-bar-shell { background-color: rgba(var(--card-background-rgb), 0.5); /* 半透明背景 */ backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); border-bottom: 1px solid var(--border-color); } /* 独立窗口内的工具头部 (例如 Base64 工具的) */ .tool-window-body .tool-window-header { padding: 10px 20px; /* 调整内边距 */ margin-bottom: 0; /* 移除与下方内容的间距 */ border-bottom: 1px solid var(--border-color); background-color: rgba(var(--card-background-rgb), 0.3); /* 轻微背景 */ } .tool-window-body .tool-window-header .back-btn { /* 可以隐藏独立窗口内的返回按钮,因为窗口本身有关闭按钮 */ /* display: none; */ padding: 6px 12px; /* 缩小按钮 */ font-size: 14px; } .tool-window-body .tool-window-header h1 { font-size: 18px; /* 缩小标题字号 */ } /* 浏览器窗口的导航栏 */ .browser-window-body #view-controls { background-color: rgba(var(--card-background-rgb), 0.6); /* 稍微深一点的背景 */ } /* --- 简繁转换工具特定样式 --- */ .chinese-converter-container .content-area { background-color: rgba(var(--bg-color-rgb), 0.5); } .chinese-converter-container .settings-section { min-height: 0; /* Allow flex shrinking */ } .converter-text-area { position: relative; flex: 1; /* Allow text areas to grow */ display: flex; /* Ensure textarea fills height */ margin-bottom: 15px; } .converter-text-area textarea { width: 100%; min-height: 150px; /* Minimum height */ height: 100%; /* Fill available height */ padding: 12px 15px; padding-right: 50px; border-radius: var(--border-radius); border: 1px solid var(--border-color); background-color: rgba(var(--card-background-rgb), 0.8); color: var(--text-color); font-size: 14px; resize: vertical; line-height: 1.6; transition: border-color 0.3s ease, box-shadow 0.3s ease; } .converter-text-area textarea:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 2px rgba(var(--primary-rgb), 0.2); } .converter-text-area .textarea-actions { position: absolute; top: 10px; right: 10px; display: flex; flex-direction: column; gap: 8px; } .converter-text-area .textarea-actions .control-btn.mini-btn { width: 30px; height: 30px; padding: 0; font-size: 14px; border-radius: 8px; } .converter-controls { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; flex-wrap: wrap; /* Allow wrapping on smaller screens */ gap: 10px; flex-shrink: 0; /* Prevent controls from shrinking */ } .converter-type-selection { display: flex; gap: 15px; align-items: center; } .converter-type-selection label { display: flex; align-items: center; gap: 5px; cursor: pointer; font-size: 14px; color: var(--text-secondary); } .converter-type-selection input[type="radio"] { cursor: pointer; } .converter-type-selection label:has(input:checked) { color: var(--primary-color); font-weight: 600; } #cc-convert-btn { min-width: 100px; /* Ensure button has minimum width */ } #cc-output-textarea:read-only { background-color: rgba(var(--card-background-rgb), 0.5); /* Slightly different background for readonly */ } /* --- QR Code Generator Tool Styles --- */ .qr-code-container .content-area { display: flex; flex-direction: row; /* Side by side layout */ gap: 30px; } .qr-options-panel, .qr-preview-panel { padding: 20px; flex: 1; /* Share space equally */ display: flex; flex-direction: column; min-width: 0; /* Prevent flex overflow */ } .qr-options-panel .setting-item { margin-bottom: 18px; } .qr-options-panel .setting-item label { display: block; /* Ensure label is above input */ margin-bottom: 8px; } .qr-options-panel textarea, .qr-options-panel select, .qr-options-panel input[type="color"] { width: 100%; padding: 8px 12px; border-radius: 8px; border: 1px solid var(--border-color); background-color: rgba(var(--card-background-rgb), 0.7); color: var(--text-color); font-size: 14px; } .qr-options-panel textarea { min-height: 80px; } .qr-options-panel input[type="color"] { height: 38px; padding: 4px; /* Adjust padding for color input */ cursor: pointer; } .qr-preview-panel { align-items: center; /* Center content horizontally */ } .qr-code-output { width: 100%; max-width: 400px; /* Limit max preview size */ aspect-ratio: 1 / 1; /* Maintain square shape */ background-color: rgba(var(--card-background-rgb), 0.3); border: 1px dashed var(--border-color); border-radius: var(--border-radius); display: flex; justify-content: center; align-items: center; margin-bottom: 20px; padding: 15px; /* Padding around the QR code */ box-sizing: border-box; /* Include padding in size */ } .qr-code-output canvas, .qr-code-output img { max-width: 100%; max-height: 100%; object-fit: contain; background-color: white; /* Ensure light background for QR code visibility */ border-radius: 4px; /* Slight rounding for the code itself */ } .qr-placeholder { color: var(--text-secondary); text-align: center; } #qr-save-btn { width: 80%; max-width: 200px; /* Limit button width */ } /* Responsive adjustments for smaller screens */ @media (max-width: 768px) { .qr-code-container .content-area { flex-direction: column; /* Stack panels vertically */ } .qr-options-panel, .qr-preview-panel { flex: none; /* Reset flex grow */ } } /* 工具箱新布局容器 */ .toolbox-page-container { padding-top: 20px; padding-bottom: 20px; gap: 20px; } /* 工具箱侧边栏 (复用设置页的导航样式) */ .toolbox-sidebar { width: 200px; flex-shrink: 0; height: 100%; overflow-y: auto; padding-right: 10px; /* 为滚动条留出空间 */ } /* 侧边栏类别按钮 (直接复用 settings-nav-item 样式) */ .toolbox-category-btn { width: 100%; margin-bottom: 8px; /* 增加一点间距 */ } /* 确保 .settings-nav-item 的基础样式在 .toolbox-sidebar 中可用 */ .toolbox-sidebar .settings-nav-item { /* 样式已在 .settings-nav-item 中定义,这里确保上下文正确 */ } .toolbox-sidebar .settings-nav-item:hover { /* 样式已在 .settings-nav-item:hover 中定义 */ } .toolbox-sidebar .settings-nav-item.active { /* 样式已在 .settings-nav-item.active 中定义 */ } /* 工具箱右侧主内容区 */ .toolbox-main-content { flex-grow: 1; display: flex; flex-direction: column; min-width: 0; /* 防止 flex 溢出 */ } /* 确保网格在 flex 容器内正确滚动 */ .toolbox-main-content .toolbox-grid { flex-grow: 1; min-height: 0; overflow-y: auto; padding: 5px 15px 5px 5px; /* 为滚动条增加内边距 */ } /* 工具箱活动滑块样式 */ .toolbox-active-slider { position: absolute; left: 0; top: 0; width: 100%; z-index: 1; /* 在按钮背景之下 */ background-color: var(--primary-color); box-shadow: 0 4px 10px rgba(var(--primary-rgb), 0.3); border-radius: 12px; transition: transform 0.35s cubic-bezier(0.25, 0.8, 0.25, 1); /* 核心动画 */ } /* 修正按钮内图标和文字的 z-index */ .settings-nav-item>i, .settings-nav-item>span { position: relative; z-index: 2; } /* 独立工具窗口焦点样式 */ .tool-window-body .title-bar { background-color: rgba(var(--card-background-rgb), 0.5); transition: background-color 0.3s ease, color 0.3s ease; } .tool-window-body #window-title { transition: color 0.3s ease; } /* 当 .tool-window-body 获得焦点时 */ .tool-window-body.window-focused .title-bar { background-color: rgba(var(--primary-rgb), 0.15); /* 主题色浅色背景 */ backdrop-filter: blur(10px); } .tool-window-body.window-focused #window-title { color: var(--primary-color); /* 主题色标题 */ } /* 独立浏览器窗口焦点样式 */ .browser-window-body .title-bar-shell { background-color: rgba(var(--card-background-rgb), 0.5); transition: background-color 0.3s ease; } .browser-window-body #window-title { transition: color 0.3s ease; } /* 当 .browser-window-body 获得焦点时 */ .browser-window-body.window-focused .title-bar-shell { background-color: rgba(var(--primary-rgb), 0.15); /* 主题色浅色背景 */ backdrop-filter: blur(10px); } .browser-window-body.window-focused #window-title { color: var(--primary-color); /* 主题色标题 */ } /* 独立工具窗口 (view-tool) 基础样式 */ .tool-window-body#app-body { /* 添加过渡效果,用于焦点的边框/阴影 */ transition: box-shadow 0.3s ease; /* 默认的、非激活状态的边框 (非常淡) */ box-shadow: 0 0 0 1px var(--border-color); } .tool-window-body .title-bar { background-color: rgba(var(--card-background-rgb), 0.5); transition: background-color 0.3s ease, color 0.3s ease; } .tool-window-body #window-title { color: var(--text-secondary); /* 非激活时标题颜色变暗 */ transition: color 0.3s ease; } /* 当 .tool-window-body 获得焦点时 */ .tool-window-body.window-focused#app-body { /* [新增] 添加高亮的边框/辉光效果 */ box-shadow: 0 0 0 2px var(--primary-color); } .tool-window-body.window-focused .title-bar { background-color: rgba(var(--primary-rgb), 0.15); /* 主题色浅色背景 */ backdrop-filter: blur(10px); } .tool-window-body.window-focused #window-title { color: var(--primary-color); /* 主题色标题 */ } /* 独立浏览器窗口 (view-browser) 基础样式 */ .browser-window-body#app-body { transition: box-shadow 0.3s ease; box-shadow: 0 0 0 1px var(--border-color); /* 默认的、非激活状态的边框 */ } .browser-window-body .title-bar-shell { background-color: rgba(var(--card-background-rgb), 0.5); transition: background-color 0.3s ease; } .browser-window-body #window-title { color: var(--text-secondary); /* 非激活时标题颜色变暗 */ transition: color 0.3s ease; } /* 当 .browser-window-body 获得焦点时 */ .browser-window-body.window-focused#app-body { /* [新增] 添加高亮的边框/辉光效果 */ box-shadow: 0 0 0 2px var(--primary-color); } .browser-window-body.window-focused .title-bar-shell { background-color: rgba(var(--primary-rgb), 0.15); backdrop-filter: blur(10px); } .browser-window-body.window-focused #window-title { color: var(--primary-color); /* 主题色标题 */ } /* [修复] 移除工具窗口内的 header 留白 (如果工具文件没改干净) */ .tool-window-body .tool-window-header { display: none; } /* 禁用状态下的子分类卡片 */ .subcategory-card.disabled { opacity: 0.6; filter: grayscale(80%); } /* 禁用时移除悬停效果 */ .subcategory-card.disabled:hover { transform: none; box-shadow: 0 4px 15px var(--shadow-color); border-color: var(--border-color); } /* 禁用时按钮的样式 */ .subcategory-card.disabled .view-subcategory-btn { cursor: not-allowed; color: var(--text-secondary); background-color: transparent; } /* 禁用时移除按钮的悬停效果 */ .subcategory-card.disabled .view-subcategory-btn:hover { transform: none; box-shadow: none; color: var(--text-secondary); } /* 随机放映室 - 禁用项目的缩略图占位符 */ .subcategory-thumbnail-placeholder { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; background-color: var(--border-color); /* 使用一个柔和的背景色 */ } .subcategory-thumbnail-placeholder i { font-size: 48px; color: var(--text-secondary); opacity: 0.5; } /* 确保禁用的卡片缩略图容器高度一致 */ .subcategory-card.disabled .subcategory-thumbnail { height: 160px; /* 匹配 .subcategory-thumbnail 的原始高度 */ overflow: hidden; } /* --- 新的通用选项开关 (.option-toggle) --- */ .option-toggle { position: relative; display: inline-block; width: 44px; /* 宽度缩小 */ height: 24px; /* 高度缩小 */ } .option-toggle input { opacity: 0; width: 0; height: 0; } .option-toggle .slider-round { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: var(--border-color); transition: var(--transition-duration); border-radius: 24px; /* 保持圆形 */ } .option-toggle .slider-round:before { position: absolute; content: ""; height: 18px; /* 滑块缩小 */ width: 18px; /* 滑块缩小 */ left: 3px; /* 边距调整 */ bottom: 3px; /* 边距调整 */ background-color: white; transition: var(--transition-duration); border-radius: 50%; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); } .option-toggle input:checked+.slider-round { background-color: var(--primary-color); } .option-toggle input:checked+.slider-round:before { transform: translateX(20px); /* 移动距离调整 */ } /* --- 新的自定义下拉菜单 (.custom-select-wrapper) --- */ .custom-select-wrapper { position: relative; min-width: 120px; } .custom-select-trigger { display: flex; justify-content: space-between; align-items: center; padding: 8px 12px; background-color: rgba(var(--card-background-rgb), 0.7); border: 1px solid var(--border-color); border-radius: 8px; cursor: pointer; transition: border-color 0.2s ease, box-shadow 0.2s ease; font-size: 14px; font-weight: 500; color: var(--text-color); } .custom-select-wrapper:hover .custom-select-trigger { border-color: var(--primary-color); } .custom-select-wrapper.active .custom-select-trigger { border-color: var(--primary-color); box-shadow: 0 0 0 2px rgba(var(--primary-rgb), 0.2); } .custom-select-arrow { color: var(--text-secondary); transition: transform 0.3s ease; } .custom-select-wrapper.active .custom-select-arrow { transform: rotate(180deg); } .custom-select-options { /* [修改] 改为 fixed,使其脱离父容器的 overflow 限制 */ position: fixed; /* [修改] 提高 z-index,确保在所有元素之上 (高于滑出式面板的 1000) */ z-index: 10001; background-color: rgba(var(--card-background-rgb), 0.9); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border: 1px solid var(--border-color); border-radius: var(--border-radius); box-shadow: 0 8px 20px var(--shadow-color-hover); padding: 6px; max-height: 200px; overflow-y: auto; /* [动画 修复 1/2] 动画现在由 JS 切换 '.dynamic-active' 类控制 */ opacity: 0; transform-origin: top center; /* [新增] 默认从顶部中心缩放 */ transform: scale(0.95); /* [修改] 从 translateY(-10px) 改为 scale(0.95) */ pointer-events: none; transition: opacity 0.2s ease, transform 0.2s ease; /* [修改] 保持过渡效果 */ display: block; /* 保持块状,以便 JS 可以计算其高度 */ } .custom-select-options.dynamic-active { /* [动画 修复 2/2] */ opacity: 1; transform: scale(1); /* [修改] 从 translateY(0) 改为 scale(1) */ pointer-events: auto; } .custom-select-wrapper.active .custom-select-options { /* [动画] 激活时显示 */ opacity: 1; transform: translateY(0); pointer-events: auto; } .custom-select-option { padding: 10px 12px; border-radius: 8px; cursor: pointer; font-size: 14px; color: var(--text-secondary); transition: background-color 0.2s ease, color 0.2s ease; } .custom-select-option:hover { background-color: var(--border-color); color: var(--text-color); } .custom-select-option:active { background-color: rgba(var(--primary-rgb), 0.2); color: var(--primary-color); } /* 敏感词检测工具 - 结果列表滚动 */ .profanity-results-list { max-height: 150px; /* 滚动容器的最大高度 */ overflow-y: auto; /* 溢出时显示滚动条 */ border: 1px solid var(--border-color); border-radius: var(--border-radius); margin-top: 15px; /* 与状态行保持间距 */ } /* [新增] flexbox 容器样式 */ .profanity-tag-container { display: flex; flex-wrap: wrap; /* 允许卡片换行 */ padding: 10px; /* 容器内边距 */ gap: 8px; /* 卡片之间的间距 */ } /* [新增] “小卡片” (Tag/Pill) 本身的样式 */ .profanity-tag { /* 使用 rgba(var(--error-color-rgb...)) 来获取透明背景 */ background-color: rgba(var(--error-color-rgb, 255, 59, 48), 0.15); color: var(--error-color); /* 红色文字 */ padding: 5px 10px; border-radius: 8px; font-size: 13px; font-weight: 600; border: 1px solid rgba(var(--error-color-rgb, 255, 59, 48), 0.3); } /* 确保表格最后一行没有多余的边框 */ .profanity-results-list .ip-comparison-table tbody tr:last-child td { border-bottom: none; } /* --- 3. 自定义下拉菜单 (支持分类) --- */ .custom-select-group { padding: 4px 0; } .custom-select-group:not(:last-child) { border-bottom: 1px solid var(--border-color); } .custom-select-group-title { font-size: 11px; font-weight: 600; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.5px; padding: 8px 12px 4px 12px; } .custom-select-options { /* 增加最大高度以容纳更多条目 */ max-height: 400px; } /* --- 多平台热榜工具样式 --- */ .hotboard-table .bili-hot-item { display: none; /* 不再使用 .bili-hot-item flex 容器 */ } /* 新的热榜标题链接样式 */ .hotboard-title-link { color: var(--text-color); text-decoration: none; font-weight: 500; line-height: 1.5; transition: color 0.2s ease; } .hotboard-title-link:hover { color: var(--primary-color); } /* 热榜 - 热度值 */ .hotboard-value { font-size: 13px; font-weight: 600; color: var(--text-secondary); font-family: monospace; /* 使用等宽字体让数字对齐 */ } /* 热榜 - 额外标签 (如 '新', '爆') */ .hotboard-tag { padding: 2px 6px; border-radius: 6px; font-size: 11px; font-weight: 700; margin-left: 8px; flex-shrink: 0; border: 1px solid transparent; } /* 标签 '新' (蓝色) */ .hotboard-tag.tag-new { background-color: rgba(var(--primary-rgb), 0.15); color: var(--primary-color); border-color: rgba(var(--primary-rgb), 0.3); } /* 标签 '爆' / '热' (红色) */ .hotboard-tag.tag-hot { background-color: rgba(var(--error-color-rgb, 255, 59, 48), 0.15); color: var(--error-color); border-color: rgba(var(--error-color-rgb, 255, 59, 48), 0.3); } /* 确保复用的表格样式在工具窗口中表现一致 */ .hotboard-table.ip-comparison-table th { text-align: left; /* 默认左对齐 */ } .hotboard-table.ip-comparison-table th[style*="text-align: center"], .hotboard-table.ip-comparison-table td[style*="text-align: center"] { text-align: center; /* 覆盖为居中 */ } .hotboard-table.ip-comparison-table th[style*="text-align: right"], .hotboard-table.ip-comparison-table td[style*="text-align: right"] { text-align: right; /* 覆盖为居右 */ } /* --- 自定义“吃豆人”加载动画 (hotboard) --- */ /* (基于 .load20 样式) */ .pacman-loader { position: relative; /* 缩放以适应加载容器 */ transform: scale(0.8); margin: 15px 0; } .pacman-loader>div:nth-child(2) { -webkit-animation: pacman-balls 1s -0.99s infinite linear; animation: pacman-balls 1s -0.99s infinite linear; } .pacman-loader>div:nth-child(3) { -webkit-animation: pacman-balls 1s -0.66s infinite linear; animation: pacman-balls 1s -0.66s infinite linear; } .pacman-loader>div:nth-child(4) { -webkit-animation: pacman-balls 1s -0.33s infinite linear; animation: pacman-balls 1s -0.33s infinite linear; } .pacman-loader>div:nth-child(5) { -webkit-animation: pacman-balls 1s 0s infinite linear; animation: pacman-balls 1s 0s infinite linear; } .pacman-loader>div:first-of-type { width: 0px; height: 0px; border-right: 25px solid transparent; /* [修改] 使用 CSS 变量自动适应主题 */ border-top: 25px solid var(--text-color); border-left: 25px solid var(--text-color); border-bottom: 25px solid var(--text-color); border-radius: 25px; -webkit-animation: rotate_pacman_half_up 0.5s 0s infinite; animation: rotate_pacman_half_up 0.5s 0s infinite; position: relative; left: -30px; } .pacman-loader>div:nth-child(2) { width: 0px; height: 0px; border-right: 25px solid transparent; /* [修改] 使用 CSS 变量自动适应主题 */ border-top: 25px solid var(--text-color); border-left: 25px solid var(--text-color); border-bottom: 25px solid var(--text-color); border-radius: 25px; -webkit-animation: rotate_pacman_half_down 0.5s 0s infinite; animation: rotate_pacman_half_down 0.5s 0s infinite; margin-top: -50px; position: relative; left: -30px; } .pacman-loader>div:nth-child(3), .pacman-loader>div:nth-child(4), .pacman-loader>div:nth-child(5), .pacman-loader>div:nth-child(6) { /* [修改] 使用 CSS 变量自动适应主题 */ background-color: var(--text-color); width: 15px; height: 15px; border-radius: 100%; margin: 2px; width: 10px; height: 10px; position: absolute; -webkit-transform: translate(0, -6.25px); transform: translate(0, -6.25px); top: 25px; left: 70px; } /* 复制所有必需的 keyframes */ @-webkit-keyframes pacman-balls { 75% { opacity: 0.7; } 100% { -webkit-transform: translate(-100px, -6.25px); transform: translate(-100px, -6.25px); } } @keyframes pacman-balls { 75% { opacity: 0.7; } 100% { -webkit-transform: translate(-100px, -6.25px); transform: translate(-100px, -6.25px); } } @-webkit-keyframes rotate_pacman_half_down { 0% { -webkit-transform: rotate(90deg); transform: rotate(90deg); } 50% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(90deg); transform: rotate(90deg); } } @keyframes rotate_pacman_half_down { 0% { -webkit-transform: rotate(90deg); transform: rotate(90deg); } 50% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(90deg); transform: rotate(90deg); } } @-webkit-keyframes rotate_pacman_half_up { 0% { -webkit-transform: rotate(270deg); transform: rotate(270deg); } 50% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } 100% { -webkit-transform: rotate(270deg); transform: rotate(270deg); } } @keyframes rotate_pacman_half_up { 0% { -webkit-transform: rotate(270deg); transform: rotate(270deg); } 50% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } 100% { -webkit-transform: rotate(270deg); transform: rotate(270deg); } } /* 确保高级选项的折叠动画正常工作 */ .collapsible-trigger .icon-toggle { transition: transform var(--transition-duration) ease; } .collapsible-trigger.expanded .icon-toggle { transform: rotate(-180deg); } .collapsible-content { max-height: 0; overflow: hidden; transition: max-height 0.35s ease-in-out; border-top: 1px solid transparent; } .collapsible-content.expanded { max-height: 400px; /* 展开高度 */ border-top: 1px solid var(--border-color); margin-top: 12px; } /* 智能搜索 - 搜索结果专用样式 */ .search-result-item { border-bottom: 1px solid var(--border-color); padding: 15px; margin-bottom: 15px; transition: background-color 0.2s ease; border-radius: 8px; } .search-result-item:last-child { border-bottom: none; margin-bottom: 0; } .search-result-item:hover { background-color: rgba(var(--primary-rgb), 0.05); } .search-result-item h4 { margin-bottom: 5px; } .search-result-item p { font-size: 14px; color: var(--text-secondary); margin-bottom: 10px; /* 限制摘要行数 */ overflow: hidden; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; text-overflow: ellipsis; } .search-result-item .result-meta { font-size: 12px; color: var(--text-secondary); display: flex; flex-wrap: wrap; /* 允许在小屏幕上换行 */ gap: 15px; } .search-result-item .result-meta span { display: inline-flex; align-items: center; gap: 5px; } /* 结果中的域名高亮 */ .search-result-item .result-meta .domain { color: var(--success-color); font-weight: 600; } /* --- 2. [Request 2] 新版主页 (欢迎页) 布局样式 --- */ /* 欢迎页上的新搜索栏 */ .welcome-search-bar { margin-bottom: 20px; display: flex; gap: 10px; /* 复用卡片样式 */ background-color: rgba(var(--card-background-rgb), var(--card-opacity)); backdrop-filter: blur(12px) saturate(180%); -webkit-backdrop-filter: blur(12px) saturate(180%); border-radius: var(--border-radius); border: 1px solid var(--border-color); box-shadow: 0 4px 15px var(--shadow-color); padding: 20px; transition: all var(--transition-duration) ease; } .welcome-search-bar:hover { /* 悬停时发光 */ box-shadow: 0 12px 25px var(--shadow-color-hover), 0 0 25px var(--glow-color); border-color: rgba(var(--primary-rgb), 0.4); } /* 欢迎页搜索栏的输入框 */ .welcome-search-bar input { flex-grow: 1; padding: 12px 18px; font-size: 16px; border: 1px solid var(--border-color); border-radius: 12px; background-color: rgba(var(--bg-color-rgb), 0.8); color: var(--text-color); } .welcome-search-bar input:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 2px rgba(var(--primary-rgb), 0.2); } /* 欢迎页新的 2 列表格布局 */ .welcome-dashboard-grid-new { flex-grow: 1; min-height: 0; display: grid; gap: 20px; grid-template-columns: 1fr 1fr; /* 2 个等宽列 */ } /* 响应式:在窄屏上,2 列变为 1 列 */ @media (max-width: 1024px) { .welcome-dashboard-grid-new { grid-template-columns: 1fr; /* 垂直堆叠 */ } } /* --- [Request 1] 智能搜索 - 高级选项输入框样式 --- */ .settings-input-text { max-width: 250px; padding: 8px 12px; font-size: 14px; text-align: left; border: 1px solid var(--border-color); border-radius: 8px; /* * 核心修复: * 1. 使用 --bg-color-rgb (浅色模式为浅灰, 深色模式为深灰) * 2. 使用 --text-color (浅色模式为深色字, 深色模式为浅色字) */ background-color: rgba(var(--bg-color-rgb), 0.8); color: var(--text-color); transition: border-color 0.2s ease, box-shadow 0.2s ease; } /* 修复:输入框获取焦点时的样式 */ .settings-input-text:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 2px rgba(var(--primary-rgb), 0.2); } /* 修复:占位符文本颜色 (使用次要文本颜色) */ .settings-input-text::placeholder { color: var(--text-secondary); opacity: 0.8; } /* --- [Req 2] 新主页布局 - 紧凑型公告 --- */ .compact-announcement { /* 复用卡片样式,但更紧凑 */ background-color: rgba(var(--card-background-rgb), 0.5); border: 1px solid var(--border-color); border-radius: var(--border-radius); padding: 15px 20px; margin-bottom: 20px; display: flex; align-items: center; gap: 15px; transition: all var(--transition-duration) ease; opacity: 0; /* 用于渐入动画 */ } .compact-announcement:hover { background-color: rgba(var(--card-background-rgb), 0.7); border-color: rgba(var(--primary-rgb), 0.3); } .compact-announcement .icon { font-size: 20px; color: var(--primary-color); flex-shrink: 0; } .compact-announcement p { margin: 0; color: var(--text-secondary); font-size: 14px; font-weight: 500; /* 防止过长 */ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } /* --- [Req 2] 新主页布局 - 搜索结果容器 --- */ .welcome-search-results-container { flex-grow: 1; /* 占据剩余空间 */ min-height: 0; overflow-y: auto; padding-right: 10px; /* 为滚动条留出空间 */ display: flex; flex-direction: column; } /* 搜索结果的样式 (全局复用) */ .search-result-item { border-bottom: 1px solid var(--border-color); padding: 15px; margin-bottom: 15px; transition: background-color 0.2s ease; border-radius: 8px; } .search-result-item:last-child { border-bottom: none; margin-bottom: 0; } .search-result-item:hover { background-color: rgba(var(--primary-rgb), 0.05); } .search-result-item h4 { margin-bottom: 5px; } .search-result-item p { font-size: 14px; color: var(--text-secondary); margin-bottom: 10px; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; text-overflow: ellipsis; } .search-result-item .result-meta { font-size: 12px; color: var(--text-secondary); display: flex; flex-wrap: wrap; gap: 15px; } .search-result-item .result-meta span { display: inline-flex; align-items: center; gap: 5px; } .search-result-item .result-meta .domain { color: var(--success-color); font-weight: 600; } /* “查看详细” 按钮 */ .view-full-results-btn { display: block; width: 200px; margin: 20px auto; text-align: center; } /* --- [修复] 欢迎页 - 右侧滑出式更新面板 --- */ .update-slide-out-panel { position: fixed; top: 40px; /* 保持在主窗口标题栏下方 */ right: 0; /* [修复] 设定一个固定的、更合理的宽度 */ width: 450px; max-width: 90vw; /* 确保在小屏幕上不会溢出 */ height: calc(100vh - 40px); /* 占满剩余高度 */ background-color: rgba(var(--card-background-rgb), 0.9); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); border-left: 1px solid var(--border-color); box-shadow: -10px 0 30px var(--shadow-color-hover); z-index: 1000; display: flex; flex-direction: column; box-sizing: border-box; /* [修复] 使用 transform 实现动画,从右侧 100% (完全隐藏) 滑入 */ transform: translateX(100%); transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .update-slide-out-panel.active { /* [修复] 滑入视图 (0% 偏移) */ transform: translateX(0); } /* [修复] 头部样式和关闭按钮 */ .update-panel-header { padding: 20px 24px 15px 24px; flex-shrink: 0; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--border-color); position: relative; /* 为关闭按钮提供定位基准 */ } .update-panel-header h2 { margin: 0; padding-right: 40px; /* 为关闭按钮留出空间 */ } /* [修复 3] 合理设计关闭按钮位置 (使用绝对定位) */ #close-update-panel-btn { /* [修复] 将关闭按钮绝对定位于右上角 */ position: absolute; top: 18px; /* 垂直居中 */ right: 20px; -webkit-app-region: no-drag; z-index: 1001; /* 确保在最上层 */ } /* 复用 changelog 样式 */ .update-slide-out-panel .changelog-list { flex-grow: 1; overflow-y: auto; padding: 20px 24px 24px; min-height: 0; } .welcome-header { display: flex; justify-content: space-between; align-items: center; flex-shrink: 0; } /* --- [Req 1 & 3] 右侧滑出式更新面板 (不遮挡窗口控件) --- */ .update-slide-out-panel { position: fixed; /* 修复:顶部从 40px 开始,避开标题栏 */ top: 40px; right: -35%; /* 初始隐藏 */ width: 30%; /* 修复:高度不遮挡标题栏 */ height: calc(100vh - 40px); background-color: rgba(var(--card-background-rgb), 0.9); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); border-left: 1px solid var(--border-color); box-shadow: -10px 0 30px var(--shadow-color-hover); z-index: 1000; transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); display: flex; flex-direction: column; box-sizing: border-box; } .update-slide-out-panel.active { transform: translateX(-100%); /* 滑入视图 */ } .update-panel-header { padding: 20px 24px 15px 24px; flex-shrink: 0; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--border-color); /* 增加分割线 */ } .update-panel-header h2 { margin: 0; } .update-slide-out-panel .changelog-list { flex-grow: 1; overflow-y: auto; padding: 20px 24px 24px; min-height: 0; } /* --- [Req 2] 公告 - 溢出时显示 "..." 并可点击 --- */ .compact-announcement.is-overflowing p { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .compact-announcement.is-overflowing { cursor: pointer; /* 提示用户可以点击 */ } .compact-announcement.is-overflowing:hover { border-color: var(--primary-color); /* 悬停时高亮 */ } /* --- [Req 2] 公告 - 模态框 (遮罩层和内容框) --- */ .modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); z-index: 2000; display: flex; justify-content: center; align-items: center; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; /* [修复] 默认隐藏,防止意外显示 */ visibility: hidden; } .modal-overlay.active { opacity: 1; pointer-events: auto; visibility: visible; } .modal-content { background-color: rgba(var(--card-background-rgb), 0.95); border-radius: var(--border-radius); border: 1px solid var(--border-color); box-shadow: 0 10px 30px var(--shadow-color-hover); width: 90%; max-width: 500px; max-height: 80vh; display: flex; flex-direction: column; transform: scale(0.95); transition: transform 0.3s ease; } .modal-overlay.active .modal-content { transform: scale(1); } .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 15px 20px; border-bottom: 1px solid var(--border-color); flex-shrink: 0; } .modal-header h3 { margin: 0; font-size: 18px; } .modal-body { padding: 20px; overflow-y: auto; flex-grow: 1; white-space: normal; line-height: 1.6; } .modal-body p { margin: 0; color: var(--text-color); } /* --- [修复] 欢迎页 - 右侧滑出式更新面板 (全新设计) --- */ .update-slide-out-panel { position: fixed; top: 40px; /* 保持在主窗口标题栏下方 */ right: 0; /* [Req 1] 宽度调整为 480px (原为 450px) */ width: 480px; max-width: 90vw; /* 确保在小屏幕上不会溢出 */ height: calc(100vh - 40px); /* 占满剩余高度 */ background-color: rgba(var(--card-background-rgb), 0.9); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); border-left: 1px solid var(--border-color); box-shadow: -10px 0 30px var(--shadow-color-hover); z-index: 1000; /* 必须在遮罩层之上 */ display: flex; flex-direction: column; box-sizing: border-box; /* [修复] 使用 transform 实现动画,从右侧 100% (完全隐藏) 滑入 */ transform: translateX(100%); transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .update-slide-out-panel.active { transform: translateX(0); /* 滑入视图 */ } /* [修复] 头部样式和关闭按钮 (确保 "X" 按钮可见) */ .update-panel-header { padding: 20px 24px 15px 24px; flex-shrink: 0; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--border-color); position: relative; /* 为关闭按钮提供定位基准 */ } .update-panel-header h2 { margin: 0; padding-right: 40px; /* 为关闭按钮留出空间 */ } #close-update-panel-btn { /* [修复] 将关闭按钮绝对定位于右上角 */ position: absolute; top: 18px; /* 垂直居中 */ right: 20px; -webkit-app-region: no-drag; z-index: 1001; /* 确保在最上层 */ } .update-slide-out-panel .changelog-list { flex-grow: 1; overflow-y: auto; padding: 20px 24px 24px; min-height: 0; } /* [修复] 日志条目 - 重新设计为“标题-内容”布局 */ .changelog-item { display: block; /* 移除 grid 布局 */ padding-bottom: 15px; margin-bottom: 15px; border-bottom: 1px solid var(--border-color); } .changelog-item:last-child { border-bottom: none; margin-bottom: 0; } .changelog-key { font-weight: 600; color: var(--text-secondary); text-align: left; font-size: 14px; background-color: var(--tag-bg-color); padding: 4px 10px; border-radius: 6px; display: inline-block; margin-bottom: 12px; } /* [修复] 内容换行 (解决截图 中的问题) */ .changelog-value { font-size: 15px; color: var(--text-color); white-space: normal; /* 允许自动换行 */ word-wrap: break-word; /* 强制长单词断开 */ line-height: 1.6; } .changelog-value br { display: block; content: ""; margin-top: 8px; } .changelog-value b, .changelog-value strong { color: var(--primary-color); font-weight: 600; } /* --- [Req 2] 更新日志 - "点击外部关闭" 遮罩层 --- */ .update-panel-overlay { position: fixed; top: 40px; /* 保持不变:避开顶部标题栏 */ /* [修改点 1] 左边距设为 70px,即导航栏的宽度 */ left: 70px; /* [修改点 2] 宽度改为 总宽度减去导航栏的 70px */ width: calc(100% - 70px); height: calc(100vh - 40px); background-color: rgba(0, 0, 0, 0.3); backdrop-filter: blur(2px); z-index: 999; opacity: 0; pointer-events: none; transition: opacity 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .update-panel-overlay.active { opacity: 1; pointer-events: auto; } /* --- [修复] 欢迎页 - 右侧滑出式更新面板 (全新设计) --- */ .update-slide-out-panel { position: fixed; top: 40px; width: 480px; /* [修复] 宽度调整为 480px (原为 450px) */ max-width: 90vw; right: 0; height: calc(100vh - 40px); background-color: rgba(var(--card-background-rgb), 0.9); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); border-left: 1px solid var(--border-color); box-shadow: -10px 0 30px var(--shadow-color-hover); z-index: 1000; display: flex; flex-direction: column; box-sizing: border-box; /* [修复 2] 将面板多向右推 2px,使其 1px 边框完全移出屏幕 */ transform: translateX(calc(100% + 2px)); transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .update-slide-out-panel.active { transform: translateX(0); /* 滑入视图 */ } /* [修复 2] 头部样式和关闭按钮 (确保 "X" 按钮可见) */ .update-panel-header { padding: 20px 24px 15px 24px; flex-shrink: 0; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--border-color); position: relative; } .update-panel-header h2 { margin: 0; padding-right: 40px; /* 为关闭按钮留出空间 */ } #close-update-panel-btn { /* [修复 2] 将关闭按钮绝对定位于右上角 */ position: absolute; top: 18px; right: 20px; -webkit-app-region: no-drag; z-index: 1001; } .update-slide-out-panel .changelog-list { flex-grow: 1; overflow-y: auto; padding: 20px 24px 24px; min-height: 0; } /* [修复 1] 日志条目 - 重新设计为“标题-内容”布局 */ .changelog-item { display: block; padding-bottom: 15px; margin-bottom: 15px; border-bottom: 1px solid var(--border-color); } .changelog-item:last-child { border-bottom: none; margin-bottom: 0; } .changelog-key { font-weight: 600; color: var(--text-secondary); text-align: left; font-size: 14px; background-color: var(--tag-bg-color); padding: 4px 10px; border-radius: 6px; display: inline-block; margin-bottom: 12px; } /* [修复 1] 内容换行 (解决截图 中的问题) */ .changelog-value { font-size: 15px; color: var(--text-color); white-space: normal; word-wrap: break-word; line-height: 1.6; } .changelog-value br { display: block; content: ""; margin-top: 8px; } .changelog-value b, .changelog-value strong { color: var(--primary-color); font-weight: 600; } /* [修复 1] 欢迎页“查看详细”按钮底部间距 */ .view-full-results-btn { display: block; width: 200px; margin: 20px auto; /* [修复 1] 增加额外的底部 margin,确保滚动到底部时可见 */ margin-bottom: 40px; } /* --- [修复 2] 更新日志 - "点击外部关闭" 遮罩层 --- */ .update-panel-overlay { position: fixed; top: 40px; left: 0; width: 100%; height: calc(100vh - 40px); background-color: rgba(0, 0, 0, 0.3); backdrop-filter: blur(2px); z-index: 999; opacity: 0; pointer-events: none; transition: opacity 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .update-panel-overlay.active { opacity: 1; pointer-events: auto; } .logs-container { padding: 10px 20px; /* [新增] 占据剩余空间 */ flex-grow: 1; /* [新增] 允许垂直滚动 */ overflow-y: auto; /* [新增] 修复 flex 布局在 overflow 下的高度计算问题 */ min-height: 0; } /* --- “关于”页面自定义样式 (设置页内) --- */ /* 作者信息卡片 */ .author-card { padding: 24px; background-color: rgba(var(--card-background-rgb), 0.5); border: 1px solid var(--border-color); border-radius: var(--border-radius); text-align: center; transition: all var(--transition-duration) ease; } .author-card:hover { box-shadow: 0 8px 25px var(--shadow-color-hover); border-color: rgba(var(--primary-rgb), 0.3); } .author-avatar { width: 80px; height: 80px; border-radius: 50%; background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); color: white; display: flex; align-items: center; justify-content: center; font-size: 40px; margin: 0 auto 20px auto; box-shadow: 0 4px 15px rgba(var(--primary-rgb), 0.3); } .author-name { font-size: 22px; font-weight: 700; color: var(--text-color); margin-bottom: 8px; } .author-desc { font-size: 14px; color: var(--text-secondary); margin-bottom: 20px; } .author-links { display: flex; justify-content: center; gap: 15px; } /* 官网/反馈 链接按钮 */ .link-btn { padding: 8px 16px; border: 1px solid var(--border-color); background-color: transparent; color: var(--text-secondary); border-radius: 12px; font-size: 14px; font-weight: 600; cursor: pointer; display: flex; align-items: center; gap: 8px; transition: all 0.2s ease-in-out; } .link-btn:hover { background-color: var(--border-color); color: var(--primary-color); border-color: var(--primary-color); } /* 鸣谢区域 */ .thanks-section { padding: 24px; background-color: rgba(var(--card-background-rgb), 0.5); border: 1px solid var(--border-color); border-radius: var(--border-radius); margin-top: 20px; /* 与上方卡片分离 */ } .thanks-section h3 { font-size: 16px; font-weight: 600; color: var(--text-secondary); margin: 0 0 15px 0; padding-bottom: 10px; border-bottom: 1px solid var(--border-color); display: flex; align-items: center; gap: 10px; } .thanks-list { display: flex; flex-direction: column; gap: 10px; } .thanks-item { display: flex; align-items: center; gap: 12px; padding: 12px; border-radius: 12px; background-color: rgba(var(--bg-color-rgb), 0.5); /* 使用更浅的背景 */ border: 1px solid var(--border-color); transition: all 0.2s ease; cursor: pointer; } .thanks-item:hover { background-color: rgba(var(--card-background-rgb), 0.8); border-color: var(--primary-color); } .thanks-item .icon { font-size: 18px; color: var(--primary-color); width: 20px; text-align: center; } .thanks-item .text-content { font-size: 14px; font-weight: 600; color: var(--text-color); } /* “更多信息”按钮的外层容器 */ .about-buttons { /* 确保按钮居中 (mainPage.js 中已设置了 margin-top) */ display: flex; justify-content: center; } /* --- [修复] 下拉菜单 z-index 和定位修复 --- */ .custom-select-options { /* [修改] 改为 fixed,使其脱离父容器的 overflow 限制 */ position: fixed; /* [修改] 提高 z-index,确保在所有元素之上 (高于滑出式面板的 1000) */ z-index: 10001; background-color: rgba(var(--card-background-rgb), 0.9); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border: 1px solid var(--border-color); border-radius: var(--border-radius); box-shadow: 0 8px 20px var(--shadow-color-hover); padding: 6px; max-height: 200px; overflow-y: auto; /* [修改] 动画现在由 JS 切换 '.dynamic-active' 类控制 */ opacity: 0; transform: translateY(-10px); pointer-events: none; transition: opacity 0.2s ease, transform 0.2s ease; display: block; /* 保持块状,以便 JS 可以计算其高度 */ } /* [新增] 使用这个新类来激活下拉菜单 */ .custom-select-options.dynamic-active { opacity: 1; transform: translateY(0); pointer-events: auto; } /* --- [修复] 欢迎页 - 右侧滑出式更新面板 (修复截图中的问题) --- */ .update-slide-out-panel { position: fixed; top: 40px; /* [修复] 必须从 40px 开始,避开标题栏 */ right: 0; width: 480px; max-width: 90vw; height: calc(100vh - 40px); /* [修复] 占满剩余高度 */ background-color: rgba(var(--card-background-rgb), 0.9); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); border-left: 1px solid var(--border-color); box-shadow: -10px 0 30px var(--shadow-color-hover); z-index: 1000; /* [修复] 高于 .version-display (100) */ display: flex; flex-direction: column; box-sizing: border-box; transform: translateX(calc(100% + 2px)); transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .update-slide-out-panel.active { transform: translateX(0); /* 滑入视图 */ } .update-panel-header { padding: 20px 24px 15px 24px; flex-shrink: 0; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--border-color); position: relative; } .update-panel-header h2 { margin: 0; padding-right: 40px; } #close-update-panel-btn { position: absolute; top: 18px; right: 20px; -webkit-app-region: no-drag; z-index: 1001; } .update-slide-out-panel .changelog-list { flex-grow: 1; overflow-y: auto; padding: 20px 24px 24px; min-height: 0; } /* --- [修复] 更新日志 - "点击外部关闭" 遮罩层 --- */ .update-panel-overlay { position: fixed; top: 40px; /* [修复] 必须从 40px 开始 */ left: 0; width: 100%; height: calc(100vh - 40px); background-color: rgba(0, 0, 0, 0.3); backdrop-filter: blur(2px); z-index: 999; /* [修复] 必须低于面板(1000),但高于 .version-display(100) */ opacity: 0; pointer-events: none; transition: opacity 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .update-panel-overlay.active { opacity: 1; pointer-events: auto; } /* --- [修复] 下拉菜单 z-index 和定位修复 --- */ .custom-select-options { /* [修改] 改为 fixed,使其脱离父容器的 overflow 限制 */ position: fixed; /* [修改] 提高 z-index,确保在所有元素之上 (高于滑出式面板的 1000) */ z-index: 10001; background-color: rgba(var(--card-background-rgb), 0.9); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border: 1px solid var(--border-color); border-radius: var(--border-radius); box-shadow: 0 8px 20px var(--shadow-color-hover); padding: 6px; max-height: 200px; overflow-y: auto; /* [修改] 动画现在由 JS 切换 '.dynamic-active' 类控制 */ opacity: 0; transform: translateY(-10px); pointer-events: none; transition: opacity 0.2s ease, transform 0.2s ease; display: block; /* 保持块状,以便 JS 可以计算其高度 */ } /* [新增] 使用这个新类来激活下拉菜单 */ .custom-select-options.dynamic-active { opacity: 1; transform: translateY(0); pointer-events: auto; } /* --- [修复] 欢迎页 - 右侧滑出式更新面板 (修复截图中的问题) --- */ .update-slide-out-panel { position: fixed; top: 40px; /* [修复] 必须从 40px 开始,避开标题栏 */ right: 0; width: 480px; max-width: 90vw; height: calc(100vh - 40px); /* [修复] 占满剩余高度 */ background-color: rgba(var(--card-background-rgb), 0.9); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); border-left: 1px solid var(--border-color); box-shadow: -10px 0 30px var(--shadow-color-hover); z-index: 1000; /* [修复] 高于 .version-display (100) */ display: flex; flex-direction: column; box-sizing: border-box; transform: translateX(calc(100% + 2px)); transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .update-slide-out-panel.active { transform: translateX(0); /* 滑入视图 */ } .update-panel-header { padding: 20px 24px 15px 24px; flex-shrink: 0; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--border-color); position: relative; } .update-panel-header h2 { margin: 0; padding-right: 40px; } #close-update-panel-btn { position: absolute; top: 18px; right: 20px; -webkit-app-region: no-drag; z-index: 1001; } .update-slide-out-panel .changelog-list { flex-grow: 1; overflow-y: auto; padding: 20px 24px 24px; min-height: 0; } /* --- [修复] 更新日志 - "点击外部关闭" 遮罩层 --- */ .update-panel-overlay { position: fixed; top: 40px; /* 保持不变:避开顶部标题栏 */ /* [修改点 1] 左边距设为 70px,即导航栏的宽度 */ left: 70px; /* [修改点 2] 宽度改为 总宽度减去导航栏的 70px */ width: calc(100% - 70px); height: calc(100vh - 40px); background-color: rgba(0, 0, 0, 0.3); backdrop-filter: blur(2px); z-index: 999; opacity: 0; pointer-events: none; transition: opacity 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .update-panel-overlay.active { opacity: 1; pointer-events: auto; } /* --- [新增] 修复系统工具滚动条 --- */ #system-tool-content { flex-grow: 1; /* 强制 Y 轴滚动 */ overflow-y: auto !important; /* 确保 Flex 子项高度被正确计算 */ min-height: 0; /* 增加底部内边距,防止最后一个卡片贴底 */ padding-bottom: 20px; /* 确保宽度占满 */ width: 100%; } /* 确保网格布局在 system-tool-content 内部表现良好 */ #system-tool-content .toolbox-grid { /* 移除网格本身的 margin-top,改由父容器 padding 控制 */ margin-top: 0; padding: 10px; /* 给网格一点内边距 */ /* 确保网格容器不会溢出父容器宽度 */ box-sizing: border-box; } /* --- [重构] 通用自适应下拉菜单样式 --- */ /* 选项容器 (基础状态) */ .custom-select-options { position: fixed; /* 脱离文档流,由 JS 精确控制位置 */ z-index: 10001; /* 确保在最顶层 */ min-width: 120px; background-color: rgba(var(--card-background-rgb), 0.95); backdrop-filter: blur(16px) saturate(180%); -webkit-backdrop-filter: blur(16px) saturate(180%); border: 1px solid var(--border-color); border-radius: 12px; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2); /* 更柔和的深阴影 */ padding: 6px; max-height: 300px; overflow-y: auto; /* 动画初始状态: 隐藏、缩小、透明 */ opacity: 0; transform: scaleY(0.8); pointer-events: none; transition: opacity 0.2s cubic-bezier(0.2, 0.8, 0.2, 1), transform 0.25s cubic-bezier(0.2, 0.8, 0.2, 1); /* 隐藏滚动条但保持滚动功能 */ scrollbar-width: none; } .custom-select-options::-webkit-scrollbar { display: none; } /* 激活状态 (由 JS 添加 dynamic-active 类) */ .custom-select-options.dynamic-active { opacity: 1; transform: scaleY(1); /* 恢复正常大小 */ pointer-events: auto; } /* 下拉模式 (默认) */ .custom-select-options.drop-down { transform-origin: top center; /* 从顶部展开 */ } /* 上拉模式 (空间不足时) */ .custom-select-options.drop-up { transform-origin: bottom center; /* 从底部展开 */ box-shadow: 0 -10px 40px rgba(0, 0, 0, 0.2); /* 阴影向上 */ } /* 选项样式优化 */ .custom-select-option { padding: 10px 12px; border-radius: 8px; cursor: pointer; font-size: 14px; color: var(--text-color); font-weight: 500; transition: all 0.15s ease; display: flex; align-items: center; justify-content: space-between; } .custom-select-option:hover { background-color: var(--primary-color); color: white; transform: translateX(2px); /* 悬停微动效果 */ } /* 分组标题优化 */ .custom-select-group-title { font-size: 11px; font-weight: 700; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 1px; padding: 8px 12px 4px 12px; opacity: 0.8; } .custom-select-group:not(:last-child) { border-bottom: 1px dashed var(--border-color); margin-bottom: 4px; padding-bottom: 4px; } /* --- [重构] 通用自适应下拉菜单样式 --- */ .custom-select-wrapper { position: relative; min-width: 120px; } /* 触发器样式 */ .custom-select-trigger { display: flex; justify-content: space-between; align-items: center; padding: 8px 12px; background-color: rgba(var(--card-background-rgb), 0.7); border: 1px solid var(--border-color); border-radius: 8px; cursor: pointer; transition: border-color 0.2s ease, box-shadow 0.2s ease; font-size: 14px; font-weight: 500; color: var(--text-color); } .custom-select-trigger:hover { border-color: var(--primary-color); } .custom-select-wrapper.active .custom-select-trigger { border-color: var(--primary-color); box-shadow: 0 0 0 2px rgba(var(--primary-rgb), 0.2); } .custom-select-arrow { color: var(--text-secondary); transition: transform 0.3s ease; } /* 选项容器 (浮动) */ .custom-select-options { position: fixed; /* 脱离文档流,由 JS 精确控制位置 */ z-index: 10001; /* 确保在最顶层 */ min-width: 120px; background-color: rgba(var(--card-background-rgb), 0.95); backdrop-filter: blur(16px) saturate(180%); -webkit-backdrop-filter: blur(16px) saturate(180%); border: 1px solid var(--border-color); border-radius: 12px; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2); padding: 6px; max-height: 300px; overflow-y: auto; /* 动画初始状态: 隐藏、缩小、透明 */ opacity: 0; transform: scaleY(0.8); pointer-events: none; transition: opacity 0.2s cubic-bezier(0.2, 0.8, 0.2, 1), transform 0.25s cubic-bezier(0.2, 0.8, 0.2, 1); /* 隐藏滚动条但保持滚动功能 */ scrollbar-width: none; } .custom-select-options::-webkit-scrollbar { display: none; } /* 激活状态 */ .custom-select-options.dynamic-active { opacity: 1; transform: scaleY(1); pointer-events: auto; } /* 下拉模式 (默认) */ .custom-select-options.drop-down { transform-origin: top center; } /* 上拉模式 (空间不足时) */ .custom-select-options.drop-up { transform-origin: bottom center; box-shadow: 0 -10px 40px rgba(0, 0, 0, 0.2); } /* 选项样式 */ .custom-select-option { padding: 10px 12px; border-radius: 8px; cursor: pointer; font-size: 14px; color: var(--text-color); font-weight: 500; transition: all 0.15s ease; display: flex; align-items: center; justify-content: space-between; } .custom-select-option:hover { background-color: var(--primary-color); color: white; transform: translateX(2px); } /* 分组标题 */ .custom-select-group-title { font-size: 11px; font-weight: 700; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 1px; padding: 8px 12px 4px 12px; opacity: 0.8; } .custom-select-group:not(:last-child) { border-bottom: 1px dashed var(--border-color); margin-bottom: 4px; padding-bottom: 4px; } /* ============================================ 字体下载模态框样式(最新版 - 合并重复样式) ============================================ */ .font-download-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; /* [修复] 遮罩层颜色根据主题自适应 */ background-color: rgba(0, 0, 0, 0.7); /* 增强背景模糊,屏蔽底层干扰 */ backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); z-index: 20000; display: flex; justify-content: center; align-items: center; opacity: 0; pointer-events: none; transition: opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.4s cubic-bezier(0.4, 0, 0.2, 1); } /* [修复] 浅色模式下的遮罩层 */ body[data-theme="light"] .font-download-modal { background-color: rgba(0, 0, 0, 0.5); } /* [修复] 深色模式下的遮罩层 */ body[data-theme="dark"] .font-download-modal { background-color: rgba(0, 0, 0, 0.75); } .font-download-modal.active { opacity: 1; pointer-events: auto; } .font-modal-card { /* 使用 95% 不透明度,既保留质感又确保文字清晰可见 */ background-color: rgba(var(--card-background-rgb), 0.95); border: 1px solid var(--border-color); border-radius: 20px; padding: 30px 25px; width: 340px; text-align: center; /* 添加深邃的阴影,增加立体感 */ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.05); /* 初始状态稍微下沉 */ transform: scale(0.95) translateY(10px); transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1), background-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.4s cubic-bezier(0.4, 0, 0.2, 1); } .font-download-modal.active .font-modal-card { transform: scale(1) translateY(0); } .font-modal-icon { font-size: 48px; color: var(--primary-color); margin-bottom: 15px; /* 给图标加一点发光效果 */ filter: drop-shadow(0 4px 8px rgba(var(--primary-rgb), 0.3)); } .font-modal-card h3 { margin: 0 0 8px 0; font-size: 18px; color: var(--text-color); transition: color 0.4s cubic-bezier(0.4, 0, 0.2, 1); } .font-modal-card p#font-download-status { margin: 0; color: var(--text-secondary); font-size: 14px; line-height: 1.5; transition: color 0.4s cubic-bezier(0.4, 0, 0.2, 1); } /* 进度条轨道 */ .font-progress-bg { width: 100%; height: 8px; /* 使用边框颜色作为轨道背景,自动适应深浅模式 */ background-color: var(--border-color); border-radius: 4px; margin: 20px 0 12px; overflow: hidden; position: relative; } /* 进度条本体 */ .font-progress-bar { height: 100%; width: 0%; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); border-radius: 4px; transition: width 0.15s linear; /* 进度条高光 */ box-shadow: 0 0 10px rgba(var(--primary-rgb), 0.4); } #font-download-percent { font-size: 14px; font-family: 'Consolas', 'Monaco', monospace; color: var(--text-color); font-weight: 700; transition: color 0.4s cubic-bezier(0.4, 0, 0.2, 1); } /* [修复] 主题切换时确保模态框内容正确更新 */ html.theme-transitioning .font-download-modal, html.theme-transitioning .font-modal-card, html.theme-transitioning .font-modal-card * { transition: background-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), color 0.4s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important; } /* [修复] 确保模态框图标和进度条在主题切换时正确更新 */ html.theme-transitioning .font-modal-icon, html.theme-transitioning .font-progress-bg, html.theme-transitioning .font-progress-bar { transition: color 0.4s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important; } /* ================================================= */ /* --- 2025 "Deep Obsidian" Capsule Style (O__) --- */ /* ================================================= */ body:has(.splash-pill) { margin: 0; padding: 0; width: 100vw; height: 100vh; display: flex; align-items: center; justify-content: center; background: transparent !important; overflow: hidden; user-select: none; -webkit-app-region: drag; } .splash-pill { position: relative; width: 460px; /* [优化] 稍微加宽 */ height: 120px; /* [优化] 稍微加高 */ /* [优化] 核心改动:不再使用高透明,而是深色背景 + 极高模糊 */ /* 适配深色/浅色模式的背景逻辑 */ background: linear-gradient(145deg, rgba(var(--card-background-rgb), 0.98), rgba(var(--card-background-rgb), 0.92)); backdrop-filter: blur(50px) saturate(200%); -webkit-backdrop-filter: blur(50px) saturate(200%); /* [优化] 强力模糊,屏蔽背景干扰 */ border-radius: 60px; /* [优化] 完全圆润 */ /* [优化] 精致的边缘光 (Inner Border) */ border: 1px solid rgba(255, 255, 255, 0.12); /* 如果是浅色模式,边缘需要暗一点 */ /* [优化] 复合阴影:一层深阴影负责立体感,一层彩色光晕负责氛围 */ box-shadow: 0 25px 70px -10px rgba(0, 0, 0, 0.6), /* 浮空阴影 */ inset 0 1px 0 rgba(255, 255, 255, 0.2), /* 顶部高光 */ 0 0 40px rgba(var(--primary-rgb), 0.1); /* [优化] 添加微妙的彩色光晕 */ display: flex; align-items: center; padding: 14px 28px; /* [优化] 增加内边距 */ box-sizing: border-box; /* [优化] 进场动画:从只有一点点大弹出来 */ animation: pillPopIn 0.7s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards; opacity: 0; transform: scale(0.85) translateY(25px); } /* 深色/浅色模式特定微调 */ body[data-theme="light"] .splash-pill { background: linear-gradient(145deg, #ffffff, #f0f0f3); border-color: rgba(0, 0, 0, 0.05); box-shadow: 0 20px 50px -10px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 1); } /* 左侧 Logo 区域 */ .pill-logo { width: 64px; height: 64px; border-radius: 50%; /* 使用深色底座让图标浮起来 */ background: rgba(0, 0, 0, 0.05); display: flex; align-items: center; justify-content: center; position: relative; flex-shrink: 0; margin-right: 25px; } .logo-icon { font-size: 32px; /* 渐变色图标 */ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; filter: drop-shadow(0 2px 5px rgba(var(--primary-rgb), 0.2)); z-index: 2; } /* 动态光环:只显示一个精致的圆弧 */ .logo-rotate-ring { position: absolute; top: -3px; left: -3px; right: -3px; bottom: -3px; border-radius: 50%; border: 2px solid transparent; border-top-color: var(--primary-color); border-right-color: var(--primary-color); opacity: 0.8; animation: spin 2s linear infinite; } /* 右侧内容区域 */ .pill-content { flex-grow: 1; display: flex; flex-direction: column; justify-content: center; min-width: 0; } .pill-header { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 12px; } .app-name { font-size: 18px; font-weight: 800; color: var(--text-color); letter-spacing: 0.5px; } .progress-percent { font-size: 15px; font-weight: 700; font-family: 'Consolas', 'Roboto Mono', monospace; color: var(--primary-color); opacity: 0.9; } /* 进度条轨道 */ .progress-track { width: 100%; height: 6px; background: rgba(128, 128, 128, 0.15); border-radius: 10px; overflow: hidden; position: relative; margin-bottom: 10px; } /* [优化] 进度条填充 */ .progress-bar { height: 100%; width: 0%; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); border-radius: 10px; position: relative; box-shadow: 0 0 12px rgba(var(--primary-rgb), 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.2); /* [优化] 发光进度条,增强视觉效果 */ transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1); /* [优化] 平滑的进度条动画 */ overflow: hidden; } /* [优化] 进度条发光效果增强 */ .progress-light { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); animation: progressShine 2s ease-in-out infinite; } @keyframes progressShine { 0% { transform: translateX(-100%); } 100% { transform: translateX(200%); } } .status-text { font-size: 12px; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-weight: 500; opacity: 0.7; margin: 0; transition: opacity 0.3s; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @keyframes pillPopIn { 0% { opacity: 0; transform: scale(0.85) translateY(25px); } 100% { opacity: 1; transform: scale(1) translateY(0); } } /* [优化] 进度条发光效果增强 */ .progress-light { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); animation: progressShine 2s ease-in-out infinite; } @keyframes progressShine { 0% { transform: translateX(-100%); } 100% { transform: translateX(200%); } } /* ========================================= */ /* --- 2025 Dynamic Island Toolbox UI --- */ /* ========================================= */ .toolbox-page-container { display: flex; gap: 24px; padding: 10px 20px 20px 20px; height: 100%; box-sizing: border-box; } /* --- 1. 侧边栏岛屿 (Floating Sidebar) --- */ .toolbox-sidebar-island { width: 200px; flex-shrink: 0; background: rgba(var(--card-background-rgb), 0.4); backdrop-filter: blur(20px) saturate(180%); border: 1px solid var(--border-color); border-radius: 24px; padding: 15px; display: flex; flex-direction: column; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); height: 100%; box-sizing: border-box; } .sidebar-header { font-size: 12px; font-weight: 800; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 1px; padding: 10px 15px; margin-bottom: 10px; opacity: 0.7; } .sidebar-scroll-area { flex-grow: 1; overflow-y: auto; /* 隐藏滚动条但保留功能 */ scrollbar-width: none; } .sidebar-scroll-area::-webkit-scrollbar { display: none; } /* 侧边栏按钮 */ .island-nav-item { position: relative; width: 100%; display: flex; align-items: center; padding: 14px 16px; margin-bottom: 8px; background: transparent; border: none; border-radius: 16px; cursor: pointer; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); overflow: hidden; } .island-nav-item:hover { background: rgba(var(--text-color), 0.05); } .island-nav-item.active { background: rgba(var(--primary-rgb), 0.1); border: 0.5px solid rgba(var(--primary-rgb), 0.2); box-shadow: 0 1px 3px rgba(var(--primary-rgb), 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.05); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); position: relative; overflow: visible; transform: translateX(4px); font-weight: 600; transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); } .island-nav-item.active::before { content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 3px; height: 60%; background: var(--primary-color); border-radius: 0 2px 2px 0; opacity: 0.8; transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } .nav-text { font-size: 15px; font-weight: 600; color: var(--text-secondary); position: relative; z-index: 2; transition: color 0.3s ease; } .island-nav-item.active .nav-text { color: var(--primary-color); } /* 选中时的小圆点指示器(可选) */ .nav-indicator { width: 6px; height: 6px; border-radius: 50%; background: white; margin-right: 12px; opacity: 0; transform: scale(0); transition: all 0.3s; } .island-nav-item.active .nav-indicator { display: none; /* 使用左侧指示条替代 */ } /* --- 2. 主内容区 --- */ .toolbox-main-content { flex-grow: 1; display: flex; flex-direction: column; min-width: 0; gap: 20px; } /* --- 3. 顶部搜索岛屿 (Header Island) --- */ .toolbox-header-island { display: flex; justify-content: space-between; align-items: center; background: rgba(var(--card-background-rgb), 0.4); backdrop-filter: blur(20px); border: 1px solid var(--border-color); border-radius: 24px; padding: 12px 24px; flex-shrink: 0; box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05); } .header-title { font-size: 20px; font-weight: 700; display: flex; align-items: center; gap: 10px; } .island-search-wrapper { position: relative; width: 300px; transition: width 0.3s ease; } .island-search-wrapper:focus-within { width: 350px; /* 聚焦时变长 */ } .search-icon { position: absolute; left: 15px; top: 50%; transform: translateY(-50%); color: var(--text-secondary); font-size: 14px; pointer-events: none; } #toolbox-search { width: 100%; padding: 10px 15px 10px 40px; border-radius: 20px; border: 1px solid transparent; background: rgba(var(--bg-color-rgb), 0.6); color: var(--text-color); font-size: 14px; transition: all 0.3s; box-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.05); } #toolbox-search:focus { outline: none; background: rgba(var(--bg-color-rgb), 0.9); border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.2); } /* --- 4. Bento Grid (便当盒网格) --- */ .toolbox-bento-grid { display: grid; /* 自动适应宽度,卡片最小宽度 240px */ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 20px; flex-grow: 1; overflow-y: auto; padding-right: 5px; /* 留出一点空间给滚动条 */ padding-bottom: 20px; align-content: start; /* 内容不足时靠上对齐 */ } /* Bento Card 样式 */ .bento-card { position: relative; background: rgba(var(--card-background-rgb), 0.5); border: 1px solid var(--border-color); border-radius: 24px; padding: 20px; cursor: pointer; overflow: hidden; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); display: flex; flex-direction: column; /* 进场动画 */ opacity: 0; animation: bentoFadeIn 0.5s cubic-bezier(0.2, 0.8, 0.2, 1) forwards; } .bento-card:hover { transform: translateY(-5px); /* 悬浮上移 */ background: rgba(var(--card-background-rgb), 0.8); border-color: rgba(var(--primary-rgb), 0.3); box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1), 0 0 0 1px rgba(var(--primary-rgb), 0.1) inset; } .bento-card:active { transform: scale(0.98); /* 点击按压 */ } /* 卡片背景光晕 */ .card-bg-glow { position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: radial-gradient(circle at 50% 50%, rgba(var(--primary-rgb), 0.05), transparent 60%); opacity: 0; transition: opacity 0.5s; pointer-events: none; } .bento-card:hover .card-bg-glow { opacity: 1; } .card-inner { position: relative; z-index: 1; display: flex; flex-direction: column; height: 100%; } .card-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 15px; } /* 图标容器 */ .bento-icon-box { width: 54px; height: 54px; background: rgba(var(--bg-color-rgb), 0.8); border-radius: 18px; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05); transition: transform 0.3s; } .bento-card:hover .bento-icon-box { transform: scale(1.1) rotate(5deg); background: var(--primary-color); } .bento-icon-img { width: 28px; height: 28px; object-fit: contain; /* 适配深色/浅色模式的图标颜色翻转,根据实际图标类型调整 */ filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1)); transition: filter 0.3s; } .bento-card:hover .bento-icon-img { filter: brightness(0) invert(1); /* 悬浮时图标变白 */ } /* 右上角箭头 */ .action-arrow { width: 28px; height: 28px; border-radius: 50%; border: 1px solid var(--border-color); display: flex; align-items: center; justify-content: center; color: var(--text-secondary); font-size: 12px; opacity: 0.5; transition: all 0.3s; } .bento-card:hover .action-arrow { opacity: 1; background: var(--text-color); color: var(--bg-color-rgb); /* 反色 */ border-color: transparent; transform: rotate(-45deg); /* 箭头指向右上 */ } /* 文本区域 */ .tool-name { font-size: 16px; font-weight: 700; margin: 0 0 6px 0; color: var(--text-color); } .tool-desc { font-size: 13px; color: var(--text-secondary); line-height: 1.5; margin: 0; /* 限制显示2行 */ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; opacity: 0.8; } /* 状态徽章 */ .status-badge { font-size: 11px; padding: 2px 8px; border-radius: 10px; font-weight: 600; } .status-badge.maintenance { background: rgba(var(--error-color-rgb), 0.1); color: var(--error-color); border: 1px solid rgba(var(--error-color-rgb), 0.2); } /* 禁用状态 */ .bento-card.disabled { opacity: 0.7; filter: grayscale(0.8); cursor: not-allowed; } .bento-card.disabled:hover { transform: none; box-shadow: none; background: rgba(var(--card-background-rgb), 0.5); } .bento-card.disabled .bento-icon-box { background: rgba(var(--bg-color-rgb), 0.5); transform: none; } .bento-card.disabled:hover .bento-icon-img { filter: none; } /* 空状态 */ .empty-island-state { grid-column: 1 / -1; /* 占满所有列 */ display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 60px 0; color: var(--text-secondary); } .empty-icon { font-size: 40px; margin-bottom: 15px; opacity: 0.5; } /* 动画关键帧 */ @keyframes bentoFadeIn { from { opacity: 0; transform: translateY(20px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } } /* ========================================= */ /* --- 2025 "Island Grid" System --- */ /* ========================================= */ .toolbox-bento-grid { display: grid; /* [优化] 增加最小宽度,防止挤压,并防止横向滚动条 */ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; flex-grow: 1; overflow-y: auto; overflow-x: hidden; /* [优化] 防止横向滚动条 */ padding: 5px 10px 20px 5px; /* 增加 padding 防止阴影被截断 */ align-content: start; /* [优化] 确保内容不超出容器 */ min-width: 0; width: 100%; box-sizing: border-box; } /* --- 核心卡片样式 --- */ .island-card { position: relative; /* [修复] 强制横向布局,解决文字消失问题 */ display: flex; align-items: center; gap: 15px; height: 80px; /* 固定高度,确保统一 */ padding: 0 20px; /* [优化] 确保健康指示器不被裁剪 */ overflow: visible; /* [修复] 增加背景不透明度,解决看不清的问题 */ background: rgba(var(--card-background-rgb), 0.7); backdrop-filter: blur(20px) saturate(180%); border: 1px solid var(--border-color); border-radius: 20px; /* 更加圆润的岛屿造型 */ cursor: pointer; overflow: visible; /* [优化] 改为visible,确保健康指示器不被裁剪 */ transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); /* 弹性贝塞尔曲线 */ /* 进场动画 */ opacity: 0; animation: islandPopIn 0.5s cubic-bezier(0.2, 0.8, 0.2, 1) forwards; } /* [优化] 悬停态:上浮 + 阴影加深 + 边框高亮,但防止超出容器 */ .island-card:hover { transform: translateY(-4px) scale(1.01); background: rgba(var(--card-background-rgb), 0.95); border-color: rgba(var(--primary-rgb), 0.3); box-shadow: 0 15px 30px -5px rgba(0, 0, 0, 0.1), 0 0 0 1px rgba(var(--primary-rgb), 0.1) inset; /* 内发光 */ z-index: 2; /* [优化] 确保悬停时不会超出容器 */ max-width: 100%; box-sizing: border-box; } /* 点击态:按压感 */ .island-card:active { transform: scale(0.96) !important; } /* --- 1. 图标容器 (左侧锚点) --- */ .island-icon-box { width: 48px; height: 48px; flex-shrink: 0; /* 适配深浅模式的底色 */ background: rgba(var(--bg-color-rgb), 0.8); border-radius: 14px; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05); transition: transform 0.4s ease; } .island-icon-img { width: 24px; height: 24px; object-fit: contain; /* 智能适配:浅色模式下图标加深,深色模式下图标反白 */ filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1)); transition: filter 0.3s; } /* 悬停时图标微动 */ .island-card:hover .island-icon-box { transform: scale(1.1) rotate(-5deg); background: var(--primary-color); /* 图标底色变主题色 */ } .island-card:hover .island-icon-img { filter: brightness(0) invert(1); /* 图标变白 */ } /* --- 2. 信息内容 (中间) --- */ .island-content { flex-grow: 1; display: flex; flex-direction: column; justify-content: center; overflow: hidden; /* 防止文字溢出 */ } .island-title { font-size: 15px; font-weight: 700; color: var(--text-color); margin: 0 0 4px 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .island-desc { font-size: 12px; color: var(--text-secondary); margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; opacity: 0.8; } /* --- 3. 动作指示器 (右侧) --- */ .island-action { width: 24px; height: 24px; display: flex; align-items: center; justify-content: flex-end; flex-shrink: 0; /* [优化] 确保与健康指示器不重叠 */ position: relative; z-index: 1; } .arrow-icon { font-size: 14px; color: var(--text-secondary); opacity: 0; /* 默认隐藏 */ transform: translateX(-10px); transition: all 0.3s ease; } .lock-icon { font-size: 14px; color: var(--error-color); opacity: 0.6; } /* [优化] 悬停时箭头滑入,但避免与健康指示器重叠 */ .island-card:hover .arrow-icon { opacity: 1; transform: translateX(0); color: var(--primary-color); } /* [优化] 当有健康指示器时,调整箭头位置避免重叠 */ .island-card:has(.tool-health-indicator):hover .arrow-icon { transform: translateX(-8px); opacity: 0.6; } /* [优化] 当有健康指示器时,调整箭头和锁定图标位置避免重叠 */ .island-card:has(.tool-health-indicator) .island-action { margin-right: 36px; /* 为健康指示器留出空间 */ } /* [优化] 当工具被锁定且有健康指示器时,锁定图标和健康指示器不重叠 */ .island-card.disabled:has(.tool-health-indicator) .lock-icon { opacity: 0.8; position: relative; z-index: 1; } /* [优化] 健康指示器在悬停时保持可见,但缩小以避免与箭头重叠 */ .island-card:has(.tool-health-indicator):hover .tool-health-indicator { transform: scale(0.9); opacity: 0.9; } /* [优化] 当工具被锁定且有健康指示器时,确保两者不重叠 */ .island-card.disabled:has(.tool-health-indicator) .tool-health-indicator { right: 8px; top: 8px; } /* ============================================ 工具健康检查状态指示器样式 [健康检查预留位置] ============================================ */ /* ============================================ 工具健康状态指示器样式(最新版 - 合并重复样式) ============================================ */ .tool-health-indicator { position: absolute; top: 8px; right: 8px; width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 13px; /* [优化] 确保健康指示器在最上层,但悬停时不影响箭头 */ z-index: 2; z-index: 10; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); transition: all 0.3s ease; animation: healthIndicatorPulse 2s ease-in-out infinite; pointer-events: auto; cursor: help; } .tool-health-indicator:hover { transform: scale(1.1); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); } .tool-health-indicator.healthy { background-color: rgba(16, 185, 129, 0.25); color: #10b981; border: 2px solid rgba(16, 185, 129, 0.3); } .tool-health-indicator.unhealthy { background-color: rgba(239, 68, 68, 0.25); color: #ef4444; border: 2px solid rgba(239, 68, 68, 0.3); animation: healthIndicatorPulse 1.5s ease-in-out infinite; } .tool-health-indicator.checking { background-color: rgba(59, 130, 246, 0.25); color: #3b82f6; border: 2px solid rgba(59, 130, 246, 0.3); } @keyframes healthIndicatorPulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.8; transform: scale(0.95); } } /* [完善] 工具箱卡片健康状态样式 */ .island-card.health-unhealthy { border-left: 3px solid rgba(239, 68, 68, 0.5); } .island-card.health-healthy { border-left: 3px solid rgba(16, 185, 129, 0.3); } .island-card.health-checking { border-left: 3px solid rgba(59, 130, 246, 0.3); } .island-card.disabled .tool-health-indicator { opacity: 0.6; } .island-card.disabled .tool-health-indicator { opacity: 0.6; } .island-card:hover .tool-health-indicator { transform: scale(1.2); } /* --- 背景流光 (Glow) --- */ .island-glow { position: absolute; top: 0; left: -100%; width: 50%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent); transform: skewX(-25deg); transition: left 0.5s; pointer-events: none; } .island-card:hover .island-glow { left: 200%; /* 光扫过效果 */ transition: left 0.6s ease-in-out; } /* --- 禁用状态 --- */ .island-card.disabled { opacity: 0.6; filter: grayscale(0.8); cursor: not-allowed; background: rgba(var(--card-background-rgb), 0.3); } .island-card.disabled:hover { transform: none; box-shadow: none; border-color: var(--border-color); } .island-card.disabled .island-icon-box { background: rgba(var(--bg-color-rgb), 0.5); transform: none; } .island-card.disabled:hover .island-icon-img { filter: none; } /* 进场动画 */ @keyframes islandPopIn { from { opacity: 0; transform: translateY(15px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } } /* ========================================= */ /* --- 2025 "Total Island" Design Language --- */ /* ========================================= */ /* --- 1. 媒体资源岛屿 (Media Island Card) --- */ /* 继承基础 Island Card,但针对媒体展示优化 */ .island-media-card { position: relative; display: flex; align-items: center; gap: 16px; height: 90px; /* 比普通工具卡片稍高,容纳缩略图 */ padding: 0 16px; background: rgba(var(--card-background-rgb), 0.7); backdrop-filter: blur(20px) saturate(180%); border: 1px solid var(--border-color); border-radius: 24px; /* 更大的圆角 */ cursor: pointer; overflow: hidden; transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); opacity: 0; animation: islandPopIn 0.5s cubic-bezier(0.2, 0.8, 0.2, 1) forwards; } .island-media-card:hover { transform: translateY(-4px) scale(1.01); background: rgba(var(--card-background-rgb), 0.95); border-color: rgba(var(--primary-rgb), 0.3); box-shadow: 0 15px 35px -5px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(var(--primary-rgb), 0.1) inset; z-index: 2; } .island-media-card:active { transform: scale(0.96) !important; } /* 缩略图视窗 */ .island-thumbnail-box { width: 100px; height: 60px; flex-shrink: 0; border-radius: 12px; overflow: hidden; background: rgba(0, 0, 0, 0.1); position: relative; box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.1); } .island-thumbnail-img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s ease; } .island-media-card:hover .island-thumbnail-img { transform: scale(1.1); /* 悬浮时图片微缩放 */ } /* 播放图标 (Action) */ .play-icon { font-size: 20px; color: var(--primary-color); opacity: 0.6; transform: scale(0.8); transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } .island-media-card:hover .play-icon { opacity: 1; transform: scale(1.2); filter: drop-shadow(0 0 8px rgba(var(--primary-rgb), 0.5)); } /* --- 2. 灵动岛按钮系统 (Island Buttons) --- */ /* 重置并覆盖原有按钮样式 */ .action-btn, .control-btn, .back-btn, .page-btn, .update-button { border-radius: 999px; /* 完全胶囊化 */ border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05); transition: all 0.2s cubic-bezier(0.25, 0.8, 0.25, 1); font-weight: 600; letter-spacing: 0.5px; backdrop-filter: blur(10px); } /* 主要操作按钮 (实心发光) */ .action-btn { background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); color: white; border: none; /* 渐变背景不需要边框 */ box-shadow: 0 4px 15px rgba(var(--primary-rgb), 0.4); } .action-btn:hover:not(:disabled) { transform: translateY(-2px) scale(1.05); box-shadow: 0 8px 25px rgba(var(--primary-rgb), 0.5); filter: brightness(1.1); } .action-btn:active:not(:disabled) { transform: scale(0.95); box-shadow: 0 2px 5px rgba(var(--primary-rgb), 0.4); } /* 次要/控制按钮 (磨砂玻璃) */ .control-btn, .back-btn { background: rgba(var(--card-background-rgb), 0.6); color: var(--text-color); border-color: var(--border-color); } .control-btn:hover, .back-btn:hover { background: rgba(var(--card-background-rgb), 0.9); border-color: var(--primary-color); color: var(--primary-color); transform: translateY(-2px); box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1); } .control-btn:active, .back-btn:active { transform: scale(0.95); } /* 小按钮 (Mini Island) */ .action-btn.mini-btn, .control-btn.mini-btn { padding: 6px 16px; font-size: 13px; border-radius: 12px; /* 小按钮用稍微方一点的圆角 */ } /* --- 3. 悬浮/下拉菜单岛屿 (Floating Island Menus) --- */ .custom-select-options, .update-slide-out-panel, .modal-content, .toast-notification { /* 统一的岛屿质感 */ background: rgba(var(--card-background-rgb), 0.85) !important; backdrop-filter: blur(25px) saturate(180%) !important; border: 1px solid rgba(255, 255, 255, 0.1) !important; border-radius: 24px !important; box-shadow: 0 20px 50px -10px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.1) !important; } /* 下拉菜单项优化 */ .custom-select-option { margin: 4px; /* 留出边距 */ border-radius: 16px; /* 圆角条目 */ transition: all 0.2s ease; font-weight: 500; } .custom-select-option:hover { background: rgba(var(--primary-rgb), 0.15) !important; color: var(--primary-color) !important; padding-left: 18px; /* 悬浮时文字右移一点,增加动感 */ } /* 侧边栏按钮优化 */ .toolbox-category-btn, .settings-nav-item, .island-nav-item { border-radius: 99px !important; /* 胶囊形状 */ } /* 修复:深色模式下的边框微调 */ body[data-theme="dark"] .island-card, body[data-theme="dark"] .island-media-card, body[data-theme="dark"] .action-btn, body[data-theme="dark"] .control-btn { border-color: rgba(255, 255, 255, 0.08); } /* --- 4. 输入框岛屿化 --- */ input[type="text"], input[type="password"], textarea, .settings-input-text { border-radius: 16px; background: rgba(var(--bg-color-rgb), 0.5); border: 1px solid transparent; transition: all 0.3s ease; padding: 12px 16px; } input:focus, textarea:focus { background: rgba(var(--bg-color-rgb), 0.8); border-color: var(--primary-color); box-shadow: 0 0 0 4px rgba(var(--primary-rgb), 0.15); /* 柔和的扩散光圈 */ outline: none; } /* ======================================================= */ /* --- 2025 Universal Sub-Window UI (Island Container) --- */ /* ======================================================= */ /* 1. 基础环境复位 */ body.tool-window-body { background: transparent !important; /* 必须透明,由 frame 负责背景 */ margin: 0; padding: 5px; /* 留出一点空隙给阴影和光晕 */ height: 100vh; box-sizing: border-box; overflow: hidden; } /* 2. 核心玻璃框架 (The Glass Slab) */ .app-glass-frame { display: flex; flex-direction: column; height: 100%; width: 100%; /* 玻璃质感背景 */ background: rgba(var(--card-background-rgb), 0.85); backdrop-filter: blur(30px) saturate(180%); border-radius: 20px; /* 统一大圆角 */ border: 1px solid rgba(128, 128, 128, 0.1); /* 默认微弱边框 */ /* 默认阴影 */ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); overflow: hidden; position: relative; } /* [焦点状态] 呼吸发光边框 */ .app-glass-frame.focused { /* 边框变色 */ border-color: rgba(var(--primary-rgb), 0.5); /* 核心发光效果 */ box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3), /* 深度阴影 */ 0 0 0 2px rgba(var(--primary-rgb), 0.3), /* 外发光圈 */ inset 0 0 20px rgba(var(--primary-rgb), 0.05); /* 内发光 */ } /* 3. 悬浮标题栏 (Floating Header) */ .glass-title-bar { height: 44px; display: flex; align-items: center; padding: 0 16px; -webkit-app-region: drag; /* 允许拖动 */ border-bottom: 1px solid rgba(128, 128, 128, 0.05); background: rgba(var(--bg-color-rgb), 0.3); /* 稍微深一点的头部 */ flex-shrink: 0; } /* 状态指示点 (类似 Mac 左上角,这里作为连接指示灯) */ .window-status-dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--text-secondary); opacity: 0.3; margin-right: 12px; transition: all 0.3s; } .window-status-dot.active { background-color: var(--success-color); box-shadow: 0 0 8px var(--success-color); opacity: 1; } .glass-title-text { font-size: 14px; font-weight: 600; color: var(--text-color); letter-spacing: 0.5px; flex-grow: 1; text-align: center; opacity: 0.9; } /* 窗口控制按钮组 */ .island-controls { display: flex; gap: 8px; -webkit-app-region: no-drag; } .control-pill { width: 28px; height: 28px; border-radius: 8px; border: none; background: transparent; color: var(--text-secondary); display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s; } .control-pill:hover { background: rgba(var(--text-color), 0.1); color: var(--text-color); } .control-pill.close:hover { background: var(--error-color); color: white; } /* 简单的图标绘制 */ .icon-line { width: 10px; height: 2px; background: currentColor; border-radius: 1px; } .icon-rect { width: 10px; height: 10px; border: 2px solid currentColor; border-radius: 2px; } /* 4. 内容区域修正 */ .secret-content { padding: 0 !important; /* 让内部元素自己决定边距 */ display: flex; flex-direction: column; } /* ===================================================== */ /* --- Table to Island Transformation (表格 -> 岛屿) --- */ /* ===================================================== */ /* 这里的魔法是将原本丑陋的表格强制转换为漂亮的列表 */ /* 针对热榜、DNS查询等所有表格 */ .hotboard-table, .ip-comparison-table, .bili-hot-table { display: block !important; width: 100%; border-collapse: separate !important; border-spacing: 0 10px !important; /* 垂直间距实现岛屿分离 */ padding: 0 15px !important; box-sizing: border-box; } /* 表头:隐藏或简化 */ .hotboard-table thead, .ip-comparison-table thead { display: table-header-group; } .hotboard-table th, .ip-comparison-table th { font-size: 12px; color: var(--text-secondary); font-weight: 500; padding: 5px 15px; border: none !important; text-transform: uppercase; opacity: 0.7; } /* 表体:转换为 Flex 容器的集合 */ .hotboard-table tbody, .ip-comparison-table tbody { display: block; } /* 行:这就是我们的“岛屿” */ .hotboard-table tr, .ip-comparison-table tr, .bili-hot-table tr { display: flex; align-items: center; justify-content: space-between; background: rgba(var(--card-background-rgb), 0.6); /* 半透明背景 */ border: 1px solid var(--border-color); border-radius: 16px; /* 圆润岛屿 */ padding: 12px 20px; margin-bottom: 12px; transition: all 0.2s cubic-bezier(0.25, 0.8, 0.25, 1); cursor: default; } /* 悬停效果:上浮 */ .hotboard-table tr:hover, .ip-comparison-table tr:hover, .bili-hot-table tr:hover { transform: translateY(-2px) scale(1.005); background: rgba(var(--card-background-rgb), 0.9); border-color: rgba(var(--primary-rgb), 0.3); box-shadow: 0 8px 20px rgba(0, 0, 0, 0.08); } /* 单元格微调 */ .hotboard-table td, .ip-comparison-table td, .bili-hot-table td { border: none !important; /* 移除所有默认边框 */ padding: 0 !important; display: block; } /* 热榜排名的特殊优化 (Rank Badges) */ .bili-hot-rank, .hotboard-rank { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 8px; font-weight: 800; font-size: 14px; background: rgba(var(--text-color), 0.1); color: var(--text-secondary); margin-right: 15px; } /* 前三名高亮 (Fire Gradient) */ .rank-1 { background: linear-gradient(135deg, #FFD700, #FFA500); color: white; box-shadow: 0 2px 8px rgba(255, 165, 0, 0.4); } .rank-2 { background: linear-gradient(135deg, #E0E0E0, #B0B0B0); color: white; } .rank-3 { background: linear-gradient(135deg, #CD7F32, #A0522D); color: white; } /* 标题文字优化 */ .hotboard-title-link, .bili-hot-title { font-size: 15px; font-weight: 600; color: var(--text-color); text-decoration: none; transition: color 0.2s; line-height: 1.4; display: block; } .hotboard-title-link:hover { color: var(--primary-color); } /* 热度值优化 */ .hotboard-value { font-family: 'Consolas', monospace; font-size: 13px; color: var(--primary-color); background: rgba(var(--primary-rgb), 0.1); padding: 4px 10px; border-radius: 20px; font-weight: 700; } /* 标签优化 (新/爆/热) */ .hotboard-tag { font-size: 10px; padding: 2px 6px; border-radius: 6px; margin-left: 8px; vertical-align: middle; font-weight: 700; transform: translateY(-1px); display: inline-block; } .hotboard-tag.tag-new { background: rgba(52, 199, 89, 0.15); color: #34c759; } .hotboard-tag.tag-hot { background: rgba(255, 59, 48, 0.15); color: #ff3b30; } /* --- 输入框和按钮区域适配 --- */ .tool-window-body .ip-input-group { background: rgba(var(--bg-color-rgb), 0.5); border: 1px solid var(--border-color); border-radius: 16px; padding: 8px; display: flex; gap: 10px; } .tool-window-body .ip-input-group input { border: none; background: transparent; box-shadow: none; padding: 8px 12px; } .tool-window-body .ip-input-group input:focus { background: transparent; box-shadow: none; } /* 覆盖之前可能存在的背景色 */ .content-area, .settings-section { background: transparent !important; box-shadow: none !important; border: none !important; } /* ======================================================= */ /* --- 2025 Universal Sub-Window UI (Island Container) --- */ /* ======================================================= */ /* 1. 基础环境复位 & 修复圆角溢出 */ body.tool-window-body { background: transparent !important; margin: 0; padding: 10px; /* 增加留白,让发光阴影完整显示 */ height: 100vh; box-sizing: border-box; overflow: hidden; } /* [修复] 在子窗口中彻底隐藏全局背景层,防止它撑出方角 */ body.tool-window-body #background-layer { display: none !important; } /* 2. 核心玻璃框架 (The Glass Slab) */ .app-glass-frame { display: flex; flex-direction: column; height: 100%; width: 100%; /* 背景:高透磨砂 */ background: rgba(var(--card-background-rgb), 0.90); backdrop-filter: blur(40px) saturate(180%); border-radius: 24px; /* 更大的圆角 */ border: 1px solid rgba(128, 128, 128, 0.15); /* 基础阴影 */ box-shadow: 0 20px 50px rgba(0, 0, 0, 0.25); /* [核心修复] 强制 GPU 渲染以修复 border-radius 裁切失效的问题 */ transform: translate3d(0, 0, 0); -webkit-mask-image: -webkit-radial-gradient(white, black); /* 强制遮罩裁切 */ overflow: hidden; position: relative; z-index: 1; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } /* [焦点状态] 呼吸发光边框 */ .app-glass-frame.focused { background: rgba(var(--card-background-rgb), 0.96); /* 激活时稍微不透明一点,提升可读性 */ border-color: rgba(var(--primary-rgb), 0.4); box-shadow: 0 25px 60px rgba(0, 0, 0, 0.35), /* 深邃投影 */ 0 0 0 2px rgba(var(--primary-rgb), 0.3), /* 焦点光环 */ inset 0 0 30px rgba(var(--primary-rgb), 0.05); /* 内部辉光 */ } /* 3. 悬浮标题栏 (Floating Header) */ .glass-title-bar { height: 48px; /* 稍微加高 */ display: flex; align-items: center; padding: 0 18px; -webkit-app-region: drag; /* 标题栏背景渐变,增加质感 */ background: linear-gradient(to bottom, rgba(var(--bg-color-rgb), 0.5), rgba(var(--bg-color-rgb), 0.2)); border-bottom: 1px solid rgba(128, 128, 128, 0.08); flex-shrink: 0; z-index: 10; } .window-status-dot { width: 10px; height: 10px; border-radius: 50%; background-color: var(--border-color); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); margin-right: 14px; transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .window-status-dot.active { background-color: var(--success-color); box-shadow: 0 0 10px var(--success-color); transform: scale(1.1); } .glass-title-text { font-size: 15px; font-weight: 700; color: var(--text-color); letter-spacing: 0.5px; flex-grow: 1; text-align: center; opacity: 0.9; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } /* 4. 内容区域修正 */ .secret-content { padding: 0 !important; display: flex; flex-direction: column; background: transparent !important; /* 修复滚动条样式 */ scrollbar-width: thin; scrollbar-color: var(--border-color) transparent; } /* ========================================================== */ /* --- List Islands (列表岛屿化 - 解决丑陋列表的问题) --- */ /* ========================================================== */ /* 强制重置表格为 Flex 列表 */ .hotboard-table, .ip-comparison-table, .bili-hot-table { display: flex !important; flex-direction: column; gap: 12px; /* 岛屿间距 */ padding: 20px !important; box-sizing: border-box; width: 100%; } /* 隐藏表头 */ .hotboard-table thead, .ip-comparison-table thead, .bili-hot-table thead { display: none !important; } /* 将每一行 (tr) 变成一个漂亮的岛屿卡片 */ .hotboard-table tbody tr, .ip-comparison-table tbody tr, .bili-hot-table tbody tr { display: flex; align-items: center; justify-content: space-between; background: rgba(var(--bg-color-rgb), 0.6); /* 浅色背景区分 */ border: 1px solid var(--border-color); border-radius: 18px; /* 圆角岛屿 */ padding: 14px 20px; margin: 0 !important; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); cursor: pointer; position: relative; overflow: hidden; } /* 悬停动效:上浮 + 边框高亮 + 光晕 */ .hotboard-table tbody tr:hover, .ip-comparison-table tbody tr:hover, .bili-hot-table tbody tr:hover { transform: translateY(-3px) scale(1.01); background: rgba(var(--card-background-rgb), 0.95); border-color: rgba(var(--primary-rgb), 0.4); box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(var(--primary-rgb), 0.1); z-index: 2; } /* 单元格内容布局优化 */ .hotboard-table td, .ip-comparison-table td, .bili-hot-table td { display: block; border: none !important; padding: 0 !important; } /* --- 专用列样式优化 --- */ /* 1. 排名列 (左侧) */ .hotboard-table td:first-child, .bili-hot-table td:first-child { flex-shrink: 0; width: 40px; } .bili-hot-rank, .hotboard-rank, /* 兼容旧逻辑,如果是纯数字文本 */ .hotboard-table td:first-child span { font-family: 'Impact', sans-serif; font-size: 18px; color: var(--text-secondary); opacity: 0.5; font-style: italic; width: 30px; text-align: center; display: inline-block; } /* 前三名徽章化 */ .rank-top-3 { opacity: 1 !important; font-style: normal !important; color: white !important; width: 28px !important; height: 28px !important; line-height: 28px; border-radius: 8px; background: var(--primary-color); box-shadow: 0 4px 10px rgba(var(--primary-rgb), 0.4); font-weight: bold; } .rank-1 { background: linear-gradient(135deg, #FFD700, #FFA500); } .rank-2 { background: linear-gradient(135deg, #C0C0C0, #A0A0A0); } .rank-3 { background: linear-gradient(135deg, #CD7F32, #A0522D); } /* 2. 标题列 (中间,自适应) */ .hotboard-table td:nth-child(2), .bili-hot-table td:nth-child(2) { flex-grow: 1; padding: 0 15px !important; font-weight: 600; font-size: 15px; color: var(--text-color); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .hotboard-title-link, .bili-hot-title { color: var(--text-color); text-decoration: none; transition: color 0.2s; } .hotboard-title-link:hover, .bili-hot-title:hover { color: var(--primary-color); } /* 3. 热度/数值列 (右侧) */ .hotboard-table td:last-child, .bili-hot-table td:last-child { flex-shrink: 0; text-align: right; } .hotboard-value { font-family: 'Consolas', monospace; font-size: 13px; font-weight: 700; color: var(--primary-color); background: rgba(var(--primary-rgb), 0.1); padding: 4px 10px; border-radius: 99px; /* 胶囊 */ } /* --- 工具输入栏美化 --- */ .tool-window-body .ip-input-group { background: rgba(var(--bg-color-rgb), 0.4); border: 1px solid var(--border-color); border-radius: 20px; padding: 6px; margin-bottom: 20px; box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.03); backdrop-filter: blur(10px); } .tool-window-body .ip-input-group input { background: transparent; border: none; box-shadow: none; font-size: 15px; padding-left: 12px; } .tool-window-body .ip-input-group input:focus { background: transparent; box-shadow: none; } /* 修复按钮在输入组中的样式 */ .tool-window-body .ip-input-group button { border-radius: 14px; height: 36px; /* 统一高度 */ margin-left: 5px; } /* ======================================================= */ /* --- FIX: Sub-Window Corner Clipping (子窗口圆角修复) --- */ /* ======================================================= */ /* 1. 强制根节点透明,防止默认底色溢出 */ html, body.tool-window-body { background: transparent !important; background-color: transparent !important; } /* 2. 优化玻璃框架的裁切逻辑 */ .app-glass-frame { /* 保持原有的背景和模糊 */ background: rgba(var(--card-background-rgb), 0.90); backdrop-filter: blur(40px) saturate(180%); /* [核心修复] 使用 clip-path 进行物理级裁切,彻底消除方角 */ /* 注意:border-radius 和 clip-path 必须匹配 */ border-radius: 20px; clip-path: inset(0px round 20px); /* 配合 clip-path,阴影需要由另一个伪元素或父元素提供, 或者使用 drop-shadow filter (性能稍低但对透明窗口有效) */ box-shadow: none; /* 移除 box-shadow,因为它会被 clip-path 切掉 */ filter: drop-shadow(0 20px 50px rgba(0, 0, 0, 0.25)); /* 改用滤镜阴影 */ /* 确保边框在裁切内 */ border: 1px solid rgba(255, 255, 255, 0.1); /* 强制 GPU 加速 */ transform: translateZ(0); will-change: transform; /* 留出 margin 给 drop-shadow 显示 */ margin: 10px; height: calc(100% - 20px); width: calc(100% - 20px); } /* 修复全屏/最大化时的逻辑 (可选) */ .tool-window-body.maximized .app-glass-frame { margin: 0; height: 100%; width: 100%; border-radius: 0; clip-path: none; } /* ========================================= */ /* --- 主窗口圆角优化 --- */ /* ========================================= */ /* 确保主窗口内容区域有圆角 */ body#app-body .main-content { border-radius: 16px; overflow: hidden; } body#app-body .content-area { border-radius: 0 0 16px 16px; } /* 导航栏圆角 */ .navbar { border-radius: 16px 0 0 16px; } /* 标题栏圆角 */ .title-bar { border-radius: 0 16px 0 0; } /* ======================================================= */ /* --- 2025 Settings Control Center (设置页灵动岛重制) --- */ /* ======================================================= */ .settings-page-container { display: flex; gap: 24px; height: 100%; padding: 10px 20px 20px 0; /* 调整内边距 */ box-sizing: border-box; } /* --- 左侧导航岛 --- */ .settings-nav-island { width: 220px; flex-shrink: 0; background: rgba(var(--card-background-rgb), 0.4); backdrop-filter: blur(20px); border: 1px solid var(--border-color); border-radius: 24px; padding: 20px; display: flex; flex-direction: column; justify-content: space-between; } .nav-group-title { font-size: 12px; font-weight: 800; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 1.5px; margin-bottom: 15px; padding-left: 10px; opacity: 0.6; } /* --- 右侧内容岛容器 --- */ .settings-content-island { flex-grow: 1; overflow-y: auto; padding-right: 5px; /* 隐藏内容面板切换时的溢出 */ position: relative; } /* 面板布局 */ .settings-panel { display: none; animation: slideUpFade 0.4s cubic-bezier(0.2, 0.8, 0.2, 1); } .settings-panel.active { display: block; } /* 通用设置卡片 (Setting Island) */ .setting-island { background: rgba(var(--card-background-rgb), 0.6); border: 1px solid var(--border-color); border-radius: 24px; padding: 24px; margin-bottom: 20px; transition: all 0.3s ease; } .setting-island:hover { background: rgba(var(--card-background-rgb), 0.8); border-color: rgba(var(--primary-rgb), 0.3); box-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.1); } .setting-island h2 { font-size: 18px; margin-bottom: 20px; display: flex; align-items: center; gap: 10px; } /* 设置项行 */ .setting-row-island { display: flex; justify-content: space-between; align-items: center; padding: 12px 0; border-bottom: 1px dashed var(--border-color); } .setting-row-island:last-child { border-bottom: none; } /* --- 状态仪表盘 (Dashboard Grid) --- */ .status-dashboard-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-bottom: 20px; } .status-card { background: rgba(var(--bg-color-rgb), 0.5); border-radius: 18px; padding: 15px; display: flex; flex-direction: column; gap: 10px; } .status-card-header { display: flex; justify-content: space-between; align-items: center; font-size: 13px; color: var(--text-secondary); font-weight: 600; } .status-card-value { font-size: 24px; font-weight: 700; font-family: 'Consolas', monospace; color: var(--text-color); } /* 进度条样式微调 */ .island-progress-track { height: 8px; background: rgba(128, 128, 128, 0.2); border-radius: 4px; overflow: hidden; } .island-progress-bar { height: 100%; border-radius: 4px; transition: width 0.5s ease; } /* --- 开发者卡片 (Profile Card) --- */ .dev-profile-card { display: flex; align-items: center; gap: 20px; background: linear-gradient(135deg, rgba(var(--primary-rgb), 0.1), rgba(var(--secondary-rgb), 0.1)); border: 1px solid rgba(var(--primary-rgb), 0.2); } .dev-avatar { width: 70px; height: 70px; border-radius: 50%; background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); display: flex; align-items: center; justify-content: center; font-size: 30px; color: white; box-shadow: 0 10px 20px rgba(var(--primary-rgb), 0.3); } /* 动画 */ @keyframes slideUpFade { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } /* ========================================= */ /* --- 2025 Log Island UI (时光轴岛屿) --- */ /* ========================================= */ .logs-page-container { display: flex; flex-direction: column; height: 100%; padding: 10px 20px 0 20px; /* 顶部留白给控制台 */ gap: 20px; box-sizing: border-box; } /* --- 1. 顶部控制岛 (Control Island) --- */ .logs-header-island { display: flex; justify-content: space-between; align-items: center; background: rgba(var(--card-background-rgb), 0.6); backdrop-filter: blur(20px); border: 1px solid var(--border-color); border-radius: 24px; padding: 12px 24px; flex-shrink: 0; box-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.1); z-index: 10; } .logs-title { font-size: 20px; font-weight: 800; background: linear-gradient(135deg, var(--text-color), var(--text-secondary)); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; display: flex; align-items: center; gap: 12px; } .logs-controls { display: flex; gap: 12px; align-items: center; } /* 日期选择器岛屿化 */ #log-date-picker { background: rgba(var(--bg-color-rgb), 0.5); border: 1px solid var(--border-color); border-radius: 14px; padding: 8px 12px; color: var(--text-color); font-family: 'Consolas', monospace; font-weight: 600; outline: none; transition: all 0.3s; } #log-date-picker:focus { border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.15); } /* --- 2. 日志内容容器 --- */ .logs-container { flex-grow: 1; overflow-y: auto; padding-right: 5px; padding-bottom: 20px; display: flex; flex-direction: column; gap: 25px; /* 日期间距 */ } /* 隐藏滚动条但保留功能 */ .logs-container::-webkit-scrollbar { width: 4px; } .logs-container::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: 2px; } /* --- 3. 每日分组 (Day Group) --- */ .log-day-group { position: relative; padding-left: 20px; /* 为左侧线条留空 */ } /* 左侧时光轴线条 */ .log-day-group::before { content: ''; position: absolute; top: 40px; /* 从日期胶囊下方开始 */ bottom: 0; left: 9px; width: 2px; background: linear-gradient(to bottom, var(--primary-color), transparent); opacity: 0.3; } /* 日期胶囊 (Sticky Header) */ .log-date-pill { position: sticky; top: 0; z-index: 5; display: inline-flex; align-items: center; gap: 8px; background: var(--primary-color); color: white; padding: 6px 16px; border-radius: 20px; font-size: 13px; font-weight: 700; box-shadow: 0 5px 15px rgba(var(--primary-rgb), 0.4); margin-bottom: 15px; margin-left: -10px; /* 修正对齐 */ } /* --- 4. 日志卡片岛屿 (Log Card Island) --- */ .log-card-island { position: relative; display: flex; align-items: center; /* 垂直居中 */ gap: 15px; background: rgba(var(--card-background-rgb), 0.5); border: 1px solid var(--border-color); border-radius: 18px; padding: 12px 18px; margin-bottom: 10px; transition: all 0.25s cubic-bezier(0.25, 0.8, 0.25, 1); cursor: default; } .log-card-island:hover { transform: translateX(5px) scale(1.01); background: rgba(var(--card-background-rgb), 0.9); border-color: rgba(var(--primary-rgb), 0.3); box-shadow: 0 8px 20px -5px rgba(0, 0, 0, 0.1); } /* 时间戳 */ .log-time { font-family: 'Consolas', monospace; font-size: 13px; color: var(--text-secondary); width: 65px; /* 固定宽度对齐 */ flex-shrink: 0; font-weight: 600; } /* 分类图标盒 (Visual Anchor) */ .log-icon-box { width: 36px; height: 36px; border-radius: 10px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: 16px; transition: transform 0.3s; } .log-card-island:hover .log-icon-box { transform: scale(1.1) rotate(10deg); } /* 分类配色系统 */ .cat-system { background: rgba(52, 199, 89, 0.15); color: #34c759; } /* Green */ .cat-error { background: rgba(255, 59, 48, 0.15); color: #ff3b30; } /* Red */ .cat-update { background: rgba(255, 204, 0, 0.15); color: #ffcc00; } /* Yellow */ .cat-tool { background: rgba(175, 82, 222, 0.15); color: #af52de; } /* Purple */ .cat-general { background: rgba(142, 142, 147, 0.15); color: #8e8e93; } /* Gray */ /* 日志文本 */ .log-text { flex-grow: 1; font-size: 14px; color: var(--text-color); line-height: 1.5; word-break: break-all; } /* 子标签 (e.g. 工具名) */ .log-sub-tag { display: inline-block; font-size: 11px; padding: 2px 6px; border-radius: 6px; background: rgba(var(--text-color), 0.05); color: var(--text-secondary); margin-right: 6px; vertical-align: middle; border: 1px solid rgba(128, 128, 128, 0.1); } /* 复制按钮 (悬浮显示) */ .log-copy-btn { width: 28px; height: 28px; border-radius: 8px; border: none; background: transparent; color: var(--text-secondary); display: flex; align-items: center; justify-content: center; opacity: 0; transition: all 0.2s; cursor: pointer; } .log-card-island:hover .log-copy-btn { opacity: 1; } .log-copy-btn:hover { background: var(--bg-color-rgb); color: var(--primary-color); } /* ========================================= */ /* --- 2025 Liquid Navbar & Page Transitions --- */ /* ========================================= */ /* --- 1. 导航栏容器 --- */ .navbar { width: 80px; /* 稍微加宽一点,给滑块留出呼吸空间 */ background-color: rgba(var(--card-background-rgb), var(--navbar-opacity)); backdrop-filter: blur(20px) saturate(180%); display: flex; flex-direction: column; align-items: center; padding: 25px 0; border-right: 1px solid var(--border-color); z-index: 10; flex-shrink: 0; transition: background-color var(--transition-duration) ease; position: relative; /* 为绝对定位的滑块提供基准 */ } /* --- 2. 灵动滑块 (The Liquid Slider) --- */ .nav-slider-pill { position: absolute; left: 15px; /* 居中计算: (80 - 50) / 2 */ top: 25px; /* 初始位置,JS 会控制 */ width: 50px; height: 50px; background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); border-radius: 16px; /* 方圆风格 */ /* 核心动画:弹性贝塞尔曲线,模拟物理惯性 */ transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1); /* 视觉特效 */ box-shadow: 0 4px 15px rgba(var(--primary-rgb), 0.4); z-index: 1; /* 在按钮背景之上,但在图标之下 */ pointer-events: none; /* 不干扰点击 */ } /* --- 3. 导航按钮 --- */ .nav-btn { width: 50px; height: 50px; border-radius: 16px; background-color: transparent; /* 背景交给滑块 */ border: none; color: var(--text-secondary); font-size: 22px; margin-bottom: 20px; cursor: pointer; display: flex; align-items: center; justify-content: center; position: relative; z-index: 2; /* 确保在滑块之上 */ transition: all 0.3s ease; } /* 悬停态 (非激活) */ .nav-btn:hover:not(.active) { color: var(--text-color); background-color: rgba(var(--text-color), 0.05); transform: scale(1.05); } /* 点击/激活态 */ .nav-btn.active { color: white; /* 在彩色滑块上显示白色 */ /* 移除旧的背景和动画,完全依赖滑块 */ background: transparent; box-shadow: none; animation: none; } /* 点击时的微缩反馈 */ .nav-btn:active { transform: scale(0.9); } /* 底部网络状态不需要滑块 */ #network-status, #network-speed { z-index: 2; } /* --- 4. 页面转场动画 (Page Transitions) --- */ /* 页面内容容器 */ #content-area { /* 确保容器有相对定位,方便动画 */ position: relative; width: 100%; height: 100%; overflow: hidden; /* 防止动画过程中溢出 */ } /* 旧页面离场:下沉 + 模糊 + 变透明 */ .page-exit { animation: pageExitAnim 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards; } /* 新页面进场:上浮 + 清晰 + 显现 */ .page-enter { animation: pageEnterAnim 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; /* 带弹性的进场 */ } @keyframes pageExitAnim { 0% { opacity: 1; transform: scale(1) translateY(0); filter: blur(0); } 100% { opacity: 0; transform: scale(0.96) translateY(10px); filter: blur(4px); } } @keyframes pageEnterAnim { 0% { opacity: 0; transform: scale(0.96) translateY(20px); filter: blur(8px); } 100% { opacity: 1; transform: scale(1) translateY(0); filter: blur(0); } } /* ========================================= */ /* --- Fix: Input Visibility (输入框显形) --- */ /* ========================================= */ /* 覆盖所有输入框的基础样式,确保可见 */ input[type="text"], input[type="password"], textarea, .settings-input-text, .tool-window-body .ip-input-group input { /* [核心] 给一个默认的半透明背景,不再是 transparent */ background-color: rgba(var(--bg-color-rgb), 0.6) !important; border: 1px solid var(--border-color) !important; border-radius: 14px !important; color: var(--text-color); padding: 10px 14px; font-size: 14px; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.02); /* 轻微内阴影增加层次 */ } /* 聚焦时的灵动光效 */ input:focus, textarea:focus, .tool-window-body .ip-input-group input:focus { background-color: rgba(var(--bg-color-rgb), 0.95) !important; border-color: var(--primary-color) !important; box-shadow: 0 0 0 4px rgba(var(--primary-rgb), 0.15), 0 4px 10px rgba(0, 0, 0, 0.05) !important; outline: none; transform: translateY(-1px); /* 聚焦微上浮 */ } /* 修复工具窗口中输入组容器的样式,去除多余边框 */ .tool-window-body .ip-input-group { background: transparent; border: none; box-shadow: none; padding: 0; gap: 10px; } /* ======================================================== */ /* --- 2025 Island Modal & Slide Panel (灵动岛弹窗体系) --- */ /* ======================================================== */ /* --- 1. 全局模态框 (Modal Island) --- */ .modal-overlay { background-color: rgba(0, 0, 0, 0.3); /* 降低背景遮罩浓度,更通透 */ backdrop-filter: blur(5px); } .modal-content { /* [重制] 悬浮岛屿风格 */ background: rgba(var(--card-background-rgb), 0.85); backdrop-filter: blur(35px) saturate(180%); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 32px; /* 超大圆角 */ box-shadow: 0 30px 80px rgba(0, 0, 0, 0.4), /* 氛围深阴影 */ 0 0 0 1px rgba(var(--primary-rgb), 0.1) inset; /* 内发光 */ width: 90%; max-width: 480px; padding: 0; /* 内容贴边,由内部元素控制 padding */ overflow: hidden; transform: scale(0.9) translateY(20px); opacity: 0; transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); /* 弹性进场 */ } /* 激活状态 */ .modal-overlay.active .modal-content { transform: scale(1) translateY(0); opacity: 1; } /* 模态框头部 */ .modal-header { padding: 20px 25px; border-bottom: 1px solid rgba(128, 128, 128, 0.1); background: linear-gradient(to bottom, rgba(var(--bg-color-rgb), 0.5), transparent); } .modal-header h3 { font-size: 18px; font-weight: 700; display: flex; align-items: center; gap: 10px; margin: 0; border: none; /* 移除可能的旧边框 */ padding: 0; } .modal-body { padding: 25px; font-size: 15px; line-height: 1.7; color: var(--text-color); max-height: 60vh; overflow-y: auto; } /* --- 2. 侧边更新日志 (Floating Slide Island) --- */ .update-slide-out-panel { /* [核心] 不再贴边,而是悬浮在右侧 */ top: 20px; right: 20px; bottom: 20px; height: auto; /* 由 top/bottom 决定 */ width: 420px; max-width: 90vw; background: rgba(var(--card-background-rgb), 0.90); backdrop-filter: blur(40px) saturate(180%); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 28px; /* 岛屿圆角 */ box-shadow: -20px 0 60px rgba(0, 0, 0, 0.25); /* 进场动画:从右侧滑入并带有弹性 */ transform: translateX(120%) scale(0.95); transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1), opacity 0.4s ease; opacity: 0; display: flex; flex-direction: column; z-index: 2000; /* 确保在最上层 */ } .update-slide-out-panel.active { transform: translateX(0) scale(1); opacity: 1; } /* 更新面板头部 */ .update-panel-header { padding: 25px; background: linear-gradient(to bottom, rgba(var(--bg-color-rgb), 0.4), transparent); border-bottom: 1px solid rgba(128, 128, 128, 0.1); display: flex; align-items: center; justify-content: space-between; } .update-panel-header h2 { font-size: 20px; font-weight: 800; margin: 0; background: linear-gradient(135deg, var(--text-color), var(--text-secondary)); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; } /* 更新日志列表样式优化 */ .changelog-list { padding: 25px; } .changelog-item { background: rgba(var(--bg-color-rgb), 0.5); border: 1px solid var(--border-color); border-radius: 16px; padding: 15px; margin-bottom: 15px; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.02); } .changelog-key { background: var(--primary-color); color: white; padding: 4px 10px; border-radius: 8px; font-size: 12px; margin-bottom: 8px; display: inline-block; box-shadow: 0 2px 6px rgba(var(--primary-rgb), 0.3); } /* 关闭按钮通用样式 (圆形) */ #close-update-panel-btn, #modal-close-btn { position: static; /* 恢复流布局 */ width: 32px; height: 32px; background: rgba(var(--text-color), 0.05); border-radius: 50%; display: flex; align-items: center; justify-content: center; transition: all 0.2s; cursor: pointer; border: none; color: var(--text-secondary); } #close-update-panel-btn:hover, #modal-close-btn:hover { background: var(--error-color); color: white; transform: rotate(90deg); } /* ========================================= */ /* --- 1. 极速转场动画 (Snap Transitions) --- */ /* ========================================= */ /* 页面内容容器 */ #content-area { position: relative; width: 100%; height: 100%; overflow: hidden; /* 开启硬件加速,防止动画抖动 */ transform: translateZ(0); will-change: opacity, transform; } /* 离场:极速下沉变淡 */ .page-exit { animation: pageExitAnim 0.15s cubic-bezier(0.4, 0, 1, 1) forwards; } /* 进场:极速回弹上浮 */ .page-enter { animation: pageEnterAnim 0.2s cubic-bezier(0, 0, 0.2, 1) forwards; } @keyframes pageExitAnim { 0% { opacity: 1; transform: scale(1); } 100% { opacity: 0; transform: scale(0.98); } } @keyframes pageEnterAnim { 0% { opacity: 0; transform: scale(1.02); } 100% { opacity: 1; transform: scale(1); } } /* ========================================= */ /* --- 2. 子窗口圆角与控制键修复 (Fixes) --- */ /* ========================================= */ /* 强制玻璃框架裁切一切溢出内容 */ .app-glass-frame { /* ...原有属性... */ overflow: hidden !important; /* 核心:必须强制隐藏溢出 */ border-radius: 20px !important; /* 修复 Chromium 渲染层级导致的裁切失效 */ mask-image: radial-gradient(white, black); -webkit-mask-image: -webkit-radial-gradient(white, black); border: 1px solid rgba(255, 255, 255, 0.15); /* 增强边框质感 */ } /* 标题栏优化:增加拖拽区域,按钮靠右 */ .glass-title-bar { /* ...原有属性... */ justify-content: space-between; /* 确保左右撑开 */ padding: 0 15px; height: 40px; /*稍微调低高度更精致*/ background: rgba(var(--card-background-rgb), 0.5); /* 稍微加深标题栏背景 */ } /* [重绘] 窗口控制按钮 - 灵动岛交通灯风格 */ .island-controls { display: flex; gap: 8px; align-items: center; -webkit-app-region: no-drag; } .control-pill { width: 14px; /* 小圆点 */ height: 14px; border-radius: 50%; border: none; padding: 0; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s ease; box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); /* 内阴影增加立体感 */ position: relative; overflow: hidden; } /* 默认状态颜色 (Mac 风格) */ #minimize-btn.control-pill { background-color: #ffbd2e; border: 1px solid #e09e18; } /* 黄 */ #maximize-btn.control-pill { background-color: #27c93f; border: 1px solid #1da830; } /* 绿 */ #close-btn.control-pill { background-color: #ff5f56; border: 1px solid #e0443e; } /* 红 */ /* 图标默认隐藏 */ .control-pill i, .control-pill .icon-line, .control-pill .icon-rect { opacity: 0; color: rgba(0, 0, 0, 0.6); font-size: 8px; /* 极小图标 */ transition: opacity 0.2s; font-weight: 900; } /* 悬停时显示图标 & 稍微放大 */ .island-controls:hover .control-pill i, .island-controls:hover .control-pill .icon-line, .island-controls:hover .control-pill .icon-rect { opacity: 1; } .control-pill:hover { transform: scale(1.1); box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); } /* 修复内部图标样式 */ .icon-line { width: 8px; height: 2px; background-color: rgba(0, 0, 0, 0.6); border-radius: 1px; } .icon-rect { width: 6px; height: 6px; border: 1.5px solid rgba(0, 0, 0, 0.6); border-radius: 1px; } /* ========================================= */ /* --- 3. 列表内容修复 (防止贴边) --- */ /* ========================================= */ /* 给滚动区域增加内边距,防止滚动条或内容贴到圆角上 */ .hotboard-table, .ip-comparison-table, .bili-hot-table { padding: 15px !important; /* 内容与窗口边缘保持距离 */ width: 100%; box-sizing: border-box; } /* 每一行卡片 */ .hotboard-table tbody tr, .bili-hot-table tbody tr { /* 增加卡片质感 */ background: rgba(var(--bg-color-rgb), 0.4); backdrop-filter: blur(5px); border: 1px solid rgba(255, 255, 255, 0.05); box-shadow: 0 2px 10px rgba(0, 0, 0, 0.02); } .hotboard-table tbody tr:hover, .bili-hot-table tbody tr:hover { background: rgba(var(--card-background-rgb), 0.8); transform: scale(1.01); /* 悬浮微放大 */ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1); border-color: rgba(var(--primary-rgb), 0.3); } /* ========================================= */ /* --- 1. 子窗口完美圆角裁切 (物理级修复) --- */ /* ========================================= */ .app-glass-frame { /* ...原有背景属性... */ background: rgba(var(--card-background-rgb), 0.90); backdrop-filter: blur(40px) saturate(180%); border-radius: 20px; /* [核心] 使用 clip-path 沿着圆角裁剪,彻底切掉外部的方角背景 */ clip-path: inset(0px round 20px); /* 配合 clip-path,阴影必须改用 drop-shadow滤镜,否则会被切掉 */ box-shadow: none !important; filter: drop-shadow(0 20px 50px rgba(0, 0, 0, 0.4)); border: 1px solid rgba(255, 255, 255, 0.15); margin: 15px; /* 留出更多空间给 drop-shadow 显示 */ height: calc(100% - 30px); width: calc(100% - 30px); overflow: hidden; /* 内部防溢出 */ } /* ========================================= */ /* --- 2. 深色模式“隐形字”修复 --- */ /* ========================================= */ body[data-theme="dark"] { --text-color: #f5f5f7; /* 强制亮白 */ --text-secondary: #a1a1a6; /* 浅灰 */ --card-background-rgb: 30, 30, 32; /* 深灰底 */ } /* 强制深色模式下的关键元素文字颜色 */ body[data-theme="dark"] .island-title, body[data-theme="dark"] .tool-name, body[data-theme="dark"] .nav-text, body[data-theme="dark"] .setting-row-island span:first-child, body[data-theme="dark"] .status-card-value, body[data-theme="dark"] h1, body[data-theme="dark"] h2, body[data-theme="dark"] h3, body[data-theme="dark"] input, body[data-theme="dark"] textarea { color: #ffffff !important; } body[data-theme="dark"] .island-desc, body[data-theme="dark"] .tool-desc, body[data-theme="dark"] .status-label { color: rgba(255, 255, 255, 0.7) !important; } /* ========================================= */ /* --- 3. 热搜榜单布局修复 (百度/B站) --- */ /* ========================================= */ /* 强制列表行 (岛屿) 使用 Flex 布局且左对齐 */ .hotboard-table tbody tr, .bili-hot-table tbody tr { display: flex !important; align-items: center !important; justify-content: flex-start !important; /* [核心] 防止两端对齐导致标题跑最右 */ gap: 15px !important; width: 100%; } /* 排名列:固定宽度 */ .hotboard-table td:first-child, .bili-hot-table td:first-child { flex: 0 0 40px !important; /* 不伸缩 */ text-align: center; width: auto !important; /* 覆盖旧样式 */ } /* 标题列:占据剩余空间,且强制单行 */ .hotboard-table td:nth-child(2), .bili-hot-table td:nth-child(2) { flex: 1 1 auto !important; /* 自动伸缩 */ text-align: left !important; width: 0; /* 配合 flex 实现截断的关键 */ white-space: nowrap !important; /* 强制不换行 */ overflow: hidden !important; text-overflow: ellipsis !important; display: block !important; /* 确保 ellipsis 生效 */ } /* 热度列 (如果有):固定在右侧 */ .hotboard-table td:last-child { flex: 0 0 auto !important; margin-left: auto; /* 自动推到最右 */ } /* 修复百度热搜竖排问题:因为原样式可能被 td { display: block } 影响 */ .hotboard-title-link, .bili-hot-title { display: inline-block; /* 修复竖排 */ max-width: 100%; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; } /* ========================================= */ /* --- Media Player Island (灵动影音岛) --- */ /* ========================================= */ .mp-container { padding: 0; overflow: hidden; position: relative; /* 子窗口背景已透明,这里不需要额外背景 */ } /* 顶部栏微调:透明悬浮 */ .mp-header { position: absolute; top: 0; left: 0; width: 100%; z-index: 100; background: linear-gradient(to bottom, rgba(0, 0, 0, 0.6), transparent); border: none; padding: 15px 20px; } /* 工作区布局 */ .mp-workspace { display: flex; width: 100%; height: 100%; position: relative; } /* --- 左侧:主屏幕岛 (Screen Island) --- */ .mp-screen-island { flex-grow: 1; background: #000; position: relative; display: flex; align-items: center; justify-content: center; overflow: hidden; /* 拖拽高亮 */ transition: box-shadow 0.3s; } .mp-screen-island.drag-over { box-shadow: inset 0 0 0 4px var(--primary-color); } /* 媒体内容 */ .mp-media-wrapper { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; } .mp-element { max-width: 100%; max-height: 100%; object-fit: contain; /* 保持比例 */ } /* 音频可视化动画 */ .mp-audio-visual { flex-direction: column; align-items: center; gap: 20px; } .audio-icon-glow { font-size: 60px; color: var(--primary-color); filter: drop-shadow(0 0 20px rgba(var(--primary-rgb), 0.6)); animation: pulse 2s infinite; } .audio-wave { display: flex; gap: 5px; height: 30px; align-items: center; } .audio-wave span { width: 4px; background: var(--text-color); border-radius: 2px; animation: wave 1s ease-in-out infinite; } .audio-wave span:nth-child(2) { animation-delay: 0.1s; height: 60%; } .audio-wave span:nth-child(3) { animation-delay: 0.2s; height: 100%; } .audio-wave span:nth-child(4) { animation-delay: 0.1s; height: 70%; } @keyframes wave { 0%, 100% { height: 20%; opacity: 0.5; } 50% { height: 100%; opacity: 1; } } /* 空状态占位 */ .mp-placeholder { position: absolute; text-align: center; color: rgba(255, 255, 255, 0.4); pointer-events: none; /* 让点击穿透到底层容器 */ z-index: 10; } .mp-placeholder button { pointer-events: auto; } /* 按钮可点 */ .placeholder-icon { font-size: 64px; margin-bottom: 20px; opacity: 0.5; } /* --- 底部控制岛 (Floating Control Island) --- */ .mp-control-island { position: absolute; bottom: 30px; left: 50%; transform: translateX(-50%); width: 90%; max-width: 600px; background: rgba(20, 20, 20, 0.85); /* 深色磨砂 */ backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 24px; padding: 15px 25px; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5); z-index: 50; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); opacity: 1; } /* 自动隐藏/禁用 */ .mp-control-island.disabled { transform: translateX(-50%) translateY(100px); opacity: 0; pointer-events: none; } /* 进度条 */ .mp-progress-container { width: 100%; height: 10px; margin-bottom: 10px; cursor: pointer; position: relative; display: flex; align-items: center; } .mp-progress-track { width: 100%; height: 4px; background: rgba(255, 255, 255, 0.2); border-radius: 2px; overflow: hidden; } .mp-progress-fill { height: 100%; background: var(--primary-color); box-shadow: 0 0 10px var(--primary-color); border-radius: 2px; } .mp-progress-container:hover .mp-progress-track { height: 6px; } /* 控制行 */ .mp-control-row { display: flex; justify-content: space-between; align-items: center; } .mp-buttons { display: flex; align-items: center; gap: 20px; } /* 播放按钮 */ .mp-main-btn { width: 48px; height: 48px; border-radius: 50%; background: white; color: black; border: none; font-size: 20px; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: transform 0.2s; } .mp-main-btn:hover { transform: scale(1.1); box-shadow: 0 0 15px rgba(255, 255, 255, 0.4); } .mp-main-btn:active { transform: scale(0.95); } /* 次级按钮 */ .mp-icon-btn { background: transparent; border: none; color: rgba(255, 255, 255, 0.7); font-size: 16px; cursor: pointer; transition: color 0.2s; } .mp-icon-btn:hover { color: white; } .mp-info { font-family: 'Consolas', monospace; font-size: 12px; color: rgba(255, 255, 255, 0.6); width: 100px; } .mp-extras { width: 100px; display: flex; justify-content: flex-end; } /* 音量滑块 */ .mp-volume-wrap { display: flex; align-items: center; gap: 8px; } .mp-volume-slider-container { width: 60px; height: 4px; background: rgba(255, 255, 255, 0.2); border-radius: 2px; position: relative; } #mp-volume-slider { position: absolute; top: -6px; left: 0; width: 100%; height: 16px; opacity: 0; cursor: pointer; } /* 简单的可视音量条可以用伪元素或 JS 做,这里简化 */ /* --- 右侧:播放列表岛 (Playlist Island) --- */ .mp-playlist-island { width: 0; /* 默认折叠 */ background: rgba(var(--card-background-rgb), 0.95); backdrop-filter: blur(20px); border-left: 1px solid var(--border-color); display: flex; flex-direction: column; transition: width 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); overflow: hidden; position: relative; z-index: 90; } .mp-playlist-island.active { width: 280px; /* 展开宽度 */ } .playlist-header { padding: 15px; border-bottom: 1px solid var(--border-color); display: flex; justify-content: space-between; align-items: center; font-weight: 700; font-size: 14px; white-space: nowrap; } .playlist-content { flex-grow: 1; overflow-y: auto; padding: 10px; } .playlist-item { display: flex; align-items: center; gap: 10px; padding: 10px; border-radius: 12px; cursor: pointer; transition: all 0.2s; font-size: 13px; margin-bottom: 5px; } .playlist-item:hover { background: rgba(var(--text-color), 0.05); } .playlist-item.active { background: rgba(var(--primary-rgb), 0.15); color: var(--primary-color); font-weight: 600; } .pl-icon { opacity: 0.7; } .pl-name { flex-grow: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .pl-anim { width: 20px; text-align: center; font-size: 10px; } .playlist-footer { padding: 15px; border-top: 1px solid var(--border-color); } .empty-list-tip { text-align: center; color: var(--text-secondary); padding: 30px 0; font-size: 13px; } /* ======================================================= */ /* --- 2025 Universal Sub-Window UI (Island Container) --- */ /* ======================================================= */ /* 1. 基础环境复位 & 修复圆角溢出 */ body.tool-window-body { background: transparent !important; margin: 0; padding: 10px; /* 增加留白,让发光阴影完整显示 */ height: 100vh; box-sizing: border-box; overflow: hidden; } /* [修复] 在子窗口中彻底隐藏全局背景层,防止它撑出方角 */ body.tool-window-body #background-layer { display: none !important; } /* 2. 核心玻璃框架 (The Glass Slab) */ .app-glass-frame { display: flex; flex-direction: column; height: 100%; width: 100%; /* 背景:高透磨砂 */ background: rgba(var(--card-background-rgb), 0.90); backdrop-filter: blur(40px) saturate(180%); border-radius: 24px; /* 更大的圆角 */ border: 1px solid rgba(128, 128, 128, 0.15); /* 基础阴影 */ box-shadow: 0 20px 50px rgba(0, 0, 0, 0.25); /* [核心修复] 强制 GPU 渲染以修复 border-radius 裁切失效的问题 */ transform: translate3d(0, 0, 0); -webkit-mask-image: -webkit-radial-gradient(white, black); /* 强制遮罩裁切 */ overflow: hidden; position: relative; z-index: 1; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } /* [焦点状态] 呼吸发光边框 */ .app-glass-frame.focused { background: rgba(var(--card-background-rgb), 0.96); /* 激活时稍微不透明一点,提升可读性 */ border-color: rgba(var(--primary-rgb), 0.4); box-shadow: 0 25px 60px rgba(0, 0, 0, 0.35), /* 深邃投影 */ 0 0 0 2px rgba(var(--primary-rgb), 0.3), /* 焦点光环 */ inset 0 0 30px rgba(var(--primary-rgb), 0.05); /* 内部辉光 */ } /* 3. 悬浮标题栏 (Floating Header) */ .glass-title-bar { height: 48px; /* 稍微加高 */ display: flex; align-items: center; padding: 0 18px; -webkit-app-region: drag; /* 标题栏背景渐变,增加质感 */ background: linear-gradient(to bottom, rgba(var(--bg-color-rgb), 0.5), rgba(var(--bg-color-rgb), 0.2)); border-bottom: 1px solid rgba(128, 128, 128, 0.08); flex-shrink: 0; z-index: 10; } .window-status-dot { width: 10px; height: 10px; border-radius: 50%; background-color: var(--border-color); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); margin-right: 14px; transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .window-status-dot.active { background-color: var(--success-color); box-shadow: 0 0 10px var(--success-color); transform: scale(1.1); } .glass-title-text { font-size: 15px; font-weight: 700; color: var(--text-color); letter-spacing: 0.5px; flex-grow: 1; text-align: center; opacity: 0.9; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } /* 4. 内容区域修正 */ .secret-content { padding: 0 !important; display: flex; flex-direction: column; background: transparent !important; /* 修复滚动条样式 */ scrollbar-width: thin; scrollbar-color: var(--border-color) transparent; } /* ========================================= */ /* --- Media Player Island (灵动影音岛) --- */ /* ========================================= */ .mp-container { padding: 0; overflow: hidden; position: relative; /* 子窗口背景已透明,这里不需要额外背景 */ } /* 顶部栏微调:透明悬浮 */ .mp-header { position: absolute; top: 0; left: 0; width: 100%; z-index: 100; background: linear-gradient(to bottom, rgba(0, 0, 0, 0.6), transparent); border: none; padding: 15px 20px; transition: opacity 0.5s ease; } .mp-header.hidden { opacity: 0; pointer-events: none; } /* 工作区布局 */ .mp-workspace { display: flex; width: 100%; height: 100%; position: relative; } /* --- 左侧:主屏幕岛 (Screen Island) --- */ .mp-screen-island { flex-grow: 1; background: #000; position: relative; display: flex; align-items: center; justify-content: center; overflow: hidden; /* 拖拽高亮 */ transition: box-shadow 0.3s; } .mp-screen-island.drag-over { box-shadow: inset 0 0 0 4px var(--primary-color); } /* 媒体内容 */ .mp-media-wrapper { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; } .mp-element { max-width: 100%; max-height: 100%; object-fit: contain; /* 保持比例 */ } /* 音频可视化动画 */ .mp-audio-visual { flex-direction: column; align-items: center; gap: 20px; } .audio-icon-glow { font-size: 60px; color: var(--primary-color); filter: drop-shadow(0 0 20px rgba(var(--primary-rgb), 0.6)); animation: pulse 2s infinite; } .audio-wave { display: flex; gap: 5px; height: 30px; align-items: center; } .audio-wave span { width: 4px; background: var(--text-color); border-radius: 2px; animation: wave 1s ease-in-out infinite; } .audio-wave span:nth-child(2) { animation-delay: 0.1s; height: 60%; } .audio-wave span:nth-child(3) { animation-delay: 0.2s; height: 100%; } .audio-wave span:nth-child(4) { animation-delay: 0.1s; height: 70%; } @keyframes wave { 0%, 100% { height: 20%; opacity: 0.5; } 50% { height: 100%; opacity: 1; } } /* 空状态占位 */ .mp-placeholder { position: absolute; text-align: center; color: rgba(255, 255, 255, 0.4); pointer-events: none; /* 让点击穿透到底层容器 */ z-index: 10; } .mp-placeholder button { pointer-events: auto; } /* 按钮可点 */ .placeholder-icon { font-size: 64px; margin-bottom: 20px; opacity: 0.5; } /* --- 底部控制岛 (Floating Control Island) --- */ .mp-control-island { position: absolute; bottom: 30px; left: 50%; transform: translateX(-50%); width: 90%; max-width: 600px; background: rgba(20, 20, 20, 0.85); /* 深色磨砂 */ backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 24px; padding: 15px 25px; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5); z-index: 50; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); opacity: 1; } /* 自动隐藏/禁用 */ .mp-control-island.disabled { transform: translateX(-50%) translateY(100px); opacity: 0; pointer-events: none; } .mp-control-island.hidden { opacity: 0; transform: translateX(-50%) translateY(20px); pointer-events: none; } /* 进度条 */ .mp-progress-container { width: 100%; height: 10px; margin-bottom: 10px; cursor: pointer; position: relative; display: flex; align-items: center; } .mp-progress-track { width: 100%; height: 4px; background: rgba(255, 255, 255, 0.2); border-radius: 2px; overflow: hidden; } .mp-progress-fill { height: 100%; background: var(--primary-color); box-shadow: 0 0 10px var(--primary-color); border-radius: 2px; } .mp-progress-container:hover .mp-progress-track { height: 6px; } /* 控制行 */ .mp-control-row { display: flex; justify-content: space-between; align-items: center; } .mp-buttons { display: flex; align-items: center; gap: 20px; } /* 播放按钮 */ .mp-main-btn { width: 48px; height: 48px; border-radius: 50%; background: white; color: black; border: none; font-size: 20px; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: transform 0.2s; } .mp-main-btn:hover { transform: scale(1.1); box-shadow: 0 0 15px rgba(255, 255, 255, 0.4); } .mp-main-btn:active { transform: scale(0.95); } /* 次级按钮 */ .mp-icon-btn { background: transparent; border: none; color: rgba(255, 255, 255, 0.7); font-size: 16px; cursor: pointer; transition: color 0.2s; } .mp-icon-btn:hover { color: white; } .mp-info { font-family: 'Consolas', monospace; font-size: 12px; color: rgba(255, 255, 255, 0.6); width: 100px; } .mp-extras { width: 100px; display: flex; justify-content: flex-end; } /* 音量滑块 */ .mp-volume-wrap { display: flex; align-items: center; gap: 8px; } .mp-volume-slider-container { width: 60px; height: 4px; background: rgba(255, 255, 255, 0.2); border-radius: 2px; position: relative; } #mp-volume-slider { position: absolute; top: -6px; left: 0; width: 100%; height: 16px; opacity: 0; cursor: pointer; } /* 简单的可视音量条可以用伪元素或 JS 做,这里简化 */ /* --- 右侧:播放列表岛 (Playlist Island) --- */ .mp-playlist-island { width: 0; /* 默认折叠 */ background: rgba(var(--card-background-rgb), 0.95); backdrop-filter: blur(20px); border-left: 1px solid var(--border-color); display: flex; flex-direction: column; transition: width 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); overflow: hidden; position: relative; z-index: 90; } .mp-playlist-island.active { width: 280px; /* 展开宽度 */ } .playlist-header { padding: 15px; border-bottom: 1px solid var(--border-color); display: flex; justify-content: space-between; align-items: center; font-weight: 700; font-size: 14px; white-space: nowrap; } .playlist-content { flex-grow: 1; overflow-y: auto; padding: 10px; } .playlist-item { display: flex; align-items: center; gap: 10px; padding: 10px; border-radius: 12px; cursor: pointer; transition: all 0.2s; font-size: 13px; margin-bottom: 5px; } .playlist-item:hover { background: rgba(var(--text-color), 0.05); } .playlist-item.active { background: rgba(var(--primary-rgb), 0.15); color: var(--primary-color); font-weight: 600; } .pl-icon { opacity: 0.7; } .pl-name { flex-grow: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .pl-anim { width: 20px; text-align: center; font-size: 10px; } .playlist-footer { padding: 15px; border-top: 1px solid var(--border-color); } .empty-list-tip { text-align: center; color: var(--text-secondary); padding: 30px 0; font-size: 13px; } /* ======================================================= */ /* --- 2025 Universal Sub-Window UI (Glowing Island) --- */ /* ======================================================= */ /* 1. 窗口根容器:必须透明且留出边距给阴影 */ body.tool-window-body { background: transparent !important; margin: 0; /* [关键] 留出 15px 边距,确保发光阴影不被系统窗口边缘切断 */ padding: 15px; height: 100vh; box-sizing: border-box; overflow: hidden; } /* 隐藏全局背景,防止溢出圆角 */ body.tool-window-body #background-layer { display: none !important; } /* 2. 核心悬浮玻璃框架 */ .app-glass-frame { display: flex; flex-direction: column; height: 100%; width: 100%; /* 极简磨砂背景 */ background: rgba(var(--card-background-rgb), 0.92); backdrop-filter: blur(40px) saturate(180%); border-radius: 20px; /* 完美圆角 */ /* 默认状态:微弱边框 + 基础投影 */ border: 1px solid rgba(128, 128, 128, 0.1); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); position: relative; overflow: hidden; /* 内部内容裁切 */ z-index: 1; } /* [焦点/激活状态] 呼吸发光特效 */ .app-glass-frame.focused { background: rgba(var(--card-background-rgb), 0.98); /* 边框高亮 */ border-color: rgba(var(--primary-rgb), 0.5); /* 复合发光阴影:外发光 + 内辉光 */ box-shadow: 0 0 0 1px rgba(var(--primary-rgb), 0.3), /* 模拟高亮描边 */ 0 20px 60px rgba(0, 0, 0, 0.4), /* 深度投影 */ 0 0 30px rgba(var(--primary-rgb), 0.15); /* 氛围光晕 */ } /* 标题栏优化 */ .glass-title-bar { height: 44px; display: flex; align-items: center; padding: 0 16px; -webkit-app-region: drag; /* 标题栏背景渐变 */ background: linear-gradient(to bottom, rgba(var(--bg-color-rgb), 0.5), rgba(var(--bg-color-rgb), 0.1)); border-bottom: 1px solid rgba(128, 128, 128, 0.05); flex-shrink: 0; } /* ========================================= */ /* --- Media Player Island (Refined UI) --- */ /* ========================================= */ /* 播放器容器 */ .mp-container { padding: 0 !important; /* 移除内边距,全屏沉浸 */ } .mp-workspace { background-color: #000; /* 纯黑背景 */ border-radius: 0 0 20px 20px; /* 底部圆角 */ } /* 屏幕岛:承载视频/图片 */ .mp-screen-island { flex-grow: 1; position: relative; display: flex; align-items: center; justify-content: center; overflow: hidden; background: radial-gradient(circle at center, #1a1a1a 0%, #000000 100%); } /* 悬浮控制岛 (Dynamic Control Island) */ .mp-control-island { position: absolute; bottom: 30px; left: 50%; transform: translateX(-50%); /* 宽度自适应,最大 600px */ width: 90%; max-width: 640px; /* 深度磨砂黑 */ background: rgba(20, 20, 20, 0.85); backdrop-filter: blur(20px) saturate(180%); border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 24px; /* 胶囊圆角 */ padding: 12px 24px; box-shadow: 0 15px 40px rgba(0, 0, 0, 0.6); z-index: 50; transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); opacity: 1; } /* 自动隐藏状态 */ .mp-control-island.hidden { opacity: 0; transform: translateX(-50%) translateY(30px) scale(0.95); pointer-events: none; } /* 进度条轨道 */ .mp-progress-track { width: 100%; height: 4px; background: rgba(255, 255, 255, 0.2); border-radius: 2px; position: relative; overflow: hidden; transition: height 0.2s; } .mp-progress-container:hover .mp-progress-track { height: 6px; } /* 音量条滑块 (彩色填充) */ #mp-volume-slider { -webkit-appearance: none; width: 80px; height: 4px; border-radius: 2px; background: rgba(255, 255, 255, 0.2); /* 默认底色 */ outline: none; cursor: pointer; /* 核心:通过 JS 设置 background-image 来实现填充色 */ } #mp-volume-slider::-webkit-slider-thumb { -webkit-appearance: none; width: 10px; height: 10px; border-radius: 50%; background: #fff; box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); margin-top: -3px; /* 居中 */ transition: transform 0.1s; } #mp-volume-slider:hover::-webkit-slider-thumb { transform: scale(1.2); } /* 时间显示 */ .mp-info { font-family: 'Consolas', 'Roboto Mono', monospace; font-size: 12px; color: rgba(255, 255, 255, 0.7); min-width: 100px; text-align: left; } /* 播放列表岛 */ .mp-playlist-island { background: rgba(var(--card-background-rgb), 0.98); border-left: 1px solid rgba(128, 128, 128, 0.1); } /* src/css/style.css - 添加到文件末尾 */ /* ========================================= */ /* --- [需求 4] 丰富的日志图标样式 --- */ /* ========================================= */ .log-tag-system { background: linear-gradient(135deg, rgba(52, 199, 89, 0.2), rgba(52, 199, 89, 0.1)); color: #34c759; box-shadow: 0 2px 8px rgba(52, 199, 89, 0.2); } .log-tag-nav { background: linear-gradient(135deg, rgba(0, 122, 255, 0.2), rgba(0, 122, 255, 0.1)); color: #007aff; box-shadow: 0 2px 8px rgba(0, 122, 255, 0.2); } .log-tag-ui { background: linear-gradient(135deg, rgba(88, 86, 214, 0.2), rgba(88, 86, 214, 0.1)); color: #5856d6; box-shadow: 0 2px 8px rgba(88, 86, 214, 0.2); } .log-tag-tool { background: linear-gradient(135deg, rgba(175, 82, 222, 0.2), rgba(175, 82, 222, 0.1)); color: #af52de; box-shadow: 0 2px 8px rgba(175, 82, 222, 0.2); } .log-tag-update { background: linear-gradient(135deg, rgba(255, 204, 0, 0.2), rgba(255, 204, 0, 0.1)); color: #ffcc00; box-shadow: 0 2px 8px rgba(255, 204, 0, 0.2); } .log-tag-settings { background: linear-gradient(135deg, rgba(142, 142, 147, 0.2), rgba(142, 142, 147, 0.1)); color: #8e8e93; } .log-tag-error { background: linear-gradient(135deg, rgba(255, 59, 48, 0.2), rgba(255, 59, 48, 0.1)); color: #ff3b30; box-shadow: 0 2px 8px rgba(255, 59, 48, 0.3); } .log-tag-general { background: rgba(255, 255, 255, 0.1); color: var(--text-secondary); } /* ========================================= */ /* --- [需求 6] 设置面板切换动画 --- */ /* ========================================= */ /* 必须将面板改为绝对定位或 Grid 堆叠,才能实现共存时的过渡 */ /* 修改原有的 .settings-content-island 布局方式 */ .settings-content-island { position: relative; overflow: hidden; /* 隐藏切出的内容 */ /* 移除 flex-grow 的滚动,改为内部面板滚动 */ } /* 面板基础样式 */ .settings-panel { position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow-y: auto; /* 面板内部滚动 */ padding-right: 5px; opacity: 0; visibility: hidden; transform: translateY(20px) scale(0.98); transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); /* 隐藏滚动条 */ scrollbar-width: thin; } /* 激活态 */ .settings-panel.active { opacity: 1; visibility: visible; transform: translateY(0) scale(1); z-index: 2; /* 确保在最上层 */ } /* 离场动画类 (JS 添加) */ .settings-panel.panel-exit { opacity: 0; transform: translateY(-20px) scale(0.98); z-index: 1; } /* 进场动画类 (JS 添加) */ .settings-panel.panel-enter { animation: panelEnterAnim 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; } @keyframes panelEnterAnim { from { opacity: 0; transform: translateY(30px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } } /* src/css/style.css - 追加到文件末尾 */ /* ========================================= */ /* --- [优化] 设置面板切换防闪屏 --- */ /* ========================================= */ .settings-content-island { position: relative; /* 确保容器有高度,防止塌陷 */ height: 100%; overflow: hidden; } .settings-panel { position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow-y: auto; padding-right: 5px; /* 默认隐藏状态 */ opacity: 0; visibility: hidden; transform: translateY(15px) scale(0.98); /* 增加 transition-delay 防止旧页面还没消失新页面就跳出来 */ transition: opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), visibility 0.3s linear; background-color: transparent; /* 确保背景透明,避免遮挡 */ z-index: 0; } /* 激活态:层级提高,立刻显示 */ .settings-panel.active { opacity: 1; visibility: visible; transform: translateY(0) scale(1); z-index: 10; transition-delay: 0s; /* 立即执行 */ } /* 离场态:层级降低,保留动画 */ .settings-panel.panel-exit { opacity: 0; transform: translateY(-15px) scale(0.98); z-index: 9; visibility: hidden; } /* ========================================= */ /* --- [需求 1] 更新管理 - 灵动岛 UI 重构 --- */ /* ========================================= */ /* 更新状态容器 */ .update-status-container { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px 20px; min-height: 300px; text-align: center; transition: all 0.3s ease; } /* 状态图标岛 */ .update-icon-island { width: 100px; height: 100px; border-radius: 50%; background: rgba(var(--primary-rgb), 0.1); display: flex; align-items: center; justify-content: center; margin-bottom: 25px; position: relative; box-shadow: 0 10px 30px rgba(var(--primary-rgb), 0.2); transition: all 0.5s cubic-bezier(0.34, 1.56, 0.64, 1); } .update-icon-island i { font-size: 48px; color: var(--primary-color); z-index: 2; } /* 状态 1: 待检测 / 闲置 (呼吸灯) */ .update-state-idle .update-icon-island { animation: breathe 4s infinite ease-in-out; } /* 状态 2: 检测中 (旋转光环) */ .update-state-checking .update-icon-island::after { content: ''; position: absolute; top: -5px; left: -5px; right: -5px; bottom: -5px; border-radius: 50%; border: 3px solid transparent; border-top-color: var(--primary-color); border-left-color: var(--primary-color); animation: spin 1s linear infinite; } /* 状态 3: 无更新 (绿色对勾) */ .update-state-latest .update-icon-island { background: rgba(52, 199, 89, 0.15); /* Green */ box-shadow: 0 10px 30px rgba(52, 199, 89, 0.3); } .update-state-latest .update-icon-island i { color: #34c759; } /* 状态 4: 发现更新 (火箭发射) */ .update-state-available .update-icon-island { background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); box-shadow: 0 15px 40px rgba(var(--primary-rgb), 0.5); transform: scale(1.1); } .update-state-available .update-icon-island i { color: white; animation: float 2s ease-in-out infinite; } /* 文本样式 */ .update-title { font-size: 24px; font-weight: 700; margin-bottom: 10px; background: linear-gradient(135deg, var(--text-color), var(--text-secondary)); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; } .update-desc { color: var(--text-secondary); font-size: 14px; max-width: 400px; line-height: 1.6; margin-bottom: 30px; } /* 胶囊按钮组 */ .update-actions-island { display: flex; gap: 15px; margin-top: 10px; } /* --- 下载进度条 (液态岛) --- */ .download-island-container { width: 100%; max-width: 450px; background: rgba(var(--bg-color-rgb), 0.5); border-radius: 20px; padding: 25px; border: 1px solid var(--border-color); position: relative; overflow: hidden; } .download-header { display: flex; justify-content: space-between; margin-bottom: 15px; font-size: 14px; font-weight: 600; } .liquid-progress-track { height: 12px; background: rgba(128, 128, 128, 0.15); border-radius: 10px; overflow: hidden; position: relative; margin-bottom: 15px; } .liquid-progress-bar { height: 100%; width: 0%; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); border-radius: 10px; position: relative; box-shadow: 0 0 15px rgba(var(--primary-rgb), 0.5); transition: width 0.3s ease-out; } /* 进度条上的流光 */ .liquid-progress-bar::after { content: ''; position: absolute; top: 0; left: 0; bottom: 0; right: 0; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent); transform: translateX(-100%); animation: shimmer 1.5s infinite; } .download-meta { display: flex; justify-content: space-between; font-size: 12px; color: var(--text-secondary); font-family: 'Consolas', monospace; } @keyframes shimmer { 100% { transform: translateX(100%); } } @keyframes breathe { 0%, 100% { transform: scale(1); box-shadow: 0 10px 30px rgba(var(--primary-rgb), 0.2); } 50% { transform: scale(1.05); box-shadow: 0 15px 40px rgba(var(--primary-rgb), 0.4); } } /* ========================================= */ /* --- [需求 2] PC 基准测试工具样式 --- */ /* ========================================= */ .benchmark-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; animation: contentFadeIn 0.5s; } .bench-card { background: rgba(var(--card-background-rgb), 0.6); border: 1px solid var(--border-color); border-radius: 16px; padding: 20px; display: flex; flex-direction: column; } .bench-card h3 { font-size: 16px; margin-bottom: 15px; padding-bottom: 10px; border-bottom: 1px dashed var(--border-color); color: var(--primary-color); display: flex; align-items: center; gap: 10px; } .bench-item { display: flex; justify-content: space-between; padding: 8px 0; font-size: 13px; } .bench-key { color: var(--text-secondary); } .bench-val { font-weight: 600; color: var(--text-color); font-family: monospace; } /* 评分大数字 */ .bench-score-box { text-align: center; padding: 20px; background: linear-gradient(135deg, rgba(var(--primary-rgb), 0.1), rgba(var(--secondary-rgb), 0.1)); border-radius: 12px; margin-top: auto; } .bench-score-val { font-size: 36px; font-weight: 800; background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; } /* ======================================================= */ /* --- 2025 Universal Sub-Window UI (Glowing Island) --- */ /* ======================================================= */ /* 1. 窗口根容器:必须透明且留出边距给阴影 */ body.tool-window-body { background: transparent !important; margin: 0; /* [关键] 留出 15px 边距,确保发光阴影不被系统窗口边缘切断 */ padding: 15px; height: 100vh; box-sizing: border-box; overflow: hidden; } /* 隐藏全局背景,防止溢出圆角 */ body.tool-window-body #background-layer { display: none !important; } /* 2. 核心悬浮玻璃框架 */ .app-glass-frame { display: flex; flex-direction: column; height: 100%; width: 100%; /* 极简磨砂背景 */ background: rgba(var(--card-background-rgb), 0.92); backdrop-filter: blur(40px) saturate(180%); border-radius: 20px; /* 完美圆角 */ /* 默认状态:微弱边框 + 基础投影 */ border: 1px solid rgba(128, 128, 128, 0.1); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); position: relative; overflow: hidden; /* 内部内容裁切 */ z-index: 1; } /* [焦点/激活状态] 呼吸发光特效 */ .app-glass-frame.focused { background: rgba(var(--card-background-rgb), 0.98); /* 边框高亮 */ border-color: rgba(var(--primary-rgb), 0.5); /* 复合发光阴影:外发光 + 内辉光 */ box-shadow: 0 0 0 1px rgba(var(--primary-rgb), 0.3), /* 模拟高亮描边 */ 0 20px 60px rgba(0, 0, 0, 0.4), /* 深度投影 */ 0 0 30px rgba(var(--primary-rgb), 0.15); /* 氛围光晕 */ } /* 3. 悬浮标题栏 (Floating Header) */ .glass-title-bar { height: 44px; display: flex; align-items: center; padding: 0 16px; -webkit-app-region: drag; /* 标题栏背景渐变 */ background: linear-gradient(to bottom, rgba(var(--bg-color-rgb), 0.5), rgba(var(--bg-color-rgb), 0.1)); border-bottom: 1px solid rgba(128, 128, 128, 0.05); flex-shrink: 0; } /* 左上角状态指示点 */ .window-status-dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--text-secondary); opacity: 0.3; margin-right: 12px; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); box-shadow: 0 0 0 2px rgba(128, 128, 128, 0.1); } /* 激活时变为绿色呼吸灯 */ .window-status-dot.active { background-color: var(--success-color); box-shadow: 0 0 8px var(--success-color); opacity: 1; transform: scale(1.1); } .glass-title-text { font-size: 14px; font-weight: 600; color: var(--text-color); letter-spacing: 0.5px; flex-grow: 1; text-align: center; opacity: 0.9; } /* 4. 灵动岛风格控制按钮 (Traffic Lights) */ .island-controls { display: flex; gap: 8px; -webkit-app-region: no-drag; } .control-pill { width: 28px; /* 胶囊宽度 */ height: 28px; border-radius: 8px; /* 稍微方一点的圆角,更现代 */ border: none; background: transparent; color: var(--text-secondary); display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s cubic-bezier(0.25, 0.8, 0.25, 1); } .control-pill:hover { background: rgba(var(--text-color), 0.1); color: var(--text-color); transform: scale(1.05); } .control-pill.close:hover { background: var(--error-color); color: white; box-shadow: 0 2px 8px rgba(var(--error-color-rgb), 0.4); } /* 按钮内部的图标线条绘制 */ .icon-line { width: 10px; height: 2px; background: currentColor; border-radius: 1px; } .icon-rect { width: 10px; height: 10px; border: 2px solid currentColor; border-radius: 2px; } /* 5. 内容区域修正 */ .secret-content { /* 移除旧的 padding,交给内部元素自适应 */ padding: 0 !important; display: flex; flex-direction: column; background: transparent !important; } /* 修复子窗口内的工具加载动画位置 */ #tool-content-area .loading-container { height: 100%; display: flex; align-items: center; justify-content: center; } /* ======================================================= */ /* --- 2025 Universal Sub-Window UI (Perfect Crop Fix) --- */ /* ======================================================= */ /* 1. 窗口根容器 */ body.tool-window-body { background: transparent !important; margin: 0; /* [核心调整] 减小 Padding。只要留出足够 box-shadow 扩散的空间即可。 如果阴影是 30px 扩散,这里留 10px-15px 可能会切断阴影, 但为了“紧凑”感,我们设为 8px,并调整内部阴影参数。 */ padding: 8px; height: 100vh; box-sizing: border-box; overflow: hidden; /* 防止滚动条出现 */ display: flex; /* 使用 Flex 居中,确保 Frame 撑满 */ } /* 隐藏全局背景 */ body.tool-window-body #background-layer { display: none !important; } /* 2. 核心悬浮玻璃框架 */ .app-glass-frame { flex: 1; /* 撑满 body 除去 padding 后的空间 */ display: flex; flex-direction: column; width: 100%; height: 100%; /* 背景:高透磨砂 */ background: rgba(var(--card-background-rgb), 0.90); backdrop-filter: blur(40px) saturate(180%); /* 圆角 */ border-radius: 16px; /* 稍微减小圆角以匹配紧凑感 */ /* 边框:作为发光的内边界 */ border: 1px solid rgba(255, 255, 255, 0.1); /* [核心调整] 阴影控制 */ /* 使用 inset 阴影来模拟内部发光,外部阴影减小扩散范围以适应紧凑 padding */ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05), /* 物理边框线 */ 0 10px 30px rgba(0, 0, 0, 0.4); /* 底部投影 */ /* 强制裁切内部溢出 */ overflow: hidden; position: relative; z-index: 1; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } /* [焦点/激活状态] 蓝色发光边框 */ .app-glass-frame.focused { background: rgba(var(--card-background-rgb), 0.96); /* 边框变亮 */ border-color: rgba(var(--primary-rgb), 0.6); /* [核心] 模拟您图片中的蓝色发光边框 */ box-shadow: 0 0 0 2px rgba(var(--primary-rgb), 0.5), /* 外发光圈 (蓝边) */ 0 15px 40px rgba(0, 0, 0, 0.5); /* 深度投影保持不变 */ } /* 3. 标题栏微调 */ .glass-title-bar { height: 42px; /* 紧凑高度 */ display: flex; align-items: center; padding: 0 15px; -webkit-app-region: drag; /* 使用渐变底色增加层次 */ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0)); border-bottom: 1px solid rgba(128, 128, 128, 0.1); flex-shrink: 0; } /* 修复内容区域在圆角内的显示 */ .secret-content, #tool-content-area { border-radius: 0 0 16px 16px; /* 底部圆角匹配 Frame */ } /* ======================================================= */ /* --- 2025 Universal Sub-Window UI (Perfect Crop Fix) --- */ /* ======================================================= */ /* [核心修复 1] 强制根节点透明,防止出现黑色底色 */ html { background: transparent !important; } /* 1. 窗口根容器 */ body.tool-window-body { background: transparent !important; margin: 0; /* [核心调整] 将内边距从之前的 15px/20px 减小到 4px。 这刚好足够显示 2px 的蓝色呼吸光圈 + 少量柔和阴影, 彻底消除多余的“黑边”区域。 */ padding: 6px; height: 100vh; width: 100vw; box-sizing: border-box; overflow: hidden; /* 彻底禁止滚动条 */ display: flex; /* 启用 Flex 布局 */ align-items: stretch; /* 强制子元素撑满高度 */ justify-content: stretch; /* 强制子元素撑满宽度 */ } /* 隐藏全局背景层,防止它溢出圆角 */ body.tool-window-body #background-layer { display: none !important; } /* 2. 核心悬浮玻璃框架 */ .app-glass-frame { flex: 1; /* 自动撑满 body 的剩余空间 */ display: flex; flex-direction: column; /* 移除所有 margin,由 body 的 padding 控制边缘 */ margin: 0; width: 100%; height: 100%; /* 背景:高透磨砂 (深色模式适配) */ background: rgba(var(--card-background-rgb), 0.92); backdrop-filter: blur(40px) saturate(180%); /* 圆角:稍微减小以匹配紧凑的边缘 */ border-radius: 12px; /* 物理边框 */ border: 1px solid rgba(255, 255, 255, 0.1); /* 默认阴影:非常收敛,紧贴窗口 */ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.3); /* 强制裁切内部溢出,保证圆角完美 */ overflow: hidden; position: relative; z-index: 1; transition: all 0.2s cubic-bezier(0.25, 0.8, 0.25, 1); } /* [焦点/激活状态] 蓝色呼吸光圈 (The Blue Edge) */ .app-glass-frame.focused { background: rgba(var(--card-background-rgb), 0.98); /* 边框高亮 */ border-color: rgba(var(--primary-rgb), 0.6); /* [核心视觉] 1. 0 0 0 2px: 产生 2px 宽的实心发光边框 (Blue Edge) 2. 0 0 15px: 产生柔和的外发光,增加灵动感 */ box-shadow: 0 0 0 2px rgba(var(--primary-rgb), 1), /* 强烈的蓝色轮廓 */ 0 0 15px rgba(var(--primary-rgb), 0.4); /* 柔和辉光 */ } /* 3. 标题栏微调 */ .glass-title-bar { height: 38px; /* 更加紧凑的标题栏 */ display: flex; align-items: center; padding: 0 12px; -webkit-app-region: drag; background: linear-gradient(to bottom, rgba(255, 255, 255, 0.03), transparent); border-bottom: 1px solid rgba(128, 128, 128, 0.1); flex-shrink: 0; } /* 修复内容区域的圆角衔接 */ .secret-content, #tool-content-area { background: transparent !important; border-radius: 0 0 12px 12px; } /* 输入框在子窗口中的适配优化 */ .tool-window-body .ip-input-group { background: rgba(var(--bg-color-rgb), 0.5); border: 1px solid var(--border-color); border-radius: 10px; /* 这里的圆角也稍微减小 */ margin-bottom: 15px; } /* ======================================================= */ /* --- 2025 Universal Sub-Window UI (Clean Rounded) --- */ /* ======================================================= */ /* [关键] 强制根节点完全透明,防止任何底色渗出 */ html { background: transparent !important; } /* 1. 窗口根容器 */ body.tool-window-body { background: transparent !important; margin: 0; /* [核心调整] 将 padding 设为 1px。 这几乎完全消除了外部空间,只留 1px 防止圆角裁切时的锯齿毛边。 不再预留阴影空间,追求极致的“贴边”效果。 */ padding: 1px; height: 100vh; width: 100vw; box-sizing: border-box; overflow: hidden; /* 禁止滚动 */ display: flex; } /* 隐藏全局背景层 */ body.tool-window-body #background-layer { display: none !important; } /* 2. 核心玻璃框架 */ .app-glass-frame { flex: 1; /* 撑满所有可用空间 */ display: flex; flex-direction: column; margin: 0; width: 100%; height: 100%; /* 背景:高透磨砂 (保证内容清晰) */ background: rgba(var(--card-background-rgb), 0.96); backdrop-filter: blur(40px) saturate(180%); /* [核心样式] 标准圆角 */ border-radius: 12px; /* [核心样式] 物理单像素边框 */ /* 使用半透明灰色,适配深浅主题 */ border: 1px solid rgba(128, 128, 128, 0.25); /* 移除所有扩散性阴影/发光 */ box-shadow: none; /* 强制裁切,确保子元素不溢出圆角 */ overflow: hidden; position: relative; z-index: 1; } /* [焦点状态] 仅改变边框颜色,不再发光 */ .app-glass-frame.focused { /* 激活时背景微调 */ background: rgba(var(--card-background-rgb), 1); /* 边框变为主题色,提示焦点 */ border-color: var(--primary-color); /* 依然不添加发光阴影 */ box-shadow: none; } /* 3. 标题栏 */ .glass-title-bar { height: 36px; /* 紧凑高度 */ display: flex; align-items: center; padding: 0 12px; -webkit-app-region: drag; /* 允许拖动 */ /* 极简分割线 */ border-bottom: 1px solid rgba(128, 128, 128, 0.1); background: transparent; flex-shrink: 0; } /* 状态点微调 */ .window-status-dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--text-secondary); opacity: 0.3; margin-right: 10px; } .window-status-dot.active { background-color: var(--success-color); opacity: 1; box-shadow: none; /* 移除光晕 */ } /* 4. 内容区域适配 */ .secret-content, #tool-content-area { background: transparent !important; /* 确保底部圆角不被直角背景覆盖 */ border-radius: 0 0 12px 12px; } /* 修复子窗口内输入框样式 */ .tool-window-body .ip-input-group { background: rgba(var(--bg-color-rgb), 0.5); border: 1px solid var(--border-color); border-radius: 8px; margin-bottom: 15px; } /* --- [新增] 标题栏天气灵动岛组件 --- */ /* 1. 布局容器 */ .title-bar-right-container { display: flex; align-items: center; gap: 10px; height: 100%; -webkit-app-region: no-drag; /* 允许交互 */ } /* 2. 天气胶囊 (Pill) */ .weather-widget-pill { position: relative; height: 28px; /* 宽度动态,根据内容适配,但最大限制 */ max-width: 140px; min-width: 60px; background: rgba(var(--card-background-rgb), 0.5); border: 1px solid var(--border-color); border-radius: 14px; /* 胶囊圆角 */ display: flex; align-items: center; justify-content: center; padding: 0 10px; gap: 8px; cursor: pointer; transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); overflow: visible; /* 允许下拉菜单溢出 */ } .weather-widget-pill:hover { background: rgba(var(--card-background-rgb), 0.8); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); transform: translateY(1px); } .weather-pill-temp { font-size: 13px; font-weight: 700; color: var(--text-color); font-family: 'Consolas', monospace; } .weather-pill-city { font-size: 11px; color: var(--text-secondary); display: none; /* 默认隐藏,悬浮或宽屏可显示 */ } /* 3. 纯 CSS 天气图标绘制 (Pure CSS Weather Icons) */ .css-weather-icon { width: 20px; height: 20px; position: relative; } /* ☀️ 晴 (Sun) */ .css-icon-sun { background: #ffb300; border-radius: 50%; width: 12px; height: 12px; position: absolute; top: 4px; left: 4px; box-shadow: 0 0 0 2px rgba(255, 179, 0, 0.3), 0 0 8px #ffb300; animation: spin 10s linear infinite; } /* ☁️ 多云/阴 (Cloud) */ .css-icon-cloud { background: #fff; width: 14px; height: 6px; border-radius: 10px; position: absolute; top: 8px; left: 3px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .css-icon-cloud::after { content: ''; position: absolute; width: 8px; height: 8px; border-radius: 50%; background: #fff; top: -4px; left: 2px; } /* 🌧️ 雨 (Rain) */ .css-icon-rain { background: #b0c4de; width: 14px; height: 6px; border-radius: 10px; position: absolute; top: 6px; left: 3px; } .css-icon-rain::before { /* 雨滴 */ content: ''; position: absolute; height: 4px; width: 2px; background: #007aff; top: 8px; left: 3px; box-shadow: 4px 2px 0 #007aff, 8px 0 0 #007aff; transform: skewX(-20deg); animation: rainDrop 1s infinite linear; } @keyframes rainDrop { 0% { transform: skewX(-20deg) translateY(0); opacity: 1; } 100% { transform: skewX(-20deg) translateY(5px); opacity: 0; } } /* 4. 悬浮下拉卡片 (Dropdown Card) */ .weather-dropdown-card { position: absolute; top: 36px; /* 胶囊下方 */ right: 0; width: 220px; background: rgba(var(--card-background-rgb), 0.95); backdrop-filter: blur(20px); border: 1px solid var(--border-color); border-radius: 16px; padding: 15px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); display: flex; flex-direction: column; gap: 10px; /* 动画 */ opacity: 0; visibility: hidden; transform: translateY(-10px) scale(0.95); transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); pointer-events: none; z-index: 1000; } .weather-widget-pill:hover .weather-dropdown-card { opacity: 1; visibility: visible; transform: translateY(0) scale(1); pointer-events: auto; } /* 下拉卡片内容 */ .wd-header { display: flex; justify-content: space-between; align-items: center; font-size: 14px; font-weight: 700; border-bottom: 1px solid var(--border-color); padding-bottom: 8px; } .wd-temp-row { display: flex; align-items: center; gap: 15px; } .wd-big-temp { font-size: 32px; font-weight: 800; color: var(--text-color); } .wd-detail { font-size: 12px; color: var(--text-secondary); display: flex; flex-direction: column; } /* ========================================= */ /* --- [修复] 标题栏灵动岛天气组件样式 --- */ /* ========================================= */ /* 1. 标题栏整体布局修正 */ .title-bar { display: flex; justify-content: flex-end; /* 所有内容靠右对齐 */ align-items: center; padding: 0; /* 移除内边距,由内部容器接管 */ z-index: 2000; /* 确保层级最高 */ } /* 2. 右侧功能区容器 (包裹 天气 + 窗口控制键) */ .title-bar-right-container { display: flex; align-items: center; gap: 12px; /* 天气与控制键之间的间距 */ height: 100%; padding-right: 15px; /* 距离窗口最右边的距离 */ -webkit-app-region: no-drag; /* 关键:区域内不可拖动,确保点击有效 */ } /* 窗口控制键容器 (保持原样,但在新容器内) */ .window-controls { display: flex; align-items: center; gap: 5px; /* 按钮间距 */ -webkit-app-region: no-drag; } /* 3. 天气胶囊 (Pill) - 灵动岛风格 */ .weather-widget-pill { position: relative; height: 28px; min-width: 70px; /* 最小宽度,防止未加载时太窄 */ padding: 0 12px; /* 玻璃拟态背景 */ background: rgba(var(--card-background-rgb), 0.5); backdrop-filter: blur(10px); border: 1px solid var(--border-color); border-radius: 99px; /* 胶囊圆角 */ display: flex; /* 强制显示,不要用 none */ align-items: center; justify-content: center; gap: 8px; cursor: pointer; transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); color: var(--text-color); z-index: 2001; } /* 悬停效果:背景加深,轻微上浮 */ .weather-widget-pill:hover { background: rgba(var(--card-background-rgb), 0.9); border-color: rgba(var(--primary-rgb), 0.3); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); transform: translateY(1px); } .weather-pill-temp { font-size: 13px; font-weight: 700; font-family: 'Consolas', monospace; white-space: nowrap; } /* 4. 纯 CSS 绘制的天气图标 (无图片依赖,加载更快) */ .css-weather-icon { width: 20px; height: 20px; position: relative; } /* ☀️ 晴 */ .css-icon-sun { background: #ffb300; border-radius: 50%; width: 10px; height: 10px; position: absolute; top: 5px; left: 5px; box-shadow: 0 0 0 2px rgba(255, 179, 0, 0.2), 0 0 8px #ffb300; animation: spin-slow 10s linear infinite; } @keyframes spin-slow { 100% { transform: rotate(360deg); } } /* ☁️ 云 */ .css-icon-cloud { background: #fff; width: 14px; height: 7px; border-radius: 10px; position: absolute; top: 7px; left: 3px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .css-icon-cloud::after { content: ''; position: absolute; width: 8px; height: 8px; border-radius: 50%; background: #fff; top: -4px; left: 3px; } /* 🌧️ 雨 */ .css-icon-rain { background: #90caf9; width: 14px; height: 7px; border-radius: 10px; position: absolute; top: 6px; left: 3px; } .css-icon-rain::before { content: ''; position: absolute; height: 4px; width: 2px; background: #42a5f5; top: 8px; left: 4px; transform: skewX(-20deg); animation: rain-drop 0.8s infinite linear; } @keyframes rain-drop { 0% { opacity: 1; transform: skewX(-20deg) translateY(0); } 100% { opacity: 0; transform: skewX(-20deg) translateY(6px); } } /* 5. 悬浮下拉卡片 (Dropdown Card) */ .weather-dropdown-card { position: absolute; top: 38px; /* 位于胶囊下方 */ right: 0; width: 200px; background: rgba(var(--card-background-rgb), 0.95); backdrop-filter: blur(25px); border: 1px solid var(--border-color); border-radius: 16px; padding: 15px; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2); display: flex; flex-direction: column; gap: 8px; opacity: 0; visibility: hidden; transform: translateY(-10px) scale(0.95); transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); pointer-events: none; cursor: default; } /* 胶囊悬停时显示卡片 */ .weather-widget-pill:hover .weather-dropdown-card { opacity: 1; visibility: visible; transform: translateY(0) scale(1); pointer-events: auto; } .wd-header { display: flex; justify-content: space-between; align-items: baseline; border-bottom: 1px solid var(--border-color); padding-bottom: 8px; margin-bottom: 5px; } .wd-city { font-size: 14px; font-weight: 700; } .wd-date { font-size: 11px; color: var(--text-secondary); } .wd-temp-row { display: flex; align-items: center; gap: 15px; } .wd-big-temp { font-size: 36px; font-weight: 800; color: var(--text-color); line-height: 1; } .wd-detail { font-size: 12px; color: var(--text-secondary); display: flex; flex-direction: column; gap: 2px; } .wd-hint { font-size: 10px; color: var(--primary-color); margin-top: 5px; text-align: center; opacity: 0.8; } /* ========================================= */ /* --- [重构] 标题栏灵动岛天气组件样式 --- */ /* ========================================= */ .title-bar-right-container { display: flex; align-items: center; gap: 12px; height: 100%; padding-right: 15px; -webkit-app-region: no-drag; } /* 天气胶囊 (Pill) */ .weather-widget-pill { position: relative; height: 30px; /* 稍微加高一点 */ min-width: 90px; /* 增加最小宽度以容纳城市 */ padding: 0 12px; background: rgba(var(--card-background-rgb), 0.5); backdrop-filter: blur(10px); border: 1px solid var(--border-color); border-radius: 99px; display: flex; align-items: center; justify-content: center; gap: 8px; cursor: pointer; transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); color: var(--text-color); z-index: 2001; } .weather-widget-pill:hover { background: rgba(var(--card-background-rgb), 0.9); border-color: rgba(var(--primary-rgb), 0.3); box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); transform: translateY(1px); } /* 胶囊内元素 */ .weather-pill-location { font-size: 12px; font-weight: 500; color: var(--text-secondary); max-width: 60px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .weather-pill-temp { font-size: 13px; font-weight: 700; font-family: 'Consolas', monospace; white-space: nowrap; } /* CSS 天气图标 (保持不变) */ .css-weather-icon { width: 20px; height: 20px; position: relative; flex-shrink: 0; } .css-icon-sun { background: #ffb300; border-radius: 50%; width: 10px; height: 10px; position: absolute; top: 5px; left: 5px; box-shadow: 0 0 0 2px rgba(255, 179, 0, 0.2), 0 0 8px #ffb300; animation: spin-slow 10s linear infinite; } @keyframes spin-slow { 100% { transform: rotate(360deg); } } .css-icon-cloud { background: #fff; width: 14px; height: 7px; border-radius: 10px; position: absolute; top: 7px; left: 3px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .css-icon-cloud::after { content: ''; position: absolute; width: 8px; height: 8px; border-radius: 50%; background: #fff; top: -4px; left: 3px; } .css-icon-rain { background: #90caf9; width: 14px; height: 7px; border-radius: 10px; position: absolute; top: 6px; left: 3px; } .css-icon-rain::before { content: ''; position: absolute; height: 4px; width: 2px; background: #42a5f5; top: 8px; left: 4px; transform: skewX(-20deg); animation: rain-drop 0.8s infinite linear; } @keyframes rain-drop { 0% { opacity: 1; transform: skewX(-20deg) translateY(0); } 100% { opacity: 0; transform: skewX(-20deg) translateY(6px); } } /* --- [优化] 悬浮下拉卡片 --- */ .weather-dropdown-card { position: absolute; top: 40px; /* 距离胶囊底部有一定间隙 */ right: 0; width: 240px; /* 加宽一点显示更多信息 */ background: rgba(var(--card-background-rgb), 0.95); backdrop-filter: blur(25px); border: 1px solid var(--border-color); border-radius: 20px; padding: 18px; box-shadow: 0 20px 50px -10px rgba(0, 0, 0, 0.3); display: flex; flex-direction: column; gap: 12px; opacity: 0; visibility: hidden; transform: translateY(-10px) scale(0.95); transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); pointer-events: none; z-index: 1000; } /* [核心优化] 使用伪元素填补胶囊和卡片之间的空隙,防止鼠标移出时卡片消失 */ .weather-widget-pill::after { content: ''; position: absolute; top: 100%; left: 0; width: 100%; height: 20px; /* 填补 top:40px 与 height:30px 之间的空隙 */ background: transparent; display: none; } .weather-widget-pill:hover::after { display: block; } /* 悬停显示 */ .weather-widget-pill:hover .weather-dropdown-card, .weather-dropdown-card:hover { /* 确保鼠标在卡片上时也不消失 */ opacity: 1; visibility: visible; transform: translateY(0) scale(1); pointer-events: auto; } /* 卡片内部样式 */ .wd-header { display: flex; justify-content: space-between; align-items: baseline; border-bottom: 1px solid var(--border-color); padding-bottom: 8px; } .wd-city { font-size: 15px; font-weight: 700; color: var(--text-color); } .wd-date { font-size: 11px; color: var(--text-secondary); } .wd-temp-row { display: flex; align-items: center; gap: 15px; margin-top: 5px; } .wd-big-temp { font-size: 42px; font-weight: 800; color: var(--primary-color); line-height: 1; } .wd-detail { font-size: 13px; color: var(--text-color); display: flex; flex-direction: column; gap: 4px; font-weight: 500; } .wd-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 5px; } .wd-grid-item { background: rgba(var(--bg-color-rgb), 0.5); padding: 6px 10px; border-radius: 8px; font-size: 11px; color: var(--text-secondary); display: flex; align-items: center; gap: 6px; } .wd-hint { font-size: 11px; color: var(--text-secondary); margin-top: 8px; text-align: center; opacity: 0.8; padding-top: 8px; border-top: 1px dashed var(--border-color); display: flex; align-items: center; justify-content: center; gap: 5px; transition: color 0.2s; } .weather-widget-pill:hover .wd-hint { color: var(--primary-color); } /* ========================================= */ /* --- [优化] 天气胶囊主题适配 (Theme Adaption) --- */ /* ========================================= */ /* 1. 天气胶囊基础样式 (通用) */ .weather-widget-pill { position: relative; height: 30px; min-width: 90px; padding: 0 12px; /* 默认磨砂效果 */ backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border-radius: 99px; display: flex; align-items: center; justify-content: center; gap: 8px; cursor: pointer; transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); z-index: 2001; } /* --- 2. 深色模式适配 (Dark Mode) --- */ body[data-theme="dark"] .weather-widget-pill { /* 深色背景,带一点透明度 */ background: rgba(40, 40, 40, 0.5); /* 边框微亮,形成高光 */ border: 1px solid rgba(255, 255, 255, 0.12); /* 字体颜色 */ color: #f5f5f7; /* 阴影:深邃 */ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); } body[data-theme="dark"] .weather-widget-pill:hover { background: rgba(60, 60, 60, 0.8); border-color: rgba(var(--primary-rgb), 0.5); box-shadow: 0 4px 15px rgba(0, 0, 0, 0.4); } /* --- 3. 浅色模式适配 (Light Mode) --- */ body[data-theme="light"] .weather-widget-pill { /* 浅色背景,高亮 */ background: rgba(255, 255, 255, 0.65); /* 边框加深,防止与浅色标题栏混为一体 */ border: 1px solid rgba(0, 0, 0, 0.08); /* 字体颜色:深灰 */ color: #333333; /* 阴影:柔和但清晰 */ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); } body[data-theme="light"] .weather-widget-pill:hover { background: #ffffff; border-color: rgba(var(--primary-rgb), 0.4); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1), 0 0 0 1px rgba(var(--primary-rgb), 0.1); } /* --- 4. 内部文字颜色微调 --- */ .weather-pill-location { font-size: 12px; font-weight: 500; max-width: 60px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; /* 自动跟随父元素颜色,但降低不透明度 */ opacity: 0.8; } .weather-pill-temp { font-size: 13px; font-weight: 700; font-family: 'Consolas', monospace; white-space: nowrap; /* 温度始终保持高亮/深色 */ opacity: 1; } /* --- 5. 下拉卡片主题适配 --- */ .weather-dropdown-card { /* 基础定位和动效保持不变... */ position: absolute; top: 40px; right: 0; width: 240px; border-radius: 20px; padding: 18px; display: flex; flex-direction: column; gap: 12px; opacity: 0; visibility: hidden; transform: translateY(-10px) scale(0.95); transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); pointer-events: none; z-index: 1000; } /* 深色模式下拉卡片 */ body[data-theme="dark"] .weather-dropdown-card { background: rgba(30, 30, 32, 0.95); backdrop-filter: blur(25px); border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 20px 50px rgba(0, 0, 0, 0.5); color: #fff; } /* 浅色模式下拉卡片 */ body[data-theme="light"] .weather-dropdown-card { background: rgba(255, 255, 255, 0.95); backdrop-filter: blur(25px); border: 1px solid rgba(0, 0, 0, 0.08); box-shadow: 0 20px 50px rgba(0, 0, 0, 0.15); color: #333; } /* 内部网格项适配 */ body[data-theme="light"] .wd-grid-item { background: #f5f5f7; /* 浅灰底 */ color: #555; } body[data-theme="dark"] .wd-grid-item { background: rgba(255, 255, 255, 0.1); color: #ccc; } /* 文字颜色适配 */ body[data-theme="light"] .wd-big-temp { color: var(--primary-color); } body[data-theme="dark"] .wd-big-temp { color: #fff; } /* 深色模式下大温度白色更醒目 */ /* [新增] 天气温度单位优化 */ .weather-unit-small { font-size: 0.5em; /* 字号减半 */ vertical-align: top; /* 顶部对齐 */ margin-left: 2px; font-weight: 600; opacity: 0.8; } /* 修正下拉卡片中大温度的对齐 */ .wd-big-temp { font-size: 42px; font-weight: 800; color: var(--text-color); line-height: 1; display: flex; /* 使用 Flex 布局对齐单位 */ align-items: flex-start; } /* 适配深色/浅色模式的单位颜色 */ body[data-theme="light"] .weather-unit-small { color: var(--text-secondary); } body[data-theme="dark"] .weather-unit-small { color: rgba(255, 255, 255, 0.7); } /* ========================================= */ /* --- [优化] 天气胶囊主题适配 (Theme Adaption) --- */ /* ========================================= */ /* 1. 天气胶囊基础样式 */ .weather-widget-pill { position: relative; height: 30px; min-width: 90px; padding: 0 12px; backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border-radius: 99px; display: flex; align-items: center; justify-content: center; gap: 8px; cursor: pointer; transition: all 0.3s ease; z-index: 2001; /* 默认字体粗细 */ font-weight: 500; } /* --- 深色模式 (Dark Mode) --- */ body[data-theme="dark"] .weather-widget-pill { /* 半透明白底,营造毛玻璃感 */ background: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.15); color: #f5f5f7; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); } body[data-theme="dark"] .weather-widget-pill:hover { background: rgba(255, 255, 255, 0.15); border-color: rgba(255, 255, 255, 0.3); } /* --- 浅色模式 (Light Mode) --- */ body[data-theme="light"] .weather-widget-pill { /* 浅灰底,避免纯白撞色 */ background: rgba(0, 0, 0, 0.06); border: 1px solid rgba(0, 0, 0, 0.08); color: #333; /* 深色文字 */ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05); } body[data-theme="light"] .weather-widget-pill:hover { background: rgba(0, 0, 0, 0.1); border-color: rgba(0, 0, 0, 0.15); } /* --- 图标自适应优化 --- */ /* ☁️ 云 (Light Mode 增强可见性) */ body[data-theme="light"] .css-icon-cloud { background: #fff; /* 在浅色背景下,给云朵加深阴影 */ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); } body[data-theme="light"] .css-icon-cloud::after { background: #fff; } /* ☁️ 云 (Dark Mode) */ body[data-theme="dark"] .css-icon-cloud { background: #e0e0e0; box-shadow: 0 0 5px rgba(255, 255, 255, 0.2); } body[data-theme="dark"] .css-icon-cloud::after { background: #e0e0e0; } /* ☀️ 晴 (Light Mode) */ body[data-theme="light"] .css-icon-sun { background: #f5a623; box-shadow: 0 0 0 2px rgba(245, 166, 35, 0.3); } /* --- 内部文字微调 --- */ .weather-pill-temp { font-family: 'Segoe UI', sans-serif; /* 此时用非等宽字体可能更好看 */ font-weight: 700; } .weather-unit-small { font-size: 0.6em; font-weight: 600; opacity: 0.7; margin-left: 1px; vertical-align: top; position: relative; top: 2px; } /* ========================================= */ /* --- [新增] 免责声明灵动岛 (Disclaimer) --- */ /* ========================================= */ .disclaimer-modal-content { background: rgba(var(--card-background-rgb), 0.95); backdrop-filter: blur(40px) saturate(180%); border: 1px solid rgba(var(--primary-rgb), 0.3); /* 强调边框 */ border-radius: 32px; width: 90%; max-width: 550px; box-shadow: 0 30px 80px rgba(0, 0, 0, 0.5), inset 0 0 0 1px rgba(255, 255, 255, 0.1); transform: scale(0.9) translateY(30px); opacity: 0; transition: all 0.5s cubic-bezier(0.19, 1, 0.22, 1); /* 极其丝滑的贝塞尔 */ overflow: hidden; display: flex; flex-direction: column; max-height: 80vh; } .modal-overlay.active .disclaimer-modal-content { transform: scale(1) translateY(0); opacity: 1; } .disclaimer-header { padding: 30px 30px 10px 30px; text-align: center; } .disclaimer-icon { width: 60px; height: 60px; border-radius: 50%; background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); display: flex; align-items: center; justify-content: center; margin: 0 auto 20px auto; font-size: 28px; color: white; box-shadow: 0 10px 20px rgba(var(--primary-rgb), 0.3); } .disclaimer-title { font-size: 22px; font-weight: 800; margin-bottom: 5px; } .disclaimer-subtitle { font-size: 13px; color: var(--text-secondary); opacity: 0.8; } .disclaimer-body { padding: 10px 30px; overflow-y: auto; font-size: 14px; line-height: 1.8; color: var(--text-color); text-align: justify; border-top: 1px solid rgba(128, 128, 128, 0.1); border-bottom: 1px solid rgba(128, 128, 128, 0.1); background: rgba(var(--bg-color-rgb), 0.3); margin: 20px 0; } .disclaimer-body p { margin-bottom: 15px; } .disclaimer-body strong { color: var(--primary-color); } .disclaimer-footer { padding: 0 30px 30px 30px; display: flex; gap: 15px; } .disclaimer-btn { flex: 1; padding: 14px; border-radius: 16px; border: none; font-size: 15px; font-weight: 600; cursor: pointer; transition: all 0.2s; } .btn-quit { background: rgba(var(--text-color), 0.05); color: var(--text-secondary); } .btn-quit:hover { background: rgba(var(--error-color-rgb), 0.1); color: var(--error-color); } .btn-agree { background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); color: white; box-shadow: 0 5px 15px rgba(var(--primary-rgb), 0.3); } .btn-agree:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(var(--primary-rgb), 0.4); } /* ======================================================= */ /* --- [Fix] 子窗口圆角裁切物理修复 (追加到文件末尾) --- */ /* ======================================================= */ /* 1. 强制玻璃框架进行物理级裁切 */ .app-glass-frame { /* 确保圆角数值与您的设计一致 (根据图片目测约为 12px - 16px) */ border-radius: 12px !important; /* [核心修复] 强制隐藏溢出的内部直角内容 */ overflow: hidden !important; /* [关键] 修复 Chromium 内核下 backdrop-filter 导致 overflow:hidden 失效的 Bug */ /* 这行代码会强制浏览器应用 alpha 遮罩,从而完美裁切圆角 */ -webkit-mask-image: -webkit-radial-gradient(white, black); /* 开启 GPU 加速,防止渲染闪烁 */ transform: translateZ(0); } /* 2. 修复聚焦状态下的边框显示 */ .app-glass-frame.focused { /* 由于使用了 mask-image,外部扩散的 box-shadow 可能会被切掉 */ /* 因此改为使用内描边 (border) 或 内阴影 (inset box-shadow) 来显示蓝色高亮 */ /* 方法 A: 实体边框 (推荐,清晰锐利) */ border: 2px solid var(--primary-color) !important; /* 方法 B: 如果您坚持要发光效果,请使用 filter: drop-shadow 替代 box-shadow */ /* 注意:drop-shadow 性能开销稍大 */ box-shadow: none !important; filter: drop-shadow(0 0 8px rgba(var(--primary-rgb), 0.6)); } /* 3. 确保内容区域背景透明,防止二次叠加导致黑边 */ .tool-window-body .content-area, .tool-window-body .settings-section, .tool-window-body #tool-content-area { background-color: transparent !important; border-radius: 0 0 12px 12px; /* 底部圆角匹配 */ } /* ========================================= */ /* --- 三国杀工具专属样式 (追加) --- */ /* ========================================= */ .mini-input { background: rgba(0, 0, 0, 0.2); border: 1px solid var(--border-color); color: var(--text-color); padding: 5px 8px; border-radius: 6px; font-size: 13px; width: 100%; } .mini-input:focus { border-color: var(--primary-color); outline: none; } .mini-stat-box { background: rgba(var(--bg-color-rgb), 0.5); border-radius: 8px; padding: 10px; text-align: center; border: 1px solid transparent; } .mini-stat-box.success { border-color: rgba(var(--success-color-rgb), 0.3); background: rgba(var(--success-color-rgb), 0.05); } .mini-stat-box.info { border-color: rgba(var(--info-color-rgb), 0.3); background: rgba(var(--info-color-rgb), 0.05); } .mini-stat-box.warning { border-color: rgba(var(--accent-color-rgb), 0.3); background: rgba(var(--accent-color-rgb), 0.05); } .mini-stat-box.error { border-color: rgba(var(--error-color-rgb), 0.3); background: rgba(var(--error-color-rgb), 0.05); } .mini-stat-box .label { font-size: 11px; opacity: 0.7; margin-bottom: 2px; } .mini-stat-box .val { font-size: 16px; font-weight: bold; } .console-output::-webkit-scrollbar { width: 6px; } .console-output::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.2); border-radius: 3px; } .log-line { margin-bottom: 2px; line-height: 1.4; } .log-line.system { color: #50fa7b; } .log-line.info { color: #8be9fd; } .log-line.success { color: #50fa7b; } .log-line.warning { color: #f1fa8c; } .log-line.error { color: #ff5555; } /* src/css/style.css */ /* 在原有样式基础上新增 */ .category-btn { /* 保持原有的按钮样式,增加 Flex 布局以对齐图标和文字 */ display: flex; align-items: center; gap: 10px; /* 图标和文字的间距 */ font-size: 14px; } .category-btn .emoji-icon { font-size: 16px; /* Emoji 稍微大一点 */ line-height: 1; width: 20px; /* 固定宽度确保对齐 */ text-align: center; } /* 选中状态的左侧指示条颜色调整,可以配合 emoji 颜色 */ .category-btn.active { background: rgba(var(--primary-rgb), 0.1); color: var(--primary-color); font-weight: 500; } /* 灵动岛风格通用容器 - 补充到 style.css */ .tool-island-container { padding: 20px; height: 100%; display: flex; flex-direction: column; gap: 20px; overflow-y: auto; } .tool-island-card { background: rgba(var(--card-background-rgb), 0.6); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid rgba(128, 128, 128, 0.1); border-radius: 20px; padding: 20px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.05); transition: transform 0.2s, box-shadow 0.2s; } .tool-island-card:hover { box-shadow: 0 12px 40px rgba(0, 0, 0, 0.08); } .tool-group-title { font-size: 14px; font-weight: 600; color: var(--text-secondary); margin-bottom: 12px; display: flex; align-items: center; gap: 8px; } /* --- 灵动岛流体滚动容器 --- */ .island-scroll-wrapper { position: relative; width: 100%; overflow: hidden; /* 隐藏容器本身的溢出,由内部处理 */ /* 左右两边的遮罩层,默认透明 */ --mask-bg: linear-gradient(90deg, rgba(var(--card-background-rgb), 1) 0%, rgba(var(--card-background-rgb), 0) 100%); } /* 隐藏滚动条但保留功能 */ .island-scroll-content { display: flex; gap: 10px; overflow-x: auto; padding: 5px; /* 给阴影留点空间 */ scrollbar-width: none; /* Firefox */ cursor: grab; /* 提示可拖拽 */ scroll-behavior: smooth; /* 平滑滚动 */ user-select: none; /* 防止拖拽时选中文字 */ } .island-scroll-content::-webkit-scrollbar { display: none; /* Chrome/Safari */ } .island-scroll-content:active { cursor: grabbing; /* 抓取时的手势 */ scroll-behavior: auto; /* 拖拽时取消平滑,保证跟手 */ } /* 左侧阴影遮罩 */ .island-scroll-wrapper::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 40px; background: linear-gradient(to right, rgba(var(--bg-color-rgb), 1), transparent); z-index: 2; opacity: 0; transition: opacity 0.3s ease; pointer-events: none; } /* 右侧阴影遮罩 */ .island-scroll-wrapper::after { content: ''; position: absolute; right: 0; top: 0; bottom: 0; width: 40px; background: linear-gradient(to left, rgba(var(--bg-color-rgb), 1), transparent); z-index: 2; opacity: 0; transition: opacity 0.3s ease; pointer-events: none; } /* JS控制的激活类 */ .island-scroll-wrapper.can-scroll-left::before { opacity: 1; } .island-scroll-wrapper.can-scroll-right::after { opacity: 1; } /* --- 工具箱灵动分类导航 (2025 Design) --- */ .toolbox-nav-island { position: relative; margin: 0 auto 25px auto; width: 100%; max-width: 800px; /* 限制最大宽度,保持精致感 */ height: 60px; border-radius: 30px; background: rgba(var(--card-background-rgb), 0.4); /* 极淡的背景 */ backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.08); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.05); display: flex; align-items: center; overflow: hidden; /* 裁剪溢出 */ transition: all 0.3s ease; } /* 内部滚动容器 */ .toolbox-nav-scroll { display: flex; align-items: center; gap: 8px; padding: 0 20px; /* 两侧留白 */ width: 100%; height: 100%; overflow-x: auto; scrollbar-width: none; /* Firefox 隐藏滚动条 */ cursor: grab; /* 提示可拖拽 */ scroll-behavior: smooth; user-select: none; } .toolbox-nav-scroll::-webkit-scrollbar { display: none; /* Chrome 隐藏滚动条 */ } .toolbox-nav-scroll:active { cursor: grabbing; scroll-behavior: auto; /* 拖拽时由 JS 接管物理效果 */ } /* 分类胶囊按钮 */ .category-pill { flex-shrink: 0; /* 防止被挤压 */ padding: 8px 18px; border-radius: 20px; font-size: 14px; font-weight: 500; color: var(--text-secondary); background: transparent; border: 1px solid transparent; cursor: pointer; transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94); display: flex; align-items: center; gap: 6px; } .category-pill i { font-size: 13px; opacity: 0.8; } .category-pill:hover:not(.active) { background: rgba(var(--text-color), 0.06); color: var(--text-color); transform: scale(1.02); transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } /* 激活状态:苹果灵动岛风格胶囊 - 2025设计 */ .category-pill.active { background: rgba(var(--primary-rgb), 0.12); color: var(--primary-color); box-shadow: 0 2px 8px rgba(var(--primary-rgb), 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.1); border: 0.5px solid rgba(var(--primary-rgb), 0.2); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); transform: scale(1); position: relative; font-weight: 600; transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); } .category-pill.active::after { content: ''; position: absolute; inset: -2px; border-radius: inherit; padding: 2px; background: linear-gradient(135deg, rgba(var(--primary-rgb), 0.3) 0%, rgba(var(--primary-rgb), 0.1) 100%); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); mask-composite: exclude; opacity: 0; transition: opacity 0.3s ease; pointer-events: none; } .category-pill.active:hover::after { opacity: 1; } .category-pill.active i { opacity: 1; color: var(--primary-color); } @keyframes islandPulse { 0%, 100% { box-shadow: 0 8px 24px rgba(var(--primary-rgb), 0.4), 0 0 0 1px rgba(255, 255, 255, 0.1) inset, 0 0 40px rgba(var(--primary-rgb), 0.3); } 50% { box-shadow: 0 8px 32px rgba(var(--primary-rgb), 0.5), 0 0 0 1px rgba(255, 255, 255, 0.15) inset, 0 0 50px rgba(var(--primary-rgb), 0.4); } } @keyframes islandShine { 0% { transform: translate(-50%, -50%) rotate(0deg); opacity: 0; } 50% { opacity: 0.3; } 100% { transform: translate(-50%, -50%) rotate(360deg); opacity: 0; } } /* --- 动态遮罩层 (光隐效果) --- */ /* 左侧遮罩 */ .toolbox-nav-island::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 60px; background: linear-gradient(to right, rgba(var(--bg-color-rgb), 1), transparent); z-index: 10; pointer-events: none; opacity: 0; transition: opacity 0.3s ease; border-top-left-radius: 30px; border-bottom-left-radius: 30px; } /* 右侧遮罩 */ .toolbox-nav-island::after { content: ''; position: absolute; right: 0; top: 0; bottom: 0; width: 60px; background: linear-gradient(to left, rgba(var(--bg-color-rgb), 1), transparent); z-index: 10; pointer-events: none; opacity: 0; transition: opacity 0.3s ease; border-top-right-radius: 30px; border-bottom-right-radius: 30px; } /* JS 控制遮罩显示 */ .toolbox-nav-island.mask-left::before { opacity: 1; } .toolbox-nav-island.mask-right::after { opacity: 1; } /* --- 工具箱分类侧边栏优化 (灵动岛风格) --- */ /* 1. 滚动容器设置 */ #toolbox-categories-list { /* 隐藏原生滚动条 */ scrollbar-width: none; /* Firefox */ -ms-overflow-style: none; /* IE 10+ */ overflow-y: auto; overflow-x: hidden; /* 启用平滑滚动,但在拖拽时会通过JS移除此属性以保证跟手性 */ scroll-behavior: smooth; /* 鼠标手势:抓取 */ cursor: grab; /* 增加底部内边距,防止最后一个被遮挡 */ padding-bottom: 20px; padding-top: 10px; /* [核心] 灵动岛视觉指引:使用遮罩实现边缘淡出,提示还有更多内容 */ /* 顶部和底部各 20px 的淡出区域 */ -webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 20px, black calc(100% - 20px), transparent 100%); mask-image: linear-gradient(to bottom, transparent 0%, black 20px, black calc(100% - 20px), transparent 100%); } #toolbox-categories-list::-webkit-scrollbar { display: none; /* Chrome/Safari 隐藏滚动条 */ } /* 拖拽时的状态 */ #toolbox-categories-list.is-dragging { cursor: grabbing; scroll-behavior: auto !important; /* 拖拽时禁用平滑滚动,确保绝对跟手 */ user-select: none; /* 防止拖拽时选中文字 */ } #toolbox-categories-list.is-dragging .island-nav-item { pointer-events: none; /* 拖拽时禁止触发点击事件 */ transform: scale(0.98); /* 拖拽时整体微缩,产生物理按压感 */ } /* 2. 分类按钮样式微调 */ .island-nav-item { transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); /* 增加一点默认的悬浮感 */ border: 1px solid transparent; margin-bottom: 8px; /* 增加间距 */ } /* 悬停效果 */ .island-nav-item:hover { background: rgba(var(--primary-rgb), 0.1); transform: translateX(5px); /* 向右微动,灵动感 */ } /* 激活状态:灵动岛高亮 */ .island-nav-item.active { background: linear-gradient(135deg, rgba(var(--primary-rgb), 0.25) 0%, rgba(var(--primary-rgb), 0.15) 100%); border: 1px solid rgba(var(--primary-rgb), 0.4); box-shadow: 0 8px 24px rgba(var(--primary-rgb), 0.3), 0 0 0 1px rgba(255, 255, 255, 0.1) inset, 0 4px 12px rgba(var(--primary-rgb), 0.2); font-weight: 700; backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); position: relative; overflow: hidden; transform: translateX(8px) scale(1.02); animation: islandNavPulse 2.5s ease-in-out infinite; } .island-nav-item.active::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.2) 50%, transparent 100%); animation: islandNavShine 2s ease-in-out infinite; pointer-events: none; } .island-nav-item.active .nav-text { color: var(--primary-color); text-shadow: 0 0 8px rgba(var(--primary-rgb), 0.3); position: relative; z-index: 2; } .island-nav-item.active .nav-indicator { height: 60%; background: linear-gradient(180deg, var(--primary-color) 0%, rgba(var(--primary-rgb), 0.8) 100%); box-shadow: 0 0 12px var(--primary-color), 0 0 20px rgba(var(--primary-rgb), 0.5); animation: islandIndicatorPulse 1.5s ease-in-out infinite; } /* --- 工具箱分类侧边栏优化 (灵动岛风格 V2) --- */ /* 1. 容器与滚动设置 */ .toolbox-sidebar-island { position: relative; /* 为绝对定位的指引元素提供锚点 */ display: flex; flex-direction: column; overflow: hidden; /* 防止溢出 */ } #toolbox-categories-list { /* 隐藏原生滚动条 */ scrollbar-width: none; -ms-overflow-style: none; overflow-y: auto; overflow-x: hidden; /* 关键:增加底部空间,防止最后一个元素贴底 */ padding-bottom: 40px; padding-top: 10px; /* 启用平滑滚动 (JS会在拖拽时临时禁用) */ scroll-behavior: smooth; cursor: grab; /* 确保内容层级 */ position: relative; z-index: 1; flex: 1; } #toolbox-categories-list::-webkit-scrollbar { display: none; } /* 拖拽时的光标状态 */ #toolbox-categories-list.is-dragging { cursor: grabbing; scroll-behavior: auto !important; user-select: none; } #toolbox-categories-list.is-dragging .island-nav-item { pointer-events: none; /* 拖拽过程中暂时屏蔽子元素事件,防止误触高亮 */ transform: scale(0.98); } /* 2. 按钮样式微调 */ .island-nav-item { transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); margin-bottom: 8px; position: relative; z-index: 2; /* 修复点击区域 */ cursor: pointer; } /* 悬停效果 */ .island-nav-item:hover { background: rgba(var(--primary-rgb), 0.1); transform: translateX(5px); } /* 激活状态:苹果灵动岛风格 - 2025设计 */ .island-nav-item.active { background: rgba(var(--primary-rgb), 0.1); border: 0.5px solid rgba(var(--primary-rgb), 0.2); box-shadow: 0 1px 3px rgba(var(--primary-rgb), 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.05); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); position: relative; overflow: visible; transform: translateX(4px); font-weight: 600; transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); } .island-nav-item.active::before { content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 3px; height: 60%; background: var(--primary-color); border-radius: 0 2px 2px 0; opacity: 0.8; transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } .island-nav-item.active .nav-text { color: var(--primary-color); position: relative; z-index: 2; transition: color 0.3s ease; } .island-nav-item.active .nav-indicator { display: none; /* 使用左侧指示条替代 */ } /* 3. [新] 滚动提示指引 (Scroll Hints) */ /* 顶部阴影遮罩 */ .scroll-hint-top { position: absolute; top: 50px; /* 避开 sidebar-header */ left: 0; right: 0; height: 40px; background: linear-gradient(to bottom, rgba(var(--bg-color-rgb), 1) 0%, rgba(var(--bg-color-rgb), 0) 100%); z-index: 10; pointer-events: none; opacity: 0; transition: opacity 0.3s ease; } /* 底部阴影遮罩 + 灵动箭头 */ .scroll-hint-bottom { position: absolute; bottom: 0; left: 0; right: 0; height: 60px; background: linear-gradient(to top, rgba(var(--bg-color-rgb), 1) 0%, rgba(var(--bg-color-rgb), 0) 100%); z-index: 10; pointer-events: none; opacity: 0; transition: opacity 0.3s ease; display: flex; align-items: flex-end; justify-content: center; padding-bottom: 10px; } /* 灵动箭头动画 */ .scroll-indicator-arrow { font-size: 12px; color: var(--text-secondary); animation: floatArrow 1.5s infinite ease-in-out; background: rgba(var(--card-background-rgb), 0.8); padding: 4px 10px; border-radius: 10px; backdrop-filter: blur(4px); box-shadow: 0 2px 8px rgba(0,0,0,0.1); } @keyframes floatArrow { 0%, 100% { transform: translateY(0); opacity: 0.6; } 50% { transform: translateY(5px); opacity: 1; } } /* 激活显示类 */ .hint-visible { opacity: 1 !important; } /* --- 工具箱分类侧边栏优化 (灵动岛风格 V3 - 修复交互版) --- */ /* 1. 侧边栏容器:作为定位基准 */ .toolbox-sidebar-island { position: relative; display: flex; flex-direction: column; overflow: hidden; height: 100%; /* 确保填满高度 */ } /* 2. 滚动列表容器 */ #toolbox-categories-list { /* 隐藏原生滚动条 */ scrollbar-width: none; -ms-overflow-style: none; overflow-y: auto; overflow-x: hidden; /* 布局与内边距 */ flex: 1; padding-top: 10px; padding-bottom: 40px; /* 底部留白,防止最后元素贴边 */ padding-left: 2px; /* 防止阴影被切 */ padding-right: 2px; /* 交互设置 */ scroll-behavior: smooth; cursor: grab; /* 默认手型:抓取 */ position: relative; z-index: 1; /* 层级:在背景之上,遮罩之下 */ } #toolbox-categories-list::-webkit-scrollbar { display: none; } /* 拖拽中的状态 (由 JS 动态添加) */ #toolbox-categories-list.is-dragging { cursor: grabbing; /* 抓紧手型 */ scroll-behavior: auto !important; /* 禁用平滑滚动,实现物理跟手 */ user-select: none; /* 禁止选中文本 */ } /* 关键修复:只有在真正拖拽时才禁用子元素事件,防止误触 */ #toolbox-categories-list.is-dragging .island-nav-item { pointer-events: none; transform: scale(0.98); /* 拖拽时整体微缩,增加物理质感 */ } /* 3. 分类按钮样式 */ .island-nav-item { transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); margin-bottom: 8px; position: relative; z-index: 2; cursor: pointer; /* 防止文字被选中 */ user-select: none; -webkit-user-select: none; } /* 悬停微动 */ .island-nav-item:hover:not(.active) { background: rgba(var(--text-color), 0.04); transform: translateX(2px); transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } /* 激活状态:苹果灵动岛风格 - 2025设计 */ .island-nav-item.active { background: rgba(var(--primary-rgb), 0.1); border: 0.5px solid rgba(var(--primary-rgb), 0.2); box-shadow: 0 1px 3px rgba(var(--primary-rgb), 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.05); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); position: relative; overflow: visible; transform: translateX(4px); font-weight: 600; transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); } .island-nav-item.active::before { content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 3px; height: 60%; background: var(--primary-color); border-radius: 0 2px 2px 0; opacity: 0.8; transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } .island-nav-item.active .nav-text { color: var(--primary-color); position: relative; z-index: 2; transition: color 0.3s ease; } .island-nav-item.active .nav-indicator { display: none; /* 使用左侧指示条替代 */ } /* 4. 灵动岛滚动指引 (Shadow Hints) */ /* 顶部遮罩:线性渐变阴影 */ .scroll-hint-top { position: absolute; top: 50px; /* 避开标题栏高度 */ left: 0; right: 0; height: 30px; background: linear-gradient(to bottom, rgba(var(--bg-color-rgb), 1) 0%, rgba(var(--bg-color-rgb), 0) 100%); z-index: 10; opacity: 0; pointer-events: none; /* 穿透点击 */ transition: opacity 0.3s ease; } /* 底部遮罩 + 动态箭头 */ .scroll-hint-bottom { position: absolute; bottom: 0; left: 0; right: 0; height: 60px; background: linear-gradient(to top, rgba(var(--bg-color-rgb), 1) 0%, rgba(var(--bg-color-rgb), 0) 100%); z-index: 10; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; /* 内部布局 */ display: flex; align-items: flex-end; justify-content: center; padding-bottom: 15px; } /* 激活显示类 */ .hint-visible { opacity: 1 !important; } /* 灵动箭头胶囊 */ .scroll-indicator-arrow { font-size: 10px; color: var(--text-secondary); background: rgba(var(--card-background-rgb), 0.8); backdrop-filter: blur(10px); padding: 4px 12px; border-radius: 20px; box-shadow: 0 4px 10px rgba(0,0,0,0.1); border: 1px solid rgba(255,255,255,0.1); animation: floatArrow 2s infinite ease-in-out; } @keyframes floatArrow { 0%, 100% { transform: translateY(0); opacity: 0.7; } 50% { transform: translateY(4px); opacity: 1; } } /* --- 更新管理 - 多线路 UI --- */ .update-mirrors-container { background: rgba(var(--bg-color-rgb), 0.5); border-radius: 12px; padding: 15px; margin-top: 15px; border: 1px solid var(--border-color); } .mirrors-list { display: flex; flex-direction: column; gap: 10px; } .mirror-btn { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 12px 15px; border: none; border-radius: 10px; background: rgba(var(--card-background-rgb), 0.8); color: var(--text-color); cursor: pointer; transition: all 0.2s ease; border: 1px solid transparent; } .mirror-btn:hover { background: var(--primary-color); color: #fff; transform: translateX(5px); /* 灵动微动 */ box-shadow: 0 4px 12px rgba(var(--primary-rgb), 0.3); } .mirror-btn:hover .mirror-tag { background: rgba(255,255,255,0.2); color: #fff; } .mirror-info { display: flex; align-items: center; gap: 10px; font-weight: 500; } .mirror-tag { font-size: 10px; padding: 2px 8px; border-radius: 4px; font-weight: bold; } .mirror-tag.direct { background: rgba(var(--success-rgb), 0.1); color: var(--success-color); } .mirror-tag.web { background: rgba(var(--accent-rgb), 0.1); color: var(--accent-color); } /* 进度条区域调整 */ #download-progress-area { background: rgba(var(--bg-color-rgb), 0.5); padding: 15px; border-radius: 12px; animation: fadeIn 0.3s ease; } /* ========================================= */ /* --- 苹果灵动岛风格选中效果 - 2025设计 --- */ /* ========================================= */ /* 兼容性:为不支持 backdrop-filter 的浏览器提供降级方案 */ @supports not (backdrop-filter: blur(20px)) { .category-pill.active, .island-nav-item.active, .settings-nav-item.active { background: rgba(var(--primary-rgb), 0.15); } } /* 兼容性:为不支持 CSS 变量的浏览器提供降级方案 */ @supports not (--css: variables) { .category-pill.active { background: rgba(0, 122, 255, 0.12); color: #007aff; } .island-nav-item.active, .settings-nav-item.active { background: rgba(0, 122, 255, 0.1); color: #007aff; } .island-nav-item.active::before, .settings-nav-item.active::before { background: #007aff; } } /* 第三方UI库兼容性:确保样式不被覆盖 */ .category-pill.active, .island-nav-item.active, .settings-nav-item.active { /* 提高优先级,防止第三方库覆盖 */ background: rgba(var(--primary-rgb), 0.1) !important; border: 0.5px solid rgba(var(--primary-rgb), 0.2) !important; backdrop-filter: blur(20px) saturate(180%) !important; -webkit-backdrop-filter: blur(20px) saturate(180%) !important; } /* 优化:减少重绘和回流 */ .category-pill, .island-nav-item, .settings-nav-item { will-change: transform, background-color, border-color; transform: translateZ(0); /* 启用硬件加速 */ -webkit-transform: translateZ(0); } /* 优化:平滑的过渡动画 */ .category-pill, .island-nav-item, .settings-nav-item { transition: background-color 0.3s var(--ease-smooth), border-color 0.3s var(--ease-smooth), transform 0.4s var(--ease-spring), box-shadow 0.3s var(--ease-smooth); } /* ========================================= */ /* --- 翻译进度遮罩层样式 --- */ /* ========================================= */ .translation-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.7); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); z-index: 10000; display: none; align-items: center; justify-content: center; opacity: 0; transition: opacity 0.3s ease; } .translation-overlay.active { opacity: 1; } .translation-overlay-content { background: rgba(var(--card-background-rgb), 0.95); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); border-radius: 24px; padding: 40px; max-width: 500px; width: 90%; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); border: 1px solid rgba(255, 255, 255, 0.1); text-align: center; animation: translationOverlaySlideIn 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); } @keyframes translationOverlaySlideIn { from { opacity: 0; transform: translateY(-20px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } } .translation-overlay-icon { font-size: 48px; color: var(--primary-color); margin-bottom: 20px; animation: translationIconSpin 2s linear infinite; } @keyframes translationIconSpin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .translation-overlay-content h3 { font-size: 20px; font-weight: 600; margin-bottom: 20px; color: var(--text-color); } .translation-progress-container { margin: 20px 0; } .translation-progress-track { width: 100%; height: 8px; background: rgba(var(--text-color), 0.1); border-radius: 4px; overflow: hidden; margin-bottom: 10px; } .translation-progress-bar { height: 100%; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); border-radius: 4px; width: 0%; transition: width 0.3s ease; box-shadow: 0 0 10px rgba(var(--primary-rgb), 0.5); } .translation-progress-text { font-size: 14px; font-weight: 600; color: var(--primary-color); font-family: monospace; } .translation-current-key { font-size: 12px; color: var(--text-secondary); margin: 10px 0; min-height: 18px; } .translation-hint { font-size: 12px; color: var(--text-secondary); margin-top: 15px; opacity: 0.7; } /* ========================================= */ /* --- 主题切换月亮/太阳动画(最新版) --- */ /* ========================================= */ .theme-celestial-animation { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; pointer-events: none; z-index: 10000; overflow: hidden; opacity: 0; transition: opacity 0.3s ease; } .theme-celestial-animation.active { opacity: 1; } .theme-celestial-animation.fade-out { opacity: 0; transition: opacity 0.6s ease; } .theme-celestial-icon { position: absolute; /* [修复] 始终固定在屏幕正中间 */ top: 50%; left: 50%; transform: translate(-50%, -50%); width: 120px; height: 120px; display: flex; align-items: center; justify-content: center; will-change: transform, opacity; z-index: 1; } .theme-celestial-icon svg { position: relative; z-index: 2; } /* 月亮图标样式 */ .theme-moon { color: #E8E8E8; } .theme-moon svg { filter: drop-shadow(0 0 20px rgba(232, 232, 232, 0.5)); animation: moonGlow 1.2s ease-out 0.6s forwards; } /* 太阳图标样式 */ .theme-sun { color: #FFD700; } .theme-sun svg { filter: drop-shadow(0 0 20px rgba(255, 215, 0, 0.5)); animation: sunGlow 1.2s ease-out 0.6s forwards; } /* 发光效果(固定在屏幕中心) */ .theme-celestial-glow { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); border-radius: 50%; pointer-events: none; opacity: 0; z-index: 0; } .theme-moon-glow { width: 200px; height: 200px; background: radial-gradient(circle, rgba(232, 232, 232, 0.4) 0%, rgba(232, 232, 232, 0.2) 40%, transparent 70%); animation: moonGlowExpand 1.2s ease-out 0.6s forwards; box-shadow: 0 0 60px rgba(232, 232, 232, 0.6), 0 0 120px rgba(232, 232, 232, 0.4), 0 0 180px rgba(232, 232, 232, 0.2); } .theme-sun-glow { width: 250px; height: 250px; background: radial-gradient(circle, rgba(255, 215, 0, 0.5) 0%, rgba(255, 215, 0, 0.3) 40%, transparent 70%); animation: sunGlowExpand 1.2s ease-out 0.6s forwards; box-shadow: 0 0 80px rgba(255, 215, 0, 0.8), 0 0 150px rgba(255, 215, 0, 0.6), 0 0 220px rgba(255, 215, 0, 0.4); } /* 月亮滑入动画(从右侧进入) */ .theme-celestial-animation[data-theme="dark"] .theme-celestial-icon { animation: moonSlideIn 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; } /* 太阳滑入动画(从左侧进入) */ .theme-celestial-animation[data-theme="light"] .theme-celestial-icon { animation: sunSlideIn 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; } /* 月亮滑入关键帧(从右侧进入屏幕正中间) */ @keyframes moonSlideIn { 0% { transform: translate(calc(-50% + 300px), -50%) scale(0.3) rotate(-180deg); opacity: 0; } 50% { transform: translate(-50%, -50%) scale(1.1) rotate(-90deg); opacity: 0.8; } 100% { transform: translate(-50%, -50%) scale(1) rotate(0deg); opacity: 1; } } /* 太阳滑入关键帧(从左侧进入屏幕正中间) */ @keyframes sunSlideIn { 0% { transform: translate(calc(-50% - 300px), -50%) scale(0.3) rotate(180deg); opacity: 0; } 50% { transform: translate(-50%, -50%) scale(1.1) rotate(90deg); opacity: 0.8; } 100% { transform: translate(-50%, -50%) scale(1) rotate(0deg); opacity: 1; } } /* 月亮发光动画 */ @keyframes moonGlow { 0% { filter: drop-shadow(0 0 20px rgba(232, 232, 232, 0.5)); transform: scale(1); } 50% { filter: drop-shadow(0 0 40px rgba(232, 232, 232, 0.8)) drop-shadow(0 0 60px rgba(232, 232, 232, 0.6)); transform: scale(1.05); } 100% { filter: drop-shadow(0 0 30px rgba(232, 232, 232, 0.6)) drop-shadow(0 0 50px rgba(232, 232, 232, 0.4)); transform: scale(1); } } /* 太阳发光动画 */ @keyframes sunGlow { 0% { filter: drop-shadow(0 0 20px rgba(255, 215, 0, 0.5)); transform: scale(1); } 50% { filter: drop-shadow(0 0 50px rgba(255, 215, 0, 0.9)) drop-shadow(0 0 80px rgba(255, 215, 0, 0.7)); transform: scale(1.1); } 100% { filter: drop-shadow(0 0 35px rgba(255, 215, 0, 0.7)) drop-shadow(0 0 60px rgba(255, 215, 0, 0.5)); transform: scale(1); } } /* 月亮发光扩散动画 */ @keyframes moonGlowExpand { 0% { width: 120px; height: 120px; opacity: 0; transform: translate(-50%, -50%) scale(0.5); } 50% { width: 300px; height: 300px; opacity: 0.8; transform: translate(-50%, -50%) scale(1.2); } 100% { width: 400px; height: 400px; opacity: 0.4; transform: translate(-50%, -50%) scale(1.5); } } /* 太阳发光扩散动画 */ @keyframes sunGlowExpand { 0% { width: 120px; height: 120px; opacity: 0; transform: translate(-50%, -50%) scale(0.5); } 50% { width: 350px; height: 350px; opacity: 0.9; transform: translate(-50%, -50%) scale(1.3); } 100% { width: 500px; height: 500px; opacity: 0.5; transform: translate(-50%, -50%) scale(1.8); } } /* 优化:主题切换时的平滑过渡 - 与月亮/太阳动画同步 */ body { transition: background-color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.2s, color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.2s; } body[data-theme="light"], body[data-theme="dark"] { transition: background-color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.2s, color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.2s; } /* 优化:卡片和元素的主题切换过渡 - 延迟启动,跟随月亮/太阳动画 */ .card, .category-card, .subcategory-card, .tool-card, .island-card, .setting-island, .welcome-card, .dashboard-card { transition: background-color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.3s, border-color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.3s, color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.3s, box-shadow 1s cubic-bezier(0.4, 0, 0.2, 1) 0.3s; } /* 优化:文本元素的主题切换过渡 - 延迟启动 */ h1, h2, h3, p, span, div, button, a, label { transition: color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.35s; } /* 优化:输入框和表单元素的主题切换过渡 - 延迟启动 */ input, textarea, select { transition: background-color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.3s, border-color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.3s, color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.3s; } /* 优化:导航按钮的主题切换过渡 */ .nav-btn, .island-nav-item, .settings-nav-item, .category-pill { transition: background-color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.3s, border-color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.3s, color 1s cubic-bezier(0.4, 0, 0.2, 1) 0.3s, box-shadow 1s cubic-bezier(0.4, 0, 0.2, 1) 0.3s; } /* ========================================= */ /* --- 新工具样式优化 --- */ /* ========================================= */ /* 文件哈希工具样式 */ .stat-item { display: flex; flex-direction: column; align-items: center; padding: 15px; background: rgba(var(--card-background-rgb), 0.6); border-radius: 12px; border: 1px solid var(--border-color); transition: all 0.3s var(--ease-smooth); } .stat-item:hover { background: rgba(var(--card-background-rgb), 0.8); transform: translateY(-2px); box-shadow: 0 4px 12px var(--shadow-color); } .stat-label { font-size: 12px; color: var(--text-secondary); margin-bottom: 8px; font-weight: 500; } .stat-value { font-size: 24px; font-weight: 700; color: var(--primary-color); font-family: monospace; } /* 随机生成器颜色预览优化 */ #color-preview { transition: all 0.3s var(--ease-smooth); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } #color-preview:hover { transform: scale(1.05); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); } /* 工具卡片统一样式优化 */ .setting-island { border-radius: 16px; overflow: hidden; } .input-group { margin-bottom: 15px; } .input-group label { display: flex; align-items: center; gap: 8px; font-weight: 600; margin-bottom: 8px; color: var(--text-color); font-size: 14px; } .input-group label i { color: var(--primary-color); font-size: 14px; } /* 工具按钮组优化 */ .action-bar { display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; } .action-bar .action-btn { min-width: 120px; padding: 12px 20px; border-radius: 12px; font-weight: 600; transition: all 0.3s var(--ease-spring); } .action-bar .action-btn:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(var(--primary-rgb), 0.3); } .action-bar .action-btn:active { transform: translateY(0); } /* 工具输入框优化 */ .common-input, .common-textarea { border-radius: 12px; border: 1px solid var(--border-color); background: rgba(var(--card-background-rgb), 0.6); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); transition: all 0.3s var(--ease-smooth); } .common-input:focus, .common-textarea:focus { border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.1); outline: none; } .common-input[readonly], .common-textarea[readonly] { background: rgba(var(--bg-color-rgb), 0.4); cursor: default; } /* 工具结果区域优化 */ .setting-island h3 { display: flex; align-items: center; gap: 10px; margin-bottom: 20px; color: var(--text-color); font-size: 18px; font-weight: 600; } .setting-island h3 i { color: var(--primary-color); } /* ========================================= */ /* --- 文件哈希工具专用样式 --- */ /* ========================================= */ .file-select-area { padding: 4px 0; } .file-info-text { transition: all 0.3s var(--ease-smooth); word-break: break-all; } .hash-grid { margin-top: 8px; } .hash-item { display: flex; flex-direction: column; gap: 8px; } .hash-label { display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 600; color: var(--text-color); margin-bottom: 4px; } .hash-input-wrapper { display: flex; gap: 8px; align-items: center; } .hash-input { flex: 1; font-family: 'Consolas', 'Monaco', monospace; font-size: 12px; padding: 10px 12px; word-break: break-all; } .hash-copy-btn { padding: 10px 16px; min-width: 44px; flex-shrink: 0; border-radius: 10px; transition: all 0.3s var(--ease-spring); } .hash-copy-btn:hover { transform: scale(1.05); box-shadow: 0 4px 12px rgba(var(--primary-rgb), 0.3); } .loading-container { display: flex; } .spinner-wrapper { display: flex; align-items: center; justify-content: center; width: 64px; height: 64px; border-radius: 50%; background: rgba(var(--primary-rgb), 0.1); backdrop-filter: blur(10px); } /* ========================================= */ /* --- 大小写转换工具专用样式 --- */ /* ========================================= */ .case-button-grid { padding: 4px 0; } .case-btn { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; padding: 16px 12px; background: rgba(var(--card-background-rgb), 0.6); border: 1px solid var(--border-color); border-radius: 12px; color: var(--text-color); font-size: 13px; font-weight: 600; cursor: pointer; transition: all 0.3s var(--ease-spring); min-height: 80px; } .case-btn i { font-size: 20px; color: var(--primary-color); margin-bottom: 4px; } .case-btn:hover { background: rgba(var(--primary-rgb), 0.1); border-color: var(--primary-color); transform: translateY(-2px); box-shadow: 0 4px 16px rgba(var(--primary-rgb), 0.2); } .case-btn:active { transform: translateY(0); } .case-btn span { font-size: 12px; text-align: center; } /* ========================================= */ /* --- 随机生成器工具专用样式 --- */ /* ========================================= */ .charset-checkboxes { padding: 16px; } .checkbox-label { display: flex; align-items: center; gap: 12px; font-size: 13px; font-weight: 500; color: var(--text-color); cursor: pointer; padding: 8px; border-radius: 8px; transition: all 0.2s var(--ease-smooth); } .checkbox-label:hover { background: rgba(var(--primary-rgb), 0.05); } .checkbox-label input[type="checkbox"] { width: 18px; height: 18px; cursor: pointer; accent-color: var(--primary-color); flex-shrink: 0; } .checkbox-label span { flex: 1; user-select: none; } .color-preview-large { transition: all 0.4s var(--ease-spring); position: relative; overflow: hidden; } .color-preview-large::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(0,0,0,0.1) 100%); pointer-events: none; } .color-preview-large:hover { transform: scale(1.02); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2); } /* ============================================ 工具箱验证页面样式(1级和1.5级界面) [重构] 健康检查验证界面 ============================================ */ .toolbox-verification-page { display: flex; flex-direction: column; align-items: center; justify-content: flex-start; min-height: 100%; max-height: 100vh; padding: 20px; padding-bottom: 40px; /* [优化] 增加底部内边距,确保检查列表框完全显示 */ gap: 20px; overflow-y: auto; overflow-x: hidden; /* [优化] 防止横向滚动 */ box-sizing: border-box; /* [优化] 确保内容不会超出视口 */ width: 100%; } .verification-header { text-align: center; margin-bottom: 10px; flex-shrink: 0; } .verification-icon { width: 60px; height: 60px; margin: 0 auto 12px; border-radius: 16px; background: linear-gradient(135deg, var(--primary-color) 0%, rgba(var(--primary-rgb), 0.8) 100%); display: flex; align-items: center; justify-content: center; font-size: 28px; color: white; box-shadow: 0 8px 24px rgba(var(--primary-rgb), 0.3); animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { transform: scale(1); box-shadow: 0 10px 30px rgba(var(--primary-rgb), 0.3); } 50% { transform: scale(1.05); box-shadow: 0 15px 40px rgba(var(--primary-rgb), 0.5); } } .verification-title { font-size: 24px; font-weight: 700; color: var(--text-color); margin: 0 0 8px 0; } .verification-subtitle { font-size: 14px; color: var(--text-secondary); margin: 0; } .verification-progress-container { width: 100%; max-width: 600px; background: rgba(var(--card-background-rgb), 0.7); backdrop-filter: blur(20px); border-radius: 16px; padding: 20px; border: 1px solid var(--border-color); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); flex-shrink: 0; } .verification-progress-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; flex-wrap: wrap; gap: 8px; } .verification-status { font-size: 16px; font-weight: 600; color: var(--text-primary); display: flex; align-items: center; gap: 8px; } .verification-progress-text { font-size: 14px; font-weight: 600; color: var(--primary-color); font-family: monospace; } .verification-progress-bar-container { width: 100%; height: 10px; background: rgba(var(--primary-rgb), 0.1); border-radius: 5px; overflow: hidden; margin-bottom: 12px; } .verification-progress-bar { height: 100%; background: linear-gradient(90deg, var(--primary-color) 0%, rgba(var(--primary-rgb), 0.8) 100%); border-radius: 6px; transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1); width: 0%; position: relative; overflow: hidden; } .verification-progress-bar::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); animation: shimmer 2s infinite; } .verification-stats { display: flex; justify-content: space-around; gap: 12px; flex-wrap: wrap; } .verification-stat-item { display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; color: var(--text-primary); } .verification-tools-list-container { width: 100%; max-width: 800px; background: rgba(var(--card-background-rgb), 0.7); backdrop-filter: blur(20px); border-radius: 16px; padding: 16px; border: 1px solid var(--border-color); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); /* [优化] 使用固定高度而非flex:1,确保框能完全显示 */ height: auto; min-height: 200px; max-height: calc(100vh - 520px); /* [优化] 增加底部边距,确保框完全显示 */ display: flex; flex-direction: column; overflow: hidden; /* [优化] 防止横向滚动条 */ overflow-x: hidden; min-width: 0; /* [优化] 确保容器不会超出父元素 */ box-sizing: border-box; margin-bottom: 20px; /* [优化] 添加底部边距 */ } .verification-tools-list-header { display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; color: var(--text-primary); margin-bottom: 12px; padding-bottom: 8px; border-bottom: 1px solid var(--border-color); flex-shrink: 0; } .verification-tools-list { flex: 1; overflow-y: auto; overflow-x: hidden; /* [优化] 防止横向滚动条 */ display: flex; flex-direction: column; gap: 10px; /* [优化] 确保内容不超出容器 */ min-width: 0; width: 100%; } .verification-tool-item { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; background: rgba(var(--card-background-rgb), 0.5); border-radius: 10px; border: 1px solid var(--border-color); transition: all 0.3s ease; flex-shrink: 0; /* [优化] 防止悬停时超出容器 */ min-width: 0; max-width: 100%; box-sizing: border-box; } .verification-tool-item:hover { background: rgba(var(--card-background-rgb), 0.8); /* [优化] 限制悬停时的位移,确保不会超出容器 */ transform: translateX(2px); /* 减少位移量 */ border-color: rgba(var(--primary-rgb), 0.3); /* [优化] 确保悬停时不会超出容器 */ max-width: 100%; /* [优化] 确保悬停效果在容器内 */ position: relative; z-index: 1; } /* [优化] 当前检查项追踪样式 */ .verification-tool-item.current-checking { background: rgba(var(--primary-rgb), 0.15); border-color: var(--primary-color); border-left: 3px solid var(--primary-color); box-shadow: 0 0 20px rgba(var(--primary-rgb), 0.3); /* [优化] 限制位移,确保不会超出容器 */ transform: translateX(4px); /* 减少位移量 */ animation: currentCheckingPulse 2s ease-in-out infinite; /* [优化] 确保在容器内 */ position: relative; z-index: 2; max-width: 100%; } @keyframes currentCheckingPulse { 0%, 100% { box-shadow: 0 0 20px rgba(var(--primary-rgb), 0.3); } 50% { box-shadow: 0 0 30px rgba(var(--primary-rgb), 0.5); } } .verification-tool-name { display: flex; align-items: center; gap: 12px; flex: 1; font-weight: 600; color: var(--text-primary); } .verification-tool-status { display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; } .verification-tool-status.success { color: #10b981; } .verification-tool-status.failed { color: #ef4444; } .verification-tool-status.checking { color: #6b7280; } .verification-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px; gap: 16px; color: var(--text-secondary); } .verification-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px; gap: 16px; color: var(--text-secondary); } .verification-actions { display: flex; gap: 10px; justify-content: center; margin-top: 10px; flex-shrink: 0; } .verification-actions .control-btn { min-width: 100px; padding: 10px 16px; font-size: 14px; } /* ============================================ 工具健康检查设置页面样式(重构) ============================================ */ .tool-health-header { display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px; } .tool-health-icon-wrapper { width: 56px; height: 56px; border-radius: 16px; background: linear-gradient(135deg, var(--primary-color) 0%, rgba(var(--primary-rgb), 0.8) 100%); display: flex; align-items: center; justify-content: center; font-size: 24px; color: white; box-shadow: 0 8px 16px rgba(var(--primary-rgb), 0.3); flex-shrink: 0; } .tool-health-header-content h2 { margin: 0 0 6px 0; font-size: 20px; font-weight: 700; color: var(--text-color); } .tool-health-subtitle { margin: 0; font-size: 14px; color: var(--text-secondary); line-height: 1.5; } .tool-health-info-card { background: rgba(var(--card-background-rgb), 0.5); border-radius: 12px; padding: 16px; margin-bottom: 24px; border: 1px solid var(--border-color); } .tool-health-info-item { display: flex; gap: 12px; align-items: flex-start; } .tool-health-info-item i { color: var(--primary-color); font-size: 18px; margin-top: 2px; flex-shrink: 0; } .tool-health-info-text { flex: 1; display: flex; flex-direction: column; gap: 6px; } .tool-health-info-text strong { font-size: 14px; font-weight: 600; color: var(--text-color); } .tool-health-info-text span { font-size: 13px; color: var(--text-secondary); line-height: 1.6; } .tool-health-action-section { margin-bottom: 24px; } .tool-health-check-btn { width: 100%; padding: 14px 24px; background: linear-gradient(135deg, var(--primary-color) 0%, rgba(var(--primary-rgb), 0.8) 100%); border: none; border-radius: 12px; color: white; font-size: 15px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 4px 12px rgba(var(--primary-rgb), 0.3); position: relative; overflow: hidden; } .tool-health-check-btn:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(var(--primary-rgb), 0.4); } .tool-health-check-btn:active { transform: translateY(0); } .tool-health-check-btn:disabled { opacity: 0.7; cursor: not-allowed; transform: none; } .tool-health-btn-content { display: flex; align-items: center; justify-content: center; gap: 10px; position: relative; z-index: 1; } .tool-health-progress-container { background: rgba(var(--card-background-rgb), 0.7); backdrop-filter: blur(20px); border-radius: 16px; padding: 20px; margin-bottom: 24px; border: 1px solid var(--border-color); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); } .tool-health-progress-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; } .tool-health-progress-status { display: flex; align-items: center; gap: 8px; font-weight: 600; color: var(--text-color); font-size: 14px; } .tool-health-progress-count { font-size: 13px; color: var(--text-secondary); font-family: monospace; font-weight: 600; } .tool-health-progress-bar-wrapper { width: 100%; height: 10px; background: rgba(var(--primary-rgb), 0.1); border-radius: 5px; overflow: hidden; margin-bottom: 16px; } .tool-health-progress-bar { height: 100%; background: linear-gradient(90deg, var(--primary-color) 0%, rgba(var(--primary-rgb), 0.8) 100%); border-radius: 5px; width: 0%; transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1); position: relative; overflow: hidden; } .tool-health-progress-bar::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); animation: shimmer 2s infinite; } .tool-health-progress-stats { display: flex; justify-content: space-around; gap: 12px; flex-wrap: wrap; } .tool-health-stat-item { display: flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 600; } .tool-health-stat-item.success { color: #10b981; } .tool-health-stat-item.failed { color: #ef4444; } .tool-health-stat-item.pending { color: #6b7280; } .tool-health-stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; } .tool-health-stat-card { background: rgba(var(--card-background-rgb), 0.5); border-radius: 12px; padding: 16px; border: 1px solid var(--border-color); display: flex; align-items: center; gap: 12px; transition: all 0.3s ease; } .tool-health-stat-card:hover { background: rgba(var(--card-background-rgb), 0.7); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } .tool-health-stat-icon { width: 40px; height: 40px; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 18px; flex-shrink: 0; } .tool-health-stat-icon.locked { background: rgba(239, 68, 68, 0.1); color: #ef4444; } .tool-health-stat-icon.time { background: rgba(var(--primary-rgb), 0.1); color: var(--primary-color); } .tool-health-stat-icon.total { background: rgba(16, 185, 129, 0.1); color: #10b981; } .tool-health-stat-info { flex: 1; min-width: 0; } .tool-health-stat-label { font-size: 12px; color: var(--text-secondary); margin-bottom: 4px; } .tool-health-stat-value { font-size: 14px; font-weight: 600; color: var(--text-color); font-family: monospace; } /* [新增] 可点击的统计卡片 */ .tool-health-stat-card.clickable { cursor: pointer; position: relative; } .tool-health-stat-card.clickable:hover { transform: translateY(-3px); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); } .tool-health-stat-card.has-locked { border-left: 3px solid #ef4444; } .tool-health-stat-card.has-history { border-left: 3px solid var(--primary-color); } .tool-health-stat-action { position: absolute; right: 16px; top: 50%; transform: translateY(-50%); color: var(--text-secondary); font-size: 14px; opacity: 0; transition: opacity 0.3s ease, transform 0.3s ease; } .tool-health-stat-card.clickable:hover .tool-health-stat-action { opacity: 1; transform: translateY(-50%) translateX(-4px); } /* ============================================ 锁定工具模态框样式 ============================================ */ .tool-health-locked-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 30000; display: flex; align-items: center; justify-content: center; opacity: 0; pointer-events: none; transition: opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .tool-health-locked-modal.active { opacity: 1; pointer-events: auto; } .tool-health-locked-modal-backdrop { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.7); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); } body[data-theme="light"] .tool-health-locked-modal-backdrop { background-color: rgba(0, 0, 0, 0.5); } body[data-theme="dark"] .tool-health-locked-modal-backdrop { background-color: rgba(0, 0, 0, 0.75); } .tool-health-locked-modal-content { position: relative; width: 90%; max-width: 600px; max-height: 80vh; background-color: rgba(var(--card-background-rgb), 0.95); border: 1px solid var(--border-color); border-radius: 20px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.05); transform: scale(0.95) translateY(20px); transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); display: flex; flex-direction: column; overflow: hidden; } .tool-health-locked-modal.active .tool-health-locked-modal-content { transform: scale(1) translateY(0); } .tool-health-locked-modal-header { display: flex; align-items: center; justify-content: space-between; padding: 20px 24px; border-bottom: 1px solid var(--border-color); } .tool-health-locked-modal-title { display: flex; align-items: center; gap: 12px; } .tool-health-locked-modal-title i { font-size: 20px; color: #ef4444; } .tool-health-locked-modal-title h3 { margin: 0; font-size: 18px; font-weight: 700; color: var(--text-color); } .tool-health-locked-modal-close { width: 32px; height: 32px; border-radius: 8px; border: none; background: transparent; color: var(--text-secondary); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.2s ease; } .tool-health-locked-modal-close:hover { background: rgba(var(--primary-rgb), 0.1); color: var(--primary-color); } .tool-health-locked-modal-body { padding: 24px; overflow-y: auto; flex: 1; } .tool-health-locked-list { display: flex; flex-direction: column; gap: 12px; } .tool-health-locked-item { display: flex; align-items: flex-start; gap: 16px; padding: 16px; background: rgba(var(--card-background-rgb), 0.5); border: 1px solid var(--border-color); border-radius: 12px; transition: all 0.3s ease; } .tool-health-locked-item:hover { background: rgba(var(--card-background-rgb), 0.7); transform: translateX(4px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } .tool-health-locked-item-icon { width: 40px; height: 40px; border-radius: 10px; background: rgba(239, 68, 68, 0.1); color: #ef4444; display: flex; align-items: center; justify-content: center; font-size: 18px; flex-shrink: 0; } .tool-health-locked-item-content { flex: 1; min-width: 0; } .tool-health-locked-item-name { font-size: 16px; font-weight: 600; color: var(--text-color); margin-bottom: 4px; } .tool-health-locked-item-desc { font-size: 13px; color: var(--text-secondary); margin-bottom: 8px; line-height: 1.5; } .tool-health-locked-item-meta { display: flex; flex-wrap: wrap; gap: 12px; font-size: 12px; color: var(--text-secondary); } .tool-health-locked-item-reason, .tool-health-locked-item-time { display: flex; align-items: center; gap: 6px; } .tool-health-locked-item-reason i, .tool-health-locked-item-time i { font-size: 11px; opacity: 0.7; } .tool-health-locked-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 60px 20px; text-align: center; color: var(--text-secondary); } .tool-health-locked-empty i { font-size: 48px; color: #10b981; margin-bottom: 16px; } .tool-health-locked-empty p { font-size: 16px; font-weight: 600; color: var(--text-color); margin-bottom: 8px; } .tool-health-locked-empty span { font-size: 13px; color: var(--text-secondary); } /* [新增] 检查历史记录项样式 */ .tool-health-history-item { padding: 16px; background: rgba(var(--card-background-rgb), 0.6); border-radius: 12px; border: 1px solid var(--border-color); margin-bottom: 12px; transition: all 0.3s ease; } .tool-health-history-item:hover { background: rgba(var(--card-background-rgb), 0.8); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } .tool-health-history-item-header { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; } .tool-health-history-item-date { display: flex; align-items: center; gap: 8px; font-weight: 600; color: var(--text-primary); font-size: 14px; } .tool-health-history-item-date i { color: var(--primary-color); } .tool-health-history-item-stats { display: flex; gap: 16px; font-size: 13px; } .tool-health-history-item-stats .stat-success { color: #10b981; font-weight: 600; } .tool-health-history-item-stats .stat-failed { color: #ef4444; font-weight: 600; } .tool-health-history-item-stats .stat-total { color: var(--text-secondary); font-weight: 500; } /* ============================================ 通用模态框框架样式 (Universal Modal Framework) ============================================ */ .universal-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 30000; display: flex; align-items: center; justify-content: center; opacity: 0; pointer-events: none; transition: opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .universal-modal.active { opacity: 1; pointer-events: auto; } .universal-modal.closing { opacity: 0; pointer-events: none; } .universal-modal-backdrop { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.7); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); } /* 主题适配的背景色 */ [data-theme="light"] .universal-modal-backdrop { background-color: rgba(0, 0, 0, 0.5); } [data-theme="dark"] .universal-modal-backdrop { background-color: rgba(0, 0, 0, 0.75); } .universal-modal-container { position: relative; background: rgba(var(--card-background-rgb), 0.95); backdrop-filter: blur(30px) saturate(180%); -webkit-backdrop-filter: blur(30px) saturate(180%); border-radius: 24px; border: 1px solid var(--border-color); box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(var(--primary-rgb), 0.1) inset; max-width: 90vw; max-height: 90vh; display: flex; flex-direction: column; transform: scale(0.9) translateY(20px); opacity: 0; transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); overflow: hidden; } .universal-modal.active .universal-modal-container { transform: scale(1) translateY(0); opacity: 1; } /* 尺寸变体 */ .universal-modal-small { width: 90%; max-width: 400px; } .universal-modal-medium { width: 90%; max-width: 600px; } .universal-modal-large { width: 90%; max-width: 900px; } .universal-modal-fullscreen { width: 95vw; height: 95vh; max-width: none; max-height: none; border-radius: 16px; } .universal-modal-header { display: flex; align-items: center; justify-content: space-between; padding: 20px 24px; border-bottom: 1px solid var(--border-color); flex-shrink: 0; background: linear-gradient(to bottom, rgba(var(--card-background-rgb), 0.5), transparent); } .universal-modal-title { font-size: 18px; font-weight: 700; color: var(--text-primary); display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; } .universal-modal-close { background: none; border: none; color: var(--text-secondary); cursor: pointer; padding: 8px; border-radius: 8px; font-size: 18px; line-height: 1; transition: all 0.2s ease; flex-shrink: 0; display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; } .universal-modal-close:hover { background: rgba(var(--primary-rgb), 0.1); color: var(--primary-color); transform: rotate(90deg); } .universal-modal-body { padding: 24px; overflow-y: auto; flex: 1; min-height: 0; color: var(--text-primary); line-height: 1.6; } /* 自定义滚动条 */ .universal-modal-body::-webkit-scrollbar { width: 8px; } .universal-modal-body::-webkit-scrollbar-track { background: rgba(var(--card-background-rgb), 0.3); border-radius: 4px; } .universal-modal-body::-webkit-scrollbar-thumb { background: rgba(var(--primary-rgb), 0.3); border-radius: 4px; } .universal-modal-body::-webkit-scrollbar-thumb:hover { background: rgba(var(--primary-rgb), 0.5); } .universal-modal-footer { display: flex; align-items: center; justify-content: flex-end; gap: 12px; padding: 16px 24px; border-top: 1px solid var(--border-color); flex-shrink: 0; background: linear-gradient(to top, rgba(var(--card-background-rgb), 0.5), transparent); } .universal-modal-button { padding: 10px 20px; border: none; border-radius: 10px; font-size: 14px; font-weight: 600; cursor: pointer; transition: all 0.2s ease; display: inline-flex; align-items: center; gap: 8px; white-space: nowrap; } .universal-modal-button-primary { background: var(--primary-color); color: white; box-shadow: 0 2px 8px rgba(var(--primary-rgb), 0.3); } .universal-modal-button-primary:hover { background: rgba(var(--primary-rgb), 0.9); transform: translateY(-1px); box-shadow: 0 4px 12px rgba(var(--primary-rgb), 0.4); } .universal-modal-button-secondary { background: rgba(var(--card-background-rgb), 0.8); color: var(--text-primary); border: 1px solid var(--border-color); } .universal-modal-button-secondary:hover { background: rgba(var(--card-background-rgb), 1); border-color: var(--primary-color); } .universal-modal-button-danger { background: #ef4444; color: white; } .universal-modal-button-danger:hover { background: #dc2626; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4); } /* 字体下载模态框专用样式(使用通用模态框框架) */ .font-download-modal-wrapper .universal-modal-container { width: 340px; max-width: 90vw; } .font-download-modal-content { text-align: center; padding: 0; } .font-modal-icon { font-size: 48px; color: var(--primary-color); margin-bottom: 15px; filter: drop-shadow(0 4px 8px rgba(var(--primary-rgb), 0.3)); } .font-modal-icon i { display: block; } .font-download-modal-content h3 { margin: 0 0 8px 0; font-size: 18px; color: var(--text-color); transition: color 0.4s cubic-bezier(0.4, 0, 0.2, 1); } .font-download-modal-content p { margin: 0; color: var(--text-secondary); font-size: 14px; line-height: 1.5; transition: color 0.4s cubic-bezier(0.4, 0, 0.2, 1); } /* 进度条轨道 */ .font-progress-bg { width: 100%; height: 8px; background-color: var(--border-color); border-radius: 4px; margin: 20px 0 12px; overflow: hidden; position: relative; } .font-progress-bar { height: 100%; width: 0%; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); border-radius: 4px; transition: width 0.15s linear; box-shadow: 0 0 10px rgba(var(--primary-rgb), 0.4); } #appearance-font-download-percent { margin: 0; font-size: 12px; font-family: monospace; color: var(--text-secondary); transition: color 0.4s cubic-bezier(0.4, 0, 0.2, 1); } /* 响应式设计 */ @media (max-width: 768px) { .universal-modal-container { width: 95vw; max-width: none; border-radius: 16px; } .universal-modal-header, .universal-modal-body, .universal-modal-footer { padding: 16px; } .universal-modal-footer { flex-direction: column-reverse; } .universal-modal-button { width: 100%; justify-content: center; } .font-download-modal-wrapper .universal-modal-container { width: 90vw; } } /* ============================================ 主题切换按钮样式(重构 - 太阳/云朵和月亮/星星风格) 适用于导航栏和设置界面 ============================================ */ .theme-switch-modern { position: relative; display: inline-block; cursor: pointer; user-select: none; } /* 导航栏中的主题切换按钮 */ .navbar .theme-switch-modern { width: 44px; height: 44px; margin-bottom: 20px; /* 移除nav-btn的默认样式,使用主题切换按钮的样式 */ background: transparent !important; border: none !important; padding: 0; display: flex; align-items: center; justify-content: center; /* 覆盖nav-btn的hover效果 */ transform: none !important; } /* 导航栏中的主题切换按钮:禁用nav-btn的hover效果 */ .navbar .theme-switch-modern:hover { background-color: transparent !important; transform: none !important; } /* 设置界面中的主题切换按钮 */ .settings-page-container .theme-switch-modern { width: 80px; height: 40px; } .theme-switch-modern input { opacity: 0; width: 0; height: 0; position: absolute; } .theme-switch-track { position: relative; display: block; width: 100%; height: 100%; transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1); overflow: hidden; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); } /* 导航栏中的轨道样式 */ .navbar .theme-switch-track { border-radius: 12px; /* 确保轨道填满整个按钮区域 */ width: 100%; height: 100%; } /* 设置界面中的轨道样式 */ .settings-page-container .theme-switch-track { border-radius: 20px; } /* 浅色模式:浅蓝色天空和云朵 */ .theme-switch-modern input:not(:checked) + .theme-switch-track { background: linear-gradient(135deg, #87CEEB 0%, #B0E0E6 100%); } /* 深色模式:深灰色渐变和星星 */ .theme-switch-modern input:checked + .theme-switch-track { background: linear-gradient(135deg, #1a1a2e 0%, #2d2d44 50%, #3a3a5c 100%); } /* 切换按钮(太阳/月亮) */ .theme-switch-knob { position: absolute; border-radius: 50%; transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1); display: flex; align-items: center; justify-content: center; z-index: 2; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); } /* 导航栏中的按钮样式 */ .navbar .theme-switch-knob { top: 4px; left: 4px; width: 36px; height: 36px; } /* 导航栏中的图标尺寸调整 */ .navbar .theme-switch-sun, .navbar .theme-switch-moon { width: 16px; height: 16px; } /* 设置界面中的按钮样式 */ .settings-page-container .theme-switch-knob { top: 4px; left: 4px; width: 32px; height: 32px; } /* 浅色模式:太阳在左侧 */ .theme-switch-modern input:not(:checked) + .theme-switch-track .theme-switch-knob { background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); transform: rotate(0deg); } /* 导航栏中浅色模式:太阳在左侧 */ .navbar .theme-switch-modern input:not(:checked) + .theme-switch-track .theme-switch-knob { left: 4px; } /* 设置界面中浅色模式:太阳在左侧 */ .settings-page-container .theme-switch-modern input:not(:checked) + .theme-switch-track .theme-switch-knob { left: 4px; } /* 深色模式:月亮在右侧 */ .theme-switch-modern input:checked + .theme-switch-track .theme-switch-knob { background: linear-gradient(135deg, #E8E8E8 0%, #D3D3D3 100%); transform: rotate(180deg); } /* 导航栏中深色模式:月亮在右侧 */ .navbar .theme-switch-modern input:checked + .theme-switch-track .theme-switch-knob { left: calc(100% - 40px); } /* 设置界面中深色模式:月亮在右侧 */ .settings-page-container .theme-switch-modern input:checked + .theme-switch-track .theme-switch-knob { left: calc(100% - 36px); } /* 太阳图标 */ .theme-switch-sun { position: absolute; width: 18px; height: 18px; color: #FFD700; opacity: 1; transition: opacity 0.3s ease, transform 0.5s cubic-bezier(0.4, 0, 0.2, 1); display: flex; align-items: center; justify-content: center; } .theme-switch-sun svg { width: 100%; height: 100%; color: inherit; } .theme-switch-modern input:checked + .theme-switch-track .theme-switch-sun { opacity: 0; transform: scale(0) rotate(180deg); } .theme-switch-modern input:not(:checked) + .theme-switch-track .theme-switch-sun { opacity: 1; transform: scale(1) rotate(0deg); } /* 月亮图标 */ .theme-switch-moon { position: absolute; width: 18px; height: 18px; color: #E8E8E8; opacity: 0; transition: opacity 0.3s ease, transform 0.5s cubic-bezier(0.4, 0, 0.2, 1); display: flex; align-items: center; justify-content: center; } .theme-switch-moon svg { width: 100%; height: 100%; color: inherit; } .theme-switch-modern input:checked + .theme-switch-track .theme-switch-moon { opacity: 1; transform: scale(1) rotate(0deg); } .theme-switch-modern input:not(:checked) + .theme-switch-track .theme-switch-moon { opacity: 0; transform: scale(0) rotate(-180deg); } /* 云朵装饰(浅色模式) */ .theme-switch-clouds { position: absolute; top: 0; left: 0; right: 0; bottom: 0; opacity: 0; transition: opacity 0.5s ease; pointer-events: none; z-index: 1; } .theme-switch-modern input:not(:checked) + .theme-switch-track .theme-switch-clouds { opacity: 1; background-image: radial-gradient(circle at 25% 35%, rgba(255, 255, 255, 0.85) 0%, rgba(255, 255, 255, 0.85) 18%, transparent 18%), radial-gradient(circle at 65% 45%, rgba(255, 255, 255, 0.75) 0%, rgba(255, 255, 255, 0.75) 15%, transparent 15%), radial-gradient(circle at 85% 30%, rgba(255, 255, 255, 0.65) 0%, rgba(255, 255, 255, 0.65) 12%, transparent 12%); background-size: 100% 100%; background-position: 0 0; background-repeat: no-repeat; } .theme-switch-modern input:checked + .theme-switch-track .theme-switch-clouds { opacity: 0; } /* 星星装饰(深色模式) */ .theme-switch-stars { position: absolute; top: 0; left: 0; right: 0; bottom: 0; opacity: 0; transition: opacity 0.5s ease; pointer-events: none; z-index: 1; } .theme-switch-modern input:checked + .theme-switch-track .theme-switch-stars { opacity: 1; background-image: radial-gradient(circle at 18% 25%, rgba(255, 255, 255, 0.95) 1.5px, transparent 1.5px), radial-gradient(circle at 38% 40%, rgba(255, 255, 255, 0.85) 1px, transparent 1px), radial-gradient(circle at 58% 20%, rgba(255, 255, 255, 0.9) 1.5px, transparent 1.5px), radial-gradient(circle at 72% 45%, rgba(255, 255, 255, 0.75) 1px, transparent 1px), radial-gradient(circle at 88% 30%, rgba(255, 255, 255, 0.85) 1.2px, transparent 1.2px); background-size: 100% 100%; background-position: 0 0; background-repeat: no-repeat; } .theme-switch-modern input:not(:checked) + .theme-switch-track .theme-switch-stars { opacity: 0; } /* ============================================ 主题切换过渡动画(重构 - 解决文字显示问题) ============================================ */ .theme-transitioning * { transition: background-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), color 0.4s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important; } .theme-transitioning { transition: background-color 0.4s cubic-bezier(0.4, 0, 0.2, 1), color 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important; } /* 确保文字在过渡期间保持可见 */ .theme-transitioning body, .theme-transitioning .text-primary, .theme-transitioning .text-secondary, .theme-transitioning h1, .theme-transitioning h2, .theme-transitioning h3, .theme-transitioning p, .theme-transitioning span, .theme-transitioning div { color: inherit !important; opacity: 1 !important; will-change: color, background-color; } /* 响应式设计 */ @media (max-height: 700px) { .toolbox-verification-page { padding: 15px; gap: 15px; } .verification-icon { width: 50px; height: 50px; font-size: 24px; margin-bottom: 8px; } .verification-title { font-size: 20px; margin-bottom: 6px; } .verification-subtitle { font-size: 12px; } .verification-progress-container { padding: 16px; } .verification-tools-list-container { padding: 12px; min-height: 150px; max-height: calc(100vh - 450px); /* [优化] 增加底部边距,确保框完全显示 */ margin-bottom: 15px; /* [优化] 添加底部边距 */ } .verification-tool-item { padding: 8px 12px; } .toolbox-verification-page { padding-bottom: 30px; /* [优化] 增加底部内边距 */ } } @media (max-width: 768px) { .verification-progress-header { flex-direction: column; align-items: flex-start; } .verification-stats { gap: 8px; } .verification-stat-item { font-size: 12px; } } .color-result-container { display: flex !important; flex-direction: column; } /* 工具页面通用优化 */ .page-container { max-width: 100%; box-sizing: border-box; } .setting-island { padding: 24px; min-height: 0; } /* 响应式优化 */ @media (max-width: 1200px) { .hash-grid { grid-template-columns: 1fr !important; } .case-button-grid { grid-template-columns: repeat(4, 1fr) !important; } } @media (max-width: 768px) { .case-button-grid { grid-template-columns: repeat(2, 1fr) !important; } .page-container { padding: 16px !important; gap: 16px !important; } } /* ========================================= */ /* --- BMI计算器工具专用样式 --- */ /* ========================================= */ .unit-btn { padding: 12px 24px; background: var(--input-bg); border: 1px solid var(--border-color); border-radius: 8px; font-size: 14px; font-weight: 600; color: var(--text-secondary); cursor: pointer; transition: all 0.3s var(--ease-smooth); } .unit-btn:hover { background: rgba(var(--primary-rgb), 0.1); border-color: var(--primary-color); color: var(--primary-color); } .unit-btn.active { background: linear-gradient(135deg, var(--primary-color) 0%, rgba(var(--primary-rgb), 0.8) 100%); color: #fff; border-color: var(--primary-color); box-shadow: 0 4px 12px rgba(var(--primary-rgb), 0.3); } .bmi-status.underweight { color: #ffc107; } .bmi-status.normal { color: #28a745; } .bmi-status.overweight { color: #fd7e14; } .bmi-status.obese { color: #dc3545; } @media (max-width: 768px) { .input-section { grid-template-columns: 1fr !important; } .range-list { grid-template-columns: 1fr !important; } }