Angular Tabs, Pills & Accordion | ng-hub-ui-panels

Angular Content-Panels-Komponente, die sich als Tabs, Pills oder Accordion rendert, mit Routing, Reactive Forms, Tastaturnavigation und CSS-Variablen.

API-Referenz

Hier ist der vollständige Vertrag für panels: alles, was du binden, abhören, projizieren und gestalten kannst, an einem Ort gesammelt. Verdrahte, was du brauchst, und gestalte, was du willst — es ist standalone und Signals-freundlich.

Inputs

Stelle panels mit 40 Inputs ein. Binde sie wie jeden Angular-@Input.

NameTypStandardBeschreibung
type'tabs' | 'pills' | 'accordion' | 'card''tabs'Visualisierung des Containers: unterstrichene Tabs, abgerundete Pills, gestapelte Accordion-Panels oder rahmenlose, stets sichtbare Cards.
verticalbooleanfalseStapelt die Header-Leiste vertikal neben dem Inhalt (Tabs-/Pills-Ansichten).
justifiedbooleanfalseStreckt die Header, sodass sie sich die verfügbare Breite gleichmäßig teilen.
scrollablebooleanfalseFügt Zurück-/Vorwärts-Scroll-Schaltflächen hinzu, wenn die Header-Leiste überläuft.
isKeysAllowedbooleantrueAktiviert die Tastaturnavigation (Pfeiltasten / Home / End / Delete).
multiplebooleanfalseErlaubt, dass mehrere Panels gleichzeitig aktiv sind. In der Accordion-Ansicht werden sie alle aufgeklappt; in den Tabs-/Pills-Ansichten startet jeder aktive Header einen sichtbaren Panel-Block, und die folgenden inaktiven Header bleiben über diesem Block gruppiert, bis der nächste aktive Header einen neuen startet. Der Formularwert wird zu einem Array.
flushbooleanfalseAccordion-Ansicht: randlose Panels ohne äußere Rahmen oder Eckenradius.
togglePosition'start' | 'end''end'Auf <hub-panels> (Accordion-Ansicht): auf welcher Seite der Kopfzeile der Chevron sitzt. „end“ (Standard) folgt der Überschrift, „start“ führt sie an. Nur die visuelle Reihenfolge ändert sich — das DOM bleibt unberührt — und die Abstände sind logisch, sodass „start“ in LTR der linke und in RTL der rechte Rand ist. Den app-weiten Standard setzt HubPanelsConfig.togglePosition.
variantHubPanelVariant | stringundefinedhub-panels: semantischer Akzent der Navigationsleiste — der aktive bzw. gehoverte Tab, die aktive Pill und der aktive Accordion-Header folgen ihm. Die eingebauten Werte ('primary' | 'success' | 'danger' | 'warning' | 'info') nutzen die Töne des Designsystems, es wird aber jeder String akzeptiert: die Leiste liest --hub-sys-color-<variant> aus deiner Anwendung. Standard ist primary.
bindValuestringundefinedPunktnotationspfad, der auf den Wert jedes Panels angewendet wird, um den ausgelösten Formularwert zu erhalten (z. B. 'meta.key').
compareWith(a: unknown, b: unknown) => boolean(a, b) => a === bGleichheit, die verwendet wird, um Formularwerte mit Panel-Werten abzugleichen.
headingstringundefinedhub-panel: Klartext-Header. Wird ignoriert, wenn ein hubPanelHeading-Template angegeben ist.
appearance'card' | 'alert''card'hub-panel: Darstellung eines eigenständigen Panels – 'card' (Standard) oder ein semantischer 'alert'-Hinweis. In den Tabs-/Pills-/Accordion-Ansichten ignoriert.
variantHubPanelVariant | stringundefinedhub-panel: semantischer Akzent des Panels — er färbt ein alert und tönt eine ganze card (als data-variant gespiegelt). Die eingebauten Werte ('primary' | 'success' | 'danger' | 'warning' | 'info') nutzen die Töne des Designsystems, es wird aber jeder String akzeptiert: das Panel liest --hub-sys-color-<variant> aus deiner Anwendung. Für ein neutrales Panel weglassen.
fillbooleanfalseNur Card-Panel: füllt die Höhe des Elternelements und lässt den Body scrollen, sodass ein innerer flex:1/min-height:0-Bereich (z. B. eine Tab-Leiste + Scroll-Bereich) begrenzt ist. Das Elternelement muss eine Flex-Spalte sein.
standaloneboolean (static attribute)falseNur Card-Panel, statisches Attribut: nimmt ein loses <hub-panel> aus einer übergeordneten tabs/pills/accordion-Gruppe im selben Template heraus, sodass es als einfache Card gerendert wird, statt als verstecktes Tab eingefangen zu werden.
idstring'hub-panel-<n>'hub-panel: Id für die ARIA-Zuordnung zwischen einem Tab und seinem Panel (bzw. einem Accordion-Header und seiner Region). Wird automatisch als hub-panel-<n> erzeugt; setze sie, wenn du stabile Ids brauchst — für einen Deep Link oder ein eigenes aria-controls.
valueunknownidhub-panel: Wert, der beigetragen wird, wenn der Container als Formularsteuerelement verwendet wird.
activeboolean (model)falsehub-panel: zwei-Wege-gebundener aktiver/aufgeklappter Zustand.
disabledbooleanfalsehub-panel: verhindert, dass das Panel aktiviert wird.
removablebooleanfalsehub-panel: zeigt ein ✕-Element an und ermöglicht das Entfernen mit der Delete-Taste.
removeLabelstring'Remove panel'hub-panel: zugänglicher Name (aria-label), der für die ✕-Schaltfläche zum Entfernen angekündigt wird; überschreiben Sie ihn, um das Element zu lokalisieren.
routerLinkstring | string[]undefinedhub-panel: verwandelt das Panel in ein geroutetes Panel, das von einem <router-outlet> unterstützt wird.
queryParamsParamsundefinedhub-panel: Query-Parameter, die beim Navigieren zu routerLink angehängt werden.
pathMatch'route' | 'full''route'hub-panel: URL-Vergleich, der verwendet wird, um ein geroutetes Panel als aktiv zu markieren.
customClassstringundefinedhub-panel: zusätzliche CSS-Klassen, die sowohl auf das Nav-Element als auch auf den Bereich angewendet werden.
itemsHubTabNavItem[][]Die auswählbaren Tabs einer <hub-tab-nav> in Renderreihenfolge. Jedes Element ist ein schlanker { value, label, disabled?, id? }-Deskriptor — die Leiste besitzt keinen Inhalt, daher ist value das, was sie ausgibt, wenn der Tab ausgewählt wird.
activeunknown (model)undefinedZwei-Wege-gebundener ausgewählter Wert einer <hub-tab-nav>. Setze ihn, um einen Tab vorauszuwählen, und lies ihn über activeChange zurück; das passende Element ist das value, dessen value diesem entspricht.
appearance'tabs' | 'pills''tabs'Visuelles Erscheinungsbild der <hub-tab-nav>-Leiste: klassische unterstrichene 'tabs' (Standard) oder abgerundete 'pills'.
justifiedbooleanfalseWenn true, dehnen sich die <hub-tab-nav>-Tabs so aus, dass sie sich die verfügbare Breite gleichmäßig teilen.
verticalbooleanfalseWenn true, stapelt die <hub-tab-nav>-Leiste ihre Tabs vertikal, anstatt sie in einer Reihe anzuordnen.
modeHubSidePanelMode'side'<hub-side-panel>: 'side' dockt das Panel an und verschmälert den Inhalt; 'over' lässt es ohne Backdrop, Scroll-Sperre oder Fokusfalle über den Inhaltsrand schweben.
positionHubSidePanelPosition'end'<hub-side-panel>: logische Inline-Kante des Containers, an der das Panel sitzt – 'end' ist in LTR die rechte und unter dir="rtl" die linke Kante.
openboolean (model)false<hub-side-panel>: bidirektionaler Öffnungszustand. Schließen blendet das Panel aus, ohne seinen projizierten Inhalt zu zerstören, sodass ein Chat oder Formular darin seinen Zustand behält.
closeOnEscapebooleantrue<hub-side-panel>: ob Escape innerhalb des Panels es schließt. Escape auf der Seite wird nie abgefangen, und ein Steuerelement, das die Taste bereits verarbeitet hat, lässt das Panel offen.
breakpointnumber768<hub-side-panel>: Container-Breite in px, unterhalb der ein side-Panel als over dargestellt wird, weil ein angedocktes Panel auf schmalen Bildschirmen den Inhalt zerdrücken würde. 0 hält es bei jeder Breite angedockt.
autoFocusbooleanfalse<hub-side-panel>: ob das Öffnen den Fokus ins Panel verschiebt – auf das erste [autofocus]-Element, sonst das erste fokussierbare, sonst das Panel selbst. Standardmäßig aus.
roleHubSidePanelRole'complementary'<hub-side-panel>: Landmark-Rolle – 'complementary' neben dem Hauptinhalt der Seite, 'region', wenn das Panel darin liegt.
ariaLabelstringundefined<hub-side-panel>: zugänglicher Name der Landmark. Dies oder ariaLabelledBy setzen.
ariaLabelledBystringundefined<hub-side-panel>: ID des Elements, das die Landmark benennt, typischerweise die Überschrift im Header-Slot.

