ng-hub-ui-breadcrumbs 22.5.2 → 22.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -122,7 +122,7 @@ const routes: Routes = [
122
122
 
123
123
  ### 1. Import the Component
124
124
 
125
- You can import the `HubBreadcrumbComponent` directly in your standalone component, or use `HubBreadcrumbsModule` in a module-based setup.
125
+ Import `HubBreadcrumbComponent` directly in your component. (`HubBreadcrumbsModule` still works in a module-based setup, but it is deprecated — see [HubBreadcrumbsModule](#hubbreadcrumbsmodule).)
126
126
 
127
127
  ```typescript
128
128
  import { HubBreadcrumbComponent } from 'ng-hub-ui-breadcrumbs';
@@ -271,7 +271,7 @@ Fully customize the structure, including separators/dividers.
271
271
 
272
272
  ### HubBreadcrumbComponent
273
273
 
274
- The main container component. It reads the breadcrumb trail directly from the Angular `Router` and exposes a single optional input for theming the links.
274
+ The main container component. It reads the breadcrumb trail directly from the Angular `Router` — or takes it from `items` when you hand it one — and exposes seven inputs, one output and an optional item template.
275
275
 
276
276
  | Selector | Host class |
277
277
  | ---------------- | ----------------- |
@@ -281,8 +281,8 @@ The main container component. It reads the breadcrumb trail directly from the An
281
281
 
282
282
  | Input | Type | Default | Description |
283
283
  | --------- | -------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
284
- | `variant` | `string` | `undefined` | Selects a **semantic accent** for the breadcrumb links and their hover. The built-in values (`primary`, `success`, `danger`, `warning`, `info`) map to the exact design-system tints; **any other string is also accepted** and resolves through `--hub-sys-color-<variant>`. The current (last) item always stays muted. When omitted, links use the standard link colour (no visual change). |
285
- | `truncateItems` | `boolean` | `false` | When `true`, clips each label to `--hub-breadcrumb-max-item-width` (default `12rem`) with an ellipsis and shows the full text as a tooltip when a label overflows. Off by default, so the standard layout and wrapping are unchanged. |
284
+ | `variant` | `string` | `undefined` | Selects a **semantic accent** for the breadcrumb links and their hover. The built-in values (`primary`, `secondary`, `success`, `danger`, `warning`, `info`, `neutral`, `light`, `dark`) map to the exact design-system tints; **any other string is also accepted** and resolves through `--hub-sys-color-<variant>`. The current (last) item always stays muted. When omitted, links use the standard link colour (no visual change). |
285
+ | `truncateItems` | `boolean` | `false` | When `true`, clips each label to `--hub-breadcrumb-max-item-width` (default `12rem`) with an ellipsis and shows the full text as a tooltip when a label overflows. Off by default, so the standard layout and wrapping are unchanged. It dresses the markup the component renders itself: a `hubBreadcrumbItem` template supplies its own elements, which the component's scoped styles cannot reach — see [`HubBreadcrumbLabelDirective`](#hubbreadcrumblabeldirective) for how a custom template opts back in. |
286
286
  | `items` | `BreadcrumbItem[] \| null` | `null` | Trail supplied by you, replacing the one derived from the router. The way in for crumbs the route tree cannot express — an ancestor served by another application, or a trail assembled by hand. Left `null`, the component keeps reading `HubBreadcrumbsService`. |
287
287
  | `maxItems` | `number \| undefined` | `undefined` | Length above which the trail collapses behind an indicator. Undefined never collapses, however long the trail grows. |
288
288
  | `itemsBeforeCollapse` | `number` | `1` | Crumbs kept at the head of a collapsed trail. |
@@ -316,8 +316,9 @@ The main container component. It reads the breadcrumb trail directly from the An
316
316
 
317
317
  Above `maxItems` crumbs the middle folds behind a `…` button. The button takes
318
318
  keyboard focus, announces itself with `collapsedAriaLabel`, opens the trail in
319
- place and emits `collapsedClick`. An expansion answers one trail: the next
320
- navigation collapses it again.
319
+ place and emits `collapsedClick`. Expanding removes the button, so focus moves on
320
+ to the first crumb it revealed instead of falling back to the page body. An
321
+ expansion answers one trail: the next navigation collapses it again.
321
322
 
322
323
  #### Crumbs that leave the application
323
324
 
@@ -383,17 +384,56 @@ A structural directive used to define a custom template for breadcrumb items.
383
384
  | --------------------- | --------------------------- |
384
385
  | `[hubBreadcrumbItem]` | `BreadcrumbTemplateContext` |
385
386
 
387
+ ### HubBreadcrumbLabelDirective
388
+
389
+ Adds the overflow tooltip to a breadcrumb label. The component applies it to the labels it
390
+ renders itself; it is exported so a custom `hubBreadcrumbItem` template can opt back in.
391
+
392
+ | Selector | Input | Default |
393
+ | ---------------------- | ----------------------------------------- | ------- |
394
+ | `[hubBreadcrumbLabel]` | `hubBreadcrumbLabel: string` (alias) — explicit tooltip text | `''` |
395
+
396
+ Left empty, the tooltip text is the host element's own text content, and it is shown only
397
+ while that text is actually clipped. The directive never clips anything itself: the ellipsis
398
+ comes from the `truncateItems` styles, which reach only the component's own markup, so a
399
+ custom template has to clip its label in its own stylesheet. Import
400
+ `HubBreadcrumbLabelDirective` into the component that declares the template.
401
+
402
+ ```html
403
+ <hub-breadcrumb [truncateItems]="true">
404
+ <ng-template hubBreadcrumbItem let-item>
405
+ <a class="my-crumb" hubBreadcrumbLabel [routerLink]="item.url">{{ item.label }}</a>
406
+ </ng-template>
407
+ </hub-breadcrumb>
408
+ ```
409
+
410
+ ### Tooltip adapter
411
+
412
+ The contract truncated labels use to reach a richer tooltip. It is structurally typed and
413
+ declared here rather than imported, so the package keeps zero hard dependencies.
414
+
415
+ | Export | Kind | Description |
416
+ | -------------------------------- | ---------------------- | ------------------------------------------------------------------------ |
417
+ | `provideHubBreadcrumbTooltip()` | `EnvironmentProviders` | Registers an adapter once for the whole application. |
418
+ | `HUB_BREADCRUMB_TOOLTIP_ADAPTER` | `InjectionToken` | The token the provider fills. Inject it with `{ optional: true }`. |
419
+ | `HubBreadcrumbTooltipAdapter` | interface | `attach(host: HTMLElement, text: string): HubBreadcrumbTooltipHandle`. |
420
+ | `HubBreadcrumbTooltipHandle` | interface | `update(text: string): void` and `destroy(): void`. |
421
+
386
422
  ### HubBreadcrumbsService
387
423
 
388
- An injectable (`providedIn: 'root'`) service that exposes the reactive breadcrumb stream. The component uses it internally; you can also inject it directly when you need the breadcrumb data elsewhere.
424
+ An injectable (`providedIn: 'root'`) service that publishes the breadcrumb trail. The component reads the signal; you can also inject it directly when you need the breadcrumb data elsewhere.
389
425
 
390
- | Member | Type | Description |
391
- | --------------- | ----------------------------- | ----------------------------------------------------------------------------- |
392
- | `breadcrumbs$` | `Observable<BreadcrumbItem[]>` | Emits the current breadcrumb trail on every `NavigationEnd` (and on startup). |
426
+ | Member | Type | Description |
427
+ | -------------- | ------------------------------ | ---------------------------------------------------------------------------------- |
428
+ | `breadcrumbs` | `Signal<BreadcrumbItem[]>` | The current trail. Read it in a template or a `computed`, with nothing to wrap. |
429
+ | `breadcrumbs$` | `Observable<BreadcrumbItem[]>` | The same trail as a stream, for code already composing with rxjs. |
430
+
431
+ Replacing the service (a test double, a facade over another source) means publishing
432
+ `breadcrumbs`: that is the member the component reads.
393
433
 
394
434
  ### HubBreadcrumbsModule
395
435
 
396
- An optional `NgModule` that imports and exports `HubBreadcrumbComponent` and `HubBreadcrumbItemDirective` for module-based applications.
436
+ **Deprecated — removed in 23.0.0.** An `NgModule` that imports and exports `HubBreadcrumbComponent` and `HubBreadcrumbItemDirective` for module-based applications, and provides nothing of its own. Import the two declarables directly instead; `HubBreadcrumbsService` is `providedIn: 'root'` and never travelled through the module. See `BREAKING_CHANGES.md`.
397
437
 
398
438
  ### Interfaces
399
439
 
@@ -450,11 +490,12 @@ For a complete and up-to-date token catalog, see [CSS Variables Reference](./doc
450
490
  The link colour follows the `--hub-breadcrumb-accent` token (which itself defaults to the standard link colour). Setting a `variant` re-bases this token; you can also override it directly:
451
491
 
452
492
  ```scss
453
- /* The accent is read on the crumb element itself (the link colour and its hover are
454
- derived there), so the override must land on that element and must outrank the
455
- component's own `:host` defaultsa bare `.hub-breadcrumb` rule ties on specificity
456
- and loses on source order. Scope it, or set it inline. */
457
- .my-page .hub-breadcrumb {
493
+ /* The accent slot is deliberately not declared on the component's host, so any rule of
494
+ yours wins with no scoping trick: the crumb element by tag or by class, or an ancestor
495
+ it inherits from. A `variant` still wins over both that is what a variant is for.
496
+ The remaining tokens keep their defaults on `:host`, so those go on the crumb element
497
+ itself or on `.hub-breadcrumb__list`. */
498
+ hub-breadcrumb {
458
499
  --hub-breadcrumb-accent: var(--hub-sys-color-info);
459
500
  }
460
501
  ```
@@ -464,8 +505,9 @@ The link colour follows the `--hub-breadcrumb-accent` token (which itself defaul
464
505
  Keyboard focus is drawn with the design-system ring, so a breadcrumb focus looks like focus everywhere else in the application. Re-tint it without touching the outline:
465
506
 
466
507
  ```scss
467
- /* The component declares its defaults on :host, so an override has to land on the
468
- crumb element itself or inside it — a token set on an ancestor never reaches it. */
508
+ /* These defaults are declared on :host, so an override has to land on the crumb element
509
+ itself or inside it — a value set on an ancestor never reaches them. (The accent is the
510
+ exception: it is deliberately left undeclared, so it does inherit.) */
469
511
  .hub-breadcrumb__list {
470
512
  --hub-breadcrumb-focus-ring-color: rgba(25, 135, 84, 0.35);
471
513
  --hub-breadcrumb-focus-ring-width: 0.25rem;
@@ -496,10 +538,19 @@ Keyboard focus is drawn with the design-system ring, so a breadcrumb focus looks
496
538
 
497
539
  For a one-call theme that sets surface, spacing, divider, current-item colour, links and accent, use the `hub-breadcrumb-theme()` mixin. Every parameter is optional and defaults to `null`, so only the ones you pass are emitted as `--hub-breadcrumb-*` overrides. It is token-based with no Bootstrap dependency.
498
540
 
541
+ Include it on the `<hub-breadcrumb>` element with a selector that outranks the component's
542
+ own `:host` defaults — tag plus class does it. A bare `.docs-breadcrumb` ties on specificity
543
+ and loses on source order, and the same class on a wrapper never reaches the component at
544
+ all, because a declaration on the element always beats an inherited value.
545
+
546
+ ```html
547
+ <hub-breadcrumb class="docs-breadcrumb"></hub-breadcrumb>
548
+ ```
549
+
499
550
  ```scss
500
551
  @use 'ng-hub-ui-breadcrumbs/styles/mixins/breadcrumb-theme' as *;
501
552
 
502
- .docs-breadcrumb {
553
+ hub-breadcrumb.docs-breadcrumb {
503
554
  @include hub-breadcrumb-theme(
504
555
  $bg: #f8fafc,
505
556
  $padding-x: 0.75rem,
@@ -509,11 +560,14 @@ For a one-call theme that sets surface, spacing, divider, current-item colour, l
509
560
  }
510
561
  ```
511
562
 
563
+ An include that passes `$accent` and nothing else is the one exception: the accent slot is
564
+ not declared on the host, so it may sit on an ancestor and still recolour the links.
565
+
512
566
  ## Changelog
513
567
 
514
568
  All notable changes are documented in the [CHANGELOG.md](./CHANGELOG.md). For breaking changes, see [BREAKING_CHANGES.md](./BREAKING_CHANGES.md).
515
569
 
516
- The latest release is **v21.1.0**, which renamed the selector from `hub-breadcrumbs` to `hub-breadcrumb` and bundled the component styles (manual style imports are no longer required).
570
+ The latest release is **v22.5.2**, a fix for a breadcrumb drawn before the first navigation completes. The collapsing inputs, crumbs pointing outside the router and the keyboard focus ring arrived in **v22.5.0**; the packaging path `ng-hub-ui-breadcrumbs/styles` in **v22.4.0**.
517
571
 
518
572
  ## Contributing
519
573
 
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, TemplateRef, Directive, InjectionToken, input, ElementRef, signal, afterNextRender, effect, Injectable, contentChild, output, computed, linkedSignal, Component, NgModule, makeEnvironmentProviders } from '@angular/core';
2
+ import { inject, TemplateRef, Directive, InjectionToken, input, ElementRef, signal, afterNextRender, effect, Injectable, Injector, contentChild, output, computed, linkedSignal, ChangeDetectionStrategy, Component, NgModule, makeEnvironmentProviders } from '@angular/core';
3
3
  import { NgTemplateOutlet } from '@angular/common';
4
- import { toSignal } from '@angular/core/rxjs-interop';
5
4
  import { Router, ActivatedRoute, NavigationEnd, RouterLink } from '@angular/router';
5
+ import { toSignal } from '@angular/core/rxjs-interop';
6
6
  import { filter, startWith, map } from 'rxjs';
7
7
 
8
8
  class HubBreadcrumbItemDirective {
@@ -135,7 +135,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
135
135
  class HubBreadcrumbsService {
136
136
  #router = inject(Router);
137
137
  #activatedRoute = inject(ActivatedRoute);
138
+ /** The trail as a stream, for consumers already composing with rxjs. */
138
139
  breadcrumbs$ = this.#router.events.pipe(filter((event) => event instanceof NavigationEnd), startWith(undefined), map(() => this.createBreadcrumbs(this.#activatedRoute.root)));
140
+ /**
141
+ * The trail as a signal, and the surface the component reads. Published here
142
+ * rather than left to each consumer, because a stream that only ever carries
143
+ * the current trail is one every caller was wrapping in the same `toSignal`
144
+ * — the component included. Wrapped once, subscribed once.
145
+ */
146
+ breadcrumbs = toSignal(this.breadcrumbs$, { initialValue: [] });
139
147
  createBreadcrumbs(route, url = '', breadcrumbs = []) {
140
148
  const children = route.children;
141
149
  if (children.length === 0) {
@@ -207,17 +215,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
207
215
  }]
208
216
  }] });
209
217
 
210
- /** Variants with exact design-system token coverage via the SCSS `@each` loop. */
211
- const BUILT_IN_VARIANTS = new Set(['primary', 'success', 'danger', 'warning', 'info']);
218
+ /**
219
+ * Variants with exact design-system token coverage via the SCSS `@each` loop.
220
+ * Kept in step with that loop by hand, because Sass cannot read this file: a name
221
+ * dropped from here is not broken, only paid for twice — once inline and once by
222
+ * the stylesheet.
223
+ */
224
+ const BUILT_IN_VARIANTS = new Set([
225
+ 'primary',
226
+ 'secondary',
227
+ 'success',
228
+ 'danger',
229
+ 'warning',
230
+ 'info',
231
+ 'neutral',
232
+ 'light',
233
+ 'dark'
234
+ ]);
212
235
  class HubBreadcrumbComponent {
213
236
  #breadcrumbsSvc = inject(HubBreadcrumbsService);
237
+ #host = inject(ElementRef);
238
+ #injector = inject(Injector);
214
239
  itemTemplate = contentChild(HubBreadcrumbItemDirective, { ...(ngDevMode ? { debugName: "itemTemplate" } : /* istanbul ignore next */ {}), read: TemplateRef });
215
- breadcrumbs$ = this.#breadcrumbsSvc.breadcrumbs$;
216
240
  /**
217
- * Semantic accent for the breadcrumb links: `'primary'` · `'success'` ·
218
- * `'danger'` · `'warning'` · `'info'`, or any custom string (read as
219
- * `--hub-sys-color-<variant>`). Re-bases `--hub-breadcrumb-accent`; the
220
- * current (last) item stays muted. Defaults to the standard link colour.
241
+ * Semantic accent for the breadcrumb links: `'primary'` · `'secondary'` ·
242
+ * `'success'` · `'danger'` · `'warning'` · `'info'` · `'neutral'` · `'light'` ·
243
+ * `'dark'`, or any custom string (read as `--hub-sys-color-<variant>`).
244
+ * Re-bases `--hub-breadcrumb-accent`; the current (last) item stays muted.
245
+ * Defaults to the standard link colour.
221
246
  */
222
247
  variant = input(/* @ts-ignore */
223
248
  ...(ngDevMode ? [undefined, { debugName: "variant" }] : /* istanbul ignore next */ []));
@@ -263,10 +288,8 @@ class HubBreadcrumbComponent {
263
288
  * open a menu of the hidden crumbs, log the interaction.
264
289
  */
265
290
  collapsedClick = output();
266
- /** Trail as published by the service, tracked as a signal. */
267
- #routerTrail = toSignal(this.breadcrumbs$, { initialValue: [] });
268
291
  /** Effective trail: the manual one when supplied, the router's otherwise. */
269
- trail = computed(() => this.items() ?? this.#routerTrail(), /* @ts-ignore */
292
+ trail = computed(() => this.items() ?? this.#breadcrumbsSvc.breadcrumbs(), /* @ts-ignore */
270
293
  ...(ngDevMode ? [{ debugName: "trail" }] : /* istanbul ignore next */ []));
271
294
  /**
272
295
  * Whether the reader has opened a collapsed trail. Derived from the trail so a
@@ -299,8 +322,8 @@ class HubBreadcrumbComponent {
299
322
  }, /* @ts-ignore */
300
323
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
301
324
  /**
302
- * Inline accent for custom (non-built-in) variants — the built-in five are
303
- * resolved by the SCSS `@each` loop, so this returns `null` for them.
325
+ * Inline accent for custom (non-built-in) variants — the nine built-in accents
326
+ * are resolved by the SCSS `@each` loop, so this returns `null` for them.
304
327
  */
305
328
  customAccent = computed(() => {
306
329
  const v = this.variant();
@@ -311,6 +334,29 @@ class HubBreadcrumbComponent {
311
334
  expand() {
312
335
  this.expanded.set(true);
313
336
  this.collapsedClick.emit();
337
+ afterNextRender(() => this.#focusFirstRevealedCrumb(), { injector: this.#injector });
338
+ }
339
+ /**
340
+ * Expanding removes the indicator — the element that was holding focus — from the
341
+ * DOM, and a browser answers that by focusing `<body>`: whoever opened the trail
342
+ * from the keyboard would have to tab from the top of the page to reach the crumbs
343
+ * they just asked for. Focus lands on the first revealed crumb instead, which is
344
+ * where reading continues.
345
+ */
346
+ #focusFirstRevealedCrumb() {
347
+ const crumbs = this.#host.nativeElement.querySelectorAll('.hub-breadcrumb__item');
348
+ const revealed = crumbs[Math.max(0, this.itemsBeforeCollapse())];
349
+ if (!revealed) {
350
+ return;
351
+ }
352
+ // A crumb may render as plain text — the current page, or a custom template with
353
+ // no control of its own — and text takes no focus. Make that one crumb
354
+ // programmatically focusable rather than let focus fall back to the body.
355
+ const target = revealed.querySelector('a, button, [tabindex]') ?? revealed;
356
+ if (target === revealed) {
357
+ revealed.tabIndex = -1;
358
+ }
359
+ target.focus();
314
360
  }
315
361
  /**
316
362
  * A crumb opening in a new tab hands the opener to the destination unless it
@@ -321,18 +367,25 @@ class HubBreadcrumbComponent {
321
367
  return item.rel ?? (item.target === '_blank' ? 'noopener noreferrer' : null);
322
368
  }
323
369
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HubBreadcrumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
324
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: HubBreadcrumbComponent, isStandalone: true, selector: "hub-breadcrumb", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, truncateItems: { classPropertyName: "truncateItems", publicName: "truncateItems", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, maxItems: { classPropertyName: "maxItems", publicName: "maxItems", isSignal: true, isRequired: false, transformFunction: null }, itemsBeforeCollapse: { classPropertyName: "itemsBeforeCollapse", publicName: "itemsBeforeCollapse", isSignal: true, isRequired: false, transformFunction: null }, itemsAfterCollapse: { classPropertyName: "itemsAfterCollapse", publicName: "itemsAfterCollapse", isSignal: true, isRequired: false, transformFunction: null }, collapsedAriaLabel: { classPropertyName: "collapsedAriaLabel", publicName: "collapsedAriaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsedClick: "collapsedClick" }, host: { properties: { "class.hub-breadcrumb--truncate": "truncateItems()", "attr.data-variant": "variant() ?? null", "style.--hub-breadcrumb-accent": "customAccent()" }, classAttribute: "hub-breadcrumb" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: HubBreadcrumbItemDirective, descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0, template: "<nav aria-label=\"breadcrumb\" class=\"hub-breadcrumb__nav\">\n\t<ol class=\"hub-breadcrumb__list\">\n\t\t@for (row of rows(); track $index) {\n\t\t\t@if (row.item; as item) {\n\t\t\t\t<li class=\"hub-breadcrumb__item\" [class.hub-breadcrumb__item--active]=\"row.isLast\">\n\t\t\t\t\t@if (itemTemplate(); as template) {\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t[ngTemplateOutlet]=\"template\"\n\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t$implicit: item,\n\t\t\t\t\t\t\t\tisLast: row.isLast\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else if (row.isLast) {\n\t\t\t\t\t\t<span class=\"hub-breadcrumb__text\" hubBreadcrumbLabel aria-current=\"page\">{{ item.label }}</span>\n\t\t\t\t\t} @else if (item.href) {\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tclass=\"hub-breadcrumb__link\"\n\t\t\t\t\t\t\thubBreadcrumbLabel\n\t\t\t\t\t\t\t[href]=\"item.href\"\n\t\t\t\t\t\t\t[attr.target]=\"item.target ?? null\"\n\t\t\t\t\t\t\t[attr.rel]=\"row.rel\"\n\t\t\t\t\t\t\t[attr.download]=\"item.download ?? null\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<a [routerLink]=\"item.url\" class=\"hub-breadcrumb__link\" hubBreadcrumbLabel>\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t}\n\t\t\t\t</li>\n\t\t\t} @else {\n\t\t\t\t<li class=\"hub-breadcrumb__item hub-breadcrumb__item--collapsed\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"hub-breadcrumb__collapsed\"\n\t\t\t\t\t\t[attr.aria-label]=\"collapsedAriaLabel()\"\n\t\t\t\t\t\t[attr.aria-expanded]=\"expanded()\"\n\t\t\t\t\t\t(click)=\"expand()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t&hellip;\n\t\t\t\t\t</button>\n\t\t\t\t</li>\n\t\t\t}\n\t\t}\n\t</ol>\n</nav>\n", styles: [":root,:host{--hub-breadcrumb-padding-x: var(--hub-ref-space-3, 1rem);--hub-breadcrumb-padding-y: .25rem;--hub-breadcrumb-margin-bottom: var(--hub-ref-space-0, 0);--hub-breadcrumb-bg: var(--hub-sys-surface-page, transparent);--hub-breadcrumb-color: var(--hub-sys-text-primary, #212529);--hub-breadcrumb-border-radius: var(--hub-ref-radius-md, .375rem);--hub-breadcrumb-divider-color: var(--hub-sys-text-muted, #6c757d);--hub-breadcrumb-item-padding-x: var(--hub-ref-space-1, .25rem);--hub-breadcrumb-item-active-color: var(--hub-sys-text-muted, #6c757d);--hub-breadcrumb-accent: var(--hub-sys-color-primary, #0d6efd);--hub-breadcrumb-accent-emphasis: color-mix(in oklch, var(--hub-breadcrumb-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-breadcrumb-accent-subtle: color-mix(in oklch, var(--hub-breadcrumb-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-breadcrumb-accent-on: oklch(from var(--hub-breadcrumb-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-breadcrumb-link-color: var(--hub-breadcrumb-accent);--hub-breadcrumb-link-hover-color: var(--hub-breadcrumb-accent-emphasis, var(--hub-sys-link-hover-color, #0a58ca));--hub-breadcrumb-link-decoration: none;--hub-breadcrumb-link-hover-decoration: underline;--hub-breadcrumb-link-focus-color: var(--hub-breadcrumb-accent-emphasis);--hub-breadcrumb-focus-bg: transparent;--hub-breadcrumb-focus-ring-width: var(--hub-sys-focus-ring-width, .25rem);--hub-breadcrumb-focus-ring-color: var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25));--hub-breadcrumb-focus-ring-radius: var(--hub-ref-radius-sm, .25rem);--hub-breadcrumb-collapsed-color: var(--hub-sys-text-muted, #6c757d);--hub-breadcrumb-collapsed-hover-color: var(--hub-breadcrumb-accent);--hub-breadcrumb-collapsed-bg: transparent;--hub-breadcrumb-collapsed-hover-bg: var(--hub-breadcrumb-accent-subtle);--hub-breadcrumb-divider: \">\";--hub-breadcrumb-divider-flipped: \"<\";--hub-breadcrumb-font-size: inherit;--hub-breadcrumb-max-item-width: 12rem}.hub-breadcrumb__nav .hub-breadcrumb__list{display:flex;flex-wrap:wrap;font-size:var(--hub-breadcrumb-font-size, inherit);padding:var(--hub-breadcrumb-padding-y, .25rem) var(--hub-breadcrumb-padding-x, var(--hub-ref-space-3, 1rem));margin-bottom:var(--hub-breadcrumb-margin-bottom, var(--hub-ref-space-0, 0));list-style:none;color:var(--hub-breadcrumb-color, var(--hub-sys-text-primary, #212529));background-color:var(--hub-breadcrumb-bg, var(--hub-sys-surface-page, transparent));border-radius:var(--hub-breadcrumb-border-radius, var(--hub-ref-radius-md, .375rem))}.hub-breadcrumb__nav .hub-breadcrumb__item+.hub-breadcrumb__item{padding-inline-start:var(--hub-breadcrumb-item-padding-x, var(--hub-ref-space-1, .25rem))}.hub-breadcrumb__nav .hub-breadcrumb__item+.hub-breadcrumb__item:before{padding-inline-end:var(--hub-breadcrumb-item-padding-x, var(--hub-ref-space-1, .25rem));color:var(--hub-breadcrumb-divider-color, var(--hub-sys-text-muted, #6c757d));content:var(--hub-breadcrumb-divider, \">\")}.hub-breadcrumb__nav .hub-breadcrumb__item--active{color:var(--hub-breadcrumb-item-active-color, var(--hub-sys-text-muted, #6c757d))}.hub-breadcrumb__nav .hub-breadcrumb__link{color:var(--hub-breadcrumb-link-color, var(--hub-sys-link-color, #0d6efd));text-decoration:var(--hub-breadcrumb-link-decoration, none)}.hub-breadcrumb__nav .hub-breadcrumb__link:hover{color:var(--hub-breadcrumb-link-hover-color, var(--hub-sys-link-hover-color, #0a58ca));text-decoration:var(--hub-breadcrumb-link-hover-decoration, underline)}.hub-breadcrumb__nav .hub-breadcrumb__collapsed{display:inline-flex;align-items:center;padding:0 .125rem;border:0;border-radius:var(--hub-breadcrumb-focus-ring-radius, var(--hub-ref-radius-sm, .25rem));background-color:var(--hub-breadcrumb-collapsed-bg, transparent);color:var(--hub-breadcrumb-collapsed-color, var(--hub-sys-text-muted, #6c757d));font:inherit;line-height:inherit;cursor:pointer}.hub-breadcrumb__nav .hub-breadcrumb__collapsed:hover{background-color:var(--hub-breadcrumb-collapsed-hover-bg);color:var(--hub-breadcrumb-collapsed-hover-color)}.hub-breadcrumb__nav .hub-breadcrumb__link:focus-visible,.hub-breadcrumb__nav .hub-breadcrumb__collapsed:focus-visible{outline:0;border-radius:var(--hub-breadcrumb-focus-ring-radius, var(--hub-ref-radius-sm, .25rem));background-color:var(--hub-breadcrumb-focus-bg, transparent);color:var(--hub-breadcrumb-link-focus-color);box-shadow:0 0 0 var(--hub-breadcrumb-focus-ring-width, var(--hub-sys-focus-ring-width, .25rem)) var(--hub-breadcrumb-focus-ring-color, var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25)))}[dir=rtl] .hub-breadcrumb__nav .hub-breadcrumb__item+.hub-breadcrumb__item:before{content:var(--hub-breadcrumb-divider-flipped, var(--hub-breadcrumb-divider, \">\"))}:host(.hub-breadcrumb--truncate) .hub-breadcrumb__nav .hub-breadcrumb__link,:host(.hub-breadcrumb--truncate) .hub-breadcrumb__nav .hub-breadcrumb__text,.hub-breadcrumb--truncate .hub-breadcrumb__nav .hub-breadcrumb__link,.hub-breadcrumb--truncate .hub-breadcrumb__nav .hub-breadcrumb__text{display:inline-block;max-inline-size:var(--hub-breadcrumb-max-item-width, 12rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}:host([data-variant=primary]),.hub-breadcrumb[data-variant=primary]{--hub-breadcrumb-accent: var(--hub-sys-color-primary)}:host([data-variant=secondary]),.hub-breadcrumb[data-variant=secondary]{--hub-breadcrumb-accent: var(--hub-sys-color-secondary)}:host([data-variant=success]),.hub-breadcrumb[data-variant=success]{--hub-breadcrumb-accent: var(--hub-sys-color-success)}:host([data-variant=danger]),.hub-breadcrumb[data-variant=danger]{--hub-breadcrumb-accent: var(--hub-sys-color-danger)}:host([data-variant=warning]),.hub-breadcrumb[data-variant=warning]{--hub-breadcrumb-accent: var(--hub-sys-color-warning)}:host([data-variant=info]),.hub-breadcrumb[data-variant=info]{--hub-breadcrumb-accent: var(--hub-sys-color-info)}:host([data-variant=neutral]),.hub-breadcrumb[data-variant=neutral]{--hub-breadcrumb-accent: var(--hub-sys-color-neutral)}:host([data-variant=light]),.hub-breadcrumb[data-variant=light]{--hub-breadcrumb-accent: var(--hub-sys-color-light)}:host([data-variant=dark]),.hub-breadcrumb[data-variant=dark]{--hub-breadcrumb-accent: var(--hub-sys-color-dark)}:host([data-variant]),.hub-breadcrumb[data-variant]{--hub-breadcrumb-accent-emphasis: color-mix(in oklch, var(--hub-breadcrumb-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-breadcrumb-accent-subtle: color-mix(in oklch, var(--hub-breadcrumb-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-breadcrumb-accent-on: oklch(from var(--hub-breadcrumb-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-breadcrumb-link-hover-color: var(--hub-breadcrumb-accent-emphasis)}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: HubBreadcrumbLabelDirective, selector: "[hubBreadcrumbLabel]", inputs: ["hubBreadcrumbLabel"] }] });
370
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: HubBreadcrumbComponent, isStandalone: true, selector: "hub-breadcrumb", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, truncateItems: { classPropertyName: "truncateItems", publicName: "truncateItems", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, maxItems: { classPropertyName: "maxItems", publicName: "maxItems", isSignal: true, isRequired: false, transformFunction: null }, itemsBeforeCollapse: { classPropertyName: "itemsBeforeCollapse", publicName: "itemsBeforeCollapse", isSignal: true, isRequired: false, transformFunction: null }, itemsAfterCollapse: { classPropertyName: "itemsAfterCollapse", publicName: "itemsAfterCollapse", isSignal: true, isRequired: false, transformFunction: null }, collapsedAriaLabel: { classPropertyName: "collapsedAriaLabel", publicName: "collapsedAriaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsedClick: "collapsedClick" }, host: { properties: { "class.hub-breadcrumb--truncate": "truncateItems()", "attr.data-variant": "variant() ?? null", "style.--hub-breadcrumb-accent": "customAccent()" }, classAttribute: "hub-breadcrumb" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: HubBreadcrumbItemDirective, descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0, template: "<nav aria-label=\"breadcrumb\" class=\"hub-breadcrumb__nav\">\n\t<ol class=\"hub-breadcrumb__list\">\n\t\t@for (row of rows(); track $index) {\n\t\t\t@if (row.item; as item) {\n\t\t\t\t<li\n\t\t\t\t\tclass=\"hub-breadcrumb__item\"\n\t\t\t\t\t[class.hub-breadcrumb__item--active]=\"row.isLast\"\n\t\t\t\t\t[attr.aria-current]=\"row.isLast ? 'page' : null\"\n\t\t\t\t>\n\t\t\t\t\t@if (itemTemplate(); as template) {\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t[ngTemplateOutlet]=\"template\"\n\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t$implicit: item,\n\t\t\t\t\t\t\t\tisLast: row.isLast\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else if (row.isLast) {\n\t\t\t\t\t\t<span class=\"hub-breadcrumb__text\" hubBreadcrumbLabel>{{ item.label }}</span>\n\t\t\t\t\t} @else if (item.href) {\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tclass=\"hub-breadcrumb__link\"\n\t\t\t\t\t\t\thubBreadcrumbLabel\n\t\t\t\t\t\t\t[href]=\"item.href\"\n\t\t\t\t\t\t\t[attr.target]=\"item.target ?? null\"\n\t\t\t\t\t\t\t[attr.rel]=\"row.rel\"\n\t\t\t\t\t\t\t[attr.download]=\"item.download ?? null\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<a [routerLink]=\"item.url\" class=\"hub-breadcrumb__link\" hubBreadcrumbLabel>\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t}\n\t\t\t\t</li>\n\t\t\t} @else {\n\t\t\t\t<li class=\"hub-breadcrumb__item hub-breadcrumb__item--collapsed\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"hub-breadcrumb__collapsed\"\n\t\t\t\t\t\t[attr.aria-label]=\"collapsedAriaLabel()\"\n\t\t\t\t\t\t[attr.aria-expanded]=\"expanded()\"\n\t\t\t\t\t\t(click)=\"expand()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t&hellip;\n\t\t\t\t\t</button>\n\t\t\t\t</li>\n\t\t\t}\n\t\t}\n\t</ol>\n</nav>\n", styles: [":root,:host{--hub-breadcrumb-padding-x: var(--hub-ref-space-3, 1rem);--hub-breadcrumb-padding-y: .25rem;--hub-breadcrumb-margin-bottom: var(--hub-ref-space-0, 0);--hub-breadcrumb-bg: var(--hub-sys-surface-page, transparent);--hub-breadcrumb-color: var(--hub-sys-text-primary, #212529);--hub-breadcrumb-border-radius: var(--hub-ref-radius-md, .375rem);--hub-breadcrumb-divider-color: var(--hub-sys-text-muted, #6c757d);--hub-breadcrumb-item-padding-x: var(--hub-ref-space-1, .25rem);--hub-breadcrumb-item-active-color: var(--hub-sys-text-muted, #6c757d);--hub-breadcrumb-accent-emphasis: color-mix(in oklch, var(--hub-breadcrumb-accent, var(--hub-sys-color-primary, #0d6efd)) 80%, var(--hub-sys-color-ink, #212529));--hub-breadcrumb-accent-subtle: color-mix(in oklch, var(--hub-breadcrumb-accent, var(--hub-sys-color-primary, #0d6efd)) 12%, var(--hub-sys-surface-page, #fff));--hub-breadcrumb-accent-on: oklch(from var(--hub-breadcrumb-accent, var(--hub-sys-color-primary, #0d6efd)) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-breadcrumb-link-color: var(--hub-breadcrumb-accent, var(--hub-sys-color-primary, #0d6efd));--hub-breadcrumb-link-hover-color: var(--hub-breadcrumb-accent-emphasis, var(--hub-sys-link-hover-color, #0a58ca));--hub-breadcrumb-link-decoration: none;--hub-breadcrumb-link-hover-decoration: underline;--hub-breadcrumb-link-focus-color: var(--hub-breadcrumb-accent-emphasis);--hub-breadcrumb-focus-bg: transparent;--hub-breadcrumb-focus-ring-width: var(--hub-sys-focus-ring-width, .25rem);--hub-breadcrumb-focus-ring-color: var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25));--hub-breadcrumb-focus-ring-radius: var(--hub-ref-radius-sm, .25rem);--hub-breadcrumb-collapsed-color: var(--hub-sys-text-muted, #6c757d);--hub-breadcrumb-collapsed-hover-color: var(--hub-breadcrumb-accent, var(--hub-sys-color-primary, #0d6efd));--hub-breadcrumb-collapsed-bg: transparent;--hub-breadcrumb-collapsed-hover-bg: var(--hub-breadcrumb-accent-subtle);--hub-breadcrumb-divider: \">\";--hub-breadcrumb-divider-flipped: \"<\";--hub-breadcrumb-font-size: inherit;--hub-breadcrumb-max-item-width: 12rem}.hub-breadcrumb__nav .hub-breadcrumb__list{display:flex;flex-wrap:wrap;font-size:var(--hub-breadcrumb-font-size, inherit);padding:var(--hub-breadcrumb-padding-y, .25rem) var(--hub-breadcrumb-padding-x, var(--hub-ref-space-3, 1rem));margin-bottom:var(--hub-breadcrumb-margin-bottom, var(--hub-ref-space-0, 0));list-style:none;color:var(--hub-breadcrumb-color, var(--hub-sys-text-primary, #212529));background-color:var(--hub-breadcrumb-bg, var(--hub-sys-surface-page, transparent));border-radius:var(--hub-breadcrumb-border-radius, var(--hub-ref-radius-md, .375rem))}.hub-breadcrumb__nav .hub-breadcrumb__item+.hub-breadcrumb__item{padding-inline-start:var(--hub-breadcrumb-item-padding-x, var(--hub-ref-space-1, .25rem))}.hub-breadcrumb__nav .hub-breadcrumb__item+.hub-breadcrumb__item:before{padding-inline-end:var(--hub-breadcrumb-item-padding-x, var(--hub-ref-space-1, .25rem));color:var(--hub-breadcrumb-divider-color, var(--hub-sys-text-muted, #6c757d));content:var(--hub-breadcrumb-divider, \">\")}.hub-breadcrumb__nav .hub-breadcrumb__item--active{color:var(--hub-breadcrumb-item-active-color, var(--hub-sys-text-muted, #6c757d))}.hub-breadcrumb__nav .hub-breadcrumb__link{color:var(--hub-breadcrumb-link-color, var(--hub-sys-link-color, #0d6efd));text-decoration:var(--hub-breadcrumb-link-decoration, none)}.hub-breadcrumb__nav .hub-breadcrumb__link:hover{color:var(--hub-breadcrumb-link-hover-color, var(--hub-sys-link-hover-color, #0a58ca));text-decoration:var(--hub-breadcrumb-link-hover-decoration, underline)}.hub-breadcrumb__nav .hub-breadcrumb__collapsed{display:inline-flex;align-items:center;padding:0 .125rem;border:0;border-radius:var(--hub-breadcrumb-focus-ring-radius, var(--hub-ref-radius-sm, .25rem));background-color:var(--hub-breadcrumb-collapsed-bg, transparent);color:var(--hub-breadcrumb-collapsed-color, var(--hub-sys-text-muted, #6c757d));font:inherit;line-height:inherit;cursor:pointer}.hub-breadcrumb__nav .hub-breadcrumb__collapsed:hover{background-color:var(--hub-breadcrumb-collapsed-hover-bg);color:var(--hub-breadcrumb-collapsed-hover-color)}.hub-breadcrumb__nav .hub-breadcrumb__link:focus-visible,.hub-breadcrumb__nav .hub-breadcrumb__collapsed:focus-visible{outline:0;border-radius:var(--hub-breadcrumb-focus-ring-radius, var(--hub-ref-radius-sm, .25rem));background-color:var(--hub-breadcrumb-focus-bg, transparent);color:var(--hub-breadcrumb-link-focus-color);box-shadow:0 0 0 var(--hub-breadcrumb-focus-ring-width, var(--hub-sys-focus-ring-width, .25rem)) var(--hub-breadcrumb-focus-ring-color, var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25)))}[dir=rtl] .hub-breadcrumb__nav .hub-breadcrumb__item+.hub-breadcrumb__item:before{content:var(--hub-breadcrumb-divider-flipped, var(--hub-breadcrumb-divider, \">\"))}:host(.hub-breadcrumb--truncate) .hub-breadcrumb__nav .hub-breadcrumb__link,:host(.hub-breadcrumb--truncate) .hub-breadcrumb__nav .hub-breadcrumb__text,.hub-breadcrumb--truncate .hub-breadcrumb__nav .hub-breadcrumb__link,.hub-breadcrumb--truncate .hub-breadcrumb__nav .hub-breadcrumb__text{display:inline-block;max-inline-size:var(--hub-breadcrumb-max-item-width, 12rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}:host([data-variant=primary]),.hub-breadcrumb[data-variant=primary]{--hub-breadcrumb-accent: var(--hub-sys-color-primary)}:host([data-variant=secondary]),.hub-breadcrumb[data-variant=secondary]{--hub-breadcrumb-accent: var(--hub-sys-color-secondary)}:host([data-variant=success]),.hub-breadcrumb[data-variant=success]{--hub-breadcrumb-accent: var(--hub-sys-color-success)}:host([data-variant=danger]),.hub-breadcrumb[data-variant=danger]{--hub-breadcrumb-accent: var(--hub-sys-color-danger)}:host([data-variant=warning]),.hub-breadcrumb[data-variant=warning]{--hub-breadcrumb-accent: var(--hub-sys-color-warning)}:host([data-variant=info]),.hub-breadcrumb[data-variant=info]{--hub-breadcrumb-accent: var(--hub-sys-color-info)}:host([data-variant=neutral]),.hub-breadcrumb[data-variant=neutral]{--hub-breadcrumb-accent: var(--hub-sys-color-neutral)}:host([data-variant=light]),.hub-breadcrumb[data-variant=light]{--hub-breadcrumb-accent: var(--hub-sys-color-light)}:host([data-variant=dark]),.hub-breadcrumb[data-variant=dark]{--hub-breadcrumb-accent: var(--hub-sys-color-dark)}:host([data-variant]),.hub-breadcrumb[data-variant]{--hub-breadcrumb-accent-emphasis: color-mix(in oklch, var(--hub-breadcrumb-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-breadcrumb-accent-subtle: color-mix(in oklch, var(--hub-breadcrumb-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-breadcrumb-accent-on: oklch(from var(--hub-breadcrumb-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-breadcrumb-link-hover-color: var(--hub-breadcrumb-accent-emphasis)}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: HubBreadcrumbLabelDirective, selector: "[hubBreadcrumbLabel]", inputs: ["hubBreadcrumbLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
325
371
  }
326
372
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HubBreadcrumbComponent, decorators: [{
327
373
  type: Component,
328
- args: [{ selector: 'hub-breadcrumb', imports: [RouterLink, NgTemplateOutlet, HubBreadcrumbLabelDirective], host: {
374
+ args: [{ selector: 'hub-breadcrumb', imports: [RouterLink, NgTemplateOutlet, HubBreadcrumbLabelDirective], changeDetection: ChangeDetectionStrategy.OnPush, host: {
329
375
  class: 'hub-breadcrumb',
330
376
  '[class.hub-breadcrumb--truncate]': 'truncateItems()',
331
377
  '[attr.data-variant]': 'variant() ?? null',
332
378
  '[style.--hub-breadcrumb-accent]': 'customAccent()'
333
- }, template: "<nav aria-label=\"breadcrumb\" class=\"hub-breadcrumb__nav\">\n\t<ol class=\"hub-breadcrumb__list\">\n\t\t@for (row of rows(); track $index) {\n\t\t\t@if (row.item; as item) {\n\t\t\t\t<li class=\"hub-breadcrumb__item\" [class.hub-breadcrumb__item--active]=\"row.isLast\">\n\t\t\t\t\t@if (itemTemplate(); as template) {\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t[ngTemplateOutlet]=\"template\"\n\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t$implicit: item,\n\t\t\t\t\t\t\t\tisLast: row.isLast\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else if (row.isLast) {\n\t\t\t\t\t\t<span class=\"hub-breadcrumb__text\" hubBreadcrumbLabel aria-current=\"page\">{{ item.label }}</span>\n\t\t\t\t\t} @else if (item.href) {\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tclass=\"hub-breadcrumb__link\"\n\t\t\t\t\t\t\thubBreadcrumbLabel\n\t\t\t\t\t\t\t[href]=\"item.href\"\n\t\t\t\t\t\t\t[attr.target]=\"item.target ?? null\"\n\t\t\t\t\t\t\t[attr.rel]=\"row.rel\"\n\t\t\t\t\t\t\t[attr.download]=\"item.download ?? null\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<a [routerLink]=\"item.url\" class=\"hub-breadcrumb__link\" hubBreadcrumbLabel>\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t}\n\t\t\t\t</li>\n\t\t\t} @else {\n\t\t\t\t<li class=\"hub-breadcrumb__item hub-breadcrumb__item--collapsed\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"hub-breadcrumb__collapsed\"\n\t\t\t\t\t\t[attr.aria-label]=\"collapsedAriaLabel()\"\n\t\t\t\t\t\t[attr.aria-expanded]=\"expanded()\"\n\t\t\t\t\t\t(click)=\"expand()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t&hellip;\n\t\t\t\t\t</button>\n\t\t\t\t</li>\n\t\t\t}\n\t\t}\n\t</ol>\n</nav>\n", styles: [":root,:host{--hub-breadcrumb-padding-x: var(--hub-ref-space-3, 1rem);--hub-breadcrumb-padding-y: .25rem;--hub-breadcrumb-margin-bottom: var(--hub-ref-space-0, 0);--hub-breadcrumb-bg: var(--hub-sys-surface-page, transparent);--hub-breadcrumb-color: var(--hub-sys-text-primary, #212529);--hub-breadcrumb-border-radius: var(--hub-ref-radius-md, .375rem);--hub-breadcrumb-divider-color: var(--hub-sys-text-muted, #6c757d);--hub-breadcrumb-item-padding-x: var(--hub-ref-space-1, .25rem);--hub-breadcrumb-item-active-color: var(--hub-sys-text-muted, #6c757d);--hub-breadcrumb-accent: var(--hub-sys-color-primary, #0d6efd);--hub-breadcrumb-accent-emphasis: color-mix(in oklch, var(--hub-breadcrumb-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-breadcrumb-accent-subtle: color-mix(in oklch, var(--hub-breadcrumb-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-breadcrumb-accent-on: oklch(from var(--hub-breadcrumb-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-breadcrumb-link-color: var(--hub-breadcrumb-accent);--hub-breadcrumb-link-hover-color: var(--hub-breadcrumb-accent-emphasis, var(--hub-sys-link-hover-color, #0a58ca));--hub-breadcrumb-link-decoration: none;--hub-breadcrumb-link-hover-decoration: underline;--hub-breadcrumb-link-focus-color: var(--hub-breadcrumb-accent-emphasis);--hub-breadcrumb-focus-bg: transparent;--hub-breadcrumb-focus-ring-width: var(--hub-sys-focus-ring-width, .25rem);--hub-breadcrumb-focus-ring-color: var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25));--hub-breadcrumb-focus-ring-radius: var(--hub-ref-radius-sm, .25rem);--hub-breadcrumb-collapsed-color: var(--hub-sys-text-muted, #6c757d);--hub-breadcrumb-collapsed-hover-color: var(--hub-breadcrumb-accent);--hub-breadcrumb-collapsed-bg: transparent;--hub-breadcrumb-collapsed-hover-bg: var(--hub-breadcrumb-accent-subtle);--hub-breadcrumb-divider: \">\";--hub-breadcrumb-divider-flipped: \"<\";--hub-breadcrumb-font-size: inherit;--hub-breadcrumb-max-item-width: 12rem}.hub-breadcrumb__nav .hub-breadcrumb__list{display:flex;flex-wrap:wrap;font-size:var(--hub-breadcrumb-font-size, inherit);padding:var(--hub-breadcrumb-padding-y, .25rem) var(--hub-breadcrumb-padding-x, var(--hub-ref-space-3, 1rem));margin-bottom:var(--hub-breadcrumb-margin-bottom, var(--hub-ref-space-0, 0));list-style:none;color:var(--hub-breadcrumb-color, var(--hub-sys-text-primary, #212529));background-color:var(--hub-breadcrumb-bg, var(--hub-sys-surface-page, transparent));border-radius:var(--hub-breadcrumb-border-radius, var(--hub-ref-radius-md, .375rem))}.hub-breadcrumb__nav .hub-breadcrumb__item+.hub-breadcrumb__item{padding-inline-start:var(--hub-breadcrumb-item-padding-x, var(--hub-ref-space-1, .25rem))}.hub-breadcrumb__nav .hub-breadcrumb__item+.hub-breadcrumb__item:before{padding-inline-end:var(--hub-breadcrumb-item-padding-x, var(--hub-ref-space-1, .25rem));color:var(--hub-breadcrumb-divider-color, var(--hub-sys-text-muted, #6c757d));content:var(--hub-breadcrumb-divider, \">\")}.hub-breadcrumb__nav .hub-breadcrumb__item--active{color:var(--hub-breadcrumb-item-active-color, var(--hub-sys-text-muted, #6c757d))}.hub-breadcrumb__nav .hub-breadcrumb__link{color:var(--hub-breadcrumb-link-color, var(--hub-sys-link-color, #0d6efd));text-decoration:var(--hub-breadcrumb-link-decoration, none)}.hub-breadcrumb__nav .hub-breadcrumb__link:hover{color:var(--hub-breadcrumb-link-hover-color, var(--hub-sys-link-hover-color, #0a58ca));text-decoration:var(--hub-breadcrumb-link-hover-decoration, underline)}.hub-breadcrumb__nav .hub-breadcrumb__collapsed{display:inline-flex;align-items:center;padding:0 .125rem;border:0;border-radius:var(--hub-breadcrumb-focus-ring-radius, var(--hub-ref-radius-sm, .25rem));background-color:var(--hub-breadcrumb-collapsed-bg, transparent);color:var(--hub-breadcrumb-collapsed-color, var(--hub-sys-text-muted, #6c757d));font:inherit;line-height:inherit;cursor:pointer}.hub-breadcrumb__nav .hub-breadcrumb__collapsed:hover{background-color:var(--hub-breadcrumb-collapsed-hover-bg);color:var(--hub-breadcrumb-collapsed-hover-color)}.hub-breadcrumb__nav .hub-breadcrumb__link:focus-visible,.hub-breadcrumb__nav .hub-breadcrumb__collapsed:focus-visible{outline:0;border-radius:var(--hub-breadcrumb-focus-ring-radius, var(--hub-ref-radius-sm, .25rem));background-color:var(--hub-breadcrumb-focus-bg, transparent);color:var(--hub-breadcrumb-link-focus-color);box-shadow:0 0 0 var(--hub-breadcrumb-focus-ring-width, var(--hub-sys-focus-ring-width, .25rem)) var(--hub-breadcrumb-focus-ring-color, var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25)))}[dir=rtl] .hub-breadcrumb__nav .hub-breadcrumb__item+.hub-breadcrumb__item:before{content:var(--hub-breadcrumb-divider-flipped, var(--hub-breadcrumb-divider, \">\"))}:host(.hub-breadcrumb--truncate) .hub-breadcrumb__nav .hub-breadcrumb__link,:host(.hub-breadcrumb--truncate) .hub-breadcrumb__nav .hub-breadcrumb__text,.hub-breadcrumb--truncate .hub-breadcrumb__nav .hub-breadcrumb__link,.hub-breadcrumb--truncate .hub-breadcrumb__nav .hub-breadcrumb__text{display:inline-block;max-inline-size:var(--hub-breadcrumb-max-item-width, 12rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}:host([data-variant=primary]),.hub-breadcrumb[data-variant=primary]{--hub-breadcrumb-accent: var(--hub-sys-color-primary)}:host([data-variant=secondary]),.hub-breadcrumb[data-variant=secondary]{--hub-breadcrumb-accent: var(--hub-sys-color-secondary)}:host([data-variant=success]),.hub-breadcrumb[data-variant=success]{--hub-breadcrumb-accent: var(--hub-sys-color-success)}:host([data-variant=danger]),.hub-breadcrumb[data-variant=danger]{--hub-breadcrumb-accent: var(--hub-sys-color-danger)}:host([data-variant=warning]),.hub-breadcrumb[data-variant=warning]{--hub-breadcrumb-accent: var(--hub-sys-color-warning)}:host([data-variant=info]),.hub-breadcrumb[data-variant=info]{--hub-breadcrumb-accent: var(--hub-sys-color-info)}:host([data-variant=neutral]),.hub-breadcrumb[data-variant=neutral]{--hub-breadcrumb-accent: var(--hub-sys-color-neutral)}:host([data-variant=light]),.hub-breadcrumb[data-variant=light]{--hub-breadcrumb-accent: var(--hub-sys-color-light)}:host([data-variant=dark]),.hub-breadcrumb[data-variant=dark]{--hub-breadcrumb-accent: var(--hub-sys-color-dark)}:host([data-variant]),.hub-breadcrumb[data-variant]{--hub-breadcrumb-accent-emphasis: color-mix(in oklch, var(--hub-breadcrumb-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-breadcrumb-accent-subtle: color-mix(in oklch, var(--hub-breadcrumb-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-breadcrumb-accent-on: oklch(from var(--hub-breadcrumb-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-breadcrumb-link-hover-color: var(--hub-breadcrumb-accent-emphasis)}\n"] }]
379
+ }, template: "<nav aria-label=\"breadcrumb\" class=\"hub-breadcrumb__nav\">\n\t<ol class=\"hub-breadcrumb__list\">\n\t\t@for (row of rows(); track $index) {\n\t\t\t@if (row.item; as item) {\n\t\t\t\t<li\n\t\t\t\t\tclass=\"hub-breadcrumb__item\"\n\t\t\t\t\t[class.hub-breadcrumb__item--active]=\"row.isLast\"\n\t\t\t\t\t[attr.aria-current]=\"row.isLast ? 'page' : null\"\n\t\t\t\t>\n\t\t\t\t\t@if (itemTemplate(); as template) {\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t[ngTemplateOutlet]=\"template\"\n\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t$implicit: item,\n\t\t\t\t\t\t\t\tisLast: row.isLast\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else if (row.isLast) {\n\t\t\t\t\t\t<span class=\"hub-breadcrumb__text\" hubBreadcrumbLabel>{{ item.label }}</span>\n\t\t\t\t\t} @else if (item.href) {\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tclass=\"hub-breadcrumb__link\"\n\t\t\t\t\t\t\thubBreadcrumbLabel\n\t\t\t\t\t\t\t[href]=\"item.href\"\n\t\t\t\t\t\t\t[attr.target]=\"item.target ?? null\"\n\t\t\t\t\t\t\t[attr.rel]=\"row.rel\"\n\t\t\t\t\t\t\t[attr.download]=\"item.download ?? null\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<a [routerLink]=\"item.url\" class=\"hub-breadcrumb__link\" hubBreadcrumbLabel>\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t}\n\t\t\t\t</li>\n\t\t\t} @else {\n\t\t\t\t<li class=\"hub-breadcrumb__item hub-breadcrumb__item--collapsed\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"hub-breadcrumb__collapsed\"\n\t\t\t\t\t\t[attr.aria-label]=\"collapsedAriaLabel()\"\n\t\t\t\t\t\t[attr.aria-expanded]=\"expanded()\"\n\t\t\t\t\t\t(click)=\"expand()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t&hellip;\n\t\t\t\t\t</button>\n\t\t\t\t</li>\n\t\t\t}\n\t\t}\n\t</ol>\n</nav>\n", styles: [":root,:host{--hub-breadcrumb-padding-x: var(--hub-ref-space-3, 1rem);--hub-breadcrumb-padding-y: .25rem;--hub-breadcrumb-margin-bottom: var(--hub-ref-space-0, 0);--hub-breadcrumb-bg: var(--hub-sys-surface-page, transparent);--hub-breadcrumb-color: var(--hub-sys-text-primary, #212529);--hub-breadcrumb-border-radius: var(--hub-ref-radius-md, .375rem);--hub-breadcrumb-divider-color: var(--hub-sys-text-muted, #6c757d);--hub-breadcrumb-item-padding-x: var(--hub-ref-space-1, .25rem);--hub-breadcrumb-item-active-color: var(--hub-sys-text-muted, #6c757d);--hub-breadcrumb-accent-emphasis: color-mix(in oklch, var(--hub-breadcrumb-accent, var(--hub-sys-color-primary, #0d6efd)) 80%, var(--hub-sys-color-ink, #212529));--hub-breadcrumb-accent-subtle: color-mix(in oklch, var(--hub-breadcrumb-accent, var(--hub-sys-color-primary, #0d6efd)) 12%, var(--hub-sys-surface-page, #fff));--hub-breadcrumb-accent-on: oklch(from var(--hub-breadcrumb-accent, var(--hub-sys-color-primary, #0d6efd)) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-breadcrumb-link-color: var(--hub-breadcrumb-accent, var(--hub-sys-color-primary, #0d6efd));--hub-breadcrumb-link-hover-color: var(--hub-breadcrumb-accent-emphasis, var(--hub-sys-link-hover-color, #0a58ca));--hub-breadcrumb-link-decoration: none;--hub-breadcrumb-link-hover-decoration: underline;--hub-breadcrumb-link-focus-color: var(--hub-breadcrumb-accent-emphasis);--hub-breadcrumb-focus-bg: transparent;--hub-breadcrumb-focus-ring-width: var(--hub-sys-focus-ring-width, .25rem);--hub-breadcrumb-focus-ring-color: var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25));--hub-breadcrumb-focus-ring-radius: var(--hub-ref-radius-sm, .25rem);--hub-breadcrumb-collapsed-color: var(--hub-sys-text-muted, #6c757d);--hub-breadcrumb-collapsed-hover-color: var(--hub-breadcrumb-accent, var(--hub-sys-color-primary, #0d6efd));--hub-breadcrumb-collapsed-bg: transparent;--hub-breadcrumb-collapsed-hover-bg: var(--hub-breadcrumb-accent-subtle);--hub-breadcrumb-divider: \">\";--hub-breadcrumb-divider-flipped: \"<\";--hub-breadcrumb-font-size: inherit;--hub-breadcrumb-max-item-width: 12rem}.hub-breadcrumb__nav .hub-breadcrumb__list{display:flex;flex-wrap:wrap;font-size:var(--hub-breadcrumb-font-size, inherit);padding:var(--hub-breadcrumb-padding-y, .25rem) var(--hub-breadcrumb-padding-x, var(--hub-ref-space-3, 1rem));margin-bottom:var(--hub-breadcrumb-margin-bottom, var(--hub-ref-space-0, 0));list-style:none;color:var(--hub-breadcrumb-color, var(--hub-sys-text-primary, #212529));background-color:var(--hub-breadcrumb-bg, var(--hub-sys-surface-page, transparent));border-radius:var(--hub-breadcrumb-border-radius, var(--hub-ref-radius-md, .375rem))}.hub-breadcrumb__nav .hub-breadcrumb__item+.hub-breadcrumb__item{padding-inline-start:var(--hub-breadcrumb-item-padding-x, var(--hub-ref-space-1, .25rem))}.hub-breadcrumb__nav .hub-breadcrumb__item+.hub-breadcrumb__item:before{padding-inline-end:var(--hub-breadcrumb-item-padding-x, var(--hub-ref-space-1, .25rem));color:var(--hub-breadcrumb-divider-color, var(--hub-sys-text-muted, #6c757d));content:var(--hub-breadcrumb-divider, \">\")}.hub-breadcrumb__nav .hub-breadcrumb__item--active{color:var(--hub-breadcrumb-item-active-color, var(--hub-sys-text-muted, #6c757d))}.hub-breadcrumb__nav .hub-breadcrumb__link{color:var(--hub-breadcrumb-link-color, var(--hub-sys-link-color, #0d6efd));text-decoration:var(--hub-breadcrumb-link-decoration, none)}.hub-breadcrumb__nav .hub-breadcrumb__link:hover{color:var(--hub-breadcrumb-link-hover-color, var(--hub-sys-link-hover-color, #0a58ca));text-decoration:var(--hub-breadcrumb-link-hover-decoration, underline)}.hub-breadcrumb__nav .hub-breadcrumb__collapsed{display:inline-flex;align-items:center;padding:0 .125rem;border:0;border-radius:var(--hub-breadcrumb-focus-ring-radius, var(--hub-ref-radius-sm, .25rem));background-color:var(--hub-breadcrumb-collapsed-bg, transparent);color:var(--hub-breadcrumb-collapsed-color, var(--hub-sys-text-muted, #6c757d));font:inherit;line-height:inherit;cursor:pointer}.hub-breadcrumb__nav .hub-breadcrumb__collapsed:hover{background-color:var(--hub-breadcrumb-collapsed-hover-bg);color:var(--hub-breadcrumb-collapsed-hover-color)}.hub-breadcrumb__nav .hub-breadcrumb__link:focus-visible,.hub-breadcrumb__nav .hub-breadcrumb__collapsed:focus-visible{outline:0;border-radius:var(--hub-breadcrumb-focus-ring-radius, var(--hub-ref-radius-sm, .25rem));background-color:var(--hub-breadcrumb-focus-bg, transparent);color:var(--hub-breadcrumb-link-focus-color);box-shadow:0 0 0 var(--hub-breadcrumb-focus-ring-width, var(--hub-sys-focus-ring-width, .25rem)) var(--hub-breadcrumb-focus-ring-color, var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25)))}[dir=rtl] .hub-breadcrumb__nav .hub-breadcrumb__item+.hub-breadcrumb__item:before{content:var(--hub-breadcrumb-divider-flipped, var(--hub-breadcrumb-divider, \">\"))}:host(.hub-breadcrumb--truncate) .hub-breadcrumb__nav .hub-breadcrumb__link,:host(.hub-breadcrumb--truncate) .hub-breadcrumb__nav .hub-breadcrumb__text,.hub-breadcrumb--truncate .hub-breadcrumb__nav .hub-breadcrumb__link,.hub-breadcrumb--truncate .hub-breadcrumb__nav .hub-breadcrumb__text{display:inline-block;max-inline-size:var(--hub-breadcrumb-max-item-width, 12rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}:host([data-variant=primary]),.hub-breadcrumb[data-variant=primary]{--hub-breadcrumb-accent: var(--hub-sys-color-primary)}:host([data-variant=secondary]),.hub-breadcrumb[data-variant=secondary]{--hub-breadcrumb-accent: var(--hub-sys-color-secondary)}:host([data-variant=success]),.hub-breadcrumb[data-variant=success]{--hub-breadcrumb-accent: var(--hub-sys-color-success)}:host([data-variant=danger]),.hub-breadcrumb[data-variant=danger]{--hub-breadcrumb-accent: var(--hub-sys-color-danger)}:host([data-variant=warning]),.hub-breadcrumb[data-variant=warning]{--hub-breadcrumb-accent: var(--hub-sys-color-warning)}:host([data-variant=info]),.hub-breadcrumb[data-variant=info]{--hub-breadcrumb-accent: var(--hub-sys-color-info)}:host([data-variant=neutral]),.hub-breadcrumb[data-variant=neutral]{--hub-breadcrumb-accent: var(--hub-sys-color-neutral)}:host([data-variant=light]),.hub-breadcrumb[data-variant=light]{--hub-breadcrumb-accent: var(--hub-sys-color-light)}:host([data-variant=dark]),.hub-breadcrumb[data-variant=dark]{--hub-breadcrumb-accent: var(--hub-sys-color-dark)}:host([data-variant]),.hub-breadcrumb[data-variant]{--hub-breadcrumb-accent-emphasis: color-mix(in oklch, var(--hub-breadcrumb-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-breadcrumb-accent-subtle: color-mix(in oklch, var(--hub-breadcrumb-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-breadcrumb-accent-on: oklch(from var(--hub-breadcrumb-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-breadcrumb-link-hover-color: var(--hub-breadcrumb-accent-emphasis)}\n"] }]
334
380
  }], propDecorators: { itemTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => HubBreadcrumbItemDirective), { ...{ read: TemplateRef }, isSignal: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], truncateItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "truncateItems", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], maxItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxItems", required: false }] }], itemsBeforeCollapse: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemsBeforeCollapse", required: false }] }], itemsAfterCollapse: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemsAfterCollapse", required: false }] }], collapsedAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedAriaLabel", required: false }] }], collapsedClick: [{ type: i0.Output, args: ["collapsedClick"] }] } });
335
381
 
382
+ /**
383
+ * Backward-compatibility module for NgModule-based applications.
384
+ *
385
+ * @deprecated Import the standalone `HubBreadcrumbComponent` and `HubBreadcrumbItemDirective`
386
+ * directly; this module only re-exports them and provides nothing of its own. Scheduled for
387
+ * removal in **23.0.0**.
388
+ */
336
389
  class HubBreadcrumbsModule {
337
390
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HubBreadcrumbsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
338
391
  static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: HubBreadcrumbsModule, imports: [HubBreadcrumbComponent, HubBreadcrumbItemDirective], exports: [HubBreadcrumbComponent, HubBreadcrumbItemDirective] });
@@ -1 +1 @@
1
- {"version":3,"file":"ng-hub-ui-breadcrumbs.mjs","sources":["../../../projects/breadcrumbs/src/lib/directives/breadcrumb-item.directive.ts","../../../projects/breadcrumbs/src/lib/breadcrumb-tooltip/breadcrumb-tooltip.token.ts","../../../projects/breadcrumbs/src/lib/directives/breadcrumb-label.directive.ts","../../../projects/breadcrumbs/src/lib/services/breadcrumbs.service.ts","../../../projects/breadcrumbs/src/lib/components/breadcrumb/breadcrumb.component.ts","../../../projects/breadcrumbs/src/lib/components/breadcrumb/breadcrumb.component.html","../../../projects/breadcrumbs/src/lib/breadcrumbs.module.ts","../../../projects/breadcrumbs/src/lib/breadcrumb-tooltip/breadcrumb-tooltip.provider.ts","../../../projects/breadcrumbs/src/public-api.ts","../../../projects/breadcrumbs/src/ng-hub-ui-breadcrumbs.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BreadcrumbTemplateContext } from '../models/breadcrumb-template-context';\n\n@Directive({\n\tselector: '[hubBreadcrumbItem]'\n})\nexport class HubBreadcrumbItemDirective {\n\ttemplate = inject(TemplateRef<BreadcrumbTemplateContext>);\n}\n","import { InjectionToken } from '@angular/core';\nimport { HubBreadcrumbTooltipAdapter } from './breadcrumb-tooltip.types';\n\n/**\n * Injection token resolving the optional tooltip adapter used by truncated\n * breadcrumb labels.\n *\n * Inject it with `{ optional: true }`; a `null` value means \"use the native\n * `title` fallback\". Register it through {@link provideHubBreadcrumbTooltip}.\n */\nexport const HUB_BREADCRUMB_TOOLTIP_ADAPTER = new InjectionToken<HubBreadcrumbTooltipAdapter>('HUB_BREADCRUMB_TOOLTIP_ADAPTER');\n","import { afterNextRender, Directive, effect, ElementRef, inject, input, OnDestroy, signal } from '@angular/core';\nimport { HUB_BREADCRUMB_TOOLTIP_ADAPTER } from '../breadcrumb-tooltip/breadcrumb-tooltip.token';\nimport { HubBreadcrumbTooltipHandle } from '../breadcrumb-tooltip/breadcrumb-tooltip.types';\n\n/**\n * Adds an overflow-aware tooltip to a breadcrumb label element.\n *\n * Apply `[hubBreadcrumbLabel]` to the link/text of each breadcrumb item. When the\n * label is truncated (its rendered text is wider than its box — typically because\n * `hub-breadcrumb` truncation is enabled), the directive exposes the full text as\n * a tooltip: the native `title` attribute by default, or the richer hub-ui\n * tooltip when a {@link HUB_BREADCRUMB_TOOLTIP_ADAPTER} is provided. When the\n * label fits, no tooltip is shown.\n */\n@Directive({\n\tselector: '[hubBreadcrumbLabel]'\n})\nexport class HubBreadcrumbLabelDirective implements OnDestroy {\n\t/**\n\t * Explicit tooltip text. When empty, the host's own text content is used, but\n\t * only while it is truncated.\n\t */\n\treadonly tooltip = input('', { alias: 'hubBreadcrumbLabel' });\n\n\tprivate readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n\t/** Optional hub-ui tooltip adapter; absent means native `title` fallback. */\n\tprivate readonly adapter = inject(HUB_BREADCRUMB_TOOLTIP_ADAPTER, { optional: true });\n\n\t/** Whether the rendered label is wider than its clipping box. */\n\tprivate readonly isOverflowing = signal(false);\n\n\t/** Trimmed text content of the label, used as the auto tooltip source. */\n\tprivate readonly text = signal('');\n\n\t/** Becomes true once the browser-only overflow tracking is wired. */\n\tprivate readonly ready = signal(false);\n\n\tprivate resizeObserver: ResizeObserver | null = null;\n\tprivate mutationObserver: MutationObserver | null = null;\n\tprivate handle: HubBreadcrumbTooltipHandle | null = null;\n\n\tconstructor() {\n\t\tafterNextRender(() => this.initOverflowTracking());\n\n\t\teffect(() => {\n\t\t\tif (!this.ready()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst explicit = this.tooltip().trim();\n\t\t\tconst text = explicit || (this.isOverflowing() ? this.text() : '');\n\t\t\tthis.applyTooltip(text);\n\t\t});\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.resizeObserver?.disconnect();\n\t\tthis.mutationObserver?.disconnect();\n\t\tthis.handle?.destroy();\n\t\tthis.handle = null;\n\t}\n\n\t/** Wires browser-only observers that keep the truncation state in sync. */\n\tprivate initOverflowTracking(): void {\n\t\tconst el = this.host.nativeElement;\n\t\tthis.measure(el);\n\n\t\tif (typeof ResizeObserver !== 'undefined') {\n\t\t\tthis.resizeObserver = new ResizeObserver(() => this.measure(el));\n\t\t\tthis.resizeObserver.observe(el);\n\t\t}\n\n\t\tif (typeof MutationObserver !== 'undefined') {\n\t\t\tthis.mutationObserver = new MutationObserver(() => this.measure(el));\n\t\t\tthis.mutationObserver.observe(el, { childList: true, characterData: true, subtree: true });\n\t\t}\n\n\t\tthis.ready.set(true);\n\t}\n\n\t/** Reads the host's text and truncation state into the signals. */\n\tprivate measure(el: HTMLElement): void {\n\t\tthis.text.set((el.textContent ?? '').trim());\n\t\tthis.isOverflowing.set(el.scrollWidth > el.clientWidth + 1);\n\t}\n\n\t/**\n\t * Applies the effective tooltip text through the hub-ui adapter when present,\n\t * or the native `title` attribute otherwise. An empty text removes both.\n\t */\n\tprivate applyTooltip(text: string): void {\n\t\tconst el = this.host.nativeElement;\n\n\t\tif (this.adapter) {\n\t\t\tel.removeAttribute('title');\n\t\t\tif (text) {\n\t\t\t\tif (this.handle) {\n\t\t\t\t\tthis.handle.update(text);\n\t\t\t\t} else {\n\t\t\t\t\tthis.handle = this.adapter.attach(el, text);\n\t\t\t\t}\n\t\t\t} else if (this.handle) {\n\t\t\t\tthis.handle.destroy();\n\t\t\t\tthis.handle = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (text) {\n\t\t\tel.setAttribute('title', text);\n\t\t} else {\n\t\t\tel.removeAttribute('title');\n\t\t}\n\t}\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\nimport { filter, map, startWith } from 'rxjs';\nimport { BreadcrumbItem, BreadcrumbRouteConfig, BreadcrumbRouteData } from '../models/breadcrumb-item';\n\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class HubBreadcrumbsService {\n\t#router = inject(Router);\n\t#activatedRoute = inject(ActivatedRoute);\n\n\tbreadcrumbs$ = this.#router.events.pipe(\n\t\tfilter((event) => event instanceof NavigationEnd),\n\t\tstartWith(undefined),\n\t\tmap(() => this.createBreadcrumbs(this.#activatedRoute.root))\n\t);\n\n\tprivate createBreadcrumbs(route: ActivatedRoute, url: string = '', breadcrumbs: BreadcrumbItem[] = []): BreadcrumbItem[] {\n\t\tconst children: ActivatedRoute[] = route.children;\n\n\t\tif (children.length === 0) {\n\t\t\treturn breadcrumbs;\n\t\t}\n\n\t\tfor (const child of children) {\n\t\t\t// A route is recognised before it is activated, and carries `_futureSnapshot`\n\t\t\t// in between while `snapshot` is still unset. `breadcrumbs$` opens with\n\t\t\t// `startWith(undefined)`, so a shell that draws its breadcrumb on the first\n\t\t\t// paint walks the tree inside that window — and reading `.url` there threw,\n\t\t\t// out of a subscription that draws the whole page header, taking the header\n\t\t\t// with it. There is nothing to name yet either: a route with no snapshot has\n\t\t\t// no segments and no resolved data, so it is skipped rather than guessed at.\n\t\t\tif (!child.snapshot) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst routeSegments = child.snapshot.url;\n\n\t\t\t// URL of this level\n\t\t\tconst routeURL: string = routeSegments.map((segment) => segment.path).join('/');\n\n\t\t\tconst nextUrl = routeURL ? `${url}/${routeURL}` : url;\n\n\t\t\t// Only the routes declaring their own breadcrumb become a crumb\n\t\t\tconst hasBreadcrumbData = this.hasOwnBreadcrumbData(child);\n\n\t\t\tif (hasBreadcrumbData) {\n\t\t\t\tbreadcrumbs.push(this.createItem(child, nextUrl));\n\t\t\t}\n\n\t\t\treturn this.createBreadcrumbs(child, nextUrl, breadcrumbs);\n\t\t}\n\n\t\treturn breadcrumbs;\n\t}\n\n\tprivate hasOwnBreadcrumbData(route: ActivatedRoute): boolean {\n\t\tconst routeConfig = route.routeConfig;\n\t\treturn !!(routeConfig && routeConfig.data && routeConfig.data['breadcrumb']);\n\t}\n\n\t/**\n\t * Builds the crumb for a route. The object form of `data.breadcrumb` carries\n\t * anchor metadata for destinations outside the router; whatever accompanies\n\t * `label` there travels to the item untouched, so a new anchor attribute needs\n\t * no change here.\n\t */\n\tprivate createItem(route: ActivatedRoute, url: string): BreadcrumbItem {\n\t\tconst data = route.snapshot.data;\n\t\tconst config: BreadcrumbRouteData = data['breadcrumb'];\n\n\t\tif (this.isRouteConfig(config)) {\n\t\t\tconst { label: labelSource, ...anchor } = config;\n\t\t\treturn { label: this.resolveLabel(labelSource, data), url, data, ...anchor };\n\t\t}\n\n\t\treturn { label: this.resolveLabel(config, data), url, data };\n\t}\n\n\t/** Narrows `data.breadcrumb` to its object form, excluding the function form. */\n\tprivate isRouteConfig(config: BreadcrumbRouteData): config is BreadcrumbRouteConfig {\n\t\treturn typeof config === 'object' && config !== null;\n\t}\n\n\tprivate resolveLabel(source: string | ((data: any) => string), data: any): string {\n\t\tconst label = typeof source === 'function' ? source(data) : source;\n\n\t\treturn data['resolvedData'] ? this.getResolvedBreadcrumb(label, data['resolvedData']) : label;\n\t}\n\n\tprivate getResolvedBreadcrumb(template: string, data: any): string {\n\t\treturn template.replace(/\\{([^}]+)\\}/g, (match, key) => {\n\t\t\treturn data[key] || match;\n\t\t});\n\t}\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, contentChild, inject, input, linkedSignal, output, TemplateRef } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { RouterLink } from '@angular/router';\nimport { HubBreadcrumbItemDirective } from '../../directives/breadcrumb-item.directive';\nimport { HubBreadcrumbLabelDirective } from '../../directives/breadcrumb-label.directive';\nimport { BreadcrumbItem } from '../../models/breadcrumb-item';\nimport { HubBreadcrumbsService } from '../../services/breadcrumbs.service';\n\n/** Variants with exact design-system token coverage via the SCSS `@each` loop. */\nconst BUILT_IN_VARIANTS = new Set<string>(['primary', 'success', 'danger', 'warning', 'info']);\n\n/**\n * One rendered position of the trail. A `null` item is the collapsed indicator,\n * which occupies a position of its own so the separators fall around it exactly\n * as they do around a crumb.\n */\ninterface BreadcrumbRow {\n\titem: BreadcrumbItem | null;\n\tisLast: boolean;\n\t/** Resolved anchor `rel`, already defended for `_blank` targets. */\n\trel: string | null;\n}\n\n@Component({\n\tselector: 'hub-breadcrumb',\n\timports: [RouterLink, NgTemplateOutlet, HubBreadcrumbLabelDirective],\n\ttemplateUrl: './breadcrumb.component.html',\n\tstyleUrl: './breadcrumb.component.scss',\n\thost: {\n\t\tclass: 'hub-breadcrumb',\n\t\t'[class.hub-breadcrumb--truncate]': 'truncateItems()',\n\t\t'[attr.data-variant]': 'variant() ?? null',\n\t\t'[style.--hub-breadcrumb-accent]': 'customAccent()'\n\t}\n})\nexport class HubBreadcrumbComponent {\n\t#breadcrumbsSvc = inject(HubBreadcrumbsService);\n\n\treadonly itemTemplate = contentChild(HubBreadcrumbItemDirective, { read: TemplateRef });\n\n\tbreadcrumbs$ = this.#breadcrumbsSvc.breadcrumbs$;\n\n\t/**\n\t * Semantic accent for the breadcrumb links: `'primary'` · `'success'` ·\n\t * `'danger'` · `'warning'` · `'info'`, or any custom string (read as\n\t * `--hub-sys-color-<variant>`). Re-bases `--hub-breadcrumb-accent`; the\n\t * current (last) item stays muted. Defaults to the standard link colour.\n\t */\n\treadonly variant = input<string>();\n\n\t/**\n\t * Opt-in per-item truncation. When `true`, each label is clipped to\n\t * `--hub-breadcrumb-max-item-width` with an ellipsis and, if it overflows,\n\t * exposes its full text as a tooltip (native `title`, or the hub-ui tooltip\n\t * when {@link provideHubBreadcrumbTooltip} is wired). Off by default, so the\n\t * standard breadcrumb layout is unchanged.\n\t */\n\treadonly truncateItems = input(false);\n\n\t/**\n\t * Trail supplied by the consumer, replacing the one derived from the router.\n\t * It is the way in for crumbs the route tree cannot express — an ancestor\n\t * served by another application, or a trail assembled by hand. Left `null`,\n\t * the component keeps reading {@link HubBreadcrumbsService}.\n\t */\n\treadonly items = input<BreadcrumbItem[] | null>(null);\n\n\t/**\n\t * Length above which the trail collapses behind an indicator. Undefined (the\n\t * default) never collapses, however long the trail grows.\n\t */\n\treadonly maxItems = input<number | undefined>(undefined);\n\n\t/** Crumbs kept at the head of a collapsed trail. */\n\treadonly itemsBeforeCollapse = input(1);\n\n\t/** Crumbs kept at the tail of a collapsed trail, the current page included. */\n\treadonly itemsAfterCollapse = input(1);\n\n\t/**\n\t * Accessible name of the collapsed indicator. It is an input rather than a\n\t * literal because it is the one string of this component a screen reader\n\t * announces, and the library carries no translations of its own.\n\t */\n\treadonly collapsedAriaLabel = input('Show the hidden breadcrumb items');\n\n\t/**\n\t * Fires when the collapsed indicator is activated. The trail expands in place\n\t * on its own; the event is there for consumers who want to react as well —\n\t * open a menu of the hidden crumbs, log the interaction.\n\t */\n\treadonly collapsedClick = output<void>();\n\n\t/** Trail as published by the service, tracked as a signal. */\n\treadonly #routerTrail = toSignal(this.breadcrumbs$, { initialValue: [] as BreadcrumbItem[] });\n\n\t/** Effective trail: the manual one when supplied, the router's otherwise. */\n\tprotected readonly trail = computed(() => this.items() ?? this.#routerTrail());\n\n\t/**\n\t * Whether the reader has opened a collapsed trail. Derived from the trail so a\n\t * new navigation collapses it again — an expansion answers one trail, not the\n\t * component's whole lifetime.\n\t */\n\tprotected readonly expanded = linkedSignal<BreadcrumbItem[], boolean>({\n\t\tsource: this.trail,\n\t\tcomputation: () => false\n\t});\n\n\t/** Rendered positions, with the collapsed range folded into one indicator. */\n\tprotected readonly rows = computed<BreadcrumbRow[]>(() => {\n\t\tconst items = this.trail();\n\t\tconst before = Math.max(0, this.itemsBeforeCollapse());\n\t\tconst after = Math.max(0, this.itemsAfterCollapse());\n\t\tconst max = this.maxItems();\n\n\t\tconst rowAt = (item: BreadcrumbItem, index: number): BreadcrumbRow => ({\n\t\t\titem,\n\t\t\tisLast: index === items.length - 1,\n\t\t\trel: this.resolveRel(item)\n\t\t});\n\n\t\tconst collapses = max !== undefined && max > 0 && items.length > max && before + after < items.length;\n\n\t\tif (!collapses || this.expanded()) {\n\t\t\treturn items.map(rowAt);\n\t\t}\n\n\t\tconst tailStart = items.length - after;\n\n\t\treturn [\n\t\t\t...items.slice(0, before).map(rowAt),\n\t\t\t{ item: null, isLast: false, rel: null },\n\t\t\t...items.slice(tailStart).map((item, index) => rowAt(item, tailStart + index))\n\t\t];\n\t});\n\n\t/**\n\t * Inline accent for custom (non-built-in) variants — the built-in five are\n\t * resolved by the SCSS `@each` loop, so this returns `null` for them.\n\t */\n\tprotected readonly customAccent = computed(() => {\n\t\tconst v = this.variant();\n\t\treturn v && !BUILT_IN_VARIANTS.has(v) ? `var(--hub-sys-color-${v})` : null;\n\t});\n\n\t/** Opens a collapsed trail and lets the consumer act on the same gesture. */\n\tprotected expand(): void {\n\t\tthis.expanded.set(true);\n\t\tthis.collapsedClick.emit();\n\t}\n\n\t/**\n\t * A crumb opening in a new tab hands the opener to the destination unless it\n\t * says otherwise, so the default closes that door rather than leaving it to\n\t * each consumer to remember.\n\t */\n\tprivate resolveRel(item: BreadcrumbItem): string | null {\n\t\treturn item.rel ?? (item.target === '_blank' ? 'noopener noreferrer' : null);\n\t}\n}\n","<nav aria-label=\"breadcrumb\" class=\"hub-breadcrumb__nav\">\n\t<ol class=\"hub-breadcrumb__list\">\n\t\t@for (row of rows(); track $index) {\n\t\t\t@if (row.item; as item) {\n\t\t\t\t<li class=\"hub-breadcrumb__item\" [class.hub-breadcrumb__item--active]=\"row.isLast\">\n\t\t\t\t\t@if (itemTemplate(); as template) {\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t[ngTemplateOutlet]=\"template\"\n\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t$implicit: item,\n\t\t\t\t\t\t\t\tisLast: row.isLast\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else if (row.isLast) {\n\t\t\t\t\t\t<span class=\"hub-breadcrumb__text\" hubBreadcrumbLabel aria-current=\"page\">{{ item.label }}</span>\n\t\t\t\t\t} @else if (item.href) {\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tclass=\"hub-breadcrumb__link\"\n\t\t\t\t\t\t\thubBreadcrumbLabel\n\t\t\t\t\t\t\t[href]=\"item.href\"\n\t\t\t\t\t\t\t[attr.target]=\"item.target ?? null\"\n\t\t\t\t\t\t\t[attr.rel]=\"row.rel\"\n\t\t\t\t\t\t\t[attr.download]=\"item.download ?? null\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<a [routerLink]=\"item.url\" class=\"hub-breadcrumb__link\" hubBreadcrumbLabel>\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t}\n\t\t\t\t</li>\n\t\t\t} @else {\n\t\t\t\t<li class=\"hub-breadcrumb__item hub-breadcrumb__item--collapsed\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"hub-breadcrumb__collapsed\"\n\t\t\t\t\t\t[attr.aria-label]=\"collapsedAriaLabel()\"\n\t\t\t\t\t\t[attr.aria-expanded]=\"expanded()\"\n\t\t\t\t\t\t(click)=\"expand()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t&hellip;\n\t\t\t\t\t</button>\n\t\t\t\t</li>\n\t\t\t}\n\t\t}\n\t</ol>\n</nav>\n","import { NgModule } from '@angular/core';\nimport { HubBreadcrumbComponent } from './components/breadcrumb/breadcrumb.component';\nimport { HubBreadcrumbItemDirective } from './directives/breadcrumb-item.directive';\n\n@NgModule({\n\tdeclarations: [],\n\timports: [HubBreadcrumbComponent, HubBreadcrumbItemDirective],\n\texports: [HubBreadcrumbComponent, HubBreadcrumbItemDirective]\n})\nexport class HubBreadcrumbsModule {}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { HUB_BREADCRUMB_TOOLTIP_ADAPTER } from './breadcrumb-tooltip.token';\nimport { HubBreadcrumbTooltipAdapter } from './breadcrumb-tooltip.types';\n\n/**\n * Registers a tooltip adapter so truncated breadcrumb labels render the rich\n * hub-ui tooltip instead of the native `title` fallback.\n *\n * ```ts\n * import { provideHubBreadcrumbTooltip } from 'ng-hub-ui-breadcrumbs';\n * import { hubTooltipAdapter } from 'ng-hub-ui-utils';\n *\n * providers: [provideHubBreadcrumbTooltip(hubTooltipAdapter)];\n * ```\n *\n * @param adapter Tooltip adapter implementation (e.g. `hubTooltipAdapter` from\n * `ng-hub-ui-utils`).\n * @returns Environment providers to add to the application config.\n */\nexport function provideHubBreadcrumbTooltip(adapter: HubBreadcrumbTooltipAdapter): EnvironmentProviders {\n\treturn makeEnvironmentProviders([\n\t\t{\n\t\t\tprovide: HUB_BREADCRUMB_TOOLTIP_ADAPTER,\n\t\t\tuseValue: adapter\n\t\t}\n\t]);\n}\n","/*\n * Public API Surface of breadcrumbs\n */\nexport * from './lib/breadcrumbs.module';\nexport * from './lib/breadcrumb-tooltip';\nexport * from './lib/components/breadcrumb/breadcrumb.component';\nexport * from './lib/directives/breadcrumb-item.directive';\nexport * from './lib/directives/breadcrumb-label.directive';\nexport * from './lib/models/breadcrumb-item';\nexport * from './lib/models/breadcrumb-template-context';\nexport * from './lib/services/breadcrumbs.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-hub-ui-breadcrumbs.mjs","sources":["../../../projects/breadcrumbs/src/lib/directives/breadcrumb-item.directive.ts","../../../projects/breadcrumbs/src/lib/breadcrumb-tooltip/breadcrumb-tooltip.token.ts","../../../projects/breadcrumbs/src/lib/directives/breadcrumb-label.directive.ts","../../../projects/breadcrumbs/src/lib/services/breadcrumbs.service.ts","../../../projects/breadcrumbs/src/lib/components/breadcrumb/breadcrumb.component.ts","../../../projects/breadcrumbs/src/lib/components/breadcrumb/breadcrumb.component.html","../../../projects/breadcrumbs/src/lib/breadcrumbs.module.ts","../../../projects/breadcrumbs/src/lib/breadcrumb-tooltip/breadcrumb-tooltip.provider.ts","../../../projects/breadcrumbs/src/public-api.ts","../../../projects/breadcrumbs/src/ng-hub-ui-breadcrumbs.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BreadcrumbTemplateContext } from '../models/breadcrumb-template-context';\n\n@Directive({\n\tselector: '[hubBreadcrumbItem]'\n})\nexport class HubBreadcrumbItemDirective {\n\ttemplate = inject(TemplateRef<BreadcrumbTemplateContext>);\n}\n","import { InjectionToken } from '@angular/core';\nimport { HubBreadcrumbTooltipAdapter } from './breadcrumb-tooltip.types';\n\n/**\n * Injection token resolving the optional tooltip adapter used by truncated\n * breadcrumb labels.\n *\n * Inject it with `{ optional: true }`; a `null` value means \"use the native\n * `title` fallback\". Register it through {@link provideHubBreadcrumbTooltip}.\n */\nexport const HUB_BREADCRUMB_TOOLTIP_ADAPTER = new InjectionToken<HubBreadcrumbTooltipAdapter>('HUB_BREADCRUMB_TOOLTIP_ADAPTER');\n","import { afterNextRender, Directive, effect, ElementRef, inject, input, OnDestroy, signal } from '@angular/core';\nimport { HUB_BREADCRUMB_TOOLTIP_ADAPTER } from '../breadcrumb-tooltip/breadcrumb-tooltip.token';\nimport { HubBreadcrumbTooltipHandle } from '../breadcrumb-tooltip/breadcrumb-tooltip.types';\n\n/**\n * Adds an overflow-aware tooltip to a breadcrumb label element.\n *\n * Apply `[hubBreadcrumbLabel]` to the link/text of each breadcrumb item. When the\n * label is truncated (its rendered text is wider than its box — typically because\n * `hub-breadcrumb` truncation is enabled), the directive exposes the full text as\n * a tooltip: the native `title` attribute by default, or the richer hub-ui\n * tooltip when a {@link HUB_BREADCRUMB_TOOLTIP_ADAPTER} is provided. When the\n * label fits, no tooltip is shown.\n */\n@Directive({\n\tselector: '[hubBreadcrumbLabel]'\n})\nexport class HubBreadcrumbLabelDirective implements OnDestroy {\n\t/**\n\t * Explicit tooltip text. When empty, the host's own text content is used, but\n\t * only while it is truncated.\n\t */\n\treadonly tooltip = input('', { alias: 'hubBreadcrumbLabel' });\n\n\tprivate readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n\t/** Optional hub-ui tooltip adapter; absent means native `title` fallback. */\n\tprivate readonly adapter = inject(HUB_BREADCRUMB_TOOLTIP_ADAPTER, { optional: true });\n\n\t/** Whether the rendered label is wider than its clipping box. */\n\tprivate readonly isOverflowing = signal(false);\n\n\t/** Trimmed text content of the label, used as the auto tooltip source. */\n\tprivate readonly text = signal('');\n\n\t/** Becomes true once the browser-only overflow tracking is wired. */\n\tprivate readonly ready = signal(false);\n\n\tprivate resizeObserver: ResizeObserver | null = null;\n\tprivate mutationObserver: MutationObserver | null = null;\n\tprivate handle: HubBreadcrumbTooltipHandle | null = null;\n\n\tconstructor() {\n\t\tafterNextRender(() => this.initOverflowTracking());\n\n\t\teffect(() => {\n\t\t\tif (!this.ready()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst explicit = this.tooltip().trim();\n\t\t\tconst text = explicit || (this.isOverflowing() ? this.text() : '');\n\t\t\tthis.applyTooltip(text);\n\t\t});\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.resizeObserver?.disconnect();\n\t\tthis.mutationObserver?.disconnect();\n\t\tthis.handle?.destroy();\n\t\tthis.handle = null;\n\t}\n\n\t/** Wires browser-only observers that keep the truncation state in sync. */\n\tprivate initOverflowTracking(): void {\n\t\tconst el = this.host.nativeElement;\n\t\tthis.measure(el);\n\n\t\tif (typeof ResizeObserver !== 'undefined') {\n\t\t\tthis.resizeObserver = new ResizeObserver(() => this.measure(el));\n\t\t\tthis.resizeObserver.observe(el);\n\t\t}\n\n\t\tif (typeof MutationObserver !== 'undefined') {\n\t\t\tthis.mutationObserver = new MutationObserver(() => this.measure(el));\n\t\t\tthis.mutationObserver.observe(el, { childList: true, characterData: true, subtree: true });\n\t\t}\n\n\t\tthis.ready.set(true);\n\t}\n\n\t/** Reads the host's text and truncation state into the signals. */\n\tprivate measure(el: HTMLElement): void {\n\t\tthis.text.set((el.textContent ?? '').trim());\n\t\tthis.isOverflowing.set(el.scrollWidth > el.clientWidth + 1);\n\t}\n\n\t/**\n\t * Applies the effective tooltip text through the hub-ui adapter when present,\n\t * or the native `title` attribute otherwise. An empty text removes both.\n\t */\n\tprivate applyTooltip(text: string): void {\n\t\tconst el = this.host.nativeElement;\n\n\t\tif (this.adapter) {\n\t\t\tel.removeAttribute('title');\n\t\t\tif (text) {\n\t\t\t\tif (this.handle) {\n\t\t\t\t\tthis.handle.update(text);\n\t\t\t\t} else {\n\t\t\t\t\tthis.handle = this.adapter.attach(el, text);\n\t\t\t\t}\n\t\t\t} else if (this.handle) {\n\t\t\t\tthis.handle.destroy();\n\t\t\t\tthis.handle = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (text) {\n\t\t\tel.setAttribute('title', text);\n\t\t} else {\n\t\t\tel.removeAttribute('title');\n\t\t}\n\t}\n}\n","import { inject, Injectable, Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\nimport { filter, map, startWith } from 'rxjs';\nimport { BreadcrumbItem, BreadcrumbRouteConfig, BreadcrumbRouteData } from '../models/breadcrumb-item';\n\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class HubBreadcrumbsService {\n\t#router = inject(Router);\n\t#activatedRoute = inject(ActivatedRoute);\n\n\t/** The trail as a stream, for consumers already composing with rxjs. */\n\tbreadcrumbs$ = this.#router.events.pipe(\n\t\tfilter((event) => event instanceof NavigationEnd),\n\t\tstartWith(undefined),\n\t\tmap(() => this.createBreadcrumbs(this.#activatedRoute.root))\n\t);\n\n\t/**\n\t * The trail as a signal, and the surface the component reads. Published here\n\t * rather than left to each consumer, because a stream that only ever carries\n\t * the current trail is one every caller was wrapping in the same `toSignal`\n\t * — the component included. Wrapped once, subscribed once.\n\t */\n\treadonly breadcrumbs: Signal<BreadcrumbItem[]> = toSignal(this.breadcrumbs$, { initialValue: [] as BreadcrumbItem[] });\n\n\tprivate createBreadcrumbs(route: ActivatedRoute, url: string = '', breadcrumbs: BreadcrumbItem[] = []): BreadcrumbItem[] {\n\t\tconst children: ActivatedRoute[] = route.children;\n\n\t\tif (children.length === 0) {\n\t\t\treturn breadcrumbs;\n\t\t}\n\n\t\tfor (const child of children) {\n\t\t\t// A route is recognised before it is activated, and carries `_futureSnapshot`\n\t\t\t// in between while `snapshot` is still unset. `breadcrumbs$` opens with\n\t\t\t// `startWith(undefined)`, so a shell that draws its breadcrumb on the first\n\t\t\t// paint walks the tree inside that window — and reading `.url` there threw,\n\t\t\t// out of a subscription that draws the whole page header, taking the header\n\t\t\t// with it. There is nothing to name yet either: a route with no snapshot has\n\t\t\t// no segments and no resolved data, so it is skipped rather than guessed at.\n\t\t\tif (!child.snapshot) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst routeSegments = child.snapshot.url;\n\n\t\t\t// URL of this level\n\t\t\tconst routeURL: string = routeSegments.map((segment) => segment.path).join('/');\n\n\t\t\tconst nextUrl = routeURL ? `${url}/${routeURL}` : url;\n\n\t\t\t// Only the routes declaring their own breadcrumb become a crumb\n\t\t\tconst hasBreadcrumbData = this.hasOwnBreadcrumbData(child);\n\n\t\t\tif (hasBreadcrumbData) {\n\t\t\t\tbreadcrumbs.push(this.createItem(child, nextUrl));\n\t\t\t}\n\n\t\t\treturn this.createBreadcrumbs(child, nextUrl, breadcrumbs);\n\t\t}\n\n\t\treturn breadcrumbs;\n\t}\n\n\tprivate hasOwnBreadcrumbData(route: ActivatedRoute): boolean {\n\t\tconst routeConfig = route.routeConfig;\n\t\treturn !!(routeConfig && routeConfig.data && routeConfig.data['breadcrumb']);\n\t}\n\n\t/**\n\t * Builds the crumb for a route. The object form of `data.breadcrumb` carries\n\t * anchor metadata for destinations outside the router; whatever accompanies\n\t * `label` there travels to the item untouched, so a new anchor attribute needs\n\t * no change here.\n\t */\n\tprivate createItem(route: ActivatedRoute, url: string): BreadcrumbItem {\n\t\tconst data = route.snapshot.data;\n\t\tconst config: BreadcrumbRouteData = data['breadcrumb'];\n\n\t\tif (this.isRouteConfig(config)) {\n\t\t\tconst { label: labelSource, ...anchor } = config;\n\t\t\treturn { label: this.resolveLabel(labelSource, data), url, data, ...anchor };\n\t\t}\n\n\t\treturn { label: this.resolveLabel(config, data), url, data };\n\t}\n\n\t/** Narrows `data.breadcrumb` to its object form, excluding the function form. */\n\tprivate isRouteConfig(config: BreadcrumbRouteData): config is BreadcrumbRouteConfig {\n\t\treturn typeof config === 'object' && config !== null;\n\t}\n\n\tprivate resolveLabel(source: string | ((data: any) => string), data: any): string {\n\t\tconst label = typeof source === 'function' ? source(data) : source;\n\n\t\treturn data['resolvedData'] ? this.getResolvedBreadcrumb(label, data['resolvedData']) : label;\n\t}\n\n\tprivate getResolvedBreadcrumb(template: string, data: any): string {\n\t\treturn template.replace(/\\{([^}]+)\\}/g, (match, key) => {\n\t\t\treturn data[key] || match;\n\t\t});\n\t}\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n\tafterNextRender,\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tcontentChild,\n\tElementRef,\n\tinject,\n\tInjector,\n\tinput,\n\tlinkedSignal,\n\toutput,\n\tTemplateRef\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { HubBreadcrumbItemDirective } from '../../directives/breadcrumb-item.directive';\nimport { HubBreadcrumbLabelDirective } from '../../directives/breadcrumb-label.directive';\nimport { BreadcrumbItem } from '../../models/breadcrumb-item';\nimport { HubBreadcrumbsService } from '../../services/breadcrumbs.service';\n\n/**\n * Variants with exact design-system token coverage via the SCSS `@each` loop.\n * Kept in step with that loop by hand, because Sass cannot read this file: a name\n * dropped from here is not broken, only paid for twice — once inline and once by\n * the stylesheet.\n */\nconst BUILT_IN_VARIANTS = new Set<string>([\n\t'primary',\n\t'secondary',\n\t'success',\n\t'danger',\n\t'warning',\n\t'info',\n\t'neutral',\n\t'light',\n\t'dark'\n]);\n\n/**\n * One rendered position of the trail. A `null` item is the collapsed indicator,\n * which occupies a position of its own so the separators fall around it exactly\n * as they do around a crumb.\n */\ninterface BreadcrumbRow {\n\titem: BreadcrumbItem | null;\n\tisLast: boolean;\n\t/** Resolved anchor `rel`, already defended for `_blank` targets. */\n\trel: string | null;\n}\n\n@Component({\n\tselector: 'hub-breadcrumb',\n\timports: [RouterLink, NgTemplateOutlet, HubBreadcrumbLabelDirective],\n\ttemplateUrl: './breadcrumb.component.html',\n\tstyleUrl: './breadcrumb.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-breadcrumb',\n\t\t'[class.hub-breadcrumb--truncate]': 'truncateItems()',\n\t\t'[attr.data-variant]': 'variant() ?? null',\n\t\t'[style.--hub-breadcrumb-accent]': 'customAccent()'\n\t}\n})\nexport class HubBreadcrumbComponent {\n\t#breadcrumbsSvc = inject(HubBreadcrumbsService);\n\t#host = inject<ElementRef<HTMLElement>>(ElementRef);\n\t#injector = inject(Injector);\n\n\treadonly itemTemplate = contentChild(HubBreadcrumbItemDirective, { read: TemplateRef });\n\n\t/**\n\t * Semantic accent for the breadcrumb links: `'primary'` · `'secondary'` ·\n\t * `'success'` · `'danger'` · `'warning'` · `'info'` · `'neutral'` · `'light'` ·\n\t * `'dark'`, or any custom string (read as `--hub-sys-color-<variant>`).\n\t * Re-bases `--hub-breadcrumb-accent`; the current (last) item stays muted.\n\t * Defaults to the standard link colour.\n\t */\n\treadonly variant = input<string>();\n\n\t/**\n\t * Opt-in per-item truncation. When `true`, each label is clipped to\n\t * `--hub-breadcrumb-max-item-width` with an ellipsis and, if it overflows,\n\t * exposes its full text as a tooltip (native `title`, or the hub-ui tooltip\n\t * when {@link provideHubBreadcrumbTooltip} is wired). Off by default, so the\n\t * standard breadcrumb layout is unchanged.\n\t */\n\treadonly truncateItems = input(false);\n\n\t/**\n\t * Trail supplied by the consumer, replacing the one derived from the router.\n\t * It is the way in for crumbs the route tree cannot express — an ancestor\n\t * served by another application, or a trail assembled by hand. Left `null`,\n\t * the component keeps reading {@link HubBreadcrumbsService}.\n\t */\n\treadonly items = input<BreadcrumbItem[] | null>(null);\n\n\t/**\n\t * Length above which the trail collapses behind an indicator. Undefined (the\n\t * default) never collapses, however long the trail grows.\n\t */\n\treadonly maxItems = input<number | undefined>(undefined);\n\n\t/** Crumbs kept at the head of a collapsed trail. */\n\treadonly itemsBeforeCollapse = input(1);\n\n\t/** Crumbs kept at the tail of a collapsed trail, the current page included. */\n\treadonly itemsAfterCollapse = input(1);\n\n\t/**\n\t * Accessible name of the collapsed indicator. It is an input rather than a\n\t * literal because it is the one string of this component a screen reader\n\t * announces, and the library carries no translations of its own.\n\t */\n\treadonly collapsedAriaLabel = input('Show the hidden breadcrumb items');\n\n\t/**\n\t * Fires when the collapsed indicator is activated. The trail expands in place\n\t * on its own; the event is there for consumers who want to react as well —\n\t * open a menu of the hidden crumbs, log the interaction.\n\t */\n\treadonly collapsedClick = output<void>();\n\n\t/** Effective trail: the manual one when supplied, the router's otherwise. */\n\tprotected readonly trail = computed(() => this.items() ?? this.#breadcrumbsSvc.breadcrumbs());\n\n\t/**\n\t * Whether the reader has opened a collapsed trail. Derived from the trail so a\n\t * new navigation collapses it again — an expansion answers one trail, not the\n\t * component's whole lifetime.\n\t */\n\tprotected readonly expanded = linkedSignal<BreadcrumbItem[], boolean>({\n\t\tsource: this.trail,\n\t\tcomputation: () => false\n\t});\n\n\t/** Rendered positions, with the collapsed range folded into one indicator. */\n\tprotected readonly rows = computed<BreadcrumbRow[]>(() => {\n\t\tconst items = this.trail();\n\t\tconst before = Math.max(0, this.itemsBeforeCollapse());\n\t\tconst after = Math.max(0, this.itemsAfterCollapse());\n\t\tconst max = this.maxItems();\n\n\t\tconst rowAt = (item: BreadcrumbItem, index: number): BreadcrumbRow => ({\n\t\t\titem,\n\t\t\tisLast: index === items.length - 1,\n\t\t\trel: this.resolveRel(item)\n\t\t});\n\n\t\tconst collapses = max !== undefined && max > 0 && items.length > max && before + after < items.length;\n\n\t\tif (!collapses || this.expanded()) {\n\t\t\treturn items.map(rowAt);\n\t\t}\n\n\t\tconst tailStart = items.length - after;\n\n\t\treturn [\n\t\t\t...items.slice(0, before).map(rowAt),\n\t\t\t{ item: null, isLast: false, rel: null },\n\t\t\t...items.slice(tailStart).map((item, index) => rowAt(item, tailStart + index))\n\t\t];\n\t});\n\n\t/**\n\t * Inline accent for custom (non-built-in) variants — the nine built-in accents\n\t * are resolved by the SCSS `@each` loop, so this returns `null` for them.\n\t */\n\tprotected readonly customAccent = computed(() => {\n\t\tconst v = this.variant();\n\t\treturn v && !BUILT_IN_VARIANTS.has(v) ? `var(--hub-sys-color-${v})` : null;\n\t});\n\n\t/** Opens a collapsed trail and lets the consumer act on the same gesture. */\n\tprotected expand(): void {\n\t\tthis.expanded.set(true);\n\t\tthis.collapsedClick.emit();\n\t\tafterNextRender(() => this.#focusFirstRevealedCrumb(), { injector: this.#injector });\n\t}\n\n\t/**\n\t * Expanding removes the indicator — the element that was holding focus — from the\n\t * DOM, and a browser answers that by focusing `<body>`: whoever opened the trail\n\t * from the keyboard would have to tab from the top of the page to reach the crumbs\n\t * they just asked for. Focus lands on the first revealed crumb instead, which is\n\t * where reading continues.\n\t */\n\t#focusFirstRevealedCrumb(): void {\n\t\tconst crumbs = this.#host.nativeElement.querySelectorAll<HTMLElement>('.hub-breadcrumb__item');\n\t\tconst revealed = crumbs[Math.max(0, this.itemsBeforeCollapse())];\n\n\t\tif (!revealed) {\n\t\t\treturn;\n\t\t}\n\n\t\t// A crumb may render as plain text — the current page, or a custom template with\n\t\t// no control of its own — and text takes no focus. Make that one crumb\n\t\t// programmatically focusable rather than let focus fall back to the body.\n\t\tconst target = revealed.querySelector<HTMLElement>('a, button, [tabindex]') ?? revealed;\n\t\tif (target === revealed) {\n\t\t\trevealed.tabIndex = -1;\n\t\t}\n\n\t\ttarget.focus();\n\t}\n\n\t/**\n\t * A crumb opening in a new tab hands the opener to the destination unless it\n\t * says otherwise, so the default closes that door rather than leaving it to\n\t * each consumer to remember.\n\t */\n\tprivate resolveRel(item: BreadcrumbItem): string | null {\n\t\treturn item.rel ?? (item.target === '_blank' ? 'noopener noreferrer' : null);\n\t}\n}\n","<nav aria-label=\"breadcrumb\" class=\"hub-breadcrumb__nav\">\n\t<ol class=\"hub-breadcrumb__list\">\n\t\t@for (row of rows(); track $index) {\n\t\t\t@if (row.item; as item) {\n\t\t\t\t<li\n\t\t\t\t\tclass=\"hub-breadcrumb__item\"\n\t\t\t\t\t[class.hub-breadcrumb__item--active]=\"row.isLast\"\n\t\t\t\t\t[attr.aria-current]=\"row.isLast ? 'page' : null\"\n\t\t\t\t>\n\t\t\t\t\t@if (itemTemplate(); as template) {\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t[ngTemplateOutlet]=\"template\"\n\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t$implicit: item,\n\t\t\t\t\t\t\t\tisLast: row.isLast\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else if (row.isLast) {\n\t\t\t\t\t\t<span class=\"hub-breadcrumb__text\" hubBreadcrumbLabel>{{ item.label }}</span>\n\t\t\t\t\t} @else if (item.href) {\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tclass=\"hub-breadcrumb__link\"\n\t\t\t\t\t\t\thubBreadcrumbLabel\n\t\t\t\t\t\t\t[href]=\"item.href\"\n\t\t\t\t\t\t\t[attr.target]=\"item.target ?? null\"\n\t\t\t\t\t\t\t[attr.rel]=\"row.rel\"\n\t\t\t\t\t\t\t[attr.download]=\"item.download ?? null\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<a [routerLink]=\"item.url\" class=\"hub-breadcrumb__link\" hubBreadcrumbLabel>\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t}\n\t\t\t\t</li>\n\t\t\t} @else {\n\t\t\t\t<li class=\"hub-breadcrumb__item hub-breadcrumb__item--collapsed\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"hub-breadcrumb__collapsed\"\n\t\t\t\t\t\t[attr.aria-label]=\"collapsedAriaLabel()\"\n\t\t\t\t\t\t[attr.aria-expanded]=\"expanded()\"\n\t\t\t\t\t\t(click)=\"expand()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t&hellip;\n\t\t\t\t\t</button>\n\t\t\t\t</li>\n\t\t\t}\n\t\t}\n\t</ol>\n</nav>\n","import { NgModule } from '@angular/core';\nimport { HubBreadcrumbComponent } from './components/breadcrumb/breadcrumb.component';\nimport { HubBreadcrumbItemDirective } from './directives/breadcrumb-item.directive';\n\n/**\n * Backward-compatibility module for NgModule-based applications.\n *\n * @deprecated Import the standalone `HubBreadcrumbComponent` and `HubBreadcrumbItemDirective`\n * directly; this module only re-exports them and provides nothing of its own. Scheduled for\n * removal in **23.0.0**.\n */\n@NgModule({\n\tdeclarations: [],\n\timports: [HubBreadcrumbComponent, HubBreadcrumbItemDirective],\n\texports: [HubBreadcrumbComponent, HubBreadcrumbItemDirective]\n})\nexport class HubBreadcrumbsModule {}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { HUB_BREADCRUMB_TOOLTIP_ADAPTER } from './breadcrumb-tooltip.token';\nimport { HubBreadcrumbTooltipAdapter } from './breadcrumb-tooltip.types';\n\n/**\n * Registers a tooltip adapter so truncated breadcrumb labels render the rich\n * hub-ui tooltip instead of the native `title` fallback.\n *\n * ```ts\n * import { provideHubBreadcrumbTooltip } from 'ng-hub-ui-breadcrumbs';\n * import { hubTooltipAdapter } from 'ng-hub-ui-utils';\n *\n * providers: [provideHubBreadcrumbTooltip(hubTooltipAdapter)];\n * ```\n *\n * @param adapter Tooltip adapter implementation (e.g. `hubTooltipAdapter` from\n * `ng-hub-ui-utils`).\n * @returns Environment providers to add to the application config.\n */\nexport function provideHubBreadcrumbTooltip(adapter: HubBreadcrumbTooltipAdapter): EnvironmentProviders {\n\treturn makeEnvironmentProviders([\n\t\t{\n\t\t\tprovide: HUB_BREADCRUMB_TOOLTIP_ADAPTER,\n\t\t\tuseValue: adapter\n\t\t}\n\t]);\n}\n","/*\n * Public API Surface of breadcrumbs\n */\nexport * from './lib/breadcrumbs.module';\nexport * from './lib/breadcrumb-tooltip';\nexport * from './lib/components/breadcrumb/breadcrumb.component';\nexport * from './lib/directives/breadcrumb-item.directive';\nexport * from './lib/directives/breadcrumb-label.directive';\nexport * from './lib/models/breadcrumb-item';\nexport * from './lib/models/breadcrumb-template-context';\nexport * from './lib/services/breadcrumbs.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ng-hub-ui-breadcrumbs",
3
- "version": "22.5.2",
3
+ "version": "22.6.0",
4
4
  "description": "A flexible and reusable breadcrumb component for Angular applications that automatically generates breadcrumbs based on routing configuration",
5
5
  "keywords": [
6
6
  "angular",
@@ -11,11 +11,18 @@
11
11
  // automatically; use this mixin to restyle the shell — surface, spacing,
12
12
  // divider, link colours — or to set a brand accent on a custom selector.
13
13
  //
14
+ // Include it ON the `<hub-breadcrumb>` element, with a selector that outranks the
15
+ // component's own `:host` defaults — tag plus class does it. A bare class ties on
16
+ // specificity and loses on source order, and the same class on a wrapper never
17
+ // reaches the component, because a declaration on the element beats inheritance.
18
+ // The single exception is an include that passes only `$accent`: that slot is left
19
+ // undeclared on the host on purpose, so it inherits from wherever you set it.
20
+ //
14
21
  // @example
15
22
  //
16
23
  // @use 'ng-hub-ui-breadcrumbs/styles' as *;
17
24
  //
18
- // .docs-breadcrumb {
25
+ // hub-breadcrumb.docs-breadcrumb {
19
26
  // @include hub-breadcrumb-theme(
20
27
  // $bg: #f8fafc,
21
28
  // $padding-x: 0.75rem,
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { TemplateRef, InjectionToken, EnvironmentProviders, OnDestroy } from '@angular/core';
2
+ import { TemplateRef, InjectionToken, EnvironmentProviders, OnDestroy, Signal } from '@angular/core';
3
3
  import * as rxjs from 'rxjs';
4
4
 
5
5
  /**
@@ -53,12 +53,12 @@ interface BreadcrumbRow {
53
53
  declare class HubBreadcrumbComponent {
54
54
  #private;
55
55
  readonly itemTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
56
- breadcrumbs$: rxjs.Observable<BreadcrumbItem[]>;
57
56
  /**
58
- * Semantic accent for the breadcrumb links: `'primary'` · `'success'` ·
59
- * `'danger'` · `'warning'` · `'info'`, or any custom string (read as
60
- * `--hub-sys-color-<variant>`). Re-bases `--hub-breadcrumb-accent`; the
61
- * current (last) item stays muted. Defaults to the standard link colour.
57
+ * Semantic accent for the breadcrumb links: `'primary'` · `'secondary'` ·
58
+ * `'success'` · `'danger'` · `'warning'` · `'info'` · `'neutral'` · `'light'` ·
59
+ * `'dark'`, or any custom string (read as `--hub-sys-color-<variant>`).
60
+ * Re-bases `--hub-breadcrumb-accent`; the current (last) item stays muted.
61
+ * Defaults to the standard link colour.
62
62
  */
63
63
  readonly variant: _angular_core.InputSignal<string | undefined>;
64
64
  /**
@@ -108,8 +108,8 @@ declare class HubBreadcrumbComponent {
108
108
  /** Rendered positions, with the collapsed range folded into one indicator. */
109
109
  protected readonly rows: _angular_core.Signal<BreadcrumbRow[]>;
110
110
  /**
111
- * Inline accent for custom (non-built-in) variants — the built-in five are
112
- * resolved by the SCSS `@each` loop, so this returns `null` for them.
111
+ * Inline accent for custom (non-built-in) variants — the nine built-in accents
112
+ * are resolved by the SCSS `@each` loop, so this returns `null` for them.
113
113
  */
114
114
  protected readonly customAccent: _angular_core.Signal<string | null>;
115
115
  /** Opens a collapsed trail and lets the consumer act on the same gesture. */
@@ -130,6 +130,13 @@ declare class HubBreadcrumbItemDirective {
130
130
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HubBreadcrumbItemDirective, "[hubBreadcrumbItem]", never, {}, {}, never, never, true, never>;
131
131
  }
132
132
 
133
+ /**
134
+ * Backward-compatibility module for NgModule-based applications.
135
+ *
136
+ * @deprecated Import the standalone `HubBreadcrumbComponent` and `HubBreadcrumbItemDirective`
137
+ * directly; this module only re-exports them and provides nothing of its own. Scheduled for
138
+ * removal in **23.0.0**.
139
+ */
133
140
  declare class HubBreadcrumbsModule {
134
141
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HubBreadcrumbsModule, never>;
135
142
  static ɵmod: _angular_core.ɵɵNgModuleDeclaration<HubBreadcrumbsModule, never, [typeof HubBreadcrumbComponent, typeof HubBreadcrumbItemDirective], [typeof HubBreadcrumbComponent, typeof HubBreadcrumbItemDirective]>;
@@ -243,7 +250,15 @@ interface BreadcrumbTemplateContext {
243
250
 
244
251
  declare class HubBreadcrumbsService {
245
252
  #private;
253
+ /** The trail as a stream, for consumers already composing with rxjs. */
246
254
  breadcrumbs$: rxjs.Observable<BreadcrumbItem[]>;
255
+ /**
256
+ * The trail as a signal, and the surface the component reads. Published here
257
+ * rather than left to each consumer, because a stream that only ever carries
258
+ * the current trail is one every caller was wrapping in the same `toSignal`
259
+ * — the component included. Wrapped once, subscribed once.
260
+ */
261
+ readonly breadcrumbs: Signal<BreadcrumbItem[]>;
247
262
  private createBreadcrumbs;
248
263
  private hasOwnBreadcrumbData;
249
264
  /**