/**
 * Roundcube Webmail styles for the Elastic skin
 *
 * Copyright (c) The Roundcube Dev Team
 *
 * The contents are subject to the Creative Commons Attribution-ShareAlike
 * License. It is allowed to copy, distribute, transmit and to adapt the work
 * by keeping credits to the original authors in the README.md file.
 * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
 */

/*** Common form elements ***/

#uploadform {
    display: none;
}

form.smart-upload,
input.smart-upload {
    visibility: hidden;
    width: 1px;
    height: 1px;
    opacity: 0;
}


.propform {
    // TODO: do we need this?
    &:not(.popupmenu) {
        width: 100%;
    }

    // This is the way we can have multiple checkboxes in a single form field
    .form-check td:not(.title) > label {
        display: block;
        margin: 0;
        line-height: 2rem;

        label {
            margin-right: .5rem;
        }
    }

    td.datetime {
        display: flex;

        input:first-child {
            margin-right: .5rem;
        }
        input:last-child {
            width: 75%;
        }
    }

    td.rowbuttons {
        width: 1%;
        white-space: nowrap;
        vertical-align: top;

        span {
            display: none;
        }

        a {
            padding: 0;
            line-height: 2.3rem;
            height: 2.3rem;
            font-size: 1rem;

            &:before {
                &:extend(.font-icon-class);
                content: @fa-var-plus;
                vertical-align: unset;

                @media screen and (min-width: (@screen-width-bs-phone + 1px)) {
                    margin: 0 !important;
                }
            }

            &.delete:before {
                content: @fa-var-trash-alt;
            }

            &.advanced:before {
                content: @fa-var-cog;
            }

            &:not(:last-child) {
                margin-right: .25rem;
            }
        }
    }

    td.rowactions {
        width: 1%;
        vertical-align: top;

        .form-control {
            width: auto;
        }
    }

    td.rowtargets {
        vertical-align: top;

        .composite {
            input, textarea, select, .multi-input, .input-group {
                margin-bottom: .5rem;
            }

            .input-group {
                input, textarea, select, .multi-input {
                    margin-bottom: 0;
                }
            }

            br {
                display: block;
            }
        }

        .input-group {
            margin-bottom: .25rem;

            *:first-child.input-group-prepend {
                text-align: left;
                min-width: 7.5em;

                & > * {
                    width: 100%;
                }
            }
        }

        & > .advanced {
            margin-top: .25rem;
        }
    }

    td.title {
        padding-top: 0;
        padding-bottom: 0;
    }

    td > .flexbox {
        display: flex;

        & > .multi-input {
            width: 100%;
            margin-left: .25rem;
        }
    }

    &.grouped {
        &.readonly {
            legend {
                margin: 0;
            }

            .row.input-group {
                margin-bottom: 0 !important;
            }

            label {
                min-width: 7rem;
                // Overwrite Bootstrap .input-group-* style to make the label transparent
                background-color: transparent;
                border: 0;
                border-radius: 0;
            }
        }

        .row.input-group {
            margin-bottom: .5rem;
            flex-wrap: nowrap;

            & > *:first-child {
                .overflow-ellipsis();
                min-width: 8rem;

                &:not(select) {
                    padding: 0;
                }

                @media screen and (max-width: @screen-width-xs) {
                    min-width: 6rem;
                    width: 6rem;
                    flex-grow: unset;
                }

                label {
                    width: 100%;
                }
            }

            & > *:nth-child(2) {
                flex-grow: 30;
            }

            &:last-child {
                margin-bottom: 1rem;
            }

            select {
                text-align: left;
            }

            &.composite select {
                height: auto;
            }

            .content {
                padding: 0;
                display: flex;
                flex-wrap: wrap;
                border-radius: 0;
                border-left-color: transparent;

                input {
                    border-radius: 0;
                    border-color: transparent;
                }

                .ff_street {
                    width: 100%;
                }

                .ff_locality {
                    width: 75%;
                }

                .ff_zipcode {
                    width: 25%;
                }

                .ff_country, .ff_region {
                    width: 50%;
                }
            }
        }

        .form-control-plaintext {
            flex-grow: 1;
            border: 0;
        }
    }

    .addfield {
        margin: 0;

        select {
            width: 8rem;
            margin-top: .5rem;
        }
    }

    .form-text {
        font-size: 90%;
        color: @color-form-hint;
    }

    // Some dialogs may use simple one-row forms like this
    &.row.form-group {
        margin-left: 0;
        margin-right: 0;

        label, div {
            padding-left: 0;
            padding-right: 0;
        }
    }

    // Some forms may use multiple elements that are not part of .input-group
    // add proper spacing
    select + select,
    select + .input-group {
        padding-top: .5rem;
    }

    &.text-only {
        margin-bottom: .25rem;

        tr {
            margin: 0;
        }

        label {
            padding-bottom: 0 !important;
        }

        @media screen and (max-width: @screen-width-bs-phone) {
            tr {
                display: table-row;
            }

            td {
                width: auto;

                &:first-child {
                    width: 33%;
                }
            }

            :not(tr).form-group.row {
                .col-form-label {
                    width: 33%;
                }

                & > :last-child {
                    width: 67%;
                }
            }
        }
    }
}

