Range for React

Learn more

A goto solution for picking date and time ranges. Date-only, time-only or mixed date & time modes are supported. You can use it with one or two inputs for start and end range.
Can be used as a component along with other mobiscroll form elements or as a directive on any input or field.

Shipping with useful features for a great UX, including:

  • Usage on mobile and desktop with responsive features
  • Date, time or date & time ranges
  • Calendar view or scroller controls
  • Usage on mobile and desktop with responsive features
  • Validation with disabled dates, min & max for restricting selection
  • Marked, colored days and day labels
  • Variable week view
  • Multiple month view
  • Week counter
  • Fullscreen, modal, popup and inline display support
  • RTL Support
  • Full localization


Interested in date and/or time selection? Other demos that could be useful:

Calendar Date & Time Event Calendar


Date & Time Range demos available for other frameworks.

Viewing demos & code for

light
dark

Change the theme setting here

Range - Date range

Change demo
Date range
React Date range picker demo with start-end fields and usage with a single input. Use it for responsive mobile & desktop. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

class App extends React.Component {
    constructor(props) {
        super(props);
        
        const now = new Date();
        const week = [now, new Date(now.getFullYear(), now.getMonth(), now.getDate() + 6, 23, 59)];
            
        this.state = {
            val: week
        };
    }
    
    show = () => {
        this.external.instance.show();
    }
     
    setExternal = (comp) => {
        this.external = comp;
    }
    
    render () {
        return (
            <div>
                <mobiscroll.Form>
                    <div className="mbsc-align-center">
                        <div className="mbsc-note mbsc-note-primary">The range can be used inside a mobiscroll form or on any input.</div>
                    </div>
                    <mobiscroll.FormGroup>
    					<mobiscroll.FormGroupTitle>Two inputs inside Mobiscroll Form</mobiscroll.FormGroupTitle>
    					<mobiscroll.Range>
        					<label>
                                From
                                <mobiscroll.RangeStart placeholder="Please Select ..." />
                            </label>
                            <label>
                                Until
                                <mobiscroll.RangeEnd placeholder="Please Select ..." />
                            </label>
                        </mobiscroll.Range>
                    </mobiscroll.FormGroup>
                    <mobiscroll.FormGroup>
    					<mobiscroll.FormGroupTitle>Date scroller</mobiscroll.FormGroupTitle>
    					<mobiscroll.Range controls={['date']}>
        					<label>
                                From
                                <mobiscroll.RangeStart placeholder="Please Select ..." />
                            </label>
                            <label>
                                Until
                                <mobiscroll.RangeEnd placeholder="Please Select ..." />
                            </label>
                        </mobiscroll.Range>
                    </mobiscroll.FormGroup>
                    <mobiscroll.FormGroup className="mbsc-padding">
                        <p className="mbsc-thin">Use it on any input or non-mobiscroll form.</p>
                    </mobiscroll.FormGroup>
                </mobiscroll.Form>
                 <div className="demo-container">
                    <label htmlFor="demo-non-form">Range</label>
                    <mobiscroll.Range showSelector={false}>
                        <input id="demo-non-form" className="demo-non-form" placeholder="Please Select..." />
                    </mobiscroll.Range>
                    <label htmlFor="demo-external">External button</label>
                    <div className="external-container">
                        <mobiscroll.Range
                            ref={this.setExternal}
                            value={this.state.val}
                            showOnTap={false}
                            showOnFocus={false}
                            showSelector={false}
                        >
                            <input id="demo-external" className="demo-non-form" />
                        </mobiscroll.Range>
                        <button onClick={this.show} className="external-button">Show</button>
                    </div>
                </div>
            </div>
        );
    }    
}

<div id="content">
.demo-non-form {
    color: initial;
    width: 100%;
    padding: 10px;
    margin: 6px 0 12px 0;
    border: 1px solid #ccc;
    border-radius: 0;
    font-family: arial, verdana, sans-serif;
    font-size: 14px;
    box-sizing: border-box;
    -webkit-appearance: none;
}

.demo-container {
    padding: 0 1em;
}

.external-container {
    display: flex;
}

.external-container button.external-button {
    font-weight: 400;
    padding: 10px;
    margin: 6px 0 12px 16px;
}

Range - Time range

Change demo
Time range
React Time range picker demo with from/until fields or usage in a single input. Scroller interface with validation/options. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

class App extends React.Component {
    constructor(props) {
        super(props);
        
        const now = new Date();
        const twoHours = [now, new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours(), now.getMinutes() + 120)];
            
        this.state = {
            val: twoHours
        };
    }
    
    show = () => {
        this.external.instance.show();
    }
     
    setExternal = (comp) => {
        this.external = comp;
    }
    
    render () {
        return (
            <div>
                <mobiscroll.Form>
                    <div className="mbsc-align-center">
                        <div className="mbsc-note mbsc-note-primary">The range can be used inside a mobiscroll form or on any input.</div>
                    </div>
                    <mobiscroll.FormGroup>
    					<mobiscroll.FormGroupTitle>Two inputs inside Mobiscroll Form</mobiscroll.FormGroupTitle>
    					<mobiscroll.Range controls={['time']}>
        					<label>
                                From
                                <mobiscroll.RangeStart placeholder="Please Select ..." />
                            </label>
                            <label>
                                Until
                                <mobiscroll.RangeEnd placeholder="Please Select ..." />
                            </label>
                        </mobiscroll.Range>
                    </mobiscroll.FormGroup>
                    <mobiscroll.FormGroup className="mbsc-padding">
                        <p className="mbsc-thin">Use it on any input or non-mobiscroll form.</p>
                    </mobiscroll.FormGroup>
                </mobiscroll.Form>
                <div className="demo-container">
                    <label htmlFor="demo-non-form">Range</label>
                    <mobiscroll.Range controls={['time']}>
                        <input id="demo-non-form" className="demo-non-form" placeholder="Please Select..." />
                    </mobiscroll.Range>
                    <label htmlFor="demo-external">External button</label>
                    <div className="external-container">
                        <mobiscroll.Range
                            ref={this.setExternal}
                            controls={['time']}
                            value={this.state.val}
                            showOnTap={false}
                            showOnFocus={false}
                        >
                            <input id="demo-external" className="demo-non-form" />
                        </mobiscroll.Range>
                        <button onClick={this.show} className="external-button">Show</button>
                    </div>
                </div>
            </div>
        );
    }    
}

<div id="content">
.demo-non-form {
    color: initial;
    width: 100%;
    padding: 10px;
    margin: 6px 0 12px 0;
    border: 1px solid #ccc;
    border-radius: 0;
    font-family: arial, verdana, sans-serif;
    font-size: 14px;
    box-sizing: border-box;
    -webkit-appearance: none;
}

.demo-container {
    padding: 0 1em;
}

.external-container {
    display: flex;
}

.external-container button.external-button {
    font-weight: 400;
    padding: 10px;
    margin: 6px 0 12px 16px;
}

Range - Date and time range

Change demo
Date and time range
React Datetime range picker with start-end fields. Calendar or scroller UI for desktop and mobile usage. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

class App extends React.Component {
    constructor(props) {
        super(props);

        const now = new Date();
        const week = [now, new Date(now.getFullYear(), now.getMonth(), now.getDate() + 6, 23, 59)];
        
        this.state = {
            val: week
        };
    }
    
