一键 SQL 清理 WooCommerce 产品数据

有时候我们产品数量太多需要清理的时候,如果通过后台一个一个删除会很慢,因此可以直接通过数据库进行清理,注意:下面的命令会 彻底清空 WooCommerce 所有产品及相关数据(包括产品分类关系、属性、库存、元数据等),不可恢复!
执行前请 完整备份数据库,并确认表前缀(默认是 wp_,多站点或自定义可能不同:... 阅读更多

WordPress 多站点终极指南:从零开始安装与配置(子目录与子域名模式)

WordPress 多站点终极指南:从零开始安装与配置(子目录与子域名模式)

WordPress 的多站点(Multisite)功能是一个非常强大但常被忽视的特性。它允许您通过一次 WordPress 安装,创建和管理一个由多个独立站点组成的“网络”。无论您是想为公司的不同部门创建站点、为学校社团提供博客平台,还是为客户管理多个网站,多站点功能都能极大地简化您的工作流程。... 阅读更多

我的 Docker 服务标准部署流程:集成 Nginx Proxy Manager 禁止公网IP泄露访问

一、前言与目标

在服务器上部署多个 Docker 服务时,我们常常会遇到一个问题:每个服务都想占用一个端口,导致我们需要记住一堆 IP地址:端口号,例如 http://1.2.3.4:8080, http://1.2.3.4:8090 等。这种方式不仅管理混乱,而且直接暴露端口在公网上也存在安全风险,同时还无法方便地使用 HTTPS 加密。... 阅读更多

大健云仓自动导入SHOPIFY产品油猴脚本

// ==UserScript==
// @name         GIGAB2B自动批量导入(带倒计时显示+日志页面+失败快速重试)
// @namespace    http://tampermonkey.net/
// @version      1.9
// @description  GIGAB2B自动化批量导入,成功后按自定义间隔,失败后2分钟重试,并记录日志,可独立查看日志页面
// @author       你的名字
// @match        https://shop.gigab2b.com/import-list
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let intervalId = null;
    let countdownId = null;
    let statusDiv = null;
    let countdownSeconds = 0;
    let running = false;
    let intervalMinutes = 5;
    let startBtn, stopBtn;
    let lastImportSuccess = true; // 记录上一次是否成功

    // 日志存储到 localStorage
    function saveLog(result, detail) {
        const logs = JSON.parse(localStorage.getItem('gigab2b_import_logs') || '[]');
        logs.unshift({
            time: new Date().toLocaleString(),
            result,
            detail
        });
        if (logs.length > 100) logs.length = 100;
        localStorage.setItem('gigab2b_import_logs', JSON.stringify(logs));
    }

    // 日志页面弹窗
    function showLogPage() {
        const logs = JSON.parse(localStorage.getItem('gigab2b_import_logs') || '[]');
        let html = `
            <html>
            <head>
                <title>GIGAB2B 导入日志</title>
                <style>
                    body { font-family: monospace; background: #f9f9f9; margin: 0; padding: 20px; }
                    table { border-collapse: collapse; width: 100%; }
                    th, td { border: 1px solid #ccc; padding: 8px; }
                    th { background: #eee; }
                    tr.success td { color: green; }
                    tr.fail td { color: red; }
                    .clear-btn { margin: 10px 0; padding: 5px 10px; }
                </style>
            </head>
            <body>
                <h2>GIGAB2B 导入日志</h2>
                <button class="clear-btn" onclick="localStorage.removeItem('gigab2b_import_logs');location.reload();">清空日志</button>
                <table>
                    <tr><th>时间</th><th>结果</th><th>详情</th></tr>
                    ${logs.map(log => `
                        <tr class="${log.result === '成功' ? 'success' : 'fail'}">
                            <td>${log.time}</td>
                            <td>${log.result}</td>
                            <td>${log.detail}</td>
                        </tr>
                    `).join('')}
                </table>
            </body>
            </html>
        `;
        const win = window.open('', '_blank', 'width=700,height=500');
        win.document.write(html);
        win.document.close();
    }

    // 日志和状态显示
    function log(msg) {
        if (statusDiv) statusDiv.textContent = '状态:' + msg;
        console.log(msg);
    }

    function waitForSelector(selector, timeout = 10000) {
        return new Promise((resolve, reject) => {
            const interval = 100;
            let elapsed = 0;
            const timer = setInterval(() => {
                const el = document.querySelector(selector);
                if (el) {
                    clearInterval(timer);
                    resolve(el);
                }
                elapsed += interval;
                if (elapsed >= timeout) {
                    clearInterval(timer);
                    reject('元素未出现: ' + selector);
                }
            }, interval);
        });
    }

    async function getCurrentPage() {
        try {
            await waitForSelector('.el-pager');
            const activePage = document.querySelector('.el-pager li.number.active');
            if (activePage) {
                return parseInt(activePage.textContent.trim());
            }
            return 1;
        } catch (e) {
            log('获取当前页码失败:' + e);
            return 1;
        }
    }

    async function hasNextPage() {
        try {
            const pageElements = document.querySelectorAll('.el-pager li.number');
            return pageElements.length > 1;
        } catch (e) {
            log('检查是否有下一页失败:' + e);
            return false;
        }
    }

    async function clickPage(pageNumber) {
        try {
            await waitForSelector('.el-pager');
            await new Promise(r => setTimeout(r, 2000));
            const pageElements = document.querySelectorAll('.el-pager li.number');
            for (let element of pageElements) {
                if (element.textContent.trim() === pageNumber.toString()) {
                    element.click();
                    log(`已点击第 ${pageNumber} 页`);
                    await new Promise(r => setTimeout(r, 5000));
                    const activePage = document.querySelector('.el-pager li.number.active');
                    if (activePage && activePage.textContent.trim() === pageNumber.toString()) {
                        await waitForSelector('.opbar-container__checkall input[type="checkbox"]');
                        log(`第 ${pageNumber} 页加载完成`);
                        return true;
                    } else {
                        log(`第 ${pageNumber} 页切换失败`);
                        return false;
                    }
                }
            }
            log(`未找到第 ${pageNumber} 页`);
            return false;
        } catch (e) {
            log('翻页操作失败:' + e);
            return false;
        }
    }

    async function clickSelectAll() {
        const selectAllInput = await waitForSelector('.opbar-container__checkall input[type="checkbox"]');
        if (!selectAllInput.checked) {
            selectAllInput.click();
            log('已勾选 Select All');
            await new Promise(r => setTimeout(r, 2000));
        }
    }

    async function clickImportButton() {
        const importBtn = await waitForSelector('.el-button--primary.sh-button.ml-12');
        importBtn.click();
        log('已点击 Import 按钮');
        await new Promise(r => setTimeout(r, 2000));
    }

    async function checkAboen() {
        await waitForSelector('.el-dialog__footer');
        const labels = document.querySelectorAll('.el-checkbox-group .el-checkbox');
        for (let label of labels) {
            if (label.innerText.trim().includes('aboen')) {
                const input = label.querySelector('input[type="checkbox"]');
                if (!input.checked) {
                    input.click();
                    log('已勾选 aboen');
                    await new Promise(r => setTimeout(r, 2000));
                }
                break;
            }
        }
    }

    // 记录导入成功/失败日志
    async function clickDialogImport() {
        await waitForSelector('.el-dialog__footer');
        let success = false;
        for (let i = 0; i < 10; i++) {
            const dialogs = document.querySelectorAll('.el-dialog');
            for (let dialog of dialogs) {
                if (dialog.offsetParent === null) continue;
                const btns = dialog.querySelectorAll('button.el-button--primary.sh-button');
                for (let btn of btns) {
                    if (btn.innerText && btn.innerText.trim().toLowerCase().includes('import')) {
                        btn.scrollIntoView({behavior: "auto", block: "center"});
                        btn.focus();
                        btn.click();
                        log('已点击弹窗 Import 按钮');
                        success = true;
                        await new Promise(r => setTimeout(r, 2000));
                        // 检查成功弹窗
                        const successNotification = document.querySelector('.el-notification.sh-white-notification .el-notification__title');
                        if (successNotification && successNotification.textContent.includes('Request for batch import has been submitted')) {
                            log('导入任务提交成功');
                            saveLog('成功', '导入任务提交成功');
                            return true;
                        }
                        // 检查失败弹窗
                        const errorMessage = document.querySelector('.el-message--error .el-message__content');
                        if (errorMessage) {
                            log('导入任务提交失败:' + errorMessage.textContent);
                            saveLog('失败', errorMessage.textContent);
                            return false;
                        }
                        break;
                    }
                }
                if (success) break;
            }
            if (success) break;
            await new Promise(r => setTimeout(r, 1000));
        }
        if (!success) {
            log('未找到或未能点击弹窗 Import 按钮');
            saveLog('失败', '未找到或未能点击弹窗 Import 按钮');
            return false;
        }
        return false;
    }

    async function main() {
    try {
        log('流程开始');
        await new Promise(r => setTimeout(r, 3000));

        // 判断页数
        const hasNext = await hasNextPage();

        if (hasNext) {
            // 有第二页,始终切到第二页
            await clickPage(2);
        } // 否则就在第一页

        await clickSelectAll();
        await clickImportButton();
        await checkAboen();
        const importResult = await clickDialogImport();

        lastImportSuccess = !!importResult;

        if (importResult) {
            log('导入任务成功提交,等待处理完成');
        } else {
            log('导入任务提交失败,将在2分钟后重试');
        }

        await new Promise(r => setTimeout(r, 3000));

        // 再次判断是否还有第二页
        const hasNextAgain = await hasNextPage();
        let nextInterval = importResult ? intervalMinutes * 60 : 120; // 成功用自定义,失败2分钟

        if (hasNextAgain) {
            log(`本轮流程完成,下一轮倒计时开始:${nextInterval}秒`);
            startCountdown(nextInterval, 2); // 始终切到第二页
        } else {
            log('所有操作已完成,脚本停止');
            running = false;
            if (countdownId) clearInterval(countdownId);
            if (statusDiv) statusDiv.textContent = '状态:所有操作已完成';
            if (startBtn) startBtn.disabled = false;
            if (stopBtn) stopBtn.disabled = true;
        }
    } catch (e) {
        log('自动化流程出错:' + e);
        saveLog('失败', '自动化流程出错:' + e);
        startCountdown(120, 1); // 出错也2分钟重试
    }
}

function startCountdown(seconds, nextPage) {
    const targetTime = Date.now() + seconds * 1000;
    if (countdownId) clearInterval(countdownId);
    countdownId = setInterval(() => {
        if (!running) {
            clearInterval(countdownId);
            return;
        }
        const now = Date.now();
        countdownSeconds = Math.max(0, Math.round((targetTime - now) / 1000));
        if (statusDiv) statusDiv.textContent = '状态:本轮流程完成,下一轮倒计时开始:' + countdownSeconds + '秒';
        if (countdownSeconds <= 0) {
            clearInterval(countdownId);
            if (running) {
                main(); // 直接进入 main,由 main 决定是否切页
            }
        }
    }, 1000);
}

    function createControlPanel() {
        const panel = document.createElement('div');
        panel.style.position = 'fixed';
        panel.style.right = '30px';
        panel.style.bottom = '30px';
        panel.style.background = 'white';
        panel.style.border = '1px solid #ccc';
        panel.style.padding = '16px';
        panel.style.zIndex = 99999;
        panel.style.boxShadow = '0 2px 8px rgba(0,0,0,0.15)';
        panel.style.borderRadius = '8px';

        const label = document.createElement('label');
        label.textContent = '循环间隔(分钟): ';
        const input = document.createElement('input');
        input.type = 'number';
        input.value = 5;
        input.min = 1;
        input.style.width = '50px';
        label.appendChild(input);

        startBtn = document.createElement('button');
        startBtn.textContent = '开始';
        startBtn.style.marginLeft = '10px';

        stopBtn = document.createElement('button');
        stopBtn.textContent = '停止';
        stopBtn.style.marginLeft = '10px';
        stopBtn.disabled = true;

        const logBtn = document.createElement('button');
        logBtn.textContent = '查看日志';
        logBtn.style.marginLeft = '10px';
        logBtn.onclick = showLogPage;

        statusDiv = document.createElement('div');
        statusDiv.textContent = '状态:等待开始';
        statusDiv.style.marginTop = '10px';
        statusDiv.style.fontSize = '14px';

        panel.appendChild(label);
        panel.appendChild(startBtn);
        panel.appendChild(stopBtn);
        panel.appendChild(logBtn);
        panel.appendChild(statusDiv);
        document.body.appendChild(panel);

        startBtn.onclick = () => {
            intervalMinutes = parseInt(input.value, 10);
            if (isNaN(intervalMinutes) || intervalMinutes < 1) {
                alert('请输入有效的循环间隔(最小1分钟)');
                return;
            }
            startBtn.disabled = true;
            stopBtn.disabled = false;
            running = true;
            log('已启动循环,每' + intervalMinutes + '分钟执行一次');
            main();
        };

        stopBtn.onclick = () => {
            running = false;
            if (intervalId) clearInterval(intervalId);
            if (countdownId) clearInterval(countdownId);
            intervalId = null;
            countdownId = null;
            startBtn.disabled = false;
            stopBtn.disabled = true;
            log('已停止循环');
        };
    }

    setTimeout(() => {
        createControlPanel();
    }, 2000);

})();
... 阅读更多

