Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/frontend/vue/components/WhatIsQuantumVolume/SU4Gate.vue
3376 views
<template>
  <div class="su-4-gate" :style="`--gate-height: ${gateHeight()};`">
    <SketchLine class="su-4-gate__wire su-4-gate__wire_top" v-bind="lineConfig" />
    <SketchLine class="su-4-gate__wire su-4-gate__wire_bottom" v-bind="lineConfig" />
    <div class="su-4-gate__connector" />
    <div class="su-4-gate__square su-4-gate__square_top" />
    <div class="su-4-gate__square su-4-gate__square_bottom" />
    <span class="su-4-gate__label"> SU(4) </span>
  </div>
</template>

<script lang="ts">
import { Options, prop, Vue } from 'vue-class-component'
import { Line, Point } from '@mathigon/euclid'
import SketchLine from '../Sketch/SketchLine.vue'
import SketchSquare from '../Sketch/SketchSquare.vue'
import MarkerArea from '../Sketch/MarkerArea.vue'
import Ket0 from '../Sketch/Ket0.vue'

class Props {
  spaceBetween = prop<Number>({ default: 5 })
}

@Options({
  components: {
    SketchLine,
    MarkerArea,
    SketchSquare,
    Ket0
  }
})
export default class LayersCircuit extends Vue.with(Props) {
  uid = Math.random().toString().replace('.', '')
  lineConfig = {
    line: new Line(new Point(-10, 0), new Point(70, 0)),
    hardLineExtraLengthInterval: [0, 0],
    softLineExtraLengthInterval: [120, 120]
  }

  gateHeight () : number {
    return 60 + 85 * Math.abs(this.spaceBetween as number)
  }
}
</script>
<style scoped lang="scss">
@import 'carbon-components/scss/globals/scss/typography';

.su-4-gate {
  position: absolute;
  border: 1px dashed $black-100;
  width: 62px;
  height: calc(var(--gate-height) * 1px);
  background-color: rgba(255, 255, 255, 0.3);

  &__square {
    position: absolute;
    width: 44px;
    height: 44px;
    border: 1px solid $black-100;
    background-color: $white-0;
    left: 8px;

    &_top {
      top: 8px;
    }
    &_bottom {
      bottom: 8px;
    }
  }

  &__wire {
    position: absolute;

    &_top {
      top: 28px;
    }
    &_bottom {
      bottom: 28px;
    }
  }

  &__connector {
    position: absolute;
    top: 30px;
    bottom: 30px;
    left: 50%;
    border-left: 1px solid $black-100;
  }

  &__label {
    @include type-style('caption-01');
    position: absolute;
    top: 50%;
    right: 0;
    transform: translateY(-50%) rotate(-90deg);
  }
}
</style>