-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathAccordion.vue
96 lines (93 loc) · 2.47 KB
/
Accordion.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<template>
<Flipper :flip-key="focused" :stagger-config="staggerConfig">
<div class="m-4">
<div v-for="(num, index) in list" :key="index">
<Flipped
:flip-id="`card-${index}`"
stagger="card"
:should-invert="shouldFlip(index)"
v-if="index !== focused"
>
<div @click="toggleItem(index)" role="button" class="bg-grey my-4">
<Flipped class="min-h-4 p-4" :inverse-flip-id="`card-${index}`">
<div>
<Flipped
:delay-until="`card-${index}`"
:should-flip="shouldFlip(index)"
:flip-id="`avatar-card-${index}`"
>
<div class="inline-block bg-grey-dark rounded-full w-3 h-3"></div>
</Flipped>
</div>
</Flipped>
</div>
</Flipped>
<Flipped :flip-id="`card-${index}`" v-else stagger="card">
<div @click="toggleItem(index)" role="button" class="bg-grey my-4 text-center">
<Flipped class="h-32 p-4" :inverse-flip-id="`card-${index}`">
<div>
<Flipped
:delay-until="`card-${index}`"
:should-flip="shouldFlip(index)"
:flip-id="`avatar-card-${index}`"
>
<div class="inline-block bg-grey-dark rounded-full w-12 h-12"></div>
</Flipped>
</div>
</Flipped>
</div>
</Flipped>
</div>
</div>
</Flipper>
</template>
<script>
import Flipper from "../src/Flipper";
import Flipped from "../src/Flipped";
export default {
name: "Accordion",
components: {
Flipper,
Flipped
},
data() {
return {
focused: null,
list: Array(8)
.fill()
.map((_, i) => ({
open: false,
label: `Card ${i + 1}`
}))
};
},
methods: {
shouldFlip(index) {
return (prev, current) => {
return index === prev || index === current;
};
},
toggleItem(index) {
if (this.focused === index) {
this.focused = null;
} else {
this.focused = index;
}
this.list[index].open = !this.list[index].open;
}
},
computed: {
staggerConfig() {
return {
card: {
reverse: this.focused === null,
speed: 1
}
};
},
key() {
return this.list.map(item => item.open.toString()).join("");
}
}
};
</script>