Outputs

Reagiere darauf, was panels tut — 7 Events, an die du deine Logik anknüpfen kannst.

NameTypBeschreibung
panelChangeOutputEmitterRef<PanelChangeEvent>hub-panels: wird ausgelöst, wenn der Benutzer ein anderes Panel aktiviert (öffnet). Liefert { current, prev }.
selectPanelOutputEmitterRef<HubPanelComponent>hub-panel: wird ausgelöst, wenn das Panel aktiv wird.
deselectPanelOutputEmitterRef<HubPanelComponent>hub-panel: wird ausgelöst, wenn das Panel nicht mehr aktiv ist.
removedOutputEmitterRef<HubPanelComponent>hub-panel: wird ausgelöst, wenn das Panel über die ✕-Schaltfläche oder die Delete-Taste entfernt wird.
activeChangeOutputEmitterRef<boolean>hub-panel: Change-Hälfte des Zwei-Wege-active-Modells, ausgegeben mit dem neuen aktiven/aufgeklappten Zustand des Panels.
activeChangeOutputEmitterRef<unknown>Wird von <hub-tab-nav> ausgegeben, sobald sich der ausgewählte Wert ändert (die Change-Hälfte des Zwei-Wege-active-Modells), und trägt den value des neu ausgewählten Elements.
openChangeOutputEmitterRef<boolean><hub-side-panel>: Änderungshälfte des bidirektionalen open-Modells; wird mit dem neuen Zustand ausgelöst, egal wer ihn geändert hat (Binding, Escape, toggle() oder close()).

