Navigation Drawer
The NavDrawer component is flexible component to create side navigation panel.
Usage
Basic Usage
To use the NavDrawer component, just import it from @morpheme/ui or @morpheme/nav-drawer and use it in the template.
Colors
By default, NavDrawer component support 4 colors: default, primary, secondary and dark. You can use color prop to change the navigation drawer color.
Primary
Secondary
Dark
Shadow
- props:
shadow - type:
string | boolean - value:
sm | md | lg | xl | true | false - default:
false
You can add shadow to the nav-drawer using shadow prop.
Bordered
- props:
bordered - type:
boolean - default:
false
You can add border to the nav-drawer using bordered prop.
Fixed
- props:
fixed - type:
boolean - default:
false
Use fixed prop to apply fixed position to the navigation drawer.
Sticky
- props:
fixed - type:
boolean - default:
false
Use sticky prop to apply sticky position to the navigation drawer.
Toggle
- props:
modelValue - type:
boolean - default:
false
You can toggle show or hide the navigation drawer using v-model or modelValue prop.
Mini
- props:
mini - type:
boolean - default:
false
Use mini prop to apply mini style to the navigation drawer.
Expand on Hover
To enable expand on hover effect, you need to apply two props: expand-on-hover and expanded. The prop expand-on-hover tells the nav-drawer to use this effect and the expanded prop used as the expand state of the nav-drawer.
Overlay
- props:
overlay - type:
boolean - default:
false
Use overlay prop to add overlay to the navigation drawer.
Right Aligned
- props:
right - type:
boolean - default:
false
By default the navigation drawer is placed at the left of the page. You can move it to the right by passing right prop.
Custom Transition
- props:
transition - type:
string - default:
nav-drawer-transition
You can also customize the default transition using transition prop.
Resizeable
- props:
resizeable - type:
boolean - default:
false
You can make nav drawer resizeable by adding resizeable prop. You can also change nav drawer size to mini when resizer button clicked by adding miniOnResizerClick prop, hide nav drawer when resizer clicked via hideOnResizerClick prop or toggle expand the nav drawer via expandOnResizerClick prop.
Props
| Name | Type | Default |
|---|---|---|
color | string | default | primary | secondary | dark | default |
modelValue | boolean | true |
shadow | 'sm' | 'md' | 'lg' | 'xl' | boolean | false |
bordered | boolean | false |
sticky | boolean | false |
fixed | boolean | false |
right | boolean | false |
left | boolean | false |
transition | string | nav-drawer-transition |
overlay | boolean | false |
overlayTransition | string | nav-drawer-overlay-transition |
closeOnOverlayClick | boolean | true |
mini | boolean | false |
expandOnHover | boolean | false |
expanded | boolean | false |
height | screen | fit | auto | max | screen-dvh | screen-svh |screen-lvh | unset | initial | inherit | min-content | revert | none | screen |
resizeable | boolean | false |
maxWidth | boolean | 248 |
minWidth | 62 | false |
miniOnResizerClick | boolean | false |
hideOnResizerClick | boolean | false |
expandOnResizerClick | boolean | false |
Events
(e: 'update:modelValue', value: string): void;
Emitted when modelValue prop changed. Used for v-model directive.
<script setup lang="ts">
const onUpdate = (value: boolean) => console.log('Updated!', value);
</script>
<template>
<NavDrawer @update:modelValue="onUpdate" />
</template><script setup lang="ts">
const onUpdate = (value: boolean) => console.log('Updated!', value);
</script>
<template>
<NavDrawer @update:modelValue="onUpdate" />
</template>(e: 'update:expanded', value: boolean): void;
Emitted when expanded prop changed. Used for v-model:expanded directive.
<script setup lang="ts">
const onUpdate = (value: boolean) => console.log('Expanded!', value);
</script>
<template>
<NavDrawer @update:expanded="onUpdate" />
</template><script setup lang="ts">
const onUpdate = (value: boolean) => console.log('Expanded!', value);
</script>
<template>
<NavDrawer @update:expanded="onUpdate" />
</template>(e: 'clickOverlay'): void;
Emitted when user click the overlay element.
<script setup lang="ts">
const onOverlayClicked = () => console.log('Clicked!');
</script>
<template>
<NavDrawer @clickOverlay="onOverlayClicked" />
</template><script setup lang="ts">
const onOverlayClicked = () => console.log('Clicked!');
</script>
<template>
<NavDrawer @clickOverlay="onOverlayClicked" />
</template>Slots
default
The default slot is used to place any content inside navigation drawer.
CSS Variables
:root {
--nav-drawer-width: 248px;
--nav-drawer-height: 100%;
--nav-drawer-transition: all 0.3s ease-out;
--nav-drawer-bg-color: var(--color-white);
--nav-drawer-text-color: var(--color-gray-800);
--nav-drawer-shadow: none;
--nav-drawer-border-color: var(--color-gray-200);
--nav-drawer-z-index: 20;
// mini
--nav-drawer-mini-width: 62px;
// 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);
}:root {
--nav-drawer-width: 248px;
--nav-drawer-height: 100%;
--nav-drawer-transition: all 0.3s ease-out;
--nav-drawer-bg-color: var(--color-white);
--nav-drawer-text-color: var(--color-gray-800);
--nav-drawer-shadow: none;
--nav-drawer-border-color: var(--color-gray-200);
--nav-drawer-z-index: 20;
// mini
--nav-drawer-mini-width: 62px;
// 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);
}Customization
You can constumize the navigation drawer via CSS Properties.
Here is the example to create indigo colored navigation drawer.
In the example above, first, we need to specify the custom color via color prop. For example, set to indigo and this will set class nav-drawer-indigo respectively so you can define your own style by utilizing the CSS Properties like above.
Standalone Installation
You can also install the NavDrawer component individually via @morpheme/nav-drawer package:
npm i @morpheme/nav-drawernpm i @morpheme/nav-drawer<script setup lang="ts">
import {NavDrawer} from '@morpheme/nav-drawer';
</script>
<template>
<NavDrawer>Hello World</NavDrawer>
</template><script setup lang="ts">
import {NavDrawer} from '@morpheme/nav-drawer';
</script>
<template>
<NavDrawer>Hello World</NavDrawer>
</template>Storybook
View Storybook documentation here.
Morpheme