@media screen and (max-width: @screen-width-bs-phone) {
    .propform {
        table.compact-table {
            .rowactions > select,
            .flexbox > select {
                width: 100%;
            }

            tr {
                display: flex;
                flex-direction: column;

                td {
                    width: 100%;
                    padding: .25rem 0 0 0;

                    &.rowbuttons {
                        text-align: right;
                        padding-top: 0;

                        a {
                            margin-left: .5rem;

                            & > span {
                                display: inline;
                            }
                        }
                    }
                }
            }
        }
    }
}

.propform,
.formcontent {
    fieldset:not(.tab-pane):nth-of-type(n+2) {
        margin-top: 1em;
    }

    legend {
        font-weight: bold;
        font-size: 1.2em;
    }

    label {
        -webkit-hyphens: auto;
        -ms-hyphens: auto;
        hyphens: auto;
        overflow: hidden;
        margin-bottom: 0;
    }
}

fieldset.advanced {
    > legend {
        width: auto;
        cursor: pointer;

        &:after {
            &:extend(.font-icon-class);
            float: right;
            margin: 0 0 0 .25rem;
            line-height: inherit;
            font-size: inherit;
            content: @fa-var-angle-up;
        }

        &.closed:after {
            content: @fa-var-angle-down;
        }
    }
}

@media screen and (max-width: @screen-width-bs-phone) {
    .formcontent .text-only {
        .form-group:not(tr) {
            margin-bottom: .25rem;

            .col-form-label {
                width: 33%;

                & + span {
                    width: 67%;
                }
            }
        }
    }

    html.iframe .formcontent > .propform {
        padding: .25rem;
    }
}

// Forms fixes for IE and Edge
html.ms .propform {
    .row:not(.form-check) > td {
        display: flex;
        flex-wrap: wrap; // puts "hint" element below the input
    }
    @media screen and (min-width: @screen-width-bs-phone) {
        .row.form-check > td {
            display: flex;
        }
    }
}


.formcontainer {
    display: flex;
    flex-direction: column;
    justify-content:flex-start;
    overflow-y: hidden !important;

    .formcontent {
        overflow-x: hidden;
        overflow-y: auto;
    }

    .formbuttons {
        padding: 0.5rem 1rem;

        button {
            margin-right: .5rem;
        }
    }

    // Prevent button truncation on tablets
    html.iframe.ipad &,
    html.iframe.webkit.tablet & {
        .formbuttons {
            min-height: 4rem;
        }
    }

    // We don't need buttons element on small devices, nor flex display
    html.layout-small &,
    html.layout-phone & {
        display: initial;
        overflow-y: auto !important;

        .formcontent {
            overflow: initial !important;
        }

        .formbuttons {
            display: none;
        }
    }
}


