primitives

Toggle

Toggle — базовый примитив RevueUI (Reka UI + shadcn-совместимый API).

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

src/ui/toggle/Toggle.vue

<!-- Radix `Toggle` → Reka UI `Toggle`, тот же примитив. -->
<script setup lang="ts">
import type { HTMLAttributes } from "vue"
import { computed } from "vue"
import { Toggle as TogglePrimitive, type ToggleEmits, type ToggleProps, useForwardPropsEmits } from "reka-ui"
import { cn } from "@/lib/utils"
import { toggleVariants, type ToggleVariants } from "./variants"

const props = withDefaults(
  defineProps<
    ToggleProps & {
      /** Доп. классы. Имя `class` — соглашение shadcn-vue (не `className`). */
      class?: HTMLAttributes["class"]
      variant?: ToggleVariants["variant"]
      size?: ToggleVariants["size"]
    }
  >(),
  {
    variant: "default",
    size: "default",
  }
)
const emits = defineEmits<ToggleEmits>()

const delegatedProps = computed(() => {
  const { class: _class, variant: _variant, size: _size, ...delegated } = props
  return delegated
})

const forwarded = useForwardPropsEmits(delegatedProps, emits)
</script>

<template>
  <TogglePrimitive
    data-slot="toggle"
    v-bind="forwarded"
    :class="cn(toggleVariants({ variant: props.variant, size: props.size }), props.class)"
  >
    <slot />
  </TogglePrimitive>
</template>

src/ui/toggle/index.ts

export { default as Toggle } from "./Toggle.vue"
export { toggleVariants, type ToggleVariants } from "./variants"

src/ui/toggle/variants.ts

import { cva, type VariantProps } from "class-variance-authority"

/**
 * Перенесено дословно (registry/bases/radix/ui/toggle.tsx, MIT).
 *
 * cva-блоки — чистые JS-объекты и переносятся между React и Vue без единой
 * правки.
 */
export const toggleVariants = cva(
  "cn-toggle group/toggle inline-flex items-center justify-center whitespace-nowrap outline-none hover:bg-muted focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
  {
    variants: {
      variant: {
        default: "cn-toggle-variant-default",
        outline: "cn-toggle-variant-outline",
      },
      size: {
        default: "cn-toggle-size-default",
        sm: "cn-toggle-size-sm",
        lg: "cn-toggle-size-lg",
      },
    },
    defaultVariants: {
      variant: "default",
      size: "default",
    },
  }
)

export type ToggleVariants = VariantProps<typeof toggleVariants>

Установка

npx shadcn-vue@latest add https://revueui.rootapi.dev/r/toggle.json

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

npm-зависимости

  • class-variance-authority
  • reka-ui

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