/*
 * 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.
 */
@import "fonts";
@import "overrides";
@import "../../../../node_modules/bulma/bulma.sass";

@media screen and (min-width: $tablet) {
  html {
    overflow: hidden;
  }
}

body.cms {
  min-height: 100vh;
  @media screen and (min-width: $tablet), print {
    background: url("../img/gradient.jpg") no-repeat;
    background-attachment: fixed;
    display: flex;
  }
}

.gradient {
  @media screen and (min-width: $tablet), print {
    height: 100vh;
    width: 16px;
  }
}

.card-footer-group {
  display: flex !important;
  flex-direction: column;
}

.card-footer-group small {
  font-size: 0.75em;
}

dl {
  padding: 1em 0;
}

dd {
  padding-left: 1em;
}

dt {
  font-weight: bold;
}

fieldset {
  min-inline-size: auto;
}


h1 {
  font-size: 200%;
  margin-bottom: 1em;
}

h2 {
  font-size: 180%;
  margin-bottom: .8em;
}

h3 {
  font-size: 160%;
  margin-bottom: .6em;
}

h4 {
  font-size: 140%;
  margin-bottom: .4em;
}

h5 {
  font-size: 120%;
  margin-bottom: .2em;
}

.breadcrumb {
  display: flex;
  justify-content: space-between;
}

.card.is-selected {
  border: 1px solid $selected;
}

.card-footer-item {
  word-break: break-all;
  display: block;
  padding: 0.25em;
  text-align: center;
}

.card-image {
  background-color: $gray-light;
}

small.card-footer-item {
  font-size: 12px;
}

.container {
  height: 100vh;
  overflow: hidden;
  @media screen and (max-width: $tablet - 1px) {
    height: 100%;
    overflow: visible;
  }
}

.contentnav-search {
  display: flex;
  margin-block-end: 0;
}

.has-padding-1 {
  padding: 0.5em;
}

.editor-page {
  overflow-y: auto;
}

.file-icon {
  font-size: xx-large;
}

.file-label {
  text-align: center;
}

.form-wrapper {
  border: none;
  min-height: 100px;
}

.form-wrapper[disabled] .button,
.form-wrapper[disabled] .input,
.form-wrapper[disabled] .textarea,
.form-wrapper[disabled] select {
  background-color: #f5f5f5;
  border-color: #f5f5f5;
  box-shadow: none;
  color: #7a7a7a;
  cursor: not-allowed;
}

.is-full-height {
  @media screen and (min-width: $tablet), print {
    height: calc(100vh - 65px);
  }
}

.is-linked {
  cursor: pointer;
  border: 1px solid rgba(0, 0, 0, 0);
}

.is-draggable {
  position: relative;
}

.is-selected .is-linked {
  border: 1px solid $primary;
}

.is-vhidden {
  position: absolute !important;
  top: -9999px !important;
  left: -9999px !important;
}

.loader {
  margin: auto;
  width: 5em;
  height: 5em;
  border: .2em solid $primary;
  border-right-color: transparent;
  border-top-color: transparent;
}

.Main-Content {
  padding: 12px 0;
}

.Main-Content .level-left {
  overflow-x: auto;
  overflow-y: hidden;
}

.main-section {
  flex-grow: 1;
  @media screen and (min-width: $tablet), print {
    width: calc(1vw - 16px);
  }
}

.main-section .columns {
  padding: 0 16px;
}

.menu {
  overflow: auto;
}

.menu-label {
  text-transform: none;
  font-size: 1.25em;
  letter-spacing: normal;
  display: block;
  padding: 0.25em 0;
  color: #363636;
}

.menu-label:not(:last-child) {
  margin: 0;
}

.navbar {
  border-bottom: 0.5px solid hsl(0, 0%, 86%);
}

nav .level-left,
nav .level-right {
  flex-shrink: inherit;
}

.note-group-select-from-files {
  display: none;
}

.note-toolbar-wrapper {
  height: auto !important;
}

.fixed-box {
  max-height: 200px;
  overflow: auto;
}

.preview {
  max-width: 100%;
  padding: 1em;
}

.rte-form {
  margin: 0.5em 0;
}

.rte-form .buttons {
  margin: 0.5em 0;
}

.rte-toolbar .jam:before {
  font-size: x-large;
}

.rte-toolbar .level {
  margin-bottom: 0.5em;
}

.scroll-container {
  overflow-y: auto;
  height: calc(100vh - 205px);
  overflow-x: hidden;
  padding: 2px;
  @media screen and (max-width: $tablet - 1px) {
    height: 100%;
    overflow: visible;
    padding: 0;
  }
}

.scroll-container .scroll-container {
  height: auto;
  overflow: visible;
  padding: 0;
}

.scroll-container > .is-ancestor {
  flex-wrap: wrap;
}

#search-results .box {
  overflow: hidden;
}

#search-results .tile {
  flex-wrap: wrap;
  padding: 0.5em;
}

.sling-cms-include-config {
  min-height: 200px;
}

.sidebar {
  @media screen and (min-width: $tablet) {
    border-right: 0.5px solid hsl(0, 0%, 86%);
  }
}

.table__wrapper {
  overflow: auto;
}

table thead .sorting:after,
table thead .sorting_asc:after,
table thead .sorting_asc_disabled:after,
table thead .sorting_desc:after,
table thead .sorting_desc_disabled:after {
  font-family: "jam-icons";
}

table thead .sorting:after {
  content: "\e943";
}

table thead .sorting_asc:after {
  content: "\e93f";
}

table thead .sorting_desc:after {
  content: "\e92a";
}

.menu .is-selected,
.table tr.is-selected {
  background-color: lighten($gray, 50%);
  color: $grey-darker;
}

.wysihtml-sandbox {
  width: 100% !important;
  max-height: 600px !important;
  min-height: 300px !important;
}