.formcontent {
    &:not(.popupmenu) {
        padding: 1rem;
    }

    .row {
        margin-right: 0; // without these the form is too wide causing horizontal scrollbar appearance
        margin-left: 0;

        // Note: We never use odd numbers here
        .col, .col-2, .col-4, .col-6, .col-8, .col-10, .col-12,
        .col-sm, .col-sm-2, .col-sm-4, .col-sm-6, .col-sm-8, .col-sm-10, .col-sm-12 {
            // overwrite Bootstrap's redundant padding
            padding: 0;
        }

        .form-control-plaintext,
        label.col-form-label {
            padding: floor(.375 * @page-font-size) floor(.375 * @page-font-size) floor(.375 * @page-font-size) 0;
        }

        .form-control-plaintext {
            padding-bottom: 0;
            border: 0;
        }

        @media screen and (max-width: @screen-width-bs-phone) {
            &.form-group {
                & > td label {
                    padding-bottom: 0;
                }
            }
        }
    }

    .row.form-check {
        padding: 0; // without these e.g. inputs in compose screen are not aligned properly
        display: flex; // https://github.com/twbs/bootstrap/issues/22348
        flex-wrap: nowrap;

        // alignment fixes needed because we do not stick precisely to Bootstrap's form structure
        @media screen and (max-width: @screen-width-bs-phone) {
            .col-6 {
                max-width: 100%;
                flex: auto;
            }

            & > *:last-child {
                width: 1%;
                min-width: 2.6rem; // for .custom-switch
            }

            &.with-link > *:last-child {
                min-width: 8rem;
            }
        }

        .form-check-input {
            margin: .5rem 0; // fixes checkbox alignment with other inputs in a form
        }

        .custom-switch + a {
            line-height: 2;
            vertical-align: bottom;
        }

        td > label {
            padding-bottom: 0;
        }
    }

    .nav-tabs {
        margin-bottom: 1rem;

        &:empty {
            display: none;
        }
    }

    .hint {
        font-style: italic;
        color: @color-form-hint;
    }

    // RAW (CodeMirror) editor
    &.raweditor {
        height: 100%;

        form {
            height: 100%;
        }

        textarea {
            font-family: monospace;
            height: 100%;
        }

        .CodeMirror {
            border: 1px solid @color-input-border;
            border-radius: .3rem;
            height: 100%;
            color: @color-font;
        }

        .CodeMirror-focused {
            border-color: @color-input-border-focus;
            box-shadow: 0 0 0 .2rem @color-input-border-focus-shadow;
        }

        .CodeMirror-linebackground.line-error {
            background-color: @color-error;
            opacity: 0.4;
        }

        .errorGutter {
            width: .8em;
        }
    }
}

@media screen and (max-width: @screen-width-mini) {
    .formcontent {
        .col-form-label {
            flex: auto;
            max-width: 100%;
        }
        .col-6, .col-8, .col-10 {
            flex: auto;
            max-width: 100%;
        }
    }
}


/* Some common icons for "iconized inputs" */
.input-group .icon {
    text-decoration: none;
    padding: floor(.375 * @page-font-size) .5rem;

    &.input-group-text {
        min-width: 2.4rem;
    }

    &:before {
        &:extend(.font-icon-class);
        margin: 0 !important;
        line-height: 1;
        font-size: 1.1rem;
    }
    &.user:before {
        content: @fa-var-user;
    }
    &.pass:before {
        content: @fa-var-lock;
    }
    &.host:before {
        content: @fa-var-home;
    }
    &.language:before {
        content: @fa-var-globe;
    }
    &.cancel:before {
        content: @fa-var-times;
    }
    &.delete:before {
        content: @fa-var-trash-alt;
    }
    &.edit:before {
        content: @fa-var-pencil-alt;
    }
    &.add:before {
        content: @fa-var-plus;
    }
    &.add.recipient:before {
        content: @fa-var-users;
    }
    &.search:before {
        content: @fa-var-search;
    }
    &.filter:before {
        content: @fa-var-filter;
    }
    &.key:before {
        content: @fa-var-key;
    }

    .inner {
        display: none;
    }
}

