// ==UserScript==
// @name YuanBao Chat Width Optimized
// @namespace http://tampermonkey.net/
// @version 1.4
// @description Optimized chat width with breathing space and minimal toggle
// @author Bela Proinsias
// @match https://yuanbao.tencent.com/chat/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=tencent.com
// @grant GM_addStyle
// @grant GM.registerMenuCommand
// @grant GM_getValue
// @grant GM_setValue
// @license MIT
// @downloadURL https://update.greasyfork.icu/scripts/533156/YuanBao%20Chat%20Width%20Optimized.user.js
// @updateURL https://update.greasyfork.icu/scripts/533156/YuanBao%20Chat%20Width%20Optimized.meta.js
// ==/UserScript==
(function () {
"use strict";
const STORAGE_KEY = "yuanbao-chat-width";
const CSS_VARS = `
:root {
--chat-container-width: 85%;
--toggle-size: 32px;
--toggle-color: #FF7EB6;
--toggle-bg: linear-gradient(145deg, #FFDEE9, #FFB3D9);
--bubble-bg: rgba(255, 222, 233, 0.95);
}
`;
let currentWidth = GM_getValue(STORAGE_KEY, 85);
let styleElement;
let toggle;
function applyOptimizedStyles() {
const dynamicStyles = `
${CSS_VARS}
.agent-chat__list__item__content {
max-width: var(--chat-container-width) !important;
margin: 0 auto !important;
transition: max-width 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}
#widthToggle {
width: var(--toggle-size);
height: var(--toggle-size);
border-radius: 12px;
background: var(--toggle-bg);
border: none;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
position: fixed;
bottom: 24px;
right: 24px;
z-index: 9999;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
transition: all 0.3s cubic-bezier(0.22, 0.61, 0.36, 1);
}
#widthToggle:hover {
transform: scale(1.1) rotate(12deg);
box-shadow: 0 6px 16px rgba(0,0,0,0.2);
}
#widthToggle:active {
transform: scale(0.95);
}
#widthToggle::before {
content: attr(data-percent);
position: absolute;
right: calc(100% + 10px);
top: 50%;
transform: translateY(-50%);
background: var(--bubble-bg);
color: #E83F6F;
font-size: 12px;
padding: 6px 12px;
border-radius: 8px;
font-family: 'Microsoft Yahei', sans-serif;
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: all 0.3s ease;
border: 2px solid #FFB3D9;
}
#widthToggle::after {
content: '➤';
position: absolute;
right: 100%;
top: 50%;
transform: translate(40%, -50%) rotate(-90deg);
color: var(--bubble-bg);
font-size: 16px;
opacity: 0;
transition: all 0.3s ease;
}
#widthToggle:hover::before,
#widthToggle:hover::after {
opacity: 1;
transform: translate(0, -50%) rotate(0deg);
}
#widthToggle span {
width: 60%;
height: 60%;
background: url('data:image/svg+xml;utf8,');
background-size: contain;
transition: transform 0.3s ease;
}
`;
if (!styleElement) {
styleElement = document.createElement("style");
document.head.appendChild(styleElement);
}
styleElement.textContent = dynamicStyles;
}
function createFloatingToggle() {
toggle = document.createElement("button");
toggle.id = "widthToggle";
toggle.title = "reset width";
toggle.innerHTML = "";
toggle.setAttribute("data-percent", `${currentWidth}%`);
toggle.addEventListener("click", () => {
currentWidth = 85;
updateWidth();
toggle.style.background = "linear-gradient(145deg, #FFB3D9, #FF8CC6)";
setTimeout(() => {
toggle.style.background = CSS_VARS.match(/--toggle-bg: (.*?);/)[1];
}, 200);
});
toggle.addEventListener("wheel", (e) => {
e.preventDefault();
currentWidth += e.deltaY > 0 ? -1 : 1;
currentWidth = Math.min(120, Math.max(60, currentWidth));
updateWidth();
});
document.body.appendChild(toggle);
}
function updateWidth() {
GM_setValue(STORAGE_KEY, currentWidth);
document.documentElement.style.setProperty(
"--chat-container-width",
`${currentWidth}%`
);
toggle.setAttribute("data-percent", `${currentWidth}%`);
document
.querySelectorAll(".agent-chat__list__item__content")
.forEach((el) => {
el.style.transform = "scale(0.98)";
setTimeout(() => (el.style.transform = "scale(1)"), 200);
});
}
function init() {
applyOptimizedStyles();
createFloatingToggle();
updateWidth();
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
})();