Blocks

Sidebar

The sidebar is a primary navigation component that provides users with quick access to different sections of the platform. It enhances usability by keeping essential links organized and accessible.

Modern Sidebar

A sleek, compact design optimized for modern UI experiences. It includes collapsible sections, icons, and highlighted active states for improved usability.

View Mode
                          
HTML
<div class="col-lg sidebar-col"> <div class="offcanvas offcanvas-start sidebar-offcanvas" tabindex="-1" id="sidebar" aria-labelledby="offcanvasExampleLabel"> <aside class="sidebar"> <a class="sidebar__logo-area" href="index.html"> <img class="sidebar__logo-img" src="images/logo.svg"> <div class="sidebar__logo-info"> <span class="sidebar__logo-title">رقــمــن</span> <span class="sidebar__logo-desc"> <span>مُعرّف المنصة :</span> <span class="text-english">82384</span> </span> </div> <button class="sidebar__close-btn" data-bs-dismiss="offcanvas" aria-label="Close"> <span class="tticon-x"></span> </button> </a> <div class="btn-group w-100" role="group" aria-label="Basic example"> <a class="btn btn-secondary btn-lg" href="#!" target="_blank"> <span class="tticon-arrow-up-left-bold btn-icon"></span> معاينة المنصة </a> <button class="btn btn-secondary btn-lg flex-grow-0" type="button" data-bs-toggle="tooltip" data-bs-title="نسخ" data-bs-offset="0,4"> <span class="tticon-copy-doc btn-icon"></span> </button> </div> <div class="sidebar__content"> <ul class="sidebar__menu"> <li class="sidebar__menu-item sidebar__menu-item--active ${active1}"> <a class="sidebar__menu-link" href="index.html"> <span class="tticon-home-charts sidebar__menu-icon"></span> لوحة القيادة </a> </li> <li class="sidebar__menu-item ${active2}"> <a class="sidebar__menu-link" href="orders-01.html"> <span class="tticon-docs sidebar__menu-icon"></span> الطلبات </a> </li> <li class="sidebar__menu-item ${active3}"> <a class="sidebar__menu-link" href="services.html"> <span class="tticon-categories sidebar__menu-icon"></span> إدارة الخدمات </a> </li> <li class="sidebar__menu-item"><hr class="sidebar__menu-separator"></li> <li class="sidebar__menu-item ${active4}"> <a class="sidebar__menu-link" href="users-01.html"> <span class="tticon-users-two sidebar__menu-icon"></span> المستفيدين </a> </li> <li class="sidebar__menu-item ${active5}"> <a class="sidebar__menu-link" href="categories.html"> <span class="tticon-tag sidebar__menu-icon"></span> الفئات المستفيدة </a> </li> <li class="sidebar__menu-item ${active6}"> <a class="sidebar__menu-link" href="structure.html"> <span class="tticon-git sidebar__menu-icon"></span> الهيكلة الإدارية </a> </li> <li class="sidebar__menu-item"><hr class="sidebar__menu-separator"></li> <li class="sidebar__menu-item ${active7}"> <a class="sidebar__menu-link" href="invoices.html"> <span class="tticon-receipt sidebar__menu-icon"></span> الفواتير والمدفوعات </a> </li> <li class="sidebar__menu-item ${active8}"> <a class="sidebar__menu-link" href="admins-01.html"> <span class="tticon-user-circle sidebar__menu-icon"></span> المستخدمين </a> </li> <li class="sidebar__menu-item"><hr class="sidebar__menu-separator"></li> <li class="sidebar__menu-item ${active9}"> <a class="sidebar__menu-link" href="forms.html"> <span class="tticon-doc-edit sidebar__menu-icon"></span> النماذج </a> </li> <li class="sidebar__menu-item ${active10}"> <a class="sidebar__menu-link" href="pages.html"> <span class="tticon-sticker-note sidebar__menu-icon"></span> صفحات أخرى </a> </li> <li class="sidebar__menu-item ${active11}"> <a class="sidebar__menu-link" href="articles.html"> <span class="tticon-doc-file sidebar__menu-icon"></span> المقالات </a> </li> <li class="sidebar__menu-item d-lg-none"><hr class="sidebar__menu-separator"></li> <li class="sidebar__menu-item d-lg-none ${active12}"> <a class="sidebar__menu-link" href="layout-01.html"> <span class="tticon-grid-vertical sidebar__menu-icon"></span> تنسيق المنصة </a> </li> <li class="sidebar__menu-item d-lg-none ${active13}"> <a class="sidebar__menu-link" href="setting-01.html"> <span class="tticon-gear sidebar__menu-icon"></span> الإعدادات </a> </li> </ul> <div class="sidebar__copyright-area"> <span class="sidebar__copyright-text"> <span class="text-english">© 2024</span> <span>رقمن.</span> </span> <span class="sidebar__copyright-text">جميع الحقوق محفوظة.</span> <ul class="meta-list sidebar__meta-list"> <li class="meta-list__item"> <a class="meta-list__item-link" href="#!">الخصوصية والأمان</a> </li> <li class="meta-list__item"> <a class="meta-list__item-link" href="#!">شروط الإستخدام</a> </li> </ul> </div> </div> </aside> </div> </div>
<!-- Usage Example -->
<TheSidebarMenu :logo="logo" :title="title" :platform-id="platformId" />
<script setup>
import { ref } from 'vue'
const logo = ref('/images/logo-light.svg')
const title = ref('رقمن')
const platformId = ref('123421')
</script>
<!-- Vue Component Code Block -->
<template>
  <div class="col-lg sidebar-col">
    <div
      class="offcanvas offcanvas-start sidebar-offcanvas"
      :class="{ 'sidebar-col--classic': classic }"
      tabindex="-1"
      id="sidebar"
      aria-labelledby="offcanvasExampleLabel"
    >
      <aside class="sidebar">
        <div class="sidebar__logo-area">
          <img class="sidebar__logo-img" :src="logo" :alt="title" />
          <div class="sidebar__logo-info">
            <span class="sidebar__logo-title">{{ title }}</span>
            <span class="sidebar__logo-desc">مُعرّف المنصة : {{ platformId }}</span>
          </div>
          <button class="sidebar__close-btn" data-bs-dismiss="offcanvas" aria-label="Close">
            <span class="tticon-x"></span>
          </button>
        </div>
        <div class="btn-group w-100" role="group" aria-label="Basic example">
          <a class="btn btn-secondary btn-lg" target="_blank" href="/">
            <span class="tticon-arrow-up-left btn-icon"></span>معاينة المنصة
          </a>
          <button class="btn btn-secondary btn-lg flex-grow-0" @click="copyRootUrl" type="button">
            <span class="tticon-copy-doc btn-icon"></span>
          </button>
        </div>
        <div class="sidebar__content">
          <ul class="sidebar__menu">
            <TheSidebarMenuItem
              v-for="item in menuItems"
              :key="item.name"
              :to="item.path"
              :icon="item.meta.icon"
              :name="item.name"
              :title="item.meta.title"
              :is-url="item.isUrl"
              :is-active="item.name === route.name"
              :has-separator-after="item.meta.hasSeparatorAfter"
              :allowed-user-types="item.meta.allowedUserTypes"
            />
          </ul>
          <div class="sidebar__copyright-area">
            <span class="sidebar__copyright-text">
              <span class="text-english">© {{ new Date().getFullYear() }}</span>
              <span>{{ title }}</span>
            </span>
            <span class="sidebar__copyright-text">جميع الحقوق محفوظة.</span>
            <ul class="meta-list sidebar__meta-list">
              <li class="meta-list__item">
                <a class="meta-list__item-link" :href="privacyPolicyUrl">الخصوصية والأمان</a>
              </li>
              <li class="meta-list__item">
                <a class="meta-list__item-link" :href="termsAndConditionsUrl">شروط الإستخدام</a>
              </li>
            </ul>
          </div>
        </div>
      </aside>
    </div>
  </div>