.input-group a {
    &:focus {
        background-color: @color-input-border-focus-shadow;
        outline: 0;
    }
}

@proplist-record-height: 2rem;
.proplist {
    margin-bottom: 0;
    padding: 0;

    li {
        list-style-type: none;
        line-height: @proplist-record-height;
        margin-bottom: .25rem;
        display: flex;
        align-items: center;

        &:last-child {
            margin-bottom: 0;
        }

        input[type=radio] {
            margin-right: .5em;

            &:disabled + label {
                opacity: .5;
            }
        }

        label:not(.input-group-text) {
            margin: 0;
            line-height: @proplist-record-height;
        }

        select {
            width: auto;
            display: inline;
        }

        &.with-sublist {
            flex-wrap: wrap;
            position: relative;

            & > :first-child {
                width: 100%;
                margin-right: 2em;
            }

            & > .proplist {
                margin-left: 2.5rem;
            }

            & > a.dropdown {
                position: absolute;
                right: 0;
                top: 0;
                height: 2em;
                color: @color-font;
            }
        }
    }
}

.checklist {
    & > div {
        line-height: 2rem;
        display: block; // overwrite .custom-switch
    }

    .custom-control-label {
        &:before,
        &:after {
            margin: calc(floor(.15 * @page-font-size) * -1) 0 0 0;
        }
    }

    & > div + br {
        display: none;
    }
}

/*** Forms in popups ***/

.popup form.propform {
    padding: .25rem;
    overflow-x: hidden;
}

.popupmenu.form {
    &.nolist {
        padding: 0 .5rem;
    }

    ul {
        list-style-type: none;
        padding: 0;
        margin: 0;
    }

    li:not(.separator) {
        padding: 0 1rem;

        label {
            margin: 0;
            line-height: @listing-line-height;

            input {
                margin-right: .5rem;
            }
        }
    }

    input {
        vertical-align: middle;
    }

    select {
        margin: .5rem 0;
    }

    .buttons {
        text-align: center;
        padding: .5rem;
    }
}


/*** Smart list (multiple input) field ***/

.multi-input {
    & > .content {
        max-height: 11.65em;
        overflow: hidden;
        overflow-y: auto;
        border-radius: .25rem;
        border: 1px solid @color-input-border;

        &.focused {
            .style-input-focus();
        }

        // TODO: style button focus
    }

    a.icon {
        &.reset:before {
            &:extend(.font-icon-class);
            content: @fa-var-trash-alt;
        }
    }

    input.form-control {
        padding-left: .75rem;
        height: auto; // fixes input height
    }

    input,
    input:focus,
    .input-group-text {
        border-radius: 0;
        border: 0;
        border-bottom: 1px solid @color-input-border;
        box-shadow: none;
    }

    .input-group-text {
        border-left: 1px solid @color-input-border;
    }

    .input-group-append {
        margin-left: 0;
    }

    .input-group {
        margin: 0 !important;
        flex-wrap: nowrap; // Bootstrap makes them wrappable (imho)

        &:last-child * {
            border-bottom: 0;
        }
    }

    & + .btn {
        margin-top: .5rem;
    }

    &.is-invalid {
        & > .content {
            border: 1px solid @color-input-border-invalid;
            &.focused {
                border-color: @color-input-border-invalid;
                box-shadow: 0 0 0 .2rem @color-input-border-invalid-shadow;
            }
        }

        & > .invalid-feedback {
            display: inline-block;
            line-height: 1.5;
        }
    }
}


