aboutsummaryrefslogtreecommitdiff
path: root/src/components/SCollapsible.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/SCollapsible.vue')
-rw-r--r--src/components/SCollapsible.vue28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/components/SCollapsible.vue b/src/components/SCollapsible.vue
index 4570ee0..5b49c8c 100644
--- a/src/components/SCollapsible.vue
+++ b/src/components/SCollapsible.vue
@@ -1,10 +1,10 @@
<template>
<div :style="styles">
- <div class="hover:cursor-pointer" @click="collapsed = !collapsed">
- <slot name="summary" :collapsed="collapsed">(Summary)</slot>
+ <div class="hover:cursor-pointer" @click="onClick">
+ <slot name="summary" :open="open">(Summary)</slot>
</div>
<transition @enter="onEnter" @after-enter="onAfterEnter" @leave="onLeave" @before-leave="onBeforeLeave">
- <div v-show="!collapsed" :style="contentStyles" class="max-h-0" ref="content">
+ <div v-show="open" :style="contentStyles" class="max-h-0" ref="content">
<slot name="content">(Content)</slot>
</div>
</transition>
@@ -15,21 +15,24 @@
import {defineComponent, PropType} from 'vue';
export default defineComponent({
+ props: {
+ modelValue: {type: Boolean, default: false}, // For using v-model on the component
+ },
data(){
return {
- collapsed: true,
+ open: false,
};
},
computed: {
styles(): Record<string,string> {
return {
- overflow: this.collapsed ? 'hidden' : 'visible',
+ overflow: this.open ? 'visible' : 'hidden',
};
},
contentStyles(): Record<string,string> {
return {
overflow: 'hidden',
- opacity: this.collapsed ? '0' : '1',
+ opacity: this.open ? '1' : '0',
transitionProperty: 'max-height, opacity',
transitionDuration: '300ms',
transitionTimingFunction: 'ease-in-out',
@@ -37,6 +40,13 @@ export default defineComponent({
},
},
methods: {
+ onClick(evt: Event){
+ this.open = !this.open;
+ this.$emit('update:modelValue', this.open);
+ if (this.open){
+ this.$emit('open');
+ }
+ },
onEnter(el: HTMLDivElement){
el.style.maxHeight = el.scrollHeight + 'px';
},
@@ -52,5 +62,11 @@ export default defineComponent({
el.style.maxHeight = '0';
},
},
+ watch: {
+ modelValue(newVal, oldVal){
+ this.open = newVal;
+ },
+ },
+ emits: ['update:modelValue', 'open', ],
});
</script>