diff --git a/packages/docusaurus-theme-classic/src/theme/CodeBlock/Content/String.tsx b/packages/docusaurus-theme-classic/src/theme/CodeBlock/Content/String.tsx index 6a051802e2ef..122b14489dd0 100644 --- a/packages/docusaurus-theme-classic/src/theme/CodeBlock/Content/String.tsx +++ b/packages/docusaurus-theme-classic/src/theme/CodeBlock/Content/String.tsx @@ -85,6 +85,7 @@ export default function CodeBlockString({ ref={wordWrap.codeBlockRef} className={clsx(className, styles.codeBlock, 'thin-scrollbar')}> { + const newValue = value === 'true' ? 'false' : 'true'; + storageSlot.set(newValue); + }, [value, storageSlot]); + + return [value === 'true', toggle] as const; +} + export function useCodeWordWrap(): { readonly codeBlockRef: RefObject; readonly isEnabled: boolean; readonly isCodeScrollable: boolean; readonly toggle: () => void; + readonly codeStyle: CSSProperties; } { - const [isEnabled, setIsEnabled] = useState(false); + const [isEnabled, toggleWrap] = useCodeWrapState(); const [isCodeScrollable, setIsCodeScrollable] = useState(false); const codeBlockRef = useRef(null); + const codeStyle: CSSProperties = isEnabled + ? {whiteSpace: 'pre-wrap', overflowWrap: 'anywhere'} + : {}; const toggle = useCallback(() => { - const codeElement = codeBlockRef.current!.querySelector('code')!; - - if (isEnabled) { - codeElement.removeAttribute('style'); - } else { - codeElement.style.whiteSpace = 'pre-wrap'; - // When code wrap is enabled, we want to avoid a scrollbar in any case - // Ensure that very very long words/strings/tokens still wrap - codeElement.style.overflowWrap = 'anywhere'; - } - - setIsEnabled((value) => !value); - }, [codeBlockRef, isEnabled]); + toggleWrap(); + }, [toggleWrap]); const updateCodeIsScrollable = useCallback(() => { const {scrollWidth, clientWidth} = codeBlockRef.current!; @@ -101,5 +106,5 @@ export function useCodeWordWrap(): { }; }, [updateCodeIsScrollable]); - return {codeBlockRef, isEnabled, isCodeScrollable, toggle}; + return {codeBlockRef, isEnabled, isCodeScrollable, toggle, codeStyle}; }