0
0
mirror of https://github.com/naturalcrit/homebrewery.git synced 2026-01-13 02:14:39 +00:00

Update vitreum (#946)

- Updates Vitreum to v6.0.1 + some custom fixes.
  - Stylesheets must be imported with `require('./sheet.less');` but can also can now share stylesheets between jsx components.
  - Should eliminate a lot of security concerns with older nested dependencies.
  - Changed a lot of files to make this work
- Also removes dependency on PicoRouter in favor of React-Router
This commit is contained in:
Trevor Buckner
2020-05-19 01:36:31 -04:00
committed by GitHub
parent 7c813be13a
commit 22a9799674
38 changed files with 3901 additions and 4518 deletions

View File

@@ -6,7 +6,7 @@ version: 2
jobs: jobs:
build: build:
docker: docker:
- image: circleci/node:8.9 - image: circleci/node:12.16.3
- image: circleci/mongo:3.4-jessie - image: circleci/mongo:3.4-jessie
working_directory: ~/repo working_directory: ~/repo
@@ -30,4 +30,3 @@ jobs:
# run tests! # run tests!
- run: npm run circleci - run: npm run circleci

View File

@@ -1,3 +1,4 @@
require('./admin.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');

View File

@@ -1,3 +1,4 @@
require('./brewCleanup.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const cx = require('classnames'); const cx = require('classnames');
@@ -71,4 +72,4 @@ const BrewCleanup = createClass({
} }
}); });
module.exports = BrewCleanup; module.exports = BrewCleanup;

View File

@@ -1,3 +1,4 @@
require('./brewCompress.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const cx = require('classnames'); const cx = require('classnames');
@@ -88,4 +89,4 @@ const BrewCompress = createClass({
} }
}); });
module.exports = BrewCompress; module.exports = BrewCompress;

View File

@@ -1,3 +1,4 @@
require('./brewLookup.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const cx = require('classnames'); const cx = require('classnames');

View File

@@ -1,3 +1,4 @@
require('./stats.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const cx = require('classnames'); const cx = require('classnames');
@@ -42,4 +43,4 @@ const Stats = createClass({
} }
}); });
module.exports = Stats; module.exports = Stats;

View File

@@ -1,3 +1,4 @@
require('./brewRenderer.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');

View File

@@ -1,3 +1,4 @@
require('./errorBar.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');

View File

@@ -1,4 +1,4 @@
require('./notificationPopup.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');

View File

@@ -1,3 +1,4 @@
require('./editor.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');
@@ -138,9 +139,3 @@ const Editor = createClass({
}); });
module.exports = Editor; module.exports = Editor;

View File

@@ -1,3 +1,4 @@
require('./metadataEditor.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');

View File

@@ -1,3 +1,4 @@
require('./snippetbar.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');
@@ -92,4 +93,4 @@ const SnippetGroup = createClass({
</div>; </div>;
}, },
}); });

View File

