diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index e18af0782..9a55eb657 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -15,6 +15,8 @@ const Frame = require('react-frame-component').default; const dedent = require('dedent-tabs').default; const { printCurrentBrew } = require('../../../shared/helpers.js'); +import HeaderNav from './headerNav/headerNav.jsx'; + const DOMPurify = require('dompurify'); const purifyConfig = { FORCE_BODY: true, SANITIZE_DOM: false }; @@ -65,8 +67,7 @@ const BrewRenderer = (props)=>{ viewablePageNumber : 0, height : PAGE_HEIGHT, isMounted : false, - visibility : 'hidden', - showHeaderNav : false + visibility : 'hidden' }); const mainRef = useRef(null); @@ -191,60 +192,6 @@ const BrewRenderer = (props)=>{ document.dispatchEvent(new MouseEvent('click')); }; - const toggleHeaderNav = ()=>{ - setState((prevState)=>({ - ...prevState, - showHeaderNav : !prevState.showHeaderNav - })); - }; - - const renderHeaderNav = ()=>{ - return <> - - {state.showHeaderNav && renderHeaderLinks()} - ; - }; - - const renderHeaderLinks = ()=>{ - if(!pagesRef.current) return; - const elements = pagesRef.current.querySelectorAll('[id]'); - if(!elements) return; - const navList = []; - - elements.forEach((el)=>{ - if(el.className.match(/\bpage\b/)) { - navList.push({ - depth : 0, - text : `Page ${el.id.slice(1)}`, - link : el.id - }); - return; - } - if(el.localName.match(/^h[1-6]/)){ - navList.push({ - depth : el.localName[1], - text : el.innerText, - link : el.id - }); - return; - } - navList.push({ - depth : 7, - text : el.innerText, - link : el.id - }); - }); - - return _.map(navList, (navItem)=>{ - return

- {`${'-'.repeat(navItem.depth)}${navItem.text}`} -

; - }); - }; - const rendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; const themePath = props.theme ?? '5ePHB'; const baseThemePath = Themes[rendererPath][themePath].baseTheme; @@ -295,13 +242,7 @@ const BrewRenderer = (props)=>{ } - {props.showHeaderNav ? -
- {renderHeaderNav()} -
- : - <> - } + {props.showHeaderNav ? : <>} {renderPageInfo()} diff --git a/client/homebrew/brewRenderer/brewRenderer.less b/client/homebrew/brewRenderer/brewRenderer.less index 1482a09b4..ad34c6221 100644 --- a/client/homebrew/brewRenderer/brewRenderer.less +++ b/client/homebrew/brewRenderer/brewRenderer.less @@ -61,31 +61,6 @@ background-color : #333333; } -.headerNav { - position: fixed; - top: 0px; - left: 0px; - padding: 5px 10px; - background-color: #ccc; - border-radius: 5px; - max-height: 100vh; - overflow-y: auto; - .navIcon { - cursor: pointer; - } - p { - padding: 2px; - a { - color: inherit; - text-decoration: none; - cursor: pointer; - &:hover { - text-decoration: underline; - } - } - } -} - @media print { .brewRenderer { diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.jsx b/client/homebrew/brewRenderer/headerNav/headerNav.jsx new file mode 100644 index 000000000..360a77dfd --- /dev/null +++ b/client/homebrew/brewRenderer/headerNav/headerNav.jsx @@ -0,0 +1,73 @@ +require('./headerNav.less'); + +import * as React from 'react'; +import * as _ from 'lodash'; + + +const HeaderNav = React.forwardRef(({}, pagesRef)=>{ + + const [state, setState] = React.useState({ + showHeaderNav : false + }); + + const toggleHeaderNav = ()=>{ + setState((prevState)=>({ + ...prevState, + showHeaderNav : !prevState.showHeaderNav + })); + }; + + const renderHeaderLinks = ()=>{ + if(!pagesRef.current) return; + const elements = pagesRef.current.querySelectorAll('[id]'); + if(!elements) return; + const navList = []; + + elements.forEach((el)=>{ + if(el.className.match(/\bpage\b/)) { + navList.push({ + depth : 0, + text : `Page ${el.id.slice(1)}`, + link : el.id + }); + return; + } + if(el.localName.match(/^h[1-6]/)){ + navList.push({ + depth : el.localName[1], + text : el.innerText, + link : el.id + }); + return; + } + navList.push({ + depth : 7, + text : el.innerText, + link : el.id + }); + }); + + return _.map(navList, (navItem, index)=>{ + return ; + }); + + }; + + return
+ + {state.showHeaderNav && renderHeaderLinks()} +
; +} +); + +const HeaderNavItem = ({ index, link, text, depth })=>{ + return

+ {`${'-'.repeat(depth)}${text}`} +

; +}; + +export default HeaderNav; \ No newline at end of file diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.less b/client/homebrew/brewRenderer/headerNav/headerNav.less new file mode 100644 index 000000000..381d1aa53 --- /dev/null +++ b/client/homebrew/brewRenderer/headerNav/headerNav.less @@ -0,0 +1,30 @@ +.headerNav { + position: fixed; + top: 0px; + left: 0px; + padding: 5px 10px; + background-color: #ccc; + border-radius: 5px; + max-height: 100vh; + overflow-y: auto; + &.active { + padding-bottom: 10px; + .navIcon { + padding-bottom: 10px; + } + } + .navIcon { + cursor: pointer; + } + p { + padding: 2px; + a { + color: inherit; + text-decoration: none; + cursor: pointer; + &:hover { + text-decoration: underline; + } + } + } +} \ No newline at end of file