diff --git a/public/objects/input/Input.jsx b/public/objects/input/Input.jsx index 7da6035..7a0beff 100644 --- a/public/objects/input/Input.jsx +++ b/public/objects/input/Input.jsx @@ -23,12 +23,14 @@ import React from 'react'; +import Styles from './Input.scss'; + +import Keyboard from '@public/keyboard/Keyboard'; + import Button from './button/Button'; import ButtonGroup from './button/ButtonGroup'; -import Form, { FormManager } from './form/Form'; -import InputGroup from './group/InputGroup'; +import Form, { FormManager, FormGroup } from './form/Form'; import Label from './label/Label'; -import Keyboard from '@public/keyboard/Keyboard'; export default class Input extends React.Component { constructor(props) { @@ -45,7 +47,8 @@ export default class Input extends React.Component { } componentDidMount() { - if(this.props.manager) this.props.manager.addInput(this); + let { manager } = this.props; + if(manager) manager.addInput(this); Keyboard.addListener(this); } @@ -85,49 +88,44 @@ export default class Input extends React.Component { } render() { - let ElementType = "input"; - let type = "text"; - let value; + let newProps = {...this.props}; + let { + value, className, type, children, style, error, danger, primary, + warning, manager + } = newProps; + + //Clear bad props + [ + "error", "danger", "primary", "warning", "manager", "style", "children" + ].forEach(e => delete newProps[e]); + + //Prop defaults + type = type || "text"; + + //Gen classes let clazzes = "o-input"; let innerClazzes = "o-input__inner"; - let style; - let props = Object.assign({}, this.props); - - //Determining - if(props.type) type = props.type; //Values - if(props.value) { - value = props.value; - } else { - value = props.children; - } + value = stateValue || value || children; //Style - if(props.style) { - style = props.style; - } else if(props.error || props.danger) { - style = "danger"; - } else if(props.warning) { - style = "warning"; - } else if(props.primary) { - style = "primary"; - } + if(primary) style = "primary"; + if(warning) style = "warning"; + if(error || danger) style = "danger"; //Classes - clazzes += " is-"+type; + clazzes += ` is-${type}`; if(style) { - clazzes += " o-input--style-"+style; - innerClazzes += " o-input--style-"+style+"__inner"; - } - if(props.className) { - clazzes += " " + props.className; - innerClazzes += " " + props.className + "-element"; + clazzes += ` o-input--style-${style}`; + innerClazzes += ` o-input--style-${style}__inner`; } - //Clear junk props - delete props.manager; + if(className) { + clazzes += ` ${className}`; + innerClazzes += ` ${className}-element`; + } //Now create the element let element; @@ -139,27 +137,15 @@ export default class Input extends React.Component { className={props.className} value={this.state.value} />); + } - } else if(type == "textarea") { - element = (<textarea - {...props} - className={innerClazzes} - onChange={this.onChange.bind(this)} - onFocus={this.onFocus.bind(this)} - onBlur={this.onBlur.bind(this)} - >{ this.state.value }</textarea> - ); + [ "onChange", "onFocus", "onBlur"].forEach(e => newProps[e] = this[e]); + //Text areas are slightly different + if(type == "textarea") { + element = <textarea {...newProps} className={innerClazzes} children={value} /> } else { - element = (<ElementType - {...props} - onChange={this.onChange.bind(this)} - onFocus={this.onFocus.bind(this)} - onBlur={this.onBlur.bind(this)} - type={type} - value={ this.state.value } - className={innerClazzes} - />); + element = <input {...newProps} type={type} value={ value } className={innerClazzes} />; } return ( @@ -179,7 +165,7 @@ export { ButtonGroup, Form, FormManager, - InputGroup, + FormGroup, TextArea, Label }; diff --git a/public/styles/objects/_input.scss b/public/objects/input/Input.scss similarity index 93% rename from public/styles/objects/_input.scss rename to public/objects/input/Input.scss index c47619d..bb04902 100644 --- a/public/styles/objects/_input.scss +++ b/public/objects/input/Input.scss @@ -9,6 +9,7 @@ * Version: * 1.0.0 - 2018/05/13 */ +@import '~@styles/global'; .o-input { @include t-input--style-dp(); diff --git a/public/objects/input/button/Button.jsx b/public/objects/input/button/Button.jsx index 80d4536..4c88e27 100644 --- a/public/objects/input/button/Button.jsx +++ b/public/objects/input/button/Button.jsx @@ -24,81 +24,61 @@ import React from 'react'; import { NavLink } from 'react-router-dom'; -export default class Button extends React.Component { - constructor(props) { - super(props); +import Styles from './Button.scss'; + +export default props => { + let newProps = {...props}; + let { + className, href, to, style, type, value, children, + error, danger, primary, warning, manager + } = newProps; + + [ + "style", "value", "href", "to", "children", "error", "danger", "primary", + "warning", "manager" + ].forEach(e => delete newProps[e]); + + type = type || "button"; + children = children || value; + + if(primary) style = "primary"; + if(warning) style = "warning"; + if(error || danger) style = "danger"; + + + let ElementType = "button";//Upper Camel-Case because of react requriements + let clazzes = "o-btn"; + + //Basic Element Determining + if(type) { + //Buttons and Input Buttons + clazzes += " is-button"; + + } else if(href) { + //Anchor Tags! + ElementType = "a"; + clazzes += " is-link is-anchor"; + newProps.href = to || href; + + } else if(to) { + ElementType = NavLink; + clazzes += " is-link is-nav-link"; + newProps.to = to || href; + + } else { + //Everything Else (button without a type); + clazzes += " is-not-button"; + } - render() { - let ElementType = "button";//Upper Camel-Case because of react requriements - let clazzes = "o-btn"; - let type = "button"; - let contents; - let href; - let to; - let activeClassName; - let style; + if(style) clazzes += ` o-btn--style-${style}`; + if(className) clazzes += ` ${className}`; - //Basic Element Determining - if(this.props.type) { - //Buttons and Input Buttons - type = this.props.type; - clazzes += " is-button"; - } else if(this.props.href) { - //Anchor Tags1 - ElementType = "a"; - href = this.props.href; - clazzes += " is-link is-anchor"; - } else if(this.props.to) { - //React NavLink/Link - to = this.props.to; - ElementType = NavLink; - clazzes += " is-link is-nav-link"; - activeClassName = "is-active"; - } else { - //Everything Else (button without a type); - clazzes += " is-not-button"; - } - - if(this.props.value) { - contents = this.props.value; - } else { - contents = this.props.children; - } - - //Determine Style - if(this.props.primary) { - style = "primary" - } else if(this.props.secondary) { - style = "secondary"; - } else if(this.props.danger) { - style = "danger"; - } else if(this.props.warning) { - style = "warning"; - } else if(this.props.style) { - style = this.props.style; - } - - //Style Clazzes - if(style) { - clazzes += " o-btn--style-"+style; - } - - //Determine extra clazzes - if(this.props.className) this.clazzes += " "+this.props.className; - - return ( - <ElementType - {...this.props} - type={type} - className={clazzes} - href={href} - to={to} - > - <span className={ "o-btn__inner" + (style ? " o-btn--style-" + style + "__inner" : "") }> - {contents} - </span> - </ElementType> - ); - } + return ( + <ElementType {...newProps} className={clazzes}> + <span className={"o-btn__inner"+(style?` o-btn--style-${style}__inner`:"")}> + {contents} + </span> + </ElementType> + ); } diff --git a/public/styles/objects/_button.scss b/public/objects/input/button/Button.scss similarity index 96% rename from public/styles/objects/_button.scss rename to public/objects/input/button/Button.scss index b9e6012..596a7cd 100644 --- a/public/styles/objects/_button.scss +++ b/public/objects/input/button/Button.scss @@ -12,6 +12,8 @@ * 1.0.1 - 2018/05/14 */ +@import '~@styles/global'; + //Default Button (applies to all styles) .o-btn { cursor: pointer; diff --git a/public/objects/input/button/ButtonGroup.jsx b/public/objects/input/button/ButtonGroup.jsx index 6d55a66..d82b303 100644 --- a/public/objects/input/button/ButtonGroup.jsx +++ b/public/objects/input/button/ButtonGroup.jsx @@ -23,10 +23,9 @@ import React from 'react'; -export default function(props) { +export default props => { + let { className } = props; return ( - <div {...props} className={"o-btn-group" + (props.className ? " "+props.className : "")}> - {props.children} - </div> + <div {...props} className={"o-btn-group" + (className?` ${className}`:"")} /> ); } diff --git a/public/objects/input/form/Form.jsx b/public/objects/input/form/Form.jsx index be4b389..260a5c2 100644 --- a/public/objects/input/form/Form.jsx +++ b/public/objects/input/form/Form.jsx @@ -22,47 +22,54 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import React from 'react'; + +import Styles from './Form.scss'; + +import FormGroup from './group/FormGroup'; import Loader, { LoaderBackdrop } from '@objects/loading/Loader'; -import Input, { InputGroup, TextArea } from './../Input'; +import Input, { TextArea } from './../Input'; export default class Form extends React.Component { constructor(props) { super(props); - //Prepare our initial state - let s = { - ajax: props.ajax || false, - loader: props.loader || false, - loading: false, - onSubmit: props.onSubmit, - contentType: props.contentType || props.encType || "application/x-www-form-urlencoded", - manager: props.manager - }; + let { + ajax, loader, onSubmit, contentType, encType, manager, action, method, + get, post + } = props; + + contentType = contentType || encType || "application/x-www-form-urlencoded"; //Determine action and method based off the internals - if(props.action) s.action = props.action; - if(props.method) s.method = props.method; - - if(props.get) { - s.action = props.get; - s.method = "GET"; + if(get) { + action = get; + method = "GET"; } - if(props.post) { - s.action = props.post; - s.method = "POST"; + if(post) { + action = post; + method = "POST"; } - //Write our state to the component - this.state = s; + //Prepare our initial state + this.state = { + ajax, + loader, + loading: false, + onSubmit, + contentType, + manager + }; } componentDidMount() { - if(this.props.manager) this.props.manager.addForm(this); + let { manager } = this.props; + if(manager) manager.addForm(this); } componentWillUnmount() { - if(this.props.manager) this.props.manager.removeForm(this); + let { manager } = this.props; + if(manager) manager.removeForm(this); } submit() { @@ -70,14 +77,19 @@ export default class Form extends React.Component { } onSubmit(e) { + let { + ajax, onSubmit, action, submitting, method, mode, contentType + } = this.state; + let { manager } = this.props; + //Is Ajax? - if(!this.state.ajax) { - return this.state.onSubmit ? this.state.onSubmit(e) : true; + if(!ajax) { + return onSubmit ? onSubmit(e) : true; } - if(e) e.preventDefault(); - if(!this.state.action) return console.warning("This form has no action."); - if(this.state.submitting) return false;//Already submitting? + if(e && e.preventDefault) e.preventDefault(); + if(!action) return console.warning("This form has no action."); + if(submitting) return false;//Already submitting? //Start submitting! this.setState({ @@ -87,30 +99,26 @@ export default class Form extends React.Component { //Prepare our data let data; - if(this.props.manager) { - data = this.props.manager.getFormData(); - } + if(manager) data = manager.getFormData(); + data = data || {}; - if(this.state.contentType == "application/json") { + if(contentType == "application/json") { let dataJson = {}; - data.forEach(function(value, key) { + data.forEach((value, key) => { dataJson[key] = value; }); data = JSON.stringify(dataJson); } //Prepare our request. - fetch(this.state.action, { - method: this.state.method, - mode: this.state.mode, + fetch(action, { + method: method, + mode: mode, body: data, headers: { - "Content-Type": this.state.contentType + "Content-Type": contentType } - }) - .then(this.onSubmitted.bind(this)) - .catch(this.onError.bind(this)) - ; + }).then(resp => this.onSubmitted(resp)).catch((e,a,b) => this.onError(e,a,b)); return false; } @@ -124,20 +132,19 @@ export default class Form extends React.Component { let is4xx = Math.floor(response.status / 400) === 1; if(is4xx) { return response[method]() - .then(this.onErrorText.bind(this)) - .catch(this.onError.bind(this)) + .then((e,a,b) => this.onErrorText(e,a,b)) + .catch((e,a,b) => this.onError(e,a,b)) ; - } else { - throw Error(response.statusText); } + throw Error(response.statusText); } if(this.props.onData) return this.props.onData(response); //Handle the old fashioned way (expect json) response[method]() - .then(this.onData.bind(this)) - .catch(this.onError.bind(this)) + .then(resp => this.onData(resp)) + .catch((e,a,b) => this.onError(e,a,b)) ; } @@ -163,13 +170,16 @@ export default class Form extends React.Component { } render() { + let { className, children } = this.props; + let { loader, loading } = this.state; + let clazz = "o-form"; - if(this.props.className) clazz += " " + this.props.className; + if(className) clazz += ` ${className}` //Do I need a loader? - let loader; - if(this.state.loader && this.state.loading) { - loader = ( + let loaderElement; + if(loader && loading) { + loaderElement = ( <LoaderBackdrop className="o-form__loader"> <Loader className="o-form__loader-spinner" /> </LoaderBackdrop> @@ -178,15 +188,14 @@ export default class Form extends React.Component { return ( <form + {...this.props} ref="formDOM" - className={clazz} + className={ clazz } method={ this.state.method } - autoComplete={ this.props.autoComplete } - target={ this.props.target } - onSubmit={ this.onSubmit.bind(this) } + onSubmit={ (e) => this.onSubmit(e) } > - { this.props.children } - { loader } + { children } + { loaderElement } </form> ); } @@ -235,5 +244,6 @@ class FormManager { } export { - FormManager + FormManager, + FormGroup }; diff --git a/public/styles/objects/_form.scss b/public/objects/input/form/Form.scss similarity index 88% rename from public/styles/objects/_form.scss rename to public/objects/input/form/Form.scss index ad98ad0..9a7809e 100644 --- a/public/styles/objects/_form.scss +++ b/public/objects/input/form/Form.scss @@ -8,6 +8,7 @@ * Version: * 1.0.0 - 2018/05/13 */ +@import '~@styles/global'; .o-form { position: relative; } diff --git a/public/objects/input/group/InputGroup.jsx b/public/objects/input/form/group/FormGroup.jsx similarity index 88% rename from public/objects/input/group/InputGroup.jsx rename to public/objects/input/form/group/FormGroup.jsx index cfea16b..ecb8262 100644 --- a/public/objects/input/group/InputGroup.jsx +++ b/public/objects/input/form/group/FormGroup.jsx @@ -23,14 +23,11 @@ import React from 'react'; -export default function(props) { +export default props => { let clazzes = "o-form__group"; - - if(props.className) clazzes += " " + props.className; + if(props.className) clazzes += ` ${props.className}`; return ( - <div className={clazzes}> - { props.children } - </div> + <div {...props} className={clazzes} /> ); } diff --git a/public/objects/input/label/Label.jsx b/public/objects/input/label/Label.jsx index 43086f5..f914296 100644 --- a/public/objects/input/label/Label.jsx +++ b/public/objects/input/label/Label.jsx @@ -23,13 +23,9 @@ import React from 'react'; -export default function(props) { +export default props => { let clazz = "o-label"; - if(props.className) clazz += " " + props.className; + if(props.className) clazz += ` ${props.className}`; - return ( - <label htmlFor={ props.htmlFor } className={clazz}> - { props.children } - </label> - ); + return <label {...props} className={clazz} />; } diff --git a/public/objects/layout/BoxSizer.jsx b/public/objects/layout/BoxSizer.jsx index 4338974..4d45027 100644 --- a/public/objects/layout/BoxSizer.jsx +++ b/public/objects/layout/BoxSizer.jsx @@ -1,17 +1,46 @@ +// Copyright (c) 2018 Dominic Masters +// +// MIT License +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + import React from 'react'; -export default (props) => { - let height = 100;/* Percentage of width */ +import Styles from './BoxSizer.scss'; - //TODO: Add more methods of resizing this box. - if(props.ratioWidth && props.ratioHeight) { - height = 100 / props.ratioWidth * props.ratioHeight; - } +export default props => { + let newProps = {...props}; + let { ratioWidth, ratioHeight, className } = props; + + let clazzes = "o-box-sizer"; + if(className) clazzes += ` ${className}`; + + ratioWidth = parseInt(ratioWidth); + ratioHeight = parseInt(ratioHeight); + + //TODO: Add more methods of resizing... + let height = 100; + if(ratioWidth && ratioHeight) height = 100 / ratioWidth * ratioHeight; //Box Sizer return ( - <div className="o-box-sizer" style={{ - paddingBottom: height + '%' - }} /> + <div {...props} className={classes} style={{ paddingBottom: `${height}%` }} /> ); }; diff --git a/public/styles/objects/_box-sizer.scss b/public/objects/layout/BoxSizer.scss similarity index 87% rename from public/styles/objects/_box-sizer.scss rename to public/objects/layout/BoxSizer.scss index 44ff676..7dadc68 100644 --- a/public/styles/objects/_box-sizer.scss +++ b/public/objects/layout/BoxSizer.scss @@ -5,6 +5,7 @@ * Version: * 1.0.0 - 2018/08/10 */ +@import '~@styles/global'; .o-box-sizer { width: 100%; /* padding-bottom will be set my JS */ diff --git a/public/objects/loading/Loader.jsx b/public/objects/loading/Loader.jsx index 507fc86..2ec077b 100644 --- a/public/objects/loading/Loader.jsx +++ b/public/objects/loading/Loader.jsx @@ -23,9 +23,11 @@ import React from 'react'; -const Loader = function(props) { +import Styles from './Loader.scss'; + +const Loader = props => { return ( - <span className={"o-loader"+(props.className?" "+props.className:"")}> + <span {...props} className={"o-loader"+(props.className?` ${props.className}`:"")}> <svg width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg" className="o-loader__image"> <g fill="none" fillRule="evenodd"> <g transform="translate(1 1)" strokeWidth="2"> @@ -39,11 +41,9 @@ const Loader = function(props) { ); } -const LoaderBackdrop = function(props) { +const LoaderBackdrop = props => { return ( - <div className={"o-loader__backdrop"+(props.className?" "+props.className:"")}> - { props.children } - </div> + <div {...props} className={"o-loader__backdrop"+(props.className?` ${props.className}`:"")} /> ); } diff --git a/public/styles/objects/_loader.scss b/public/objects/loading/Loader.scss similarity index 97% rename from public/styles/objects/_loader.scss rename to public/objects/loading/Loader.scss index 7d607f9..03a6552 100644 --- a/public/styles/objects/_loader.scss +++ b/public/objects/loading/Loader.scss @@ -10,6 +10,7 @@ * Version: * 1.0.0 - 2018/05/08 */ +@import '~@styles/global'; @include t-keyframes(o-loader--spin) { 0% { diff --git a/public/objects/modal/Modal.jsx b/public/objects/modal/Modal.jsx index 8667781..17f04fa 100644 --- a/public/objects/modal/Modal.jsx +++ b/public/objects/modal/Modal.jsx @@ -25,12 +25,16 @@ import React from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { CSSTransition, TransitionGroup } from 'react-transition-group'; -import { Button } from './../input/Input'; + +import Styles from './Modal.scss'; + import Language from '@public/language/Language'; import { openModal, closeModal } from '@public/actions/ModalActions'; -import { Heading4 } from '@objects/typography/Typography'; import Keyboard from '@public/keyboard/Keyboard'; +import { Button } from './../input/Input'; +import { Heading4 } from '@objects/typography/Typography'; + class Modal extends React.Component { constructor(props) { super(props); @@ -50,46 +54,33 @@ class Modal extends React.Component { } render() { - //Add necessary buttons - let buttons = []; - if(this.props.buttons) { - if(Array.isArray(buttons)) { - buttons.concat(this.props.buttons); - } else { - buttons.push(this.props.buttons); - } - } + let { buttons, closeModal, close, title, children, large, modal } = this.props; - if(this.props.close) { - buttons.push(<Button key="close" onClick={this.props.closeModal}>{ Language.get("modal.close") }</Button>); + //Add necessary buttons + buttons = buttons || []; + if(!Array.isArray(buttons)) buttons = [ buttons ]; + + if(close) { + buttons.push(<Button key="close" onClick={closeModal}>{ Language.get("modal.close") }</Button>); } //Inner divs let heading,body,footer; - if(this.props.title) { + + if(title) { heading = ( <div className="o-modal__box-heading"> - <Heading4 className="o-modal__title"> - { this.props.title } - </Heading4> + <Heading4 className="o-modal__title">\{ title }</Heading4> </div> ); } - if(this.props.children) { - body = ( - <div className="o-modal__box-body"> - { this.props.children } - </div> - ); + if(children) { + body = <div className="o-modal__box-body" children={ children } />; } - if(buttons) { - footer = ( - <div className="o-modal__box-footer"> - { buttons } - </div> - ); + if(buttons && buttons.length) { + footer = <div className="o-modal__box-footer">{ buttons }</div>; } //Create our modal contents @@ -97,11 +88,11 @@ class Modal extends React.Component { <div className="o-modal"> <div className="o-modal__inner"> {/* Provides both a good overlay, and a nice clickable area */} - <div className="o-modal__backdrop" onClick={this.props.closeModal}> + <div className="o-modal__backdrop" onClick={closeModal}> </div> {/* Box itself, has a background and a shadow */} - <div className={"o-modal__box" + (this.props.large ? " is-large":"")}> + <div className={"o-modal__box"+(large ? " is-large":"")}> { heading } { body } { footer } @@ -113,7 +104,7 @@ class Modal extends React.Component { //Display? let displayedContents = <div></div>; - if(this.props.modal.open) { + if(modal.open) { displayedContents = ( <CSSTransition appear={true} diff --git a/public/styles/objects/_modal.scss b/public/objects/modal/Modal.scss similarity index 98% rename from public/styles/objects/_modal.scss rename to public/objects/modal/Modal.scss index 0f78f8c..49bba47 100644 --- a/public/styles/objects/_modal.scss +++ b/public/objects/modal/Modal.scss @@ -10,6 +10,7 @@ * Version: * 1.0.0 - 2018/07/05 */ +@import '~@styles/global'; $o-modal--backdrop: rgba(0, 0, 0, 0.7); $o-modal--background: white; diff --git a/public/objects/typography/Heading.jsx b/public/objects/typography/Heading.jsx index 11acb02..6331388 100644 --- a/public/objects/typography/Heading.jsx +++ b/public/objects/typography/Heading.jsx @@ -24,15 +24,15 @@ import React from 'react'; const Heading = (props) => { - let level = props.level || 1; + let { level, size, className } = props; + + level = level || 1; + size = size || 1; + let CustomTag = "h"+level; - let clazz = "o-heading o-heading--"+level; - if(props.className) clazz += " " + props.className; - - - return ( - <CustomTag {...props} className={clazz} /> - ); + let clazz = `o-heading o-heading--${size}`; + if(className) clazz += ` ${className}`; + return <CustomTag {...props} className={clazz} />; } export default Heading; @@ -44,10 +44,5 @@ const Heading5 = (props) => { return <Heading {...props} level="5" />; }; const Heading6 = (props) => { return <Heading {...props} level="6" />; }; export { - Heading1, - Heading2, - Heading3, - Heading4, - Heading5, - Heading6 + Heading1, Heading2, Heading3, Heading4, Heading5, Heading6 }; diff --git a/public/objects/typography/Paragraph.jsx b/public/objects/typography/Paragraph.jsx index 7d61004..2476ea6 100644 --- a/public/objects/typography/Paragraph.jsx +++ b/public/objects/typography/Paragraph.jsx @@ -24,8 +24,6 @@ import React from 'react'; export default (props) => { - let clazz = "o-paragraph"; - if(props.className) clazz += " "+props.className; - - return <p {...props} className={clazz} /> + let { className } = props; + return <p {...props} className={"o-paragraph"+(className?` ${className}`: "")} />; }; diff --git a/public/objects/typography/Subtitle.jsx b/public/objects/typography/Subtitle.jsx index d9994ba..a776ca5 100644 --- a/public/objects/typography/Subtitle.jsx +++ b/public/objects/typography/Subtitle.jsx @@ -24,9 +24,6 @@ import React from 'react'; export default function(props) { - return ( - <p className={ "o-subtitle" + ( props.className ? " " + props.className : "") }> - { props.children } - </p> - ); + let { className } = props; + return <p {...props} className={"o-subtitle"+(className?` ${className}`: "")} />; } diff --git a/public/objects/typography/Title.jsx b/public/objects/typography/Title.jsx index c7b7ed7..5124e5b 100644 --- a/public/objects/typography/Title.jsx +++ b/public/objects/typography/Title.jsx @@ -23,10 +23,7 @@ import React from 'react'; -export default function(props) { - return ( - <h1 className={ "o-title" + ( props.className ? " " + props.className : "") }> - { props.children } - </h1> - ); +export default props => { + let { className } = props; + return <h1 {...props} className={"o-title"+(className?` ${className}`: "")} /> } diff --git a/public/objects/typography/Typography.jsx b/public/objects/typography/Typography.jsx index 4d2d556..f348544 100644 --- a/public/objects/typography/Typography.jsx +++ b/public/objects/typography/Typography.jsx @@ -21,6 +21,8 @@ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +import Styles from './Typography'; + import Title from './Title'; import Subtitle from './Subtitle'; import Paragraph from './Paragraph'; diff --git a/public/styles/objects/_title.scss b/public/objects/typography/Typography.scss similarity index 95% rename from public/styles/objects/_title.scss rename to public/objects/typography/Typography.scss index 4cfe9f0..f9e0243 100644 --- a/public/styles/objects/_title.scss +++ b/public/objects/typography/Typography.scss @@ -9,6 +9,7 @@ * Version: * 1.0.1 - 2018/06/05 */ +@import '~@styles/global'; //Font Sizes will scale according to .o-title { diff --git a/public/objects/video/Video.jsx b/public/objects/video/Video.jsx index c71453b..9905dee 100644 --- a/public/objects/video/Video.jsx +++ b/public/objects/video/Video.jsx @@ -36,32 +36,30 @@ export default class Video extends React.Component { constructor(props) { super(props); + let { autoPlay, loop, controls } = props; + if(typeof autoPlay === typeof undefined) autoPlay; + if(typeof loop === typeof undefined) loop; + if(typeof controls === typeof undefined) controls; + //Initial State this.state = { - autoPlay: this.props.autoPlay, - loop: this.props.loop, + autoPlay: autoPlay, + loop: loop, loader: false, - controls: this.props.controls + controls: controls }; - - //Bound events (for removing event listeners) - this.onPlayingBound = this.onPlaying.bind(this); - this.onWaitingBound = this.onWaiting.bind(this); - this.onPauseBound = this.onPause.bind(this); - this.onSeekedBound = this.onSeeked.bind(this); - this.onLoadStartBound = this.onLoadStart.bind(this); } componentDidMount() { - this.refs.video.addEventListener('playing', this.onPlayingBound); - this.refs.video.addEventListener('waiting', this.onWaitingBound); - this.refs.video.addEventListener('seeked', this.onSeekedBound); - this.refs.video.addEventListener('pause', this.onPauseBound); - this.refs.video.addEventListener('loadstart', this.onLoadStartBound); + let { video } = this.refs; + video.addEventListener('playing', () => this.onPlaying() ); + video.addEventListener('waiting', () => this.onWaiting() ); + video.addEventListener('seeked', () => this.onSeeked() ); + video.addEventListener('pause', () => this.onPause() ); + video.addEventListener('loadstart',() => this.onLoadStart() ); } componentWillUnmount() { - } //Standard Events - https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events @@ -103,21 +101,22 @@ export default class Video extends React.Component { //React Render render() { - //TODO: Add state support, as well as functional controls. + let { autoPlay, loop } = this.state; + let newProps = {...this.props}; + let { sources, className, gif, image } = this.props; - //Sources - let sources = []; - let sourceProps = this.props.sources ? this.props.sources : this.props; + sources = sources || []; + let sourceElements = []; for(let i = 0; i < VALID_SOURCES.length; i++) { let s = VALID_SOURCES[i]; if(!sourceProps[s]) continue; - sources.push(<source type={"video/"+s} src={sourceProps[s]} key={s} />); + sourceElements.push(<source type={"video/"+s} src={sourceProps[s]} key={s} />); } //Classes let clazz = "o-video"; - if(this.props.className) clazz += " " + this.props.className; + if(className) clazz += ` ${className}`; if(sourceProps.image) clazz += " has-image"; if(sourceProps.gif) clazz += " has-gif"; if(this.state.autoplay) clazz += " is-autoplaying"; diff --git a/public/styles/objects/_video.scss b/public/objects/video/Video.scss similarity index 96% rename from public/styles/objects/_video.scss rename to public/objects/video/Video.scss index c484f07..61012a2 100644 --- a/public/styles/objects/_video.scss +++ b/public/objects/video/Video.scss @@ -10,6 +10,8 @@ * Version: * 1.0.0 - 2018/05/07 */ +@import '~@styles/global'; + %o-video__media-cover { position: absolute; top: 0; diff --git a/public/pages/contact/ContactPage.jsx b/public/pages/contact/ContactPage.jsx index f276ba0..36ab1e2 100644 --- a/public/pages/contact/ContactPage.jsx +++ b/public/pages/contact/ContactPage.jsx @@ -47,7 +47,7 @@ import { Title, Heading1, Paragraph } from '@objects/typography/Typography'; import Input, { Form, FormManager, - InputGroup, + FormGroup, TextArea, Label, ButtonGroup @@ -109,7 +109,7 @@ class ContactPage extends React.Component { onError={ this.onError.bind(this) } manager={ this.manager } > - <InputGroup test="First Group"> + <FormGroup test="First Group"> <Label htmlFor="name"> { Language.get("pages.contact.name.label") } </Label> @@ -121,9 +121,9 @@ class ContactPage extends React.Component { maxLength={ Forms.contact.name.maxLength } manager={ this.manager } /> - </InputGroup> + </FormGroup> - <InputGroup > + <FormGroup > <Label htmlFor="email"> { Language.get("pages.contact.email.label") } </Label> @@ -135,9 +135,9 @@ class ContactPage extends React.Component { maxLength={ Forms.contact.email.maxLength } manager={ this.manager } /> - </InputGroup> + </FormGroup> - <InputGroup> + <FormGroup> <Label> htmlFor="message"> { Language.get("pages.contact.message.label") } </Label> @@ -150,7 +150,7 @@ class ContactPage extends React.Component { maxLength={ Forms.contact.message.maxLength } manager={ this.manager } /> - </InputGroup> + </FormGroup> <ButtonGroup> <Input type="submit" value={ Language.get("pages.contact.send") } primary="true" /> diff --git a/public/styles/objects/_background.scss b/public/styles/objects/_background.scss deleted file mode 100644 index 625ec32..0000000 --- a/public/styles/objects/_background.scss +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Background - * Styles for the background of the site. - * - * Dependencies: - * styles/settings/z.scss - * styles/tools/_absolute-centering.scss - * - * Version: - * 1.0.0 - 2018/05/17 - */ -.o-background { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: $s-z--background; - overflow: hidden; - - &__inner { - position: relative; - width: 100%; - height: 100%; - } -}