Tabs, Pills и Accordion для Angular | ng-hub-ui-panels

Компонент панелей контента для Angular, который отображается как вкладки, pills или accordion, с маршрутизацией, реактивными формами, навигацией с клавиатуры и CSS-переменными.

Справочник API

Вот полный контракт panels: всё, что можно привязать, прослушать, спроецировать и тематизировать, собрано в одном месте. Подключите то, что нужно, и оформите так, как хотите — это standalone и дружит с сигналами.

Входные свойства

Настройте panels с помощью 40 входных свойств. Привязывайте их, как любой @Input в Angular.

ИмяТипПо умолчаниюОписание
type'tabs' | 'pills' | 'accordion' | 'card''tabs'Визуализация контейнера: подчёркнутые tabs, скруглённые pills, составленные стопкой панели accordion или всегда видимые cards без обрамления.
verticalbooleanfalseРазмещает полосу заголовков вертикально рядом с содержимым (представления tabs / pills).
justifiedbooleanfalseРастягивает заголовки, чтобы они равномерно распределяли доступную ширину.
scrollablebooleanfalseДобавляет кнопки прокрутки назад/вперёд при переполнении полосы заголовков.
isKeysAllowedbooleantrueВключает навигацию с клавиатуры (стрелки / Home / End / Delete).
multiplebooleanfalseПозволяет нескольким панелям быть активными одновременно. В представлении accordion они все разворачиваются; в представлениях tabs/pills каждый активный заголовок начинает видимый блок панели, а следующие неактивные заголовки остаются сгруппированными над этим блоком до тех пор, пока следующий активный заголовок не начнёт новый. Значение формы становится массивом.
flushbooleanfalseПредставление accordion: панели от края до края без внешних рамок и скругления.
togglePosition'start' | 'end''end'На <hub-panels> (режим accordion): с какой стороны строки заголовка находится шеврон раскрытия. «end» (по умолчанию) — после заголовка, «start» — перед ним. Меняется только визуальный порядок — DOM не затрагивается — а отступы логические, поэтому «start» — это левый край при LTR и правый при RTL. Значение по умолчанию для всего приложения задаётся через HubPanelsConfig.togglePosition.
variantHubPanelVariant | stringundefinedhub-panels: семантический акцент полосы навигации — ему следуют активная вкладка и её наведение, активная pill и активный заголовок accordion. Встроенные значения ('primary' | 'success' | 'danger' | 'warning' | 'info') используют оттенки дизайн-системы, но принимается любая строка: полоса читает --hub-sys-color-<variant> из вашего приложения. По умолчанию primary.
bindValuestringundefinedПуть в точечной нотации, применяемый к значению каждой панели для получения передаваемого значения формы (например, '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.
variantHubPanelVariant | stringundefinedhub-panel: семантический акцент панели — окрашивает alert и тонирует всю card (отражается как data-variant). Встроенные значения ('primary' | 'success' | 'danger' | 'warning' | 'info') используют оттенки дизайн-системы, но принимается любая строка: панель читает --hub-sys-color-<variant> из вашего приложения. Опустите для нейтральной панели.
fillbooleanfalseТолько card-панель: заполняет высоту родителя и позволяет телу прокручиваться, так что внутренняя область flex:1/min-height:0 (например, полоса вкладок + прокручиваемая панель) остаётся ограниченной. Родитель должен быть flex-колонкой.
standaloneboolean (static attribute)falseТолько card-панель, статический атрибут: исключает отдельный <hub-panel> из группы tabs/pills/accordion выше по шаблону, чтобы он отображался как обычная card, а не захватывался как скрытая вкладка.
idstring'hub-panel-<n>'hub-panel: id для ARIA-связи между вкладкой и её панелью (или заголовком accordion и его областью). Генерируется автоматически как hub-panel-<n>; задайте его, когда нужны стабильные id — для глубокой ссылки или собственного aria-controls.
valueunknownidhub-panel: значение, вносимое, когда контейнер используется как form control.
activeboolean (model)falsehub-panel: двусторонне привязанное состояние active/expanded.
disabledbooleanfalsehub-panel: предотвращает активацию панели.
removablebooleanfalsehub-panel: показывает элемент ✕ и включает удаление клавишей Delete.
removeLabelstring'Remove panel'hub-panel: доступное имя (aria-label), объявляемое для кнопки удаления ✕; переопределите его для локализации элемента.
routerLinkstring | string[]undefinedhub-panel: превращает панель в маршрутизируемую панель на основе <router-outlet>.
queryParamsParamsundefinedhub-panel: query-параметры, добавляемые при переходе по routerLink.
pathMatch'route' | 'full''route'hub-panel: сравнение URL, используемое для пометки маршрутизируемой панели как активной.
customClassstringundefinedhub-panel: дополнительные CSS-классы, применяемые как к элементу nav, так и к панели (pane).
itemsHubTabNavItem[][]Выбираемые вкладки <hub-tab-nav> в порядке отрисовки. Каждый элемент — это облегчённый дескриптор { value, label, disabled?, id? }; полоса не владеет содержимым, поэтому value — это то, что она испускает при выборе вкладки.
activeunknown (model)undefinedДвусторонне связанное выбранное значение <hub-tab-nav>. Установите его, чтобы заранее выбрать вкладку, и считывайте обратно через activeChange; соответствующий элемент — это тот, чьё value равно этому значению.
appearance'tabs' | 'pills''tabs'Визуальное оформление полосы <hub-tab-nav>: классические подчёркнутые 'tabs' (по умолчанию) или скруглённые 'pills'.
justifiedbooleanfalseКогда true, вкладки <hub-tab-nav> растягиваются, равномерно распределяя между собой доступную ширину.
verticalbooleanfalseКогда true, полоса <hub-tab-nav> размещает свои вкладки вертикально вместо раскладки в ряд.
modeHubSidePanelMode'side'<hub-side-panel>: 'side' закрепляет панель и сужает содержимое, освобождая для неё место; 'over' размещает её поверх края содержимого без подложки, блокировки прокрутки и ловушки фокуса.
positionHubSidePanelPosition'end'<hub-side-panel>: логический край контейнера, у которого находится панель, — 'end' означает правый край в LTR и левый при dir="rtl".
openboolean (model)false<hub-side-panel>: двустороннее состояние открытия. Закрытие скрывает панель, не уничтожая проецируемое содержимое, поэтому чат или форма внутри сохраняют своё состояние.
closeOnEscapebooleantrue<hub-side-panel>: закрывает ли панель нажатие Escape внутри неё. Escape, нажатая на странице, никогда не перехватывается, а если элемент управления уже обработал клавишу, панель остаётся открытой.
breakpointnumber768<hub-side-panel>: ширина контейнера в px, ниже которой панель side отображается как over, потому что закреплённая панель на узком экране сдавила бы содержимое. 0 оставляет её закреплённой при любой ширине.
autoFocusbooleanfalse<hub-side-panel>: переносит ли открытие фокус в панель — на первый элемент с [autofocus], иначе на первый фокусируемый элемент, иначе на саму панель. По умолчанию выключено.
roleHubSidePanelRole'complementary'<hub-side-panel>: роль ориентира — 'complementary' рядом с основным содержимым страницы, 'region', если панель находится внутри него.
ariaLabelstringundefined<hub-side-panel>: доступное имя ориентира. Укажите его или ariaLabelledBy.
ariaLabelledBystringundefined<hub-side-panel>: id элемента, который называет ориентир, обычно заголовок в слоте шапки.

События

Реагируйте на то, что делает panels, — 7 событий, к которым можно подключить вашу логику.

ИмяТипОписание
panelChangeOutputEmitterRef<PanelChangeEvent>hub-panels: вызывается, когда пользователь активирует (открывает) другую панель. Предоставляет { current, prev }.
selectPanelOutputEmitterRef<HubPanelComponent>hub-panel: вызывается, когда панель становится активной.
deselectPanelOutputEmitterRef<HubPanelComponent>hub-panel: вызывается, когда панель перестаёт быть активной.
removedOutputEmitterRef<HubPanelComponent>hub-panel: вызывается, когда панель удаляется через кнопку ✕ или клавишу Delete.
activeChangeOutputEmitterRef<boolean>hub-panel: change-часть двусторонней модели active, испускается с новым состоянием активности/раскрытия панели.
activeChangeOutputEmitterRef<unknown>Испускается <hub-tab-nav> при каждом изменении выбранного значения (change-часть двусторонней модели active), передавая value вновь выбранного элемента.
openChangeOutputEmitterRef<boolean><hub-side-panel>: половина изменения двусторонней модели open; генерируется с новым состоянием независимо от того, кто его изменил (привязка, Escape, toggle() или close()).

Методы

Управляйте panels из кода — 6 методов его программного интерфейса.

ИмяСигнатураВозвращаетОписание
HubPanelsComponent.selectPanelselectPanel(panel: HubPanelComponent): void—Активирует панель так же, как клик пользователя: помечает её активной, выполняет переход для маршрутизируемой панели и испускает panelChange. С отключёнными панелями ничего не делает.
HubPanelsComponent.togglePaneltogglePanel(panel: HubPanelComponent): void—Переключает панель в виде accordion с учётом multiple: без multiple открытие одной панели сворачивает остальные.
HubPanelsComponent.removePanelremovePanel(panel: HubPanelComponent, options?: { reselect?: boolean; emit?: boolean }): void—Удаляет панель из группы. reselect решает, займёт ли её место другая панель, emit — сообщать ли об удалении через panelChange.
HubPanelsComponent.removePanelAndRefocusremovePanelAndRefocus(panel: HubPanelComponent): void—Удаляет панель и передаёт фокус клавиатуры ближайшему оставшемуся заголовку, так что удаление никогда не роняет фокус на body. Именно это вызывают кнопка ✕ и клавиша Delete.
HubSidePanelComponent.toggletoggle(force?: boolean): void—Открывает или закрывает панель; передайте true или false, чтобы задать состояние вместо переключения.
HubSidePanelComponent.closeclose(): void—Закрывает панель. Если фокус был внутри, он возвращается к элементу, который владел им при открытии панели.

Шаблоны

Сделайте его своим — 3 слотов шаблона позволяют проецировать собственную разметку.

ИмяОписаниеПример
hubPanelHeadingПомечает <ng-template> внутри hub-panel как пользовательский заголовок этой панели (ссылка в полосе для tabs/pills, кнопка раскрытия в accordion), заменяя текстовый 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 / 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>