Methoden

Steuere panels aus dem Code heraus — 6 Methoden auf der programmatischen Schnittstelle.

NameSignaturRückgabeBeschreibung
HubPanelsComponent.selectPanelselectPanel(panel: HubPanelComponent): void—Aktiviert ein Panel wie ein Klick des Nutzers: markiert es als aktiv, navigiert bei gerouteten Panels und gibt panelChange aus. Bei deaktivierten Panels passiert nichts.
HubPanelsComponent.togglePaneltogglePanel(panel: HubPanelComponent): void—Klappt ein Panel in der Accordion-Ansicht um und beachtet multiple: ohne multiple schließt das Öffnen eines Panels die übrigen.
HubPanelsComponent.removePanelremovePanel(panel: HubPanelComponent, options?: { reselect?: boolean; emit?: boolean }): void—Entfernt ein Panel aus der Gruppe. reselect entscheidet, ob ein anderes Panel an seine Stelle tritt, emit, ob die Entfernung über panelChange gemeldet wird.
HubPanelsComponent.removePanelAndRefocusremovePanelAndRefocus(panel: HubPanelComponent): void—Entfernt ein Panel und übergibt den Tastaturfokus an den nächstgelegenen verbleibenden Header, damit eine Entfernung den Fokus nie an den Body verliert. Genau das rufen die ✕-Schaltfläche und die Entf-Taste auf.
HubSidePanelComponent.toggletoggle(force?: boolean): void—Öffnet oder schließt das Panel; true oder false erzwingt einen Zustand, statt ihn umzuschalten.
HubSidePanelComponent.closeclose(): void—Schließt das Panel. War der Fokus darin, kehrt er zu dem Element zurück, das ihn beim Öffnen hatte.

Templates

Mach es zu deinem — 3 Template-Slots lassen dich eigenes Markup projizieren.

NameBeschreibungBeispiel
hubPanelHeadingKennzeichnet ein <ng-template> innerhalb eines hub-panel als benutzerdefinierten Header dieses Panels (Streifen-Link in Tabs/Pills, Aufklapp-Schaltfläche im Accordion) und ersetzt den Klartext-Heading-Input.<hub-panel> <ng-template hubPanelHeading> <i class="fa-solid fa-gear"></i> Settings <hub-badge color="primary" shape="rounded">3</hub-badge> </ng-template> Panel content </hub-panel>
hubPanelHeader / hubPanelFooterMarkiert ein Element innerhalb eines hub-panel als Kopf-/Fußleiste des Panel-Inhalts. Wird in jeder Ansicht (tabs, pills, accordion, card) gerendert, anders als hubPanelHeading.<hub-panel> <div hubPanelHeader>Card title</div> Card content <div hubPanelFooter>Actions</div> </hub-panel>
type="card"Die schmucklose Karten-Darstellung: keine Navigationsleiste, jedes Panel immer sichtbar. Ein hub-panel kann auch eigenständig außerhalb eines hub-panels verwendet werden und wird dann als Karte gerendert.<hub-panels type="card"> <hub-panel>…</hub-panel> <hub-panel>…</hub-panel> </hub-panels>