/*** Files upload widget with list of files, upload form and drop area ***/

.file-upload {
    padding: 1rem 1rem 12rem;
    margin: 0 1rem .25rem 1rem;
    border-radius: .5rem;
    border: .2rem dashed @color-table-border;

    fieldset & {
        margin: 0;
    }

    .upload-form {
        text-align: center;
        padding-bottom: 1em;

        a.btn,
        button {
            margin-bottom: .25rem;
        }
    }

   .hint {
        margin-bottom: .5rem;
        color: @color-form-hint;
        text-align: center;
    }

    .attachmentslist {
        border: 0;
        background: transparent;

        li {
            position: relative;
            display: flex;
            padding-right: 1.5em;
            margin: 0.15em 0;

            a.filename {
                flex: 1;
            }

            a.delete,
            a.cancelupload {
                position: absolute;
                right: 0.25em;
                width: auto; // fix button width if the widget is in a .popupmenu
            }

            a.dropdown {
                margin-right: .5em;
            }

            .inner {
                display: none;
            }
        }
    }

    &.droptarget {
        padding-bottom: .5rem !important;

        &:after {
            content: @icon-file-drop;
            width: 10rem;
            margin: 5rem auto 0 auto;
            display: block;
        }

        &.active {
            border-color: darken(@color-toolbar-button-background-hover, 20%);
        }

        &.hover {
            border-color: darken(@color-toolbar-button-background-hover, 20%);
            background-color: @color-toolbar-button-background-hover;
        }
    }
}


/*** Smart recipient input field ***/

@recipient-input-margin-fix: round(.25 * @page-font-size);

.recipient-input {
    display: flex;
    flex-wrap: wrap;
    padding: 0 .75rem @recipient-input-margin-fix .75rem;
    list-style-type: none;
    cursor: text;
    height: auto; // reset .form-control height

    &.focus {
        .style-input-focus();
    }

    li {
        max-width: 100%;

        &:not(.recipient) {
            user-select: text;
        }

        &.input {
            flex: 1;
            min-width: 100px;
        }
    }

    input {
        width: 100%;
        background: transparent !important;
        border: 0 !important;
        margin-top: @recipient-input-margin-fix;
        outline: 0;
        line-height: 1.5;

        &::-ms-clear {
            display: none; // removes clear icon in IE11
        }
    }
}

.recipient-input li.recipient,
body > li.recipient.ui-sortable-helper {
    display: flex;
    position: relative;
    max-width: ~"calc(50% - 3px)";
    border: 1px solid @color-recipient-input-border;
    background-color: @color-recipient-input-background;
    border-radius: .25rem;
    padding: 0 .25rem;
    margin-top: @recipient-input-margin-fix;
    margin-right: .2em;
    white-space: nowrap;
    cursor: default;

    @media screen and (max-width: 450px) {
        width: 100%;
        max-width: 100%;
    }

    .name {
        .overflow-ellipsis();
        flex-grow: 1;
        line-height: 1.1;
        padding: floor(.25 * @page-font-size);
        vertical-align: middle;
    }

    .email {
        text-indent: -5000rem;
        display: inline-block;
        width: 0;
    }

    .quotes {
        position: absolute;
        width: 0;
        opacity: 0;
    }

    a.button.icon {
        font-size: .75em;
        cursor: pointer;
        padding: 0;
        color: @color-font;

        &:before {
            display: inline-block;
            width: 1em;
            line-height: 1.6;
        }
    }

    &.ui-sortable-helper {
        // fix element width while dragging
        padding: 0 0 0 .25rem !important;
    }
}

/*** Tagedit widget (from jqueryui plugin) ***/