</template>
<script setup>
import { computed } from 'vue'
import { useRoute } from 'vue-router'
import SideMenuRoutes from './SideMenuRoutes'
import TheSidebarMenuItem from './TheSidebarMenuItem.vue'
 
const route = useRoute()
 
defineProps({
  logo: String,
  title: String,
  platformId: String,
  classic: Boolean,
  privacyPolicyUrl: String,
  termsAndConditionsUrl: String,
})
 
const menuItems = computed(() => {
  const appView = SideMenuRoutes.find((r) => r.name === 'app-view')
  return appView?.children || []
})
 
const copyRootUrl = async () => {
  try {
    await navigator.clipboard.writeText(window.location.origin)
  } catch (err) {
    console.error(err)
  }
}
</script>
 
<!-- SideMenuRoutes Component Code Block -->
const SideMenuRoutes = [{
  path: '/',
  name: 'app-view',
  meta: {
    sidebar: true,
    requiresAuth: true,
    permissions: [],
    breadcrumb: "لوحة المعلومات",
  },
  // component: App,
  children: [{
      name: 'home-view',
      path: '/admin/',
      component: null, // component here
      meta: {
        sidebar: true,
        title: "لوحة القيادة",
        icon: 'tticon-home-charts',
      },
    },
  ]
}]
export default SideMenuRoutes
 
