1
0
mirror of https://github.com/chinchang/web-maker.git synced 2025-05-10 20:35:27 +02:00

createnewmodal: change ux

This commit is contained in:
Kushagra Gour 2019-03-18 09:57:00 +05:30
parent 1b00f87002
commit 1e71020d0b
4 changed files with 213 additions and 199 deletions

View File

@ -2,9 +2,9 @@ import { h, Component } from 'preact';
import Modal from './Modal'; import Modal from './Modal';
import { ItemTile } from './ItemTile'; import { ItemTile } from './ItemTile';
import templates from '../templateList'; import templates from '../templateList';
import { Divider } from './common'; import { BetaTag } from './common';
import Switch from './Switch';
import { trackEvent } from '../analytics'; import { trackEvent } from '../analytics';
import Tabs, { TabPanel } from './Tabs';
export class CreateNewModal extends Component { export class CreateNewModal extends Component {
constructor(props) { constructor(props) {
@ -30,10 +30,7 @@ export class CreateNewModal extends Component {
onImportGithubRepoSelect, onImportGithubRepoSelect,
onTemplateSelect onTemplateSelect
} = this.props; } = this.props;
return ( const option1 = (
<Modal show={show} closeHandler={closeHandler}>
<h1 class="mt-0">Create New</h1>
<div class="flex">
<div style="flex:1;" class="tac"> <div style="flex:1;" class="tac">
<svg <svg
width="287px" width="287px"
@ -45,6 +42,7 @@ export class CreateNewModal extends Component {
onClick={() => { onClick={() => {
this.setState({ isFileModeSelected: false }); this.setState({ isFileModeSelected: false });
}} }}
aria-hidden="true"
> >
<g <g
id="Page-1" id="Page-1"
@ -54,42 +52,21 @@ export class CreateNewModal extends Component {
fill-rule="evenodd" fill-rule="evenodd"
> >
<g id="codepane" fill="#C5C5C5"> <g id="codepane" fill="#C5C5C5">
<rect <rect id="Rectangle" x="0" y="0" width="89" height="80" rx="5" />
id="Rectangle"
x="0"
y="0"
width="89"
height="80"
rx="5"
/>
</g> </g>
<g <g
id="codepane" id="codepane"
transform="translate(99.000000, 0.000000)" transform="translate(99.000000, 0.000000)"
fill="#C5C5C5" fill="#C5C5C5"
> >
<rect <rect id="Rectangle" x="0" y="0" width="89" height="80" rx="5" />
id="Rectangle"
x="0"
y="0"
width="89"
height="80"
rx="5"
/>
</g> </g>
<g <g
id="codepane" id="codepane"
transform="translate(198.000000, 0.000000)" transform="translate(198.000000, 0.000000)"
fill="#C5C5C5" fill="#C5C5C5"
> >
<rect <rect id="Rectangle" x="0" y="0" width="89" height="80" rx="5" />
id="Rectangle"
x="0"
y="0"
width="89"
height="80"
rx="5"
/>
</g> </g>
<g <g
id="codepane" id="codepane"
@ -107,19 +84,13 @@ export class CreateNewModal extends Component {
</g> </g>
</g> </g>
</svg> </svg>
<p> <p class="mb-0">
3 separate panes to write HTML, CSS and JavaScript. Good for 3 separate panes to write HTML, CSS and JavaScript. Good for quickly
quickly testing something. testing something.
</p> </p>
</div> </div>
<div class="tac ml-2" style="margin-top:100px;"> );
<Switch const option2 = (
checked={this.state.isFileModeSelected}
labels={['3 panes', 'Files (beta)']}
onChange={this.modeChangeHandler}
showBothLabels
/>
</div>
<div style="flex:1" class="tac ml-2"> <div style="flex:1" class="tac ml-2">
<svg <svg
width="286px" width="286px"
@ -131,6 +102,7 @@ export class CreateNewModal extends Component {
onClick={() => { onClick={() => {
this.setState({ isFileModeSelected: true }); this.setState({ isFileModeSelected: true });
}} }}
aria-hidden="true"
> >
<g <g
id="Page-1" id="Page-1"
@ -174,53 +146,74 @@ export class CreateNewModal extends Component {
</g> </g>
</g> </g>
</svg> </svg>
<p> <p class="mb-0">
Manage your code in files. Just like you would have files on your Manage your code in files. Just like you would have files on your
local machine. local machine. <BetaTag />
</p> </p>
</div> </div>
</div> );
<Divider />
<div class="tac"> return (
<Modal show={show} closeHandler={closeHandler}>
<h1 class="mt-0">Create New</h1>
<Tabs horizontal>
<TabPanel label={option1}>
<div class="d-f fxw-w">
<button <button
type="button" type="button"
class="btn btn--primary" class="btn btn--primary"
style="margin:20px 10px"
onClick={() => { onClick={() => {
trackEvent('ui', 'startBlankBtnClick'); trackEvent('ui', 'startBlankBtnClick');
this.state.isFileModeSelected onBlankTemplateSelect();
? onBlankFileTemplateSelect()
: onBlankTemplateSelect();
}} }}
> >
Start Blank Start Blank
</button> </button>
<p>Or choose from a template:</p>
<div class="saved-items-pane__container">
{templates.map(template => { {templates.map(template => {
if (
!this.state.isFileModeSelected ||
template.isFileModeSupported
) {
return ( return (
<ItemTile <ItemTile
inline inline
item={template} item={template}
focusable focusable
onClick={onTemplateSelect.bind( onClick={onTemplateSelect.bind(null, template)}
null, />
template, );
this.state.isFileModeSelected })}
)} </div>
</TabPanel>
<TabPanel label={option2}>
<div class="d-f fxw-w">
<button
type="button"
class="btn btn--primary"
style="margin:20px 10px"
onClick={() => {
trackEvent('ui', 'startBlankFileBtnClick');
onBlankFileTemplateSelect();
}}
>
Start Blank in File Mode
</button>
{templates.map(template => {
if (template.isFileModeSupported) {
return (
<ItemTile
inline
item={template}
focusable
onClick={onTemplateSelect.bind(null, template, true)}
/> />
); );
} }
})} })}
</div> </div>
</div> </TabPanel>
<div class="tac"> </Tabs>
{/*<div class="tac">
<p> <p>
{/*<button <button
className="btn" className="btn"
onClick={() => onClick={() =>
this.setState({ this.setState({
@ -229,7 +222,7 @@ export class CreateNewModal extends Component {
} }
> >
Import Github Repository Import Github Repository
</button>*/} </button>
{this.state.isGhRepoInputVisible ? ( {this.state.isGhRepoInputVisible ? (
<div> <div>
@ -245,7 +238,7 @@ export class CreateNewModal extends Component {
</div> </div>
) : null} ) : null}
</p> </p>
</div> </div>*/}
</Modal> </Modal>
); );
} }

View File

@ -1,8 +1,11 @@
import { h, Component } from 'preact'; import { h, Component } from 'preact';
function hyphenate(text) { function hyphenate(text) {
if (text.replace) {
return text.replace(/\s/g, '-'); return text.replace(/\s/g, '-');
} }
return '';
}
const ID_PREFIX = 'tab-panel-'; const ID_PREFIX = 'tab-panel-';
export function TabPanel({ label }) { export function TabPanel({ label }) {
@ -63,7 +66,7 @@ export default class Tabs extends Component {
render() { render() {
const tabs = this.props.children; const tabs = this.props.children;
return ( return (
<div class="tabs"> <div class={`tabs ${this.props.horizontal ? 'tabs--horizontal' : ''}`}>
<div <div
class="tabs__tablist" class="tabs__tablist"
role="tablist" role="tablist"
@ -79,8 +82,8 @@ export default class Tabs extends Component {
))} ))}
</div> </div>
<div class="tabs__tabpanel-wrap"> <div class="tabs__tabpanel-wrap">
{tabs.map( {tabs.map((child, index) =>
(child, index) => (this.state.selectedTab === index ? child : null) this.state.selectedTab === index ? child : null
)} )}
</div> </div>
</div> </div>

View File

@ -36,3 +36,7 @@ export function AutoFocusInput(props) {
export function Divider(props) { export function Divider(props) {
return <div class={`divider ${props.vertical ? 'divider--vertical' : ''}`} />; return <div class={`divider ${props.vertical ? 'divider--vertical' : ''}`} />;
} }
export function BetaTag() {
return <span class="beta-tag">Beta</span>;
}

View File

@ -123,6 +123,12 @@ button {
.jc-sb { .jc-sb {
justify-content: space-between; justify-content: space-between;
} }
.fxd-c {
flex-direction: column;
}
.fxw-w {
flex-wrap: wrap;
}
.fr { .fr {
float: right; float: right;
@ -1610,19 +1616,15 @@ body > #demo-frame {
display: inline-block; display: inline-block;
} }
/* .beta-tag {
.web-maker-with-tag:after {
content: 'BETA';
position: relative;
left: 3px;
top: -7px;
border-radius: 4px; border-radius: 4px;
background: #b76b29; text-transform: uppercase;
background: #c68955;
color: white; color: white;
letter-spacing: 0.6px; letter-spacing: 0.6px;
padding: 2px; padding: 2px 5px;
font-size: 10px; font-size: 0.9em;
} */ }
.is-extension .web-maker-with-tag:after { .is-extension .web-maker-with-tag:after {
display: none; display: none;
@ -1948,7 +1950,7 @@ while the theme CSS file is loading */
display: flex; display: flex;
} }
.tabs__tablist { .tabs__tablist {
margin-right: 40px; /* margin-right: 40px; */
flex-shrink: 0; flex-shrink: 0;
} }
.tabs__tab { .tabs__tab {
@ -1961,11 +1963,23 @@ while the theme CSS file is loading */
color: inherit; color: inherit;
} }
.tabs__tab--selected { .tabs__tab--selected {
background-color: rgba(0, 0, 0, 0.5); background-color: rgba(0, 0, 0, 0.2);
} }
.tabs__tabpanel-wrap { .tabs__tabpanel-wrap {
flex: 1; flex: 1;
} }
.tabs__tabpanel {
padding: 2em;
background-color: rgba(0, 0, 0, 0.2);
border-radius: 5px;
}
.tabs--horizontal {
flex-direction: column;
}
.tabs--horizontal .tabs__tablist {
display: flex;
justify-content: center;
}
@media screen and (max-width: 600px) { @media screen and (max-width: 600px) {
body { body {