primitives

Empty

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

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

src/ui/empty/Empty.vue

<script setup lang="ts">
/**
 * Порт базового радикс-слоя (registry/bases/radix/ui/empty.tsx, MIT).
 * Презентационная композиция — без внешнего примитива.
 */
import type { HTMLAttributes } from "vue"
import { cn } from "@/lib/utils"

const props = defineProps<{
  class?: HTMLAttributes["class"]
}>()
</script>

<template>
  <div
    data-slot="empty"
    :class="
      cn(
        'cn-empty flex w-full min-w-0 flex-1 flex-col items-center justify-center text-center text-balance',
        props.class
      )
    "
  >
    <slot />
  </div>
</template>

src/ui/empty/EmptyContent.vue

<script setup lang="ts">
import type { HTMLAttributes } from "vue"
import { cn } from "@/lib/utils"

const props = defineProps<{
  class?: HTMLAttributes["class"]
}>()
</script>

<template>
  <div
    data-slot="empty-content"
    :class="
      cn(
        'cn-empty-content flex w-full max-w-sm min-w-0 flex-col items-center text-balance',
        props.class
      )
    "
  >
    <slot />
  </div>
</template>

src/ui/empty/EmptyDescription.vue

<script setup lang="ts">
import type { HTMLAttributes } from "vue"
import { cn } from "@/lib/utils"

const props = defineProps<{
  class?: HTMLAttributes["class"]
}>()
</script>

<template>
  <div
    data-slot="empty-description"
    :class="
      cn(
        'cn-empty-description text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary',
        props.class
      )
    "
  >
    <slot />
  </div>
</template>

src/ui/empty/EmptyHeader.vue

<script setup lang="ts">
import type { HTMLAttributes } from "vue"
import { cn } from "@/lib/utils"

const props = defineProps<{
  class?: HTMLAttributes["class"]
}>()
</script>

<template>
  <div
    data-slot="empty-header"
    :class="cn('cn-empty-header flex max-w-sm flex-col items-center', props.class)"
  >
    <slot />
  </div>
</template>

src/ui/empty/EmptyMedia.vue

<script setup lang="ts">
import type { HTMLAttributes } from "vue"
import { cn } from "@/lib/utils"
import { emptyMediaVariants, type EmptyMediaVariants } from "./variants"

const props = withDefaults(
  defineProps<{
    class?: HTMLAttributes["class"]
    variant?: EmptyMediaVariants["variant"]
  }>(),
  {
    variant: "default",
  }
)
</script>

<template>
  <div
    data-slot="empty-icon"
    :data-variant="props.variant"
    :class="cn(emptyMediaVariants({ variant: props.variant, class: props.class }))"
  >
    <slot />
  </div>
</template>

src/ui/empty/EmptyTitle.vue

<script setup lang="ts">
import type { HTMLAttributes } from "vue"
import { cn } from "@/lib/utils"

const props = defineProps<{
  class?: HTMLAttributes["class"]
}>()
</script>

<template>
  <div data-slot="empty-title" :class="cn('cn-empty-title cn-font-heading', props.class)">
    <slot />
  </div>
</template>

src/ui/empty/index.ts

export { default as Empty } from "./Empty.vue"
export { default as EmptyContent } from "./EmptyContent.vue"
export { default as EmptyDescription } from "./EmptyDescription.vue"
export { default as EmptyHeader } from "./EmptyHeader.vue"
export { default as EmptyMedia } from "./EmptyMedia.vue"
export { default as EmptyTitle } from "./EmptyTitle.vue"
export { emptyMediaVariants, type EmptyMediaVariants } from "./variants"

src/ui/empty/variants.ts

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

/**
 * Перенесено дословно из registry/bases/radix/ui/empty.tsx (MIT).
 */
export const emptyMediaVariants = cva(
  "cn-empty-media flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
  {
    variants: {
      variant: {
        default: "cn-empty-media-default",
        icon: "cn-empty-media-icon",
      },
    },
    defaultVariants: {
      variant: "default",
    },
  }
)

export type EmptyMediaVariants = VariantProps<typeof emptyMediaVariants>

Установка

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

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

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

  • class-variance-authority

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