Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/frontend/vue/components/MiniComposer/Circuit.vue
3376 views
<template>
  <div class="circuit">
    <QubitLine
      v-for="(qubitLine, index) in circuitState"
      :key="index"
      :circuit-state="qubitLine"
      :auto-measure-gate="autoMeasureGate"
      :max-gates="maxGates"
      @onGatesChanged="OnGatesChanged"
    />
    <button
      v-if="circuitState.length < maxLines"
      class="circuit__add-button"
      @click="addLine()"
    >
      <svg width="16" height="16" viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg">
        <path d="M5.5 4.5V0.5H4.5V4.5H0.5V5.5H4.5V9.5H5.5V5.5H9.5V4.5H5.5Z" />
      </svg>
    </button>
  </div>
</template>

<script lang="ts">
import { Options, Vue, prop } from 'vue-class-component'
import QubitLine from './QubitLine.vue'
import { ComposerGate } from './composerTypes'
import { GateName } from './gateUtils'

class Props {
  name = prop<String>({ default: GateName.H, required: true })
  circuitState = prop<ComposerGate[][]>({ default: [[]], required: true })
  autoMeasureGate = prop<boolean>({ default: true, required: true })
  maxLines = prop<Number>({ default: 1, required: true })
  maxGates = prop<Number>({ default: -1, required: true })
}

@Options({
  components: {
    QubitLine
  }
})
export default class Circuit extends Vue.with(Props) {
  OnGatesChanged () {
    this.$emit('onCircuitChanged')
  }

  addLine () {
    this.circuitState.push([])
    this.$emit('onCircuitChanged')
  }
}
</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';

.circuit {
  padding: $spacing-02 0;

  &__add-button {
    cursor: pointer;
    padding: $spacing-02;
    fill: $text-color-dark;
    background-color: transparent;
    transition: ease-in .2s;

    &:hover {
      fill: $text-active-color;
      background-color: $background-color-light;
    }
  }
}
</style>