@fiscozen/layout

中文文档
1.4.6发布于 2026/10/23MITES Module近 30 天下载 2622

设计系统布局组件

中文使用文档
文档目录14 节
  1. FzLayout ——网格原始(组织)
  2. 地区(山区)
  3. FzLayoutMain
  4. FzLayoutHeader • 妇女 FzLayoutAside • 妇女 FzLayoutFooter
  5. FzLayoutBottomBar
  6. 页面模板
  7. FzBlankTemplate
  8. FzFocusTemplate
  9. FzListTemplate
  10. FzDetailTemplate
  11. FzAppTemplate
  12. FzFrameTemplate
  13. 布局显示( E) layouts.json (中文(简体) )
  14. 稳定和贡献政策

@fiscozen/放电

Vue 3应用的布局构件,由原子设计层组织.

FzLayout ——网格原始(组织)

基于网格的布局组件提供多种布局变体(例如. oneColumn, (中文(简体) ), twoColumns, (中文(简体) ), multipleAreas, (中文(简体) ), threeColumns(d) 涵盖共同 页面结构。 默认情况下铺设; 选择退出 disablePadding 供血满地的地区使用.

地区(山区)

仅以页为单位的页块的演示文稿 模板。 区域建设 刚刚来 与他们的第一模板 而不是作为投机图书馆.

FzLayoutMain

"主"内容区域. 生成语义 <main> 地标和集权 区域一级的关切.

Prop类型默认说明
as'main' | 'div''main'该区域形成的要素是: 覆盖到 'div' 当它不是页面 main。 。 。 .
align'stretch' | 'top' | 'center''stretch'区域内的内容调整.
safeAreabooleanfalse由设备安全区域内设( S)env(safe-area-inset-*)(c) 指针/家庭指标.

FzLayoutHeader • 妇女 FzLayoutAside • 妇女 FzLayoutFooter

用于上行的细微语义包装( S)<header> 横幅),互补 (单位:千美元)<aside>)和页脚(<footer> 内容info)区域. 他们使 地标元素和稳定的类钩; 特定布局大小/铺设 由编译模板应用。 每一个都接受一个 as 道具 — 键入 其标志性要素或 'div' ——当页面不能覆盖时,要覆盖元素 两次揭露那个地标.

FzLayoutBottomBar

粘性底部动作栏区域. 按模板放在主机内 内容栏, 它 position: stickys 到页面的视图下方 卷轴,在流量中保留自己的高度(因此空条倒塌,没有) 需要手动打底板)。 它没有背景,没有垫子 安全区域设置: 条状内容涂上表面, 所以它贴上 env(safe-area-inset-bottom) 本身及其背景到达设备边缘. 集装箱是 pointer-events: none 所以水龙头会穿过空地; 其直接子女再次互动。 它不需要道具 并暴露它的 根元素为 el 所以一个模板可以把它用作下巴的远程传送目标.

页面模板

完整页面, 仅选择演示文稿 <router-view> 级别。 他们 渲染帧 + 区域并曝光命名的槽; 应用程序以 它自己的生物体(导航,聊天,标题,动作),拥有所有逻辑.

FzBlankTemplate

无铬的全血模板——单一全高含量区域 没有别的了。 用于认证/登录屏幕和建立自己的独立工具 自成一体的UI. 它拥有一个全高的根(min-h-dvh),所以它确实如此 没有 依赖于全球应用 #app { height: 100% } 编号 : overflow-y: auto CSS 状态 现相.

Prop类型默认说明
align'center' | 'top''center'内容坐落在全高页内的地方.
<template>
  <FzBlankTemplate align="center">
    <LoginCard />
  </FzBlankTemplate>
</template>

FzFocusTemplate

