From 077aaeb815d78ee4bb4bb2c873a62d6b6389efc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 27 May 2025 10:54:07 +0200 Subject: [PATCH 01/20] log --- client/homebrew/brewRenderer/brewRenderer.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index c391d8c43..4b65a9425 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -290,6 +290,7 @@ const BrewRenderer = (props)=>{ const styleObject = {}; + console.log(global.config); if(global.config.deployment) { styleObject.backgroundImage = `url("data:image/svg+xml;utf8,${global.config.deployment}")`; } From ed05d8c754d6a76a65076f4cb6a1d78e0aca53f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 27 May 2025 11:25:01 +0200 Subject: [PATCH 02/20] move all to homebrew.jsx --- client/homebrew/brewRenderer/brewRenderer.jsx | 10 +------ .../homebrew/brewRenderer/brewRenderer.less | 1 - client/homebrew/homebrew.jsx | 27 +++++++++++++++++-- client/homebrew/homebrew.less | 4 ++- .../homebrew/pages/vaultPage/vaultPage.less | 7 ++--- 5 files changed, 33 insertions(+), 16 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 4b65a9425..82c1ebb19 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -288,13 +288,6 @@ const BrewRenderer = (props)=>{ rowGap : `${displayOptions.rowGap}px` }; - const styleObject = {}; - - console.log(global.config); - if(global.config.deployment) { - styleObject.backgroundImage = `url("data:image/svg+xml;utf8,${global.config.deployment}")`; - } - const renderedStyle = useMemo(()=>renderStyle(), [props.style, props.themeBundle]); renderedPages = useMemo(()=>renderPages(), [props.text, displayOptions]); @@ -323,10 +316,9 @@ const BrewRenderer = (props)=>{ contentDidMount={frameDidMount} onClick={()=>{emitClick();}} > -
{/* Apply CSS from Style tab and render pages from Markdown tab */} diff --git a/client/homebrew/brewRenderer/brewRenderer.less b/client/homebrew/brewRenderer/brewRenderer.less index b0a3e9779..bb4fe69c5 100644 --- a/client/homebrew/brewRenderer/brewRenderer.less +++ b/client/homebrew/brewRenderer/brewRenderer.less @@ -6,7 +6,6 @@ overflow-y : scroll; will-change : transform; &:has(.facing, .flow) { padding : 60px 30px; } - &.deployment { background-color : darkred; } :where(.pages) { &.facing { display : grid; diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index 415390498..6e7a95a31 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -63,13 +63,36 @@ const Homebrew = createClass({ global.enable_themes = this.props.enable_themes; global.config = this.props.config; - return {}; + return { isClient: false }; }, + componentDidMount : function() { + this.setState({ isClient: true }); + }, + + backgroundObject : function() { + if(!this.state.isClient) return null; + + if(this.props.config.deployment) { + return { + backgroundImage : `url("data:image/svg+xml;utf8,${this.props.config.deployment}")` + }; + } else if(this.props.config.local) { + return { + backgroundImage : `url("data:image/svg+xml;utf8,Local")` + }; + } + + return null; + }, + + render : function (){ return ( -
+
} /> } /> diff --git a/client/homebrew/homebrew.less b/client/homebrew/homebrew.less index e265c2941..6df5254ec 100644 --- a/client/homebrew/homebrew.less +++ b/client/homebrew/homebrew.less @@ -1,12 +1,14 @@ @import 'naturalcrit/styles/core.less'; .homebrew { height : 100%; + &.deployment { background-color : darkred; } + .sitePage { display : flex; flex-direction : column; height : 100%; overflow-y : hidden; - background-color : @steel; + //background-color : @steel; .content { position : relative; flex : auto; diff --git a/client/homebrew/pages/vaultPage/vaultPage.less b/client/homebrew/pages/vaultPage/vaultPage.less index 8a5f3a714..304fefc72 100644 --- a/client/homebrew/pages/vaultPage/vaultPage.less +++ b/client/homebrew/pages/vaultPage/vaultPage.less @@ -1,14 +1,16 @@ .vaultPage { height : 100%; overflow-y : hidden; - background-color : #2C3E50; *:not(input) { user-select : none; } + .form { + background:white; + } + :where(.content .dataGroup) { width : 100%; height : 100%; - background : white; &.form .brewLookup { position : relative; @@ -171,7 +173,6 @@ max-height : 100%; padding : 70px 50px; overflow-y : scroll; - background-color : #2C3E50; container-type : inline-size; h3 { font-size : 25px; } From 88b70d340e6fccb2e21176e254d9211bd9051a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 27 May 2025 11:27:04 +0200 Subject: [PATCH 03/20] final bit --- client/homebrew/homebrew.less | 1 + 1 file changed, 1 insertion(+) diff --git a/client/homebrew/homebrew.less b/client/homebrew/homebrew.less index 6df5254ec..5c7b63023 100644 --- a/client/homebrew/homebrew.less +++ b/client/homebrew/homebrew.less @@ -1,6 +1,7 @@ @import 'naturalcrit/styles/core.less'; .homebrew { height : 100%; + background-color:@steel; &.deployment { background-color : darkred; } .sitePage { From f04d6cdd1fd245569aa1ecc5db7598c42d8cfa2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Thu, 17 Jul 2025 23:32:18 +0200 Subject: [PATCH 04/20] fix to current --- client/homebrew/homebrew.jsx | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index a6b4b9175..a261e76ef 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -1,7 +1,7 @@ /* eslint-disable camelcase */ import 'core-js/es/string/to-well-formed.js'; //Polyfill for older browsers import './homebrew.less'; -import React from 'react'; +import { useState, useEffect } from 'react'; import { StaticRouter as Router, Route, Routes, useParams, useSearchParams } from 'react-router'; import HomePage from './pages/homePage/homePage.jsx'; @@ -17,7 +17,6 @@ const WithRoute = ({ el: Element, ...rest })=>{ const params = useParams(); const [searchParams] = useSearchParams(); const queryParams = Object.fromEntries(searchParams?.entries() || []); - return ; }; @@ -42,15 +41,35 @@ const Homebrew = (props)=>{ brews } = props; + const [isClient, setIsClient] = useState(false); + + useEffect(() => { + setIsClient(true); + }, []); + global.account = account; global.version = version; global.enable_v3 = enable_v3; global.enable_themes = enable_themes; global.config = config; + const backgroundObject = ()=>{ + if(!isClient) return null; + if(config.deployment) { + return { + backgroundImage : `url("data:image/svg+xml;utf8,${config.deployment}")` + }; + } else if(config.local) { + return { + backgroundImage : `url("data:image/svg+xml;utf8,Local")` + }; + } + return null; + }; + return ( -
+
} /> } /> @@ -72,4 +91,4 @@ const Homebrew = (props)=>{ ); }; -module.exports = Homebrew; \ No newline at end of file +module.exports = Homebrew; From d6a5a1f03c82025f10e0862a2cb261c0b25be8f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Fri, 18 Jul 2025 00:39:36 +0200 Subject: [PATCH 05/20] no idea what changed but now it works --- client/homebrew/homebrew.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index a261e76ef..095c679f1 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -1,7 +1,7 @@ /* eslint-disable camelcase */ import 'core-js/es/string/to-well-formed.js'; //Polyfill for older browsers import './homebrew.less'; -import { useState, useEffect } from 'react'; +import React, { useState, useEffect } from 'react'; import { StaticRouter as Router, Route, Routes, useParams, useSearchParams } from 'react-router'; import HomePage from './pages/homePage/homePage.jsx'; @@ -43,7 +43,7 @@ const Homebrew = (props)=>{ const [isClient, setIsClient] = useState(false); - useEffect(() => { + useEffect(()=>{ setIsClient(true); }, []); From a1ab27b57ff4c501a0934603336bc8c1778649c2 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 30 Jul 2025 19:47:59 -0500 Subject: [PATCH 06/20] Applies G-Ambatte's fix --- themes/V3/Blank/style.less | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/themes/V3/Blank/style.less b/themes/V3/Blank/style.less index 42a392454..dec547854 100644 --- a/themes/V3/Blank/style.less +++ b/themes/V3/Blank/style.less @@ -145,8 +145,8 @@ body { counter-reset : page-numbers 0; } blockquote,table { z-index : 15; -webkit-column-break-inside : avoid; - page-break-inside : avoid; - break-inside : avoid; + page-break-inside : auto; + break-inside : auto; } // Nested lists ul ul,ol ol,ul ol,ol ul { From e793db7b37756c5ec0bc690602520e3e2fc49ec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Wed, 1 Oct 2025 22:55:32 +0200 Subject: [PATCH 07/20] separating the words to make it less ugly --- client/homebrew/homebrew.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index 095c679f1..c1b3f7a96 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -57,11 +57,11 @@ const Homebrew = (props)=>{ if(!isClient) return null; if(config.deployment) { return { - backgroundImage : `url("data:image/svg+xml;utf8,${config.deployment}")` + backgroundImage : `url("data:image/svg+xml;utf8,${config.deployment}")` }; } else if(config.local) { return { - backgroundImage : `url("data:image/svg+xml;utf8,Local")` + backgroundImage : `url("data:image/svg+xml;utf8,Local")` }; } return null; From eefda9fe45687ab0006c2345bca1ba11e257b166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Thu, 2 Oct 2025 12:40:12 +0200 Subject: [PATCH 08/20] simplifying per suggestion --- client/homebrew/homebrew.jsx | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index c1b3f7a96..933971c04 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -55,14 +55,11 @@ const Homebrew = (props)=>{ const backgroundObject = ()=>{ if(!isClient) return null; - if(config.deployment) { - return { - backgroundImage : `url("data:image/svg+xml;utf8,${config.deployment}")` - }; - } else if(config.local) { - return { - backgroundImage : `url("data:image/svg+xml;utf8,Local")` - }; + if(config.deployment || config.local){ + const bgText = config.deployment || 'Local'; + return { + backgroundImage : `url("data:image/svg+xml;utf8,${bgText}")` + }; } return null; }; From c2e51b0baa1257378b1e7fc22cca68ee7bc55c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Fri, 3 Oct 2025 21:32:52 +0200 Subject: [PATCH 09/20] removing isclient check to see what's what --- client/homebrew/homebrew.jsx | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index 933971c04..c85351289 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -41,12 +41,6 @@ const Homebrew = (props)=>{ brews } = props; - const [isClient, setIsClient] = useState(false); - - useEffect(()=>{ - setIsClient(true); - }, []); - global.account = account; global.version = version; global.enable_v3 = enable_v3; @@ -54,7 +48,6 @@ const Homebrew = (props)=>{ global.config = config; const backgroundObject = ()=>{ - if(!isClient) return null; if(config.deployment || config.local){ const bgText = config.deployment || 'Local'; return { @@ -66,7 +59,7 @@ const Homebrew = (props)=>{ return ( -
+
} /> } /> From e0379a0baa75c45b9479620164d53b47ce629e2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Fri, 3 Oct 2025 21:38:10 +0200 Subject: [PATCH 10/20] last cleanup --- client/homebrew/homebrew.jsx | 2 +- client/homebrew/homebrew.less | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index c85351289..efdf70b49 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -1,7 +1,7 @@ /* eslint-disable camelcase */ import 'core-js/es/string/to-well-formed.js'; //Polyfill for older browsers import './homebrew.less'; -import React, { useState, useEffect } from 'react'; +import React from 'react'; import { StaticRouter as Router, Route, Routes, useParams, useSearchParams } from 'react-router'; import HomePage from './pages/homePage/homePage.jsx'; diff --git a/client/homebrew/homebrew.less b/client/homebrew/homebrew.less index 5c7b63023..2cbc35857 100644 --- a/client/homebrew/homebrew.less +++ b/client/homebrew/homebrew.less @@ -9,7 +9,6 @@ flex-direction : column; height : 100%; overflow-y : hidden; - //background-color : @steel; .content { position : relative; flex : auto; From aff9a8576976cd5714ce02d811dff80605de8c1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Fri, 3 Oct 2025 21:38:43 +0200 Subject: [PATCH 11/20] end of file character shit --- client/homebrew/homebrew.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index efdf70b49..cfc691407 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -81,4 +81,4 @@ const Homebrew = (props)=>{ ); }; -module.exports = Homebrew; +module.exports = Homebrew; \ No newline at end of file From 2c4c4b8f924c9e8626935751bfabd057cac4206b Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 4 Oct 2025 22:17:24 -0400 Subject: [PATCH 12/20] Make `unsavedChanges` state common /editPage.jsx uses `unsavedChanges` state to detect when autosave should fire, or unsaved changes warning should display. /homePage.jsx uses a similar check (different variables) to detect when to show the popup "save now"! button /newPage.jsx doesn't do any of this, but probably should pop up a warning when saving hasn't happened for a long time This commit just gives all of the pages the same common `unsavedChanges` state, calculated in the same way, and updates any sections that depend on that updated state. This is precursor work to adding "unsaved changes" warnings to all three pages. --- client/homebrew/pages/editPage/editPage.jsx | 2 +- client/homebrew/pages/homePage/homePage.jsx | 16 +++++++++++++--- client/homebrew/pages/newPage/newPage.jsx | 14 ++++++++++++-- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index e3d449a55..3bd74b786 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -5,6 +5,7 @@ import './editPage.less'; import React, { useState, useEffect, useRef } from 'react'; import request from '../../utils/request-middleware.js'; import Markdown from 'naturalcrit/markdown.js'; +import _ from 'lodash'; import { DEFAULT_BREW_LOAD } from '../../../../server/brewDefaults.js'; import { printCurrentBrew, fetchThemeBundle, splitTextStyleAndMetadata } from '../../../../shared/helpers.js'; @@ -25,7 +26,6 @@ import { both as RecentNavItem } from '../../navbar/recent.navitem.jsx'; // Page specific imports import { Meta } from 'vitreum/headtags'; -import _ from 'lodash'; import { md5 } from 'hash-wasm'; import { gzipSync, strToU8 } from 'fflate'; import { makePatches, stringifyPatches } from '@sanity/diff-match-patch'; diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index fdc439ab5..cfa6eb59d 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -5,6 +5,7 @@ import './homePage.less'; import React, { useState, useEffect, useRef } from 'react'; import request from '../../utils/request-middleware.js'; import Markdown from 'naturalcrit/markdown.js'; +import _ from 'lodash'; import { DEFAULT_BREW } from '../../../../server/brewDefaults.js'; import { printCurrentBrew, fetchThemeBundle, splitTextStyleAndMetadata } from '../../../../shared/helpers.js'; @@ -41,16 +42,18 @@ const HomePage =(props)=>{ }; const [currentBrew , setCurrentBrew] = useState(props.brew); - const [welcomeText , setWelcomeText] = useState(props.brew.text); const [error , setError] = useState(undefined); const [HTMLErrors , setHTMLErrors] = useState(Markdown.validate(props.brew.text)); const [currentEditorViewPageNum , setCurrentEditorViewPageNum] = useState(1); const [currentEditorCursorPageNum, setCurrentEditorCursorPageNum] = useState(1); const [currentBrewRendererPageNum, setCurrentBrewRendererPageNum] = useState(1); const [themeBundle , setThemeBundle] = useState({}); + const [unsavedChanges , setUnsavedChanges] = useState(false); const [isSaving , setIsSaving] = useState(false); + const [autoSaveEnabled , setAutoSaveEnable] = useState(false); - const editorRef = useRef(null); + const editorRef = useRef(null); + const lastSavedBrew = useRef(_.cloneDeep(props.brew)); useEffect(()=>{ fetchThemeBundle(setError, setThemeBundle, currentBrew.renderer, currentBrew.theme); @@ -85,6 +88,13 @@ const HomePage =(props)=>{ }); }; + useEffect(()=>{ + const hasChange = !_.isEqual(currentBrew, lastSavedBrew.current); + setUnsavedChanges(hasChange); + + if(autoSaveEnabled) trySave(false, hasChange); + }, [currentBrew]); + const handleSplitMove = ()=>{ editorRef.current.update(); }; @@ -165,7 +175,7 @@ const HomePage =(props)=>{ />
-
+
Save current
diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index d1d1fa75c..b9b628a2c 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -5,6 +5,7 @@ import './newPage.less'; import React, { useState, useEffect, useRef } from 'react'; import request from '../../utils/request-middleware.js'; import Markdown from 'naturalcrit/markdown.js'; +import _ from 'lodash'; import { DEFAULT_BREW } from '../../../../server/brewDefaults.js'; import { printCurrentBrew, fetchThemeBundle, splitTextStyleAndMetadata } from '../../../../shared/helpers.js'; @@ -26,7 +27,6 @@ import { both as RecentNavItem } from '../../navbar/recent.navitem.jsx'; // Page specific imports import { Meta } from 'vitreum/headtags'; - const BREWKEY = 'HB_newPage_content'; const STYLEKEY = 'HB_newPage_style'; const METAKEY = 'HB_newPage_metadata'; @@ -51,8 +51,11 @@ const NewPage = (props) => { const [currentEditorCursorPageNum, setCurrentEditorCursorPageNum] = useState(1); const [currentBrewRendererPageNum, setCurrentBrewRendererPageNum] = useState(1); const [themeBundle , setThemeBundle ] = useState({}); + const [unsavedChanges , setUnsavedChanges ] = useState(false); + const [autoSaveEnabled , setAutoSaveEnabled ] = useState(false); - const editorRef = useRef(null); + const editorRef = useRef(null); + const lastSavedBrew = useRef(_.cloneDeep(props.brew)); useEffect(() => { loadBrew(); @@ -103,6 +106,13 @@ const NewPage = (props) => { window.history.replaceState({}, window.location.title, '/new/'); }; + useEffect(()=>{ + const hasChange = !_.isEqual(currentBrew, lastSavedBrew.current); + setUnsavedChanges(hasChange); + + if(autoSaveEnabled) trySave(false, hasChange); + }, [currentBrew]); + const handleSplitMove = ()=>{ editorRef.current.update(); }; From 7393aef806e8cda3c2b0e3d84ce5924db8d3d6aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Sun, 5 Oct 2025 19:42:01 +0200 Subject: [PATCH 13/20] set up development config variavle --- client/homebrew/homebrew.jsx | 1 + config/default.json | 1 + 2 files changed, 2 insertions(+) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index cfc691407..f670df8ab 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -48,6 +48,7 @@ const Homebrew = (props)=>{ global.config = config; const backgroundObject = ()=>{ + if(!config.development) return null; if(config.deployment || config.local){ const bgText = config.deployment || 'Local'; return { diff --git a/config/default.json b/config/default.json index bea3b2663..0a2d7281e 100644 --- a/config/default.json +++ b/config/default.json @@ -1,4 +1,5 @@ { + "development": true, "host" : "homebrewery.local.naturalcrit.com:8000", "naturalcrit_url" : "local.naturalcrit.com:8010", "secret" : "secret", From c90a8c53a50218c0b605419ba6fba5ddbabb4c64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Sun, 5 Oct 2025 19:56:50 +0200 Subject: [PATCH 14/20] lets test this --- client/homebrew/homebrew.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index bf51babc8..d62bc6699 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -51,8 +51,8 @@ const Homebrew = (props)=>{ const backgroundObject = ()=>{ if(!config.development) return null; - if(config.deployment || config.local){ - const bgText = config.deployment || 'Local'; + if(global.config.deployment || config.local){ + const bgText = global.config.deployment || 'Local'; return { backgroundImage : `url("data:image/svg+xml;utf8,${bgText}")` }; From 1f51abaf10998210e1ea3a251f3cf2e49dcdfe6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Sun, 5 Oct 2025 19:57:49 +0200 Subject: [PATCH 15/20] this makes more sense --- client/homebrew/homebrew.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index d62bc6699..e7e006808 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -50,8 +50,7 @@ const Homebrew = (props)=>{ global.config = config; const backgroundObject = ()=>{ - if(!config.development) return null; - if(global.config.deployment || config.local){ + if(global.config.deployment || (config.local && config.development)){ const bgText = global.config.deployment || 'Local'; return { backgroundImage : `url("data:image/svg+xml;utf8,${bgText}")` From 8f715a6615fe536e0a34581761ce4557d2e00718 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sun, 5 Oct 2025 18:36:14 -0500 Subject: [PATCH 16/20] Isolate change to Firefox --- themes/V3/Blank/style.less | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/themes/V3/Blank/style.less b/themes/V3/Blank/style.less index dec547854..c251e323b 100644 --- a/themes/V3/Blank/style.less +++ b/themes/V3/Blank/style.less @@ -145,8 +145,8 @@ body { counter-reset : page-numbers 0; } blockquote,table { z-index : 15; -webkit-column-break-inside : avoid; - page-break-inside : auto; - break-inside : auto; + page-break-inside : avoid; + break-inside : avoid; } // Nested lists ul ul,ol ol,ul ol,ol ul { @@ -611,3 +611,17 @@ h6, } .toc.wide li { break-inside : auto; } } + + +/********************************** +Firefox endruns +**********************************/ + +@supports (-moz-user-select: none) { // This section will only apply to Firefox; it's the only browser that supports `-mos-xyz...` + .page { + .blockquote, .table { + page-break-inside: auto; + break-inside: auto; + } + } +} \ No newline at end of file From 41aebf084bcee6053993b490604e10da5c3b5541 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sun, 5 Oct 2025 21:57:19 -0400 Subject: [PATCH 17/20] Make the renderSaveButton() function common between edit/new/home Each of the edit/home/new pages renders its save button differently. This makes it a common function with all the same possible render states (does the document have unsaved changes? Is it already saved? Was it auto-saved?). - Common save button - Adds the "save" button to /home page which wasn't there before - Animates the "save" button in /home and /new when the user makes their first change to signal that yes, you do have to actually click the save button if you want to keep this. - "reminder... you haven't saved for X minutes" still not functional on /new and /home since that involves more moving pieces. --- client/homebrew/pages/editPage/editPage.jsx | 12 ++++-- client/homebrew/pages/homePage/homePage.jsx | 43 +++++++++++++++++-- client/homebrew/pages/homePage/homePage.less | 6 +++ client/homebrew/pages/newPage/newPage.jsx | 44 +++++++++++++++----- client/homebrew/pages/newPage/newPage.less | 6 +++ 5 files changed, 93 insertions(+), 18 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 3bd74b786..d4e0061b1 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -46,8 +46,8 @@ const STYLEKEY = 'HB_newPage_style'; const SNIPKEY = 'HB_newPage_snippets'; const METAKEY = 'HB_newPage_meta'; - const useLocalStorage = false; +const neverSaved = false; const EditPage = (props)=>{ props = { @@ -309,14 +309,18 @@ const EditPage = (props)=>{ // #3 - Unsaved changes exist, click to save, show SAVE NOW if(unsavedChanges) - return trySave(true)} color='blue' icon='fas fa-save'>Save Now; + return trySave(true)} color='blue' icon='fas fa-save'>save now; // #4 - No unsaved changes, autosave is ON, show AUTO-SAVED if(autoSaveEnabled) - return auto-saved.; + return auto-saved; + + // #5 - No unsaved changes, and has never been saved, hide the button + if(neverSaved) + return save now; // DEFAULT - No unsaved changes, show SAVED - return saved.; + return saved; }; const toggleAutoSave = ()=>{ diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index cfa6eb59d..fe57a9913 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -33,6 +33,7 @@ const SNIPKEY = 'homebrewery-new-snippets'; const METAKEY = 'homebrewery-new-meta'; const useLocalStorage = false; +const neverSaved = true; const HomePage =(props)=>{ props = { @@ -122,6 +123,41 @@ const HomePage =(props)=>{ } }; + const renderSaveButton = ()=>{ + // #1 - Currently saving, show SAVING + if(isSaving) + return saving...; + + // #2 - Unsaved changes exist, autosave is OFF and warning timer has expired, show AUTOSAVE WARNING + // if(unsavedChanges && warnUnsavedChanges) { + // resetWarnUnsavedTimer(); + // const elapsedTime = Math.round((new Date() - lastSavedTime) / 1000 / 60); + // const text = elapsedTime === 0 + // ? 'Autosave is OFF.' + // : `Autosave is OFF, and you haven't saved for ${elapsedTime} minutes.`; + + // return + // Reminder... + //
{text}
+ //
; + // } + + // #3 - Unsaved changes exist, click to save, show SAVE NOW + if(unsavedChanges) + return save now; + + // #4 - No unsaved changes, autosave is ON, show AUTO-SAVED + if(autoSaveEnabled) + return auto-saved; + + // #5 - No unsaved changes, and has never been saved, hide the button + if(neverSaved) + return save now; + + // DEFAULT - No unsaved changes, show SAVED + return saved; + }; + const clearError = ()=>{ setError(null); setIsSaving(false); @@ -130,10 +166,9 @@ const HomePage =(props)=>{ const renderNavbar = ()=>{ return - {error ? - : - null - } + {error + ? + : renderSaveButton()} diff --git a/client/homebrew/pages/homePage/homePage.less b/client/homebrew/pages/homePage/homePage.less index 4cf9ff4fe..c3ec1815c 100644 --- a/client/homebrew/pages/homePage/homePage.less +++ b/client/homebrew/pages/homePage/homePage.less @@ -34,7 +34,13 @@ } .navItem.save { + .fadeInRight(); + .transition(opacity); background-color : @orange; &:hover { background-color : @green; } + &.neverSaved { + .fadeOutRight(); + opacity: 0; + } } } diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index b9b628a2c..bc2b39c44 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -33,8 +33,8 @@ const METAKEY = 'HB_newPage_metadata'; const SNIPKEY = 'HB_newPage_snippets'; const SAVEKEYPREFIX = 'HB_editor_defaultSave_'; - const useLocalStorage = true; +const neverSaved = true; const NewPage = (props) => { props = { @@ -96,6 +96,7 @@ const NewPage = (props) => { const saveStorage = localStorage.getItem(SAVEKEY) || 'HOMEBREWERY'; setCurrentBrew(brew); + lastSavedBrew.current = brew; setSaveGoogle(saveStorage == 'GOOGLE-DRIVE' && saveGoogle); localStorage.setItem(BREWKEY, brew.text); @@ -169,15 +170,38 @@ const NewPage = (props) => { }; const renderSaveButton = ()=>{ - if(isSaving){ - return - save... - ; - } else { - return - save - ; - } + // #1 - Currently saving, show SAVING + if(isSaving) + return saving...; + + // #2 - Unsaved changes exist, autosave is OFF and warning timer has expired, show AUTOSAVE WARNING + // if(unsavedChanges && warnUnsavedChanges) { + // resetWarnUnsavedTimer(); + // const elapsedTime = Math.round((new Date() - lastSavedTime) / 1000 / 60); + // const text = elapsedTime === 0 + // ? 'Autosave is OFF.' + // : `Autosave is OFF, and you haven't saved for ${elapsedTime} minutes.`; + + // return + // Reminder... + //
{text}
+ //
; + // } + + // #3 - Unsaved changes exist, click to save, show SAVE NOW + if(unsavedChanges) + return save now; + + // #4 - No unsaved changes, autosave is ON, show AUTO-SAVED + if(autoSaveEnabled) + return auto-saved; + + // #5 - No unsaved changes, and has never been saved, hide the button + if(neverSaved) + return save now; + + // DEFAULT - No unsaved changes, show SAVED + return saved; }; const clearError = ()=>{ diff --git a/client/homebrew/pages/newPage/newPage.less b/client/homebrew/pages/newPage/newPage.less index ebc44d543..083e1ee09 100644 --- a/client/homebrew/pages/newPage/newPage.less +++ b/client/homebrew/pages/newPage/newPage.less @@ -1,6 +1,12 @@ .newPage { .navItem.save { + .fadeInRight(); + .transition(opacity); background-color : @orange; &:hover { background-color : @green; } + &.neverSaved { + .fadeOutRight(); + opacity: 0; + } } } From 1e71e9e18af53c0db5810baf5cba6e2e36c3e815 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sun, 5 Oct 2025 22:19:43 -0400 Subject: [PATCH 18/20] Use blockquote and table elements, not .classes --- themes/V3/Blank/style.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/V3/Blank/style.less b/themes/V3/Blank/style.less index c251e323b..9d41181e9 100644 --- a/themes/V3/Blank/style.less +++ b/themes/V3/Blank/style.less @@ -619,7 +619,7 @@ Firefox endruns @supports (-moz-user-select: none) { // This section will only apply to Firefox; it's the only browser that supports `-mos-xyz...` .page { - .blockquote, .table { + blockquote, table { page-break-inside: auto; break-inside: auto; } From 5395412ac50ce1587a05f94ea1bf0dabee7fbf0f Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sun, 5 Oct 2025 23:24:35 -0400 Subject: [PATCH 19/20] Remove tests for `getLocalStorageMap()` The function is a simple getter with trivial logic; test is effectively just asserting the size of the map, which coverage adds no meaningful value and adds cruft to the codebase. --- .../localStorageKeyMap.spec.js | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 client/homebrew/utils/updateLocalStorage/localStorageKeyMap.spec.js diff --git a/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.spec.js b/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.spec.js deleted file mode 100644 index ac61d4add..000000000 --- a/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.spec.js +++ /dev/null @@ -1,30 +0,0 @@ -import getLocalStorageMap from './localStorageKeyMap.js'; - -describe('getLocalStorageMap', ()=>{ - it('no username', ()=>{ - const account = global.account; - - delete global.account; - - const map = getLocalStorageMap(); - - global.account = account; - - expect(map).toBeInstanceOf(Object); - expect(Object.entries(map)).toHaveLength(16); - }); - - it('no username', ()=>{ - const account = global.account; - - global.account = { username: 'test' }; - - const map = getLocalStorageMap(); - - global.account = account; - - expect(map).toBeInstanceOf(Object); - expect(Object.entries(map)).toHaveLength(17); - expect(map).toHaveProperty('HOMEBREWERY-DEFAULT-SAVE-LOCATION-test', 'HB_editor_defaultSave_test'); - }); -}); \ No newline at end of file From 643e0ac6505765bae2de9117e48a23ad981bda00 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sun, 5 Oct 2025 23:24:50 -0400 Subject: [PATCH 20/20] small cleanups of localstorage keys code --- client/homebrew/utils/updateLocalStorage/localStorageKeyMap.js | 2 +- .../utils/updateLocalStorage/updateLocalStorageKeys.js | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.js b/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.js index b4a05974f..f6e01c54f 100644 --- a/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.js +++ b/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.js @@ -26,7 +26,7 @@ const getLocalStorageMap = function(){ if(global?.account?.username){ const username = global.account.username; - localStorageMap[`HOMEBREWERY-DEFAULT-SAVE-LOCATION-${username}`] = `HB_editor_defaultSave_${username}`; + localStorageMap[`HOMEBREWERY-DEFAULT-SAVE-LOCATION-${username}`] = `HB_editor_defaultSave_${username}`; } return localStorageMap; diff --git a/client/homebrew/utils/updateLocalStorage/updateLocalStorageKeys.js b/client/homebrew/utils/updateLocalStorage/updateLocalStorageKeys.js index 1a8231f73..912c4297b 100644 --- a/client/homebrew/utils/updateLocalStorage/updateLocalStorageKeys.js +++ b/client/homebrew/utils/updateLocalStorage/updateLocalStorageKeys.js @@ -4,10 +4,7 @@ const updateLocalStorage = function(){ // Return if no window and thus no local storage if(typeof window === 'undefined') return; - // Return if the local storage key map has no content const localStorageKeyMap = getLocalStorageMap(); - if(Object.keys(localStorageKeyMap).length == 0) return; - const storage = window.localStorage; Object.keys(localStorageKeyMap).forEach((key)=>{