    render() {
        return (
            <mobiscroll.Form>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Calendar</mobiscroll.FormGroupTitle>
					<mobiscroll.Range ref="range" controls={['calendar', 'time']} value={this.state.val}>
    					<label>
                            From
                            <mobiscroll.RangeStart />
                        </label>
                        <label>
                            Until
                            <mobiscroll.RangeEnd />
                        </label>
                    </mobiscroll.Range>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Scroller</mobiscroll.FormGroupTitle>
					<mobiscroll.Range
                        controls={['date', 'time']}
                        dateWheels="|D M d|"
                        cssClass="scroller-range"
                        value={this.state.val}
                    >
    					<label>
                            Range start
                            <mobiscroll.RangeStart />
                        </label>
                        <label>
                            Range end
                            <mobiscroll.RangeEnd />
                        </label>
                    </mobiscroll.Range>
                </mobiscroll.FormGroup>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>
.demo-display-inline input,
.demo-display-inline label,
.demo-display-inline br,
.scroller-range .mbsc-cal-tabs {
    display: none;
}

/* Temporary fix */

.mbsc-cal-tabbed .mbsc-sc-whl-gr-c {
    width: auto;
    right: 0;
}

.mbsc-cal-tabbed .mbsc-sc-whl-gr {
    width: auto;
}

Range - Min and Max

Change demo
Min and Max
React Date range picker with min and max settings for past, future and current ranges. Control the min and max length. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

class App extends React.Component {
    render() {
        const now = new Date();
        const yesterday = new Date(new Date().setDate(new Date().getDate() - 1));
        const tomorrow = new Date(new Date().setDate(new Date().getDate() + 1));
        const nextMonths = new Date(now.getFullYear(), now.getMonth() + 6, now.getDate());
        const day = 24 * 60 * 60 * 1000;
    
        return (
            <mobiscroll.Form>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Pick a range</mobiscroll.FormGroupTitle>
					<label>
					    Past range
                        <mobiscroll.Range
                            headerText="Select your next visit"
                            max={yesterday}
                            placeholder="Please Select..."
                        />
                    </label>
					<label>
					    Future range
                        <mobiscroll.Range
                            min={tomorrow}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
					    Next 6 months
                        <mobiscroll.Range
                            max={nextMonths}
                            min={tomorrow}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
					    Time range
                        <mobiscroll.Range
                            controls={['time']}
                            min="08:00"
                            max="18:59"
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Specify range length</mobiscroll.FormGroupTitle>
					<label>
					    Min 5 days
                        <mobiscroll.Range
                            minRange={5 * day}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
					    Max 10 days
                        <mobiscroll.Range
                            maxRange={10 * day}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
					    5-10 days
                        <mobiscroll.Range
                            minRange={5 * day}
                            maxRange={10 * day}
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Date formats</mobiscroll.FormGroupTitle>
					<label>
					    String
                        <mobiscroll.Range
                            max="2018-08-31T00:00"
                            min="08/01/2018"
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
					    Moment JS
                        <mobiscroll.Range
                            max={moment([2018, 8, 30])}
                            min={moment([2018, 8, 1])}
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
            </mobiscroll.Form>
        );
    }    
}


<div id="content">

Range - Invalid days

Change demo
Invalid days
React Date range picker with disabled dates, ranges, weekdays and custom times for calendar and scroller control. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

class App extends React.Component {
    render() {
        return (
             <mobiscroll.Form>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Invalidating Dates</mobiscroll.FormGroupTitle>
                    <label>
                        Exact dates
                        <mobiscroll.Range
                            invalid={[
                                new Date(2018, 1, 3),
                                new Date(2018, 1, 11),
                                new Date(2018, 1, 12)
                            ]}
                            defaultValue={[new Date(2018, 1, 17), new Date(2018, 1, 23)]}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Weekdays
                        <mobiscroll.Range
                            invalid={[
                                'w0',
                                'w6'
                            ]}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Ranges
                        <mobiscroll.Range
                            theme=""
                            lang=""
                            invalid={[
                                { start: new Date(2018, 1, 3), end: new Date(2018, 1, 9) },
                                { start: new Date(2018, 1, 24), end: new Date(2018, 2, 2) }
                            ]}
                            defaultValue={[new Date(2018, 1, 17), new Date(2018, 1, 23)]}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Scroller
                        <mobiscroll.Range
                            invalid={[
                                'w0',
                                'w6'
                            ]}
                            controls={['date']}
                            defaultValue={[new Date(2018, 1, 17), new Date(2018, 1, 23)]}
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Invalidating Time</mobiscroll.FormGroupTitle>
                    <label>
                        Exact Time
                        <mobiscroll.Range
                            controls={['time']}
                            steps={{
                                minute: 30
                            }}
                            invalid={[
                                { d: new Date(), start: '10:00', end: '10:00' },
                                { d: new Date(), start: '10:30', end: '10:30' },
                                { d: new Date(), start: '11:00', end: '11:00' },
                                { d: new Date(), start: '12:30', end: '12:30' }
                            ]}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Range
                        <mobiscroll.Range
                            controls={['time']}
                            invalid={[
                                { start: '07:00', end: '09:00' },
                                { start: '13:00', end: '15:00' }
                            ]}
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Overriding inside invalid ranges</mobiscroll.FormGroupTitle>
                    <label>
                        Date
                        <mobiscroll.Range
                            defaultValue={[new Date(2018, 11, 13), new Date(2018, 11, 19)]}
                            invalid={[
                                { start: new Date(2018, 11, 20), end: new Date(2018, 11, 31) }
                            ]}
                            valid={[
                                { start: new Date(2018, 11, 24), end: new Date(2018, 11, 26) }
                            ]}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Time
                        <mobiscroll.Range
                            controls={['time']}
                            defaultValue={[new Date(new Date().setHours(12, 30, 0, 0)), new Date(new Date().setHours(12, 59, 0, 0))]}
                            invalid={[
                                { start: '13:00', end: '20:00' }
                            ]}
                            valid={[
                                { start: '17:00', end: '17:30' },
                                { start: '18:00', end: '18:30' }
                            ]}
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Date formats</mobiscroll.FormGroupTitle>
                    <label>
                        String
                        <mobiscroll.Range
                            defaultValue={['2018-07-15T00:00', '2018-07-15T00:00']}
                            invalid={[
                                '2018-07-08T00:00',
                                '2018-07-10T00:00',
                                '07/19/2018',
                                '07/23/2018'
                            ]}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Moment JS
                        <mobiscroll.Range
                            defaultValue={[moment([2018, 8, 24]), moment([2018, 8, 24])]}
                            invalid={[
                                moment([2018, 8, 11]),
                                moment([2018, 8, 15])
                            ]}
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
            </mobiscroll.Form>
        );
    }    
}

<div id="content">

Range - Scroll direction

Change demo
Scroll direction
React Date range picker demo with calendar view showing off vertical and horizontal month change and scrolling direction. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

class App extends React.Component {
    render() {
        return (
            <mobiscroll.Form>
                <mobiscroll.FormGroup>
                    <mobiscroll.FormGroupTitle>Month change direction</mobiscroll.FormGroupTitle>
                    <label>
                        Vertical
                        <mobiscroll.Range
                            calendarScroll="vertical"
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Horizontal
                        <mobiscroll.Range
                            calendarScroll="horizontal"
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
            </mobiscroll.Form>
        );
    }   
}

<div id="content"></div>

Range - RTL Support

Change demo
RTL Support
React Range select right-to-left rendering demo with full RTL language support and source. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

class App extends React.Component {
    render() {
        return (
            <mobiscroll.Form rtl={true}>
                <mobiscroll.FormGroup>
                <mobiscroll.FormGroupTitle>RTL enabled by default</mobiscroll.FormGroupTitle>
                    <label>
                        Arabic
                        <mobiscroll.Range
                            lang="ar"
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Hebrew
                        <mobiscroll.Range
                            lang="he"
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Farsi
                        <mobiscroll.Range
                            lang="fa"
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup>
                    <mobiscroll.FormGroupTitle>Manually set RTL</mobiscroll.FormGroupTitle>
                    <label>
                        RTL
                        <mobiscroll.Range
                            rtl={true}
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>

Range - Presets

Change demo
Presets
React Filtering demo with predefined range sets and custom date range selection in calendar control. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

const curr = new Date();
const monday = new Date(curr.setDate(curr.getDate() - curr.getDay() + 1));
const sunday = new Date(curr.setDate(curr.getDate() - curr.getDay() + 7));

class App extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            value: [monday, sunday]
        };
    }
    
    setValue = (val, text) => {
        this.setState({
            value: val
        });
        mobiscroll.toast({
            message: text + ' Selected'
        });
}
    
    render() {
        const now = new Date();
        const yesterday = new Date(curr.getFullYear(), curr.getMonth(), curr.getDate() - 1)
        const firstday = new Date(curr.setDate(curr.getDate() - curr.getDay()));
        const lastday = new Date(curr.setDate(curr.getDate() - curr.getDay() + 6));
        const monthStart = new Date(now.getFullYear(), now.getMonth() - 1, 1);
        const monthEnd = new Date(now.getFullYear(), now.getMonth(), 0);
        return (
            <div className="md-presets">
                <mobiscroll.Form className="md-range-filter">
                    <h4 className="md-header">Filter Results by</h4>
                    <div className="mbsc-padding">
                        <mobiscroll.Button onClick={() => this.setValue([now, now], 'Today')} block={true} className="md-filter-btn">Today (3)</mobiscroll.Button>
                        <mobiscroll.Button onClick={() => this.setValue([yesterday, yesterday, 'Yesterday'])} block={true} className="md-filter-btn">Yesterday (8)</mobiscroll.Button>
                        <mobiscroll.Button onClick={() => this.setValue([firstday, lastday], 'This Week')} block={true} className="md-filter-btn">This Week (37)</mobiscroll.Button>
                        <mobiscroll.Button onClick={() => this.setValue([monthStart, monthEnd], 'Last Month')} block={true} className="md-filter-btn">Last Month (65)</mobiscroll.Button>
                    </div>
                    <mobiscroll.FormGroup>
                        <mobiscroll.FormGroupTitle>Or by a custom range</mobiscroll.FormGroupTitle>
                        <mobiscroll.Range
                            display="inline"
                            layout="liquid"
                            fromText=""
                            showSelector={false}
                            value={this.state.value}
                        >
                            <input type="hidden" />
                        </mobiscroll.Range>
                    </mobiscroll.FormGroup>
                </mobiscroll.Form>
            </div>
        );
    }    
}

<div id="content"></div>
.demo-presets {
    padding: 0 !important;
}

.md-range-filter .md-header {
    text-align: center;
    padding: 1em .75em 0 .75em;
    margin: 0;
}

.md-range-filter .mbsc-form-group-title {
    padding-top: 0;
    text-align: center;
}

.md-range-filter .mbsc-ios .dw-dr {
    height: 20px;
}

Range - Flight booking

Change demo
Flight booking
React Flight booking demo featuring one-way and round-trip selection with start and end date range picker, calendar. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

class App extends React.Component {
    constructor(props) {
        super(props);

        const now = new Date();
        let departureDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 3);
        let returnDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 7);

        this.state = {
            tripType: 'round',
            origin: 'LTN',
            destination: '',
            timeRange: [departureDate, returnDate],
            adults: 1,
            children: 0,
            infant: 0,
            tripClass: 'economy'
        };
    }
    
    tripTypeChange = (event) => {
        // set default time range depending on trip type
        let returnDate = null;
        const departureDate = this.state.timeRange[0];
        const value = event.target.value;
        
        if (value === 'round') {
            if (this.state.timeRange[1] !== null) {
                returnDate = this.state.timeRange[1];
            } else {
                returnDate = new Date(departureDate.getFullYear(), departureDate.getMonth(), departureDate.getDate() + 7);
            }
        } 

        // push changes to state
        this.setState({ 
            tripType: value,
            timeRange: [departureDate, returnDate]
         });
    }
    
    // select time range
    rangeSet = (event, inst) => {
        if (this.state.tripType === 'round') {
            this.setState({
                timeRange: inst.getVal()
            });
        } else {
            this.setState({
                timeRange: [inst.getVal()[0], null]
            });
        }
    }
    
    rangeChange = (event, inst) => {
        const oneWay = this.state.tripType === 'oneway';
        if (oneWay && event.control === 'calendar' && event.active === 'start') {
            inst._isVisible = false;
            inst.setActiveDate('start');
            inst._isVisible = true;
        }
        if (inst._markup) {
            inst._isValid = true;
            inst._markup.find('.mbsc-fr-btn-s .mbsc-fr-btn').removeClass('mbsc-fr-btn-d'  + (oneWay ? ' mbsc-disabled' : ''));
        }
    }
    
    rangeClose = () => {
        if (this.state.tripType === 'oneway') {
            return true;
        }
    }
    
    // passenger numbers
    adultsChange = (event) => {
        this.setState({
            adults: +event.target.value
        });
    }
    
    childrenChange = (event) => {
        this.setState({
            children: +event.target.value
        });
    }
    
    infantChange = (event) => {
        this.setState({
            infant: +event.target.value
        });
    }
    
    // trip class selection
    tripClassChange = (event) => {
        this.setState({
            tripClass: event.target.value 
        });
    }
    
    remoteData = {
        url: 'https://trial.mobiscroll.com/airports/',
        remoteFilter: true,
        dataType: 'jsonp',
        processResponse: (data) => {
            let ret = [];

            if (data) {
                for (let i = 0; i < data.length; i++) {
                    const item = data[i];
                    ret.push({
                        value: item.code,
                        text: item.name,
                        html: '<div style="font-size:16px;line-height:18px;">' + item.name + '</div><div style="font-size:10px;line-height:12px;">' + item.location + ', ' + item.code + '</div>'
                    });
                }
            }
            return ret;
        }
    }
    
    render() {
        return <mobiscroll.Form className="md-flight-booking">
                <mobiscroll.Segmented value="round" checked={this.state.tripType === 'round'} onChange={this.tripTypeChange} name="flightType">
                    Round trip
                </mobiscroll.Segmented>
                <mobiscroll.Segmented value="oneway" checked={this.state.tripType === 'oneway'} onChange={this.tripTypeChange} name="flightType">
                    One way
                </mobiscroll.Segmented>
            <label>
                Origin
                <mobiscroll.Select
                    value={this.state.origin}
                    multiline={2}
                    height={50}
                    filter={true}
                    data={this.remoteData}
                    placeholder="Please select..."
                />
            </label>
            <label>
                Destination
                <mobiscroll.Select
                    multiline={2}
                    height={50}
                    filter={true}
                    data={this.remoteData}
                    placeholder="Please select..."
                />
            </label>
            <div className="md-time-range">
                <mobiscroll.Range 
                    value={this.state.timeRange}
                    onSet={this.rangeSet}
                    onSetDate={this.rangeChange}
                    onBeforeClose={this.rangeClose}
                    min={new Date()}
                    showSelector={false}
                >
                <label>
                    Leaving
                    <mobiscroll.RangeStart className="md-leaving-date"/>
                </label>
                <label>
                    Returning
                    <mobiscroll.RangeEnd className="md-return-date" disabled={this.state.tripType === 'oneway'} />
                </label>
                </mobiscroll.Range>
            </div>

            <mobiscroll.Stepper value={this.state.adults} onChange={this.adultsChange} min={1} max={15} data-val="left">
                Adults
                <span className="mbsc-desc">From 14 years</span>
            </mobiscroll.Stepper>
            <mobiscroll.Stepper value={this.state.children} onChange={this.childrenChange} min={0} max={15} data-val="left">
                Children
                <span className="mbsc-desc">2-14 years</span>
            </mobiscroll.Stepper>
            <mobiscroll.Stepper value={this.state.infant} onChange={this.infantChange} min={0} max={10} data-val="left">
                Infant
                <span className="mbsc-desc">0-2 years</span>
            </mobiscroll.Stepper>
            
            <mobiscroll.Segmented value="economy" checked={this.state.tripClass === 'economy'} onChange={this.tripClassChange} name="flightClass">
                Economy
            </mobiscroll.Segmented>
            <mobiscroll.Segmented value="comfort" checked={this.state.tripClass === 'comfort'} onChange={this.tripClassChange} name="flightClass">
                Comfort
            </mobiscroll.Segmented>
            <mobiscroll.Segmented value="business" checked={this.state.tripClass === 'business'} onChange={this.tripClassChange} name="flightClass">
                Business
            </mobiscroll.Segmented>

            <div className="mbsc-padding">
                <mobiscroll.Button className="mbsc-btn-block">Find Flights</mobiscroll.Button>
            </div>
        </mobiscroll.Form>;
    }
}

<div id="content"></div>
/* range inputs */

.md-flight-booking .md-time-range {
    overflow: hidden;
    width: 99%;
}

.mbsc-ios .md-time-range {
    background: #fff;
}

.md-time-range .mbsc-input {
    float: left;
    width: 50%;
    box-sizing: border-box;
}

.mbsc-ios .md-time-range .mbsc-input {
    display: block;
}

.mbsc-ios .md-time-range .mbsc-input .mbsc-label {
    font-size: 14px;
    padding-left: 1.14285em;
    padding-top: 0.75em;
    line-height: 22px;
}

.mbsc-ios .md-time-range .mbsc-input .mbsc-label {
    width: 100%;
}

.md-time-range .mbsc-input:first-child {
    padding-right: .5em;
}

.md-time-range .mbsc-input:last-child {
    padding-left: .5em;
}

Range - New event

Change demo
New event
React New event create screen featuring a date range picker with start and end dates for multi-day events. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

class App extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            activity: 'busy',
            allDay: true
        };
    }
    
    setActivity = (event) => {
        this.setState({
            activity: event.target.value
        });
    }
    
    setAllDay = (ev) => {
        this.setState({
            allDay: ev.target.checked
        });
    }
    
    render() {
        return (
            <mobiscroll.Form className="md-range-event">
                <div className="md-header">
                    <button className="mbsc-btn-flat md-cancel-btn">Cancel</button>
                    <div className="mbsc-header-txt">New event</div>
                    <button className="mbsc-btn-flat md-add-btn">Add</button>
                </div>

                <label>
                    Title
                    <input type="text" placeholder="Name of the event"/>
                </label>
                <label>
                    Location
                    <input type="text" placeholder="Where will it be?" />
                </label>

                <mobiscroll.Switch checked={this.state.allDay} onChange={this.setAllDay} color="primary">
                    All day
                </mobiscroll.Switch>

                <label>
                    Starts
                     <mobiscroll.Range
                        className="md-time"
                        type="text"
                        placeholder="Event start"
                        min={new Date()}
                        controls={['date']}
                        endInput=".md-time-end"
                        dateFormat="M dd D yy"
                    />
                </label>
                <label>
                    Ends
                    <input className="md-time md-time-end" type="text" placeholder="Event end"/>
                </label>

                <label>
                    Travel Time
                    <mobiscroll.Select>
                        <option value="none">None</option>
                        <option value="5">5 minutes</option>
                        <option value="30">30 minutes</option>
                        <option value="60">1 hour</option>
                        <option value="90">1 hour and 30 minutes</option>
                        <option value="120">2 hours</option>
                    </mobiscroll.Select>
                </label>

                <mobiscroll.Segmented name="type" value="busy" checked={this.state.activity === 'busy'} onChange={this.setActivity}>
                    Show as busy
                </mobiscroll.Segmented>
                <mobiscroll.Segmented name="type" value="free" checked={this.state.activity === 'free'} onChange={this.setActivity}>
                    Show as free
                </mobiscroll.Segmented>

                <label>
                    Notes
                    <textarea placeholder="Enter notes, URL, comments"></textarea>
                </label>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>
.demo-newevent {
    padding: 0 !important;
}

.md-range-event .md-header {
    position: relative;
    background: #4ECCC4;
    padding: 1em;
    text-align: center;
    margin-bottom: 1em;
}

.mbsc-material.md-range-event .md-header,
.md-range-event .mbsc-material .md-header {
    background: #009688;
}

.mbsc-android-holo.md-range-event .md-header,
.md-range-event .mbsc-android-holo .md-header {
    background: #31c6e7;
}

.mbsc-ios-classic.md-range-event .md-header,
.mbsc-ios.md-range-event .md-header,
.md-range-event .mbsc-ios .md-header {
    background: #1272dc;
    margin: 0;
    z-index: 1;
}

.mbsc-ios-dark.md-range-event .md-header,
.md-range-event .mbsc-ios-dark .md-header {
    background: #ff8b0f;
    margin: 0;
    color: #a1a1a1;
}

.mbsc-wp.md-range-event .md-header,
.md-range-event .mbsc-wp .md-header {
    background: #1a9fe0;
}

.md-range-event .md-header .mbsc-header-txt {
    display: inline-block;
    color: #fff;
    font-size: 18px;
}

.md-range-event .md-header .mbsc-btn-flat {
    margin: 0;
    padding: 0 .5em 0 .5em;
    height: 30px;
    color: #fff;
    text-transform: capitalize;
}

.md-range-event .md-header .md-cancel-btn,
.md-range-event .md-header .md-add-btn {
    position: absolute;
    top: 50%;
    margin-top: -15px;
}

.md-range-event .md-header .mbsc-btn-flat.mbsc-active {
    background: rgba(255, 255, 255, 0.2);
}

.md-range-event .md-header .md-add-btn {
    right: .75em;
}

.md-range-event .md-header .md-cancel-btn {
    left: .75em;
}

Range - Date types

Change demo
Date types
React Date range picker supporting data types: javascript date object, ISO 8601 strings and moment.js objects. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

class App extends React.Component {
    constructor(props) {
        super(props);
        
        this.state = {
            date: null,
            iso: null,
            locale: null,
            moment: null,
            retDate: '',
            retISO: '',
            retLocale: '',
            retMoment: ''
        };
    }
    render() {
        return (
            <mobiscroll.Form>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Working with Js Date Objects</mobiscroll.FormGroupTitle>
					<div className="mbsc-btn-group-block">
                        <mobiscroll.Button onClick={this.onClickDate}>Set: Sun Dec 17 1995 03:24:00 GMT - Thu Dec 28 1995 11:45:00 GMT+0200</mobiscroll.Button>
                    </div>
                    <div>
                        <label>
                            Date object
                            <mobiscroll.Range
                                onSet={this.onSetDate}
                                value={this.state.date}
                            />
                        </label>
                    </div>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup className="mbsc-padding">
				    Return value: {this.state.retDate}
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Working with Date strings</mobiscroll.FormGroupTitle>
					<div className="mbsc-btn-group-block">
                        <mobiscroll.Button onClick={this.onClickISO}>Set: 2008-09-15T15:53:00 - 2008-09-23T16:15:00</mobiscroll.Button>
                    </div>
                    <div>
                        <label>
                            ISO string
                            <mobiscroll.Range
                                returnFormat="iso8601"
                                onSet={this.onSetISO}
                                value={this.state.iso}
                            />
                        </label>
                    </div>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup className="mbsc-padding">
				    Return value: {this.state.retISO}
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Working with Localized Strings</mobiscroll.FormGroupTitle>
					<div className="mbsc-btn-group-block">
                        <mobiscroll.Button onClick={this.onClickLocale}>Set: 04/25/2010 8:15 AM - 05/04/2010 10:30 AM</mobiscroll.Button>
                    </div>
                    <div>
                        <label>
                            Local format
                            <mobiscroll.Range
                                returnFormat="locale"
                                onSet={this.onSetLocale}
                                value={this.state.locale}
                            />
                        </label>
                    </div>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup className="mbsc-padding">
				    Return value: {this.state.retLocale}
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Working with Moment JS Objects</mobiscroll.FormGroupTitle>
					<div className="mbsc-btn-group-block">
                        <mobiscroll.Button onClick={this.onClickMoment}>Set: 2018-04-18T15:00:00+03:00 - 2018-04-26T10:00:00+03:00</mobiscroll.Button>
                    </div>
                    <div>
                        <label>
                            Moment JS
                            <mobiscroll.Range
                                theme=""
                                lang=""
                                returnFormat="moment"
                                onSet={this.onSetMoment}
                                value={this.state.moment}
                            />
                        </label>
                    </div>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup className="mbsc-padding">
				    Return value: {this.state.retMoment}
                </mobiscroll.FormGroup>
            </mobiscroll.Form>
        );
    };
    
    setDate(date) {
        this.setState({
            date: date,
            retDate: date.toString()
        });
    }
    
    onClickDate = () => {
        this.setDate([new Date(1995, 11, 17, 15, 24), new Date(1995, 11, 28, 11, 45)]);
    };

    onSetDate = (event, inst) => {
        this.setDate(inst.getVal());
    };
    
    setISO(iso) {
        this.setState({
            iso: iso,
            retISO: iso
        });
    }
    
    onClickISO = () => {
        this.setISO(['2008-09-15T15:53:00', '2008-09-23T16:15:00']);
    };

    onSetISO = (event, inst) => {
        this.setISO(inst.getVal());
    };
    
    setLocale(locale) {
        this.setState({
            locale: locale,
            retLocale: locale
        });
    }
    
    onClickLocale = () => {
        this.setLocale(['04/25/2010 8:15 AM', '05/04/2010 10:30 AM']);
    };

    onSetLocale = (event, inst) => {
        this.setLocale(inst.getVal());
    };
    
    setMoment(moment) {
        this.setState({
            moment: moment,
            retMoment: moment.toString()
        });
    }
    
    onClickMoment = () => {
        // make sure that moment js is loaded
        this.setMoment([moment([2018, 3, 18, 15]), moment([2018, 3, 26, 10])]);
    };

    onSetMoment = (event, inst) => {
        this.setMoment(inst.getVal());
    };
    
}

<div id="content"></div>

Range - Event handlers

Change demo
Event handlers
React Date range picker demo with event hooks for custom integration and functionality. With source code. For React.
Clear event log
EVENTS FIRED: 
class App extends React.Component {
    //<extra>
    show = () =>{
        this.range.instance.show();
    }
    
    clear = () =>{
        this.range.instance.clear();
    }
    
    onInit = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onMarkupReady = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onBeforeShow = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onPosition = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onShow = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onSet = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onItemTap = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onDestroy = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onClose = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onChange = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onCancel = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onBeforeClose = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onClear = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onDayChange = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onPageChange = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onPageLoaded = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onPageLoading = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onSetDate = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onTabChange = (event, inst) => {
        // Your custom event handler goes here
    }
    
    setRef = (comp) => {
        this.range = comp;
    }
    
    render() {
        return (
            <div>
                <mobiscroll.Range 
                    ref={this.setRef} 
                    theme="" 
                    lang=""
                    onInit={this.onInit}
                    onMarkupReady={this.onMarkupReady}
                    onBeforeShow={this.onBeforeShow}
                    onPosition={this.onPosition}
                    onShow={this.onShow}
                    onSet={this.onSet}
                    onItemTap={this.onItemTap}
                    onDestroy={this.onDestroy}
                    onClose={this.onClose}
                    onChange={this.onChange}
                    onCancel={this.onCancel}
                    onBeforeClose={this.onBeforeClose}
                    onClear={this.onClear}
                    onTabChange={this.onTabChange}
                    onSetDate={this.onSetDate}
                    onPageLoading={this.onPageLoading}
                    onPageLoaded={this.onPageLoaded}
                    onPageChange={this.onPageChange}
                    onDayChange={this.onDayChange}
                    placeholder="Please Select..."
                />
                <button onClick={this.clear}>Clear</button>
                <button onClick={this.show}>Show</button>
            </div>
        );
    }    
}

<div id="content"></div>

Range - Marked, colored & labels

Change demo
Marked, colored & labels
React Range calendar demo with marked days, colored days and labels. Provide useful information & customize the view. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

class App extends React.Component {
    constructor(props) {
        super(props);

        const now = new Date();
        
        this.state = {
            marked : [
                { d: '5/1', color: '#ffc400' },
                { d: '12/24', color: '#ffee00' },
                { d: '12/25', color: 'red' },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 4) },
                { d: new Date(now.getFullYear(), now.getMonth() - 2, 13) },
                { d: new Date(now.getFullYear(), now.getMonth(), 2), color: '#46c4f3' },
                { d: new Date(now.getFullYear(), now.getMonth(), 6), color: '#7e56bd' },
                { d: new Date(now.getFullYear(), now.getMonth(), 11), color: '#7e56bd' },
                { d: new Date(now.getFullYear(), now.getMonth(), 19), color: '#89d7c9' },
                { d: new Date(now.getFullYear(), now.getMonth(), 28), color: '#ea4986' },
                { d: new Date(now.getFullYear(), now.getMonth(), 13), color: '#7e56bd' },
                { d: new Date(now.getFullYear(), now.getMonth(), 13), color: '#f13f77' },
                { d: new Date(now.getFullYear(), now.getMonth(), 13), color: '#89d7c9' },
                { d: new Date(now.getFullYear(), now.getMonth(), 13), color: '#8dec7d' },
                { d: new Date(now.getFullYear(), now.getMonth(), 21), color: '#ffc400' },
                { d: new Date(now.getFullYear(), now.getMonth(), 21), color: '#8dec7d' },
                { start: new Date(now.getFullYear(), now.getMonth() + 1, 15), end: new Date(now.getFullYear(), now.getMonth() + 1, 18), color: '#f4511e' }
            ],
            colors: [
                { d: '12/8', background: '#9ccc65' },
                { d: '5/1', background: 'red' },
                { d: '12/24', background: "#fff568" },
                { d: '12/25', background: "#e88080" },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 4), background: '#cfd8dc' },
                { d: new Date(now.getFullYear(), now.getMonth() + 2, 24), background: '#9575cd' },
                { d: new Date(now.getFullYear(), now.getMonth() - 2, 13), background: '#d4e157' },
                { d: new Date(now.getFullYear(), now.getMonth() - 1, 6), background: "#f4511e" },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 6), background: '#46c4f3' },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 22), background: '#7e56bd' },
                { d: new Date(now.getFullYear(), now.getMonth() - 1, 11), background: '#46c4f3' },
                { d: new Date(now.getFullYear(), now.getMonth() - 1, 29), background: '#7e56bd' },
                { d: new Date(now.getFullYear(), now.getMonth(), 2), background: '#46c4f3' },
                { d: new Date(now.getFullYear(), now.getMonth(), 3), background: '#7e56bd' },
                { d: new Date(now.getFullYear(), now.getMonth(), 11), background: '#f13f77' },
                { d: new Date(now.getFullYear(), now.getMonth(), 19), background: '#8dec7d' },
                { d: new Date(now.getFullYear(), now.getMonth(), 28), background: '#ea4986' },
                { start: new Date(now.getFullYear(), now.getMonth() + 1, 15), end: new Date(now.getFullYear(), now.getMonth() + 1, 18), text: 'Conference', background: '#f4511e' }
            ],
            labels: [
                { d: '12/25', text: 'Christmas', color: "#f48fb1" },
                { d: '1/1', text: 'New year' },
                { d: '12/1', text: 'Meeting', color: '#ffc400' },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 4), text: 'Spa day', color: '#cfd8dc' },
                { d: new Date(now.getFullYear(), now.getMonth() + 2, 24), text: 'BD Party', color: '#9ccc65' },
                { d: new Date(now.getFullYear(), now.getMonth() - 2, 13), text: 'Exams', color: '#d4e157' },
                { d: new Date(now.getFullYear(), now.getMonth() - 1, 6), text: 'Trip', color: "#f4511e" },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 6), color: '#46c4f3', text: 'Pizza Night' },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 22), color: '#7e56bd', text: 'Beerpong' },
                { d: new Date(now.getFullYear(), now.getMonth() - 1, 11), color: '#46c4f3', text: 'Anniversary' },
                { d: new Date(now.getFullYear(), now.getMonth() - 1, 29), color: '#7e56bd', text: 'Pete BD' },
                { d: new Date(now.getFullYear(), now.getMonth(), 2), color: '#46c4f3', text: 'Ana BD' },
                { d: new Date(now.getFullYear(), now.getMonth(), 3), color: '#7e56bd', text: 'Concert' },
                { d: new Date(now.getFullYear(), now.getMonth(), 11), color: '#f13f77', text: 'Trip' },
                { d: new Date(now.getFullYear(), now.getMonth(), 19), color: '#8dec7d', text: 'Math exam' },
                { d: new Date(now.getFullYear(), now.getMonth(), 28), color: '#ea4986', text: 'Party' },
                { start: new Date(now.getFullYear(), now.getMonth() + 1, 15), end: new Date(now.getFullYear(), now.getMonth() + 1, 18), text: 'Conference', color: '#f4511e' }
            ]
        };
    }
    
    render() {
        return (
            <mobiscroll.Form>
                <mobiscroll.FormGroup>
                    <mobiscroll.FormGroupTitle>Marked days</mobiscroll.FormGroupTitle>
                    <label>
                       <mobiscroll.Range
                            marked={this.state.marked}
                            display="inline"
                            showSelector={false}
                            placeholder="Please Select..."
                        >
                            <input type="hidden" />
                        </mobiscroll.Range>
                    </label>
                </mobiscroll.FormGroup>
                
                <mobiscroll.FormGroup>
                    <mobiscroll.FormGroupTitle>Colored days</mobiscroll.FormGroupTitle>
                    <label>
                       <mobiscroll.Range
                            colors={this.state.colors}
                            display="inline"
                            showSelector={false}
                            placeholder="Please Select..."
                        >
                            <input type="hidden" />
                        </mobiscroll.Range>
                    </label>
                </mobiscroll.FormGroup>
                
                <mobiscroll.FormGroup>
                    <mobiscroll.FormGroupTitle>Labels</mobiscroll.FormGroupTitle>
                    <label>
                       <mobiscroll.Range
                            labels={this.state.labels}
                            display="inline"
                            showSelector={false}
                            placeholder="Please Select..."
                        >
                            <input type="hidden" />
                        </mobiscroll.Range>
                    </label>
                </mobiscroll.FormGroup>
            </mobiscroll.Form>
        );
    }   
}