@@ -1,19 +1,19 @@
require('./homebrew.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');
const cx = require('classnames'); const cx = require('classnames');
const { StaticRouter:Router, Switch, Route } = require('react-router-dom');
const CreateRouter = require('pico-router').createRouter; const queryString = require('query-string');
const HomePage = require('./pages/homePage/homePage.jsx'); const HomePage = require('./pages/homePage/homePage.jsx');
const EditPage = require('./pages/editPage/editPage.jsx'); const EditPage = require('./pages/editPage/editPage.jsx');
const UserPage = require('./pages/userPage/userPage.jsx'); const UserPage = require('./pages/userPage/userPage.jsx');
const SharePage = require('./pages/sharePage/sharePage.jsx'); const SharePage = require('./pages/sharePage/sharePage.jsx');
const NewPage = require('./pages/newPage/newPage.jsx'); const NewPage = require('./pages/newPage/newPage.jsx');
const ErrorPage = require('./pages/errorPage/errorPage.jsx'); //const ErrorPage = require('./pages/errorPage/errorPage.jsx');
const PrintPage = require('./pages/printPage/printPage.jsx'); const PrintPage = require('./pages/printPage/printPage.jsx');
let Router;
const Homebrew = createClass({ const Homebrew = createClass({
getDefaultProps : function() { getDefaultProps : function() {
return { return {
@@ -36,55 +36,36 @@ const Homebrew = createClass({
global.account = this.props.account; global.account = this.props.account;
global.version = this.props.version; global.version = this.props.version;
Router = CreateRouter({
'/edit/:id' : (args)=>{
if(!this.props.brew.editId){
return <ErrorPage errorId={args.id}/>;
}
return <EditPage
id={args.id}
brew={this.props.brew} />;
},
'/share/:id' : (args)=>{
if(!this.props.brew.shareId){
return <ErrorPage errorId={args.id}/>;
}
return <SharePage
id={args.id}
brew={this.props.brew} />;
},
'/user/:username' : (args)=>{
return <UserPage
username={args.username}
brews={this.props.brews}
/>;
},
'/print/:id' : (args, query)=>{
return <PrintPage brew={this.props.brew} query={query}/>;
},
'/print' : (args, query)=>{
return <PrintPage query={query}/>;
},
'/new' : (args)=>{
return <NewPage />;
},
'/changelog' : (args)=>{
return <SharePage
brew={{ title: 'Changelog', text: this.props.changelog }} />;
},
'*' : <HomePage
welcomeText={this.props.welcomeText} />,
});
}, },
render : function(){ render : function (){
return <div className='homebrew'> return (
<Router defaultUrl={this.props.url}/> <Router location={this.props.url}>
</div>; <div className='homebrew'>
<Switch>
<Route path='/edit/:id' component={(routeProps)=><EditPage id={routeProps.match.params.id} brew={this.props.brew} />}/>
<Route path='/share/:id' component={(routeProps)=><SharePage id={routeProps.match.params.id} brew={this.props.brew} />}/>
<Route path='/user/:username' component={(routeProps)=><UserPage username={routeProps.match.params.username} brews={this.props.brews} />}/>
<Route path='/print/:id' component={(routeProps)=><PrintPage brew={this.props.brew} query={queryString.parse(routeProps.location.search)} /> } />
<Route path='/print' exact component={(routeProps)=><PrintPage query={queryString.parse(routeProps.location.search)} /> } />
<Route path='/new' exact component={NewPage}/>
<Route path='/changelog' exact component={()=><SharePage brew={{ title: 'Changelog', text: this.props.changelog }} />}/>
<Route path='/' component={()=><HomePage welcomeText={this.props.welcomeText}/>}/>
</Switch>
</div>
</Router>
);
} }
}); });
module.exports = Homebrew; module.exports = Homebrew;
//TODO: Nicer Error page instead of just "cant get that"
// '/share/:id' : (args)=>{
// if(!this.props.brew.shareId){
// return <ErrorPage errorId={args.id}/>;
// }
//
// return <SharePage
// id={args.id}
// brew={this.props.brew} />;
// },

View File

@@ -1,4 +1,3 @@
@import 'naturalcrit/styles/core.less'; @import 'naturalcrit/styles/core.less';
.homebrew{ .homebrew{
height : 100%; height : 100%;

View File

@@ -1,3 +1,4 @@
require('./navbar.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');

View File

@@ -1,9 +1,10 @@
require('./editPage.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');
const cx = require('classnames'); const cx = require('classnames');
const request = require('superagent'); const request = require('superagent');
const Meta = require('vitreum/meta'); 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');

View File

@@ -1,3 +1,4 @@
require('./errorPage.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');

View File

@@ -1,9 +1,10 @@
require('./homePage.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');
const cx = require('classnames'); const cx = require('classnames');
const request = require('superagent'); const request = require('superagent');
const Meta = require('vitreum/meta'); 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');

View File

@@ -1,3 +1,4 @@
require('./newPage.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');

View File

@@ -1,8 +1,9 @@
require('./printPage.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');
const cx = require('classnames'); const cx = require('classnames');
const Meta = require('vitreum/meta'); const { Meta } = require('vitreum/headtags');
const Markdown = require('naturalcrit/markdown.js'); const Markdown = require('naturalcrit/markdown.js');
const PrintPage = createClass({ const PrintPage = createClass({

View File

@@ -1,8 +1,9 @@
require('./sharePage.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');
const cx = require('classnames'); const cx = require('classnames');
const Meta = require('vitreum/meta'); 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');

View File

@@ -1,3 +1,4 @@
require('./userPage.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');

View File

@@ -1,4 +1,3 @@
@import (less) 'shared/naturalcrit/styles/reset.less'; @import (less) 'shared/naturalcrit/styles/reset.less';
@import (less) './client/homebrew/phbStyle/phb.fonts.css'; @import (less) './client/homebrew/phbStyle/phb.fonts.css';
@import (less) './client/homebrew/phbStyle/phb.assets.less'; @import (less) './client/homebrew/phbStyle/phb.assets.less';

View File

@@ -1,21 +1,19 @@
module.exports = function(vitreum){ module.exports = async (name, props={})=>{
return ` return `
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link href="//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" /> <link href="//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<link href="//fonts.googleapis.com/css?family=Open+Sans:400,300,600,700" rel="stylesheet" type="text/css" /> <link href="//fonts.googleapis.com/css?family=Open+Sans:400,300,600,700" rel="stylesheet" type="text/css" />
<link href=${`/${name}/bundle.css`} rel='stylesheet'></link>
<link rel="icon" href="/assets/homebrew/favicon.ico" type="image/x-icon" /> <link rel="icon" href="/assets/homebrew/favicon.ico" type="image/x-icon" />
<title>The Homebrewery - NaturalCrit</title> <title>The Homebrewery - NaturalCrit</title>
${vitreum.head}
</head> </head>
<body> <body>
<main id="reactRoot">${vitreum.body}</main> <main id="reactRoot">${require(`../build/${name}/ssr.js`)(props)}</main>
</body> </body>
${vitreum.js} <script src=${`/${name}/bundle.js`}></script>
<script>start_app(${JSON.stringify(props)})</script>
</html> </html>
`; `;
}; };

8132
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -2,6 +2,9 @@
"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": "2.8.2", "version": "2.8.2",
"engines": {
"node": "12.16.x"
},
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git://github.com/naturalcrit/homebrewery.git" "url": "git://github.com/naturalcrit/homebrewery.git"
@@ -9,7 +12,8 @@
"scripts": { "scripts": {
"dev": "node scripts/dev.js", "dev": "node scripts/dev.js",
"quick": "node scripts/quick.js", "quick": "node scripts/quick.js",
"build": "node scripts/build.js", "build": "node scripts/buildHomebrew.js",
"buildall": "node scripts/buildHomebrew.js && node scripts/buildAdmin.js",
"lint": "eslint --fix **/*.{js,jsx}", "lint": "eslint --fix **/*.{js,jsx}",
"lint:dry": "eslint **/*.{js,jsx}", "lint:dry": "eslint **/*.{js,jsx}",
"circleci": "npm test && eslint **/*.{js,jsx} --max-warnings=0", "circleci": "npm test && eslint **/*.{js,jsx} --max-warnings=0",
@@ -18,7 +22,7 @@
"test:dev": "pico-check -v -w", "test:dev": "pico-check -v -w",
"phb": "node scripts/phb.js", "phb": "node scripts/phb.js",
"prod": "set NODE_ENV=production && npm run build", "prod": "set NODE_ENV=production && npm run build",
"postinstall": "npm run build", "postinstall": "npm run buildall",
"start": "node server.js" "start": "node server.js"
}, },
"author": "stolksdorf", "author": "stolksdorf",
@@ -36,26 +40,31 @@
] ]
}, },
"dependencies": { "dependencies": {
"babel-preset-env": "^1.7.0", "@babel/core": "^7.9.0",
"babel-preset-react": "^6.24.1", "@babel/preset-env": "^7.9.6",
"@babel/preset-react": "^7.9.4",
"body-parser": "^1.19.0", "body-parser": "^1.19.0",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"codemirror": "^5.53.2", "codemirror": "^5.53.2",
"cookie-parser": "^1.4.5", "cookie-parser": "^1.4.5",
"create-react-class": "^15.6.3", "create-react-class": "^15.6.3",
"express": "^4.17.1", "express": "^4.17.1",
"fs-extra": "9.0.0",
"jwt-simple": "^0.5.6", "jwt-simple": "^0.5.6",
"less": "^3.11.1",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"marked": "^0.3.19", "marked": "^0.3.19",
"moment": "^2.25.3", "moment": "^2.25.3",
"mongoose": "^5.9.12", "mongoose": "^5.9.12",
"nconf": "^0.10.0", "nconf": "^0.10.0",
"pico-router": "^2.1.0", "prop-types": "15.7.2",
"query-string": "6.12.1",
"react": "^16.13.1", "react": "^16.13.1",
"react-dom": "^16.13.1", "react-dom": "^16.13.1",
"react-router-dom": "5.2.0",
"shortid": "^2.2.15", "shortid": "^2.2.15",
"superagent": "^5.2.2", "superagent": "^5.2.2",
"vitreum": "^4.10.1" "vitreum": "github:calculuschild/vitreum#21a8e1c9421f1d3a3b474c12f480feb2fbd28c5b"
}, },
"devDependencies": { "devDependencies": {
"eslint": "^6.8.0", "eslint": "^6.8.0",

View File

@@ -1,20 +0,0 @@
const label = 'build';
console.time(label);
const clean = require('vitreum/steps/clean.js');
const jsx = require('vitreum/steps/jsx.js');
const lib = require('vitreum/steps/libs.js');
const less = require('vitreum/steps/less.js');
const asset = require('vitreum/steps/assets.js');
const Proj = require('./project.json');
clean()
.then(lib(Proj.libs))
.then(()=>jsx('homebrew', './client/homebrew/homebrew.jsx', { libs: Proj.libs, shared: ['./shared'] }))
.then((deps)=>less('homebrew', { shared: ['./shared'] }, deps))
.then(()=>jsx('admin', './client/admin/admin.jsx', { libs: Proj.libs, shared: ['./shared'] }))
.then((deps)=>less('admin', { shared: ['./shared'] }, deps))
.then(()=>asset(Proj.assets, ['./shared', './client']))
.then(console.timeEnd.bind(console, label))
.catch(console.error);

31
scripts/buildAdmin.js Normal file
View File

@@ -0,0 +1,31 @@
const fs = require('fs-extra');
const Proj = require('./project.json');
const { pack } = require('vitreum');
const isDev = !!process.argv.find((arg)=>arg=='--dev');
const lessTransform = require('vitreum/transforms/less.js');
const assetTransform = require('vitreum/transforms/asset.js');
//const Meta = require('vitreum/headtags');
const transforms = {
'.less' : lessTransform,
'*' : assetTransform('./build')
};
const build = async ({ bundle, render, ssr })=>{
await fs.outputFile('./build/admin/bundle.css', await lessTransform.generate({ paths: './shared' }));
await fs.outputFile('./build/admin/bundle.js', bundle);
await fs.outputFile('./build/admin/ssr.js', ssr);
await fs.outputFile('./build/admin/render.js', render);
};
fs.emptyDirSync('./build/admin');
pack('./client/admin/admin.jsx', {
paths : ['./shared'],
libs : Proj.libs,
dev : isDev && build,
transforms
})
.then(build)
.catch(console.error);

31
scripts/buildHomebrew.js Normal file
View File

@@ -0,0 +1,31 @@
const fs = require('fs-extra');
const Proj = require('./project.json');
const { pack } = require('vitreum');
const isDev = !!process.argv.find((arg)=>arg=='--dev');
const lessTransform = require('vitreum/transforms/less.js');
const assetTransform = require('vitreum/transforms/asset.js');
//const Meta = require('vitreum/headtags');
const transforms = {
'.less' : lessTransform,
'*' : assetTransform('./build')
};
const build = async ({ bundle, render, ssr })=>{
await fs.outputFile('./build/homebrew/bundle.css', await lessTransform.generate({ paths: './shared' }));
await fs.outputFile('./build/homebrew/bundle.js', bundle);
await fs.outputFile('./build/homebrew/ssr.js', ssr);
await fs.outputFile('./build/homebrew/render.js', render);
};
fs.emptyDirSync('./build/homebrew');
pack('./client/homebrew/homebrew.jsx', {
paths : ['./shared'],
libs : Proj.libs,
dev : isDev && build,
transforms
})
.then(build)
.catch(console.error);

View File

@@ -13,7 +13,6 @@
"codemirror/mode/javascript/javascript.js", "codemirror/mode/javascript/javascript.js",
"moment", "moment",
"superagent", "superagent",
"marked", "marked"
"pico-router"
] ]
} }

View File

@@ -121,21 +121,20 @@ app.get('/print/:id', (req, res, next)=>{
//Render the page //Render the page
const render = require('vitreum/steps/render'); //const render = require('.build/render');
const templateFn = require('./client/template.js'); const templateFn = require('./client/template.js');
app.use((req, res)=>{ app.use((req, res)=>{
render('homebrew', templateFn, { const props = {
version : require('./package.json').version, version : require('./package.json').version,
url : req.originalUrl, url : req.originalUrl,
welcomeText : welcomeText, welcomeText : welcomeText,
changelog : changelogText, changelog : changelogText,
brew : req.brew, brew : req.brew,
brews : req.brews, brews : req.brews,
account : req.account account : req.account,
}) };
.then((page)=>{ templateFn('homebrew', props)
return res.send(page); .then((page)=>res.send(page))
})
.catch((err)=>{ .catch((err)=>{
console.log(err); console.log(err);
return res.sendStatus(500); return res.sendStatus(500);

View File

@@ -1,7 +1,7 @@
const HomebrewModel = require('./homebrew.model.js').model; const HomebrewModel = require('./homebrew.model.js').model;
const router = require('express').Router(); const router = require('express').Router();
const Moment = require('moment'); const Moment = require('moment');
const render = require('vitreum/steps/render'); //const render = require('vitreum/steps/render');
const templateFn = require('../client/template.js'); const templateFn = require('../client/template.js');
const zlib = require('zlib'); const zlib = require('zlib');
@@ -100,7 +100,7 @@ router.get('/admin/stats', mw.adminOnly, (req, res)=>{
}); });
router.get('/admin', mw.adminOnly, (req, res)=>{ router.get('/admin', mw.adminOnly, (req, res)=>{
render('admin', templateFn, { templateFn('admin', {
url : req.originalUrl url : req.originalUrl
}) })
.then((page)=>res.send(page)) .then((page)=>res.send(page))

View File

@@ -1,4 +1,4 @@
require('./renderWarnings.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');

View File

@@ -1,3 +1,4 @@
require('./codeEditor.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');

View File

@@ -1,3 +1,4 @@
require('./nav.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');
@@ -70,4 +71,4 @@ const Nav = {
}; };
module.exports = Nav; module.exports = Nav;

View File

@@ -1,3 +1,4 @@
//@import (less) 'naturalcrit/styles/style.fonts.css';
nav{ nav{
background-color : #333; background-color : #333;
.navContent{ .navContent{
@@ -77,4 +78,4 @@ nav{
.navSection:last-child .navItem{ .navSection:last-child .navItem{
border-left : 1px solid #666; border-left : 1px solid #666;
} }
} }

View File

@@ -1,3 +1,4 @@
require('./splitPane.less');
const React = require('react'); const React = require('react');
const createClass = require('create-react-class'); const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');

View File

@@ -5,12 +5,12 @@
@import 'naturalcrit/styles/colors.less'; @import 'naturalcrit/styles/colors.less';
@import 'naturalcrit/styles/tooltip.less'; @import 'naturalcrit/styles/tooltip.less';
@font-face { @font-face {
font-family : CodeLight; font-family : 'CodeLight';
src : url('/assets/naturalcrit/styles/CODE Light.otf'); src : data-uri('naturalcrit/styles/CODE Light.otf') format('opentype');
} }
@font-face { @font-face {
font-family : CodeBold; font-family : 'CodeBold';
src : url('/assets/naturalcrit/styles/CODE Bold.otf'); src : data-uri('naturalcrit/styles/CODE Bold.otf') format('opentype');
} }
html,body, #reactRoot{ html,body, #reactRoot{
height : 100vh; height : 100vh;
@@ -47,4 +47,4 @@ button{
&:disabled{ &:disabled{
background-color : @silver !important; background-color : @silver !important;
} }
} }