Shopify手机端和电脑端显示不同的海报banner以及产品尺寸和位置

{% schema %}
{
  "name": "Hotends_Bulk_Sale_hengfu",
  "tag": "section",
  "class": "promotional-banner",
  "settings": [
    {
      "type": "image_picker",
      "id": "custom_background",
      "label": "上传背景图片"
    },
    {
      "type": "image_picker",
      "id": "mobile_background",
      "label": "上传手机端背景图片"
    },
    {
      "type": "range",
      "id": "section_height",
      "min": 100,
      "max": 1000,
      "step": 10,
      "unit": "px",
      "label": "模块高度",
      "default": 400
    },
    {
      "type": "range",
      "id": "mobile_section_height",
      "min": 100,
      "max": 1000,
      "step": 10,
      "unit": "px",
      "label": "手机端模块高度",
      "default": 280
    },
    {
      "type": "select",
      "id": "background_position",
      "label": "背景图片位置",
      "options": [
        { "value": "top left", "label": "左上" },
        { "value": "top center", "label": "顶部居中" },
        { "value": "top right", "label": "右上" },
        { "value": "center left", "label": "左中" },
        { "value": "center center", "label": "正中" },
        { "value": "center right", "label": "右中" },
        { "value": "bottom left", "label": "左下" },
        { "value": "bottom center", "label": "底部居中" },
        { "value": "bottom right", "label": "右下" }
      ],
      "default": "center center"
    },
    {
      "type": "select",
      "id": "background_size",
      "label": "背景图片尺寸",
      "options": [
        { "value": "cover", "label": "填充" },
        { "value": "contain", "label": "适应" },
        { "value": "auto", "label": "原始大小" }
      ],
      "default": "cover"
    },
    {
      "type": "range",
      "id": "background_opacity",
      "min": 0,
      "max": 100,
      "step": 10,
      "unit": "%",
      "label": "背景透明度",
      "default": 100
    }
  ],
  "presets": [
    {
      "name": "Hotends_Bulk_Sale_hengfu"
    }
  ]
}
{% endschema %}

