npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@cimom/vben-core-layout-ui

v5.6.8

Published

Layout UI 组件是一个基于 Vue 3 的高度可定制化布局组件,提供了多种布局模式,支持响应式设计、侧边栏折叠、头部固定等功能。

Readme

Layout UI 组件

Layout UI 组件是一个基于 Vue 3 的高度可定制化布局组件,提供了多种布局模式,支持响应式设计、侧边栏折叠、头部固定等功能。

安装

npm install @cimom/vben-core-ui-kit-layout-ui

基本使用

<script setup lang="ts">
import { VbenLayout } from '@cimom/vben-core-ui-kit-layout-ui';
import { ref } from 'vue';

const sidebarCollapse = ref(false);
</script>

<template>
  <VbenLayout v-model:sidebarCollapse="sidebarCollapse" layout="sidebar-nav">
    <template #header>
      <div>头部内容</div>
    </template>
    <template #sidebar>
      <div>侧边栏内容</div>
    </template>
    <template #default>
      <div>主要内容区域</div>
    </template>
    <template #footer>
      <div>页脚内容</div>
    </template>
  </VbenLayout>
</template>

组件属性

VbenLayout Props

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | layout | string | 'sidebar-nav' | 布局模式 | | headerHeight | number | 50 | 头部高度 | | headerVisible | boolean | true | 头部是否可见 | | headerHidden | boolean | false | 头部是否隐藏 | | headerMode | string | 'fixed' | 头部模式,可选值: 'fixed', 'static', 'auto', 'auto-scroll' | | headerToggleSidebarButton | boolean | true | 是否显示头部切换侧边栏按钮 | | sidebarWidth | number | 180 | 侧边栏宽度 | | sideCollapseWidth | number | 60 | 侧边栏折叠时的宽度 | | sidebarMixedWidth | number | 80 | 混合模式下侧边栏宽度 | | sidebarHidden | boolean | false | 侧边栏是否隐藏 | | sidebarCollapsedButton | boolean | true | 是否显示侧边栏折叠按钮 | | sidebarCollapseShowTitle | boolean | false | 侧边栏折叠时是否显示标题 | | sidebarFixedButton | boolean | true | 是否显示侧边栏固定按钮 | | sidebarTheme | string | 'dark' | 侧边栏主题 | | sidebarExtraCollapsedWidth | number | 60 | 扩展侧边栏折叠时的宽度 | | footerEnable | boolean | false | 是否启用页脚 | | footerFixed | boolean | true | 页脚是否固定 | | footerHeight | number | 32 | 页脚高度 | | tabbarEnable | boolean | true | 是否启用标签栏 | | tabbarHeight | number | 40 | 标签栏高度 | | contentCompact | string | 'wide' | 内容区域紧凑模式 | | contentCompactWidth | number | 1200 | 内容区域紧凑模式下的宽度 | | contentPadding | number | 0 | 内容区域内边距 | | contentPaddingTop | number | 0 | 内容区域上内边距 | | contentPaddingRight | number | 0 | 内容区域右内边距 | | contentPaddingBottom | number | 0 | 内容区域下内边距 | | contentPaddingLeft | number | 0 | 内容区域左内边距 | | isMobile | boolean | false | 是否为移动设备 | | zIndex | number | 200 | z-index 值 |

v-model 绑定属性

| 属性名 | 类型 | 默认值 | 说明 | | -------------------- | --------- | ------- | ---------------------- | | sidebarCollapse | boolean | false | 侧边栏是否折叠 | | sidebarEnable | boolean | true | 侧边栏是否启用 | | sidebarExpandOnHover | boolean | false | 侧边栏是否在悬停时展开 | | sidebarExtraVisible | boolean | - | 扩展侧边栏是否可见 | | sidebarExtraCollapse | boolean | false | 扩展侧边栏是否折叠 |

事件

| 事件名 | 参数 | 说明 | | -------------- | ---- | -------------------- | | sideMouseLeave | - | 鼠标离开侧边栏时触发 | | toggleSidebar | - | 切换侧边栏时触发 |

插槽

| 插槽名 | 说明 | | ------------ | -------------------------- | | default | 默认插槽,用于放置主要内容 | | header | 头部内容 | | headerLeft | 头部左侧内容 | | headerRight | 头部右侧内容 | | sidebar | 侧边栏内容 | | sidebarExtra | 扩展侧边栏内容 | | tabbar | 标签栏内容 | | footer | 页脚内容 |

布局模式

Layout UI 组件支持多种布局模式:

  • sidebar-nav: 侧边栏导航模式
  • header-nav: 顶部导航模式
  • mixed-nav: 混合导航模式
  • sidebar-mixed-nav: 侧边栏混合导航模式
  • header-mixed-nav: 顶部混合导航模式
  • header-sidebar-nav: 顶部侧边栏导航模式
  • full-content: 全屏内容模式

示例

侧边栏导航模式

