primitives
Button
Button — базовый примитив RevueUI (Reka UI + shadcn-совместимый API).
Загрузка превью…
src/ui/button/Button.vue
<script setup lang="ts">
import type { HTMLAttributes } from "vue"
import { Primitive } from "reka-ui"
import { cn } from "@/lib/utils"
import { buttonVariants, type ButtonVariants } from "./variants"
const props = withDefaults(
defineProps<{
/** Доп. классы. Имя `class` — соглашение shadcn-vue (не `className`). */
class?: HTMLAttributes["class"]
variant?: ButtonVariants["variant"]
size?: ButtonVariants["size"]
/** Соответствие Radix `asChild`: Reka UI `Primitive` с `as-child`. */
asChild?: boolean
}>(),
{
variant: "default",
size: "default",
asChild: false,
}
)
</script>
<template>
<Primitive
data-slot="button"
:data-variant="props.variant"
:data-size="props.size"
as="button"
:as-child="props.asChild"
:class="cn(buttonVariants({ variant: props.variant, size: props.size }), props.class)"
>
<slot />
</Primitive>
</template>
src/ui/button/index.ts
export { default as Button } from "./Button.vue"
export { buttonVariants, type ButtonVariants } from "./variants"
src/ui/button/variants.ts
import { cva, type VariantProps } from "class-variance-authority"
/**
* Перенесено дословно из shadcn (registry/bases/radix/ui/button.tsx, MIT).
*
* cva-блоки — чистые JS-объекты и переносятся между React и Vue без единой
* правки. Вся визуальная семантика живёт здесь, а фреймворк-специфичной
* остаётся только разметка.
*/
export const buttonVariants = cva(
"cn-button group/button inline-flex shrink-0 items-center justify-center whitespace-nowrap transition-all outline-none select-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
{
variants: {
variant: {
default: "cn-button-variant-default",
outline: "cn-button-variant-outline",
secondary: "cn-button-variant-secondary",
ghost: "cn-button-variant-ghost",
destructive: "cn-button-variant-destructive",
link: "cn-button-variant-link",
},
size: {
default: "cn-button-size-default",
xs: "cn-button-size-xs",
sm: "cn-button-size-sm",
lg: "cn-button-size-lg",
icon: "cn-button-size-icon",
"icon-xs": "cn-button-size-icon-xs",
"icon-sm": "cn-button-size-icon-sm",
"icon-lg": "cn-button-size-icon-lg",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
)
export type ButtonVariants = VariantProps<typeof buttonVariants>
Установка
npx shadcn-vue@latest add https://revueui.rootapi.dev/r/button.jsonЗависимости реестра
npm-зависимости
- class-variance-authority
- reka-ui
Источник: порт из ReUI (Keenthemes, MIT)