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

body[fds] .expansion-panel-filter-toggle-group {
  box-shadow: none !important;
}

body[fds] .expansion-panel-filter-toggle-group .mat-button-toggle {
  height: 75px;
  width: 125px;
  border: 1px solid $grey4;
}

body[fds] .expansion-panel-filter-toggle-group .mat-button-toggle-label-content {
  height: 100%;
  width: 100%;
  padding: 0;
  line-height: 63px;
  text-align: center;
}

body[fds] .expansion-panel-filter-toggle-group .mat-button-toggle-checked {
  background-color: $blue-grey1;
  color: white;
}

body[fds] .expansion-panel-filter-toggle-group .mat-button-toggle-checked .md-display-1 {
  color: white;
}

body[fds] .expansion-panel-filter-toggle-group .md-display-1 {
  color: $blue-grey1;
}

body[fds] .expansion-panel-filter-toggle-group div {
  line-height: normal;
}

body[fds] .tab-toggle-group {
  box-shadow: none !important;
}

body[fds] .tab-toggle-group .mat-button-toggle-label-content {
  border-bottom: 2px solid $grey5;
}

body[fds] .tab-toggle-group .mat-button-toggle-checked {
  background: transparent;
}

body[fds] .tab-toggle-group .mat-button-toggle-checked .mat-button-toggle-label-content {
  border-bottom: 2px solid $blue-grey1;
  background: transparent;
}

body[fds] .on-off-toggle-group {
  box-shadow: none !important;
}

body[fds] .on-off-toggle-group .mat-button-toggle {
  height: 20px;
  width: 35px;
  border: 1px solid $grey4;
}

body[fds] .on-off-toggle-group .mat-button-toggle-label-content {
  height: 100%;
  width: 100%;
  padding: 0;
  line-height: 20px;
  text-align: center;
}

body[fds] .on-off-toggle-group .mat-button-toggle-checked {
  background-color: $blue-grey1;
  color: white;
  border: 1px solid $blue-grey1;
}

body[fds] .off-toggle.mat-button-toggle-checked {
  background-color: $grey4;
  color: $grey1;
  border: 1px solid $grey4;
}
