diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index fde91fc68..9208a2b90 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -45,12 +45,13 @@ let rawPages = []; const BrewRenderer = (props)=>{ props = { - text : '', - style : '', - renderer : 'legacy', - theme : '5ePHB', - lang : '', - errors : [], + text : '', + style : '', + renderer : 'legacy', + theme : '5ePHB', + lang : '', + errors : [], + currentEditorPage : 0, ...props }; @@ -94,6 +95,9 @@ const BrewRenderer = (props)=>{ if(Math.abs(index - state.viewablePageNumber) <= 3) return true; + if(index + 1 == props.currentEditorPage) + return true; + return false; }; @@ -143,6 +147,9 @@ const BrewRenderer = (props)=>{ if(props.errors && props.errors.length) return renderedPages; + if(rawPages.length != renderedPages.length) // Re-render all pages when page count changes + renderedPages.length = 0; + _.forEach(rawPages, (page, index)=>{ if((shouldRender(index) || !renderedPages[index]) && typeof window !== 'undefined'){ renderedPages[index] = renderPage(page, index); // Render any page not yet rendered, but only re-render those in PPR range diff --git a/client/homebrew/brewRenderer/brewRenderer.less b/client/homebrew/brewRenderer/brewRenderer.less index 65ae1beda..17aa146fb 100644 --- a/client/homebrew/brewRenderer/brewRenderer.less +++ b/client/homebrew/brewRenderer/brewRenderer.less @@ -3,9 +3,9 @@ .brewRenderer { will-change : transform; overflow-y : scroll; - .pages { + :where(.pages) { margin : 30px 0px; - & > .page { + & > :where(.page) { width : 215.9mm; height : 279.4mm; margin-right : auto; diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx index 8d67dd78d..75fe0d736 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.jsx +++ b/client/homebrew/editor/snippetbar/snippetbar.jsx @@ -74,6 +74,7 @@ const Snippetbar = createClass({ } }, + mergeCustomizer : function(valueA, valueB, key) { if(key == 'snippets') { const result = _.reverse(_.unionBy(_.reverse(valueB), _.reverse(valueA), 'name')); // Join snippets together, with preference for the current theme over the base theme @@ -102,10 +103,12 @@ const Snippetbar = createClass({ this.props.onInject(injectedText); }, - toggleThemeSelector : function(){ - this.setState({ - themeSelector : !this.state.themeSelector - }); + toggleThemeSelector : function(e){ + if(e.target.tagName != 'SELECT'){ + this.setState({ + themeSelector : !this.state.themeSelector + }); + } }, changeTheme : function(e){ @@ -119,7 +122,7 @@ const Snippetbar = createClass({ renderThemeSelector : function(){ return
- {EditorThemes.map((theme, key)=>{ return ; })} @@ -176,8 +179,9 @@ const Snippetbar = createClass({
+ {this.state.themeSelector && this.renderThemeSelector()}
- {this.state.themeSelector && this.renderThemeSelector()} +
this.props.onViewChange('text')}> diff --git a/client/homebrew/editor/snippetbar/snippetbar.less b/client/homebrew/editor/snippetbar/snippetbar.less index 251ad9378..0d9ec0b2a 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.less +++ b/client/homebrew/editor/snippetbar/snippetbar.less @@ -1,26 +1,28 @@ @import (less) './client/icons/customIcons.less'; @import (less) '././././themes/fonts/5e/fonts.less'; -.snippetBar { - @menuHeight : 25px; - position: relative; - height: @menuHeight; - background-color: #ddd; - .editors { - position: absolute; - display: flex; - top: 0px; - right: 0px; - height: @menuHeight; - justify-content: space-between; - &>div { - height: @menuHeight; - width: @menuHeight; - cursor: pointer; - line-height: @menuHeight; - text-align: center; - &:hover, &.selected { - background-color: #999; +.snippetBar{ + @menuHeight : 25px; + position : relative; + height : @menuHeight; + background-color : #ddd; + color : black; + + .editors{ + position : absolute; + display : flex; + top : 0px; + right : 0px; + height : @menuHeight; + justify-content : space-between; + &>div{ + height : @menuHeight; + width : @menuHeight; + cursor : pointer; + line-height : @menuHeight; + text-align : center; + &:hover,&.selected{ + background-color : #999; } &.text { .tooltipLeft('Brew Editor'); @@ -33,47 +35,41 @@ } &.undo { .tooltipLeft('Undo'); - font-size: 0.75em; - color: grey; - &.active { - color: black; + font-size : 0.75em; + color : grey; + &.active{ + color : inherit; } } &.redo { .tooltipLeft('Redo'); - font-size: 0.75em; - color: grey; - &.active { - color: black; + font-size : 0.75em; + color : grey; + &.active{ + color : inherit; } } &.foldAll { .tooltipLeft('Fold All'); - font-size: 0.75em; - color: grey; - &.active { - color: black; - } + font-size : 0.75em; + color : inherit; } &.unfoldAll { .tooltipLeft('Unfold All'); - font-size: 0.75em; - color: grey; - &.active { - color: black; - } + font-size : 0.75em; + color : inherit; } &.editorTheme { .tooltipLeft('Editor Themes'); - font-size: 0.75em; - color: black; + font-size : 0.75em; + color : black; &.active { - color: white; - background-color: black; + position : relative; + background-color : #999; } } &.divider { - background: linear-gradient(#000, #000) no-repeat center/1px 100%; + background: linear-gradient(currentColor, currentColor) no-repeat center/1px 100%; width: 5px; &:hover { background-color: inherit; @@ -81,13 +77,16 @@ } } .themeSelector { - position: absolute; - left: -65px; - top: 30px; - z-index: 999; - width: 170px; - background-color: black; - border-radius: 5px; + position : absolute; + top : 25px; + right : 0; + z-index : 1; + display : flex; + align-items : center; + justify-content : center; + width : 170px; + height : inherit; + background-color : inherit; } } .snippetBarButton { @@ -115,11 +114,11 @@ border-left: 1px solid black; .tooltipLeft("Edit Brew Properties"); } - .snippetGroup { - border-right: 1px solid black; - &:hover { - &>.dropdown { - visibility: visible; + .snippetGroup{ + border-right : 1px solid currentColor; + &:hover{ + &>.dropdown{ + visibility : visible; } } .dropdown { diff --git a/client/homebrew/pages/basePages/listPage/listPage.jsx b/client/homebrew/pages/basePages/listPage/listPage.jsx index 2696d4e7a..d0cd11ec6 100644 --- a/client/homebrew/pages/basePages/listPage/listPage.jsx +++ b/client/homebrew/pages/basePages/listPage/listPage.jsx @@ -220,6 +220,7 @@ const ListPage = createClass({ render : function(){ return
{/**/} + {this.props.navItems} {this.renderSortOptions()} diff --git a/client/homebrew/pages/basePages/listPage/listPage.less b/client/homebrew/pages/basePages/listPage/listPage.less index bcffbf3e7..00d753429 100644 --- a/client/homebrew/pages/basePages/listPage/listPage.less +++ b/client/homebrew/pages/basePages/listPage/listPage.less @@ -2,17 +2,18 @@ .noColumns(){ column-count : auto; column-fill : auto; - column-gap : auto; + column-gap : normal; column-width : auto; -webkit-column-count : auto; -moz-column-count : auto; -webkit-column-width : auto; -moz-column-width : auto; - -webkit-column-gap : auto; - -moz-column-gap : auto; + -webkit-column-gap : normal; + -moz-column-gap : normal; height : auto; min-height : 279.4mm; margin : 20px auto; + contain : unset; } .listPage{ .content{ diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index bb9b5ca52..bec60d6a8 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -50,7 +50,8 @@ const EditPage = createClass({ url : '', autoSave : true, autoSaveWarning : false, - unsavedTime : new Date() + unsavedTime : new Date(), + currentEditorPage : 0 }; }, savedBrew : null, @@ -109,9 +110,10 @@ const EditPage = createClass({ if(htmlErrors.length) htmlErrors = Markdown.validate(text); this.setState((prevState)=>({ - brew : { ...prevState.brew, text: text }, - isPending : true, - htmlErrors : htmlErrors + brew : { ...prevState.brew, text: text }, + isPending : true, + htmlErrors : htmlErrors, + currentEditorPage : this.refs.editor.getCurrentPage() }), ()=>{if(this.state.autoSave) this.trySave();}); }, @@ -405,6 +407,7 @@ const EditPage = createClass({ theme={this.state.brew.theme} errors={this.state.htmlErrors} lang={this.state.brew.lang} + currentEditorPage={this.state.currentEditorPage} />
diff --git a/package-lock.json b/package-lock.json index 209d8609f..542ba572d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,11 +10,11 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.23.6", - "@babel/plugin-transform-runtime": "^7.23.6", - "@babel/preset-env": "^7.23.6", + "@babel/core": "^7.23.7", + "@babel/plugin-transform-runtime": "^7.23.7", + "@babel/preset-env": "^7.23.8", "@babel/preset-react": "^7.23.3", - "@googleapis/drive": "^8.4.0", + "@googleapis/drive": "^8.5.0", "body-parser": "^1.20.2", "classnames": "^2.3.2", "codemirror": "^5.65.6", @@ -32,23 +32,23 @@ "marked": "5.1.1", "marked-extended-tables": "^1.0.8", "marked-gfm-heading-id": "^3.1.2", - "marked-smartypants-lite": "^1.0.1", + "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", - "moment": "^2.29.4", - "mongoose": "^8.0.3", + "moment": "^2.30.1", + "mongoose": "^8.0.4", "nanoid": "3.3.4", "nconf": "^0.12.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-frame-component": "^4.1.3", - "react-router-dom": "6.21.0", + "react-router-dom": "6.21.2", "sanitize-filename": "1.6.3", "superagent": "^8.1.2", "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" }, "devDependencies": { - "eslint": "^8.55.0", - "eslint-plugin-jest": "^27.6.0", + "eslint": "^8.56.0", + "eslint-plugin-jest": "^27.6.2", "eslint-plugin-react": "^7.33.2", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", @@ -106,19 +106,19 @@ } }, "node_modules/@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.6", + "@babel/helpers": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", + "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -242,9 +242,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -449,12 +449,12 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", + "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" }, "engines": { @@ -516,9 +516,9 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5" @@ -814,9 +814,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", @@ -906,15 +906,14 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", - "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", @@ -1456,15 +1455,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.6.tgz", - "integrity": "sha512-kF1Zg62aPseQ11orDhFRw+aPG/eynNQtI+TyY+m33qJa2cJ5EEvza2P2BNTIA9E5MyqFABHEyY6CPHwgdy9aNg==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", + "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", "semver": "^6.3.1" }, "engines": { @@ -1605,9 +1604,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz", - "integrity": "sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", + "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", @@ -1615,7 +1614,7 @@ "@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", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1636,13 +1635,13 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.4", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", "@babel/plugin-transform-block-scoping": "^7.23.4", "@babel/plugin-transform-class-properties": "^7.23.3", "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.5", + "@babel/plugin-transform-classes": "^7.23.8", "@babel/plugin-transform-computed-properties": "^7.23.3", "@babel/plugin-transform-destructuring": "^7.23.3", "@babel/plugin-transform-dotall-regex": "^7.23.3", @@ -1684,9 +1683,9 @@ "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1759,9 +1758,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", - "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", @@ -1958,18 +1957,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@googleapis/drive": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@googleapis/drive/-/drive-8.4.0.tgz", - "integrity": "sha512-oB0HfGoJp/5KSZlrkCZ2EJOifSqwqSTPB3OQxjjePJ0EpARUJteVwTAhCrOI1l6/P/gVwF3S7PwmLXaC8txrxA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@googleapis/drive/-/drive-8.5.0.tgz", + "integrity": "sha512-5SIODqhdxcimwR06peQcvqAf0tEpj14oEi8dcFB/KvNaev5NRf2MqMMWA3G6dgDPdLKAX/HTmwGz8OD7oGpe8Q==", "dependencies": { "googleapis-common": "^7.0.0" }, @@ -2838,9 +2837,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.0.tgz", - "integrity": "sha512-WOHih+ClN7N8oHk9N4JUiMxQJmRVaOxcg8w7F/oHUXzJt920ekASLI/7cYX8XkntDWRhLZtsk6LbGrkgOAvi5A==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz", + "integrity": "sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==", "engines": { "node": ">=14.0.0" } @@ -3735,12 +3734,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/helper-define-polyfill-provider": "^0.4.4", "semver": "^6.3.1" }, "peerDependencies": { @@ -3748,23 +3747,23 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", - "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.32.2" + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" + "@babel/helper-define-polyfill-provider": "^0.4.4" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4772,11 +4771,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", - "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", "dependencies": { - "browserslist": "^4.22.1" + "browserslist": "^4.22.2" }, "funding": { "type": "opencollective", @@ -5588,15 +5587,15 @@ } }, "node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -5643,9 +5642,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "27.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz", - "integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==", + "version": "27.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.2.tgz", + "integrity": "sha512-CI1AlKrsNhYFoP48VU8BVWOi7+qHTq4bRxyUlGjeU8SfFt8abjXhjOuDzUoMp68DoXIx17KpNpIkMrl4s4ZW0g==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.10.0" @@ -10072,11 +10071,11 @@ } }, "node_modules/marked-smartypants-lite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/marked-smartypants-lite/-/marked-smartypants-lite-1.0.1.tgz", - "integrity": "sha512-XeK3ephFrim4MBLJCCSxx6whqE9HiIt9JsSLR5x3FySid5iopUJkI23/rx+HUhuavFFdRAnPIIaDxHsFBc5clg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/marked-smartypants-lite/-/marked-smartypants-lite-1.0.2.tgz", + "integrity": "sha512-cEANts+s3+gnTzXPvPT2z4V8NfbMEL9QooKUviug0DkaKkXQWrUwDAmFnQAkLSJCw2BQcD8YPDyxu0HJ3mg36w==", "peerDependencies": { - "marked": ">= 4.0.0 < 10" + "marked": ">=4 <12" } }, "node_modules/markedLegacy": { @@ -10437,9 +10436,9 @@ } }, "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "engines": { "node": "*" } @@ -10454,9 +10453,9 @@ } }, "node_modules/mongoose": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.3.tgz", - "integrity": "sha512-LJRT0yP4TW14HT4r2RkxqyvoTylMSzWpl5QOeVHTnRggCLQSpkoBdgbUtORFq/mSL2o9cLCPJz+6uzFj25qbHw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.4.tgz", + "integrity": "sha512-wN9qvdevX3+922VnLT7CpaZRT3jmVCBOK2QMHMGeScQxDRnFMPpkuI9StEPpZo/3x8t+kbzH7F8RMPsyNwyM4w==", "dependencies": { "bson": "^6.2.0", "kareem": "2.5.1", @@ -11874,11 +11873,11 @@ "dev": true }, "node_modules/react-router": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.0.tgz", - "integrity": "sha512-hGZ0HXbwz3zw52pLZV3j3+ec+m/PQ9cTpBvqjFQmy2XVUWGn5MD+31oXHb6dVTxYzmAeaiUBYjkoNz66n3RGCg==", + "version": "6.21.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.2.tgz", + "integrity": "sha512-jJcgiwDsnaHIeC+IN7atO0XiSRCrOsQAHHbChtJxmgqG2IaYQXSnhqGb5vk2CU/wBQA12Zt+TkbuJjIn65gzbA==", "dependencies": { - "@remix-run/router": "1.14.0" + "@remix-run/router": "1.14.2" }, "engines": { "node": ">=14.0.0" @@ -11888,12 +11887,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.0.tgz", - "integrity": "sha512-1dUdVj3cwc1npzJaf23gulB562ESNvxf7E4x8upNJycqyUm5BRRZ6dd3LrlzhtLaMrwOCO8R0zoiYxdaJx4LlQ==", + "version": "6.21.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.2.tgz", + "integrity": "sha512-tE13UukgUOh2/sqYr6jPzZTzmzc70aGRP4pAjG2if0IP3aUT+sBtAKUJh0qMh0zylJHGLmzS+XWVaON4UklHeg==", "dependencies": { - "@remix-run/router": "1.14.0", - "react-router": "6.21.0" + "@remix-run/router": "1.14.2", + "react-router": "6.21.2" }, "engines": { "node": ">=14.0.0" diff --git a/package.json b/package.json index 81a31672f..9771dfc5f 100644 --- a/package.json +++ b/package.json @@ -79,11 +79,11 @@ ] }, "dependencies": { - "@babel/core": "^7.23.6", - "@babel/plugin-transform-runtime": "^7.23.6", - "@babel/preset-env": "^7.23.6", + "@babel/core": "^7.23.7", + "@babel/plugin-transform-runtime": "^7.23.7", + "@babel/preset-env": "^7.23.8", "@babel/preset-react": "^7.23.3", - "@googleapis/drive": "^8.4.0", + "@googleapis/drive": "^8.5.0", "body-parser": "^1.20.2", "classnames": "^2.3.2", "codemirror": "^5.65.6", @@ -101,23 +101,23 @@ "marked": "5.1.1", "marked-extended-tables": "^1.0.8", "marked-gfm-heading-id": "^3.1.2", - "marked-smartypants-lite": "^1.0.1", + "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", - "moment": "^2.29.4", - "mongoose": "^8.0.3", + "moment": "^2.30.1", + "mongoose": "^8.0.4", "nanoid": "3.3.4", "nconf": "^0.12.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-frame-component": "^4.1.3", - "react-router-dom": "6.21.0", + "react-router-dom": "6.21.2", "sanitize-filename": "1.6.3", "superagent": "^8.1.2", "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" }, "devDependencies": { - "eslint": "^8.55.0", - "eslint-plugin-jest": "^27.6.0", + "eslint": "^8.56.0", + "eslint-plugin-jest": "^27.6.2", "eslint-plugin-react": "^7.33.2", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index b0844debc..5be80ac97 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -96,7 +96,7 @@ const mustacheDivs = { while (delim = blockRegex.exec(match[0])?.[0].trim()) { if(!tags) { tags = `${processStyleTags(delim.substring(2))}`; - endTags = delim.length; + endTags = delim.length + src.indexOf(delim); } if(delim.startsWith('{{')) { blockCount++; diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 209e54b08..6c6634ce7 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -1,5 +1,6 @@ @import (less) './themes/fonts/5e/fonts.less'; @import (less) './themes/assets/assets.less'; +@import (less) './themes/fonts/icon fonts/font-icons.less'; :root { //Colors diff --git a/themes/fonts/icon fonts/Elderberry-Inn-Icons.woff2 b/themes/fonts/icon fonts/Elderberry-Inn-Icons.woff2 new file mode 100644 index 000000000..030deb92a Binary files /dev/null and b/themes/fonts/icon fonts/Elderberry-Inn-Icons.woff2 differ diff --git a/themes/fonts/icon fonts/font-icons.less b/themes/fonts/icon fonts/font-icons.less new file mode 100644 index 000000000..f8eb19f11 --- /dev/null +++ b/themes/fonts/icon fonts/font-icons.less @@ -0,0 +1,224 @@ +/* Main Font, serif */ +@font-face { + font-family : 'Eldeberry-Inn'; + font-style : normal; + font-weight : normal; + src : url('../../../fonts/icon fonts/Elderberry-Inn-Icons.woff2'); +} + +.page { + span.ei { + display : inline-block; + margin-right : 3px; + font-family : 'Eldeberry-Inn'; + line-height : 1; + vertical-align : baseline; + -moz-osx-font-smoothing : grayscale; + -webkit-font-smoothing : antialiased; + text-rendering : auto; + + &.book::before { content : '\E900'; } + &.screen::before { content : '\E901'; } + + /* Spell levels */ + &.spell-0::before { content : '\E902'; } + &.spell-1::before { content : '\E903'; } + &.spell-2::before { content : '\E904'; } + &.spell-3::before { content : '\E905'; } + &.spell-4::before { content : '\E906'; } + &.spell-5::before { content : '\E907'; } + &.spell-6::before { content : '\E908'; } + &.spell-7::before { content : '\E909'; } + &.spell-8::before { content : '\E90A'; } + &.spell-9::before { content : '\E90B'; } + + /* Damage types */ + &.acid::before { content : '\E90C'; } + &.bludgeoning::before { content : '\E90D'; } + &.cold::before { content : '\E90E'; } + &.fire::before { content : '\E90F'; } + &.force::before { content : '\E910'; } + &.lightning::before { content : '\E911'; } + &.necrotic::before { content : '\E912'; } + &.piercing::before { content : '\E914'; } + &.poison::before { content : '\E913'; } + &.psychic::before { content : '\E915'; } + &.radiant::before { content : '\E916'; } + &.slashing::before { content : '\E917'; } + &.thunder::before { content : '\E918'; } + + /* DnD Conditions */ + &.blinded::before { content : '\E919'; } + &.charmed::before { content : '\E91A'; } + &.deafened::before { content : '\E91B'; } + &.exhaust-1::before { content : '\E91C'; } + &.exhaust-2::before { content : '\E91D'; } + &.exhaust-3::before { content : '\E91E'; } + &.exhaust-4::before { content : '\E91F'; } + &.exhaust-5::before { content : '\E920'; } + &.exhaust-6::before { content : '\E921'; } + &.frightened::before { content : '\E922'; } + &.grappled::before { content : '\E923'; } + &.incapacitated::before { content : '\E924'; } + &.invisible::before { content : '\E926'; } + &.paralyzed::before { content : '\E927'; } + &.petrified::before { content : '\E928'; } + &.poisoned::before { content : '\E929'; } + &.prone::before { content : '\E92A'; } + &.restrained::before { content : '\E92B'; } + &.stunned::before { content : '\E92C'; } + &.unconscious::before { content : '\E925'; } + + /* Character Classes and Features */ + &.barbarian-rage::before { content : '\E92D'; } + &.barbarian-reckless-attack::before { content : '\E92E'; } + &.bardic-inspiration::before { content : '\E92F'; } + &.cleric-channel-divinity::before { content : '\E930'; } + &.druid-wild-shape::before { content : '\E931'; } + &.fighter-action-surge::before { content : '\E932'; } + &.fighter-second-wind::before { content : '\E933'; } + &.monk-flurry-blows::before { content : '\E934'; } + &.monk-patient-defense::before { content : '\E935'; } + &.monk-step-of-the-wind::before { content : '\E936'; } + &.monk-step-of-the-wind-2::before { content : '\E937'; } + &.monk-step-of-the-wind-3::before { content : '\E938'; } + &.monk-stunning-strike::before { content : '\E939'; } + &.monk-stunning-strike-2::before { content : '\E939'; } + &.paladin-divine-smite::before { content : '\E93B'; } + &.paladin-lay-on-hands::before { content : '\E93C'; } + &.barbarian-abilities::before { content : '\E93D'; } + &.barbarian::before { content : '\E93E'; } + &.bard-abilities::before { content : '\E93F'; } + &.bard::before { content : '\E940'; } + &.cleric-abilities::before { content : '\E941'; } + &.cleric::before { content : '\E942'; } + &.druid-abilities::before { content : '\E943'; } + &.druid::before { content : '\E944'; } + &.fighter-abilities::before { content : '\E945'; } + &.fighter::before { content : '\E946'; } + &.monk-abilities::before { content : '\E947'; } + &.monk::before { content : '\E948'; } + &.paladin-abilities::before { content : '\E949'; } + &.paladin::before { content : '\E94A'; } + &.ranger-abilities::before { content : '\E94B'; } + &.ranger::before { content : '\E94C'; } + &.rogue-abilities::before { content : '\E94D'; } + &.rogue::before { content : '\E94E'; } + &.sorcerer-abilities::before { content : '\E94F'; } + &.sorcerer::before { content : '\E950'; } + &.warlock-abilities::before { content : '\E951'; } + &.warlock::before { content : '\E952'; } + &.wizard-abilities::before { content : '\E953'; } + &.wizard::before { content : '\E954'; } + + /* Types of actions */ + &.movement::before { content : '\E955'; } + &.action::before { content : '\E956'; } + &.bonus-action::before { content : '\E957'; } + &.reaction::before { content : '\E958'; } + + /* SRD Spells */ + &.acid-arrow::before { content : '\E959'; } + &.action-1::before { content : '\E95A'; } + &.alter-self::before { content : '\E95B'; } + &.alter-self-2::before { content : '\E95C'; } + &.animal-friendship::before { content : '\E95E'; } + &.animate-dead::before { content : '\E95F'; } + &.animate-objects::before { content : '\E960'; } + &.animate-objects-2::before { content : '\E961'; } + &.bane::before { content : '\E962'; } + &.bless::before { content : '\E963'; } + &.blur::before { content : '\E964'; } + &.bonus::before { content : '\E965'; } + &.branding-smite::before { content : '\E966'; } + &.burning-hands::before { content : '\E967'; } + &.charm-person::before { content : '\E968'; } + &.chill-touch::before { content : '\E969'; } + &.cloudkill::before { content : '\E96A'; } + &.comprehend-languages::before { content : '\E96B'; } + &.cone-of-cold::before { content : '\E96C'; } + &.conjure-elemental::before { content : '\E96D'; } + &.conjure-minor-elemental::before { content : '\E96E'; } + &.control-water::before { content : '\E96F'; } + &.counterspell::before { content : '\E970'; } + &.cure-wounds::before { content : '\E971'; } + &.dancing-lights::before { content : '\E972'; } + &.darkness::before { content : '\E973'; } + &.detect-magic::before { content : '\E974'; } + &.disguise-self::before { content : '\E975'; } + &.disintegrate::before { content : '\E976'; } + &.dispel-evil-and-good::before { content : '\E977'; } + &.dispel-magic::before { content : '\E978'; } + &.dominate-monster::before { content : '\E979'; } + &.dominate-person::before { content : '\E97A'; } + &.eldritch-blast::before { content : '\E97B'; } + &.enlarge-reduce::before { content : '\E97C'; } + &.entangle::before { content : '\E97D'; } + &.faerie-fire::before { content : '\E97E'; } + &.faerie-fire2::before { content : '\E97F'; } + &.feather-fall::before { content : '\E980'; } + &.find-familiar::before { content : '\E981'; } + &.finger-of-death::before { content : '\E982'; } + &.fireball::before { content : '\E983'; } + &.floating-disk::before { content : '\E984'; } + &.fly::before { content : '\E985'; } + &.fog-cloud::before { content : '\E986'; } + &.gaseous-form::before { content : '\E987'; } + &.gaseous-form2::before { content : '\E988'; } + &.gentle-repose::before { content : '\E989'; } + &.gentle-repose2::before { content : '\E98A'; } + &.globe-of-invulnerability::before { content : '\E98B'; } + &.guiding-bolt::before { content : '\E98C'; } + &.healing-word::before { content : '\E98D'; } + &.heat-metal::before { content : '\E98E'; } + &.hellish-rebuke::before { content : '\E98F'; } + &.heroes-feast::before { content : '\E990'; } + &.heroism::before { content : '\E991'; } + &.hideous-laughter::before { content : '\E992'; } + &.identify::before { content : '\E993'; } + &.illusory-script::before { content : '\E994'; } + &.inflict-wounds::before { content : '\E995'; } + &.light::before { content : '\E996'; } + &.longstrider::before { content : '\E997'; } + &.mage-armor::before { content : '\E998'; } + &.mage-hand::before { content : '\E999'; } + &.magic-missile::before { content : '\E99A'; } + &.mass-cure-wounds::before { content : '\E99B'; } + &.mass-healing-word::before { content : '\E99C'; } + &.Mending::before { content : '\E99D'; } + &.message::before { content : '\E99E'; } + &.Minor-illusion::before { content : '\E99F'; } + &.movement1::before { content : '\E9A0'; } + &.polymorph::before { content : '\E9A1'; } + &.power-word-kill::before { content : '\E9A2'; } + &.power-word-stun::before { content : '\E9A3'; } + &.prayer-of-healing::before { content : '\E9A4'; } + &.prestidigitation::before { content : '\E9A5'; } + &.protection-from-evil-and-good::before { content : '\E9A6'; } + &.raise-read::before { content : '\E9A7'; } + &.raise-read2::before { content : '\E9A8'; } + &.reaction1::before { content : '\E9A9'; } + &.resurrection::before { content : '\E9AA'; } + &.resurrection2::before { content : '\E9AB'; } + &.revivify::before { content : '\E9AC'; } + &.revivify2::before { content : '\E9AD'; } + &.sacred-flame::before { content : '\E9AE'; } + &.sanctuary::before { content : '\E9AF'; } + &.scorching-ray::before { content : '\E9B0'; } + &.sending::before { content : '\E9B1'; } + &.shatter::before { content : '\E9B2'; } + &.shield::before { content : '\E9B3'; } + &.silent-image::before { content : '\E9B4'; } + &.sleep::before { content : '\E9B5'; } + &.speak-with-animals::before { content : '\E9B6'; } + &.telekinesis::before { content : '\E9B7'; } + &.true-strike::before { content : '\E9B8'; } + &.vicious-mockery::before { content : '\E9B9'; } + &.wall-of-fire::before { content : '\E9BA'; } + &.wall-of-force::before { content : '\E9BB'; } + &.wall-of-ice::before { content : '\E9BC'; } + &.wall-of-stone::before { content : '\E9BD'; } + &.wall-of-thorns::before { content : '\E9BE'; } + &.wish::before { content : '\E9BF'; } + } +} \ No newline at end of file