.tagedit-list {
    display: flex;
    flex-wrap: wrap;
    padding: 0 .75rem @recipient-input-margin-fix .75rem;
    margin: 0;
    list-style-type: none;
    min-height: 2.3rem;

    & + .placeholder {
        display: none;
    }

    &[tabindex="-1"] {
        .style-input-focus();
    }

    li.tagedit-listelement-new {
        margin-top: @recipient-input-margin-fix;

        input {
            width: 15px;
            background: transparent !important;
            border: 0;
            outline: 0;
            margin: 0;
            padding: 0;
            line-height: 1.5;

            &.tagedit-input-disabled {
                visibility: hidden;
            }
        }
    }

    li.tagedit-listelement-old {
        max-width: 50%;
        border: 1px solid @color-recipient-input-border;
        background-color: @color-recipient-input-background;
        border-radius: .25em;
        margin-top: @recipient-input-margin-fix;
        margin-right: .2em;
        white-space: nowrap;

        a /* TODO: .tagedit-close, .tagedit-break, .tagedit-delete, .tagedit-save */ {
            font-size: .8em;
            cursor: pointer;
            display: inline-block;
            width: 1.1em;
            overflow: hidden;
            vertical-align: middle;
            margin-right: .2rem;

            &:before {
                &:extend(.font-icon-class);
                content: @fa-var-times;
                width: 1em;
                line-height: 1.2;
            }
        }

        span {
            .overflow-ellipsis();
            flex-grow: 1;
            display: inline-block;
            line-height: 1.4;
            padding: 0 .25rem;
            vertical-align: middle;
        }
    }

    li.tagedit-listelement-focus {
        // TODO
    }
}


/*** Skin selection widget ***/

.skinselection {
    white-space: nowrap;
    display: table-row;

    & > span {
        display: table-cell;
        vertical-align: middle;
        padding: .1em .5em;
        white-space: normal;

        &:last-child {
            padding-right: 0;
        }
    }

    .skinitem input {
        width: auto;
    }

    .skinname {
        font-weight: bold;
    }

    .skinlicense,
    .skinlicense a {
        font-style: italic;
        text-decoration: none;
    }

    .skinlicense a:hover {
        text-decoration: underline;
    }

    .skinlicense,
    .skinauthor {
        font-size: 90%;
    }

    .skinthumbnail {
        width: 64px;
        height: 64px;
        border: 1px solid @color-input-border;
        background: #fff;
        border-radius: 4px;
    }
}

/*** Percent input with jQuery-UI slider ***/

// Structure: <input><span.label><div.ui-slider>
.input-percent-slider {
    display: flex;
    align-items: center;

    input {
        max-width: 4em;
    }

    span.label {
        line-height: 2.4;
        padding: 0 .5rem 0 .25rem;
    }

    div.ui-slider {
        flex: 1;
        margin: 0 .5em;
    }
}


/*** Image upload widget ***/

.image-upload {
    position: relative;
    overflow: hidden;
    cursor: pointer;
    background-color: @color-image-upload-background;

    a.button {
        display: none;
        position: absolute;
        left: 0;
        top: 0;
        background-color: rgba(255, 255, 255, .85);
        border-radius: 5px;
        width: 2.5em;
        padding: .5em;
        margin: .5em;
        line-height: 1;
    }

    &.changed a.button {
        display: inline;
    }
}

.input-group-combo {
    select:first-of-type {
        &.alone {
            border-radius: .25rem !important;
        }

        &:not(.alone) {
            flex: unset;
            width: auto;
        }
    }

    .input-group {
        padding: 0 !important;
        flex: 2;
    }

    select + select,
    .input-group :first-child {
        border-top-left-radius: 0;
        border-bottom-left-radius: 0;
    }
}


/*** General browser hacks ***/

// Remove outline on selects in Firefox
@-moz-document url-prefix() {
    select:-moz-focusring {
       color: transparent !important;
       text-shadow: 0 0 0 @color-font !important;
    }
}


/*** Bootstrap style overrides and improvements ***/

