info m-form-number
Number field
Number field - inline spinners
<div class="my-3"> Number field<br>
	<div class="m-form-number">
		<input type="number" min="0" max="9" step="1" name="number1" id="frm-pc-form-number1" class="m-form-number__input a-form-input jq_number_field">
	</div>
</div>

<div class="my-3"> Number field - inline spinners<br>
	<div class="m-form-number m-form-number--inline">
		<input type="number" min="0" max="9" step="1" name="number2" id="frm-pc-form-number2" class="m-form-number__input a-form-input jq_number_field">
	</div>
</div>
@import "atoms/form-input/index";

.m-form-number {

    $self: &;

    display: inline-block;
    margin-bottom: space(1);
    margin-top: space(1);
    position: relative;

    &:first-child {

        margin-top: 0;

    }

    &:last-child {

        margin-bottom: 0;

    }

    &__spin {

        cursor: pointer;
        height: 50%;
        line-height: 1;
        margin: 0;
        overflow: hidden;
        padding: 0;
        position: absolute;
        right: 0;
        text-align: center;
        width: 20px;
        z-index: 0;

        &[data-dir="inner"] {

            top: 0;

            &:after {

                content: '+';

            }

        }

        &[data-dir="outer"] {

            bottom: 0;

            &:after {

                content: '-';

            }

        }

        &:before {

            content: '';
            display: inline-block;
            height: 100%;
            vertical-align: middle;
            width: 0;

        }

        .no-js & {

            display: none;

        }

    }

    & #{$self}__input {

        margin: 0;
        position: relative;
        text-align: center;
        width: 80px;
        z-index: 1;

        .js & {

            appearance: textfield;
            margin: 0 20px;

            // sass-lint:disable no-vendor-prefixes
            &::-webkit-inner-spin-button,
            &::-webkit-outer-spin-button {

                -webkit-appearance: none;
                margin: 0;

            }
            // sass-lint:enable no-vendor-prefixes

        }

    }

    &:not(#{$self}--inline) {

        #{$self}__spin {

            &[data-dir="outer"] {

                border-top: 0;

            }

        }

        #{$self}__input {

            margin-left: 0;

        }

    }

    &--inline {

        #{$self}__spin {

            bottom: auto;
            height: 100%;
            top: 0;

            &[data-dir="outer"] {

                left: 0;
                right: auto;

            }

        }

        #{$self}__input {

            width: 60px;

        }

    }

}
import $ from 'jquery';

export default class NumberField {
	constructor() {

		$('.jq_number_field').each((i, el) => {
			var $el = {
				input: $(el),
				spines: []
			};

			var data = {
				min: parseFloat($el.input.attr('min') || 0),
				max: parseFloat($el.input.attr('max') || $el.input.attr('maxlength')),
				step: parseFloat($el.input.attr('step') || 1)
			};

			$.each([ 'inner', 'outer' ], (index, dir) => {
				var spin = $('<span>')
							.addClass('m-form-number__spin')
							.attr('data-dir', dir);

				spin.on('click', { input: $el.input, dir: dir, data: data }, this.change);

				$el.spines.push(spin);
			});

			$el.input.before($el.spines);

			$el.input.on('change', { data: data }, this.trigger);
		});
	}

	change(event) {
		var $el = {
			input: $(event.data.input),
			spin: $(this)
		};

		var data = event.data.data;
		data.dir = event.data.dir;
		data.number = parseInt($el.input.val());

		if (isNaN(data.number)) {
			data.number = !isNaN(data.min) ? data.min : 0;
		}

		if (isNaN(data.step)) {
			data.step = 1;
		}

		if (data.dir === 'inner') {
			data.number += data.step;
		} else {
			data.number -= data.step;
		}

		if (!isNaN(data.min) && !isNaN(data.max)) {
			data.number = Math.min(data.max, Math.max(data.min, data.number));
		}

		$el.input.val(data.number).trigger('change');
	}

	trigger(event) {
		var $el = {
			input: $(this)
		};

		var data = event.data.data;

		if (!isNaN(data.min) && !isNaN(data.max)) {
			data.number = parseInt($el.input.val());

			data.number = Math.min(data.max, Math.max(data.min, data.number));

			$el.input.val(data.number);
		}
	}
}

$(() => new NumberField);

Menu