<style>
.promotional-banner {
  position: relative;
  width: 100%;
  height: {{ section.settings.section_height }}px;
  overflow: hidden;
}
.promotional-banner__background,
.promotional-banner__background-mobile {
  position: absolute;
  top: 0; left: 0;
  width: 100%; height: 100%;
  object-fit: {{ section.settings.background_size }};
  object-position: {{ section.settings.background_position }};
  opacity: {{ section.settings.background_opacity | divided_by: 100.0 }};
  z-index: 1;
  display: block;
}
.promotional-banner__background-mobile {
  display: none;
}

@media screen and (max-width: 749px) {
  .promotional-banner {
    height: {{ section.settings.mobile_section_height }}px;
  }
  .promotional-banner__background {
    display: none !important;
  }
  .promotional-banner__background-mobile {
    display: block !important;
  }
}
</style>

<div class="promotional-banner">
  {% if section.settings.custom_background %}
    {{ section.settings.custom_background | image_url: width: 2000 | image_tag: 
      class: 'promotional-banner__background',
      loading: 'lazy',
      sizes: '100vw'
    }}
  {% endif %}
  {% if section.settings.mobile_background %}
    {{ section.settings.mobile_background | image_url: width: 1000 | image_tag: 
      class: 'promotional-banner__background-mobile',
      loading: 'lazy',
      sizes: '100vw'
    }}
  {% endif %}
</div>

重点说明

  • 电脑端只显示 custom_background,手机端只显示 mobile_background。
  • 高度分别用 section_height 和 mobile_section_height 控制。
  • 所有文字内容已删除,只保留背景图片。
  • 你可以在 Shopify 后台分别上传 PC 和手机端图片,并设置不同高度。
... 阅读更多

Debian 11 直接升级系统版本到 Debian 12 (bookworm)

# 1. 备份系统(如果重要)
# 2. 修改源为 Debian 12
sudo sed -i 's/bullseye/bookworm/g' /etc/apt/sources.list

# 3. 更新系统包
sudo apt update
sudo apt upgrade -y
sudo apt dist-upgrade -y

# 4. 升级完成后重启
sudo reboot

升级后是官方最新内核(通常是 6.x 版本),Docker 完美支持。
(推荐,稳定,干净)... 阅读更多

Cherry Studio Mac风格磨砂玻璃主题

样式一

/* 0323Mac风格磨砂玻璃主题 */
@font-face {
    font-family: 'LXGWWenKaiGB';
    src: url('file:///D:/Fonts/LXGWWenKaiGB-Medium.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
    font-display: swap;
    unicode-range: U+4E00-9FFF;
}

:root {
    --duration-quick: 0.15s;
    --duration-normal: 0.3s;
    --duration-long: 0.5s;
    --easing-emphasized: cubic-bezier(0.2, 0, 0, 1);
    --easing-decelerate: cubic-bezier(0, 0, 0.2, 1);
    --easing-standard: cubic-bezier(0.4, 0.0, 0.2, 1);
    --easing-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
    --radius-dynamic: 12px;
    --radius-large: 12px;

    --color-brand-primary: oklch(65% 0.05 250);
    --color-brand-hover: color-mix(in oklch, var(--color-brand-primary) 90%, black);

    --theme-lightness: 1;
    --shadow-intensity: 0.1;
    --highlight-intensity: 0.05;
    --file-line-width: 65rem;
    --font-default: 'LXGWWenKaiGB', sans-serif;

    --background-blur: 12px;

    --hover-scale: 1.01;
    --active-scale: 0.98;
    --card-translate-y: 6px;

    --chat-text-user: var(--color-text-1);

    --metal-gradient-light: linear-gradient(90deg, rgba(255, 255, 255, 0.07) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0.07) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0.07) 100%);
    --metal-gradient-dark: linear-gradient(90deg, rgba(255, 255, 255, 0.03) 0%, rgba(255, 255, 255, 0.08) 25%, rgba(255, 255, 255, 0.03) 50%, rgba(255, 255, 255, 0.08) 75%, rgba(255, 255, 255, 0.03) 100%);
    --border-glow: 0 0 5px rgba(255, 255, 255, 0.2);
}

