您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Utilize available horizontal space in T3 Chat to make reading code blocks with very long lines on wide screens easier.
当前为
// ==UserScript== // @name T3 Chat wide code block (always expand) // @namespace http://tampermonkey.net/ // @version 1.0.0 // @description Utilize available horizontal space in T3 Chat to make reading code blocks with very long lines on wide screens easier. // @author https://github.com/dicksonhk, https://t3.chat // @license MIT // @match https://beta.t3.chat/* // @match https://t3.chat/* // @grant GM_addStyle // Grant GM_addStyle for the first part // @grant none // ==/UserScript== (function () { 'use strict'; const ALWAYS_EXPAND_CODEBLOCK = true; const EXPANDED_CODEBLOCK_WIDTH = 'fit-content'; const MAX_CODEBLOCK_WIDTH = '100%'; // The original max-width for the wrapper, needs to match [role="log"]'s max-width const WRAPPER_MAX_WIDTH = '48rem'; const _S_LOG_SPECIFIC = `[role="log"].max-w-3xl.px-4`; const _S_LOG_FALLBACK = `[role="log"]`; const S_LOGS = [_S_LOG_SPECIFIC, _S_LOG_FALLBACK]; const _S_MSG_GP_SPECIFIC = `${_S_LOG_SPECIFIC} > * > .max-w-full`; const _S_MSG_GP_FALLBACK = `${_S_LOG_FALLBACK} :has(> [role="article"])`; const S_MSG_GP = [_S_MSG_GP_SPECIFIC, _S_MSG_GP_FALLBACK]; // absolute and non-absolute items are styled differently const S_MSG_GP_ITEMS = S_MSG_GP.map((group) => `${group} > :not(.absolute)`); const S_MSG_GP_ABSOLUTE_ITEMS = S_MSG_GP.map((group) => `${group} > .absolute`); const CUSTOM_CSS = ` /* Remove max-width constraint wrapper full width and center children */ ${[ ...S_LOGS.map((log) => `${log} > *:not(:has(> .max-w-full))`), ...S_LOGS, ].join(',\n')} { max-width: 100%; align-items: center; } /* Apply full width to wrapper direct children */ ${[ ...S_LOGS.map((log) => `${log} > *:not(.absolute)`), ].join(',\n')} { width: 100%; } /* Apply code blocks width */ ${[ ...(ALWAYS_EXPAND_CODEBLOCK ? S_MSG_GP_ITEMS.map((item) => `${item} > :has(pre)`) : S_MSG_GP_ITEMS.map((item) => `${item} > :has(.\\[\\&_pre\\]\\:whitespace-pre-wrap > pre)`) ), ].join(',\n')} { width: ${EXPANDED_CODEBLOCK_WIDTH}; max-width: min(100%, ${MAX_CODEBLOCK_WIDTH}); min-width: min(100%, 48rem); margin-left: auto; margin-right: auto; } /* Apply wrapper's original max-width to select children, except for text-wrap enabled code blocks */ /* TODO: handle non top-level code blocks */ ${[ ...S_LOGS.map((log) => `${log} > :not(:has(> .max-w-full)):not(.absolute)`), ...S_MSG_GP_ITEMS.map((item) => `${item} > :not(:has(pre))`), ...(ALWAYS_EXPAND_CODEBLOCK ? [] : S_MSG_GP_ITEMS.map((item) => `${item} > :not(:has(.\\[\\&_pre\\]\\:whitespace-pre-wrap > pre))`) ), ].join(',\n')} { max-width: ${WRAPPER_MAX_WIDTH}; } /* Apply full width to absolute wrappers */ ${[ ...S_MSG_GP_ABSOLUTE_ITEMS.map((item) => `${item}.left-0`), ].join(',\n')} { right: 0; } ${[ ...S_MSG_GP_ABSOLUTE_ITEMS.map((item) => `${item}.right-0`), ].join(',\n')} { left: 0; } /* Apply wrapper's original max-width to absolutely positioned children */ ${[ ...S_MSG_GP_ABSOLUTE_ITEMS.flatMap((item) => [ `${item}.left-0::before`, `${item}.right-0::after`, ]), ].join(',\n')} { content: ''; width: max(0px, calc((100% - ${WRAPPER_MAX_WIDTH}) / 2 - .25rem)); } /* Other layout fixes */ ${[ ...S_MSG_GP_ITEMS.map((item) => `${item}:not(.absolute)`), ].join(',\n')} { position: relative; } ${[ ...S_MSG_GP_ITEMS.map((item) => `${item}.flex-col`), ].join(',\n')} { align-items: center; } ${[ ...S_MSG_GP_ITEMS.map((item) => `${item}:not(.flex-col) > *`), // S_MSG_GP_ITEMS.flatMap((item) => [ // `${item}:not(.flex-col) > :not(:has(pre))`, // `${item}:not(.flex-col) > :not(:has(.\\[\\&_pre\\]\\:whitespace-pre-wrap > pre))` // ]), ].join(',\n')} { margin-left: auto; margin-right: auto; } `; injectCss(CUSTOM_CSS); // --- Function to add CSS, checking for GM_addStyle --- function injectCss(css) { // Check if GM_addStyle is available if (typeof GM_addStyle === 'function') { GM_addStyle(css); return; } // Inject using a style element const styleElement = document.createElement('style'); styleElement.textContent = css; // Append to head if available if (document.head) { document.head.appendChild(styleElement); return; } // As a last resort, append to the document's root element // This is less ideal for performance but ensures the style is applied document.documentElement.appendChild(styleElement); } })();