.form-control {
    color: @color-font;

    &:focus {
        color: @color-font;
        border-color: @color-input-border-focus;
        box-shadow: 0 0 0 .2rem @color-input-border-focus-shadow;
    }

    // FIXME: This fixes style of required inputs in Firefox/Edge, but
    // makes inputs on login form red-bordered, commented for now
    // &:invalid,
    &.is-invalid {
        border-color: @color-input-border-invalid;
        box-shadow: none;

        &:focus {
            border-color: @color-input-border-invalid;
            box-shadow: 0 0 0 .2rem @color-input-border-invalid-shadow;
        }
    }

    &::placeholder {
        color: @color-input-placeholder;
    }

    // Note: This must be a separate rule
    &::-ms-input-placeholder,
    &::-webkit-input-placeholder {
        color: @color-input-placeholder;
    }
}

.invalid-feedback {
    color: @color-error;
    font-size: 90%;
}

.form-group {
    margin-bottom: .5rem;
}

// This one is to fix height of an input-group child that usually we put
// in between inputs, e.g. in managesieve forms it is '@' in email input
// with a separate local part and domain selector.
.input-group-append.input-group-prepend {
    display: inline;
}

.input-group-text {
    color: @color-input;
    background-color: @color-input-addon-background;

    input:focus {
        z-index: 1;
        border-color: @color-input-border-focus !important;
    }
}

.custom-switch {
    padding-left: 0;
    display: inline-block;

    .custom-control-input {
        left: 0;
        opacity: 0 !important; // fixes input in dark mode

        &:focus ~ .custom-control-label:before {
            box-shadow: 0 0 0 .2rem @color-checkbox-focus-shadow;
        }

        &:focus:not(:checked) ~ .custom-control-label::before {
            border-color: @color-checkbox-focus;
        }

        &:checked ~ .custom-control-label::before {
            border-color: @color-checkbox;
            background-color: @color-checkbox;
        }

        &:checked:disabled ~ .custom-control-label::before {
            border-color: @color-checkbox-checked-disabled;
            background-color: @color-checkbox-checked-disabled;
        }
    }

    // Make switches bigger, we use smaller font than Bootstrap's default

    .custom-control-label {
        padding-left: 2.5rem;
        min-height: 2rem;
        line-height: 2;
        display: inline-block;

        html.touch & {
            padding-left: 3rem;
        }

        &:before,
        &:after {
            border-radius: .6rem;
            margin: floor(.15 * @page-font-size) 0;

            html.touch & {
                border-radius: .8rem;
                margin: 0;
            }
        }

        &:before {
            left: 2px;
            top: 4px;
            width: floor(1.9 * @page-font-size);
            height: floor(1.2 * @page-font-size);

            html.touch & {
                top: floor(.2 * @page-font-size);
                width: floor(2.5 * @page-font-size);
                height: floor(1.6 * @page-font-size);
            }
        }

        &:after {
            left: 4px;
            top: 6px;
            width: floor(1.2 * @page-font-size) - 4;
            height: floor(1.2 * @page-font-size) - 4;

            html.touch & {
                top: floor(.2 * @page-font-size) + 2;
                height: floor(1.6 * @page-font-size) - 4;
                width: floor(1.6 * @page-font-size) - 4;
            }
        }
    }

    .custom-control-input:checked ~ .custom-control-label::after {
        transform: translateX(floor(1.2 * @page-font-size) - 6);

        html.touch & {
            transform: translateX(floor(1.6 * @page-font-size) - 9);
        }
    }

    .custom-control-input:not(:disabled) ~ .custom-control-label {
        &:after, &:before {
            cursor: pointer;
        }
    }
}

.custom-file {
    display: block;

    .custom-file-label {
        white-space: nowrap;
        .overflow-ellipsis();
        padding-right: 100px;
    }

    & + .hint {
        margin-top: floor(.25 * @page-font-size);
    }
}

.custom-file-input:focus ~ .custom-file-label {
    border-color: @color-input-border-focus;
    box-shadow: 0 0 0 .2rem @color-input-border-focus-shadow;
}
