Nav bar ​

WNavBar is the nav on the left of the app shell — the one on the left of this page. It is position: fixed under the header and takes --nav-bar-width in layout from xl (1280px) up. Below it, it collapses and adds a menu button in the header's top-left corner, and opens as an overlay over the page; it emits update:is-open when the overlay opens or closes. Its class w-nav-bar is the hook for the app's surface and shadow, and its content uses w-nav-bar-width to keep its width while the nav collapses.

WNavItem is a router link with an icon and a title. Both default to the route's meta.icon and meta.titleShort (or meta.title), so an item is often just <WNavItem :to="{name: RouteName.PROJECTS}" />. It is active while the current route has the same name; queryFields lists the query params that must match too, for items that open the same route with different filters. count shows a number in brackets after the title and counter a badge, with skeleton while they load.

WNavItemExpand groups items under a title. The items show under it while one of them is active; otherwise hovering the group opens them in a menu to the right. With to, the group is a link of its own. even keeps the items always shown and not indented, for a nav inside a page.

WNavItemTransition wraps a list of items so that the ones added or removed with v-if — such as an item for the current record — expand and collapse.

The demo below uses even to show a group inside a page. Its items link to pages of this site, so the one you're on is active.

vue
<template>
  <div class="grid max-w-xs gap-4">
    <WToggle
      v-model="showRecent"
      title="Show the recent page"
    />

    <div class="rounded-xl border border-solid border-line-subtle py-2">
      <WNavItemTransition>
        <WNavItemExpand
          title="Layout"
          :icon="markRaw(IconMenu)"
          :query-fields="[]"
          even
        >
          <WNavItem
            :to="{path: '/components/nav-bar'}"
            title="Nav bar"
            :icon="markRaw(IconList)"
            :query-fields="[]"
          />

          <WNavItem
            :to="{path: '/components/header-bar'}"
            title="Header bar"
            :icon="markRaw(IconHeading)"
            :count="2"
            :query-fields="[]"
          />

          <WNavItem
            :to="{path: '/components/actions-bar'}"
            title="Actions bar"
            :icon="markRaw(IconElement)"
            :counter="3"
            :query-fields="[]"
          />

          <WNavItem
            v-if="showRecent"
            :to="{path: '/components/report-pages'}"
            title="Report pages"
            :icon="markRaw(IconNote)"
            :query-fields="[]"
          />
        </WNavItemExpand>
      </WNavItemTransition>
    </div>
  </div>
</template>

<script lang="ts" setup>
import {markRaw, ref} from 'vue'

import WNavItem from 'eco-vue-js/dist/components/Nav/WNavItem.vue'
import WNavItemExpand from 'eco-vue-js/dist/components/Nav/WNavItemExpand.vue'
import WNavItemTransition from 'eco-vue-js/dist/components/Nav/WNavItemTransition.vue'
import WToggle from 'eco-vue-js/dist/components/Toggle/WToggle.vue'

import IconElement from 'eco-vue-js/dist/assets/icons/IconElement'
import IconHeading from 'eco-vue-js/dist/assets/icons/IconHeading'
import IconList from 'eco-vue-js/dist/assets/icons/IconList'
import IconMenu from 'eco-vue-js/dist/assets/icons/IconMenu'
import IconNote from 'eco-vue-js/dist/assets/icons/IconNote'

const showRecent = ref(false)
</script>

In an app the items open routes by name:

vue
<WNavItemTransition>
  <WNavItem :to="{name: RouteName.PROJECTS}" />

  <WNavItem
    v-if="$route.name === RouteName.PROJECT"
    :to="{name: RouteName.PROJECT, params: {projectId: $route.params.projectId}}"
  />

  <WNavItemExpand
    title="Plants"
    :icon="markRaw(IconPlant)"
    :count="plantCount"
  >
    <WNavItem
      :to="{name: RouteName.PLANTS, query: {status: 'thirsty'}}"
      title="Thirsty"
      :query-fields="['status']"
    />

    <WNavItem
      :to="{name: RouteName.PLANTS, query: {status: 'watered'}}"
      title="Watered"
      :query-fields="['status']"
    />
  </WNavItemExpand>
</WNavItemTransition>

API ​

WNavBar ​

ts
import WNavBar from 'eco-vue-js/dist/components/Nav/WNavBar.vue'

Props ​

No props.

Events ​

EventPayloadDescription
update:is-open(value: boolean)The nav opened or closed below xl, where it is an overlay.

Slots ​

SlotPropsDescription
default—Content of the nav, such as WNavItem items.

WNavItem ​

ts
import WNavItem from 'eco-vue-js/dist/components/Nav/WNavItem.vue'

Props ​

PropTypeDefaultDescription
iconSVGComponent—Icon before the title. Defaults to the route's meta.icon.
titlestring—Title of the item. Defaults to the title the route's page registers with useRouteTitle while it is open, then the route's meta.titleShort, then meta.title.
countnumber—Number after the title in brackets, such as the number of items on the page it opens.
counternumber—Number in a badge over the end of the title, such as unread items. Hidden at 0.
skeletonboolean—Shows a placeholder for count and hides counter, while they load.
hasActiveboolean—Marks the item as the parent of the active item. Set by WNavItemExpand.
expandboolean—Marks the item as the toggle of a group without a route of its own. Set by WNavItemExpand.
indentboolean—Indents the item as a child of a group. Set by WNavItemExpand.
queryFieldsstring[]—Query params that must match the current route's for the item to be active, besides its route name. Other params, such as filters, are ignored.
hoveredboolean—Highlights the item as hovered. Set by WNavItemExpand while its menu is open.
evenboolean—Lays the item out without the indent of a group. Set by WNavItemExpand.
toRouteLocationRawrequiredRouter location — renders a router link. Needs vue-router installed in the app.

Slots ​

SlotPropsDescription
icon—Icon before the title, when neither icon nor the route's meta.icon is set.
right—Content at the end of the item.

WNavItemExpand ​

ts
import WNavItemExpand from 'eco-vue-js/dist/components/Nav/WNavItemExpand.vue'

Props ​

PropTypeDefaultDescription
iconSVGComponent—Icon before the title.
titlestringrequiredTitle of the group.
countnumber—Number after the title in brackets.
counternumber—Number in a badge over the end of the title. Hidden at 0.
skeletonboolean—Shows a placeholder for count and hides counter, while they load.
indentboolean—Indents the group as a child of another group.
queryFieldsstring[]—Query params that must match the current route's for the group's own route to be active.
evenboolean—Keeps the items always shown, without indent and without the menu on hover, e.g. for a nav inside a page.
toRouteLocationRaw—Router location — renders a router link. Needs vue-router installed in the app.

Slots ​

SlotPropsDescription
default—WNavItem items of the group. They show under the group while one of them is active, and in a menu on hover otherwise.
icon—Icon before the title, when icon isn't set.

WNavItemTransition ​

ts
import WNavItemTransition from 'eco-vue-js/dist/components/Nav/WNavItemTransition.vue'

Props ​

No props.

Slots ​

SlotPropsDescription
default—Nav items. Items added or removed with v-if expand and collapse.