InspectorBoolean.vue 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <script setup lang="ts">
  2. const props = defineProps<{
  3. label: string
  4. value: any
  5. type?: string
  6. path?: string
  7. }>()
  8. const emit = defineEmits(['change'])
  9. function onChange(event: Event) {
  10. const { target } = event
  11. emit('change', (target as HTMLInputElement).checked)
  12. }
  13. function onKeydown(event: KeyboardEvent) {
  14. if (event.code === 'Space' || event.code === 'Enter') {
  15. event.preventDefault() // Prevent scrolling when space is pressed
  16. emit('change', !props.value)
  17. }
  18. }
  19. </script>
  20. <template>
  21. <div class="flex px-4 justify-start gap-2 items-center">
  22. <UBadge
  23. color="gray"
  24. variant="soft"
  25. >
  26. {{ value }}
  27. </UBadge>
  28. <input
  29. :id="path"
  30. :checked="value"
  31. class="hidden"
  32. type="checkbox"
  33. @input="onChange"
  34. >
  35. <label
  36. :for="path"
  37. class="inline-flex items-center cursor-pointer"
  38. >
  39. <span
  40. tabindex="0"
  41. role="checkbox"
  42. :aria-checked="value.toString()"
  43. :class="{
  44. 'bg-dark-500': value,
  45. 'bg-gray-200': !value,
  46. }"
  47. class="w-4
  48. h-4
  49. flex
  50. justify-center
  51. items-center
  52. rounded
  53. border
  54. border-gray-300
  55. mr-2
  56. transition-colors
  57. duration-200
  58. dark:bg-slate-400/50
  59. "
  60. @keydown="onKeydown"
  61. >
  62. <i
  63. v-show="value"
  64. class="i-carbon-checkmark text-light"
  65. /></span>
  66. </label>
  67. </div>
  68. </template>