Angular 标签、Pills 与手风琴组件 | ng-hub-ui-panels

Angular 内容面板组件,可渲染为标签、pills 或手风琴,支持路由、响应式表单、键盘导航和 CSS 变量。

API 参考

这里是 panels 的完整契约:你可以绑定、监听、投影和设置主题的一切,都集中在一处。接入你需要的部分,自定义你想要的样式——它是 standalone 的,且对 signal 友好。

输入

通过 20 个输入项精细调校 panels。像绑定任意 Angular @Input 一样绑定它们。

名称类型默认值描述
type'tabs' | 'pills' | 'accordion' | 'card''tabs'容器的可视化方式:下划线 tabs、圆角 pills 或堆叠的 accordion 面板。
verticalbooleanfalse将头部条垂直堆叠在内容旁边(tabs / pills 视图)。
justifiedbooleanfalse拉伸各头部以平均分配可用宽度。
scrollablebooleanfalse当头部条溢出时,添加前进/后退滚动按钮。
isKeysAllowedbooleantrue启用键盘导航(方向键 / Home / End / Delete)。
multiplebooleanfalse允许多个面板同时处于激活状态。在 accordion 视图中它们会全部展开;在 tabs/pills 视图中,每个激活的头部都会开启一个可见的面板块,随后的未激活头部会分组停留在该块上方,直到下一个激活的头部开启新的块为止。表单值变为数组。
flushbooleanfalseAccordion 视图:无外边框或圆角的贴边面板。
bindValuestringundefined应用于每个面板的 value 的点分路径,用于获取所发出的表单值(例如 'meta.key')。
compareWith(a: unknown, b: unknown) => boolean(a, b) => a === b用于将表单值与面板值进行匹配的相等判断。
headingstringundefinedhub-panel:纯文本头部。当提供 hubPanelHeading 模板时将被忽略。
appearance'card' | 'alert''card'hub-panel:独立面板的外观——'card'(默认)或语义化的 'alert' 提示。在 tabs/pills/accordion 视图中忽略。
variant'primary' | 'success' | 'danger' | 'warning' | 'info'undefinedhub-panel:提示的语义颜色('primary' | 'success' | 'danger' | 'warning' | 'info')。省略则为中性提示。
valueunknownidhub-panel:当容器用作表单控件时贡献的值。
activeboolean (model)falsehub-panel:双向绑定的激活/展开状态。
disabledbooleanfalsehub-panel:阻止该面板被激活。
removablebooleanfalsehub-panel:显示一个 ✕ 操作提示,并允许使用 Delete 键移除。
routerLinkstring | string[]undefinedhub-panel:将面板转变为由 <router-outlet> 支撑的路由面板。
queryParamsParamsundefinedhub-panel:导航到 routerLink 时附加的查询参数。
pathMatch'route' | 'full''route'hub-panel:用于将路由面板标记为激活的 URL 比较。
customClassstringundefinedhub-panel:同时应用于导航项和面板内容区的额外 CSS 类。

输出

响应 panels 的行为——有 4 个事件可供你挂接逻辑。

名称类型描述
panelChangeEventEmitter<PanelChangeEvent>hub-panels:当用户激活(打开)不同面板时触发。提供 { current, prev }。
selectPanelEventEmitter<PanelComponent>hub-panel:当面板变为激活状态时触发。
deselectPanelEventEmitter<PanelComponent>hub-panel:当面板不再处于激活状态时触发。
removedEventEmitter<PanelComponent>hub-panel:当面板通过 ✕ 按钮或 Delete 键被移除时触发。

模板

打造你自己的样式——3 个模板插槽让你可以投影自定义标记。

名称描述示例
hubPanelHeading将 hub-panel 内的 <ng-template> 标记为该面板的自定义头部(tabs/pills 中的条目链接,accordion 中的展开按钮),以替代纯文本的 heading 输入。<hub-panel> <ng-template hubPanelHeading> <i class="fa-solid fa-gear"></i> Settings <span class="badge text-bg-primary">3</span> </ng-template> Panel content </hub-panel>
hubPanelHeader / hubPanelFooter将 hub-panel 内的元素标记为面板内容的页眉/页脚栏。在所有视图(tabs、pills、accordion、card)中均会渲染,区别于 hubPanelHeading。<hub-panel> <div hubPanelHeader>Card title</div> Card content <div hubPanelFooter>Actions</div> </hub-panel>
type="card"无修饰的卡片可视化:没有导航条,每个面板始终可见。hub-panel 也可以独立使用(在任何 hub-panels 之外),此时它会渲染为一张卡片。<hub-panels type="card"> <hub-panel>…</hub-panel> <hub-panel>…</hub-panel> </hub-panels>

CSS 变量

用 36 个 CSS 变量为每一个像素设置主题。在 :root 处覆盖它们,或将其限定到某个容器范围内。

布局与边框

容器的整体结构:标签条方向、内容内边距以及共享的边框令牌。

