// 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: 150px !important;

    .trumbowyg-button-pane {
        background-color: #f6f7fb !important;
    }

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

    ul {
        list-style: disc !important;
    }

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

.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;
}