<div id="content"></div>

Range - Display modes

Change demo
Display modes
React Datetime range picker with top, bottom, popup, center, modal, bubble, full screen and inline embed display. For React.
mobiscroll.settings = {
    lang: '',
    theme: ''
};

class App extends React.Component {
    render() {
        return (
            <mobiscroll.Form>
                <mobiscroll.FormGroup>
					<mobiscroll.FormGroupTitle>Try different display modes</mobiscroll.FormGroupTitle>
                    <label>
                        Bottom
                        <mobiscroll.Range
                            display="bottom"
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Top
                        <mobiscroll.Range
                            display="top"
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Center
                        <mobiscroll.Range
                            display="center"
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Bubble
                        <mobiscroll.Range
                            display="bubble"
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup className="mbsc-padding">
                    <p className="mbsc-thin">With inline display you can embed the Range component in almost any markup or form.</p>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup>
                    <mobiscroll.FormGroupTitle>Embedded range picker</mobiscroll.FormGroupTitle>
                    <mobiscroll.Range
                        display="inline"
                        layout="liquid"
                        placeholder="Please Select..."
                    >
                        <input type="hidden" />
                    </mobiscroll.Range>
                </mobiscroll.FormGroup>
            </mobiscroll.Form>
        );
    }   
}

<div id="content"></div>

