您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
美化Poe网页版UI样式
// ==UserScript== // @name PoeUI // @namespace http://xiaomizha.ltd/ // @version 0.1 // @description 美化Poe网页版UI样式 // @author xuyou // @description:en We embellished the Poe web UI style. // @description:zh-CN 美化Poe网页版UI样式 // @license MIT // @match https://poe.com/* // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAolBMVEVHcEz6Uvy1QfqUQuefTOPxUPxNVb5GYLh6S9dPVL+2Qvn1UvywQfaLQuONQuP+UfpXRMbQS//8Uvy+QP////+3QPudQeyxQPekQPCUQedZRMeqQfOCQN5iQsxPRcGLQuJHSLvDQ/96QtlyQ9VqQ9DRTf/uV//KR//jVv9GVLbZU//6U/7Oivutfurz6v2YLOy3WfeUb9+/m++zLPvXrfniyfqv1uwAAAAAE3RSTlMA75uUH2/I/WaW66DF68XA6s3NFufBpwAABBtJREFUWIWVl4t2qkoMhqetdmvbfTvIrWItImpVmAr4/q92ZibJ3EA5J6zVtWzN1+TPnwEYc2Mymz//Wb3L+FDxqeJLxo8fz/PZhN2L+VbGSsS7YTgIEfOb6U+FCCIoxMe7IYwiZptiU/iIj6FGRMz6+b82MnoEt41PTXj2839mWTaA6DM0ws3PVGx6iPeeFF8a4fz/9XptGMUtKTw1rf7XMjLB2Jg+toUz0iFXaP3TdK0R/0cKmkUqwydsiGBJ4RO+0D9pehtxe6aSAY6KokjlD/dhzO1XQSU8RREi7CI2Q1L01ZxDAT4hc2sonBoA8YlViP1NksRhZGl1qS7DUXz4WzphM5EPhBQI9eJO1FuPMGOPiQoqgt/NFwS7D8GYs7clEhJVRHQ/f7EonNPm85m9LEWYIqoxwMXMQyL+sKUCaEQzBmhW7kjZMrYIyZgEQoSV6woWx4oAbfBuUXfVcIjZVlVTLzqZbBZEAgDBq3NXL66cRyAH+co9arbXRd1UF0CsNEAioHhOaqY9d6M3oZGC+mBhqPJbyL9yVJNzToiUzK0YxRW+SFIIgCK0IFGXoCu6um44ENZp1tR1B4Bsg3Pa4ppKgGLAr8+JkhOG0aSohMqpsQ8E0JYqQGwAMFK0EwctOXyqYM8NQBGwgtACiMAv0ZKihTI1E/wbnd0sCANFQA1gpGf4hCtGABgIAfC0YQESsAIYKQFwpjcACiEAQLAAsQVQS4oAmCgCyFsSIGMQgKYgEVMzEgFAZwEgDAIbEIOtOlpSGCPvAwSC5VABGalFY13rWnlCumLJpZFoPwiAS8ICIJCVW/RF27ZL66gQzqYzD6wsbaUQsoJcXt8AbsmZsV7TJR16AIDvXWjFWJ7nWMS5u+oSKN86beDslgVcu0bfjjO2zyUCGG0rtv38fScadWLYN1O2V4TcleJO1FzfxRSBlfu9XUQ3BuhITSyClZKw10WcxwAVaKEPLHYsy9IilGOAb+9eyo6SQIh8FFBzM1JJ+Mn+Ho9YxP6/AL7xPkhV/GKvh6ONOKJU5+Hg5Cu8o0dPbHo4HI6mDwB0LW5I0IbiitW1FOaO7fuYyE9mbLI72AgFqDE/oMMCjk3jbWNu8frwoAiIAEBAvrIRgwsSiWek6W5HRQiEBJTGmeqoMITQLAj08SQf03Y7CyEA51zNw4M4jWgl1HPiq00ou27vuRu6GKziER5VTyeDOJRl6bhbMnJbCbsIfFaenmyEdoW9pRYhDvVA9IvP75OHKAcRQRA4iDfzwvDgEA6Ou3M91NCqQuS/2K8sJ4hbCGCIH2Fu1HRfmh4AQIjjwetD90CEF+bFb5dwWwpAvPn5MAtfTE8Ko8W0ny8ddRqRgop4HExXVXhSeH2Ao26ny5hMX/95wD56iJe/j1P/9f9fo6ydU4aSQJkAAAAASUVORK5CYII= // @grant GM_registerMenuCommand // ==/UserScript== ;(() => { ;('use strict') // 重构 Login UI // 默认配置 const borderRadius = '4px' const paddingCustom = '16px' const marginCustom = '20px' const colorCustomLi = '#EFEFFC' const colorCustom = '#5D5CDE' const borderCustom = '1px solid #e6e7e9' const fontFamilyLists = [ { name: 'Loto', href: 'https://fonts.googleapis.com/css2?family=Lato&display=swap' }, { name: 'Pathway Extreme', href: 'https://fonts.googleapis.com/css2?family=Pathway+Extreme&display=swap' } ] const fontFamily = 'Lato, "Pathway Extreme", "Microsoft YaHei", sans-serif' // 修改初始样式 // Modify initial style const setInitialStyle = () => { // 创建<style>标签 let styles = document.createElement('style') // 设置字体样式 let css = ` * { transition : all .3s; caret-color : ${colorCustom}; font-family : ${fontFamily} !important; -webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important; text-shadow : 0 0 1.15px #a4a09ad9, 0 0 1px #7b7b7bcc, 0 0 0.75px #302f2d45 !important; } ::selection { color : #FFFFFF !important; background : ${colorCustom} !important; text-shadow: none !important; } ` // 添加CSS规则 styles.append(document.createTextNode(css)) // 将<style>标签加到head中 document.head.appendChild(styles) // 动态添加 @import 规则 fontFamilyLists.forEach((item) => { styles.sheet.insertRule(`@import url(${item.href});`) }) } // 美化登录页 const setLoginStyle = () => { let buttonBase = document.querySelectorAll('[class^=Button_buttonBase__]') buttonBase.forEach((elem) => { setCss(elem, { borderRadius: borderRadius, paddingTop: paddingCustom, paddingBottom: paddingCustom }) }) } // 全选所有历史记录 GM_registerMenuCommand('全选所有历史记录', () => { // 执行全选操作 let checkbox = document.querySelectorAll('.Checkbox_checkbox__zM_Lo') for (var i = 0; i < checkbox.length; i++) { if (!checkbox[i].checked) { checkbox[i].click() } } }) // 聊天区最大化 const setChatStyle = () => { let leftSidebar = document.querySelector( '[class^=PageWithSidebarLayout_leftSidebar__]' ) setCss(leftSidebar, { flexGrow: 1 }) let mainSection = document.querySelector( '[class^=PageWithSidebarLayout_mainSection__]' ) setCss(mainSection, { flexGrow: 2, maxWidth: 'initial' }) let rightSidebar = document.querySelector( '[class^=PageWithSidebarLayout_rightSidebar__]' ) setCss(rightSidebar, { display: 'none' }) let welcomeButtonsContainer = document.querySelectorAll( '[class^=ChatWelcomeView_welcomeButtonsContainer__]' ) welcomeButtonsContainer.forEach((elem) => { setCss(elem, { borderRadius: borderRadius }) }) let humanMessageBubble = document.querySelectorAll( '[class^=Message_humanMessageBubble__]' ) humanMessageBubble.forEach((elem) => { setCss(elem, { borderRadius: borderRadius }) }) let botMessageBubble = document.querySelectorAll( '[class^=Message_botMessageBubble__]' ) botMessageBubble.forEach((elem) => { setCss(elem, { borderRadius: borderRadius }) }) let textInput = document.querySelector( '[class^=ChatMessageInputView_textInput__]' ) setCss(textInput, { paddingTop: marginCustom, borderRadius: borderRadius }) let sendButtonWrapper = document.querySelector( '[class^=ChatMessageInputView_sendButtonWrapper__]' ) setCss(sendButtonWrapper, { bottom: 'initial', top: '50%', transform: 'translateY(-50%)', right: '10px' }) let sendButton = document.querySelector( '[class*=ChatMessageInputView_sendButton__]' ) setCss(sendButton, { borderRadius: '50%' }) let messageOverflowButton = document.querySelectorAll( '[class^=ChatMessage_messageOverflowButton__]' ) messageOverflowButton.forEach((elem) => { setCss(elem, { alignSelf: 'flex-end' }) }) let itemList = document.querySelectorAll( '[class^=DropdownMenuItemList_itemList__]' ) itemList.forEach((elem) => { setCss(elem, { borderRadius: borderRadius }) }) } // 美化侧边栏 const setChatSidebarStyle = () => { let sidebarContainer = document.querySelector( '[class^=ChatPageSidebar_sidebarContainer__]' ) setCss(sidebarContainer, { maxWidth: 'initial' }) let sidebar = document.querySelector('[class^=ChatPageSidebar_sidebar__]') setCss(sidebar, { maxWidth: 'initial', paddingLeft: 'initial', paddingRight: 'initial', gap: 'initial' }) let section = document.querySelectorAll( '[class^=PageWithSidebarNavGroup_section__]' ) section.forEach((elem) => { setCss(elem, { borderRadius: 'initial', borderBottom: borderCustom }) }) lastSection = section[section.length - 1] setCss(lastSection, { borderBottom: 'initial' }) let logo = document.querySelector('[class^=ChatPageSidebar_logo__]') setCss(logo, { marginBottom: paddingCustom }) let navItem = document.querySelectorAll( '[class^=PageWithSidebarNavItem_navItem__]' ) navItem.forEach((elem) => { setCss(elem, { borderRadius: borderRadius, backgroundColor: 'initial' }) }) let active = document.querySelector( '[class*=PageWithSidebarNavItem_active__]' ) setCss(active, { backgroundColor: colorCustomLi }) let downloadButton = document.querySelector( '[class*=ChatPageDownloadLinks_downloadButton__]' ) setCss(downloadButton, { margin: `${marginCustom} 0`, borderRadius: borderRadius, paddingTop: paddingCustom, paddingBottom: paddingCustom }) } // 其他UI const setOtherStyle = () => { let reactModal = document.querySelector('[class^=ReactModal__Content]') setCss(reactModal, { borderRadius: borderRadius }) let container = document.querySelectorAll( '[class^=SettingsSection_container__]' ) container.forEach((elem) => { setCss(elem, { borderRadius: borderRadius }) }) let sectionBubble = document.querySelector( '[class^=SettingsSubscriptionSection_sectionBubble__]' ) setCss(sectionBubble, { borderRadius: borderRadius }) } // 自定义方法 // 判断是否是DOM元素 const isElement = (selector) => { if (typeof selector === 'string' || selector instanceof String) { return !!document.querySelector(selector) } else if (selector instanceof Element) { return true } else if ( selector instanceof NodeList || selector instanceof HTMLCollection ) { return ( selector.length > 0 && Array.from(selector).every((elem) => elem instanceof Element) ) } else if (Array.isArray(selector)) { return selector.length > 0 && selector.every((elem) => isElement(elem)) } else { return false } } // 修改CSS // 调用: setCss(['#box1', '#box2'], { background: 'white', color: 'black' }) const setCss = (selectors, cssObj) => { // 处理selectors为数组的情况 if (!Array.isArray(selectors)) { selectors = [selectors] } selectors.forEach((selector) => { let elem = isElement(selector) ? selector : document.querySelector(selector) if (elem) { for (let prop in cssObj) { elem.style[prop] = cssObj[prop] } } }) } // 修改属性 // 调用: setAttr(['#box1', '#box2'], { class: 'a', href: 'http://example.com' }) const setAttr = (selectors, attrObj) => { // 处理selectors为数组的情况 if (!Array.isArray(selectors)) { selectors = [selectors] } selectors.forEach((selector) => { let elem = isElement(selector) ? selector : document.querySelector(selector) if (elem) { for (let attr in attrObj) { elem.setAttribute(attr, attrObj[attr]) } } }) } // 初始化 const initial = () => { setInitialStyle() let timer = setInterval(() => { setLoginStyle() setChatStyle() setChatSidebarStyle() setOtherStyle() }, 1000) } // 网页加载成功 window.onload = () => { initial() } })()