<template>
  <VbenLayout
    v-model:sidebarCollapse="sidebarCollapse"
    v-model:sidebarExpandOnHover="sidebarExpandOnHover"
    layout="sidebar-nav"
    :headerHeight="60"
    :sidebarWidth="200"
    :sideCollapseWidth="64"
  >
    <template #header>
      <div class="flex h-full items-center px-4">
        <h1 class="text-xl font-bold">管理系统</h1>
        <div class="flex-1"></div>
        <div class="flex items-center space-x-4">
          <span>用户名</span>
          <button>退出</button>
        </div>
      </div>
    </template>

    <template #sidebar>
      <div class="p-2">
        <div class="mb-2 rounded px-4 py-2 hover:bg-gray-100">首页</div>
        <div class="mb-2 rounded px-4 py-2 hover:bg-gray-100">用户管理</div>
        <div class="mb-2 rounded px-4 py-2 hover:bg-gray-100">系统设置</div>
      </div>
    </template>

    <template #default>
      <div class="p-4">
        <h2 class="mb-4 text-lg font-bold">内容区域</h2>
        <p>这是主要内容区域</p>
      </div>
    </template>

    <template #footer>
      <div class="text-center text-sm text-gray-500">© 2025 管理系统</div>
    </template>
  </VbenLayout>
</template>

<script setup lang="ts">
import { VbenLayout } from '@cimom/vben-core-ui-kit-layout-ui';
import { ref } from 'vue';

const sidebarCollapse = ref(false);
const sidebarExpandOnHover = ref(true);
</script>

混合导航模式

<template>
  <VbenLayout
    v-model:sidebarCollapse="sidebarCollapse"
    layout="mixed-nav"
    :headerHeight="60"
    :sidebarMixedWidth="80"
    :sidebarWidth="200"
  >
    <template #header>
      <div class="flex h-full items-center px-4">
        <h1 class="text-xl font-bold">管理系统</h1>
        <div class="flex-1"></div>
        <div class="flex items-center space-x-4">
          <span>用户名</span>
          <button>退出</button>
        </div>
      </div>
    </template>

    <template #sidebar>
      <div class="flex flex-col items-center py-4">
        <div class="mb-4 cursor-pointer p-4">
          <svg
            class="h-6 w-6"
            fill="none"
            stroke="currentColor"
            viewBox="0 0 24 24"
          >
            <path
              stroke-linecap="round"
              stroke-linejoin="round"
              stroke-width="2"
              d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"
            ></path>
          </svg>
          <div class="mt-1 text-xs">首页</div>
        </div>
        <div class="mb-4 cursor-pointer p-4">
          <svg
            class="h-6 w-6"
            fill="none"
            stroke="currentColor"
            viewBox="0 0 24 24"
          >
            <path
              stroke-linecap="round"
              stroke-linejoin="round"
              stroke-width="2"
              d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"
            ></path>
          </svg>
          <div class="mt-1 text-xs">用户</div>
        </div>
        <div class="cursor-pointer p-4">
          <svg
            class="h-6 w-6"
            fill="none"
            stroke="currentColor"
            viewBox="0 0 24 24"
          >
            <path
              stroke-linecap="round"
              stroke-linejoin="round"
              stroke-width="2"
              d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"
            ></path>
            <path
              stroke-linecap="round"
              stroke-linejoin="round"
              stroke-width="2"
              d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
            ></path>
          </svg>
          <div class="mt-1 text-xs">设置</div>
        </div>
      </div>
    </template>

    <template #sidebarExtra>
      <div class="p-2">
        <div class="mb-2 rounded px-4 py-2 hover:bg-gray-100">用户列表</div>
        <div class="mb-2 rounded px-4 py-2 hover:bg-gray-100">角色管理</div>
        <div class="mb-2 rounded px-4 py-2 hover:bg-gray-100">权限设置</div>
      </div>
    </template>

    <template #default>
      <div class="p-4">
        <h2 class="mb-4 text-lg font-bold">用户管理</h2>
        <p>这是用户管理页面的内容</p>
      </div>
    </template>
  </VbenLayout>
</template>

<script setup lang="ts">
import { VbenLayout } from '@cimom/vben-core-ui-kit-layout-ui';
import { ref } from 'vue';

const sidebarCollapse = ref(false);
</script>

响应式布局

<template>
  <VbenLayout
    v-model:sidebarCollapse="sidebarCollapse"
    layout="sidebar-nav"
    :isMobile="isMobile"
    :headerHeight="60"
    :sidebarWidth="200"
    :sideCollapseWidth="64"
  >
    <!-- 布局内容 -->
  </VbenLayout>
</template>

<script setup lang="ts">
import { VbenLayout } from '@cimom/vben-core-ui-kit-layout-ui';
import { ref, onMounted, onUnmounted } from 'vue';

const sidebarCollapse = ref(false);
const isMobile = ref(false);

const checkIsMobile = () => {
  isMobile.value = window.innerWidth < 768;
  if (isMobile.value) {
    sidebarCollapse.value = true;
  }
};

onMounted(() => {
  checkIsMobile();
  window.addEventListener('resize', checkIsMobile);
});

onUnmounted(() => {
  window.removeEventListener('resize', checkIsMobile);
});
</script>