diff --git a/client/homebrew/editor/settingsEditor/settingsEditor.jsx b/client/homebrew/editor/settingsEditor/settingsEditor.jsx
index 9ebc685e8..294d148b3 100644
--- a/client/homebrew/editor/settingsEditor/settingsEditor.jsx
+++ b/client/homebrew/editor/settingsEditor/settingsEditor.jsx
@@ -3,9 +3,7 @@ import React from 'react';
const SettingsEditor = ({ settings, updateSettings = ()=>{}, EditorThemeNameList })=>{
- const validations = {
-
- };
+ const validations = {};
const handleFieldChange = (setting, e)=>{
const value =
@@ -38,7 +36,7 @@ const SettingsEditor = ({ settings, updateSettings = ()=>{}, EditorThemeNameList
};
return (
-
+
diff --git a/client/homebrew/editor/snippetbar/snippetbar.less b/client/homebrew/editor/snippetbar/snippetbar.less
index 99a68504c..10c67a817 100644
--- a/client/homebrew/editor/snippetbar/snippetbar.less
+++ b/client/homebrew/editor/snippetbar/snippetbar.less
@@ -3,21 +3,23 @@
@import (less) '@themes/fonts/5e/fonts.less';
.snippetBar {
- --activeTriggerColor : inherit;
- --menuColor : #DDDDDD;
+ --menuColor : #DDDDDD;
+ --textColor : black;
+ --hoverMenuColor : #999;
+
@menuHeight : 25px;
- position : relative;
- display : flex;
- flex-wrap : wrap-reverse;
- justify-content : space-between;
- height : auto;
- font-family : 'Open Sans', sans-serif;
- font-size : 0.65rem;
- font-weight : 800;
- color : black;
- text-transform : uppercase;
- background-color : #DDDDDD;
- reading-flow : flex-visual;
+ position : relative;
+ display : flex;
+ flex-wrap : wrap-reverse;
+ reading-flow : flex-visual;
+ justify-content : space-between;
+ height : auto;
+ color : var(--textColor);
+ background-color : var(--menuColor);
+ font-size : .65rem;
+ font-family: 'Open Sans', sans-serif;
+ text-transform: uppercase;
+ font-weight: 800;
.editors {
display : flex;
@@ -44,7 +46,7 @@
&.editorTool:not(.active) { cursor : not-allowed; }
- &:hover,&.selected { background-color : #999999; }
+ &:hover,&.selected { background-color : var(--hoverMenuColor) }
&.text {
.tooltipLeft('Brew Editor');
}
@@ -101,11 +103,6 @@
background-color : #999999;
}
}
- &.divider {
- width : 5px;
- background : linear-gradient(currentColor, currentColor) no-repeat center/1px 100%;
- &:hover { background-color : inherit; }
- }
}
.themeSelector {
position : absolute;
@@ -202,7 +199,9 @@
background : grey;
border-radius : 12px;
}
- &:hover { background-color : #999999; }
+ &:hover {
+ background-color : var(--hoverMenuColor);
+ }
&:disabled {
color : gray;
cursor : not-allowed;
@@ -226,3 +225,9 @@
.editors > div.history > .dropdown { right : unset; }
}
}
+
+.editor.darkMode .snippetBar {
+ --menuColor : #666;
+ --textColor : #eee;
+ --hoverMenuColor : #444;
+}
diff --git a/client/homebrew/editor/tagInput/tagInput.jsx b/client/homebrew/editor/tagInput/tagInput.jsx
index 2ec4b3db9..a153fef8b 100644
--- a/client/homebrew/editor/tagInput/tagInput.jsx
+++ b/client/homebrew/editor/tagInput/tagInput.jsx
@@ -4,7 +4,7 @@ import Combobox from '@components/combobox.jsx';
import { tagSuggestionList, canonizationList } from './curatedTagSuggestionList.js';
-const TagInput = ({ tooltip, label, valuePatterns, values = [], unique = true, placeholder = '', smallText = '', onChange })=>{
+const TagInput = ({ id, tooltip, label, valuePatterns, values = [], unique = true, placeholder = '', smallText = '', onChange })=>{
const [tagList, setTagList] = useState(
values.map((value)=>({
value,
@@ -128,6 +128,7 @@ const TagInput = ({ tooltip, label, valuePatterns, values = [], unique = true, p
return (
{tagList.map((t, i)=>t.editing ? (
div { margin-bottom : 10px; }
+ & > div ,& > fieldset { margin-bottom : 10px; }
.field-group {
display : flex;
@@ -40,7 +56,7 @@
.field-column {
display : flex;
- flex : 5 0 200px;
+ flex : 5 0 250px;
flex-direction : column;
gap : 10px;
}
@@ -50,13 +66,16 @@
display : flex;
flex-wrap : wrap;
width : 100%;
- min-width : 200px;
+ min-width : 250px;
+ padding-left : 10px;
+
& > label {
- width : 80px;
- font-size : 0.9em;
+ width : 100px;
+ font-size : 1em;
font-weight : 800;
line-height : 1.8em;
- text-transform : uppercase;
+ color : inherit;
+ text-transform : capitalize;
}
& > .value {
flex : 1 1 auto;
@@ -76,12 +95,16 @@
float : right;
text-align : end;
}
- }
- input[type='text'], textarea {
- border : 1px solid gray;
- &:focus { outline : 1px solid #444444; }
- }
+ input[type='text'], textarea {
+ color : var(--input-text-clr);
+ background-color : var(--input-bg);
+ border : 1px solid var(--input-placeholder-clr);
+ &:hover, :focus { outline : 1px solid var(--input-placeholder-clr); background-color : var(--input-bg-hover); }
+ &::placeholder { color : var(--input-placeholder-clr); }
+ }
+ }
+
&.description {
flex : 1;
textarea.value {
@@ -90,7 +113,6 @@
resize : none;
}
}
-
&.thumbnail, &.themes {
label { line-height : 2.0em; }
.value {
@@ -100,249 +122,218 @@
button {
.colorButton();
padding : 0px 5px;
- color : white;
- background-color : black;
+ color : var(--input-text-clr);
+ background-color : var(--input-bg);
border : 1px solid #999999;
&:hover { background-color : #777777; }
}
}
-
&.tags .tagInput-dropdown {
z-index : 400;
max-width : 200px;
+
+ .dropdown-options {
+ color : var(--input-text-clr);
+ background-color : var(--input-bg);
+
+ .item:hover {
+ color : var(--input-bg);
+ background-color : var(--input-text-clr);
+ }
+ }
}
&.language .value {
z-index : 300;
max-width : 150px;
}
-
&.themes {
.value {
overflow : visible;
- text-overflow : auto;
}
button {
padding-right : 5px;
padding-left : 5px;
}
+ & .dropdown-container { z-index : 200; }
+ & .dropdown-options { overflow-y : visible; }
+ .disabled {
+ font-style : italic;
+ color : dimgray;
+ background-color : darkgray;
+ }
+ .item {
+ position : relative;
+ overflow : visible;
+ color : inherit;
+ background-color : var(--input-bg);
+ border-top : 1px solid #767676;
+ .preview {
+ position : absolute;
+ top : 0;
+ right : 0;
+ z-index : 10;
+ display : flex;
+ flex-direction : column;
+ width : 200px;
+ overflow : hidden;
+ color : var(--input-text-clr);
+ background : var(--input-bg);
+ border-radius : 5px;
+ box-shadow : 0 0 5px var(--input-text-clr);
+ opacity : 0;
+ transition : opacity 250ms ease;
+ h6 {
+ padding-block : 0.5em;
+ padding-inline : 1em;
+ font-weight : 900;
+ border-bottom : 2px solid #666666;
+ }
+ }
+
+ input { padding-right : 25px; }
+
+ .texture-container {
+ position : absolute;
+ top : 0;
+ left : 0;
+ width : 100%;
+ height : 100%;
+ min-height : 100%;
+ overflow : hidden;
+ > img {
+ position : absolute;
+ top : 0;
+ right : 0;
+ width : 50%;
+ min-height : 100%;
+ -webkit-mask-image : linear-gradient(90deg, transparent, black 20%);
+ mask-image : linear-gradient(90deg, transparent, black 20%);
+ }
+ }
+
+ &:hover > .preview { opacity : 1; }
+ }
+ }
+ &.renderers .value {
+ label {
+ display : inline-flex;
+ align-items : center;
+ margin-right : 15px;
+ font-size : 0.9em;
+ font-weight : 800;
+ vertical-align : middle;
+ white-space : nowrap;
+ cursor : pointer;
+ user-select : none;
+ }
+ input {
+ margin : 3px;
+ vertical-align : middle;
+ cursor : pointer;
+ }
}
+ &.authors {
+ .tag {
+ font-weight : 300;
+ transition : background-color 0.2s;
+
+ &.owner {
+ position : relative;
+ display : grid;
+ place-items : center;
+ min-width : 25px;
+ font-weight : 900;
+ background-color : @silverLight;
+
+ &::after {
+ position : absolute;
+ top : 0;
+ left : 0;
+ width : 15px;
+ height : 15px;
+ font-family : 'Font Awesome 6 Free';
+ color : gold;
+ content : '\f521';
+ transform : scaleY(0.7);
+ rotate : -25deg;
+ translate : -30% -50%;
+ }
+ }
+ &:has(button) a { padding-right : 5px; }
+ &:has(button:hover) { background : #D97D7D; }
+
+ button { color : @red; }
+
+ }
+ a { text-underline-offset : 0.2em; }
+ }
&.invitedAuthors .value {
z-index : 100;
.tagInput-dropdown { max-width : 200px; }
}
- }
- .thumbnail-preview {
- position : relative;
- flex : 1 1;
- justify-self : center;
- width : 80px;
- height : min-content;
- max-height : 115px;
- aspect-ratio : 1 / 1;
- object-fit : contain;
- background-color : #AAAAAA;
- }
-
- .renderers.field .value {
- label {
- display : inline-flex;
- align-items : center;
- margin-right : 15px;
- font-size : 0.9em;
- font-weight : 800;
- vertical-align : middle;
- white-space : nowrap;
- cursor : pointer;
- user-select : none;
- }
- input {
- margin : 3px;
- vertical-align : middle;
- cursor : pointer;
- }
- }
- .publish.field .value {
- position : relative;
- margin-bottom : 15px;
- button { width : 100%; }
- button.publish {
- .colorButton(@blueLight);
- }
- button.unpublish {
- .colorButton(@silver);
- }
- }
-
- .delete.field .value {
- button {
- .colorButton(@red);
- }
- }
- .authors.field {
- .tag {
- font-weight : 300;
- transition : background-color 0.2s;
-
- &.owner {
- position : relative;
- display : grid;
- place-items : center;
- min-width : 25px;
- font-weight : 900;
- background-color : @silverLight;
-
- &::after {
- position : absolute;
- top : 0;
- left : 0;
- width : 15px;
- height : 15px;
- font-family : 'Font Awesome 6 Free';
- color : gold;
- content : '\f521';
- transform : scaleY(0.7);
- rotate : -25deg;
- translate : -30% -50%;
- }
+ &.publish .value {
+ position : relative;
+ margin-bottom : 15px;
+ button { width : 100%; }
+ button.publish {
+ .colorButton(@blueLight);
}
- &:has(button) a { padding-right : 5px; }
- &:has(button:hover) { background : #D97D7D; }
-
- button { color : @red; }
-
-
+ button.unpublish {
+ .colorButton(@silver);
+ }
}
- a {
- color : black;
- text-underline-offset : 0.2em;
- }
- }
-
- .themes.field {
- & .dropdown-container {
- position : relative;
- z-index : 200;
- background-color : white;
- }
- & .dropdown-options { overflow-y : visible; }
- .disabled {
- font-style : italic;
- color : dimgray;
- background-color : darkgray;
- }
- .item {
- position : relative;
- padding : 3px 3px;
- overflow : visible;
- background-color : white;
- border-top : 1px solid rgb(118, 118, 118);
- .preview {
- position : absolute;
- top : 0;
- right : 0;
- z-index : 1;
- display : flex;
- flex-direction : column;
- width : 200px;
- overflow : hidden;
- color : black;
- background : #CCCCCC;
- border-radius : 5px;
- box-shadow : 0 0 5px black;
- opacity : 0;
- transition : opacity 250ms ease;
- h6 {
- padding-block : 0.5em;
- padding-inline : 1em;
- font-weight : 900;
- border-bottom : 2px solid hsl(0,0%,40%);
- }
+ &.delete .value {
+ button {
+ .colorButton(@red);
}
-
- .texture-container {
- position : absolute;
- top : 0;
- left : 0;
- width : 100%;
- height : 100%;
- min-height : 100%;
- overflow : hidden;
- > img {
- position : absolute;
- top : 0;
- right : 0;
- width : 50%;
- min-height : 100%;
- -webkit-mask-image : linear-gradient(90deg, transparent, black 20%);
- mask-image : linear-gradient(90deg, transparent, black 20%);
- }
- }
-
- &:hover {
- color : white;
- background-color : @blue;
- filter : unset;
- }
- &:hover > .preview { opacity : 1; }
}
- }
- .field .list {
- display : flex;
- flex : 1 0;
- flex-wrap : wrap;
+ .list {
+ display : flex;
+ flex : 1 0;
+ flex-wrap : wrap;
- > * { flex : 0 0 auto; }
+ > * { flex : 0 0 auto; }
- #groupedIcon {
- #backgroundColors;
- position : relative;
- top : -0.3em;
- right : -0.3em;
- display : inline-block;
- min-width : 20px;
- height : ~'calc(100% + 0.6em)';
- color : white;
- text-align : center;
- cursor : pointer;
+ #groupedIcon {
+ #backgroundColors;
+ position : relative;
+ top : -0.3em;
+ right : -0.3em;
+ display : inline-block;
+ min-width : 20px;
+ height : ~'calc(100% + 0.6em)';
+ color : white;
+ text-align : center;
+ cursor : pointer;
- i {
- position : relative;
- top : 50%;
- transform : translateY(-50%);
+ i {
+ position : relative;
+ top : 50%;
+ transform : translateY(-50%);
+ }
+
+ &:not(:last-child) { border-right : 1px solid black; }
+
+ &:last-child { border-radius : 0 0.5em 0.5em 0; }
}
-
- &:not(:last-child) { border-right : 1px solid black; }
-
- &:last-child { border-radius : 0 0.5em 0.5em 0; }
- }
- .tag {
- padding : 0.35em;
- margin : 2px;
- font-size : 0.95em;
- background-color : #DDDDDD;
- border-radius : 0.5em;
+ .tag {
+ padding : 0.35em;
+ margin : 2px;
+ font-size : 0.95em;
+ border-radius : 0.5em;
- .icon { #groupedIcon; }
+ .icon { #groupedIcon; }
- button { cursor : pointer; }
- }
+ button {
+ cursor : pointer;
- .input-group {
- height : ~'calc(.9em + 4px + .6em)';
-
- input { border-radius : 0.5em 0 0 0.5em; }
-
- input:last-child { border-radius : 0.5em; }
-
- .value {
- width : 7.5vw;
- min-width : 75px;
- height : 100%;
+ &:hover { color : @redLight; }
+ }
}
.input-group {
@@ -358,21 +349,51 @@
height : 100%;
}
- .invalid:focus { background-color : pink; }
+ .input-group {
+ height : ~'calc(.9em + 4px + .6em)';
- .icon {
- #groupedIcon;
- top : -0.54em;
- right : 1px;
- height : 97%;
+ input { border-radius : 0.5em 0 0 0.5em; }
- i { font-size : 1.125em; }
+ input:last-child { border-radius : 0.5em; }
+
+ .value {
+ width : 7.5vw;
+ min-width : 75px;
+ height : 100%;
+ }
+
+ .invalid:focus { background-color : pink; }
+
+ .icon {
+ #groupedIcon;
+ top : -0.54em;
+ right : 1px;
+ height : 97%;
+
+ i { font-size : 1.125em; }
+ }
}
}
}
}
-}
+ .thumbnail-preview {
+ position : relative;
+ flex : 1 1;
+ justify-self : center;
+ width : 80px;
+ height : min-content;
+ max-height : 115px;
+ aspect-ratio : 1 / 1;
+ object-fit : contain;
+ background-color : #AAAAAA;
+ }
+
+ .tag {
+ color : var(--input-bg);
+ background : var(--input-text-clr);
+ }
+}
.settingsEditor .field {
padding-bottom : 10px;
@@ -388,4 +409,29 @@
width : fit-content;
max-width : calc(100% - 200px);
}
+}
+
+.editor.darkMode .uiEditor {
+ --bg-clr : #555555;
+ --bg-image : @backgroundImageAltDark;
+ --h1-clr : white;
+ --h2-clr : #AAAAFF;
+ --label-clr : #DDDDDD;
+ --input-bg : #333333;
+ --input-bg-hover : #666666;
+ --input-text-clr : #EEEEEE;
+ --input-placeholder-clr : #AAAAAA;
+
+ .field { border-color : var(--h1-clr); }
+
+ a {
+ color : @blueLight;
+
+ &:visited { color : #CB8AD8; }
+ }
+
+ .thumbnail-preview[src='/client/homebrew/thumbnail.png'] { filter : invert(0.8); }
+ button.publish {
+ .colorButton(#3137de) !important;
+ }
}
\ No newline at end of file
diff --git a/themes/assets/assets.less b/themes/assets/assets.less
index f880bce77..6515ef417 100644
--- a/themes/assets/assets.less
+++ b/themes/assets/assets.less
@@ -2,12 +2,14 @@
@footerAccentImage : url('/assets/PHB_footerAccent.png');
@frameBorderImage : url('/assets/frameBorder.png');
@backgroundImage : url('/assets/parchmentBackground.jpg');
+@backgroundImageAlt : url('/assets/fluffy_background.webp');
+@backgroundImageAltDark : url('/assets/fluffy_background_dark.webp');
@redTriangleImage : url('/assets/redTriangle.png');
@monsterBorderImageLegacy : url('/assets/monsterBorderLegacy.png');
@noteBorderImage : url('/assets/noteBorder.png');
@descriptiveBoxImage : url('/assets/descriptiveBorder.png');
@monsterBlockBackground : url('/assets/parchmentBackgroundGrayscale.jpg');
-@monsterBlockOverlay : url('/assets/parchmentBackgroundOverlayed.jpg');
+@monsterBlockOverlay : url('/assets/parchmentBackgroundOverlayed.jpg');
@monsterBorderImage : url('/assets/monsterBorderFancy.png');
@codeBorderImage : url('/assets/codeBorder.png');
@classTableDecoration : url('/assets/classTableDecoration.png');
diff --git a/themes/assets/fluffy_background.webp b/themes/assets/fluffy_background.webp
new file mode 100644
index 000000000..90292d55b
Binary files /dev/null and b/themes/assets/fluffy_background.webp differ
diff --git a/themes/assets/fluffy_background_dark.webp b/themes/assets/fluffy_background_dark.webp
new file mode 100644
index 000000000..16aee37d4
Binary files /dev/null and b/themes/assets/fluffy_background_dark.webp differ