summaryrefslogtreecommitdiff
path: root/src/client/components/ui/folder.vue
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2020-08-09 15:51:02 +0900
committerGitHub <noreply@github.com>2020-08-09 15:51:02 +0900
commit69d9aa71f25ab06d8024b04ce341909425d053d6 (patch)
tree868ac53c1de7ea628a464ab277ee3aa573fdb24b /src/client/components/ui/folder.vue
parent:v: (diff)
downloadmisskey-69d9aa71f25ab06d8024b04ce341909425d053d6.tar.gz
misskey-69d9aa71f25ab06d8024b04ce341909425d053d6.tar.bz2
misskey-69d9aa71f25ab06d8024b04ce341909425d053d6.zip
Full view mode (#6636)
* wuip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * Update folder.vue * wip * Update size.ts * wip * wip * Update index.vue * wip
Diffstat (limited to 'src/client/components/ui/folder.vue')
-rw-r--r--src/client/components/ui/folder.vue126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/client/components/ui/folder.vue b/src/client/components/ui/folder.vue
new file mode 100644
index 0000000000..0b489fe9ad
--- /dev/null
+++ b/src/client/components/ui/folder.vue
@@ -0,0 +1,126 @@
+<template>
+<div class="ssazuxis" v-size="{ max: [500] }">
+ <header @click="() => showBody = !showBody" class="_button">
+ <div class="title"><slot name="header"></slot></div>
+ <div class="divider"></div>
+ <button class="_button">
+ <template v-if="showBody"><fa :icon="faAngleUp"/></template>
+ <template v-else><fa :icon="faAngleDown"/></template>
+ </button>
+ </header>
+ <transition name="folder-toggle"
+ @enter="enter"
+ @after-enter="afterEnter"
+ @leave="leave"
+ @after-leave="afterLeave"
+ >
+ <div v-show="showBody">
+ <slot></slot>
+ </div>
+ </transition>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import { faAngleUp, faAngleDown } from '@fortawesome/free-solid-svg-icons';
+
+export default Vue.extend({
+ props: {
+ expanded: {
+ type: Boolean,
+ required: false,
+ default: true
+ },
+ },
+ data() {
+ return {
+ showBody: this.expanded,
+ faAngleUp, faAngleDown
+ };
+ },
+ methods: {
+ toggleContent(show: boolean) {
+ this.showBody = show;
+ },
+
+ enter(el) {
+ const elementHeight = el.getBoundingClientRect().height;
+ el.style.height = 0;
+ el.offsetHeight; // reflow
+ el.style.height = elementHeight + 'px';
+ },
+ afterEnter(el) {
+ el.style.height = null;
+ },
+ leave(el) {
+ const elementHeight = el.getBoundingClientRect().height;
+ el.style.height = elementHeight + 'px';
+ el.offsetHeight; // reflow
+ el.style.height = 0;
+ },
+ afterLeave(el) {
+ el.style.height = null;
+ },
+ }
+});
+</script>
+
+<style lang="scss" scoped>
+.folder-toggle-enter-active, .folder-toggle-leave-active {
+ overflow-y: hidden;
+ transition: opacity 0.5s, height 0.5s !important;
+}
+.folder-toggle-enter {
+ opacity: 0;
+}
+.folder-toggle-leave-to {
+ opacity: 0;
+}
+
+.ssazuxis {
+ position: relative;
+
+ > header {
+ display: flex;
+ position: relative;
+ z-index: 2;
+ // TODO
+ // position: sticky;
+ // top: var(--stickyTopOffset);
+ // backdrop-filter: blur(20px);
+
+ > .title {
+ margin: 0;
+ padding: 12px 16px 12px 8px;
+
+ > [data-icon] {
+ margin-right: 6px;
+ }
+
+ &:empty {
+ display: none;
+ }
+ }
+
+ > .divider {
+ flex: 1;
+ margin: auto;
+ height: 1px;
+ background: var(--divider);
+ }
+
+ > button {
+ width: 42px;
+ }
+ }
+
+ &.max-width_500px {
+ > header {
+ > .title {
+ padding: 8px 10px;
+ }
+ }
+ }
+}
+</style>