// ==UserScript==
// @name ChatGPT 界面优化
// @version 2023.6.3
// @description 隐藏侧边栏快捷键、输入框大小、窗口宽度自定义调整
// @match https://chat.openai.com/*
// @grant GM_addStyle
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_registerMenuCommand
// @grant GM_unregisterMenuCommand
// @namespace your-unique-namespace
// @license MIT
// @downloadURL none
// ==/UserScript==
(async () => {
// #region >>>>>- 页面设置 -<<<<<
let height = GM_getValue('height', 0); // 文本框高度
let width = GM_getValue('width', 0); // 输入框宽度
let windowWidth = GM_getValue('windowWidth', 0); // 对话窗口宽度
let HideTheBottomSisclaimer = GM_getValue('HideTheBottomSisclaimer', true); // 隐藏底部免责声明
let ThumbsUpFeedback = GM_getValue('ThumbsUpFeedback', true); // 隐藏赞、踩反馈按钮
// 快捷键
let keyModifier = GM_getValue('keyModifier', 'ctrl'); // 键修饰符
let keyLetter = GM_getValue('keyLetter', 'b'); // 键字母
function openDialog() {
let dialog = document.createElement('div');
dialog.id = 'Tampermonkey_setting_Box'
dialog.innerHTML = `
`;
document.body.appendChild(dialog); // 添加到页面中
// 点击确定按钮
document.getElementById('dialogOK').onclick = function () {
let newHeight = document.getElementById('dialogHeight').value;
let newWidth = document.getElementById('dialogWidth').value;
let newWindowWidth = document.getElementById('dialogWindowWidth').value;
let newHideTheBottomSisclaimer = document.getElementById('HideTheBottomSisclaimer').checked;
let newThumbsUpFeedback = document.getElementById('ThumbsUpFeedback').checked;
let newKeyModifier = document.getElementById('keyModifier').value;
let newKeyLetter = document.getElementById('keyLetter').value;
GM_setValue('height', Number(newHeight));
GM_setValue('width', Number(newWidth));
GM_setValue('windowWidth', Number(newWindowWidth));
GM_setValue('HideTheBottomSisclaimer', newHideTheBottomSisclaimer);
GM_setValue('ThumbsUpFeedback', newThumbsUpFeedback);
GM_setValue('keyModifier', newKeyModifier);
GM_setValue('keyLetter', newKeyLetter);
location.reload();
};
// 点击取消按钮
document.getElementById('dialogCancel').onclick = function () {
document.body.removeChild(dialog);
};
}
GM_registerMenuCommand('设置', openDialog);
// #endregion
// >>>>>- 隐藏侧边栏快捷键 -<<<<<
if (keyModifier) {
const DOMSidebarButtons = 'a[class="flex p-3 gap-3 transition-colors duration-200 text-white cursor-pointer text-sm rounded-md border border-white/20 hover:bg-gray-500/10 h-11 w-11 flex-shrink-0 items-center justify-center"]';
// 等待 chatgpt 加载完毕
await isLoaded();
function isLoaded() {
return new Promise(resolve => {
var intervalId = setInterval(() => {
if (document.querySelector(DOMSidebarButtons)) {
clearInterval(intervalId);
resolve();
}
}, 100);
});
}
// 侧边栏按钮
let sidebarButtons = document.querySelector(DOMSidebarButtons);
// 监听页面的 DOM 变化,当新元素添加到页面时,重新插入全屏按钮
var navObserver = new MutationObserver(([{ addedNodes, type }]) => {
if (type === 'childList' && addedNodes.length) {
setTimeout(() => {
sidebarButtons = document.querySelector(DOMSidebarButtons); // 重新获取侧边栏按钮
}, 20);
}
})
// 开始监听整个页面的 DOM 变化
navObserver.observe(document.documentElement, { childList: true, subtree: true })
// 快捷键
window.addEventListener('keydown', (event) => {
if (event[`${keyModifier}Key`] && event.key.toLowerCase() === keyLetter.toLowerCase()) {
sidebarButtons.click();
}
});
}
// >>>>>- style -<<<<<
GM_addStyle(`
/* 文本框高度 */
#prompt-textarea {
max-height: ${20.6 + (0.659 * Number(height))}vh !important;
}
/* 输入宽度 */
.stretch {
max-width: ${48 + (0.72 * Number(width))}rem !important;
}
/* 对话框宽度 */
.text-base {
max-width: ${48 + (0.72 * Number(windowWidth))}rem !important
}
/* 全屏按钮样式 */
#fullWindow-button {
right: 3rem !important;
cursor: pointer !important;
transition: 0.2s all !important;
}
#fullWindow-button:hover {
background-color: #ECECF1 !important;
}
/* Tampermonkey 设置 Box */
#Tampermonkey_setting_Box {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
z-index: 9999;
}
/* 设置 */
#qwerSettingBox {
padding: 20px;
border-radius: 5px;
width: 367px;
height: 490px;
background: rgba(255, 255, 255, 0.93);
backdrop-filter: blur(25px);
margin-top: 100px;
}
/* 设置标题 */
#qwerSettingBox_title {
margin-top: 0;
color: #5F6368;
text-align: center;
margin-bottom: 20px;
}
/* 设置提示内容 */
#qwerSettingBox_hint {
margin-top: 0;
color: #ff9916;
text-align: center;
margin-bottom: 10px;
font-size: 14px;
}
/* label */
.qwerSettingBox_label {
display: block;
margin-bottom: 10px;
color: #5F6368;
display: flex;
align-items: center;
justify-content: space-between;
}
.qwerSettingBox_label .input {
width: 118px;
height: 31px;
border-radius: 8px;
}
/* 按钮开关 */
.qwerSettingBox_label #fullScreenMode,
.qwerSettingBox_label #HideTheBottomSisclaimer,
.qwerSettingBox_label #ThumbsUpFeedback,
.qwerSettingBox_label #HoverDisplay_ {
margin-right: 76px;
border-radius: 20px;
width: 40px;
height: 20px;
cursor: pointer;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
outline: none;
}
/* 快捷键 */
.qwerSettingBox_label #keyLetter {
width: 25px;
height: 31px;
border-radius: 8px;
padding: 0px 5px;
}
.qwerSettingBox_label #keyModifier {
width: 69px;
height: 31px;
border-radius: 8px;
padding: 0px 5px;
}
.qwerSettingBox_label .FullScreenModeShortcutKeys {
display: flex;
align-items: center;
width: 118px;
justify-content: space-between;
}
/* 按钮 */
#qwerSettingBox_button {
margin-top: 30px;
display: flex;
justify-content: space-evenly;
}
#qwerSettingBox_button button {
transition: all 0.2s;
color: white;
border: none;
width: 67px;
height: 38px;
cursor: pointer;
border-radius: 4px;
}
/* 隐藏底部免责声明 */
${HideTheBottomSisclaimer ? `div[class="px-3 pb-3 pt-2 text-center text-xs text-gray-600 dark:text-gray-300 md:px-4 md:pb-6 md:pt-3"] {
display: none !important;
}
div[class="relative flex h-full flex-1 items-stretch md:flex-col"] {
margin-bottom: 45px !important;
}
` : ''
}
/* 隐藏点赞反馈按钮 */
${ThumbsUpFeedback ? `div [class='flex gap-1'] {
display: none !important;
}
` : ''
}
@media (min-width: 1280px) {
.text-base {
padding-left: 1rem !important;
padding-right: 1rem !important;
}
}
@media (min-width: 1024px) {
.text-base {
padding-left: 1rem !important;
padding-right: 1rem !important;
}
}
@media (min-width: 1280px) {
.stretch {
padding-left: 1rem !important;
padding-right: 1rem !important;
}
}
@media (min-width: 1024px) {
.stretch {
padding-left: 1rem !important;
padding-right: 1rem !important;
}
}
#dialogCancel:hover {
box-shadow: 0px 0px 20px 0px rgb(0 0 0 / 28%);
transform: translateY(-2px);
}
#dialogOK:hover {
box-shadow: 0px 0px 20px 0px rgb(0 0 0 / 28%);
transform: translateY(-2px);
}`)
})()