<!-- TheSidebarMenuItem Component Code Block -->
<template>
  <li class="sidebar__menu-item" :class="{ 'sidebar__menu-item--active': isActive }">
    <router-link
      v-if="!isUrl"
      class="sidebar__menu-link"
      :to="to"
      :data-v-step="'sidebar-item-' + name"
    >
      <span class="sidebar__menu-icon" :class="[icon]"></span>{{ title }}
    </router-link>
    <a v-else target="_blank" :href="to" :data-v-step="'sidebar-item-' + name">
      <i :class="[icon]"></i>
      <span>{{ title }}</span>
    </a>
  </li>
  <li v-if="hasSeparatorAfter" class="sidebar__menu-item">
    <hr class="sidebar__menu-separator" />
  </li>
</template>
<script setup>
defineProps({
  to: {
    type: String,
    required: true,
  },
  allowedUserTypes: {
    required: true,
  },
  icon: {
    type: String,
    default: '',
  },
  title: {
    type: String,
    required: true,
  },
  name: {
    type: String,
    required: true,
  },
  isActive: {
    type: Boolean,
    default: false,
  },
  isUrl: {
    type: Boolean,
    default: false,
  },
  hasSeparatorAfter: {
    type: Boolean,
    default: false,
  },
})
</script>

Classic Sidebar

A traditional sidebar layout with a full-width design, detailed labels, and a structured menu hierarchy.

View Mode
                          
