// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at

//     http://www.apache.org/licenses/LICENSE-2.0

// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.


/* texteditor */

.trumbowyg {
    border-radius: 4px !important;
    min-height: 106px !important;

    .trumbowyg-button-pane {
        background: none;
        border-bottom: none;
        position: absolute;
        bottom: 0px;

        button {
            transition: none;
        }
    }

    .trumbowyg-button-pane-hidden {
        display: none;
    }

    .trumbowyg-button-pane::after {
        background: none !important;
    }

    .trumbowyg-editor {
        min-height: 70px !important;
        overflow-wrap: break-word;
    }

    ul {
        list-style: disc !important;
    }

    .trumbowyg-textarea {
        min-height: 106px !important;
    }

    .trumbowyg-button-pane .trumbowyg-button-group::after {
        height: 25px;
        vertical-align: middle;
    }

    .trumbowyg-button-pane button.trumbowyg-active,
    .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,
    .trumbowyg-button-pane button:not(.trumbowyg-disable):hover {
        background-color: #e8e9ee;
        border-radius: 20px;
    }
}

.trumbowyg-modal-submit,
.trumbowyg-modal-reset {
    border: 1px #37bb9b solid !important;
    color: #37bb9b !important;
    border-radius: 4px !important;
    font-size: 14px !important;
    background-color: transparent !important;
}

.trumbowyg-modal-submit:hover,
.trumbowyg-modal-reset:hover {
    background-color: #37bb9b !important;
    color: #fff !important;
}

.trumbowyg-modal-box label .trumbowyg-input-infos span {
    color: #686868 !important;
}

.trumbowyg-viewHTML-button {
    width: 101px !important;
}

.trumbowyg-h1-dropdown-button {
    font-size: 36px !important;
}

.trumbowyg-h2-dropdown-button {
    font-size: 30px !important;
}

.trumbowyg-h3-dropdown-button {
    font-size: 24px !important;
}

.trumbowyg-h4-dropdown-button {
    font-size: 18px !important;
}

.small-texteditor {
    .trumbowyg-button-pane button {
        width: 25px !important;
        height: 25px !important;
    }
    .trumbowyg-button-pane button.trumbowyg-active,
    .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,
    .trumbowyg-button-pane button:not(.trumbowyg-disable):hover {
        background-color: #e8e9ee;
        border-radius: 20px;
    }
}