Skip to content

Commit aa5de0e

Browse files
committed
feat: 新增 FaCollapsible 组件
1 parent 632a2d3 commit aa5de0e

File tree

6 files changed

+101
-0
lines changed

6 files changed

+101
-0
lines changed

src/types/components.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ declare module 'vue' {
1616
FaButtonGroup: typeof import('./../ui/components/FaButtonGroup/index.vue')['default']
1717
FaCard: typeof import('./../ui/components/FaCard/index.vue')['default']
1818
FaCheckbox: typeof import('./../ui/components/FaCheckbox/index.vue')['default']
19+
FaCollapsible: typeof import('./../ui/components/FaCollapsible/index.vue')['default']
1920
FaContextMenu: typeof import('./../ui/components/FaContextMenu/index.vue')['default']
2021
FaCopyright: typeof import('./../ui/components/FaCopyright/index.vue')['default']
2122
FaDivider: typeof import('./../ui/components/FaDivider/index.vue')['default']
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script setup lang="ts">
2+
import type { CollapsibleRootEmits, CollapsibleRootProps } from 'reka-ui'
3+
import { CollapsibleRoot, useForwardPropsEmits } from 'reka-ui'
4+
5+
const props = defineProps<CollapsibleRootProps>()
6+
const emits = defineEmits<CollapsibleRootEmits>()
7+
8+
const forwarded = useForwardPropsEmits(props, emits)
9+
</script>
10+
11+
<template>
12+
<CollapsibleRoot v-slot="{ open }" v-bind="forwarded">
13+
<slot :open="open" />
14+
</CollapsibleRoot>
15+
</template>
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<script setup lang="ts">
2+
import type { CollapsibleContentProps } from 'reka-ui'
3+
import { CollapsibleContent } from 'reka-ui'
4+
5+
const props = defineProps<CollapsibleContentProps>()
6+
</script>
7+
8+
<template>
9+
<CollapsibleContent v-bind="props" class="CollapsibleContent">
10+
<slot />
11+
</CollapsibleContent>
12+
</template>
13+
14+
<style scoped>
15+
.CollapsibleContent {
16+
overflow: hidden;
17+
}
18+
19+
.CollapsibleContent[data-state="open"] {
20+
animation: collapsible-down 300ms ease-out;
21+
}
22+
23+
.CollapsibleContent[data-state="closed"] {
24+
animation: collapsible-up 300ms ease-out;
25+
}
26+
27+
@keyframes collapsible-down {
28+
from {
29+
height: 0;
30+
}
31+
32+
to {
33+
height: var(--reka-collapsible-content-height);
34+
}
35+
}
36+
37+
@keyframes collapsible-up {
38+
from {
39+
height: var(--reka-collapsible-content-height);
40+
}
41+
42+
to {
43+
height: 0;
44+
}
45+
}
46+
</style>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<script setup lang="ts">
2+
import type { CollapsibleTriggerProps } from 'reka-ui'
3+
import { CollapsibleTrigger } from 'reka-ui'
4+
5+
const props = defineProps<CollapsibleTriggerProps>()
6+
</script>
7+
8+
<template>
9+
<CollapsibleTrigger v-bind="props">
10+
<slot />
11+
</CollapsibleTrigger>
12+
</template>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export { default as Collapsible } from './Collapsible.vue'
2+
export { default as CollapsibleContent } from './CollapsibleContent.vue'
3+
export { default as CollapsibleTrigger } from './CollapsibleTrigger.vue'
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<script setup lang="ts">
2+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from './collapsible'
3+
4+
defineOptions({
5+
name: 'FaCollapsible',
6+
})
7+
8+
const open = defineModel<boolean>('modelValue', {
9+
default: false,
10+
})
11+
12+
const slots = useSlots()
13+
</script>
14+
15+
<template>
16+
<Collapsible v-model:open="open">
17+
<CollapsibleTrigger v-if="!!slots.trigger">
18+
<slot name="trigger" :open />
19+
</CollapsibleTrigger>
20+
<CollapsibleContent>
21+
<slot />
22+
</CollapsibleContent>
23+
</Collapsible>
24+
</template>

0 commit comments

Comments
 (0)