变量默认值类型描述
--hub-panels-flex-directionrowstring 标题条相对于内容的方向。 rowrow-reverse
--hub-panels-border-width1pxlength tabs 标签条和激活标签使用的边框宽度。 02px
--hub-panels-border-color#dee2e6color tabs 标签条和内容的边框颜色。 #ced4davar(--bs-border-color)
--hub-panels-border-radius0.375remlength 标签头部和内容的圆角半径。 00.5rem
--hub-panels-content-bg#fffcolor 内容区域的背景。 transparent#f8f9fa
--hub-panels-header-bgvar(--hub-panels-content-bg)color 非激活标题和间隔区域后方 tabs/pills 标签条区域的背景。 #f8f9favar(--bs-tertiary-bg)
--hub-panels-content-box-shadownoneshadow 应用于内容区域包装层的阴影。 none0 0.5rem 1rem rgba(0,0,0,.08)
--hub-panels-content-padding-x1remlength 内容区域的水平内边距。 0.75rem1.5rem
--hub-panels-content-padding-y1remlength 内容区域的垂直内边距。 0.75rem1.5rem

标签头部

单个 tab/pill 头部的排版、间距和颜色状态。

变量默认值类型描述
--hub-panels-tab-font-weight500number 头部标签的字重。 400600
--hub-panels-tab-padding-x1remlength 头部内部的水平内边距。 0.75rem1.25rem
--hub-panels-tab-padding-y0.5remlength 头部内部的垂直内边距。 0.375rem0.75rem
--hub-panels-tab-color#212529color 非激活头部的文本颜色。 #495057var(--bs-body-color)
--hub-panels-tab-bgtransparentcolor 非激活头部的背景;保持透明以透出 --hub-panels-header-bg。 transparent#f8f9fa
--hub-panels-tab-color-active#0d6efdcolor 激活头部的文本颜色。 var(--bs-primary)#0b5ed7
--hub-panels-tab-bg-active#fffcolor 激活头部的背景;默认为内容表面,使激活标签与面板融为一体。 var(--bs-primary)var(--hub-panels-content-bg)
--hub-panels-tab-bg-hover#f8f9facolor 头部悬停时的背景。 #e9eceftransparent
--hub-panels-tab-border-color-active#0d6efdcolor 激活标签的边框颜色。 var(--bs-primary)#0b5ed7
--hub-panels-tab-active-shadow0 -0.25rem 0.5rem rgba(0, 0, 0, 0.06)shadow 水平 boxed tabs 视图中激活标签使用的高度阴影。 none0 -0.25rem 0.75rem rgba(0,0,0,.12)
--hub-panels-tab-active-shadow-vertical-0.25rem 0 0.5rem rgba(0, 0, 0, 0.06)shadow 垂直 boxed tabs 视图中激活标签使用的高度阴影。 none-0.25rem 0 0.75rem rgba(0,0,0,.12)
--hub-panels-tab-focus-ring-colorrgba(13, 110, 253, 0.25)color 键盘聚焦时的聚焦环颜色。 rgba(13,110,253,.4)

Pills

pills 可视化专用的令牌。

变量默认值类型描述
--hub-panels-pill-border-radius50remlength pill 头部的圆角半径。 0.5rem999px
--hub-panels-pill-bg-active#0d6efdcolor 激活 pill 的背景。 var(--bs-primary)#198754
--hub-panels-pill-color-active#fffcolor 激活 pill 的文本颜色。 #fff#000
--hub-panels-pill-gap0.5remlength pill 头部之间的间隙。 0.25rem0.75rem
--hub-panels-pill-content-border-width0length pills 内容卡片的边框宽度;将其设置为共享边框宽度可恢复带边框的面板。 01px
--hub-panels-nav-content-gap1remlength pills 标签条与内容卡片之间的间隙(垂直时为行内间隙)。 0.75rem1.5rem

多选

当 tabs/pills 样式允许同时存在多个激活头部时,基于区块的 multiple 视图的布局。

变量默认值类型描述
--hub-panels-pane-min-width16remlength 内容区域开始水平滚动前每个打开面板的最小宽度。 12rem20rem
--hub-panels-pane-min-height8remlength 垂直布局中每个打开面板的最小高度。 6rem12rem
--hub-panels-pane-gap0length 多个面板区块之间的间隙。 01rem

Accordion 视图

accordion 可视化的令牌。每个令牌都回退到对应的 --hub-accordion-* 变量以保证主题兼容性。

变量默认值类型描述
--hub-panels-accordion-active-color#0c63e4color 展开状态下 accordion 标题的文本颜色。 var(--bs-primary)
--hub-panels-accordion-active-bg#e7f1ffcolor 展开状态下 accordion 标题的背景。 var(--bs-primary-bg-subtle)
--hub-panels-accordion-btn-padding-x1.25remlength 展开按钮的水平内边距。 1rem1.5rem
--hub-panels-accordion-btn-padding-y1remlength 展开按钮的垂直内边距。 0.75rem1.25rem
--hub-panels-accordion-btn-icon-transformrotate(-180deg)string 展开时应用于 chevron 的变换。 rotate(180deg)scaleY(-1)
--hub-panels-accordion-collapse-transition-duration0.25stransition 展开/折叠动画的持续时间。 0.2s0.35s

样式与主题

尚未记录任何样式示例。本节将包含自定义方案和主题示例。