/* 深色模式 */
body[theme-mode="dark"] {
    --background-image-url: url('https://cdnb.artstation.com/p/assets/images/images/049/289/173/large/flogging-moll-5yue1ri-6-1.jpg?1652152063');
    --background-overlay-opacity: 0.5;

    --color-background: linear-gradient(145deg, rgba(28, 28, 30, 0.6) 0%, rgba(44, 44, 46, 0.6) 100%);
    --color-background-soft: linear-gradient(145deg, rgba(44, 44, 46, 0.5) 0%, rgba(58, 58, 60, 0.5) 100%);
    --color-background-mute: linear-gradient(145deg, rgba(72, 72, 74, 0.4) 0%, rgba(99, 99, 102, 0.4) 100%);
    --navbar-background: linear-gradient(to right, rgba(28, 28, 30, 0.6) 0%, rgba(44, 44, 46, 0.6) 100%);
    --chat-background: linear-gradient(to bottom, rgba(44, 44, 46, 0.5) 0%, rgba(58, 58, 60, 0.5) 100%);
    --chat-background-user: linear-gradient(to right, rgba(30, 144, 255, 0.4) 0%, rgba(65, 172, 255, 0.4) 100%);
    --user-text-color-dark: rgba(255, 255, 255, 0.95);
    --chat-background-assistant: linear-gradient(to right, rgba(72, 72, 74, 0.4) 0%, rgba(85, 85, 87, 0.4) 100%);
    --ctp-text: rgba(255, 255, 255, 0.85);
    --shadow-color: rgba(0, 0, 0, 0.25);
    --highlight-color: rgba(255, 255, 255, 0.08);
    --deep-thinking-color: rgba(180, 180, 200, 0.9);
    --code-bg-dark: rgba(30, 30, 32, 0.7);
    --footnote-bg-dark: rgba(44, 44, 46, 0.4);
    --theme-lightness: -1;
    --shadow-intensity: 0.25;

    --border-color: rgba(255, 255, 255, 0.05);
    --border-hover-color: rgba(255, 255, 255, 0.1);
    --metal-gradient: var(--metal-gradient-dark);
}

/* 浅色模式 */
body[theme-mode="light"] {
    --background-image-url: url('https://cdna.artstation.com/p/assets/images/images/035/911/176/large/-.jpg?1616230728');
    --background-overlay-opacity: 0.25;

    --color-background: linear-gradient(145deg, rgba(255, 255, 255, 0.3) 0%, rgba(250, 250, 255, 0.3) 100%);
    --color-background-soft: linear-gradient(145deg, rgba(245, 245, 250, 0.25) 0%, rgba(240, 240, 245, 0.25) 100%);
    --color-background-mute: linear-gradient(145deg, rgba(235, 235, 240, 0.2) 0%, rgba(230, 230, 235, 0.2) 100%);
    --navbar-background: linear-gradient(to right, rgba(255, 255, 255, 0.4) 0%, rgba(250, 250, 255, 0.4) 100%);
    --chat-background: linear-gradient(to bottom, rgba(255, 255, 255, 0.3) 0%, rgba(250, 250, 255, 0.3) 100%);
    --chat-background-user: linear-gradient(to right, rgba(135, 206, 250, 0.5) 0%, rgba(165, 215, 255, 0.5) 100%);
    --chat-background-assistant: linear-gradient(to right, rgba(240, 240, 245, 0.4) 0%, rgba(235, 235, 240, 0.4) 100%);
    --color-white: rgba(255, 255, 255, 0.9);
    --ctp-text: rgba(30, 30, 30, 0.9);
    --shadow-color: rgba(0, 0, 0, 0.06);
    --highlight-color: rgba(255, 255, 255, 0.3);
    --deep-thinking-color: rgba(80, 80, 100, 0.9);
    --code-bg-light: rgba(240, 240, 245, 0.4);
    --footnote-bg-light: rgba(245, 245, 250, 0.3);
    --theme-lightness: 1;

    --border-color: rgba(255, 255, 255, 0.15);
    --border-hover-color: rgba(255, 255, 255, 0.25);
    --metal-gradient: var(--metal-gradient-light);
}

* {
    font-family: var(--font-default);
    line-height: 1.5;
    letter-spacing: -0.01em;
}

body {
    position: relative;
    background-image: var(--background-image-url);
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    background-attachment: fixed;
}

body::after {
    content: "";
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: var(--color-background);
    opacity: var(--background-overlay-opacity);
    backdrop-filter: blur(var(--background-blur));
    -webkit-backdrop-filter: blur(var(--background-blur));
    z-index: -1;
}

.message-content-container {
    will-change: transform;
    contain: layout paint style;

    background: color-mix(in srgb, var(--color-background-soft), transparent 10%) !important;
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
    transform: translateZ(0);
    -webkit-transform: translateZ(0);

    border: none;
    border-radius: var(--radius-dynamic);
    position: relative;
    z-index: 1;

    outline: none;

    transition:
        background-color var(--duration-normal) var(--easing-standard),
        box-shadow var(--duration-normal) var(--easing-standard);

    margin-block: 8px;
    padding-inline: 12px;
    padding-block: 10px;

    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}

.message-content-container::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    border-radius: var(--radius-dynamic);
    background: var(--metal-gradient);
    opacity: 0.4;
    pointer-events: none;
    z-index: -1;
    border: 0.3px solid var(--border-color);
    transition: opacity var(--duration-normal) var(--easing-standard);
}

.message-content-container:hover::before {
    opacity: 0.7;
    border-color: var(--border-hover-color);
}

