Gapminder/vizabi

View on GitHub
src/components/timeslider/_timeslider.scss

Summary

Maintainability
Test Coverage
$vzb-ts-btn-area: 40px;
$vzb-ts-btn-width: 40px;
$vzb-ts-btn-bg: $vzb-color-primary;
$vzb-ts-btn-bg-active: #2f7687;
$vzb-ts-slider-color: $vzb-color-primary;
$vzb-ts-value-width: 40px;
.vzb-timeslider {
  min-height: $vzb-ts-btn-area;
  position: relative;

  &.vzb-ts-disabled {
    opacity: 0.4;
    pointer-events: none;
    .vzb-ts-slider-slide {
      .background {
        pointer-events: none;
      }
    }
    .vzb-ts-slider-handle {
      visibility: hidden;
      pointer-events: none;
    }
  }

  .vzb-ts-btns {
    @include position(absolute, 0 null 0 0);
    margin-left: 5px;
    width: $vzb-ts-btn-area;
    pointer-events: none;
    .vzb-ts-btn {
      @include border-radius(40px);
      font-size: $vzb-font-size-regular;
      width: $vzb-ts-btn-width;
      height: $vzb-ts-btn-width;
      background: $vzb-color-white;
      display: block;
      border: 0;
      padding: 0;
      margin: 5px;
      cursor: pointer;
      pointer-events: auto;

      .vzb-icon {
        width: $vzb-ts-btn-width;
        height: $vzb-ts-btn-width;
        path {
          fill: $vzb-ts-btn-bg;
        }
      }
      &.vzb-ts-btn-loading {
        background: $vzb-ts-btn-bg;
      }
      &.vzb-ts-btn-pause {
        display: none;
      }
      &:active,
      &:focus {
        outline: none;
        path {
          fill: $vzb-ts-btn-bg;
        }
      }
    }
  }
  .vzb-ts-slider-wrapper {
    @include position(absolute, 0 9px 0 0);
    // margin: 17px 7px;
    // Slider
    .vzb-ts-slider {
      @include position(absolute, 0);
      font-size: $vzb-font-size-small;
      overflow: visible;
      color: $vzb-ts-slider-color;
      width: 100%;
      height: 100%;
      .background {
        cursor: pointer !important;
      }
      .vzb-ts-slider-axis {
        @include opacity(0.6);
        user-select: none;
        fill: $vzb-ts-slider-color;
        font-weight: bold;
        cursor: pointer;

        .vzb-axis-line {
          @include opacity(1);
          fill: none;
          stroke: $vzb-ts-slider-color;
          stroke-opacity: 0.1;
          stroke-width: 5px;
          stroke-linecap: round;
        }

        .tick {
          pointer-events: none;
          font-weight: normal;
          color: $vzb-ts-slider-color;
          opacity: 0.35;
          text {
            fill: currentColor;
            font-size: 0.9em;
          }
        }
      }
      .vzb-ts-slider-progress {
        @include opacity(0.6);
        user-select: none;
        fill: $vzb-ts-slider-color;
        font-weight: bold;
        cursor: pointer;

        .domain {
          @include opacity(1);
          fill: none;
          stroke: $vzb-ts-slider-color;
          stroke-opacity: 0.2;
          stroke-width: 5px;
        }
        .rounded {
          stroke-linecap: round;
        }
      }

      .vzb-ts-slider-select {
        @include opacity(0.8);
        user-select: none;
        cursor: default;
        .selected-start,
        .selected-end {
          @include opacity(1);
          fill: none;
          stroke: $vzb-ts-slider-color;
          stroke-opacity: 0.8;
          stroke-width: 5px;
          stroke-linecap: round;
        }
      }
      .vzb-ts-slider-slide {
        pointer-events: stroke;
        stroke: #fff;
        stroke-opacity: 0;
        stroke-linecap: round;
        cursor: pointer;
      }
      .vzb-ts-slider-handle {
        fill: $vzb-ts-btn-bg;
        stroke: #fff;
        stroke-width: 4px;
      }
      .vzb-ts-slider-forecastboundary {
        @include opacity(0.2);
        stroke: $vzb-ts-slider-color;
        stroke-width: 3px;
        cursor: pointer;
        &:hover {
          stroke-width: 7px;
        }
      }
      .vzb-ts-slider-value {
        user-select: none;
        display: none;
        fill: $vzb-ts-btn-bg;
        font-weight: bold;
        &.stroke {
          @include stroke(5px);
        }
      }
    }
  }
  //show pause instead if it's playing
  &.vzb-playing {
    &.vzb-ts-show-value-when-drag-play {
      .vzb-ts-slider-value {
        display: block !important;
      }
    }
    .vzb-ts-btns {
      .vzb-ts-btn-play {
        @extend .vzb-hidden;
      }
      .vzb-ts-btn-pause {
        display: block;
      }
      &:hover .vzb-ts-btn-pause-tooltip {
        @include opacity(1);
      }
      &:hover .vzb-ts-btn-play-tooltip {
        @include opacity(0);
      }
    }
  }
  .vzb-ts-btn-loading {
    position: relative;
    display: none !important;
    .vzb-loader {
      @extend %vzb-loader;
      @include size(38px);
      border-color: rgba($vzb-color-white, 0);
      border-top-color: rgba($vzb-color-white, 1);
      margin-top: -1 * 38px/2;
      margin-left: -1 * 38px/2;
    }
  }
  &.vzb-ts-loading {
    @include opacity(0.3);
    .vzb-ts-btn-play,
    .vzb-ts-btn-pause {
      @extend .vzb-hidden;
    }
    .vzb-ts-btn-loading {
      display: block !important;
    }
  }
  &.vzb-ts-hide-play-button {
    .vzb-ts-btns {
      @extend .vzb-hidden;
    }
    .vzb-ts-slider-wrapper {
      @include position(absolute, 5px 9px 5px 5px);
    }
  }
  &.vzb-ts-show-value {
    .vzb-ts-slider-value {
      display: block !important;
    }
  }
  &.vzb-ts-dragging.vzb-ts-show-value-when-drag-play {
    .vzb-ts-slider-value {
      display: block !important;
    }
  }
}

