diff --git a/src/gui/app.jsx b/src/gui/app.jsx index 3123822..41fae2a 100644 --- a/src/gui/app.jsx +++ b/src/gui/app.jsx @@ -9,8 +9,8 @@ const App = () => { return (
- - + +
) } diff --git a/src/gui/app.styles.js b/src/gui/app.styles.js index 924dbc1..f0bc184 100644 --- a/src/gui/app.styles.js +++ b/src/gui/app.styles.js @@ -6,4 +6,9 @@ const layout = css({ flexDirection: 'column', }) -export default { layout } +const main = css({ + height: '100%', + overflow: 'hidden', +}) + +export default { layout, main } diff --git a/src/gui/components/navbar/navbar.jsx b/src/gui/components/navbar/navbar.jsx index 519c4f9..7f22029 100644 --- a/src/gui/components/navbar/navbar.jsx +++ b/src/gui/components/navbar/navbar.jsx @@ -26,7 +26,7 @@ Navbar.propTypes = { Navbar.defaultProps = { style: {}, - className: '', + className: undefined, } export default Navbar diff --git a/src/gui/components/tabs/index.js b/src/gui/components/tabs/index.js new file mode 100644 index 0000000..9a9d313 --- /dev/null +++ b/src/gui/components/tabs/index.js @@ -0,0 +1,4 @@ +import Tabs from './tabs' +import Tab from './tab' + +export { Tabs, Tab } diff --git a/src/gui/components/tabs/tab.jsx b/src/gui/components/tabs/tab.jsx new file mode 100644 index 0000000..488204c --- /dev/null +++ b/src/gui/components/tabs/tab.jsx @@ -0,0 +1,27 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { merge } from 'glamor' + +import styles from './tab.styles' + +const Tab = ({ tabKey, title, className, children }) => { + return ( +
+ {children} +
+ ) +} + +Tab.propTypes = { + tabKey: PropTypes.string.isRequired, + title: PropTypes.string.isRequired, + className: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), + children: PropTypes.oneOfType([PropTypes.node, PropTypes.array]), +} + +Tab.defaultProps = { + children: '', + className: undefined, +} + +export default Tab diff --git a/src/gui/components/tabs/tab.styles.js b/src/gui/components/tabs/tab.styles.js new file mode 100644 index 0000000..0ad1b1b --- /dev/null +++ b/src/gui/components/tabs/tab.styles.js @@ -0,0 +1,10 @@ +import { css } from 'glamor' + +const layout = css({ + width: '100%', + height: '100%', + overflow: 'auto', + padding: '1em', +}) + +export default { layout } diff --git a/src/gui/components/tabs/tabs.jsx b/src/gui/components/tabs/tabs.jsx new file mode 100644 index 0000000..746ccd3 --- /dev/null +++ b/src/gui/components/tabs/tabs.jsx @@ -0,0 +1,58 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import { merge } from 'glamor' + +import TabsHeader from './tabsHeader' +import TabsAction from './tabsActions' +import styles from './tabs.styles' + +class Tabs extends Component { + state = { + selected: this.props.defaultKey, + } + + handleSelectedTab = (key) => { + this.setState(() => ({ selected: key })) + } + + render() { + const { children, actions, className, actionsClassName, headersClassName } = this.props + + const childArray = React.Children.toArray(children) + const headers = childArray.map(({ props }) => ({ tabKey: props.tabKey, title: props.title })) + const selected = this.state.selected || headers[0].tabKey + const tab = childArray.find(c => c.props.tabKey === selected) + + return ( +
+ + + {tab} +
+ ) + } +} + +Tabs.propTypes = { + defaultKey: PropTypes.number, + children: PropTypes.oneOfType([PropTypes.node, PropTypes.array]).isRequired, + actions: PropTypes.oneOfType([PropTypes.node, PropTypes.object]), + className: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), + actionsClassName: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), + headersClassName: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), +} + +Tabs.defaultProps = { + defaultKey: undefined, + actions: undefined, + className: undefined, + actionsClassName: undefined, + headersClassName: undefined, +} + +export default Tabs diff --git a/src/gui/components/tabs/tabs.styles.js b/src/gui/components/tabs/tabs.styles.js new file mode 100644 index 0000000..bc9a6fa --- /dev/null +++ b/src/gui/components/tabs/tabs.styles.js @@ -0,0 +1,8 @@ +import { css } from 'glamor' + +const layout = css({ + position: 'relative', + border: '.1em solid #ddd', +}) + +export default { layout } diff --git a/src/gui/components/tabs/tabsActions.jsx b/src/gui/components/tabs/tabsActions.jsx new file mode 100644 index 0000000..1df1fa1 --- /dev/null +++ b/src/gui/components/tabs/tabsActions.jsx @@ -0,0 +1,28 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { merge } from 'glamor' + +import styles from './tabsActions.styles' + +const TabsActions = ({ actions, className }) => { + if (!actions) { + return null + } + return ( +
+ {actions} +
+ ) +} + +TabsActions.propTypes = { + actions: PropTypes.oneOfType([PropTypes.node, PropTypes.object]), + className: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), +} + +TabsActions.defaultProps = { + actions: undefined, + className: undefined, +} + +export default TabsActions diff --git a/src/gui/components/tabs/tabsActions.styles.js b/src/gui/components/tabs/tabsActions.styles.js new file mode 100644 index 0000000..9c70c95 --- /dev/null +++ b/src/gui/components/tabs/tabsActions.styles.js @@ -0,0 +1,10 @@ +import { css } from 'glamor' + +const layout = css({ + position: 'absolute', + top: 0, + right: 0, + padding: '.9em 1.1em', +}) + +export default { layout } diff --git a/src/gui/components/tabs/tabsHeader.jsx b/src/gui/components/tabs/tabsHeader.jsx new file mode 100644 index 0000000..285c629 --- /dev/null +++ b/src/gui/components/tabs/tabsHeader.jsx @@ -0,0 +1,43 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import { merge } from 'glamor' + +import styles from './tabsHeader.styles' + +class TabsHeader extends Component { + + handleSelectedTab = tabKey => () => { + this.props.onSelectTab(tabKey) + } + + render() { + const { headers, selectedTab, className } = this.props + return ( + + ) + } +} + +TabsHeader.propTypes = { + headers: PropTypes.arrayOf(PropTypes.object).isRequired, + selectedTab: PropTypes.string.isRequired, + onSelectTab: PropTypes.func.isRequired, + className: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), +} + +TabsHeader.defaultProps = { + className: undefined, +} + +export default TabsHeader diff --git a/src/gui/components/tabs/tabsHeader.styles.js b/src/gui/components/tabs/tabsHeader.styles.js new file mode 100644 index 0000000..6160b13 --- /dev/null +++ b/src/gui/components/tabs/tabsHeader.styles.js @@ -0,0 +1,26 @@ +import { css } from 'glamor' + +const layout = css({ + display: 'flex', + margin: 0, + padding: 0, + listStyle: 'none', + borderBottom: '1px solid #ddd', +}) + +const item = css({ + cursor: 'pointer', + marginRight: 0, + padding: '.9em 1.1em', + lineHeight: '1.1em', + color: '#607580', + fontWeight: 600, +}) + +const selected = css({ + cursor: 'default', + color: '#243641', + backgroundColor: '#ddd', +}) + +export default { layout, item, selected } diff --git a/src/gui/screens/workbench/props/__snapshots__/props.spec.js.snap b/src/gui/screens/workbench/props/__snapshots__/props.spec.js.snap index 69df7ad..49f50ad 100644 --- a/src/gui/screens/workbench/props/__snapshots__/props.spec.js.snap +++ b/src/gui/screens/workbench/props/__snapshots__/props.spec.js.snap @@ -4,72 +4,39 @@ exports[`component/props props.container.js should map redux model into properti
-
- props -
-
-
+/> `; exports[`component/props props.jsx should render by default 1`] = `
-
- props -
-
-
+/> `; exports[`component/props props.jsx should render inputs following given properties 1`] = `
-
- props -
-
- - -
+ +
`; @@ -77,29 +44,18 @@ exports[`component/props props.jsx should take custom className 1`] = `
-
- props -
-
-
+/> `; exports[`component/props props.jsx should take custom style 1`] = `
-
- props -
-
-
+/> `; diff --git a/src/gui/screens/workbench/props/input/input.jsx b/src/gui/screens/workbench/props/input/input.jsx index e138a13..496bbf1 100644 --- a/src/gui/screens/workbench/props/input/input.jsx +++ b/src/gui/screens/workbench/props/input/input.jsx @@ -27,7 +27,7 @@ Input.propTypes = { Input.defaultProps = { style: {}, - className: '', + className: undefined, value: undefined, } diff --git a/src/gui/screens/workbench/props/props.jsx b/src/gui/screens/workbench/props/props.jsx index 121bfe5..851e59a 100644 --- a/src/gui/screens/workbench/props/props.jsx +++ b/src/gui/screens/workbench/props/props.jsx @@ -8,10 +8,7 @@ import styles from './props.styles' const Props = ({ style, className, properties }) => { return (
-
props
-
- { properties.map(prop => ) } -
+ { properties.map(prop => ) }
) } @@ -24,7 +21,7 @@ Props.propTypes = { Props.defaultProps = { style: {}, - className: '', + className: undefined, properties: [], } diff --git a/src/gui/screens/workbench/props/props.styles.js b/src/gui/screens/workbench/props/props.styles.js index 9fdb089..5771023 100644 --- a/src/gui/screens/workbench/props/props.styles.js +++ b/src/gui/screens/workbench/props/props.styles.js @@ -3,12 +3,7 @@ import { css } from 'glamor' const layout = css({ display: 'block', boxSizing: 'border-box', + overflow: 'auto', }) -const title = css({ - fontWeight: 'bold', - fontSize: '1.1em', - paddingBottom: '.5em', -}) - -export default { layout, title } +export default { layout } diff --git a/src/gui/screens/workbench/workbench.jsx b/src/gui/screens/workbench/workbench.jsx index 9a48e5a..ce27eeb 100644 --- a/src/gui/screens/workbench/workbench.jsx +++ b/src/gui/screens/workbench/workbench.jsx @@ -2,6 +2,8 @@ import React from 'react' import Props from './props' import styles from './workbench.styles' + +import { Tabs, Tab } from '../../components/tabs' import WrappedComponent from '../../component.container' const Workbench = () => { @@ -10,7 +12,10 @@ const Workbench = () => {
- + + + Not implemented yet. +
) } diff --git a/src/gui/screens/workbench/workbench.styles.js b/src/gui/screens/workbench/workbench.styles.js index 2729ef4..9388218 100644 --- a/src/gui/screens/workbench/workbench.styles.js +++ b/src/gui/screens/workbench/workbench.styles.js @@ -2,6 +2,7 @@ import { css } from 'glamor' const layout = css({ display: 'flex', + height: '100%', justifyContent: 'space-between', }) @@ -12,7 +13,7 @@ const content = css({ const sidebar = css({ overflow: 'auto', - padding: '1em', + width: '25em', }) export default { layout, content, sidebar } diff --git a/src/gui/styles/global.js b/src/gui/styles/global.js index 1533089..938b6dc 100644 --- a/src/gui/styles/global.js +++ b/src/gui/styles/global.js @@ -9,3 +9,7 @@ css.global('html, body', { fontFamily: 'Arial, Helvetica, sans-serif', fontSize: '13px', }) + +css.global('*', { + boxSizing: 'border-box', +})