// 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.

.container {
  display: flex;
  justify-content: space-evenly;
  padding-top: 50px;
  min-height: 100vh;
  overflow: hidden;

  @media only screen and (max-width: 850px) {
    justify-content: flex-start;
    padding: 50px 30px;
  }
}

.main {
  // padding: 4rem 4rem 4rem calc(250px + 4rem);
  padding: 4rem;
  margin-left: calc(250px);
  flex: 1;
  display: flex;
  max-width: calc(100vw + -250px);
  flex-direction: column;
  justify-content: flex-start;
  align-items: center;

  @media only screen and (max-width: 850px) {
    margin-left: 0;
    max-width: 100vw;
    padding: 0rem;
  }
}

.description {
  display: block;
  margin-bottom: 1.6rem;
  max-width: 600px;
}

.page-description {
  margin: 0 0 1.6rem 0;
  padding: 0;
  font-style: normal;
  font-weight: normal;
  font-size: 15px;
  line-height: 100%;
  font-feature-settings: 'pnum'on, 'lnum'on;
  color: #606060;

  &.mb-0 {
    margin-bottom: 0;
  }
}

.logo {
  max-width: 60px;
  margin-bottom: 0.5rem;
}

.code {
  margin-right: 0.2rem;
}

.tagInput {
  position: relative;
  padding-right: 2rem;
}

.input,
.helperInput {
  // margin-left: 0.75rem;
}

.input input,
.helperInput input {
  margin-top: 0 !important;
}

.input,
.helperInput,
.form {
  width: 100%;
}

.helperInput {
  margin-top: -10px;
  width: calc(100% - 12px) !important;
}

.requiredStar {
  color: #F83E3E;
  font-weight: 600;
  font-size: 1.2rem;
  margin-left: 0.25rem;
}

.codeArea {
  width: 100%;
  max-width: 600px;
  height: 384px;
  min-height: 384px;
  font-family: "JetBrains Mono", monospace;
  font-size: 13px;
  border: 0;
  outline: none !important;
  box-shadow: none;
  background-color: #f9f9f9;
}

.formSection {
  margin-top: 10px;
  width: 100%;
  max-width: 600px;
}

.helpIcon {
  margin-left: 0.5rem;
  position: relative;
  top: -0.4rem;
}

.formGroup,
.statusMappingsFilterFormGroup {
  width: 100%;
  max-width: 600px;
}

.formGroup div,
.statusMappingsFilterFormGroup div {
  // color: #717484 !important;
}

.formGroup label,
.statusMappingsFilterFormGroup label {
  // color: #4B4D58;
  display: flex;
  align-items: center;
  margin-right: 0 !important;
}

.button {
  margin-left: 1rem;
}

.formContainer,
.jiraFormContainer {
  display: flex;
  width: 100%;
  align-items: center;
  margin-bottom: 0.4rem;
}

.jiraFormContainer {
  height: auto;
  flex-wrap: wrap;
  flex-direction: column;
  align-content: flex-start;
}

.jiraFormContainerItem {
  width: 100%;
}

.statusMappingsFilterFormGroup {
  align-self: flex-start;
}

.mappingTagStatus {
  box-sizing: border-box;
}

.headlineContainer {
  width: 100%;
}

.headlineContainer h1 {
  margin: 0 0 0.5rem;
}

.headline {
  margin-top: 1.5rem;
  margin-bottom: 0.25rem;
  color: #3d3d3d;

  .bp3-icon {
    margin-bottom: 3px;
  }
}

.saveBtn {
  margin: 2rem auto 0 0;
  display: block;
  background-color: #717484 !important;
  color: #fff !important;
}

.saveBtn:hover {
  opacity: 0.9;
}

.pluginSpinner {
  display: inline-block;
  margin-right: 0.25rem;
  margin-top: -0.25rem;
}

.pluginSpinnerWrap {
  margin-top: 0.5rem;
}

.statusTabs {
  width: 100%;
}

.addNewStatusBtn {
  align-self: flex-start;
}

.addNewStatusBtn,
.addNewStatusBtnDialog {
  border-radius: 3px;
  border: 1px solid rgba(0, 0, 0, 0.15);
  padding: 0.5rem 0.5rem;
  outline: 0;
  display: inline-block;
  margin-bottom: 0.75rem;
}

.addNewStatusBtnDialog {
  margin-top: 1rem;
  text-align: center;
  width: 100%;
}

.customStatusFormGroup {
  margin-bottom: -0.5rem;
  padding: 2rem 3rem;
}

.customStatusDialog {
  background-color: #F4F4F6;
  width: 100%;
  max-width: 664px;
  height: auto;
}

h1 {
  font-style: normal;
  font-weight: 500;
  font-size: 24px;
  text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.25);
}

h3 {
  &.group-header {
    margin: 2.5em 0 3px 0;
    padding: 0;
    font-style: normal;
    font-weight: 900;
    font-size: 14px;
    line-height: 100%;
    font-feature-settings: 'pnum'on, 'lnum'on;
    color: #333333;
    text-transform: uppercase;
  }
}

.group-caption {
  // font-family: 'Montserrat', sans-serif;
  // font-size: 13px;
  font-style: normal;
  font-weight: normal;
  line-height: 110%;
  font-feature-settings: 'pnum'on, 'lnum'on;
  color: #717484;
  padding-left: 26px;
}

.badge-count {
  width: 20px;
  height: 20px;
  display: inline-block;
  border-radius: 50%;
  background-color: rgba(0, 0, 255, 0.9);
  color: #ffffff;
  line-height: 20px;
  text-align: center;
  margin-left: 5px;
  font-weight: 300;
  font-size: 10px;
  opacity: 1.0;
  float: right;
  margin-top: -3px;
  transform: scale(0.85);
}

textarea, textarea.bp3-input {
  // box-shadow: 0 0 0 0 rgba(232, 71, 28, 0), 0 0 0 0 rgba(232, 71, 28, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2)
}