Range - Weeks

Change demo
Weeks
React Date range picker calendar with variable weeks. Render one, two, three weeks or go for a full month. For React.
mobiscroll.settings = {
    theme: '',
    lang: ''
};

class App extends React.Component {
    render() {
        return (
            <mobiscroll.Form>
                <mobiscroll.FormGroup>
                    <mobiscroll.FormGroupTitle>One week view</mobiscroll.FormGroupTitle>
                    <label>
                       <mobiscroll.Range
                            weeks={1}
                            display="inline"
                            showSelector={false}
                            placeholder="Please Select..."
                        >
                            <input type="hidden" />
                        </mobiscroll.Range>
                    </label>
                </mobiscroll.FormGroup>
                
                <mobiscroll.FormGroup>
                    <mobiscroll.FormGroupTitle>Two week view</mobiscroll.FormGroupTitle>
                    <label>
                       <mobiscroll.Range
                            weeks={2}
                            display="inline"
                            showSelector={false}
                            placeholder="Please Select..."
                        >
                            <input type="hidden" />
                        </mobiscroll.Range>
                    </label>
                </mobiscroll.FormGroup>
                
                <mobiscroll.FormGroup>
                    <mobiscroll.FormGroupTitle>Three week view</mobiscroll.FormGroupTitle>
                    <label>
                       <mobiscroll.Range
                            weeks={3}
                            display="inline"
                            showSelector={false}
                            placeholder="Please Select..."
                        >
                            <input type="hidden" />
                        </mobiscroll.Range>
                    </label>
                </mobiscroll.FormGroup>
            </mobiscroll.Form>
        );
    }   
}