@keyframes cardAppear {
    from {
        opacity: 0;
        transform: translateY(var(--card-translate-y));
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}

.chat-item {
    animation: cardAppear var(--duration-normal) var(--easing-decelerate) forwards;
}

#inputbar {
    background: color-mix(in srgb, var(--color-background), transparent 20%) !important;
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border: none;
    position: relative;
    border-radius: var(--radius-large);
    margin: -15px 20px 15px 20px;
    transition: box-shadow var(--duration-normal) var(--easing-standard);
    outline: none;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}

#inputbar::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    border-radius: var(--radius-large);
    background: var(--metal-gradient);
    opacity: 0.4;
    pointer-events: none;
    z-index: -1;
    border: 0.3px solid var(--border-color);
}

#inputbar:focus-within::before {
    opacity: 0.8;
    border-color: var(--color-brand-primary);
    box-shadow: var(--border-glow);
}

.navbar {
    background: color-mix(in srgb, var(--navbar-background), transparent 20%) !important;
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border: none;
    position: relative;
    box-shadow: 0 1px 5px rgba(0, 0, 0, 0.05);
    animation: navbarAppear var(--duration-long) var(--easing-standard) forwards;
}

.navbar::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 0.3px;
    background: var(--metal-gradient);
    opacity: 0.5;
}

@keyframes navbarAppear {
    from {
        opacity: 0;
        transform: translateY(-10px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}

.chat-container {
    background: transparent !important;
}

.chat-item.user .message-content-container {
    background: color-mix(in srgb, rgba(135, 206, 250, 0.4), transparent 20%) !important;
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
    border-left: 3px solid rgba(30, 144, 255, 0.6);
    transform: translateZ(0);
    -webkit-transform: translateZ(0);
}

.chat-item.assistant .message-content-container {
    background: color-mix(in srgb, rgba(255, 182, 193, 0.4), transparent 20%) !important;
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
    border-left: 3px solid rgba(255, 182, 193, 0.6);
    transform: translateZ(0);
    -webkit-transform: translateZ(0);
}

@media (prefers-contrast: more) {
    .message-content-container::before {
        opacity: 0.8;
        border-width: 1px;
    }

    #inputbar::before {
        opacity: 0.8;
        border-width: 1px;
    }
}

body[theme-mode="dark"] .chat-item.user .nickname,
body[theme-mode="dark"] .chat-item.user .message {
    color: var(--user-text-color-dark);
}

.chat-item .nickname,
.chat-item .message {
    color: var(--ctp-text);
}

.ant-collapse-content-box .markdown {
    color: var(--deep-thinking-color);
    background: color-mix(in srgb, var(--color-background-soft), transparent 30%) !important;
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    border-radius: 8px;
    padding: 10px 14px;
    margin-top: 8px;
    border-left: 2px solid rgba(180, 180, 200, 0.3);
}

body[theme-mode="dark"] .ant-collapse-content-box .markdown {
    background: color-mix(in srgb, var(--color-background-soft), transparent 50%) !important;
    border-left: 2px solid rgba(180, 180, 200, 0.2);
}

/* 浅色模式代码背景 - Mac OS风格 */
.shiki.one-light {
    background-color: var(--code-bg-light) !important;
    border-radius: 8px;
    position: relative;
    overflow: hidden;
    transition: box-shadow var(--duration-normal) var(--easing-standard);
}

.shiki.one-light::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    border-radius: 8px;
    background: var(--metal-gradient);
    opacity: 0.3;
    pointer-events: none;
    z-index: -1;
    border: 0.3px solid rgba(0, 0, 0, 0.05);
}

/* 深色模式代码背景 - Mac OS风格 */
.shiki.material-theme-darker {
    background-color: var(--code-bg-dark) !important;
    border-radius: 8px;
    position: relative;
    overflow: hidden;
    transition: box-shadow var(--duration-normal) var(--easing-standard);
}

.shiki.material-theme-darker::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    border-radius: 8px;
    background: var(--metal-gradient);
    opacity: 0.2;
    pointer-events: none;
    z-index: -1;
    border: 0.3px solid rgba(255, 255, 255, 0.05);
}

/* 代码块悬停效果 - 光泽变化 */
pre:hover .shiki::before {
    opacity: 0.5;
}

/* 引用来源背景透明 - Mac OS风格 */
.footnotes {
    background-color: var(--footnote-bg-light);
    border-radius: 8px;
    position: relative;
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    transition: box-shadow var(--duration-normal) var(--easing-standard);
}

.footnotes::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    border-radius: 8px;
    background: var(--metal-gradient);
    opacity: 0.3;
    pointer-events: none;
    z-index: -1;
    border: 0.3px solid rgba(0, 0, 0, 0.05);
}

body[theme-mode="dark"] .footnotes {
    background-color: var(--footnote-bg-dark);
}

body[theme-mode="dark"] .footnotes::before {
    border-color: rgba(255, 255, 255, 0.05);
    opacity: 0.2;
}

/* 保留原有样式 - 输入框高度 */
#inputbar textarea.ant-input {
    height: 120px !important;
    padding: 10px;
}

/* 按钮 - Mac OS风格(移除动效) */
button,
.ant-btn {
    border-radius: 6px;
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    transition: background-color var(--duration-quick) var(--easing-standard);
    position: relative;
    overflow: hidden;
}

/* 按钮金属质感 */
button::before,
.ant-btn::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: var(--metal-gradient);
    opacity: 0.2;
    pointer-events: none;
    z-index: -1;
}

button:hover::before,
.ant-btn:hover::before {
    opacity: 0.4;
}

/* 滚动条 - Mac OS风格 */
::-webkit-scrollbar {
    width: 8px;
    height: 8px;
}

::-webkit-scrollbar-track {
    background: transparent;
}

::-webkit-scrollbar-thumb {
    background: rgba(0, 0, 0, 0.2);
    border-radius: 4px;
    transition: background var(--duration-quick) var(--easing-standard);
    background-image: var(--metal-gradient-light);
    background-size: 100px 100%;
}

body[theme-mode="dark"] ::-webkit-scrollbar-thumb {
    background: rgba(255, 255, 255, 0.15);
    background-image: var(--metal-gradient-dark);
}

::-webkit-scrollbar-thumb:hover {
    background: rgba(0, 0, 0, 0.25);
}

