Path: blob/main/frontend/vue/components/CodeMirrorClipboardCopy/CodeMirrorClipboardCopy.vue
3375 views
<template> <clipboard-copy :value="text" class="code-mirror-clipboard-copy" :aria-label="$translate(label)" @clipboard-copy="handleClick" > <CopyIcon class="code-mirror-clipboard-copy__icon" /> <div class="code-mirror-clipboard-copy__tooltip"> {{ $translate(label) }} </div> </clipboard-copy> </template> <script lang="ts"> import { Options, prop, Vue } from 'vue-class-component' import CopyIcon from '@carbon/icons-vue/lib/copy/20' import '@github/clipboard-copy-element' class Props { text = prop({ type: String, required: true }) } const LABEL = { COPIED: 'Copied!', COPY: 'Copy' } @Options({ components: { CopyIcon } }) export default class CodeMirrorClipboardCopy extends Vue.with(Props) { label = LABEL.COPY labelTimeout = null as unknown as NodeJS.Timeout handleClick () { this.label = LABEL.COPIED clearTimeout(this.labelTimeout) this.labelTimeout = null as unknown as NodeJS.Timeout this.labelTimeout = setTimeout(() => { this.label = LABEL.COPY }, 3000) } } </script> <style lang="scss" scoped> @import 'carbon-components/scss/globals/scss/spacing'; @import '~/../scss/variables/colors.scss'; .code-mirror-clipboard-copy { align-items: center; display: flex; font-size: 0.875rem; position: relative; &__tooltip { box-shadow: 0 2px 6px var(--cds-shadow, rgba($block-color-secondary, 0.3)); position: absolute; left: 50%; top: 0; z-index: 6000; transform: translate(-50%, -100%) translate(0, -#{$spacing-04}); display: none; padding: 0 $spacing-04; background: $background-color-dark; border-radius: $spacing-01; color: $text-color-white; overflow-wrap: break-word; &::after { position: absolute; bottom: calc(-0.429688rem + 1px); right: 0px; left: 0px; width: 0px; height: 0px; border-right: 0.429688rem solid transparent; border-top: 0.429688rem solid var(--cds-inverse-02, $background-color-dark); border-left: 0.429688rem solid transparent; margin: 0px auto; content: ""; } } &:hover #{&}__tooltip { display: block; } &__icon { color: $text-color-light; } &:focus #{&}__icon , &:hover #{&}__icon { color: $active-color; } } </style>