internal/dashboard/frontend/src/components/Filter/ToggleSwitches.vue

<script setup lang="ts">
import { IconMapPin, IconMapPinOff } from "@tabler/icons-vue";
import ToggleButton from "components/Filter/ToggleButton.vue";
import { useFilterStore, type FilterState } from "src/store";
import { useRoute } from "vue-router";

const props = defineProps<{
  filters?: FilterState;
}>();

const filterStore = props.filters || useFilterStore().state;
</script>

<template>
  <div class="flex" v-if="!(useRoute().name as string)?.startsWith('charts')">
    <ToggleButton
      :checked="filterStore.resolve_ips ?? false"
      @click="filterStore.resolve_ips = !filterStore.resolve_ips"
      label="Resolve IPs"
    >
      <Component
        :is="filterStore.resolve_ips ? IconMapPin : IconMapPinOff"
        size="18"
      />
      Resolve IPs
    </ToggleButton>
  </div>
</template>

<style scoped>
@reference "src/style.css";

label {
  @apply flex cursor-pointer items-center gap-2 border border-r-0 border-stone-700 bg-stone-900/70 px-2 py-0.5 text-xs font-semibold select-none;

  &:hover {
    @apply text-stone-300;
  }

  &:first-of-type {
    @apply rounded-l-full border-l;
  }

  &:last-of-type {
    @apply rounded-r-full border-r;
  }
}

input {
  @apply hidden;
}

input:checked + label {
  @apply text-stone-200;
}
</style>