diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 2d6040e7c..2d3e5136e 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -20,9 +20,9 @@ const PAGE_HEIGHT = 1056; const INITIAL_CONTENT = dedent` - + - +
`; diff --git a/client/homebrew/navbar/navbar.less b/client/homebrew/navbar/navbar.less index 4983aa696..d0f2f77e8 100644 --- a/client/homebrew/navbar/navbar.less +++ b/client/homebrew/navbar/navbar.less @@ -240,18 +240,23 @@ .navDropdownContainer { position : relative; .navDropdown { - position : absolute; - top : 28px; - left : 0px; - z-index : 10000; - width : 100%; - max-height : calc(100vh - 28px); - overflow : hidden auto; + position: absolute; + top: 28px; + right: 0px; + z-index: 10000; + width: max-content; + min-width:100%; + max-height: calc(100vh - 28px); + overflow: hidden auto; + display: flex; + flex-direction: column; + align-items: flex-end; .navItem { position : relative; - display : block; + display : flex; + justify-content : space-between; + align-items : center; width : 100%; - padding : 8px 5px; border : 1px solid #888888; border-bottom : 0; animation-name : glideDropDown; @@ -266,7 +271,8 @@ position : relative; box-sizing : border-box; display : block; - max-height : ~'calc(100vh - 28px)'; + max-width : 15em; + max-height : ~'calc(100vh - 28px)'; padding : 8px 5px 13px; overflow : hidden auto; color : white; diff --git a/client/homebrew/navbar/newbrew.navitem.jsx b/client/homebrew/navbar/newbrew.navitem.jsx index cc833013d..319ef3392 100644 --- a/client/homebrew/navbar/newbrew.navitem.jsx +++ b/client/homebrew/navbar/newbrew.navitem.jsx @@ -1,12 +1,64 @@ const React = require('react'); +const _ = require('lodash'); const Nav = require('naturalcrit/nav/nav.jsx'); +const { splitTextStyleAndMetadata } = require('../../../shared/helpers.js'); // Importing the function from helpers.js -module.exports = function(props){ - return - new - ; +const BREWKEY = 'homebrewery-new'; +const STYLEKEY = 'homebrewery-new-style'; +const METAKEY = 'homebrewery-new-meta'; + +const NewBrew = () => { + const handleFileChange = (e) => { + const file = e.target.files[0]; + if (file) { + const reader = new FileReader(); + reader.onload = (e) => { + const fileContent = e.target.result; + const newBrew = { + text: fileContent, + style: '' + }; + if(fileContent.startsWith('```metadata')) { + splitTextStyleAndMetadata(newBrew); // Modify newBrew directly + localStorage.setItem(BREWKEY, newBrew.text); + localStorage.setItem(STYLEKEY, newBrew.style); + localStorage.setItem(METAKEY, JSON.stringify(_.pick(newBrew, ['title', 'description', 'tags', 'systems', 'renderer', 'theme', 'lang']))); + window.location.href = '/new'; + } else { + alert('This file is invalid, please, enter a valid file'); + } + }; + reader.readAsText(file); + } + }; + + return ( + + + new + + + from blank + + + { document.getElementById('uploadTxt').click(); }}> + + from file + + + ); }; + +module.exports = NewBrew; diff --git a/client/homebrew/pages/basePages/listPage/listPage.jsx b/client/homebrew/pages/basePages/listPage/listPage.jsx index 2385b4490..0b51609b5 100644 --- a/client/homebrew/pages/basePages/listPage/listPage.jsx +++ b/client/homebrew/pages/basePages/listPage/listPage.jsx @@ -262,8 +262,8 @@ const ListPage = createClass({ render : function(){ return
{/**/} - - + + {this.props.navItems} {this.renderSortOptions()} {this.renderTagsOptions()} diff --git a/client/homebrew/pages/printPage/printPage.jsx b/client/homebrew/pages/printPage/printPage.jsx index 954d16e0b..cfd3c2318 100644 --- a/client/homebrew/pages/printPage/printPage.jsx +++ b/client/homebrew/pages/printPage/printPage.jsx @@ -53,7 +53,7 @@ const PrintPage = createClass({ style : styleStorage, renderer : metaStorage?.renderer || 'legacy', theme : metaStorage?.theme || '5ePHB', - lang : metaStorage?.lang || 'en' + lang : metaStorage?.lang || 'en' } }; }); @@ -116,7 +116,7 @@ const PrintPage = createClass({ } else { baseRendererPath += '/'; } - + const staticOrUserParent = this.state.brew.theme[0] == '#' ? `/cssParent/${themePath}` : `/css/${baseRendererPath}${baseThemePath}`; return
diff --git a/client/template.js b/client/template.js index 43e17b27d..c77f953ff 100644 --- a/client/template.js +++ b/client/template.js @@ -12,9 +12,9 @@ const template = async function(name, title='', props = {}){ - + - + ${ogMetaTags} diff --git a/package-lock.json b/package-lock.json index 4625107a8..4ab132c11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,8 @@ "license": "MIT", "dependencies": { "@babel/core": "^7.24.0", - "@babel/plugin-transform-runtime": "^7.23.9", - "@babel/preset-env": "^7.23.9", + "@babel/plugin-transform-runtime": "^7.24.0", + "@babel/preset-env": "^7.24.0", "@babel/preset-react": "^7.23.3", "@googleapis/drive": "^8.7.0", "body-parser": "^1.20.2", @@ -340,9 +340,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "engines": { "node": ">=6.9.0" } @@ -1242,13 +1242,13 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", + "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.23.3" }, @@ -1456,12 +1456,12 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", - "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", + "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", "dependencies": { "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "babel-plugin-polyfill-corejs2": "^0.4.8", "babel-plugin-polyfill-corejs3": "^0.9.0", "babel-plugin-polyfill-regenerator": "^0.5.5", @@ -1605,13 +1605,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", - "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", + "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", @@ -1664,7 +1664,7 @@ "@babel/plugin-transform-new-target": "^7.23.3", "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.0", "@babel/plugin-transform-object-super": "^7.23.3", "@babel/plugin-transform-optional-catch-binding": "^7.23.4", "@babel/plugin-transform-optional-chaining": "^7.23.4", diff --git a/package.json b/package.json index 2c2628c86..9b9b17ca0 100644 --- a/package.json +++ b/package.json @@ -81,8 +81,8 @@ }, "dependencies": { "@babel/core": "^7.24.0", - "@babel/plugin-transform-runtime": "^7.23.9", - "@babel/preset-env": "^7.23.9", + "@babel/plugin-transform-runtime": "^7.24.0", + "@babel/preset-env": "^7.24.0", "@babel/preset-react": "^7.23.3", "@googleapis/drive": "^8.7.0", "body-parser": "^1.20.2", diff --git a/server/app.js b/server/app.js index faf557e61..6d3a61bd4 100644 --- a/server/app.js +++ b/server/app.js @@ -17,21 +17,8 @@ const asyncHandler = require('express-async-handler'); const { DEFAULT_BREW } = require('./brewDefaults.js'); -const splitTextStyleAndMetadata = (brew)=>{ - brew.text = brew.text.replaceAll('\r\n', '\n'); - if(brew.text.startsWith('```metadata')) { - const index = brew.text.indexOf('```\n\n'); - const metadataSection = brew.text.slice(12, index - 1); - const metadata = yaml.load(metadataSection); - Object.assign(brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer', 'theme', 'lang'])); - brew.text = brew.text.slice(index + 5); - } - if(brew.text.startsWith('```css')) { - const index = brew.text.indexOf('```\n\n'); - brew.style = brew.text.slice(7, index - 1); - brew.text = brew.text.slice(index + 5); - } -}; +const { splitTextStyleAndMetadata } = require('../shared/helpers.js'); + const sanitizeBrew = (brew, accessType)=>{ brew._id = undefined; diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 658c0fea0..b2f5f941c 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -271,8 +271,6 @@ const api = { res.status(200).send(saved); }, getBrewThemeWithCSS : async (req, res)=>{ - console.log('I made it out!'); - console.log(req.brew); const brew = req.brew; splitTextStyleAndMetadata(brew); res.setHeader('Content-Type', 'text/css'); diff --git a/shared/helpers.js b/shared/helpers.js new file mode 100644 index 000000000..5abb93fea --- /dev/null +++ b/shared/helpers.js @@ -0,0 +1,22 @@ +const _ = require('lodash'); +const yaml = require('js-yaml'); + +const splitTextStyleAndMetadata = (brew) => { + brew.text = brew.text.replaceAll('\r\n', '\n'); + if (brew.text.startsWith('```metadata')) { + const index = brew.text.indexOf('```\n\n'); + const metadataSection = brew.text.slice(12, index - 1); + const metadata = yaml.load(metadataSection); + Object.assign(brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer', 'theme', 'lang'])); + brew.text = brew.text.slice(index + 5); + } + if (brew.text.startsWith('```css')) { + const index = brew.text.indexOf('```\n\n'); + brew.style = brew.text.slice(7, index - 1); + brew.text = brew.text.slice(index + 5); + } +}; + +module.exports = { + splitTextStyleAndMetadata +}; diff --git a/shared/naturalcrit/codeEditor/codeEditor.jsx b/shared/naturalcrit/codeEditor/codeEditor.jsx index 0a99570db..a5232a42b 100644 --- a/shared/naturalcrit/codeEditor/codeEditor.jsx +++ b/shared/naturalcrit/codeEditor/codeEditor.jsx @@ -436,7 +436,7 @@ const CodeEditor = createClass({ render : function(){ return <> - +
; } diff --git a/shared/naturalcrit/nav/nav.jsx b/shared/naturalcrit/nav/nav.jsx index 04b7037dd..beb3d9cc4 100644 --- a/shared/naturalcrit/nav/nav.jsx +++ b/shared/naturalcrit/nav/nav.jsx @@ -104,7 +104,7 @@ const Nav = { }); return ( -
handleDropdown(true) : undefined } onMouseLeave = { props.trigger.includes('hover') ? ()=>handleDropdown(false) : undefined } diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index 97d82ed40..03f90d5fa 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -78,7 +78,7 @@ module.exports = function(props){ return dedent` {{toc,wide - # Table Of Contents + # Contents ${markdown} }} diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index c155d1c09..ed3e8604c 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -402,15 +402,9 @@ } } .pageNumber { - position : absolute; right : 2px; bottom : 22px; - width : 50px; - font-size : 0.9em; color : var(--HB_Color_Footnotes); - text-align : center; - text-indent : 0; - &.auto::after { content : counter(phb-page-numbers); } } .footnote { position : absolute; diff --git a/themes/V3/Blank/style.less b/themes/V3/Blank/style.less index d31919fab..3e5b2290f 100644 --- a/themes/V3/Blank/style.less +++ b/themes/V3/Blank/style.less @@ -8,7 +8,7 @@ } @page { margin : 0; } -body { counter-reset : phb-page-numbers; } +body { counter-reset : page-numbers; } * { -webkit-print-color-adjust : exact; } //***************************** @@ -47,7 +47,7 @@ body { counter-reset : phb-page-numbers; } height : 279.4mm; padding : 1.4cm 1.9cm 1.7cm; overflow : hidden; - counter-increment : phb-page-numbers; + counter-increment : page-numbers; background-color : var(--HB_Color_Background); text-rendering : optimizeLegibility; contain : size; @@ -166,7 +166,6 @@ body { counter-reset : phb-page-numbers; } margin : 0; font-size : 120px; text-transform : uppercase; - mix-blend-mode : overlay; opacity : 30%; transform : rotate(-45deg); p { margin-bottom : none; } @@ -460,3 +459,22 @@ body { counter-reset : phb-page-numbers; } .homebreweryIcon.red { background-color : red; } .homebreweryIcon.gold { background-image : linear-gradient(to top left, brown 22.5%, gold 40%, white 60%, gold 67.5%, brown 82.5%); } } + +//***************************** +//* Page Number +//*****************************/ +.page { + .pageNumber { + position : absolute; + right : 30px; + bottom : 30px; + width : 50px; + font-size : 0.9em; + text-align : center; + &.auto::after { content : counter(page-numbers); } + } + + &:nth-child(even) { + .pageNumber { left : 30px; } + } +} diff --git a/themes/V3/Journal/style.less b/themes/V3/Journal/style.less index 2e2ada5c8..b8ed3ce8f 100644 --- a/themes/V3/Journal/style.less +++ b/themes/V3/Journal/style.less @@ -374,17 +374,9 @@ } .pageNumber{ font-family : FrederickaTheGreat; - position : absolute; right : 3cm; bottom : 1.25cm; - width : 50px; - font-size : 0.9em; color : var(--HB_Color_HeaderText); - text-align : center; - text-indent : 0; - &.auto::after { - content : counter(phb-page-numbers); - } } .footnote{ position : absolute;