引导流动(入职)和认证的分流减少流量模板 屏幕。 中心主区域,可选由 topbar, (中文(简体) ), aside 财务报告和审定财务报表 footer (每个项目只提供其槽 aside 下方的堆栈 在狭长的取景口上的内容 坐在旁边 lg 起来 拥有 a 全高根并应用安全区域内设.

Prop类型默认说明
chrome'card' | 'flat''card'内容框架. card = 包含最大宽度的卡; flat =满血 (秋季).

槽数 : topbar,默认值(中心内容), aside, (中文(简体) ), footer。 。 。 .

<template>
  <FzFocusTemplate chrome="card">
    <template #topbar><OnboardingTopBar /></template>
    <OnboardingStep />
    <template #aside><SupportChatPanel /></template>
  </FzFocusTemplate>
</template>

FzListTemplate

后台列表-页面布局——列表页面的反复出现形状:可选 全宽 banner (警报,动作卡),可选 filters 铁路,一个 选项 header 工具栏(标题/搜索/行动)和列表内容本身 (一般为: FzTable) (中文(简体) ). 每一区域只有在提供其时间档时才产生.

与上面的模板不同,这是 页面内容 模板设计为 在弹壳的主要区域内制造,所以 没有 强制视图高度 或应用 root- safe-rea 设置—— shell 拥有滚动容器和设备 安全区域。 它构成区域分子(FzLayoutAside + 键 FzLayoutMain(中文(简体) ) 用文档滚动而不是 FzLayout leftShoulder,哪些力量 100vh 移动轨道和独立的每个区域滚动.

Prop类型默认说明
filtersPosition'left' | 'top''left'left = 在内容旁的固定宽度铁路 md 上行(上行移动); top =全线行.
filtersLabelstring—— 说可访问名称( N)aria-label用于 filters 铁路 complementary 标志性。 当页面暴露出不止一个互补区域(如自有外壳入巢)时设定,因此屏幕阅读器用户可以将其区分开来.
mainAs'main' | 'div''main'内容区域是 。 设定为 'div' 当在已经拥有的外壳内筑巢 <main>。 。 。 .

槽数 : banner, (中文(简体) ), filters, (中文(简体) ), header,默认值(列表内容).

<template>
  <FzListTemplate filters-position="left">
    <template #banner><OutOfPeriodAlert /></template>
    <template #filters><VatDeclarationFilters /></template>
    <template #header><ListTitleAndSearch /></template>
    <FzTable v-bind="tableProps" />
  </FzListTemplate>
</template>

FzDetailTemplate

后台详细页面布局——兄弟关系 FzListTemplate (LIB-2694) (英语). 何处 列表页面对 a 过滤器 带有表格的栏杆,详细页面对一持久 sidebar 简易/折叠铁路(记录的身份、状况、元和行动) 与记录的内容(通常为 FzTabs编号 :FzCard页:1 这也暴露了一种 可选全宽 banner (页数提醒)和可选 toolbar (标题/行动). 每个区域只有在提供槽后才能制作;以上简易铁路堆放 尸体在狭长的取景口上 坐在旁边 md 起来.

喜欢 FzListTemplate,这是一个 页面内容 用于渲染的模板 在炮弹的主要区域,所以它确实 没有 强迫视图高度或应用 root- safe-rea insets——贝壳拥有滚动容器和装置安全区域. 它构成区域分子(FzLayoutAside + 键 FzLayoutMain)带有文档 滚动而不是 FzLayout leftShoulder,哪些力量 100vh 移动轨道和 独立区域卷轴.

Prop类型默认说明
sidebarLabelstring—— 说可访问名称( N)aria-label用于 sidebar是因为 complementary 标志性。 当页面暴露出不止一个互补区域时设定(例如用自己的外壳嵌入),所以屏幕读者将它们分解.
mainAs'main' | 'div''main'内容区域是 。 设定为 'div' 当在已经拥有的外壳内筑巢 <main>。 。 。 .

槽数 : banner, (中文(简体) ), sidebar, (中文(简体) ), toolbar,默认值(细节正文). 这个 toolbar 地区是一个平坦的容器, 没有 (单位:千美元) <header>/班纳地标-外壳 拥有页面横幅.

<template>
  <FzDetailTemplate sidebar-label="Riepilogo dichiarazione">
    <template #banner><NotYetSentAlert /></template>
    <template #sidebar><VatDeclarationSummary /></template>
    <template #toolbar><DetailTitleAndActions /></template>
    <FzTabs>
      <FzTab title="Dichiarazione">…</FzTab>
      <FzTab title="F24">…</FzTab>
    </FzTabs>
  </FzDetailTemplate>
</template>

属性转发 . FzBlankTemplate单根 实值 联合国 <main> 区域,因此通过属性aria-label, (中文(简体) ), id, (中文(简体) ), data-*着陆在那上面 <main>。 。 。 . FzFocusTemplate, (中文(简体) ), FzListTemplate 财务报告和审定财务报表 FzDetailTemplate 有个 非地标容器 <div> 作为他们的根,所以倒下 属性土地在 那个集装箱, 没有 在内心 <main> - 如果 main 需要无障碍名称.

FzAppTemplate

持久导航应用外壳(前台标准布局). 框架 a 持久性 nav,可选粘贴 header,主要内容,可选 辅助 aside,可选粘性底层动作栏和可选 footer。从 desktop 断点(1200px)上方,导航为左粘度 栏杆和边上有一个粘着的右面板——它们的宽度沿着 已注射 内容,绝不是模板。 这个 导航持续 (移动顶级区域); 输入式导航,例如. FzNavbar 拥有自己的反应能力 和汉堡,所以模板 使没有导航抽屉。 下面 导航区域是 sticky 时间 z-10,粘着的盒子就是堆放 上下文,不管其z-index:覆盖所注入的导航打开(全屏) 菜单)不能高于后一个 z-10 从里面的铬,所以电传到 body 在抽屉一级z-30) (中文(简体) ). 只有 让开 在断点下方倒塌,进入一个模式抽屉(role="dialog" + 键 aria-modal +焦点陷阱 + Escape-to-close). 拥有全高根并适用 其粘稠的染色体有定向安全区域被套入.

Prop类型默认说明
hasAsidebooleanfalse将辅助设备放在一边(桌面面板/移动抽屉).
hasBottomBarbooleantrue将粘稠的下巴区域引入,并提供其远程传送目标.
chrome'card' | 'flat''card'内容框架. card * 含有白卡; flat =满出血.
contentWidth'standard' | 'wide' | 'full''standard'主内容栏宽度( 替换应用程序的旧 wideLayout) (中文(简体) ).
asideLabelstring—— 说当它是一个模式抽屉(移动)时,可以调取它的名称.

槽数 : nav, (中文(简体) ), header,默认(内容), aside, (中文(简体) ), bottomBar, (中文(简体) ), footer编辑 nav, (中文(简体) ), header 财务报告和审定财务报表 aside 槽接收响应的切换道具 { isDesktop, asideOpen, toggleAside }。 。 。 .

<template>
  <FzAppTemplate has-aside class="bg-[#f7f6f3]">
    <!-- FzNavbar renders its own rail (desktop) / bar + hamburger (mobile) -->
    <template #nav><AppNavigation /></template>
    <template #header="{ toggleAside }">
      <PageTitleBar @help="toggleAside(true)" />
    </template>
    <RouterView />
    <template #aside><SupportChatPanel /></template>
  </FzAppTemplate>
</template>

底巴远程运输合同FZ_BOTTOM_BAR_TARGET(中文(简体) )

FzAppTemplate provide()s 其下行区域元素 FZ_BOTTOM_BAR_TARGET,所以深页组件可以在 shell level 没有应用程序拥有魔法 DOM ID. 模板拥有该栏 几何( 它自动对齐内容列); 页面拥有 内容,包括其底层安全区设置(见 FzLayoutBottomBar) (中文(简体) ). 警卫 页:1 null 案件 - 这意味着没有 FzAppTemplate 祖师相.

import { inject } from 'vue'
import { FZ_BOTTOM_BAR_TARGET } from '@fiscozen/layout'

const bottomBarTarget = inject(FZ_BOTTOM_BAR_TARGET, null)
// <Teleport v-if="bottomBarTarget" :to="bottomBarTarget" defer> …actions… </Teleport>

见 docs/RFC/layout/bottom-bar-adr.md 以备决定记录.

FzFrameTemplate

这个 后台应用程序框架: 持久图标 nav 铁栏杆,一丝不挂 应用程序级 header 工具栏、页面和可选400px aside 持有工具 随处可见。 页面布局巢 内部 默认位置.

它存在的原因是高度契约,而不是铬. 每一个 贝壳在这里 min-h-dvh + 文档滚动 – 具有 无限期 高度,其中a fills-parent 版式 (FzThreeColumnsTemplate(中文(简体) ) 倒数倒数为零,从不滚动区域。 这个外壳反转模型: 根为 h-dvh 财务报告和审定财务报表 剪辑,以及 contentHeight 选择与内容订约的 区域提议.

contentHeight区域对于
scroll (默认)是应用程序的 单滚动容器 ——文档滚动从窗口移动到其中以一页显示并滚动的页面: FzListTemplate, (中文(简体) ), FzDetailTemplate,以文档滚动方式写入的页面
bounded有一个 确定高度和夹片填充框架并滚动它自己的区域的一页: FzThreeColumnsTemplate

因为开关是每页的,所以迁移是递增的:一个页面选择使用 bounded 当它被移植的时候,其他的一页都没有被移动.

框架是下面一栏 lg (1024px)及其上方一行,为CSS. lg 而不是现在 desktop 1200px) 断点 FzAppTemplate 使用,因为 注入导航 开关时间 lg: 保存在左一列过去, FzNavbar紧凑的条条收缩到一个树枝上.

Prop类型默认说明
contentHeight'scroll' | 'bounded''scroll'高度合同交给内容区(见上文).
chrome'card' | 'flat''card'card = 嵌入的白色表面; flat =满出血.
background'page' | 'transparent''page'铬后页背景.
hasAsidebooleanfalse调整工具面板区域.
navLabelstring—— 说可读名称 <nav> 标志性.
asideLabelstring—— 说侧面的无障碍名称 complementary 标志性.

槽数 : nav, (中文(简体) ), header,默认值(页), aside。铬槽接收 { isDesktop, asideOpen, toggleAside }; 面板的开口状态是 v-model:asideOpen。 。 。 .

chrome 是故意的,这是故意的 直肠 改为 contentHeight,没有一个"正在迁移" 旗帜: 移植到 FzListTemplate 仍然随区域滚动(scroll(中文(简体) ) 但应让框架拥有其容器(card) (中文(简体) ). 绘制自己的页面 集装箱停留 flat,或两个带有一行页面背景的白盒堆栈 他们之间.

<template>
  <FzFrameTemplate
    v-model:aside-open="toolsOpen"
    :content-height="route.meta.contentHeight ?? 'scroll'"
    :chrome="route.meta.chrome ?? 'flat'"
    has-aside
    nav-label="Navigazione principale"
    aside-label="Strumenti"
  >
    <template #nav><AppNavigation /></template>
    <template #header="{ asideOpen, toggleAside }">
      <FrameToolbar :aside-open="asideOpen" @toggle-tools="toggleAside()" />
    </template>
    <RouterView />
    <template #aside="{ toggleAside }">
      <ToolsPanel @close="toggleAside(false)" />
    </template>
  </FzFrameTemplate>
</template>

工具面板是一个 页面的兄弟关系不是每一页都能做的 所以 里面装有的东西 保持整个导航状态 没有全球储存 它被隐藏在 v-show 而不是卸载,所以它保持状态 过近/开放.

页面滚动合同FZ_PAGE_SCROLL_TARGET(中文(简体) )

下 contentHeight="scroll" 页:1 窗口不再滚动: 内容 地区确实如此。 这么说吧 window.scrollTo(0, 0) 成为无操作,并浏览器滚动 返回/向前恢复——只恢复文档滚动器—— 停止到达页面。 壳 provide()s 区域元素使应用程序能够 滚动页面并将其路由器接线 scrollBehavior 反对它。 守卫 null 例:指没有贝壳祖先拥有卷轴容器.

import { inject } from 'vue'
import { FZ_PAGE_SCROLL_TARGET } from '@fiscozen/layout'

const pageScroll = inject(FZ_PAGE_SCROLL_TARGET, null)
// pageScroll?.value?.scrollTo({ top: 0 })

这两项合同都提供了这一要素,但仅提供了 滚动 下级 scroll数字 : 下级 bounded 区域剪辑和嵌入式布局 滚动自己的区域,所以 联合国 scrollTop 保留0. scrollIntoView 呼叫站点无论哪种方式都不受影响—— 他们走到最近的可滚动的祖先.

关于"尾风"预飞的说明

这外壳是故意的 独立于尾风飞行前和任何东西 增加的内容必须如此: border-solid 财务报告和审定财务报表 box-border 明确而不是依赖重置。 后台瞄准镜 .twp 类,而将该类放在页槽的祖先上将适用 一次重置成数百个遗留部件 应用程序显示 twp 独自一人 位置内容代替.

见 docs/RFC/layout/frame-shell-promotion.md 以备决定记录.

布局显示( E)layouts.json(中文(简体) )

除了组件, 本套件还发布 layouts.json: 每种布局的机器可读描述 它输出——每一页是什么形状的,它与它混淆,它是如何形成的 确定它的高度, 哪些宿主被证实在其中的巢穴 它的能力是无法达到的,根据一种只作曲的造型政策.

由 代理设计 插件在会话开始时读取 回答任何设计实施的第一个问题—— 哪个布局应该 此页面使用 ? ——所以在此添加的布局可以选择在 org 上 任何消耗性还款都没有变化.

它的合约是JSON Schema ds-layouts.schema.json,哪个 layouts.json 参考文献 $schema。 。 。 . src/__tests__/layouts.manifest.spec.ts 验证 与真主同受刑罚的 src/index.ts 和与 Fz…Slots 类型。 插件拥有计划; 这里的复制件是 逐字可以检测出漂移 见 CLAUDE.md 此软件包之前 更改任一文件.

稳定和贡献政策

这个包裹有意将网格原始,区域分子,和 前台和后台应用程序依赖于 撞倒它 撞倒它 撞倒它 独立使公众表面共享, 跨repo合同(RFC 第10节):

  • 对已公布组件的更改必须是添加剂. 新建可选道具( 有 默认、新插槽和新组件都很好, 插槽或导出,使所需的可选道具,或缩小道具 已接受的值为 断开 并且不允许没有协调的 前台+后台迁移.
  • 取出前作折旧. 标记旧 API @deprecated 在未成年人中 释放,保持它的工作, 并只去除它在随后的主修.
  • 每艘变更船都有一个正确起落平分的变更集;运行 pnpm release:check:pending 在发布前预览级联.

见 docs/RFC/layout/page-templates-extraction.md §10作为理由——这是项目困难的制约因素,而不是偏好.

版本与发布记录

@fiscozen/layout 共发布 27 个版本,首次发布于 2024/11/06;过去 12 个月发布了 18 个版本。

版本发布日期距今
1.4.6latest2026/10/2323 天前
1.4.52026/10/2026 天前
1.4.42026/09/291 个月前
1.4.32026/09/281 个月前
1.4.22026/09/221 个月前
1.4.12026/09/142 个月前

其他发布通道:beta → 0.1.3-alpha.2。

关于 @fiscozen/layout 的常见问题

@fiscozen/layout 是什么?

设计系统布局组件

如何安装 @fiscozen/layout?

在项目目录运行 npm install @fiscozen/layout,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:vue(^3.4.13)、tailwindcss(^3.4.1)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@fiscozen/layout 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/fiscozen__layout 是否存在。

@fiscozen/layout 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@fiscozen/layout 可以商用吗?

@fiscozen/layout 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@fiscozen/layout 的下载量有多少?

根据 npm 官方下载统计,@fiscozen/layout 在 2026/10/15 – 2026/11/13 这 30 天内被下载 2,622 次,日均约 87 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@fiscozen/layout 还在维护吗?

最新版本 1.4.6 发布于 2026/10/23(23 天前);至今共发布 27 个版本,其中过去 12 个月发布了 18 个;首次发布于 2024/11/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。