button-group

Environment switcher with indicator

Environment switcher with indicator

Загрузка превью…

src/button-group/c-button-group-45.vue

<script setup lang="ts">
import { ref } from "vue"
import { Button } from "@/components/ui/button"
import { ButtonGroup, ButtonGroupText } from "@/components/ui/button-group"
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"

const environments = [
  {
    id: "development",
    label: "Dev",
    tooltip: "Local development environment",
    icon: "code-2",
  },
  {
    id: "staging",
    label: "Staging",
    tooltip: "Pre-production mirror",
    icon: "test-tube-2",
  },
  {
    id: "production",
    label: "Production",
    tooltip: "Live environment — affects real users",
    icon: "globe",
  },
]

const active = ref("development")
</script>

<template>
  <ButtonGroup>
    <TooltipProvider>
      <Tooltip v-for="env in environments" :key="env.id">
        <TooltipTrigger as-child>
          <Button
            variant="outline"
            :class="active === env.id ? 'bg-muted' : ''"
            @click="active = env.id"
          >
            <svg
              v-if="env.icon === 'code-2'"
              xmlns="http://www.w3.org/2000/svg"
              width="24"
              height="24"
              viewBox="0 0 24 24"
              fill="none"
              stroke="currentColor"
              stroke-width="2"
              stroke-linecap="round"
              stroke-linejoin="round"
              aria-hidden="true"
              class="lucide lucide-code-2"
            >
              <path d="m18 16 4-4-4-4" />
              <path d="m6 8-4 4 4 4" />
              <path d="m14.5 4-5 16" />
            </svg>
            <svg
              v-else-if="env.icon === 'test-tube-2'"
              xmlns="http://www.w3.org/2000/svg"
              width="24"
              height="24"
              viewBox="0 0 24 24"
              fill="none"
              stroke="currentColor"
              stroke-width="2"
              stroke-linecap="round"
              stroke-linejoin="round"
              aria-hidden="true"
              class="lucide lucide-test-tube-2"
            >
              <path d="M21 7 6.82 21.18a2.83 2.83 0 0 1-3.99-.01a2.83 2.83 0 0 1 0-4L17 3" />
              <path d="m16 2 6 6" />
              <path d="M12 16H4" />
            </svg>
            <svg
              v-else
              xmlns="http://www.w3.org/2000/svg"
              width="24"
              height="24"
              viewBox="0 0 24 24"
              fill="none"
              stroke="currentColor"
              stroke-width="2"
              stroke-linecap="round"
              stroke-linejoin="round"
              aria-hidden="true"
              class="lucide lucide-globe"
            >
              <circle cx="12" cy="12" r="10" />
              <path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20" />
              <path d="M2 12h20" />
            </svg>
            {{ env.label }}
          </Button>
        </TooltipTrigger>
        <TooltipContent>{{ env.tooltip }}</TooltipContent>
      </Tooltip>
      <ButtonGroupText v-if="active === 'production'" class="bg-transparent">
        <div class="bg-success size-1.5 rounded-full" />
        <span>Live</span>
      </ButtonGroupText>
    </TooltipProvider>
  </ButtonGroup>
</template>

Установка

npx shadcn-vue@latest add https://revueui.rootapi.dev/r/c-button-group-45.json

Зависимости реестра

Источник: порт из ReUI (Keenthemes, MIT)