diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 2d2616dd2..d50fd1c8e 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -65,9 +65,14 @@ const BrewRenderer = (props)=>{ const [state, setState] = useState({ isMounted : false, - visibility : 'hidden', - zoom : 100, - previewStyles : {} + visibility : 'hidden' + }); + + const [displayOptions, setDisplayOptions] = useState({ + zoomLevel : 100, + spread : 'single', + startOnRight : true, + pageShadows : true }); const mainRef = useRef(null); @@ -118,7 +123,13 @@ const BrewRenderer = (props)=>{ } else { pageText += `\n\n \n\\column\n `; //Artificial column break at page end to emulate column-fill:auto (until `wide` is used, when column-fill:balance will reappear) const html = Markdown.render(pageText, index); - return ; + + const styles = { + ...(!displayOptions.pageShadows ? { boxShadow: 'none' } : {}) + // Add more conditions as needed + }; + + return ; } }; @@ -166,35 +177,16 @@ const BrewRenderer = (props)=>{ document.dispatchEvent(new MouseEvent('click')); }; - //Toolbar settings: - const handleZoom = (newZoom)=>{ - setState((prevState)=>({ - ...prevState, - zoom : newZoom - })); + const handleDisplayOptionsChange = (newDisplayOptions)=>{ + setDisplayOptions(newDisplayOptions); }; - const handleStyle = (newStyle)=>{ - setState((prevState)=>{ - // Merge styles, skipping those that are empty objects or null - const mergedStyles = Object.entries(newStyle).reduce((acc, [selector, style])=>{ - if(style && Object.keys(style).length > 0) { - acc[selector] = { - ...(prevState.previewStyles[selector] || {}), // Preserve existing styles - ...style, // Add or override with new styles - }; - } else { - // If the style is an empty object or null, delete the selector - delete acc[selector]; - } - return acc; - }, { ...prevState.previewStyles }); - - return { ...prevState, previewStyles: mergedStyles }; - }); + const pagesStyle = { + zoom : `${displayOptions.zoomLevel}%`, + columnGap : `${displayOptions.columnGap}px`, + rowGap : `${displayOptions.rowGap}px` }; - const styleObject = {}; if(global.config.deployment) { @@ -218,7 +210,7 @@ const BrewRenderer = (props)=>{ - + {/*render in iFrame so broken code doesn't crash the site.*/} { && <> {renderStyle()} -
+
{renderPages()}
diff --git a/client/homebrew/brewRenderer/toolBar/toolBar.jsx b/client/homebrew/brewRenderer/toolBar/toolBar.jsx index f86a9ad7f..7250e9ca1 100644 --- a/client/homebrew/brewRenderer/toolBar/toolBar.jsx +++ b/client/homebrew/brewRenderer/toolBar/toolBar.jsx @@ -9,46 +9,22 @@ import { Anchored, AnchoredBox, AnchoredTrigger } from '../../../components/Anch const MAX_ZOOM = 300; const MIN_ZOOM = 10; -const ToolBar = ({ onZoomChange, currentPage, onPageChange, totalPages, onStyleChange })=>{ +const ToolBar = ({ displayOptions, currentPage, totalPages, onDisplayOptionsChange })=>{ - const [zoomLevel, setZoomLevel] = useState(100); const [pageNum, setPageNum] = useState(currentPage); - const [spread, setSpread] = useState('single'); - const [startOnRight, setStartOnRight] = useState(true); - const [pageShadows, setPageShadows] = useState(true); - const [pagesStyle, setPagesStyle] = useState({}); const [toolsVisible, setToolsVisible] = useState(true); - const spreads = ['single', 'facing', 'flow']; - - useEffect(()=>{ - onZoomChange(zoomLevel); - }, [zoomLevel]); useEffect(()=>{ setPageNum(currentPage); - }, [currentPage]);; - - // update display arrangement when arrangement state is changed. - // todo: do this the 'react' way, without querying the dom. - useEffect(()=>{ - const iframe = document.getElementById('BrewRenderer'); - const pagesContainer = iframe?.contentWindow?.document.querySelector('.pages'); - - if(pagesContainer) { - spreads.forEach((spread)=>pagesContainer.classList.remove(spread)); - pagesContainer.classList.add(spread); - ['recto', 'verso'].forEach((leaf)=>pagesContainer.classList.remove(leaf)); - pagesContainer.classList.add(startOnRight ? 'recto' : 'verso'); - } - }, [spread, startOnRight]); - - useEffect(()=>{ - onStyleChange({ '.page': pageShadows ? {} : { boxShadow: 'none' } }); - }, [pageShadows]); - + }, [currentPage]); const handleZoomButton = (zoom)=>{ - setZoomLevel(_.round(_.clamp(zoom, MIN_ZOOM, MAX_ZOOM))); + handleOptionChange('zoomLevel', _.round(_.clamp(zoom, MIN_ZOOM, MAX_ZOOM))); + }; + + const handleOptionChange = (optionKey, newValue)=>{ + //setDisplayOptions(prevOptions => ({ ...prevOptions, [optionKey]: newValue })); + onDisplayOptionsChange({ ...displayOptions, [optionKey]: newValue }); }; const handlePageInput = (pageInput)=>{ @@ -89,7 +65,7 @@ const ToolBar = ({ onZoomChange, currentPage, onPageChange, totalPages, onStyleC const margin = 5; // extra space so page isn't edge to edge (not truly "to fill") - const deltaZoom = (desiredZoom - zoomLevel) - margin; + const deltaZoom = (desiredZoom - displayOptions.zoomLevel) - margin; return deltaZoom; }; @@ -101,22 +77,22 @@ const ToolBar = ({ onZoomChange, currentPage, onPageChange, totalPages, onStyleC @@ -129,7 +105,7 @@ const ToolBar = ({ onZoomChange, currentPage, onPageChange, totalPages, onStyleC min={MIN_ZOOM} max={MAX_ZOOM} step='1' - value={zoomLevel} + value={displayOptions.zoomLevel} onChange={(e)=>handleZoomButton(parseInt(e.target.value))} /> @@ -139,33 +115,33 @@ const ToolBar = ({ onZoomChange, currentPage, onPageChange, totalPages, onStyleC
- {/*v=====----------------------< Page Controls >---------------------=====v*/} + {/*v=====----------------------< Spread Controls >---------------------=====v*/}
@@ -173,19 +149,28 @@ const ToolBar = ({ onZoomChange, currentPage, onPageChange, totalPages, onStyleC

Options

- - -
+ {/*v=====----------------------< Page Controls >---------------------=====v*/}