/*
 * 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 '../../../../variables';

$default-chart-color: $druid-brand;

.continuous-chart-render {
  position: relative;
  overflow: hidden;
  height: 100%;

  svg.main-chart {
    position: absolute;

    text {
      user-select: none;
    }

    .selection {
      fill: white;
      fill-opacity: 0.1;

      &.finalized {
        fill-opacity: 0.15;
      }
    }

    .selected-bar {
      fill: none;
      stroke: #ffffff;
      stroke-width: 1px;
      opacity: 0.8;

      &.finalized {
        opacity: 1;
      }
    }

    .shifter {
      fill: white;
      fill-opacity: 0.2;
      filter: blur(1px);
    }

    .time-shift-indicator {
      fill: white;
      fill-opacity: 0.001;
      cursor: grab;

      &:hover {
        fill-opacity: 0.1;
      }

      &.shifting {
        fill-opacity: 0.2;
        cursor: grabbing;
      }
    }

    .h-gridline {
      line {
        stroke: $white;
        stroke-dasharray: 5, 5;
        opacity: 0.5;
      }
    }

    .now-line {
      stroke: $orange4;
      stroke-dasharray: 2, 2;
      opacity: 0.7;
    }

    .mark-bar {
      fill: #00b6c3;
    }

    .mark-line {
      stroke-width: 1.5px;
      stroke: $default-chart-color;
      fill: none;
    }

    .mark-area {
      fill: $default-chart-color;
      opacity: 0.5;
    }

    .single-point {
      stroke: $default-chart-color;
      opacity: 0.7;
      stroke-width: 1.5px;
    }

    .selected-point {
      fill: $default-chart-color;
    }
  }

  .zoom-out-button {
    position: absolute;
    top: 5px;
    right: 5px;
  }

  .empty-placeholder {
    @include pin-full;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 20px;
    user-select: none;
    pointer-events: none;
  }
}

.continuous-chart-bubble {
  .button-bar {
    padding-top: 5px;
    display: flex;
    gap: 5px;
  }
}