HTML
<div class="col-lg sidebar-col sidebar-col--classic"> <div class="offcanvas offcanvas-start sidebar-offcanvas" tabindex="-1" id="sidebar" aria-labelledby="offcanvasExampleLabel"> <aside class="sidebar"> <a class="sidebar__logo-area" href="index.html"> <img class="sidebar__logo-img" src="images/logo-light.svg"> <div class="sidebar__logo-info"> <span class="sidebar__logo-title">رقــمــن</span> <span class="sidebar__logo-desc"> <span>مُعرّف المنصة :</span> <span class="text-english">82384</span> </span> </div> <button class="sidebar__close-btn" data-bs-dismiss="offcanvas" aria-label="Close"> <span class="tticon-x"></span> </button> </a> <div class="btn-group w-100" role="group" aria-label="Basic example"> <a class="btn btn-secondary btn-lg" href="#!" target="_blank"> <span class="tticon-arrow-up-left btn-icon"></span> معاينة المنصة </a> <button class="btn btn-secondary btn-lg flex-grow-0" type="button"> <span class="tticon-copy-doc btn-icon"></span> </button> </div> <ul class="sidebar__menu"> <li class="sidebar__menu-item sidebar__menu-item--active"> <a class="sidebar__menu-link" href="index.html"> <span class="tticon-home-charts sidebar__menu-icon"></span> لوحة القيادة </a> </li> <li class="sidebar__menu-item"> <a class="sidebar__menu-link" href="orders-01.html"> <span class="tticon-docs sidebar__menu-icon"></span> الطلبات </a> </li> <li class="sidebar__menu-item"> <a class="sidebar__menu-link" href="services.html"> <span class="tticon-categories sidebar__menu-icon"></span> إدارة الخدمات </a> </li> <li class="sidebar__menu-item"><hr class="sidebar__menu-separator"></li> <li class="sidebar__menu-item"> <a class="sidebar__menu-link" href="users-01.html"> <span class="tticon-users-two sidebar__menu-icon"></span> المستفيدين </a> </li> <li class="sidebar__menu-item"> <a class="sidebar__menu-link" href="categories.html"> <span class="tticon-tag sidebar__menu-icon"></span> الفئات المستفيدة </a> </li> <li class="sidebar__menu-item"> <a class="sidebar__menu-link" href="structure.html"> <span class="tticon-git sidebar__menu-icon"></span> الهيكلة الإدارية </a> </li> <li class="sidebar__menu-item"><hr class="sidebar__menu-separator"></li> <li class="sidebar__menu-item"> <a class="sidebar__menu-link" href="invoices.html"> <span class="tticon-receipt sidebar__menu-icon"></span> الفواتير والمدفوعات </a> </li> <li class="sidebar__menu-item"> <a class="sidebar__menu-link" href="admins-01.html"> <span class="tticon-user-circle sidebar__menu-icon"></span> المستخدمين </a> </li> <li class="sidebar__menu-item"><hr class="sidebar__menu-separator"></li> <li class="sidebar__menu-item"> <a class="sidebar__menu-link" href="forms.html"> <span class="tticon-doc-edit sidebar__menu-icon"></span> النماذج </a> </li> <li class="sidebar__menu-item"> <a class="sidebar__menu-link" href="pages.html"> <span class="tticon-sticker-note sidebar__menu-icon"></span> صفحات أخرى </a> </li> <li class="sidebar__menu-item"> <a class="sidebar__menu-link" href="articles.html"> <span class="tticon-doc-file sidebar__menu-icon"></span> المقالات </a> </li> <li class="sidebar__menu-item d-xxl-none"><hr class="sidebar__menu-separator"></li> <li class="sidebar__menu-item d-xxl-none ${active11}"> <a class="sidebar__menu-link" href="layout-01.html"> <span class="tticon-grid-vertical sidebar__menu-icon"></span> تنسيق المنصة </a> </li> <li class="sidebar__menu-item d-xxl-none ${active11}"> <a class="sidebar__menu-link" href="setting-01.html"> <span class="tticon-gear sidebar__menu-icon"></span> الإعدادات </a> </li> </ul> <div class="sidebar__copyright-area"> <span class="sidebar__copyright-text"> <span class="text-english">© 2024</span> <span>رقمن.</span> </span> <span class="sidebar__copyright-text">جميع الحقوق محفوظة.</span> <ul class="meta-list sidebar__meta-list"> <li class="meta-list__item"> <a class="meta-list__item-link" href="#!">الخصوصية والأمان</a> </li> <li class="meta-list__item"> <a class="meta-list__item-link" href="#!">شروط الإستخدام</a> </li> </ul> </div> </aside> </div> </div>
<!-- Usage Example -->
<TheSidebarMenu :classic="true" :logo="logo" :title="title" :platform-id="platformId" />
<script setup>
import { ref } from 'vue'
const logo = ref('/images/logo-light.svg')
const title = ref('رقمن')
const platformId = ref('123421')
</script>
<!-- Vue Component Code Block -->
<template>
  <div class="col-lg sidebar-col">
    <div
      class="offcanvas offcanvas-start sidebar-offcanvas"
      :class="{ 'sidebar-col--classic': classic }"
      tabindex="-1"
      id="sidebar"
      aria-labelledby="offcanvasExampleLabel"
    >
      <aside class="sidebar">
        <div class="sidebar__logo-area">
          <img class="sidebar__logo-img" :src="logo" :alt="title" />
          <div class="sidebar__logo-info">
            <span class="sidebar__logo-title">{{ title }}</span>
            <span class="sidebar__logo-desc">مُعرّف المنصة : {{ platformId }}</span>
          </div>
          <button class="sidebar__close-btn" data-bs-dismiss="offcanvas" aria-label="Close">
            <span class="tticon-x"></span>
          </button>
        </div>
        <div class="btn-group w-100" role="group" aria-label="Basic example">
          <a class="btn btn-secondary btn-lg" target="_blank" href="/">
            <span class="tticon-arrow-up-left btn-icon"></span>معاينة المنصة
          </a>
          <button class="btn btn-secondary btn-lg flex-grow-0" @click="copyRootUrl" type="button">
            <span class="tticon-copy-doc btn-icon"></span>
          </button>
        </div>
        <div class="sidebar__content">
          <ul class="sidebar__menu">
            <TheSidebarMenuItem
              v-for="item in menuItems"
              :key="item.name"
              :to="item.path"
              :icon="item.meta.icon"
              :name="item.name"
              :title="item.meta.title"
              :is-url="item.isUrl"
              :is-active="item.name === route.name"
              :has-separator-after="item.meta.hasSeparatorAfter"
              :allowed-user-types="item.meta.allowedUserTypes"
            />
          </ul>
          <div class="sidebar__copyright-area">
            <span class="sidebar__copyright-text">
              <span class="text-english">© {{ new Date().getFullYear() }}</span>
              <span>{{ title }}</span>
            </span>
            <span class="sidebar__copyright-text">جميع الحقوق محفوظة.</span>
            <ul class="meta-list sidebar__meta-list">
              <li class="meta-list__item">
                <a class="meta-list__item-link" :href="privacyPolicyUrl">الخصوصية والأمان</a>
              </li>
              <li class="meta-list__item">
                <a class="meta-list__item-link" :href="termsAndConditionsUrl">شروط الإستخدام</a>
              </li>
            </ul>
          </div>
        </div>
      </aside>
    </div>
  </div>