body[theme-mode="dark"] ::-webkit-scrollbar-thumb:hover {
    background: rgba(255, 255, 255, 0.2);
}

/* 加载时的页面过渡效果 */
@keyframes fadeIn {
    from {
        opacity: 0;
    }

    to {
        opacity: 1;
    }
}

body {
    animation: fadeIn 0.8s var(--easing-decelerate) forwards;
}

/* 卡片的内容渐入动画 */
.message-content-container .markdown {
    opacity: 0;
    animation: fadeIn 0.4s var(--easing-decelerate) 0.1s forwards;
}

/* 链接颜色 - Mac OS风格 */
a {
    color: var(--color-brand-primary);
    transition: color var(--duration-quick) var(--easing-standard);
}

a:hover {
    color: var(--color-brand-hover);
}

/* 选中文本背景色 - Mac OS风格 */
::selection {
    background-color: color-mix(in srgb, var(--color-brand-primary), transparent 70%);
}

/* 夜间/日间模式切换按钮(移除动效) */
.theme-toggle-button {
    transition: opacity var(--duration-normal) var(--easing-emphasized);
}

.theme-toggle-button:hover {
    opacity: 0.8;
}

/* 深色模式下的气泡颜色 */
body[theme-mode="dark"] .chat-item.user .message-content-container {
    background: color-mix(in srgb, rgba(30, 144, 255, 0.3), transparent 20%) !important;
    border-left: 3px solid rgba(30, 144, 255, 0.4);
}

body[theme-mode="dark"] .chat-item.assistant .message-content-container {
    background: color-mix(in srgb, rgba(255, 182, 193, 0.3), transparent 20%) !important;
    border-left: 3px solid rgba(255, 182, 193, 0.4);
}

/* 修复注释悬停弹出窗口样式 */
/* 适用于VS Code和类似编辑器的注释悬停提示 */
.hover-contents,
.monaco-hover,
.monaco-hover-content,
.hover-row,
.markdown-hover,
.hover-tooltip,
.tooltip-content,
[role="tooltip"],
div[class*="hover"],
div[class*="tooltip"] {
    background-color: rgba(255, 255, 255, 0.95) !important;
    color: rgba(0, 0, 0, 0.9) !important;
    border: 0.5px solid rgba(0, 0, 0, 0.1) !important;
    border-radius: 6px !important;
    backdrop-filter: blur(16px) !important;
    -webkit-backdrop-filter: blur(16px) !important;
    box-shadow: 0 2px 14px rgba(0, 0, 0, 0.15) !important;
}

/* 确保深色模式下的悬停提示内容可读 */
body[theme-mode="dark"] .hover-contents,
body[theme-mode="dark"] .monaco-hover,
body[theme-mode="dark"] .monaco-hover-content,
body[theme-mode="dark"] .hover-row,
body[theme-mode="dark"] .markdown-hover,
body[theme-mode="dark"] .hover-tooltip,
body[theme-mode="dark"] .tooltip-content,
body[theme-mode="dark"] [role="tooltip"],
body[theme-mode="dark"] div[class*="hover"],
body[theme-mode="dark"] div[class*="tooltip"] {
    background-color: rgba(50, 50, 55, 0.95) !important;
    color: rgba(255, 255, 255, 0.9) !important;
    border: 0.5px solid rgba(255, 255, 255, 0.15) !important;
}

/* 悬停提示内部链接样式 */
.hover-contents a,
.monaco-hover a,
.hover-tooltip a,
.tooltip-content a,
[role="tooltip"] a,
div[class*="hover"] a,
div[class*="tooltip"] a {
    color: var(--color-brand-primary) !important;
}

/* 悬停提示内部代码块样式 */
.hover-contents code,
.monaco-hover code,
.hover-tooltip code,
.tooltip-content code,
[role="tooltip"] code,
div[class*="hover"] code,
div[class*="tooltip"] code {
    background-color: rgba(0, 0, 0, 0.05) !important;
    color: inherit !important;
    padding: 0.1em 0.3em !important;
    border-radius: 3px !important;
}

body[theme-mode="dark"] .hover-contents code,
body[theme-mode="dark"] .monaco-hover code,
body[theme-mode="dark"] .hover-tooltip code,
body[theme-mode="dark"] .tooltip-content code,
body[theme-mode="dark"] [role="tooltip"] code,
body[theme-mode="dark"] div[class*="hover"] code,
body[theme-mode="dark"] div[class*="tooltip"] code {
    background-color: rgba(255, 255, 255, 0.1) !important;
}

样式2

/* 草莓甜心MacOS (含动态特效)*/
:root {
    --duration-quick: 0.15s;
    --duration-normal: 0.3s;
    --duration-long: 0.5s;
    --easing-emphasized: cubic-bezier(0.2, 0, 0, 1);
    --easing-decelerate: cubic-bezier(0, 0, 0.2, 1);
    --easing-standard: cubic-bezier(0.4, 0.0, 0.2, 1);
    --easing-bounce: cubic-bezier(0.34, 1.56, 0.64, 1); /* 弹性动效 */
    --radius-dynamic: 12px;
    --radius-large: 12px;

    /* Mac OS色调 */
    --color-brand-primary: oklch(65% 0.05 250);
    --color-brand-hover: color-mix(in oklch, var(--color-brand-primary) 90%, black);

    /* 动态主题参数 */
    --theme-lightness: 1;
    --shadow-intensity: 0.1;
    --highlight-intensity: 0.05;
    --file-line-width: 65rem;
    --font-default: "SF Pro Text", "Helvetica Neue", "Source Han Sans CN", sans-serif;

    /* 背景图片设置 - 共享参数 */
    --background-blur: 12px;

    /* 动效参数 */
    --hover-scale: 1.01;
    --active-scale: 0.98;
    --card-translate-y: 6px;
    
    /* 修复对话气泡 */
    --chat-text-user: var(--color-text-1);    
}

