diff --git a/package.json b/package.json
index fd088d7..8d90130 100644
--- a/package.json
+++ b/package.json
@@ -113,7 +113,9 @@
"passport-linkedin-oauth2": "^1.4.1",
"pm2": "^2.0.18",
"react": "^15.3.2",
+ "react-addons-shallow-compare": "^15.3.2",
"react-bootstrap": "^0.30.5",
+ "react-dates": "^4.0.0",
"react-dom": "^15.0.2",
"react-ga": "^2.1.2",
"react-google-recaptcha": "^0.5.4",
@@ -125,6 +127,7 @@
"react-router": "^2.3.0",
"react-router-active-component": "^4.0.0",
"react-router-redux": "^4.0.6",
+ "react-slider": "^0.7.0",
"redux": "^3.5.2",
"redux-form": "^6.1.0",
"redux-thunk": "^2.1.0",
diff --git a/src/common/components/forms/DemoForm.js b/src/common/components/forms/DemoForm.js
new file mode 100644
index 0000000..881f49c
--- /dev/null
+++ b/src/common/components/forms/DemoForm.js
@@ -0,0 +1,240 @@
+import React, { Component } from 'react';
+import { connect } from 'react-redux';
+import { Link } from 'react-router';
+import { Field, reduxForm } from 'redux-form';
+import Alert from 'react-bootstrap/lib/Alert';
+import Button from 'react-bootstrap/lib/Button';
+import FormNames from '../../constants/FormNames';
+import { Form, FormField, FormFooter } from '../utils/BsForm';
+import Head from '../widgets/Head';
+
+class DemoForm extends Component {
+ constructor() {
+ super();
+ this.handleSubmit = this._handleSubmit.bind(this);
+ }
+
+ _handleSubmit(formData) {
+ console.log('formData', formData);
+ // let { dispatch, apiEngine } = this.props;
+ //
+ // return someAPI(apiEngine)
+ // .doSomething(formData)
+ // .catch((err) => {
+ // dispatch(pushErrors(err));
+ // throw err;
+ // })
+ // .then((json) => {
+ // console.log('json', json);
+ // });
+ }
+
+ render() {
+ let {
+ handleSubmit,
+ submitFailed,
+ error,
+ pristine,
+ submitting,
+ invalid,
+ demoForm: { values },
+ } = this.props;
+
+ return (
+
+ {submitFailed && error && ({error})}
+
+ File object is not going to show here.
+ Please submit the form and check the console.
+
+ {JSON.stringify(values, null, 2)}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+};
+
+export default reduxForm({
+ form: FormNames.DEMO,
+ initialValues: {
+ somePassword: 'xxxxxxxxxx',
+ someRangeSlider: {
+ min: 10,
+ max: 30,
+ },
+ },
+})(connect(state => ({
+ apiEngine: state.apiEngine,
+ demoForm: state.form[FormNames.DEMO],
+}))(DemoForm));
diff --git a/src/common/components/forms/user/AvatarForm.js b/src/common/components/forms/user/AvatarForm.js
index 8e5f4a5..5d24bac 100644
--- a/src/common/components/forms/user/AvatarForm.js
+++ b/src/common/components/forms/user/AvatarForm.js
@@ -10,6 +10,7 @@ import userAPI from '../../../api/user';
import { pushErrors } from '../../../actions/errorActions';
import { setCookies } from '../../../actions/cookieActions';
import { Form, FormField, FormFooter } from '../../utils/BsForm';
+import Head from '../../widgets/Head';
import toRefreshURL from '../../../utils/toRefreshURL';
const initialValues = {
@@ -196,6 +197,11 @@ class AvatarForm extends Component {
return (
{avatarURL && }
{
errors.password = 'Required';
}
+ if (!values.isAgreeTerms) {
+ errors.isAgreeTerms = 'Required';
+ }
+
if (configs.recaptcha && !values.recaptcha) {
errors.recaptcha = 'Required';
}
@@ -74,6 +78,7 @@ class RegisterForm extends Component {
asyncValidating,
submitting,
invalid,
+ registerForm: { values },
} = this.props;
return (
@@ -100,6 +105,13 @@ class RegisterForm extends Component {
type="password"
placeholder="Password"
/>
+ I agree the terms}
+ />
({
apiEngine: state.apiEngine,
+ registerForm: state.form[FormNames.USER_REGISTER],
}))(RegisterForm));
diff --git a/src/common/components/pages/demo/FormElementPage.js b/src/common/components/pages/demo/FormElementPage.js
new file mode 100644
index 0000000..2110f4e
--- /dev/null
+++ b/src/common/components/pages/demo/FormElementPage.js
@@ -0,0 +1,17 @@
+import React from 'react';
+import PageHeader from 'react-bootstrap/lib/PageHeader';
+import PageLayout from '../../layouts/PageLayout';
+import DemoForm from '../../forms/DemoForm';
+
+let FormElementPage = (props) => (
+
+ Form Elements
+
+ There are a rich amount of field types built inside the boilerplate.
+ You can reuse them to prototype your custom form.
+
+
+
+);
+
+export default FormElementPage;
diff --git a/src/common/components/pages/user/ShowPage.js b/src/common/components/pages/user/ShowPage.js
index 4e985bd..d05ecab 100644
--- a/src/common/components/pages/user/ShowPage.js
+++ b/src/common/components/pages/user/ShowPage.js
@@ -9,7 +9,6 @@ import Button from 'react-bootstrap/lib/Button';
import Image from 'react-bootstrap/lib/Image';
import userAPI from '../../../api/user';
import { pushErrors } from '../../../actions/errorActions';
-import Head from '../../widgets/Head';
import PageLayout from '../../layouts/PageLayout';
import Time from '../../widgets/Time';
import VerifyEmailForm from '../../forms/user/VerifyEmailForm';
@@ -76,11 +75,6 @@ class ShowPage extends Component {
const { user } = this.state;
return (
-
{this.renderModal()}
diff --git a/src/common/components/utils/AirDateRange.js b/src/common/components/utils/AirDateRange.js
new file mode 100644
index 0000000..9797078
--- /dev/null
+++ b/src/common/components/utils/AirDateRange.js
@@ -0,0 +1,51 @@
+import React, { Component, PropTypes } from 'react';
+import { DateRangePicker } from 'react-dates';
+
+let defaultValue = {
+ startDate: null,
+ endDate: null,
+};
+
+class AirDateRange extends Component {
+ constructor() {
+ super();
+ this.state = {
+ focusedInput: null,
+ };
+ this.onDatesChange = this._onDatesChange.bind(this);
+ this.onFocusChange = this._onFocusChange.bind(this);
+ }
+
+ _onDatesChange({ startDate, endDate }) {
+ this.props.input.onChange({ startDate, endDate });
+ }
+
+ _onFocusChange(focusedInput) {
+ this.setState({ focusedInput });
+ }
+
+ render() {
+ let {
+ input,
+ ...rest
+ } = this.props;
+ let { focusedInput } = this.state;
+
+ return (
+
+ );
+ }
+}
+
+AirDateRange.propTypes = {
+ input: PropTypes.object.isRequired,
+};
+
+export default AirDateRange;
diff --git a/src/common/components/utils/AirSingleDate.js b/src/common/components/utils/AirSingleDate.js
new file mode 100644
index 0000000..81494e8
--- /dev/null
+++ b/src/common/components/utils/AirSingleDate.js
@@ -0,0 +1,48 @@
+import React, { Component, PropTypes } from 'react';
+import { SingleDatePicker } from 'react-dates';
+
+let defaultValue = null;
+
+class AirSingleDate extends Component {
+ constructor() {
+ super();
+ this.state = {
+ focused: false,
+ };
+ this.onDateChange = this._onDateChange.bind(this);
+ this.onFocusChange = this._onFocusChange.bind(this);
+ }
+
+ _onDateChange(date) {
+ this.props.input.onChange(date);
+ }
+
+ _onFocusChange({ focused }) {
+ this.setState({ focused });
+ }
+
+ render() {
+ let {
+ input,
+ ...rest
+ } = this.props;
+ let { focused } = this.state;
+
+ return (
+
+ );
+ }
+}
+
+AirSingleDate.propTypes = {
+ input: PropTypes.object.isRequired,
+};
+
+export default AirSingleDate;
diff --git a/src/common/components/utils/BsForm.js b/src/common/components/utils/BsForm.js
index 7ea72a4..c380901 100644
--- a/src/common/components/utils/BsForm.js
+++ b/src/common/components/utils/BsForm.js
@@ -5,6 +5,9 @@ import Col from 'react-bootstrap/lib/Col';
import ControlLabel from 'react-bootstrap/lib/ControlLabel';
import HelpBlock from 'react-bootstrap/lib/HelpBlock';
import Recaptcha from 'react-google-recaptcha';
+import RangeSlider from './RangeSlider.js';
+import AirSingleDate from './AirSingleDate.js';
+import AirDateRange from './AirDateRange.js';
import configs from '../../../../configs/project/client';
class BsForm extends Component {
@@ -62,7 +65,7 @@ BsForm.childContextTypes = {
};
let BsFormField = ({
- label, input, type, meta, options, ...rest
+ label, input, type, meta, options, text, ...rest
}, {
labelDimensions, fieldDimensions, horizontal,
}) => {
@@ -82,7 +85,48 @@ let BsFormField = ({
Recaptcha is disabled
);
/* eslint-enable */
- } else if (options) {
+ } else if (type === 'checkbox') {
+ formControl = (
+
+
+
+ );
+ } else if (type === 'checkboxes') {
+ // ref:
+ // -
+ formControl = (
+ options.map((option, index) => (
+
+
+
+ ))
+ );
+ } else if (type === 'radiobutton') {
// ref:
formControl = (
options.map((option) => (
@@ -100,6 +144,54 @@ let BsFormField = ({
))
);
+ } else if (type === 'select') {
+ formControl = (
+
+ );
+ } else if (type === 'rangeSlider') {
+ formControl = (
+
+ );
+ } else if (type === 'airSingleDate') {
+ formControl = (
+
+ );
+ } else if (type === 'airDateRange') {
+ formControl = (
+
+ );
+ } else if (type === 'plaintext') {
+ formControl = (
+
+ {text}
+
+ );
+ } else if (type === 'textarea') {
+ formControl = (
+
+ );
} else {
formControl = (
+
+ Form Elements
+
404
diff --git a/src/common/components/utils/RangeSlider.js b/src/common/components/utils/RangeSlider.js
new file mode 100644
index 0000000..bf863ba
--- /dev/null
+++ b/src/common/components/utils/RangeSlider.js
@@ -0,0 +1,42 @@
+import React, { Component, PropTypes } from 'react';
+import ReactSlider from 'react-slider';
+
+let defaultValue = {
+ min: 0,
+ max: 0,
+};
+
+class RangeSlider extends Component {
+ render() {
+ let {
+ input,
+ ...rest
+ } = this.props;
+
+ return (
+ {
+ input.onChange({
+ min: value[0],
+ max: value[1],
+ });
+ }}
+ value={[
+ input.value.min || defaultValue.min,
+ input.value.max || defaultValue.max,
+ ]}
+ withBars
+ >
+
+
+
+ );
+ }
+}
+
+RangeSlider.propTypes = {
+ input: PropTypes.object.isRequired,
+};
+
+export default RangeSlider;
diff --git a/src/common/constants/FormNames.js b/src/common/constants/FormNames.js
index 794e49f..65800ed 100644
--- a/src/common/constants/FormNames.js
+++ b/src/common/constants/FormNames.js
@@ -1,4 +1,5 @@
export default {
+ DEMO: 'DEMO',
USER_REGISTER: 'USER_REGISTER',
USER_LOGIN: 'USER_LOGIN',
USER_EDIT: 'USER_EDIT',
diff --git a/src/common/routes/demo/formElement.js b/src/common/routes/demo/formElement.js
new file mode 100644
index 0000000..4b6222c
--- /dev/null
+++ b/src/common/routes/demo/formElement.js
@@ -0,0 +1,8 @@
+export default (store) => ({
+ path: 'form-element',
+ getComponent(nextState, cb) {
+ require.ensure([], (require) => {
+ cb(null, require('../../components/pages/demo/FormElementPage').default);
+ });
+ },
+});
diff --git a/src/common/routes/demo/index.js b/src/common/routes/demo/index.js
new file mode 100644
index 0000000..27bf593
--- /dev/null
+++ b/src/common/routes/demo/index.js
@@ -0,0 +1,10 @@
+export default (store) => ({
+ path: 'demo',
+ getChildRoutes(location, cb) {
+ require.ensure([], (require) => {
+ cb(null, [
+ require('./formElement').default(store),
+ ]);
+ });
+ },
+});
diff --git a/src/common/routes/index.js b/src/common/routes/index.js
index a177d4c..d1e3c62 100644
--- a/src/common/routes/index.js
+++ b/src/common/routes/index.js
@@ -11,6 +11,7 @@ export default (store) => ({
require('./admin').default(store),
require('./user').default(store),
require('./todo').default(store),
+ require('./demo').default(store),
require('./notFound').default(store),
]);
});
diff --git a/src/public/css/main.css b/src/public/css/main.css
index 766a97a..3105d43 100644
--- a/src/public/css/main.css
+++ b/src/public/css/main.css
@@ -1,3 +1,26 @@
.navbar-brand {
color: blue !important;
}
+.slider {
+ height: 5px;
+ background-color: #ddd;
+ position: relative;
+ top: 5px;
+ border-radius: 2px;
+ margin: 12px 0;
+ cursor: pointer;
+}
+.slider-handle {
+ position: relative;
+ top: -5px;
+ border-radius: 50%;
+ height: 15px;
+ width: 15px;
+ background-color: rgb(38, 166, 154);
+ cursor: pointer;
+}
+.bar-1 {
+ height: 5px;
+ background-color: rgb(38, 166, 154);
+ border-radius: 5px;
+}
diff --git a/src/public/css/react-dates.css b/src/public/css/react-dates.css
new file mode 100644
index 0000000..c228e6b
--- /dev/null
+++ b/src/public/css/react-dates.css
@@ -0,0 +1,529 @@
+.CalendarDay {
+ position: relative;
+ display: table;
+ height: 100%;
+ width: 100%; }
+
+.CalendarDay__day {
+ display: table-cell;
+ vertical-align: middle;
+ user-select: none;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none; }
+
+.CalendarMonth {
+ text-align: center;
+ padding: 0 13px;
+ vertical-align: top; }
+ .CalendarMonth:first-of-type {
+ position: absolute;
+ z-index: -1;
+ opacity: 0; }
+ .CalendarMonth table {
+ border-collapse: collapse;
+ border-spacing: 0; }
+
+.CalendarMonth--horizontal {
+ display: inline-block;
+ min-height: 100%; }
+
+.CalendarMonth--vertical {
+ display: block; }
+
+.CalendarMonth__caption {
+ color: #3c3f40;
+ margin-top: 7px;
+ font-size: 18px;
+ padding: 15px 0 35px;
+ text-align: center;
+ margin-bottom: 2px; }
+
+.CalendarMonth__day {
+ border: 1px solid #e4e7e7;
+ padding: 0;
+ box-sizing: border-box;
+ color: #565a5c;
+ cursor: pointer;
+ width: 39px;
+ height: 38px; }
+ .CalendarMonth__day:active {
+ background: #f2f2f2; }
+
+.CalendarMonth__day--outside {
+ border: 0;
+ cursor: default; }
+ .CalendarMonth__day--outside:active {
+ background: #fff; }
+
+.CalendarMonth__day--hovered {
+ background: #e4e7e7;
+ border: 1px double #d4d9d9;
+ color: inherit; }
+
+.CalendarMonth__day--blocked-minimum-nights {
+ color: #cacccd;
+ background: #fff;
+ border: 1px solid #e4e7e7;
+ cursor: default; }
+ .CalendarMonth__day--blocked-minimum-nights:active {
+ background: #fff; }
+
+.CalendarMonth__day--selected-span {
+ background: #66e2da;
+ border: 1px double #33dacd;
+ color: #fff; }
+ .CalendarMonth__day--selected-span.CalendarMonth__day--hovered, .CalendarMonth__day--selected-span:active {
+ background: #33dacd;
+ border: 1px double #00a699; }
+ .CalendarMonth__day--selected-span.CalendarMonth__day--last-in-range {
+ border-right: #00a699; }
+
+.DateRangePicker__picker--valid-date-hovered .CalendarMonth__day--hovered-span,
+.DateRangePicker__picker--valid-date-hovered .CalendarMonth__day--after-hovered-start {
+ background: #b2f1ec;
+ border: 1px double #80e8e0;
+ color: #007a87; }
+
+.DateRangePicker__picker--valid-date-hovered .CalendarMonth__day--selected-start,
+.DateRangePicker__picker--valid-date-hovered .CalendarMonth__day--selected-end,
+.CalendarMonth__day--selected-start,
+.CalendarMonth__day--selected-end,
+.CalendarMonth__day--selected {
+ background: #00a699;
+ border: 1px double #00a699;
+ color: #fff; }
+ .DateRangePicker__picker--valid-date-hovered .CalendarMonth__day--selected-start:active,
+ .DateRangePicker__picker--valid-date-hovered .CalendarMonth__day--selected-end:active,
+ .CalendarMonth__day--selected-start:active,
+ .CalendarMonth__day--selected-end:active,
+ .CalendarMonth__day--selected:active {
+ background: #00a699; }
+
+.CalendarMonth__day--blocked-calendar {
+ background: #cacccd;
+ color: #82888a;
+ cursor: default; }
+ .CalendarMonth__day--blocked-calendar:active {
+ background: #cacccd; }
+
+.CalendarMonth__day--blocked-out-of-range {
+ color: #cacccd;
+ background: #fff;
+ border: 1px solid #e4e7e7;
+ cursor: default; }
+ .CalendarMonth__day--blocked-out-of-range:active {
+ background: #fff; }
+
+.CalendarMonthGrid {
+ background: #fff;
+ z-index: 0; }
+
+.CalendarMonthGrid--animating {
+ transition: transform 0.2s ease-in-out;
+ z-index: 1; }
+
+.CalendarMonthGrid--horizontal {
+ position: absolute;
+ left: 9px;
+ width: 1200px; }
+
+.CalendarMonthGrid--vertical {
+ width: 300px;
+ margin: 0 auto; }
+
+.DayPicker {
+ background: #fff;
+ position: relative; }
+
+.DayPicker--horizontal {
+ background: #fff;
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.07);
+ border-radius: 3px; }
+ .DayPicker--horizontal.DayPicker--portal {
+ box-shadow: none;
+ position: absolute;
+ left: 50%;
+ top: 50%; }
+
+.DayPicker--vertical.DayPicker--portal {
+ position: initial; }
+
+.DayPicker__week-headers {
+ position: relative; }
+
+.DayPicker__week-header {
+ color: #757575;
+ position: absolute;
+ top: 62px;
+ z-index: 2;
+ text-align: left; }
+ .DayPicker__week-header ul {
+ list-style: none;
+ margin: 1px 0;
+ padding-left: 0; }
+ .DayPicker__week-header li {
+ display: inline-block;
+ width: 39px;
+ text-align: center; }
+
+.DayPicker--horizontal .DayPicker__week-header {
+ padding: 0 22px 0 13px; }
+ .DayPicker--horizontal .DayPicker__week-header:first-of-type {
+ padding: 0 13px 0 22px; }
+
+.DayPicker--vertical .DayPicker__week-header {
+ margin-left: -150px;
+ padding: 0 13px;
+ width: 300px;
+ left: 50%; }
+
+.transition-container {
+ position: relative;
+ overflow: hidden;
+ border-radius: 3px; }
+
+.transition-container--horizontal {
+ transition: height 0.2s ease-in-out; }
+
+.transition-container--vertical {
+ width: 100%; }
+
+.DayPickerNavigation__prev,
+.DayPickerNavigation__next {
+ cursor: pointer;
+ line-height: 0.78;
+ user-select: none;
+ -webkit-user-select: none;
+ /* Chrome/Safari */
+ -moz-user-select: none;
+ /* Firefox */
+ -ms-user-select: none;
+ /* IE10+ */ }
+
+.DayPickerNavigation__prev--default,
+.DayPickerNavigation__next--default {
+ border: 1px solid #dce0e0;
+ background-color: #fff;
+ color: #757575; }
+ .DayPickerNavigation__prev--default:focus, .DayPickerNavigation__prev--default:hover,
+ .DayPickerNavigation__next--default:focus,
+ .DayPickerNavigation__next--default:hover {
+ border: 1px solid #c4c4c4; }
+ .DayPickerNavigation__prev--default:active,
+ .DayPickerNavigation__next--default:active {
+ background: #f2f2f2; }
+
+.DayPickerNavigation--horizontal {
+ position: relative; }
+ .DayPickerNavigation--horizontal .DayPickerNavigation__prev,
+ .DayPickerNavigation--horizontal .DayPickerNavigation__next {
+ border-radius: 3px;
+ padding: 6px 9px;
+ top: 18px;
+ z-index: 2;
+ position: absolute; }
+ .DayPickerNavigation--horizontal .DayPickerNavigation__prev {
+ left: 22px; }
+ .DayPickerNavigation--horizontal .DayPickerNavigation__next {
+ right: 22px; }
+ .DayPickerNavigation--horizontal .DayPickerNavigation__prev--default svg,
+ .DayPickerNavigation--horizontal .DayPickerNavigation__next--default svg {
+ height: 19px;
+ width: 19px;
+ fill: #82888a; }
+
+.DayPickerNavigation--vertical {
+ background: #fff;
+ box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1);
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ height: 52px;
+ width: 100%;
+ z-index: 2; }
+ .DayPickerNavigation--vertical .DayPickerNavigation__prev,
+ .DayPickerNavigation--vertical .DayPickerNavigation__next {
+ display: inline-block;
+ position: relative;
+ height: 100%;
+ width: 50%; }
+ .DayPickerNavigation--vertical .DayPickerNavigation__next--default {
+ border-left: 0; }
+ .DayPickerNavigation--vertical .DayPickerNavigation__prev--default,
+ .DayPickerNavigation--vertical .DayPickerNavigation__next--default {
+ text-align: center;
+ font-size: 2.5em;
+ padding: 5px; }
+ .DayPickerNavigation--vertical .DayPickerNavigation__prev--default svg,
+ .DayPickerNavigation--vertical .DayPickerNavigation__next--default svg {
+ height: 42px;
+ width: 42px;
+ fill: #484848; }
+
+.DateInput {
+ font-weight: 200;
+ font-size: 18px;
+ line-height: 24px;
+ color: #757575;
+ margin: 0;
+ padding: 8px;
+ background: #fff;
+ position: relative;
+ display: inline-block;
+ width: 130px;
+ vertical-align: middle; }
+
+.DateInput--with-caret::before,
+.DateInput--with-caret::after {
+ content: "";
+ display: inline-block;
+ position: absolute;
+ bottom: auto;
+ border: 10px solid transparent;
+ border-top: 0;
+ left: 22px;
+ z-index: 2; }
+
+.DateInput--with-caret::before {
+ top: 62px;
+ border-bottom-color: rgba(0, 0, 0, 0.1); }
+
+.DateInput--with-caret::after {
+ top: 63px;
+ border-bottom-color: #fff; }
+
+.DateInput--disabled {
+ background: #cacccd; }
+
+.DateInput__label {
+ border: 0;
+ clip: rect(0, 0, 0, 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px; }
+
+.DateInput__input {
+ opacity: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border: 0;
+ height: 100%;
+ width: 100%; }
+
+.DateInput__display-text {
+ padding: 4px 8px;
+ white-space: nowrap;
+ overflow: hidden; }
+
+.DateInput__display-text--has-input {
+ color: #484848; }
+
+.DateInput__display-text--focused {
+ background: #99ede6;
+ border-color: #99ede6;
+ border-radius: 3px;
+ color: #007a87; }
+
+.DateInput__display-text--disabled {
+ font-style: italic; }
+
+.screen-reader-only {
+ border: 0;
+ clip: rect(0, 0, 0, 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px; }
+
+.DateRangePicker {
+ position: relative;
+ display: inline-block; }
+
+.DateRangePicker__picker {
+ z-index: 1;
+ background-color: #fff;
+ position: absolute;
+ top: 72px; }
+
+.DateRangePicker__picker--show {
+ visibility: visible; }
+
+.DateRangePicker__picker--invisible {
+ visibility: hidden; }
+
+.DateRangePicker__picker--direction-left {
+ left: 0; }
+
+.DateRangePicker__picker--direction-right {
+ right: 0; }
+
+.DateRangePicker__picker--portal {
+ background-color: rgba(0, 0, 0, 0.3);
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%; }
+
+.DateRangePicker__picker--full-screen-portal {
+ background-color: #fff; }
+
+.DateRangePicker__close {
+ background: none;
+ border: 0;
+ color: inherit;
+ font: inherit;
+ line-height: normal;
+ overflow: visible;
+ padding: 0;
+ cursor: pointer;
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 15px;
+ z-index: 2; }
+ .DateRangePicker__close svg {
+ height: 15px;
+ width: 15px;
+ fill: #cacccd; }
+ .DateRangePicker__close:hover, .DateRangePicker__close:focus {
+ color: #b0b3b4;
+ text-decoration: none; }
+
+.DateRangePickerInput {
+ background-color: #fff;
+ border: 1px solid #cacccd;
+ display: inline-block; }
+
+.DateRangePickerInput--disabled {
+ background: #cacccd; }
+
+.DateRangePickerInput__arrow {
+ display: inline-block;
+ vertical-align: middle; }
+
+.DateRangePickerInput__arrow svg {
+ vertical-align: middle;
+ fill: #484848;
+ height: 24px;
+ width: 24px; }
+
+.DateRangePickerInput__clear-dates {
+ background: none;
+ border: 0;
+ color: inherit;
+ font: inherit;
+ line-height: normal;
+ overflow: visible;
+ cursor: pointer;
+ display: inline-block;
+ vertical-align: middle;
+ padding: 10px;
+ margin: 0 10px 0 5px; }
+
+.DateRangePickerInput__clear-dates svg {
+ fill: #82888a;
+ height: 12px;
+ width: 15px;
+ vertical-align: middle; }
+
+.DateRangePickerInput__clear-dates--hide {
+ visibility: hidden; }
+
+.DateRangePickerInput__clear-dates:focus,
+.DateRangePickerInput__clear-dates--hover {
+ background: #dbdbdb;
+ border-radius: 50%; }
+
+.SingleDatePicker {
+ position: relative;
+ display: inline-block; }
+
+.SingleDatePicker__picker {
+ z-index: 1;
+ background-color: #fff;
+ position: absolute;
+ top: 72px; }
+
+.SingleDatePicker__picker--show {
+ visibility: visible; }
+
+.SingleDatePicker__picker--invisible {
+ visibility: hidden; }
+
+.SingleDatePicker__picker--direction-left {
+ left: 0; }
+
+.SingleDatePicker__picker--direction-right {
+ right: 0; }
+
+.SingleDatePicker__picker--portal {
+ background-color: rgba(0, 0, 0, 0.3);
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%; }
+
+.SingleDatePicker__picker--full-screen-portal {
+ background-color: #fff; }
+
+.SingleDatePicker__close {
+ background: none;
+ border: 0;
+ color: inherit;
+ font: inherit;
+ line-height: normal;
+ overflow: visible;
+ padding: 0;
+ cursor: pointer;
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 15px;
+ z-index: 2; }
+ .SingleDatePicker__close svg {
+ height: 15px;
+ width: 15px;
+ fill: #cacccd; }
+ .SingleDatePicker__close:hover, .SingleDatePicker__close:focus {
+ color: #b0b3b4;
+ text-decoration: none; }
+
+.SingleDatePickerInput {
+ background-color: #fff;
+ border: 1px solid #dbdbdb; }
+
+.SingleDatePickerInput__clear-date {
+ background: none;
+ border: 0;
+ color: inherit;
+ font: inherit;
+ line-height: normal;
+ overflow: visible;
+ cursor: pointer;
+ display: inline-block;
+ vertical-align: middle;
+ padding: 10px;
+ margin: 0 10px 0 5px; }
+
+.SingleDatePickerInput__clear-date svg {
+ fill: #82888a;
+ height: 12px;
+ width: 15px;
+ vertical-align: middle; }
+
+.SingleDatePickerInput__clear-date--hide {
+ visibility: hidden; }
+
+.SingleDatePickerInput__clear-date:focus,
+.SingleDatePickerInput__clear-date--hover {
+ background: #dbdbdb;
+ border-radius: 50%; }