Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/frontend/vue/components/MiniComposer/ProbablityChart.vue
3376 views
<template>
  <div
    class="probability-chart"
    :class="{ 'probability-chart_dense': isDense() }"
  >
    <div class="probability-chart__probability-axes">
      <span class="probability-chart__probability-axes__label">probabilities</span>
      <span class="probability-chart__probability-axes__value probability-chart__probability-axes__value_1">1</span>
      <span class="probability-chart__probability-axes__value probability-chart__probability-axes__value_05">0.5</span>
      <span class="probability-chart__probability-axes__value probability-chart__probability-axes__value_0">0</span>
    </div>
    <div class="probability-chart__key-axes">
      <div
        v-for="(item, index) in probabilities"
        :key="index"
        class="probability-chart__key-axes__key"
      >
        {{ item.key }}
      </div>
    </div>
    <div class="probability-chart__bars-area">
      <div class="probability-chart__bars-area__mark-05" />
      <div class="probability-chart__bars-area__mark-1" />
      <div class="probability-chart__bars-area__bars">
        <div
          v-for="(item, index) in probabilities"
          :key="index"
          class="probability-chart__bars-area__bars__element"
          :style="`--value: ${item.value}`"
        />
      </div>
    </div>
  </div>
</template>

<script lang="ts">
import { Vue, prop } from 'vue-class-component'
import { ProbabilityState } from './composerTypes'

class Props {
  probabilities = prop<ProbabilityState[]>({
    default: [
      { key: '0', value: 1 },
      { key: '1', value: 0 }
    ],
    required: true
  });
}

export default class MiniComposer extends Vue.with(Props) {
  isDense () {
    return this.probabilities.length > 4
  }
}
</script>
<style scoped lang="scss">
@import 'carbon-components/scss/globals/scss/typography';
@import 'carbon-components/scss/globals/scss/layout';
@import '../../../scss/variables/colors.scss';
@import '~/../scss/variables/mq.scss';

.probability-chart {
  display: grid;
  grid-template-columns: 60px 1fr;
  grid-template-rows: 1fr 30px;
  grid-template-areas:
    "prob-axes bars"
    "none key-axes";

  &__probability-axes {
    position: relative;
    grid-area: prob-axes;
    &__label {
      @include type-style('body-long-01');
      position: absolute;
      left: 0;
      top: 50%;
      transform:
        translate(-50%, -50%)
        translateX(15px)
        rotate(-90deg);
    }
    &__value {
      @include type-style('caption-01');
      position: absolute;
      right: 10px;

      &_1 {
        transform: translateY(-30%);
      }
      &_05 {
        top: 50%;
        transform: translateY(-50%);
      }
      &_0 {
        bottom: 0;
      }
    }
  }
  &__key-axes {
    grid-area: key-axes;
    width: 100%;

    display: flex;
    flex-flow: row;
    align-items: flex-end;

    &__key {
      @include type-style('caption-01');
      flex: 1;
      text-align: center;
    }
  }
  &__bars-area {
    position: relative;
    grid-area: bars;
    border: 1px solid $border-color-dark;
    border-width: 0 0 1px 1px;

    &__mark-05 {
      position: absolute;
      top: 50%;
      height: 0;
      width: 100%;
      border-top: 1px solid $border-color;
    }
    &__mark-1 {
      position: absolute;
      top: 0;
      height: 0;
      width: 100%;
      border-top: 1px solid $border-color;
    }
    &__bars {
      position: absolute;
      top: 0;
      left: 0;
      height: 100%;
      width: 100%;

      display: flex;
      flex-flow: row;
      align-items: flex-end;

      &__element {
        flex: 1;
        transition: height 0.2s ease-out;
        height: calc(var(--value, 0) * 100%);

        &::after {
          content: "";
          display: block;
          width: 60%;
          max-width: 40px;
          height: 100%;
          margin: 0 auto;
          background-color: $blue-70;
        }
      }
    }
  }
  &_dense &__key-axes__key {
    transform: rotate(-60deg);
  }
}
</style>