/* 深色模式 - Mac OS风格 */
body[theme-mode="dark"] {
    /* 深色模式专用背景图 */
    --background-image-url: url('https://i.pinimg.com/1200x/77/9e/e6/779ee6457911761ef8aaa40cf04b2f8a.jpg');
    --background-overlay-opacity: 0.5;

    /* 护眼配色 - 深色模式更温和的色调 */
    --color-background: linear-gradient(145deg, rgba(28, 28, 30, 0.6) 0%, rgba(44, 44, 46, 0.6) 100%);
    --color-background-soft: linear-gradient(145deg, rgba(44, 44, 46, 0.5) 0%, rgba(58, 58, 60, 0.5) 100%);
    --color-background-mute: linear-gradient(145deg, rgba(72, 72, 74, 0.4) 0%, rgba(99, 99, 102, 0.4) 100%);
    --navbar-background: linear-gradient(to right, rgba(28, 28, 30, 0.6) 0%, rgba(44, 44, 46, 0.6) 100%);
    --chat-background: linear-gradient(to bottom, rgba(44, 44, 46, 0.5) 0%, rgba(58, 58, 60, 0.5) 100%);
    --chat-background-user: linear-gradient(to right, rgba(0, 88, 208, 0.15) 0%, rgba(10, 132, 255, 0.15) 100%);
    --user-text-color-dark: rgba(255, 255, 255, 0.9);
    --chat-background-assistant: linear-gradient(to right, rgba(44, 44, 46, 0.4) 0%, rgba(58, 58, 60, 0.4) 100%);
    --ctp-text: rgba(255, 255, 255, 0.85);
    --shadow-color: rgba(0, 0, 0, 0.25);
    --highlight-color: rgba(255, 255, 255, 0.08);
    --deep-thinking-color: rgba(10, 132, 255, 0.9);
    --code-bg-dark: rgba(30, 30, 32, 0.7);
    --footnote-bg-dark: rgba(44, 44, 46, 0.4);
    /* 动态主题参数 */
    --theme-lightness: -1;
    --shadow-intensity: 0.25;
}

/* 浅色模式 - Mac OS风格 (优化版) */
body[theme-mode="light"] {
    /* 浅色模式专用背景图 */
    --background-image-url: url('https://www.sanrio.com.tw/wp-content/uploads/2019/04/MIX-Desktop-01.jpg');
    --background-overlay-opacity: 0.25;

    /* 更清晰的浅色调 - 去除护眼蒙版效果 */
    --color-background: linear-gradient(145deg, rgba(255, 255, 255, 0.3) 0%, rgba(250, 250, 255, 0.3) 100%);
    --color-background-soft: linear-gradient(145deg, rgba(245, 245, 250, 0.25) 0%, rgba(240, 240, 245, 0.25) 100%);
    --color-background-mute: linear-gradient(145deg, rgba(235, 235, 240, 0.2) 0%, rgba(230, 230, 235, 0.2) 100%);
    --navbar-background: linear-gradient(to right, rgba(255, 255, 255, 0.4) 0%, rgba(250, 250, 255, 0.4) 100%);
    --chat-background: linear-gradient(to bottom, rgba(255, 255, 255, 0.3) 0%, rgba(250, 250, 255, 0.3) 100%);
    --chat-background-user: linear-gradient(to right, rgba(210, 230, 255, 0.4) 0%, rgba(220, 235, 255, 0.4) 100%);
    --chat-background-assistant: linear-gradient(to right, rgba(250, 250, 255, 0.3) 0%, rgba(245, 245, 250, 0.3) 100%);
    --color-white: rgba(255, 255, 255, 0.9);
    --ctp-text: rgba(30, 30, 30, 0.9);
    --shadow-color: rgba(0, 0, 0, 0.06);
    --highlight-color: rgba(255, 255, 255, 0.3);
    --deep-thinking-color: rgba(0, 88, 208, 0.85);
    --code-bg-light: rgba(240, 240, 245, 0.4);
    --footnote-bg-light: rgba(245, 245, 250, 0.3);
    /* 动态主题参数 */
    --theme-lightness: 1;
}

/* 基础架构 */
* {
    font-family: var(--font-default);
    line-height: 1.5;
    letter-spacing: -0.01em;
}

/* 背景图片设置 - 分主题设置 */
body {
    position: relative;
    background-image: var(--background-image-url);
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    background-attachment: fixed;
}

/* 背景叠加层 */
body::after {
    content: "";
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: var(--color-background);
    opacity: var(--background-overlay-opacity);
    backdrop-filter: blur(var(--background-blur));
    -webkit-backdrop-filter: blur(var(--background-blur));
    z-index: -1;
}

/* 消息容器 - Mac OS磨砂玻璃风格(增强动效) */
.message-content-container {
    /* 物理渲染层 */
    transform: translateZ(0);
    will-change: transform, box-shadow, opacity;
    contain: layout paint style;

    /* 动态样式 - Mac OS磨砂玻璃效果 */
    background: color-mix(in srgb, var(--color-background-soft), transparent 50%) !important;
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    border: 0.5px solid rgba(255, 255, 255, 0.2);
    border-radius: var(--radius-dynamic);

    /* 简化边缘 */
    outline: none;

    /* 增强动效过渡 */
    transition:
        transform var(--duration-normal) var(--easing-emphasized),
        box-shadow var(--duration-normal) var(--easing-decelerate),
        background-color var(--duration-normal) var(--easing-standard),
        border-color var(--duration-quick) var(--easing-standard);

    /* 逻辑属性 */
    margin-block: 8px;
    padding-inline: 12px;
    padding-block: 10px;

    /* Mac OS风格阴影 - 更加柔和 */
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);

    &:hover {
        transform: scale(var(--hover-scale)) translateY(-2px);
        box-shadow: 0 8px 20px rgba(0, 0, 0, 0.12);
        border-color: rgba(255, 255, 255, 0.3);
        backdrop-filter: none; /* 移除悬停时的模糊 */
        -webkit-backdrop-filter: none; /* 移除悬停时的模糊 */
    }

    &:active {
        transform: scale(var(--active-scale));
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
        transition-duration: 0.1s;
    }
}

/* 消息出现动画 */
@keyframes cardAppear {
    from {
        opacity: 0;
        transform: translateY(var(--card-translate-y));
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}

.chat-item {
    animation: cardAppear var(--duration-normal) var(--easing-decelerate) forwards;
}

/* 输入栏优化 - Mac OS磨砂玻璃风格(增强动效) */
#inputbar {
    background: color-mix(in srgb, var(--color-background), transparent 40%) !important;
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    border: 0.5px solid rgba(255, 255, 255, 0.3);
    border-radius: var(--radius-large);
    margin: -15px 20px 15px 20px;
    transition: all var(--duration-normal) var(--easing-standard);

    /* 简化边缘 */
    outline: none;

    /* Mac OS风格阴影 */
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);

    &:focus-within {
        transform: translateY(-2px) scale(1.005);
        border-color: var(--color-brand-primary);
        box-shadow: 0 8px 20px rgba(0, 0, 0, 0.12);
    }
}