<div id="content"></div>

Range - Multi month view

Change demo
Multi month view
React Multi-month range picker. Show one, two or three months side by side depending on screen size - fixed or dynamic. For React.
mobiscroll.settings = {
    lang: '',
    theme: ''
};

class App extends React.Component {
    render() {
        return (
            <mobiscroll.Form>
                <mobiscroll.FormGroup>
                    <mobiscroll.FormGroupTitle>Popover range</mobiscroll.FormGroupTitle>
                    <label>
                        Two months
                        <mobiscroll.Range
                            display="bubble"
                            months={2}
                            yearChange={false}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Three months
                        <mobiscroll.Range
                            display="bubble"
                            months={3}
                            yearChange={false}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Four months
                        <mobiscroll.Range
                            display="bubble"
                            months={4}
                            yearChange={false}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Auto
                        <mobiscroll.Range
                            display="bubble"
                            months="auto"
                            yearChange={false}
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
                <mobiscroll.FormGroup>
                    <mobiscroll.FormGroupTitle>Center positioned range</mobiscroll.FormGroupTitle>
                    <label>
                        Two months
                        <mobiscroll.Range
                            display="center"
                            months={2}
                            yearChange={false}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Three months
                        <mobiscroll.Range
                            display="center"
                            months={3}
                            yearChange={false}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Four months
                        <mobiscroll.Range
                            display="center"
                            months={4}
                            yearChange={false}
                            placeholder="Please Select..."
                        />
                    </label>
                    <label>
                        Auto
                        <mobiscroll.Range
                            display="center"
                            months="auto"
                            yearChange={false}
                            placeholder="Please Select..."
                        />
                    </label>
                </mobiscroll.FormGroup>
            </mobiscroll.Form>
        );
    }   
}


