From 2b584446c0b4e5fd31b36910ef58e4703de7d5ad Mon Sep 17 00:00:00 2001 From: Warsono Date: Fri, 8 Sep 2023 14:44:37 +0700 Subject: [PATCH] feat(NavDrawer): navigation drawer resizeable --- packages/nav-drawer/src/NavDrawer.stories.ts | 25 +++++++ packages/nav-drawer/src/NavDrawer.vue | 74 +++++++++++++++++-- packages/themes/src/morpheme/_nav-drawer.scss | 31 +++++++- 3 files changed, 121 insertions(+), 9 deletions(-) diff --git a/packages/nav-drawer/src/NavDrawer.stories.ts b/packages/nav-drawer/src/NavDrawer.stories.ts index 38a70dfb5..80a7e8ebc 100644 --- a/packages/nav-drawer/src/NavDrawer.stories.ts +++ b/packages/nav-drawer/src/NavDrawer.stories.ts @@ -5,6 +5,7 @@ import {ref} from 'vue'; import Button from '@morpheme/button'; import {colors} from './colors'; import NavDrawerCustom from './stories/NavDrawerCustom.vue'; +import NavDrawerResizer from './NavDrawerResizer.vue'; export default { title: 'Components/NavigationDrawer', @@ -409,3 +410,27 @@ export const Top: StoryFn = (args) => ({ `, }); + +export const Resizer: StoryFn = (args) => ({ + components: {NavDrawer, Button}, + setup() { + const isOpen = ref(true); + + return {args, isOpen}; + }, + template: ` + +

+ Hover on the edge to resize +

+
+
+ Main content +
+ `, +}); diff --git a/packages/nav-drawer/src/NavDrawer.vue b/packages/nav-drawer/src/NavDrawer.vue index e4bf0d579..a2f7b8697 100644 --- a/packages/nav-drawer/src/NavDrawer.vue +++ b/packages/nav-drawer/src/NavDrawer.vue @@ -1,8 +1,9 @@ @@ -148,9 +194,21 @@ defineSlots<{ :class="classes" v-bind="$attrs" :style="styles" + ref="drawer" @mouseover="onMouseOver" @mouseout="onMouseOut" > + + + diff --git a/packages/themes/src/morpheme/_nav-drawer.scss b/packages/themes/src/morpheme/_nav-drawer.scss index 607a2626a..bc1fae613 100644 --- a/packages/themes/src/morpheme/_nav-drawer.scss +++ b/packages/themes/src/morpheme/_nav-drawer.scss @@ -13,6 +13,11 @@ // expanded --nav-drawer-inexpanded-width: var(--nav-drawer-mini-width); --nav-drawer-expanded-width: 248px; + + // resizer + --nav-drawer-resizer-width: 6px; + --nav-drawer-resizer-bg-color: transparent; + --nav-drawer-resizer-hover-bg-color: var(--color-gray-400); } .nav-drawer { @@ -25,6 +30,7 @@ box-shadow: var(--nav-drawer-shadow); border: var(--nav-drawer-border); width: var(--nav-drawer-width); + position: relative; /* variants */ &-default { @@ -34,16 +40,19 @@ &-primary { --nav-drawer-bg-color: var(--color-primary-500); --nav-drawer-text-color: var(--color-white); + --nav-drawer-resizer-hover-bg-color: var(--color-primary-400); } &-dark { --nav-drawer-bg-color: var(--color-gray-800); --nav-drawer-text-color: var(--color-white); + --nav-drawer-resizer-hover-bg-color: var(--color-gray-700); } &-secondary { --nav-drawer-bg-color: var(--color-secondary-500); --nav-drawer-text-color: var(--color-white); + --nav-drawer-resizer-hover-bg-color: var(--color-secondary-400); } /* modifiers */ @@ -188,7 +197,9 @@ background-color: rgba(0, 0, 0, 0.5); position: fixed; z-index: 10; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, + text-decoration-color, fill, stroke, opacity, box-shadow, transform, + filter, backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 300ms; } @@ -210,4 +221,22 @@ &--expand-on-hover.nav-drawer--expanded { --nav-drawer-width: var(--nav-drawer-expanded-width); } + + &__resizer { + appearance: none; + height: 100%; + width: var(--nav-drawer-resizer-width); + background-color: var(--nav-drawer-resizer-bg-color); + position: absolute; + right: 0; + cursor: col-resize; + transition: background-color 0.3s ease-out; + + &:hover, + &:active { + cursor: col-resize; + background-color: var(--nav-drawer-resizer-hover-bg-color); + box-shadow: var(--effect-shadow-lg); + } + } }