/* 导航栏半透明效果 - Mac OS风格 */
.navbar {
    background: color-mix(in srgb, var(--navbar-background), transparent 40%) !important;
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    border-bottom: 0.5px solid rgba(255, 255, 255, 0.2);
    box-shadow: 0 1px 5px rgba(0, 0, 0, 0.05);
    animation: navbarAppear var(--duration-long) var(--easing-standard) forwards;
}

@keyframes navbarAppear {
    from {
        opacity: 0;
        transform: translateY(-10px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}

/* 聊天容器半透明效果 */
.chat-container {
    background: transparent !important;
}

/* 用户消息半透明效果 - Mac OS风格(增强动效) */
.chat-item.user .message-content-container {
    background: color-mix(in srgb, var(--chat-background-user), transparent 50%) !important;
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    border: 0.5px solid rgba(255, 255, 255, 0.25);
    transition: all var(--duration-normal) var(--easing-standard);
}

/* 助手消息半透明效果 - Mac OS风格(增强动效) */
.chat-item.assistant .message-content-container {
    background: color-mix(in srgb, var(--chat-background-assistant), transparent 50%) !important;
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    border: 0.5px solid rgba(255, 255, 255, 0.15);
    transition: all var(--duration-normal) var(--easing-standard);
}

/* 深色模式适配 - Mac OS风格 */
body[theme-mode='dark'] {
    .message-content-container {
        border-color: rgba(255, 255, 255, 0.1);

        &:hover {
            border-color: rgba(255, 255, 255, 0.2);
        }
    }

    #inputbar {
        border-color: rgba(255, 255, 255, 0.1);

        &:focus-within {
            border-color: color-mix(in oklch, var(--color-brand-primary), transparent 30%);
        }
    }

    .navbar {
        border-bottom-color: rgba(255, 255, 255, 0.1);
    }
}

/* 高对比度模式 */
@media (prefers-contrast: more) {
    .message-content-container {
        border-width: 1.5px;
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
    }
}

/* 深色模式下用户名和消息的字体颜色 */
/* 使用更具体的选择器,提高优先级 */
body[theme-mode="dark"] .chat-item.user .nickname,
body[theme-mode="dark"] .chat-item.user .message {
    color: var(--user-text-color-dark);
}

/* 其他用户名和消息的字体颜色保持不变 */
.chat-item .nickname,
.chat-item .message {
    color: var(--ctp-text);
}

/* 深度思考展开字体颜色 - Mac OS风格 */
.ant-collapse-content-box .markdown {
    color: var(--deep-thinking-color);
}

/* 浅色模式代码背景 - Mac OS风格 */
.shiki.one-light {
    background-color: var(--code-bg-light) !important;
    border-radius: 8px;
    border: 0.5px solid rgba(0, 0, 0, 0.1);
    transition: all var(--duration-normal) var(--easing-standard);
}

/* 深色模式代码背景 - Mac OS风格 */
.shiki.material-theme-darker {
    background-color: var(--code-bg-dark) !important;
    border-radius: 8px;
    border: 0.5px solid rgba(255, 255, 255, 0.1);
    transition: all var(--duration-normal) var(--easing-standard);
}

/* 代码块悬停效果 */
pre:hover .shiki {
    transform: translateY(-2px);
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}

/* 引用来源背景透明 - Mac OS风格 */
.footnotes {
    background-color: var(--footnote-bg-light);
    border-radius: 8px;
    border: 0.5px solid rgba(0, 0, 0, 0.1);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
    transition: all var(--duration-normal) var(--easing-standard);
}

body[theme-mode="dark"] .footnotes {
    background-color: var(--footnote-bg-dark);
    border: 0.5px solid rgba(255, 255, 255, 0.1);
}

/* 保留原有样式 - 输入框高度 */
#inputbar textarea.ant-input {
    height: 120px !important;
    padding: 10px;
}

/* 按钮 - Mac OS风格(增强动效) */
button,
.ant-btn {
    border-radius: 6px;
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
    transition: all var(--duration-quick) var(--easing-standard);

    &:hover {
        transform: translateY(-1px);
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
    }

    &:active {
        transform: scale(0.97);
        transition-duration: 0.1s;
    }
}

/* 滚动条 - Mac OS风格 */
::-webkit-scrollbar {
    width: 8px;
    height: 8px;
}

::-webkit-scrollbar-track {
    background: transparent;
}

::-webkit-scrollbar-thumb {
    background: rgba(0, 0, 0, 0.2);
    border-radius: 4px;
    transition: background var(--duration-quick) var(--easing-standard);
}

body[theme-mode="dark"] ::-webkit-scrollbar-thumb {
    background: rgba(255, 255, 255, 0.2);
}

::-webkit-scrollbar-thumb:hover {
    background: rgba(0, 0, 0, 0.3);
}

body[theme-mode="dark"] ::-webkit-scrollbar-thumb:hover {
    background: rgba(255, 255, 255, 0.3);
}

/* 加载时的页面过渡效果 */
@keyframes fadeIn {
    from {
        opacity: 0;
    }

    to {
        opacity: 1;
    }
}

body {
    animation: fadeIn 0.8s var(--easing-decelerate) forwards;
}

/* 卡片的内容渐入动画 */
.message-content-container .markdown {
    opacity: 0;
    animation: fadeIn 0.4s var(--easing-decelerate) 0.1s forwards;
}

/* 链接颜色 - Mac OS风格 */
a {
    color: var(--color-brand-primary);
    transition: color var(--duration-quick) var(--easing-standard);
}

a:hover {
    color: var(--color-brand-hover);
}

/* 选中文本背景色 - Mac OS风格 */
::selection {
    background-color: color-mix(in srgb, var(--color-brand-primary), transparent 70%);
}

/* 夜间/日间模式切换按钮动效 */
.theme-toggle-button {
    transition: all var(--duration-normal) var(--easing-emphasized);
}

.theme-toggle-button:hover {
    transform: rotate(30deg) scale(1.1);
}

来源:https://linux.do/t/topic/501913/14

... 阅读更多