Toggle.vue 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. <template>
  2. <span
  3. class="relative outline-none cursor-pointer h-6 w-12 rounded-full"
  4. @click="toggle"
  5. role="checkbox"
  6. :aria-checked="value.toString()"
  7. tabindex="0"
  8. @keydown.space.prevent="toggle"
  9. >
  10. <span
  11. class="toggle-background inline-block rounded-full h-full w-full shadow-inner"
  12. :class="this.value ? 'bg-cyan-500' : 'bg-grey-300'"
  13. ></span>
  14. <span
  15. class="toggle-indicator absolute bg-white rounded-full shadow w-4 h-4"
  16. :style="indicatorStyles"
  17. ></span>
  18. </span>
  19. </template>
  20. <script>
  21. export default {
  22. props: ['value'],
  23. methods: {
  24. toggle() {
  25. this.$emit('input', !this.value)
  26. this.value ? this.$emit('off') : this.$emit('on')
  27. },
  28. },
  29. computed: {
  30. indicatorStyles() {
  31. return { transform: this.value ? 'translateX(1.5rem)' : 'translateX(0)' }
  32. },
  33. },
  34. }
  35. </script>
  36. <style>
  37. .toggle-background {
  38. transition: background-color 0.2s ease;
  39. }
  40. .toggle-indicator {
  41. top: 0.25rem;
  42. left: 0.25rem;
  43. transition: transform 0.2s ease;
  44. }
  45. </style>