</template>
<script setup>
import { computed } from 'vue'
import { useRoute } from 'vue-router'
import SideMenuRoutes from './SideMenuRoutes'
import TheSidebarMenuItem from './TheSidebarMenuItem.vue'
 
const route = useRoute()
 
defineProps({
  logo: String,
  title: String,
  platformId: String,
  classic: Boolean,
  privacyPolicyUrl: String,
  termsAndConditionsUrl: String,
})
 
const menuItems = computed(() => {
  const appView = SideMenuRoutes.find((r) => r.name === 'app-view')
  return appView?.children || []
})
 
const copyRootUrl = async () => {
  try {
    await navigator.clipboard.writeText(window.location.origin)
  } catch (err) {
    console.error(err)
  }
}
</script>
 
<!-- SideMenuRoutes Component Code Block -->
const SideMenuRoutes = [{
  path: '/',
  name: 'app-view',
  meta: {
    sidebar: true,
    requiresAuth: true,
    permissions: [],
    breadcrumb: "لوحة المعلومات",
  },
  // component: App,
  children: [{
      name: 'home-view',
      path: '/admin/',
      component: null, // component here
      meta: {
        sidebar: true,
        title: "لوحة القيادة",
        icon: 'tticon-home-charts',
      },
    },
  ]
}]
export default SideMenuRoutes
 
<!-- TheSidebarMenuItem Component Code Block -->
<template>
  <li class="sidebar__menu-item" :class="{ 'sidebar__menu-item--active': isActive }">
    <router-link
      v-if="!isUrl"
      class="sidebar__menu-link"
      :to="to"
      :data-v-step="'sidebar-item-' + name"
    >
      <span class="sidebar__menu-icon" :class="[icon]"></span>{{ title }}
    </router-link>
    <a v-else target="_blank" :href="to" :data-v-step="'sidebar-item-' + name">
      <i :class="[icon]"></i>
      <span>{{ title }}</span>
    </a>
  </li>
  <li v-if="hasSeparatorAfter" class="sidebar__menu-item">
    <hr class="sidebar__menu-separator" />
  </li>
</template>
<script setup>
defineProps({
  to: {
    type: String,
    required: true,
  },
  allowedUserTypes: {
    required: true,
  },
  icon: {
    type: String,
    default: '',
  },
  title: {
    type: String,
    required: true,
  },
  name: {
    type: String,
    required: true,
  },
  isActive: {
    type: Boolean,
    default: false,
  },
  isUrl: {
    type: Boolean,
    default: false,
  },
  hasSeparatorAfter: {
    type: Boolean,
    default: false,
  },
})
</script>
Last updated 3 months ago