primitives
Accordion
Accordion — базовый примитив RevueUI (Reka UI + shadcn-совместимый API).
Загрузка превью…
src/ui/accordion/Accordion.vue
<script setup lang="ts">
/**
* Порт базового радикс-слоя (registry/bases/radix/ui/accordion.tsx, MIT).
* Radix AccordionPrimitive -> reka-ui Accordion*, один в один.
*/
import type { HTMLAttributes } from "vue"
import { AccordionRoot } from "reka-ui"
import { cn } from "@/lib/utils"
const props = defineProps<{
class?: HTMLAttributes["class"]
}>()
</script>
<template>
<AccordionRoot
data-slot="accordion"
:class="cn('cn-accordion flex w-full flex-col', props.class)"
>
<slot />
</AccordionRoot>
</template>
src/ui/accordion/AccordionContent.vue
<script setup lang="ts">
import type { HTMLAttributes } from "vue"
import { AccordionContent } from "reka-ui"
import { cn } from "@/lib/utils"
const props = defineProps<{
class?: HTMLAttributes["class"]
}>()
</script>
<template>
<AccordionContent data-slot="accordion-content" class="cn-accordion-content overflow-hidden">
<div
:class="
cn(
'cn-accordion-content-inner h-(--radix-accordion-content-height) [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4',
props.class
)
"
>
<slot />
</div>
</AccordionContent>
</template>
src/ui/accordion/AccordionItem.vue
<script setup lang="ts">
import type { HTMLAttributes } from "vue"
import type { AccordionItemProps } from "reka-ui"
import { AccordionItem } from "reka-ui"
import { cn } from "@/lib/utils"
const props = defineProps<
AccordionItemProps & { class?: HTMLAttributes["class"] }
>()
</script>
<template>
<AccordionItem
data-slot="accordion-item"
:value="props.value"
:disabled="props.disabled"
:class="cn('cn-accordion-item', props.class)"
>
<slot />
</AccordionItem>
</template>
src/ui/accordion/AccordionTrigger.vue
<script setup lang="ts">
import type { HTMLAttributes } from "vue"
import { AccordionHeader, AccordionTrigger } from "reka-ui"
import { cn } from "@/lib/utils"
const props = defineProps<{
class?: HTMLAttributes["class"]
}>()
</script>
<template>
<AccordionHeader class="flex">
<AccordionTrigger
data-slot="accordion-trigger"
:class="
cn(
'cn-accordion-trigger group/accordion-trigger relative flex flex-1 items-start justify-between border border-transparent transition-all outline-none disabled:pointer-events-none disabled:opacity-50',
props.class
)
"
>
<slot />
<svg
data-slot="accordion-trigger-icon"
class="cn-accordion-trigger-icon pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
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"
>
<path d="m6 9 6 6 6-6" />
</svg>
<svg
data-slot="accordion-trigger-icon"
class="cn-accordion-trigger-icon pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
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"
>
<path d="m18 15-6-6-6 6" />
</svg>
</AccordionTrigger>
</AccordionHeader>
</template>
src/ui/accordion/index.ts
export { default as Accordion } from "./Accordion.vue"
export { default as AccordionContent } from "./AccordionContent.vue"
export { default as AccordionItem } from "./AccordionItem.vue"
export { default as AccordionTrigger } from "./AccordionTrigger.vue"
Установка
npx shadcn-vue@latest add https://revueui.rootapi.dev/r/accordion.jsonЗависимости реестра
npm-зависимости
- reka-ui
Источник: порт из ReUI (Keenthemes, MIT)