/*
 * 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.
 */
stream {
  display: block;
  position: relative;
  @warning-log-color: @brand-warning;
  @error-log-color: @brand-danger;
  @debug-log-color: @brand-info;
  @trace-log-color: @gray-lighter;

  pre {
    min-height: 4em;
    background: @gray;
    color:  @gray-lighter;
    .monospace();
    padding: 0.8em 0.8em 1.2em;

    .log-section {
      all: revert;
      margin: 0;
      .monospace();
      &.log-warning {
        color: @warning-log-color;
      }
      &.log-error {
        color: @error-log-color;
      }
      &.log-debug {
        color: @debug-log-color;
      }
      &.log-trace {
        color: @trace-log-color;
      }
    }
  }

  .log-actions {
    position: absolute;
    top: 0;
    right: 0;
    padding: 0.75em 1em 1em;
  }

  .log-action {
    @base-color: lighten(@brand-primary, 20%);
    font-size: 1.4em;
    cursor: pointer;
    margin-left: 0.5em;
    .fa {
      color: desaturate(@base-color, 40%);
      transition: 0.3s color ease;
    }
    &:hover .fa  {
      color: lighten(desaturate(@base-color, 40%), 10%);
    }
    &.active {
      .fa {
        color: @base-color;
      }
      .fa-exclamation-triangle {
        color: @error-log-color;
      }
      .fa-bolt {
        color: @warning-log-color;
      }
      .fa-bug {
        color: @debug-log-color;
      }
      .fa-bullhorn {
        color: @trace-log-color;
      }
      .fa-question {
        color: @trace-log-color;
      }
    }
    &.active:hover {
      .fa {
        color: desaturate(@base-color, 20%);
      }
      .fa-exclamation-triangle {
        color: desaturate(@error-log-color, 20%);
      }
      .fa-bolt {
        color: desaturate(@warning-log-color, 20%);
      }
      .fa-bug {
        color: desaturate(@debug-log-color, 20%);
      }
      .fa-bullhorn {
        color: desaturate(@trace-log-color, 20%);
      }
      .fa-question {
        color: desaturate(@trace-log-color, 20%);
      }
    }
  }
  
  .fa-arrow-circle-o-down {
    margin-top: 1px;
  }
}

