/*
 * 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%;
}

h2 {
  font-size: 180%;
}

h3 {
  font-size: 160%;
}

h4 {
  font-size: 140%;
}

h5 {
  font-size: 120%;
}

.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: 2em;
  height: 2em;
  border: 2px 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;
}