&.vzb-small {
  .vzb-timeslider {
    .vzb-ts-btns {

      .vzb-ts-btn {
        width: $vzb-ts-btn-width - 5;
        height: $vzb-ts-btn-width - 5;
        margin: 0;

        .vzb-icon {
          width: $vzb-ts-btn-width - 5;
          height: $vzb-ts-btn-width - 5;
        }
      }
    }

    .vzb-ts-btn-loading {
      .vzb-loader {
        @include size(33px);
        margin-top: -1 * 33px/2;
        margin-left: -1 * 33px/2;
      }
    }
  
    &.vzb-ts-axis-aligned {
      .vzb-ts-btns {
        @include position(absolute, 0 0 5px 5px);
        width: $vzb-ts-btn-area - 20;
        min-height: $vzb-ts-btn-area - 20;

        .vzb-ts-btn {
          width: $vzb-ts-btn-width - 14;
          height: $vzb-ts-btn-width - 14;
          margin: 0;

          .vzb-icon {
            width: $vzb-ts-btn-width - 14;
            height: $vzb-ts-btn-width - 14;
          }
          &.vzb-ts-btn-play {
            padding: 0;
          }
          &.vzb-ts-btn-pause {
            padding: 0;
          }
        }
      }
      .vzb-ts-slider-wrapper {
        $pos-left: $vzb-ts-btn-area - 20 + 10;
        @include position(absolute, 0 0 5px $pos-left);
      }
    }
  }
}

&.vzb-medium {
  .vzb-timeslider {
    min-height: $vzb-ts-btn-area;
    .vzb-ts-slider {
      margin-left: 5px;
    }
    .vzb-ts-slider-wrapper {
      margin-right: 5px;
      .vzb-ts-slider-axis .vzb-axis-line {
        stroke-width: 7px;
      }
      .vzb-ts-slider-handle {
        stroke-width: 5px;
      }
    }
    .vzb-ts-btns {
      @include position(absolute, -10px null 0 0);
      .vzb-ts-btn {
        margin-left: auto;
        margin-right: 15px;
      }
    }
    &.vzb-ts-axis-aligned {
      .vzb-ts-btns {
        @include position(absolute, 0 0 5px 5px);
      }
    }
  }
}

&.vzb-large {
  .vzb-timeslider {
    min-height: $vzb-ts-btn-area + 10;
    .vzb-ts-slider-wrapper {
      margin-right: 5px;
      .vzb-ts-slider {
        margin-left: 5px;
        font-size: $vzb-font-size-regular;
      }
      .vzb-ts-slider-axis .vzb-axis-line {
        stroke-width: 9px;
      }
      .vzb-ts-slider-progress .domain {
        stroke-width: 9px;
      }
      .vzb-ts-slider-select {
        .selected-start,
        .selected-end {
          stroke-width: 9px;
        }
      }
      .vzb-ts-slider-handle {
        stroke-width: 6px;
      }
    }
    .vzb-ts-btns {
      @include position(absolute, -15px 0 0 0);
      width: $vzb-ts-btn-width + 20;
      height: $vzb-ts-btn-width + 20;
      .vzb-ts-btn {
        width: $vzb-ts-btn-width + 20;
        height: $vzb-ts-btn-width + 20;
        margin: 0 15px 0 auto;

        .vzb-icon {
          width: $vzb-ts-btn-width + 20;
          height: $vzb-ts-btn-width + 20;
        }
      }
    }
    &.vzb-ts-axis-aligned {
      .vzb-ts-btns {
        @include position(absolute, 0 0 5px 5px);
      }
      .vzb-ts-slider-wrapper {
        $pos-left: $vzb-ts-btn-area + 10;
        @include position(absolute, 0 0 5px 0);
      }
    }
  }
}