mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2026-01-06 03:32:40 +00:00
Merge branch 'master' into addEditorThemes-#362
This commit is contained in:
@@ -11,7 +11,7 @@ module.exports = {
|
|||||||
browser : true,
|
browser : true,
|
||||||
node : true
|
node : true
|
||||||
},
|
},
|
||||||
plugins : ['react'],
|
plugins : ['react', 'jest'],
|
||||||
rules : {
|
rules : {
|
||||||
/** Errors **/
|
/** Errors **/
|
||||||
'camelcase' : ['error', { properties: 'never' }],
|
'camelcase' : ['error', { properties: 'never' }],
|
||||||
@@ -24,7 +24,7 @@ module.exports = {
|
|||||||
'react/jsx-no-bind' : ['error', { allowArrowFunctions: true }],
|
'react/jsx-no-bind' : ['error', { allowArrowFunctions: true }],
|
||||||
'react/jsx-uses-react' : 'error',
|
'react/jsx-uses-react' : 'error',
|
||||||
'react/prefer-es6-class' : ['error', 'never'],
|
'react/prefer-es6-class' : ['error', 'never'],
|
||||||
'jest/valid-expect' : ['error', { maxArgs: 2 }],
|
'jest/valid-expect' : ['error', { maxArgs: 3 }],
|
||||||
|
|
||||||
/** Warnings **/
|
/** Warnings **/
|
||||||
'max-lines' : ['warn', {
|
'max-lines' : ['warn', {
|
||||||
|
|||||||
56
changelog.md
56
changelog.md
@@ -80,9 +80,15 @@ pre {
|
|||||||
## changelog
|
## changelog
|
||||||
For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery).
|
For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery).
|
||||||
|
|
||||||
### XXXXday DD/MM/2023 - v3.8.0
|
### Wednesday 12/04/2023 - v3.8.0
|
||||||
{{taskList
|
{{taskList
|
||||||
|
|
||||||
|
##### calculuschild
|
||||||
|
|
||||||
|
* [x] Rename `{{coverPage}}` to `{{frontCover}}`. Those using this {{beta BETA}} feature will need to update that text to make the cover page appear again.
|
||||||
|
|
||||||
|
* [x] Several background fixes to test scripts
|
||||||
|
|
||||||
##### Jeddai
|
##### Jeddai
|
||||||
|
|
||||||
* [X] Add content negotiation to exclude image requests from our API calls
|
* [X] Add content negotiation to exclude image requests from our API calls
|
||||||
@@ -95,11 +101,48 @@ Fixes issue [#2595](https://github.com/naturalcrit/homebrewery/issues/2595)
|
|||||||
|
|
||||||
Fixes issues [#2657](https://github.com/naturalcrit/homebrewery/issues/2657)
|
Fixes issues [#2657](https://github.com/naturalcrit/homebrewery/issues/2657)
|
||||||
|
|
||||||
* [x] Fix internal links inside `<div>` blocks not automatically receiving the `target=_self` attribute
|
* [x] Fix internal links inside `<div>` blocks not receiving the `target=_self` attribute
|
||||||
|
|
||||||
Fixes issues [#2680](https://github.com/naturalcrit/homebrewery/issues/2680)
|
Fixes issues [#2680](https://github.com/naturalcrit/homebrewery/issues/2680)
|
||||||
|
|
||||||
|
* [x] See brew details on `/share` pages by clicking the brew title (author, last update, tags, etc.)
|
||||||
|
|
||||||
|
Fixes issues [#1679](https://github.com/naturalcrit/homebrewery/issues/1679)
|
||||||
|
|
||||||
|
* [x] Add local Windows install script via Chocolatey
|
||||||
|
|
||||||
|
##### 5e-Clerc
|
||||||
|
|
||||||
|
* [x] New {{openSans **TABLES → {{fas,fa-language}} RUNE TABLE**}} snippets for V3. Adds an alphabetic script translation table.
|
||||||
|
|
||||||
|
* [x] New {{openSans **IMAGES → {{fac,mask-center}} WATERCOLOR CENTER** }} snippets for V3, which adds a stylish watercolor texture to the center of your images!
|
||||||
|
|
||||||
|
* [x] New {{openSans **PHB → {{fac,book-inside-cover}} INSIDE COVER PAGE** }} snippet for V3! (Thanks to /u/Kaiburr_Kath-Hound on Reddit for providing some of these resources!)
|
||||||
|
|
||||||
|
* [x] Add some missing characters {{font-family:scalySansRemake Ñ ñ ç Ç Ý ý # ^ ¿ ' " ¡ ·}} to the "scalySansRemake" font in V3.
|
||||||
|
|
||||||
|
Fixes issues [#2280](https://github.com/naturalcrit/homebrewery/issues/2280)
|
||||||
|
|
||||||
|
##### Gazook89
|
||||||
|
|
||||||
|
* [x] Add "Language" selector in {{fa,fa-info-circle}} **Properties** menu. Sets the HTML Lang attribute for your brew to better handle hyphenation or spellcheck.
|
||||||
|
|
||||||
|
Fixes issues [#1343](https://github.com/naturalcrit/homebrewery/issues/1343)
|
||||||
|
|
||||||
|
* [x] Fix a crash when multiple `{injection}` tags appear in sequence
|
||||||
|
|
||||||
|
Fixes issues [#2712](https://github.com/naturalcrit/homebrewery/issues/2712)
|
||||||
|
|
||||||
|
##### MichielDeMey
|
||||||
|
|
||||||
|
* [x] Remove all-caps display on Account button since usernames are case-sensitive.
|
||||||
|
|
||||||
|
Fixes issues [#2731](https://github.com/naturalcrit/homebrewery/issues/2731)
|
||||||
|
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
\page
|
||||||
|
|
||||||
### Monday 13/03/2023 - v3.7.2
|
### Monday 13/03/2023 - v3.7.2
|
||||||
{{taskList
|
{{taskList
|
||||||
|
|
||||||
@@ -113,7 +156,7 @@ Fixes issues [#2680](https://github.com/naturalcrit/homebrewery/issues/2680)
|
|||||||
|
|
||||||
##### Lucastucious (new contributor!)
|
##### Lucastucious (new contributor!)
|
||||||
|
|
||||||
* [x] Changed `filter: drop-shadow` to `box-shadow` on text boxes, making text selectable in PDFs again.
|
* [x] Changed `filter: drop-shadow` to `box-shadow` on text boxes, making PDF text selectable
|
||||||
|
|
||||||
Fixes issues [#1569](https://github.com/naturalcrit/homebrewery/issues/1569)
|
Fixes issues [#1569](https://github.com/naturalcrit/homebrewery/issues/1569)
|
||||||
|
|
||||||
@@ -131,7 +174,6 @@ Fixes issues [#1569](https://github.com/naturalcrit/homebrewery/issues/1569)
|
|||||||
* [x] Fix PDF pixelation on CoverPage text outlines
|
* [x] Fix PDF pixelation on CoverPage text outlines
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
||||||
### Tuesday 28/02/2023 - v3.7.0
|
### Tuesday 28/02/2023 - v3.7.0
|
||||||
{{taskList
|
{{taskList
|
||||||
|
|
||||||
@@ -161,7 +203,7 @@ Fixes issues [#2687](https://github.com/naturalcrit/homebrewery/issues/2687)
|
|||||||
{{taskList
|
{{taskList
|
||||||
##### G-Ambatte
|
##### G-Ambatte
|
||||||
|
|
||||||
* [x] Fix users not being removed from Authors list correctly
|
* [x] Fix users not being removed from Authors list
|
||||||
|
|
||||||
Fixes issues [#2674](https://github.com/naturalcrit/homebrewery/issues/2674)
|
Fixes issues [#2674](https://github.com/naturalcrit/homebrewery/issues/2674)
|
||||||
}}
|
}}
|
||||||
@@ -191,6 +233,8 @@ Fixes issues [#2583](https://github.com/naturalcrit/homebrewery/issues/2583)
|
|||||||
* [x] Fix cloned brews inheriting the parent view count
|
* [x] Fix cloned brews inheriting the parent view count
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
\page
|
||||||
|
|
||||||
### Friday 23/12/2022 - v3.5.0
|
### Friday 23/12/2022 - v3.5.0
|
||||||
{{taskList
|
{{taskList
|
||||||
|
|
||||||
@@ -204,8 +248,6 @@ Fixes issues [#2583](https://github.com/naturalcrit/homebrewery/issues/2583)
|
|||||||
Fixes issues [#1987](https://github.com/naturalcrit/homebrewery/issues/1987)
|
Fixes issues [#1987](https://github.com/naturalcrit/homebrewery/issues/1987)
|
||||||
}}
|
}}
|
||||||
|
|
||||||
\page
|
|
||||||
|
|
||||||
### Saturday 10/12/2022 - v3.4.2
|
### Saturday 10/12/2022 - v3.4.2
|
||||||
{{taskList
|
{{taskList
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ const createClass = require('create-react-class');
|
|||||||
const _ = require('lodash');
|
const _ = require('lodash');
|
||||||
const cx = require('classnames'); //Unused variable
|
const cx = require('classnames'); //Unused variable
|
||||||
|
|
||||||
const DISMISS_KEY = 'dismiss_notification08-27-22';
|
const DISMISS_KEY = 'dismiss_notification12-04-23';
|
||||||
|
|
||||||
const NotificationPopup = createClass({
|
const NotificationPopup = createClass({
|
||||||
displayName : 'NotificationPopup',
|
displayName : 'NotificationPopup',
|
||||||
@@ -25,21 +25,14 @@ const NotificationPopup = createClass({
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<li key='psa'>
|
<li key='psa'>
|
||||||
<em>V3.2.0 Released!</em> <br />
|
<em>Broken <b>CoverPage</b> snippet</em> <br />
|
||||||
We are happy to announce that after nearly a year of use by our many users,
|
Those of you who have been trying out our Cover Page snippet may
|
||||||
we are making the V3 render mode the default setting for all new brews.
|
notice that the cover page no longer displays correctly. Due to some
|
||||||
This mode has become quite popular, and has proven to be stable and powerful.
|
small tweaks of this BETA feature, the CSS class has been renamed
|
||||||
Of course, we will always keep the option to use the Legacy renderer for any
|
from "coverPage" to "frontCover". Simply change the text to "frontCover"
|
||||||
brew, which can still be accessed from the Properties menu.
|
and it should again function as before. Remember that any snippet
|
||||||
</li>
|
marked "beta" may have a similar change in the future as we
|
||||||
|
encounter any bugs or reworks.
|
||||||
<li key='stubs'>
|
|
||||||
<em>Change to Google Drive Storage!</em> <br />
|
|
||||||
We have made a change to the process of tranferring brews between Google
|
|
||||||
Drive and the Homebrewery storage. Starting now, any time a brew is
|
|
||||||
transferred, it will keep the same links instead of generating new ones!
|
|
||||||
We hope this change will help reduce issues where people "lost" their work
|
|
||||||
by trying to visit old links.
|
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li key='googleDriveFolder'>
|
<li key='googleDriveFolder'>
|
||||||
|
|||||||
90
client/homebrew/navbar/metadata.navitem.jsx
Normal file
90
client/homebrew/navbar/metadata.navitem.jsx
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
const React = require('react');
|
||||||
|
const createClass = require('create-react-class');
|
||||||
|
const _ = require('lodash');
|
||||||
|
const Moment = require('moment');
|
||||||
|
|
||||||
|
const Nav = require('naturalcrit/nav/nav.jsx');
|
||||||
|
|
||||||
|
|
||||||
|
const MetadataNav = createClass({
|
||||||
|
displayName : 'MetadataNav',
|
||||||
|
getDefaultProps : function() {
|
||||||
|
return {
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
getInitialState : function() {
|
||||||
|
return {
|
||||||
|
showMetaWindow : false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
componentDidMount : function() {
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleMetaWindow : function(){
|
||||||
|
this.setState((prevProps)=>({
|
||||||
|
showMetaWindow : !prevProps.showMetaWindow
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
getAuthors : function(){
|
||||||
|
if(!this.props.brew.authors || this.props.brew.authors.length == 0) return 'No authors';
|
||||||
|
return <>
|
||||||
|
{this.props.brew.authors.map((author, idx, arr)=>{
|
||||||
|
const spacer = arr.length - 1 == idx ? <></> : <span>, </span>;
|
||||||
|
return <span key={idx}><a className='userPageLink' href={`/user/${author}`}>{author}</a>{spacer}</span>;
|
||||||
|
})}
|
||||||
|
</>;
|
||||||
|
},
|
||||||
|
|
||||||
|
getTags : function(){
|
||||||
|
if(!this.props.brew.tags || this.props.brew.tags.length == 0) return 'No tags';
|
||||||
|
return <>
|
||||||
|
{this.props.brew.tags.map((tag, idx)=>{
|
||||||
|
return <span className='tag' key={idx}>{tag}</span>;
|
||||||
|
})}
|
||||||
|
</>;
|
||||||
|
},
|
||||||
|
|
||||||
|
getSystems : function(){
|
||||||
|
if(!this.props.brew.systems || this.props.brew.systems.length == 0) return 'No systems';
|
||||||
|
return this.props.brew.systems.join(', ');
|
||||||
|
},
|
||||||
|
|
||||||
|
renderMetaWindow : function(){
|
||||||
|
return <div className={`window ${this.state.showMetaWindow ? 'active' : 'inactive'}`}>
|
||||||
|
<div className='row'>
|
||||||
|
<h4>Description</h4>
|
||||||
|
<p>{this.props.brew.description || 'No description.'}</p>
|
||||||
|
</div>
|
||||||
|
<div className='row'>
|
||||||
|
<h4>Authors</h4>
|
||||||
|
<p>{this.getAuthors()}</p>
|
||||||
|
</div>
|
||||||
|
<div className='row'>
|
||||||
|
<h4>Tags</h4>
|
||||||
|
<p>{this.getTags()}</p>
|
||||||
|
</div>
|
||||||
|
<div className='row'>
|
||||||
|
<h4>Systems</h4>
|
||||||
|
<p>{this.getSystems()}</p>
|
||||||
|
</div>
|
||||||
|
<div className='row'>
|
||||||
|
<h4>Updated</h4>
|
||||||
|
<p>{Moment(this.props.brew.updatedAt).fromNow()}</p>
|
||||||
|
</div>
|
||||||
|
</div>;
|
||||||
|
},
|
||||||
|
|
||||||
|
render : function(){
|
||||||
|
return <Nav.item icon='fas fa-info-circle' color='grey' className='metadata'
|
||||||
|
onClick={()=>this.toggleMetaWindow()}>
|
||||||
|
{this.props.children}
|
||||||
|
{this.renderMetaWindow()}
|
||||||
|
</Nav.item>;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = MetadataNav;
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
width : 250px;
|
width : 250px;
|
||||||
margin : 0;
|
margin : 0;
|
||||||
padding : 2px;
|
padding : 2px;
|
||||||
background-color : #444;
|
background-color : transparent;
|
||||||
font-family : 'Open Sans', sans-serif;
|
font-family : 'Open Sans', sans-serif;
|
||||||
font-size : 12px;
|
font-size : 12px;
|
||||||
font-weight : 800;
|
font-weight : 800;
|
||||||
@@ -49,11 +49,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.brewTitle.navItem{
|
.brewTitle.navItem{
|
||||||
|
height: 100%;
|
||||||
font-size : 12px;
|
font-size : 12px;
|
||||||
font-weight : 800;
|
font-weight : 800;
|
||||||
color : white;
|
color : white;
|
||||||
text-align : center;
|
text-align : center;
|
||||||
text-transform : initial;
|
text-transform : initial;
|
||||||
|
flex-grow : 1;
|
||||||
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
.save-menu {
|
.save-menu {
|
||||||
.dropdown {
|
.dropdown {
|
||||||
@@ -140,7 +143,7 @@
|
|||||||
}
|
}
|
||||||
&:hover{
|
&:hover{
|
||||||
background-color : @blue;
|
background-color : @blue;
|
||||||
|
|
||||||
.clear{
|
.clear{
|
||||||
display : grid;
|
display : grid;
|
||||||
place-content : center;
|
place-content : center;
|
||||||
@@ -163,6 +166,87 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.metadata.navItem {
|
||||||
|
position : relative;
|
||||||
|
padding: 0;
|
||||||
|
align-items: center;
|
||||||
|
display : flex;
|
||||||
|
flex-grow: 1;
|
||||||
|
height: 100%;
|
||||||
|
i{
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
.window{
|
||||||
|
position : absolute;
|
||||||
|
bottom : 0;
|
||||||
|
width : 440px;
|
||||||
|
left : 50%;
|
||||||
|
max-height : ~"calc(100vh - 28px)";
|
||||||
|
background-color : #333;
|
||||||
|
border : 3px solid #444;
|
||||||
|
border-top : unset;
|
||||||
|
border-radius : 0 0 5px 5px;
|
||||||
|
box-shadow : inset 0 7px 9px -7px #111;
|
||||||
|
display : flex;
|
||||||
|
flex-flow : row wrap;
|
||||||
|
justify-content : flex-start;
|
||||||
|
align-content : baseline;
|
||||||
|
padding : 0px 10px 5px;
|
||||||
|
margin : 0 auto;
|
||||||
|
z-index : -1;
|
||||||
|
transition : transform 0.4s, opacity 0.4s;
|
||||||
|
&.active{
|
||||||
|
transform: translateX(-50%) translateY(100%);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
&.inactive{
|
||||||
|
transform: translateX(-50%) translateY(0%);
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.row{
|
||||||
|
display : flex;
|
||||||
|
flex-flow : row wrap;
|
||||||
|
width : 100%;
|
||||||
|
h4{
|
||||||
|
display : block;
|
||||||
|
box-sizing : border-box;
|
||||||
|
padding : 5px 0px;
|
||||||
|
color : #bbb;
|
||||||
|
text-align : center;
|
||||||
|
flex-basis : 20%;
|
||||||
|
flex-grow : 1;
|
||||||
|
min-width : 76px;
|
||||||
|
}
|
||||||
|
p{
|
||||||
|
font-family : 'Open Sans', sans-serif;
|
||||||
|
font-size : 10px;
|
||||||
|
font-weight : normal;
|
||||||
|
text-transform : initial;
|
||||||
|
padding : 5px 0;
|
||||||
|
flex-basis : 80%;
|
||||||
|
flex-grow : 1;
|
||||||
|
.tag{
|
||||||
|
border : 2px solid grey;
|
||||||
|
padding : 2px;
|
||||||
|
margin : 2px 2px;
|
||||||
|
display : inline-block;
|
||||||
|
border-radius : 5px;
|
||||||
|
background-color : #444;
|
||||||
|
}
|
||||||
|
a.userPageLink{
|
||||||
|
text-decoration: none;
|
||||||
|
color: white;
|
||||||
|
&:hover{
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&:nth-of-type(even){
|
||||||
|
background-color: #555;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
.warning.navItem{
|
.warning.navItem{
|
||||||
position : relative;
|
position : relative;
|
||||||
background-color : @orange;
|
background-color : @orange;
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
}
|
}
|
||||||
.listPage{
|
.listPage{
|
||||||
.content{
|
.content{
|
||||||
|
z-index : 1;
|
||||||
.page{
|
.page{
|
||||||
.noColumns() !important; //Needed to override PHB Theme since this is on a lower @layer
|
.noColumns() !important; //Needed to override PHB Theme since this is on a lower @layer
|
||||||
&::after{
|
&::after{
|
||||||
@@ -63,7 +64,7 @@
|
|||||||
border-bottom : 1px solid #666;
|
border-bottom : 1px solid #666;
|
||||||
color : white;
|
color : white;
|
||||||
text-align : center;
|
text-align : center;
|
||||||
z-index : 500;
|
z-index : 1;
|
||||||
display : flex;
|
display : flex;
|
||||||
justify-content : center;
|
justify-content : center;
|
||||||
align-items : baseline;
|
align-items : baseline;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ const { Meta } = require('vitreum/headtags');
|
|||||||
|
|
||||||
const Nav = require('naturalcrit/nav/nav.jsx');
|
const Nav = require('naturalcrit/nav/nav.jsx');
|
||||||
const Navbar = require('../../navbar/navbar.jsx');
|
const Navbar = require('../../navbar/navbar.jsx');
|
||||||
|
const MetadataNav = require('../../navbar/metadata.navitem.jsx');
|
||||||
const PrintLink = require('../../navbar/print.navitem.jsx');
|
const PrintLink = require('../../navbar/print.navitem.jsx');
|
||||||
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
|
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
|
||||||
const Account = require('../../navbar/account.navitem.jsx');
|
const Account = require('../../navbar/account.navitem.jsx');
|
||||||
@@ -50,8 +51,10 @@ const SharePage = createClass({
|
|||||||
return <div className='sharePage sitePage'>
|
return <div className='sharePage sitePage'>
|
||||||
<Meta name='robots' content='noindex, nofollow' />
|
<Meta name='robots' content='noindex, nofollow' />
|
||||||
<Navbar>
|
<Navbar>
|
||||||
<Nav.section>
|
<Nav.section className='titleSection'>
|
||||||
<Nav.item className='brewTitle'>{this.props.brew.title}</Nav.item>
|
<MetadataNav brew={this.props.brew}>
|
||||||
|
<Nav.item className='brewTitle'>{this.props.brew.title}</Nav.item>
|
||||||
|
</MetadataNav>
|
||||||
</Nav.section>
|
</Nav.section>
|
||||||
|
|
||||||
<Nav.section>
|
<Nav.section>
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
.sharePage{
|
.sharePage{
|
||||||
|
.navContent .navSection.titleSection {
|
||||||
|
flex-grow: 1;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
.content{
|
.content{
|
||||||
overflow-y : hidden;
|
overflow-y : hidden;
|
||||||
}
|
}
|
||||||
|
|||||||
31795
package-lock.json
generated
31795
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "homebrewery",
|
"name": "homebrewery",
|
||||||
"description": "Create authentic looking D&D homebrews using only markdown",
|
"description": "Create authentic looking D&D homebrews using only markdown",
|
||||||
"version": "3.7.2",
|
"version": "3.8.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "16.13.x"
|
"node": "16.13.x"
|
||||||
},
|
},
|
||||||
@@ -62,7 +62,9 @@
|
|||||||
"lines": 70
|
"lines": 70
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"setupFilesAfterEnv": ["jest-expect-message"]
|
"setupFilesAfterEnv": [
|
||||||
|
"jest-expect-message"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"babel": {
|
"babel": {
|
||||||
"presets": [
|
"presets": [
|
||||||
@@ -103,7 +105,7 @@
|
|||||||
"npm": "^9.6.4",
|
"npm": "^9.6.4",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
"react-dom": "^17.0.2",
|
"react-dom": "^17.0.2",
|
||||||
"react-frame-component": "5.2.6",
|
"react-frame-component": "^4.1.3",
|
||||||
"react-router-dom": "6.10.0",
|
"react-router-dom": "6.10.0",
|
||||||
"sanitize-filename": "1.6.3",
|
"sanitize-filename": "1.6.3",
|
||||||
"superagent": "^6.1.0",
|
"superagent": "^6.1.0",
|
||||||
@@ -112,6 +114,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"eslint": "^8.38.0",
|
"eslint": "^8.38.0",
|
||||||
"eslint-plugin-react": "^7.32.2",
|
"eslint-plugin-react": "^7.32.2",
|
||||||
|
"eslint-plugin-jest": "^27.2.1",
|
||||||
"jest": "^29.5.0",
|
"jest": "^29.5.0",
|
||||||
"jest-expect-message": "^1.1.3",
|
"jest-expect-message": "^1.1.3",
|
||||||
"supertest": "^6.3.3"
|
"supertest": "^6.3.3"
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ const Nav = {
|
|||||||
section : createClass({
|
section : createClass({
|
||||||
displayName : 'Nav.section',
|
displayName : 'Nav.section',
|
||||||
render : function(){
|
render : function(){
|
||||||
return <div className='navSection'>
|
return <div className={`navSection ${this.props.className ?? ''}`}>
|
||||||
{this.props.children}
|
{this.props.children}
|
||||||
</div>;
|
</div>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ nav{
|
|||||||
position : relative;
|
position : relative;
|
||||||
display : flex;
|
display : flex;
|
||||||
justify-content : space-between;
|
justify-content : space-between;
|
||||||
|
z-index : 2;
|
||||||
}
|
}
|
||||||
.navSection{
|
.navSection{
|
||||||
display : flex;
|
display : flex;
|
||||||
|
|||||||
@@ -116,13 +116,13 @@ describe('Inline: When using the Inline syntax {{ }}', ()=>{
|
|||||||
const source = '{{font-family:"trebuchet ms" text "with quotes"}}';
|
const source = '{{font-family:"trebuchet ms" text "with quotes"}}';
|
||||||
const rendered = Markdown.render(source);
|
const rendered = Markdown.render(source);
|
||||||
// FIXME: adds extra \s after class names
|
// FIXME: adds extra \s after class names
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe('<span class="inline-block" style="font-family:trebuchet ms;">text “with quotes”</span>');
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<span class="inline-block" style="font-family:trebuchet ms;">text “with quotes”</span>');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Renders a mustache span with text, id, class and a couple of css properties', function() {
|
it('Renders a mustache span with text, id, class and a couple of css properties', function() {
|
||||||
const source = '{{pen,#author,color:orange,font-family:"trebuchet ms" text}}';
|
const source = '{{pen,#author,color:orange,font-family:"trebuchet ms" text}}';
|
||||||
const rendered = Markdown.render(source);
|
const rendered = Markdown.render(source);
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe('<span class="inline-block pen" id="author" style="color:orange; font-family:trebuchet ms;">text</span>');
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<span class="inline-block pen" id="author" style="color:orange; font-family:trebuchet ms;">text</span>');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -135,16 +135,16 @@ describe(`Block: When using the Block syntax {{tags\\ntext\\n}}`, ()=>{
|
|||||||
}}`;
|
}}`;
|
||||||
const rendered = Markdown.render(source).trimReturns();
|
const rendered = Markdown.render(source).trimReturns();
|
||||||
// FIXME: adds extra \s after class names
|
// FIXME: adds extra \s after class names
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block"><p>text</p></div>`);
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block"><p>text</p></div>`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.failing('Renders an empty div', function() {
|
it.failing('Renders an empty div', function() {
|
||||||
const source = dedent`{{
|
const source = dedent`{{
|
||||||
|
|
||||||
}}`;
|
}}`;
|
||||||
const rendered = Markdown.render(source).trimReturns();
|
const rendered = Markdown.render(source).trimReturns();
|
||||||
// FIXME: adds extra \s after class names
|
// FIXME: adds extra \s after class names
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block"></div>`);
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block"></div>`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Renders a single paragraph with opening and closing brackets', function() {
|
it('Renders a single paragraph with opening and closing brackets', function() {
|
||||||
@@ -152,16 +152,16 @@ describe(`Block: When using the Block syntax {{tags\\ntext\\n}}`, ()=>{
|
|||||||
}}`;
|
}}`;
|
||||||
const rendered = Markdown.render(source).trimReturns();
|
const rendered = Markdown.render(source).trimReturns();
|
||||||
// this actually renders in HB as '{{ }}'...
|
// this actually renders in HB as '{{ }}'...
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe(`<p>{{}}</p>`);
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<p>{{}}</p>`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.failing('Renders a div with a single class', function() {
|
it.failing('Renders a div with a single class', function() {
|
||||||
const source = dedent`{{cat
|
const source = dedent`{{cat
|
||||||
|
|
||||||
}}`;
|
}}`;
|
||||||
const rendered = Markdown.render(source).trimReturns();
|
const rendered = Markdown.render(source).trimReturns();
|
||||||
// FIXME: adds two extra \s before closing `>` in opening tag
|
// FIXME: adds two extra \s before closing `>` in opening tag
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block cat"></div>`);
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block cat"></div>`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.failing('Renders a div with a single class and text', function() {
|
it.failing('Renders a div with a single class and text', function() {
|
||||||
@@ -170,7 +170,7 @@ describe(`Block: When using the Block syntax {{tags\\ntext\\n}}`, ()=>{
|
|||||||
}}`;
|
}}`;
|
||||||
const rendered = Markdown.render(source).trimReturns();
|
const rendered = Markdown.render(source).trimReturns();
|
||||||
// FIXME: adds two extra \s before closing `>` in opening tag
|
// FIXME: adds two extra \s before closing `>` in opening tag
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block cat"><p>Sample text.</p></div>`);
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block cat"><p>Sample text.</p></div>`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.failing('Renders a div with two classes and text', function() {
|
it.failing('Renders a div with two classes and text', function() {
|
||||||
@@ -179,7 +179,7 @@ describe(`Block: When using the Block syntax {{tags\\ntext\\n}}`, ()=>{
|
|||||||
}}`;
|
}}`;
|
||||||
const rendered = Markdown.render(source).trimReturns();
|
const rendered = Markdown.render(source).trimReturns();
|
||||||
// FIXME: adds two extra \s before closing `>` in opening tag
|
// FIXME: adds two extra \s before closing `>` in opening tag
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block cat dog"><p>Sample text.</p></div>`);
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block cat dog"><p>Sample text.</p></div>`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.failing('Renders a div with a style and text', function() {
|
it.failing('Renders a div with a style and text', function() {
|
||||||
@@ -312,7 +312,7 @@ describe('Injection: When an injection tag follows an element', ()=>{
|
|||||||
|:------------------|:-----:|
|
|:------------------|:-----:|
|
||||||
| 0 | 1 |
|
| 0 | 1 |
|
||||||
| 300 | 2 |
|
| 300 | 2 |
|
||||||
|
|
||||||
{ClassName}`;
|
{ClassName}`;
|
||||||
const rendered = Markdown.render(source).trimReturns();
|
const rendered = Markdown.render(source).trimReturns();
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<table class="ClassName"><thead><tr><th align=left>Experience Points</th><th align=center>Level</th></tr></thead><tbody><tr><td align=left>0</td><td align=center>1</td></tr><tr><td align=left>300</td><td align=center>2</td></tr></tbody></table>`);
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<table class="ClassName"><thead><tr><th align=left>Experience Points</th><th align=center>Level</th></tr></thead><tbody><tr><td align=left>0</td><td align=center>1</td></tr><tr><td align=left>300</td><td align=center>2</td></tr></tbody></table>`);
|
||||||
@@ -373,4 +373,3 @@ describe('Injection: When an injection tag follows an element', ()=>{
|
|||||||
// From: https://drafts.csswg.org/selectors/#class-html:
|
// From: https://drafts.csswg.org/selectors/#class-html:
|
||||||
//
|
//
|
||||||
// > The class selector is given as a full stop (. U+002E) immediately followed by an identifier.
|
// > The class selector is given as a full stop (. U+002E) immediately followed by an identifier.
|
||||||
|
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ module.exports = [
|
|||||||
gen : MonsterBlockGen.monster('monster,frame,wide', 4),
|
gen : MonsterBlockGen.monster('monster,frame,wide', 4),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name : 'Cover Page',
|
name : 'Front Cover Page',
|
||||||
icon : 'fac book-front-cover',
|
icon : 'fac book-front-cover',
|
||||||
gen : CoverPageGen.front,
|
gen : CoverPageGen.front,
|
||||||
experimental : true
|
experimental : true
|
||||||
|
|||||||
Reference in New Issue
Block a user