/*
 * 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 (reference) "~bootstrap/less/bootstrap";

@bottom-sheet-bg-color: white;

.bottom-sheet-backdrop {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 500;
  background-color: @modal-backdrop-bg;
  opacity: @modal-backdrop-opacity;
  transition: opacity 0.3s ease-out;

  &.fade.ng-enter,
  &.fade.ng-leave.ng-leave-active {
    opacity: 0;
  }
  &.fade.ng-enter.ng-enter-active,
  &.fade.ng-leave {
    opacity: @modal-backdrop-opacity;
  }
}

.bottom-sheet-container {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  z-index: 501;
  opacity: 1;
  outline: 0;
  transition: opacity 0.3s ease-out, transform 0.3s ease-out;

  .bottom-sheet {
    width: auto;
    max-height: calc(~"100vh - @{navbar-height}");
    margin: 0 auto;
    background: @bottom-sheet-bg-color;
    overflow: scroll;
    z-index: @zindex-modal;
    position: relative;
    box-shadow: 0px 1px rgba(0, 0, 0, 0.2), 0px 1px 18px 1px rgba(0, 0, 0, 0.11);

    @media (min-width: @screen-sm-min) {
      max-width: @container-sm;
    }

    @media (min-width: @screen-md-min) {
      max-width: @container-md
    }

    @media (min-width: @screen-lg-min) {
      max-width: @container-lg
    }
  }

  &.slide-up.ng-enter,
  &.slide-up.ng-leave.ng-leave-active {
    .translate(0, 25%);
  }
  &.slide-up.ng-enter.ng-enter-active,
  &.fade.ng-leave {
    .translate(0, 0);
  }
  &.fade.ng-enter,
  &.fade.ng-leave.ng-leave-active {
    opacity: 0;
  }
  &.fade.ng-enter.ng-enter-active,
  &.fade.ng-leave {
    opacity: 1;
  }
}
