在处理产品数据、订单信息或任何包含大量重复格式文本的工作中,我们经常需要从成百上千行数据里提取出关键信息,比如 SKU (商品唯一编码)。一行一行地手动复制粘贴不仅效率低下,还极易出错。... 阅读更多
作者: 行政
如何解决 Augment 插件无法在VScode使用的问题?
很多用户在使用 Augment 插件时遇到了插件显示红色,无法正常使用的问题。这可能是由于多种原因导致的,例如登录状态异常、插件配置错误等。... 阅读更多
一键 SQL 清理 WooCommerce 产品数据
有时候我们产品数量太多需要清理的时候,如果通过后台一个一个删除会很慢,因此可以直接通过数据库进行清理,注意:下面的命令会 彻底清空 WooCommerce 所有产品及相关数据(包括产品分类关系、属性、库存、元数据等),不可恢复!
执行前请 完整备份数据库,并确认表前缀(默认是 wp_
,多站点或自定义可能不同:... 阅读更多
通过谷歌云 GoogleCloud GCP 试用金 300 选择 gemini AI 模型并加入自己的中转站
1、提前注册准备好一个谷歌云账号,然后绑定信用卡免费获得试用金300... 阅读更多
小皮面板(phpstudy) wordpress 多站点配置后 重定向的次数过多 问题
优化后的完整 Nginx 配置:... 阅读更多
WordPress 多站点终极指南:从零开始安装与配置(子目录与子域名模式)
WordPress 多站点终极指南:从零开始安装与配置(子目录与子域名模式)
WordPress 的多站点(Multisite)功能是一个非常强大但常被忽视的特性。它允许您通过一次 WordPress 安装,创建和管理一个由多个独立站点组成的“网络”。无论您是想为公司的不同部门创建站点、为学校社团提供博客平台,还是为客户管理多个网站,多站点功能都能极大地简化您的工作流程。... 阅读更多
小皮面板 phpstudy 安装8.0-8.3环境教程
PHP官方下载链接: https://windows.php.net/download/... 阅读更多
windows 系统 本地 http://localhost/ 配置启用ssl 变为https://localhost/
汇总一个Gemini和Claude回答质量优化的多个Prompt
前言
由于经常使用Gemini和Claude回答知识性问题,感觉到它们两个各有缺陷... 阅读更多
我的 Docker 服务标准部署流程:集成 Nginx Proxy Manager 禁止公网IP泄露访问
一、前言与目标
在服务器上部署多个 Docker 服务时,我们常常会遇到一个问题:每个服务都想占用一个端口,导致我们需要记住一堆 IP地址:端口号
,例如 http://1.2.3.4:8080
, http://1.2.3.4:8090
等。这种方式不仅管理混乱,而且直接暴露端口在公网上也存在安全风险,同时还无法方便地使用 HTTPS 加密。... 阅读更多
1美元体验试用享受 ChatGPT Team
创建 “自定义代码块”,支持在 Shopify 页面中自由插入任意 HTML / CSS / JavaScript 内容
支持:... 阅读更多
大健云仓自动导入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 完美支持。
(推荐,稳定,干净)... 阅读更多
shopify 新增页面选择多标签组对应不同的SKU单独区分
新增自定义块,然后引用即可:... 阅读更多
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
... 阅读更多
Google one ai premium教育优惠免费15个月
美国edu邮箱接码即可:... 阅读更多
shopif产品详情页添加自定义内容
在 Dawn 主题中,产品表单实际上是在 buy-buttons.liquid 组件中。让我们按步骤来操作... 阅读更多