1
0
Fork 0

feat(components): Updated workbench to latest style changes

This commit is contained in:
Joost De Cock 2021-01-10 15:06:38 +01:00
parent 588a6ccb69
commit 9ec9377295
6 changed files with 243 additions and 163 deletions

View file

@ -5,6 +5,7 @@ import Design from '../Design'
import DraftConfigurator from '../../DraftConfigurator' import DraftConfigurator from '../../DraftConfigurator'
import fileSaver from 'file-saver' import fileSaver from 'file-saver'
import theme from '@freesewing/plugin-theme' import theme from '@freesewing/plugin-theme'
import Icon from '../../Icon'
import IconButton from '@material-ui/core/IconButton' import IconButton from '@material-ui/core/IconButton'
import DesignIcon from '@material-ui/icons/Fingerprint' import DesignIcon from '@material-ui/icons/Fingerprint'
import DumpIcon from '@material-ui/icons/LocalSee' import DumpIcon from '@material-ui/icons/LocalSee'
@ -12,8 +13,10 @@ import ClearIcon from '@material-ui/icons/HighlightOff'
import AdvancedIcon from '@material-ui/icons/Policy' import AdvancedIcon from '@material-ui/icons/Policy'
import PaperlessIcon from '@material-ui/icons/Nature' import PaperlessIcon from '@material-ui/icons/Nature'
import CompleteIcon from '@material-ui/icons/Style' import CompleteIcon from '@material-ui/icons/Style'
import HideIcon from '@material-ui/icons/ChevronLeft' import { FormattedMessage } from 'react-intl'
import Events from './Events' import Events from './Events'
import ActionsIcon from '@material-ui/icons/PlayCircleOutline'
import Switch from '@material-ui/core/Switch';
const DraftPattern = (props) => { const DraftPattern = (props) => {
const styles = { const styles = {
@ -48,65 +51,89 @@ const DraftPattern = (props) => {
const color = (check) => (check ? '#40c057' : '#fa5252') const color = (check) => (check ? '#40c057' : '#fa5252')
return ( return (
<div> <ul id='draft-config'>
<div style={{ margin: '1rem auto 0', textAlign: 'center' }}> <li>
<IconButton onClick={() => props.setHideAside(true)} title="Hide sidebar" {...iconProps}> <span title='Actions'>
<HideIcon /> <ActionsIcon />
</IconButton> <FormattedMessage id="app.actions" />
<IconButton </span>
onClick={() => props.setDesign(!props.design)} <ul className="config level-1">
title="Toggle design mode" <li className={`action toggle ${props.design ? 'on' : 'off'}`}>
{...iconProps} <span onClick={() => props.setDesign(!props.design)} title='Toggle design mode'>
> <DesignIcon />
<span style={{ color: color(props.design) }}> <FormattedMessage
<DesignIcon /> id={ props.design ? 'cfp.thingIsEnabled' : 'cfp.thingIsDisabled' }
</span> values={{ thing: <FormattedMessage id='cfp.designMode' /> }}
</IconButton> />
{props.design && ( <Switch
<IconButton color="primary"
onClick={() => props.raiseEvent('clearFocusAll', null)} name="design"
title="Clear design mode" checked={props.design}
{...iconProps} onChange={() => props.setDesign(!props.design)}
> />
<ClearIcon color="primary" /> </span>
</IconButton> </li>
)} <li className={`action toggle ${props.gist.settings.advanced ? 'on' : 'off'}`}>
<IconButton <span onClick={() => props.updateGist(!props.gist.settings.advanced, 'settings', 'advanced')} title='Toggle advanced settings'>
onClick={() => console.log(props.pattern)} <AdvancedIcon />
title="console.log(pattern)" <FormattedMessage
{...iconProps} id={ props.gist.settings.advanced ? 'cfp.thingIsEnabled' : 'cfp.thingIsDisabled' }
> values={{ thing: <FormattedMessage id='settings.advanced.title' /> }}
<DumpIcon color="primary" /> />
</IconButton> <Switch
| color="primary"
<IconButton name="advanced"
onClick={() => props.updateGist(!props.gist.settings.advanced, 'settings', 'advanced')} checked={props.gist.settings.advanced || false}
title="Toggle advanced settings" onClick={() => props.updateGist(!props.gist.settings.advanced, 'settings', 'advanced')}
{...iconProps} />
> </span>
<span style={{ color: color(props.gist.settings.advanced) }}> </li>
<AdvancedIcon /> <li className={`action toggle ${props.gist.settings.paperless ? 'on' : 'off'}`}>
</span> <span onClick={() => props.updateGist(!props.gist.settings.paperless, 'settings', 'paperless')} title='Toggle paperless'>
</IconButton> <PaperlessIcon />
<IconButton <FormattedMessage
onClick={() => props.updateGist(!props.gist.settings.paperless, 'settings', 'paperless')} id={ props.gist.settings.paperless ? 'cfp.thingIsEnabled' : 'cfp.thingIsDisabled' }
title="Toggle paperless" values={{ thing: <FormattedMessage id='settings.paperless.title' /> }}
{...iconProps} />
> <Switch
<span style={{ color: color(props.gist.settings.paperless) }}> color="primary"
<PaperlessIcon /> name="paperless"
</span> checked={props.gist.settings.paperless}
</IconButton> onChange={() => props.updateGist(!props.gist.settings.paperless, 'settings', 'paperless')}
<IconButton />
onClick={() => props.updateGist(!props.gist.settings.complete, 'settings', 'complete')} </span>
title="Toggle complete" </li>
{...iconProps} <li className={`action toggle ${props.gist.settings.complete ? 'on' : 'off'}`}>
> <span onClick={() => props.updateGist(!props.gist.settings.complete, 'settings', 'complete')} title='Toggle complete'>
<span style={{ color: color(props.gist.settings.complete) }}> <CompleteIcon />
<CompleteIcon /> <FormattedMessage
</span> id={ props.gist.settings.complete ? 'cfp.thingIsEnabled' : 'cfp.thingIsDisabled' }
</IconButton> values={{ thing: <FormattedMessage id='settings.complete.title' /> }}
</div> />
<Switch
color="primary"
name="complete"
checked={props.gist.settings.complete}
onChange={() => props.updateGist(!props.gist.settings.complete, 'settings', 'complete')}
/>
</span>
</li>
<li className="action">
<span onClick={() => console.log(props.pattern)} title='Log pattern object to console'>
<DumpIcon color="primary" />
console.log(pattern)
</span>
</li>
{props.design && (
<li className="action">
<span onClick={() => props.raiseEvent('clearFocusAll', null)} title='Clear design mode'>
<ClearIcon color="primary" />
<FormattedMessage id="cfp.clearDesignMode" />
</span>
</li>
)}
</ul>
</li>
{props.design && ( {props.design && (
<Design <Design
focus={props.focus} focus={props.focus}
@ -124,10 +151,10 @@ const DraftPattern = (props) => {
freesewing={props.freesewing} freesewing={props.freesewing}
units={props.units || 'metric'} units={props.units || 'metric'}
/> />
<div style={{ padding: '5px', marginTop: '1rem' }}> <li className='zoombox'>
<Zoombox patternProps={props.patternProps} setViewBox={props.setViewBox} /> <Zoombox patternProps={props.patternProps} setViewBox={props.setViewBox} />
</div> </li>
</div> </ul>
) )
} }

View file

@ -37,7 +37,7 @@ const DraftPattern = (props) => {
} }
return ( return (
<section> <>
<Draft <Draft
{...props.patternProps} {...props.patternProps}
design={props.design} design={props.design}
@ -47,7 +47,7 @@ const DraftPattern = (props) => {
className="freesewing draft shadow" className="freesewing draft shadow"
/> />
<Events events={props.patternProps.events} /> <Events events={props.patternProps.events} />
</section> </>
) )
} }

View file

@ -0,0 +1,65 @@
import React from 'react'
import Logo from '../Logo'
const Footer = (props) => {
return (
<footer>
<div className="cols">
<div>
<ul>
<li className="heading">
Wie ben jij?
</li>
<li>Ik ben <a href="https://github.com/joostdecock">Joost</a></li>
</ul>
</div>
<div>
<ul>
<li className="heading">
Wat is dit?
</li>
<li>Lessen informatica, maar dan zonder dat geouwehoer dat je in een school te horen krijgt</li>
</ul>
</div>
<div>
<ul>
<li className="heading">
Voor wie is het?
</li>
<li>Origineel voor Katleen en Sorcha, maar voor iedereen mag meedoen</li>
</ul>
</div>
<div>
<ul>
<li className="heading">
Klopt er iets niet?
</li>
<li>
Dan kan je dat gewoon <a href="https://github.com/joostdecock/cursus">
zelf aanpassen op Github
</a>
</li>
</ul>
</div>
<div>
<div className="logo">
<a href="https://freesewing.org/" title='freesewing.org'>
<Logo size={100} />
</a>
<div className="name">
<span className="free">Free</span>Sewing
</div>
</div>
<div className="slogan">
Come for the sewing patterns
<br />
Stay for the community
</div>
</div>
</div>
</footer>
)
}
export default React.memo(Footer)

View file

@ -8,67 +8,46 @@ const Welcome = props => {
container: { container: {
textAlign: "center", textAlign: "center",
maxWidth: "500px", maxWidth: "500px",
margin: "2vh auto" margin: "5vh auto",
}, minHeight: "65vh"
title: {
fontFamily: "Roboto Condensed"
},
button: {
margin: "0.5rem"
}, },
bigButton: { bigButton: {
margin: "0.5rem", margin: "0.5rem",
width: "calc(100% - 1rem)" width: "calc(100% - 3rem)"
}, },
footer: { }
fontFamily: "Roboto Condensed",
position: "fixed",
bottom: "10px",
left: 0,
width: "100%",
fontSize: "90%"
}
};
return ( return (
<React.Fragment> <section style={styles.container}>
<div /> <Logo size={200} />
<div className="fs-sa"> <h1>
<section style={styles.container}> <FormattedMessage id="app.welcome" />
<div> </h1>
<Logo size={250} /> <p>
</div> <FormattedMessage id="cfp.renderInBrowser" />
<h1 style={styles.title}> <br />
<FormattedMessage id="app.welcome" /> <FormattedMessage id="cfp.weWillReRender" />
</h1> </p>
<p> <Button
<FormattedMessage id="cfp.renderInBrowser" /> style={styles.bigButton}
<br /> variant="contained"
<FormattedMessage id="cfp.weWillReRender" /> size="large"
</p> color="primary"
<Button onClick={() => props.setDisplay("draft")}
style={styles.bigButton} >
variant="contained" <FormattedMessage id="cfp.draftYourPattern" />
size="large" </Button>
color="primary" <Button
onClick={() => props.setDisplay("draft")} style={styles.bigButton}
> variant="contained"
<FormattedMessage id="cfp.draftYourPattern" /> size="large"
</Button> color="primary"
<Button onClick={() => props.setDisplay("sample")}
style={styles.bigButton} >
variant="contained" <FormattedMessage id="cfp.testYourPattern" />
size="large" </Button>
color="primary" </section>
onClick={() => props.setDisplay("sample")} )
> }
<FormattedMessage id="cfp.testYourPattern" />
</Button>
</section>
</div>
<div />
</React.Fragment>
);
};
export default Welcome; export default Welcome;

View file

@ -24,6 +24,7 @@ import svgattrPlugin from '@freesewing/plugin-svgattr'
import Xport from './Export' import Xport from './Export'
import axios from 'axios' import axios from 'axios'
import yaml from 'yaml' import yaml from 'yaml'
import Footer from './Footer'
const icons = { const icons = {
draft: <DraftIcon />, draft: <DraftIcon />,
@ -32,6 +33,8 @@ const icons = {
xport: <ExportIcon /> xport: <ExportIcon />
} }
const extraTranslations = {}
const Workbench = ({ const Workbench = ({
updateGist, updateGist,
setLanguage, setLanguage,
@ -44,8 +47,13 @@ const Workbench = ({
units = 'metric', units = 'metric',
translations = false, translations = false,
addTranslations, addTranslations,
recreate = false recreate = false,
}) => { }) => {
if (translations) {
for (let key in translations) extraTranslations[key] = translations[key]
}
const [display, setDisplay] = useState(null) const [display, setDisplay] = useState(null)
const [theme, setTheme] = useState('light') const [theme, setTheme] = useState('light')
const [measurements, setMeasurements] = useState(null) const [measurements, setMeasurements] = useState(null)
@ -164,7 +172,7 @@ const Workbench = ({
//const raiseEvent = (type = null, data = null) => {} //const raiseEvent = (type = null, data = null) => {}
const MainMenu = () => ( const MainMenu = () => (
<ul className="aside-main-menu"> <ul id="main-menu" className="aside-main-menu">
{Object.keys(icons).map((link) => { {Object.keys(icons).map((link) => {
return ( return (
<li key={link}> <li key={link}>
@ -211,7 +219,7 @@ const Workbench = ({
} }
let main = null let main = null
let context = null let preMenu = null
let pattern let pattern
switch (display) { switch (display) {
case 'languages': case 'languages':
@ -223,19 +231,6 @@ const Workbench = ({
{languageButtons()} {languageButtons()}
</> </>
) )
context = (
<ul>
{Object.keys(languages).map((lang) => {
return (
<li key={lang}>
<a href="#" onClick={() => setLanguage(lang)}>
{languages[lang]}
</a>
</li>
)
})}
</ul>
)
break break
case 'draft': case 'draft':
if (measurementsMissing()) { if (measurementsMissing()) {
@ -263,7 +258,7 @@ const Workbench = ({
design={design} design={design}
/> />
) )
context = ( preMenu = (
<DraftConfig <DraftConfig
freesewing={freesewing} freesewing={freesewing}
Pattern={Pattern} Pattern={Pattern}
@ -292,7 +287,7 @@ const Workbench = ({
setDisplay('measurements') setDisplay('measurements')
break break
} }
context = ( preMenu = (
<SampleConfigurator <SampleConfigurator
config={config} config={config}
gist={gist} gist={gist}
@ -365,22 +360,26 @@ const Workbench = ({
setDisplay={setDisplay} setDisplay={setDisplay}
toggleDarkMode={toggleDarkMode} toggleDarkMode={toggleDarkMode}
config={config} config={config}
theme={theme}
/> />
<div className="fs-sa" style={{ position: 'relative' }}> <div className="layout-wrapper">
{hideAside ? ( <div className="layout">
<a href="#" style={styles.unhide} onClick={() => setHideAside(false)}> {hideAside ? (
<UnhideIcon /> <a href="#" style={styles.unhide} onClick={() => setHideAside(false)}>
</a> <UnhideIcon />
) : ( </a>
<aside> ) : (
<div className="sticky"> <aside>
<MainMenu /> <div className="sticky">
<div className="aside-context">{context}</div> {preMenu}
</div> <MainMenu />
</aside> </div>
)} </aside>
<section>{main}</section> )}
<section>{main}</section>
</div>
</div> </div>
<Footer />
</div> </div>
</MuiThemeProvider> </MuiThemeProvider>
) )
@ -391,5 +390,5 @@ export default withLanguage(
gist: defaultGist, gist: defaultGist,
store: true store: true
}), }),
'en' 'en', false, extraTranslations
) )

View file

@ -2,10 +2,12 @@ import React, { useState } from 'react'
import AppBar from '@material-ui/core/AppBar' import AppBar from '@material-ui/core/AppBar'
import Toolbar from '@material-ui/core/Toolbar' import Toolbar from '@material-ui/core/Toolbar'
import Button from '@material-ui/core/Button' import Button from '@material-ui/core/Button'
import IconButton from '@material-ui/core/IconButton'
import Logo from '../Logo' import Logo from '../Logo'
import { FormattedMessage } from 'react-intl' import { FormattedMessage } from 'react-intl'
import Icon from '../Icon' import Icon from '../Icon'
import LanguageIcon from '@material-ui/icons/Translate' import LanguageIcon from '@material-ui/icons/Translate'
import LightModeIcon from '@material-ui/icons/WbSunny'
import DarkModeIcon from '@material-ui/icons/Brightness3' import DarkModeIcon from '@material-ui/icons/Brightness3'
export default function ButtonAppBar(props) { export default function ButtonAppBar(props) {
@ -20,7 +22,7 @@ export default function ButtonAppBar(props) {
width: '100%', width: '100%',
margin: 0, margin: 0,
padding: 0, padding: 0,
background: props.theme === 'dark' ? colors.light : colors.dark, background: '#1a1d21',
zIndex: 15 zIndex: 15
}, },
logo: { logo: {
@ -35,7 +37,6 @@ export default function ButtonAppBar(props) {
padding: '0 18px' padding: '0 18px'
}, },
iconButton: { iconButton: {
color: colors[props.theme]
}, },
icon: { icon: {
maxWidth: '24px', maxWidth: '24px',
@ -48,7 +49,8 @@ export default function ButtonAppBar(props) {
darkModeIcon: { darkModeIcon: {
transform: 'rotate(26deg)', transform: 'rotate(26deg)',
maxWidth: '24px', maxWidth: '24px',
maxHeight: '24px' maxHeight: '24px',
color: '#ffe066'
} }
} }
@ -61,16 +63,15 @@ export default function ButtonAppBar(props) {
const iconStyle = { const iconStyle = {
marginRight: '0.5rem', marginRight: '0.5rem',
color: props.theme === 'dark' ? '#b197fc' : '#845ef7'
} }
return ( return (
<div style={style.wrapper}> <div style={style.wrapper}>
<AppBar position="static" color="secondary" elevation={0}> <AppBar position="static" color="transparent" elevation={2}>
<Toolbar disableGutters={true}> <Toolbar disableGutters={true}>
<Button {...buttonProps} href="#" onClick={() => props.setDisplay('null')}> <Button {...buttonProps} href="#" onClick={() => props.setDisplay('null')}>
<span>{props.config.name}</span> <span>{props.config.name}</span>
<span style={{ color: '#845ef7', fontSize: '80%' }}>.FreeSewing.dev</span> <span style={{ color: '#ced4da', fontSize: '80%' }}>.FreeSewing.dev</span>
</Button> </Button>
<Button {...buttonProps} href="https://chat.freesewing.org/"> <Button {...buttonProps} href="https://chat.freesewing.org/">
@ -93,9 +94,18 @@ export default function ButtonAppBar(props) {
<LanguageIcon className="nav-icon" /> <LanguageIcon className="nav-icon" />
</Button> </Button>
<Button onClick={props.toggleDarkMode} href="#"> <IconButton
<DarkModeIcon className="nav-icon moon" /> style={style.darkModeButton}
</Button> aria-label="menu"
onClick={props.toggleDarkMode}
title={props.theme}
>
{props.theme === 'dark' ? (
<LightModeIcon style={style.icon} />
) : (
<DarkModeIcon style={style.darkModeIcon} />
)}
</IconButton>
</Toolbar> </Toolbar>
</AppBar> </AppBar>
</div> </div>