<div id="content"></div>

Range - Calendar systems

Change demo
Calendar systems
React Range picker with Gregorian, Hijri and Jalali system supporting different language and culture settings. For React.
mobiscroll.settings = {
    lang: '',
    theme: ''
};

class App extends React.Component {
    render() {
        return (
            <mobiscroll.Form>
                <div className="mbsc-grid">
                    <div className="mbsc-row">
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <mobiscroll.FormGroup>
                                <mobiscroll.FormGroupTitle>Gregorian calendar</mobiscroll.FormGroupTitle>
                                <mobiscroll.Range
                                    display="inline"
                                    calendarSystem="gregorian"
                                    type="hidden"
                                />
                            </mobiscroll.FormGroup>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <mobiscroll.FormGroup>
                                <mobiscroll.FormGroupTitle>Jalali calendar</mobiscroll.FormGroupTitle>
                                <mobiscroll.Range
                                    display="inline"
                                    calendarSystem="jalali"
                                    lang="fa"
                                    type="hidden"
                                />
                            </mobiscroll.FormGroup>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <mobiscroll.FormGroup>
                                <mobiscroll.FormGroupTitle>Hijri calendar</mobiscroll.FormGroupTitle>
                                <mobiscroll.Range
                                    display="inline"
                                    calendarSystem="hijri"
                                    lang="ar"
                                    type="hidden"
                                />
                            </mobiscroll.FormGroup>
                        </div>
                    </div>
                </div>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>

Range - Desktop

Change demo
Desktop
React Date and time range picker for desktop. Use it with pointer interaction, scrollable wheels with or without buttons. For React.
mobiscroll.settings = {
    lang: '',
    theme: ''
};

class App extends React.Component {
    render() {
        return (
            <mobiscroll.Form>
                <div className="mbsc-grid">
                    <div className="mbsc-row mbsc-justify-content-center">
                        <div className="mbsc-col-sm-9 mbsc-col-md-7 mbsc-col-xl-5">
                            <mobiscroll.FormGroup inset>
                                <mobiscroll.FormGroupTitle>Pop-up positioning</mobiscroll.FormGroupTitle>
                                <label>
                                    Top
                                    <mobiscroll.Range
                                        touchUi={false}
                                        display="top"
                                        placeholder="Please select..."
                                    />
                                </label>
                                <label>
                                    Bottom
                                    <mobiscroll.Range
                                        touchUi={false}
                                        display="bottom"
                                        placeholder="Please select..."
                                    />
                                </label>
                                <label>
                                    Anchored
                                    <mobiscroll.Range
                                        touchUi={false}
                                        placeholder="Please select..."
                                    />
                                </label>
                                <label>
                                    Center
                                    <mobiscroll.Range
                                        touchUi={false}
                                        display="center"
                                        placeholder="Please select..."
                                    />
                                </label>
                            </mobiscroll.FormGroup>
                        </div>
                    </div>
                    <div className="mbsc-row mbsc-justify-content-center">
                        <div className="mbsc-col-sm-9 mbsc-col-md-7 mbsc-col-xl-5">
                            <mobiscroll.FormGroup inset>
                                <mobiscroll.FormGroupTitle>Scroller components</mobiscroll.FormGroupTitle>
                                <label>
                                    Date & Time
                                    <mobiscroll.Range
                                        touchUi={false}
                                        controls={['date', 'time']}
                                        dateWheels="|D M d|"
                                        cssClass="scroller-range"
                                        placeholder="Please select..."
                                    />
                                </label>
                                <label>
                                    Date
                                    <mobiscroll.Range
                                        touchUi={false}
                                        controls={['date']}
                                        placeholder="Please select..."
                                    />
                                </label>
                                <label>
                                    Time
                                    <mobiscroll.Range
                                        touchUi={false}
                                        controls={['time']}
                                        placeholder="Please select..."
                                    />
                                </label>
                            </mobiscroll.FormGroup>
                        </div>
                    </div>
                    <div className="mbsc-row mbsc-justify-content-center">
                        <div className="mbsc-col-sm-9 mbsc-col-md-7 mbsc-col-xl-5">
                            <mobiscroll.FormGroup inset>
                                <mobiscroll.FormGroupTitle>With buttons</mobiscroll.FormGroupTitle>
                                <label>
                                    Set button
                                    <mobiscroll.Range
                                        display="center"
                                        touchUi={false}
                                        buttons={['set']}
                                        placeholder="Please select..."
                                    />
                                </label>
                                <label>
                                    Set/Cancel
                                    <mobiscroll.Range
                                        display="center"
                                        touchUi={false}
                                        buttons={['set', 'cancel']}
                                        placeholder="Please select..."
                                    />
                                </label>
                            </mobiscroll.FormGroup>
                        </div>
                    </div>
                </div>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>
.scroller-range .mbsc-cal-tabs {
    display: none;
}

Range - Theming capabilities

Change demo
Theming capabilities
React Date range picker with iOS, Material, Windows look & feel. Customize colors and styling with theme builder. For React.
mobiscroll.settings = {
    lang: '',
    theme: ''
};

class App extends React.Component {
    render () {
        return (
            <mobiscroll.Form>
                <div className="mbsc-grid mbsc-grid-fixed">
                    <div className="mbsc-row">
                        <div className="mbsc-col-sm-12 mbsc-col-md-6">
                            <mobiscroll.FormGroup inset>
                                <mobiscroll.FormGroupTitle>iOS Theme</mobiscroll.FormGroupTitle>
                                <label>
            					    Light
                                    <mobiscroll.Range
                                        theme="ios"
                                        display="bubble"
                                        touchUi={false}
                                        placeholder="Please Select..."
                                    />
                                </label>
                                <label>
            					    Dark
                                    <mobiscroll.Range
                                        theme="ios-dark"
                                        display="bubble"
                                        touchUi={false}
                                        placeholder="Please Select..."
                                    />
                                </label>
                                <label>
            					    Custom
                                    <mobiscroll.Range
                                        theme="ios-gray"
                                        display="bubble"
                                        touchUi={false}
                                        placeholder="Please Select..."
                                    />
                                </label>
                            </mobiscroll.FormGroup>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-6">
                            <mobiscroll.FormGroup inset>
                                <mobiscroll.FormGroupTitle>Material Theme</mobiscroll.FormGroupTitle>
                                <label>
            					    Light
                                    <mobiscroll.Range
                                        theme="material"
                                        display="bubble"
                                        touchUi={false}
                                        placeholder="Please Select..."
                                    />
                                </label>
                                <label>
            					    Dark
                                    <mobiscroll.Range
                                        theme="material-dark"
                                        display="bubble"
                                        touchUi={false}
                                        placeholder="Please Select..."
                                    />
                                </label>
                                <label>
            					    Custom
                                    <mobiscroll.Range
                                        theme="material-indigo"
                                        display="bubble"
                                        touchUi={false}
                                        placeholder="Please Select..."
                                    />
                                </label>
                            </mobiscroll.FormGroup>
                        </div>
                    </div>
                    <div className="mbsc-row">
                        <div className="mbsc-col-sm-12 mbsc-col-md-6">
                            <mobiscroll.FormGroup inset>
                                <mobiscroll.FormGroupTitle>Windows Theme</mobiscroll.FormGroupTitle>
                                <label>
            					    Light
                                    <mobiscroll.Range
                                        theme="windows"
                                        display="bubble"
                                        touchUi={false}
                                        placeholder="Please Select..."
                                    />
                                </label>
                                <label>
            					    Dark
                                    <mobiscroll.Range
                                        theme="windows-dark"
                                        display="bubble"
                                        touchUi={false}
                                        placeholder="Please Select..."
                                    />
                                </label>
                                <label>
            					    Custom
                                    <mobiscroll.Range
                                        theme="windows-yellow"
                                        display="bubble"
                                        touchUi={false}
                                        placeholder="Please Select..."
                                    />
                                </label>
                            </mobiscroll.FormGroup>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-6">
                            <mobiscroll.FormGroup inset>
                                <mobiscroll.FormGroupTitle>Mobiscroll Theme</mobiscroll.FormGroupTitle>
                                <label>
            					    Light
                                    <mobiscroll.Range
                                        theme="mobiscroll"
                                        display="bubble"
                                        touchUi={false}
                                        placeholder="Please Select..."
                                    />
                                </label>
                                <label>
            					    Dark
                                    <mobiscroll.Range
                                        theme="mobiscroll-dark"
                                        display="bubble"
                                        touchUi={false}
                                        placeholder="Please Select..."
                                    />
                                </label>
                                <label>
            					    Custom
                                    <mobiscroll.Range
                                        theme="mobiscroll-lime"
                                        display="bubble"
                                        touchUi={false}
                                        placeholder="Please Select..."
                                    />
                                </label>
                            </mobiscroll.FormGroup>
                        </div>
                    </div>
                </div>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>

Looking for something you didn't see or have a sales question?
Ask us about it, we're here to help.

Component license


Purchase component licenses if you are looking for specific funcionality.

Total


All features will be included with the license.

Buy component license

Framework license


Get all 36 components, including with the Framework license.



Mobiscroll for React $595


Use Javascript when building with plain and simple JS. Use jQuery when you have jQuery already included or if you are building with jQuery Mobile. Use AngularJS when building with Angular 1.x or Ionic 1. Use Angular when building with Angular 2/4/5/6/7 or Ionic 2/3/4. Use it when you are building your app or website with React.


Buy framework license
See other licensing options

Framework license


Get all 36 components, including with the Framework license.



Mobiscroll for React $595


  • Use it when building with plain and simple JS
  • Compatible with vanilla JS app or frameworks like Vue
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it with jQuery and jQuery Mobile
  • Enjoy the familiar API if you already use jQuery
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it with Angular JS and Ionic 1
  • For web and mobile apps based on Angular 1.x
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it with Angular 2/4/5/6/7 and Ionic 2/3/4
  • Visual Studio and VS Code integration
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it when building with React JS
  • Collection of UI components for web and mobile
  • Royalty-free commercial usage
  • Technical support is included with the license
Buy framework license
See other licensing options

Framework license


Select the development framework you are using. Get all 36 components with the license.

Mobiscroll for Javascript
Mobiscroll for jQuery
Mobiscroll for React
Mobiscroll for Angular
Mobiscroll for Angular JS
  • Use it when building with plain and simple JS
  • Compatible with vanilla JS app or frameworks like Vue
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it with jQuery and jQuery Mobile
  • Enjoy the familiar API if you already use jQuery
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it with Angular JS and Ionic 1
  • For web and mobile apps based on Angular 1.x
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it with Angular 2/4/5/6/7 and Ionic 2/3/4
  • Visual Studio and VS Code integration
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it when building with React JS
  • Collection of UI components for web and mobile
  • Royalty-free commercial usage
  • Technical support is included with the license
Buy framework license
See other licensing options

Select the framework you are interested in

Javascript
jQuery
Angular
Angular JS
React

Use Javascript when building with plain and simple JS.

Use jQuery when you have jQuery already included or if you are building with jQuery Mobile.

Use AngularJS when building with Angular 1.x or Ionic 1.

Use Angular when building with Angular 2/4/5/6/7 or Ionic 2/3/4.

Use it when you are building your app or website with React.

Do you need additional support seats?

The framework license comes with one support seat. ( +$50/seat )

Add the source code?

Price
Buy now
Customize & try demos locally
Sign in or start your free trial

What framework are you using?

Javascript
jQuery
AngularJS
Angular
Ionic
React
Other
Select a framework
Email address

Customize & try this demo locally
Sign in or start your free trial

We have to set you up with a trial for this to run 👍

Email address

Customize & try demos locally
You can download and use Mobiscroll for Free

What framework are you using?

Javascript
jQuery
AngularJS
Angular
Ionic
React
Other
Select a framework
Install demo in your app
Follow this quick, two minute install guide
Close window

Step 1.Install the Mobiscroll CLI from npm

Copy command
$ npm install -g @mobiscroll/cli

The CLI makes configuring your apps super simple 👍

Step 2.Run the following command in the root folder of your Ionic project

Copy command
$ mobiscroll config ionic
$ mobiscroll config ionic --lite

You will be prompted to log in with your mobiscroll account. Set your password here

Create an Ionic 3 & Mobiscroll starter with the CLI:

$ mobiscroll start ionic myStarter

Run this command for Ionic 4 & Mobiscroll starter:

$ mobiscroll start ionic-angular myStarter

Step 3.Copy the code into your app.

Copy TS
Copy HTML
Copy CSS
Copy Module

Step 4.Run ionic serve in the root folder of your app 🎉

Copy command
$ ionic serve

And voilà, everything should be running smoothly.

Customize & try demos locally
How would you like to do it?
Install demo in your app
Follow this quick, two minute install guide
Close window

Step 1.Install the Mobiscroll CLI from npm

Copy command
$ npm install -g @mobiscroll/cli

The CLI makes configuring your apps super simple 👍

Step 2.Run the following command in the root folder of your Angular project

Copy command
$ mobiscroll config angular
$ mobiscroll config angular --lite

You will be prompted to log in with your mobiscroll account. Set your password here

Step 3.Copy the code into your app. HTML goes into the markup, TS into Typescript.

Copy TS
Copy HTML
Copy CSS
Copy Module

Step 4.Run ng serve in the root folder of your app 🎉

Copy command
$ ng serve

And voilà, everything should be running smoothly.

Thanks for downloading
Try and customize the app locally

Extract the zip file and run the project like any Ionic app. Make sure to have Ionic CLI installed and open the terminal in the app root folder.

Step 1. Run in root folder
$ npm install
Step 2. Start the app
$ ionic serve

Let us know if we can help and enjoy!

Change your password
Need to update your password? Enter and hit the button below

You are setting a password for the account

New Password Required Enter at least 6 characters
Change your password
Need to update your password? Enter and hit the button below

Your password has been changed!

Thanks for downloading
Customize demos locally

Everything is set up so that you can dig in right away and start exploring.

We have set up a trial so that you can try the demos locally.

Extract the zip file and open the demo in your favorite browser. To install Mobiscroll in your project follow instructions from this page.


Let us know if we can help and enjoy! 👍

Thanks for downloading
Customize demos locally

Please extract the zip file and run the project like any Angular CLI app. Make sure to have the Angular CLI installed.

For installation and usage, extract the zip file and open a terminal window and follow these steps.

Step 1. Run in root folder
$ npm install
Step 2. Start the app
$ ng serve --open

Let us know if we can help and enjoy! 👍

Thanks for downloading
Customize demos locally

Everything is set up so that you can dig in right away and start exploring.

We have set up a trial so that you can try the demos locally.

The easiest way to get started is to follow the installation steps and by grabbing the code directly from the demo page. Let us know if we can help and enjoy!

You'll find a fully functional Kitchen-sink Ionic app in the zip file.

Thanks for downloading
Customize demos locally

Everything is set up so that you can dig in right away and start exploring.

We have set up a trial so that you can try the demos locally.

The demos are using Babel's in-browser ES6 and JSX transformer. Extract the zip file and open the demo in your browser. To install Mobiscroll in your project follow instructions from this page.


Let us know if we can help and enjoy! 👍

Demos
Alerts & notifications
Alert Notifications Note
Components
Alerts & notifications 3
Buttons 4
Calendar 27
Cards 14
Collapsible 3
Color 10
Date & Time 20
Event Calendar 25
Forms 6
Grid layout 7
Image 7
Inputs & fields 6
Listview 18
Measurement 10
Navigation 8
Number 8
Numpad 13
Option List 4
Popup 10
Range 19
Scroller 7
Scrollview 5
Select 18
Slider & progress 4
Styling 6
Timer 5
Timespan 6
Toggle & Radio 4
Treelist 7
Theme Select
Mobiscroll
Mobiscroll Dark
Material
Material Dark
iOS
iOS Dark
Bootstrap
Windows
Windows Dark
Display Mode
Language Locale
See other demos and change options
Theme
Display
Locale
See other demos