@filip.mazev/blocks 1.4.17 → 1.4.18

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.
@@ -1,4 +1,4 @@
1
- const BLOCKS_VERSION = "1.4.17";
1
+ const BLOCKS_VERSION = "1.4.18";
2
2
  export { BLOCKS_VERSION };
3
3
 
4
4
  //# sourceMappingURL=filip.mazev-blocks.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"filip.mazev-blocks.mjs","names":[],"sources":["../../../projects/blocks/src/public-api.ts"],"sourcesContent":["/* * Public API Surface of blocks\n * This file is auto-generated. Do not edit directly.\n */\n\nexport const BLOCKS_VERSION = '1.4.17';\n"],"mappings":"AAIA,MAAa,iBAAiB"}
1
+ {"version":3,"file":"filip.mazev-blocks.mjs","names":[],"sources":["../../../projects/blocks/src/public-api.ts"],"sourcesContent":["/* * Public API Surface of blocks\n * This file is auto-generated. Do not edit directly.\n */\n\nexport const BLOCKS_VERSION = '1.4.18';\n"],"mappings":"AAIA,MAAa,iBAAiB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@filip.mazev/blocks",
3
- "version": "1.4.17",
3
+ "version": "1.4.18",
4
4
  "license": "MIT",
5
5
  "schematics": "./schematics/collection.json",
6
6
  "exports": {
@@ -204,6 +204,7 @@ export declare class BxA11yService {
204
204
  export declare class BxOverlayPositionService {
205
205
  private readonly overlay;
206
206
  getElementStrategy(element: HTMLElement, placement: BxPlacement, offset?: number): FlexibleConnectedPositionStrategy;
207
+ getSubmenuStrategy(element: HTMLElement, side: 'left' | 'right', offset?: number): FlexibleConnectedPositionStrategy;
207
208
  getCoordinateStrategy(x: number, y: number): FlexibleConnectedPositionStrategy;
208
209
  private getPositions;
209
210
  static ɵfac: i0.ɵɵFactoryDeclaration<BxOverlayPositionService, never>;
@@ -371,6 +372,22 @@ export declare function invertPaletteToken(token: Color): Color;
371
372
  export declare function resolveThemeId(value: string | null | undefined): BxThemeId | undefined;
372
373
  export declare function uuidv4(): string;
373
374
  export declare function inheritOverlayTheme(source: HTMLElement, pane: HTMLElement): () => void;
374
- export declare function trackOverlayOrigin(overlay: OverlayRef, origin: HTMLElement): () => void;
375
+ /** Callable tracking teardown with an explicit refresh for coordinated child overlays. */
376
+ export type OverlayOriginTracker = (() => void) & {
377
+ /** Re-measure the source and refresh its native anchor offset or fallback position. */
378
+ reposition: () => void;
379
+ };
380
+ /** Optional coordination for overlays whose origins can move inside other overlays or clipped scrollers. */
381
+ export interface IOverlayOriginOptions {
382
+ /** Allow native CSS anchor tracking. Defaults to true; coordinated cascades use measured positioning. */
383
+ nativeAnchoring?: boolean;
384
+ /** Optional callback after the overlay is positioned. Use it to update dependent child overlays in order. */
385
+ onPosition?: () => void;
386
+ /** Optional callback when the origin leaves the viewport or a clipping ancestor. Defaults to leaving visibility to the owner. */
387
+ onOriginHidden?: () => void;
388
+ }
389
+ export declare function trackOverlayOrigin(overlay: OverlayRef, origin: HTMLElement, options?: IOverlayOriginOptions): OverlayOriginTracker;
375
390
  /** Resolves text and tracks the adapter's language signal in the calling computation. */
376
- export declare function resolveText(text: ResolvableText | undefined, adapter: IBxI18nAdapter | null, params?: Record<string, unknown>): string;
391
+ export declare function resolveText(text: ResolvableText | undefined, adapter: IBxI18nAdapter | null, params?: Record<string, unknown>): string;
392
+ /** Whether an overlay origin still intersects the viewport and every ancestor that clips its contents. */
393
+ export declare function isOverlayOriginVisible(origin: HTMLElement): boolean;
@@ -1,8 +1,10 @@
1
1
  import * as i0 from "@angular/core";
2
- import { InjectionToken, Signal } from "@angular/core";
2
+ import { InjectionToken, Signal, TemplateRef } from "@angular/core";
3
3
  import { ActivatedRouteSnapshot, Data, Route } from "@angular/router";
4
4
  import { IconData } from "@filip.mazev/blocks/icons";
5
- import { ResolvableText, Strict } from "@filip.mazev/blocks/core";
5
+ import { ResolvableText, Strict, WindowDimensionsService } from "@filip.mazev/blocks/core";
6
+ import { ITagConfig } from "@filip.mazev/blocks/primitives";
7
+ import { Subject } from "rxjs";
6
8
  export declare class Breadcrumbs {
7
9
  private readonly navigationService;
8
10
  private readonly a11y;
@@ -34,15 +36,42 @@ export interface INavContext {
34
36
  snapshot?: ActivatedRouteSnapshot;
35
37
  }
36
38
  export type NavText = ResolvableText | ((ctx: INavContext) => ResolvableText);
39
+ /** A noninteractive badge displayed beside a navigation label. */
40
+ export interface INavTag {
41
+ /** Optional translated text; number-only tags can omit it. */
42
+ text?: ResolvableText;
43
+ /** Optional Blocks tag appearance. Defaults to a small tonal tag. */
44
+ config?: ITagConfig;
45
+ }
46
+ /** Route UI metadata. TSection restricts section IDs when used with defineNavigation. */
37
47
  export interface INavMeta<TSection extends string = string> {
48
+ /** Optional translated menu label, resolved again when the language changes. */
38
49
  label?: NavText;
50
+ /** Optional breadcrumb label; defaults to label. */
39
51
  breadcrumb?: NavText;
52
+ /** Optional leading icon. */
40
53
  icon?: IconData;
54
+ /** Optional trailing icon, independent of the submenu disclosure. */
55
+ endIcon?: IconData;
56
+ /** Optional noninteractive Blocks tags. Defaults to no tags. */
57
+ tags?: readonly INavTag[];
58
+ /** Optional additional translated terms used by side-nav search. */
59
+ keywords?: readonly NavText[];
60
+ /** Optional disabled state. Prevents navigation and opening descendants. Defaults to false. */
61
+ disabled?: boolean;
62
+ /** Optional breadcrumb inclusion. Defaults to the section setting, then true. */
63
+ showInBreadcrumbs?: boolean;
64
+ /** Optional section ID. Nested entries inherit their parent's section. */
41
65
  section?: TSection;
66
+ /** Whether to render this route in menus. Defaults to true; false promotes visible descendants. */
42
67
  menu?: boolean;
68
+ /** Hides this route and its descendants from menus. Defaults to false. */
43
69
  hidden?: boolean;
70
+ /** Optional ascending display order; unordered items sort by label. */
44
71
  order?: number;
72
+ /** Marks the application's home route. Defaults to false. */
45
73
  root?: boolean;
74
+ /** Optional reactive visibility predicate. False hides this route and its descendants. */
46
75
  visible?: () => boolean;
47
76
  }
48
77
  export interface INavRouteData {
@@ -59,18 +88,94 @@ export interface INavigationItem {
59
88
  icon?: IconData;
60
89
  section?: string;
61
90
  visible: boolean;
91
+ /** Optional breadcrumb inclusion from route metadata. Defaults to the section setting, then true. */
92
+ showInBreadcrumbs?: boolean;
62
93
  children?: INavigationItem[];
63
94
  data?: INavMeta;
64
95
  }
96
+ /** Shared configuration for a named navigation section. */
65
97
  export interface INavigationSectionConfig {
98
+ /** Required unique ID referenced by withNav metadata. */
66
99
  id: string;
67
- title?: string;
100
+ /** Optional translated heading. Defaults to id. */
101
+ title?: ResolvableText;
102
+ /** Optional ascending section order. Defaults to declaration order. */
68
103
  order?: number;
104
+ /** Optional section icon; the side-nav falls back to folder. */
105
+ icon?: IconData;
106
+ /** Whether users may collapse the section. Defaults to false. */
107
+ collapsible?: boolean;
108
+ /** Initial section state when no saved state exists. Defaults to false. */
109
+ collapsed?: boolean;
110
+ /** Default breadcrumb inclusion for this section's routes. Defaults to true. */
111
+ showInBreadcrumbs?: boolean;
112
+ }
113
+ export type SideNavSide = 'left' | 'right';
114
+ /** Short public alias for the fully documented configuration interface. */
115
+ export type SideNavConfig = ISideNavConfig;
116
+ /** NavigationService's resolved route contract. Supply route metadata through withNav. */
117
+ export type NavItem = INavigationItem;
118
+ /** Shared or per-instance side-nav configuration. Instance values override application defaults. */
119
+ export interface ISideNavConfig {
120
+ /** Physical viewport side. Defaults to left, including in RTL. */
121
+ side?: SideNavSide;
122
+ /** Fixed application rail or inline panel. Inline mobile drawers fill their positioned containing shell without locking page scroll. Defaults to fixed. */
123
+ position?: 'fixed' | 'inline';
124
+ /** Expanded width, as a CSS length. Defaults to 17rem; constrained to the viewport. */
125
+ width?: string;
126
+ /** Icon rail width, as a CSS length. Defaults to 4.5rem. */
127
+ collapsedWidth?: string;
128
+ /** Optional search field. Defaults to true; searches all visible loaded descendants. */
129
+ searchable?: boolean;
130
+ /** Show leading icons in expanded item rows. Defaults to true; compact rows always retain an icon. */
131
+ showItemIcons?: boolean;
132
+ /** Show icons beside expanded section headings. Defaults to true; compact section triggers always retain an icon. */
133
+ showSectionIcons?: boolean;
134
+ /** Show the desktop collapse action. Defaults to true. */
135
+ collapsible?: boolean;
136
+ /** Initial desktop collapse state. Defaults to false; saved state wins unless the model is bound. */
137
+ collapsed?: boolean;
138
+ /** Optional localStorage key. Persists panel and section states; mobile openness and search are never saved. */
139
+ persistenceKey?: string;
140
+ /** Automatic mobile breakpoint from Blocks dimensions. Defaults to lg. */
141
+ mobileBreakpoint?: keyof WindowDimensionsService['breakpoints'];
142
+ /** Optional mobile override for embedded layouts and demos. Omit for automatic viewport detection. */
143
+ mobile?: boolean;
144
+ /** Show the built-in mobile hamburger. Defaults to true; false requires an application trigger calling open/toggle. */
145
+ showMobileTrigger?: boolean;
146
+ /** Optional accessible navigation name. Defaults to Main navigation. */
147
+ ariaLabel?: ResolvableText;
148
+ /** Optional search placeholder. Defaults to Search navigation…. */
149
+ searchPlaceholder?: ResolvableText;
150
+ /** Optional accessible search name. Defaults to Search navigation. */
151
+ searchLabel?: ResolvableText;
152
+ /** Optional accessible clear-search action. Defaults to Clear search. */
153
+ clearSearchLabel?: ResolvableText;
154
+ /** Optional no-results message. Defaults to No matching pages. */
155
+ emptyText?: ResolvableText;
156
+ /** Optional mobile open action name. Defaults to Open navigation. */
157
+ openLabel?: ResolvableText;
158
+ /** Optional mobile close/backdrop action name. Defaults to Close navigation. */
159
+ closeLabel?: ResolvableText;
160
+ /** Optional collapse action name. Defaults to Collapse navigation. */
161
+ collapseLabel?: ResolvableText;
162
+ /** Optional expand action name. Defaults to Expand navigation. */
163
+ expandLabel?: ResolvableText;
164
+ /** Optional submenu action prefix. Defaults to Open submenu; the item label is appended. */
165
+ submenuLabel?: ResolvableText;
166
+ /** Optional search target announcement prefix. Defaults to Search result; the target label is appended. */
167
+ resultLabel?: ResolvableText;
69
168
  }
169
+ /** Application-wide navigation defaults supplied with provideNavigation. */
70
170
  export interface INavigationConfig {
171
+ /** Optional ordered sections. Unlisted section IDs are appended automatically. */
71
172
  sections?: readonly INavigationSectionConfig[];
173
+ /** Include hidden routes in breadcrumbs. Defaults to false. */
72
174
  includeHiddenInBreadcrumbs?: boolean;
175
+ /** Optional custom sibling ordering; defaults to metadata order, then label. */
73
176
  sortItems?: (a: INavigationItem, b: INavigationItem) => number;
177
+ /** Optional shared side-nav defaults, overridden by an instance's config. */
178
+ sideNav?: ISideNavConfig;
74
179
  }
75
180
  /** A UI section containing flat, visible menu entries. */
76
181
  export interface INavigationGroup {
@@ -112,6 +217,13 @@ export declare function provideNavigation(config: INavigationConfig): {
112
217
  * This allows you to easily associate navigation information with your routes, which can then be used by navigation components to generate menus, breadcrumbs, etc.
113
218
  */
114
219
  export declare function withNav<T extends INavMeta>(route: Route, nav: Strict<T, INavMeta>): Route;
220
+ /** A resolved section retaining nested items for hierarchical navigation. */
221
+ export interface INavigationTreeGroup extends Omit<INavigationSectionConfig, 'title'> {
222
+ /** Translated heading. */
223
+ title: string;
224
+ /** Visible roots in this section; same-section descendants remain nested. */
225
+ items: INavigationItem[];
226
+ }
115
227
  export declare class NavigationService {
116
228
  private readonly router;
117
229
  private readonly config;
@@ -124,7 +236,11 @@ export declare class NavigationService {
124
236
  readonly baseRoute: Signal<string | undefined>;
125
237
  readonly menu: Signal<INavigationItem[]>;
126
238
  readonly menuGroups: Signal<INavigationGroup[]>;
239
+ /** Hierarchical sections; menuGroups retains its existing flat contract. */
240
+ readonly menuTreeGroups: Signal<INavigationTreeGroup[]>;
127
241
  navigateBack(): void;
242
+ private groupTree;
243
+ private includeBreadcrumb;
128
244
  private extractRoutes;
129
245
  private resolveCurrent;
130
246
  private buildMenu;
@@ -136,4 +252,232 @@ export declare class NavigationService {
136
252
  static ɵprov: i0.ɵɵInjectableDeclaration<any>;
137
253
  }
138
254
  export declare const NAVIGATION_ACCESS_ADAPTER: InjectionToken<INavigationAccessAdapter>;
139
- export declare const NAVIGATION_CONFIG: InjectionToken<INavigationConfig>;
255
+ export declare const NAVIGATION_CONFIG: InjectionToken<INavigationConfig>;
256
+ /** Context supplied to header and footer templates. */
257
+ export interface ISideNavSlotContext {
258
+ /** True when presenting the desktop icon rail. Search temporarily expands the rail. */
259
+ $implicit: boolean;
260
+ /** Named equivalent of $implicit. */
261
+ collapsed: boolean;
262
+ /** True while using the mobile drawer. */
263
+ mobile: boolean;
264
+ }
265
+ /** Item presentation context. The surrounding link/button retains routing, semantics and keyboard behavior. */
266
+ export interface ISideNavItemContext {
267
+ /** Resolved navigation item. */
268
+ $implicit: INavigationItem;
269
+ /** Whether this is the active Angular route. */
270
+ active: boolean;
271
+ /** Whether only the item's icon should be displayed. */
272
+ collapsed: boolean;
273
+ }
274
+ /** Resolved layout state for application shells and future top-bar integration. */
275
+ export interface ISideNavLayout {
276
+ /** Physical panel edge. */
277
+ side: SideNavSide;
278
+ /** Space to reserve beside the application content; 0px for a mobile drawer. */
279
+ offset: string;
280
+ /** Whether the desktop panel is currently presented as an icon rail. */
281
+ collapsed: boolean;
282
+ /** Whether responsive drawer behavior is active. */
283
+ mobile: boolean;
284
+ /** Whether the mobile drawer is open. Desktop panels remain visible. */
285
+ open: boolean;
286
+ }
287
+ /** Internal search derivation; all paths contain stable navigation item IDs. */
288
+ interface ISideNavSearchResult {
289
+ groups: readonly INavigationTreeGroup[];
290
+ path: readonly string[];
291
+ target?: string;
292
+ label?: string;
293
+ }
294
+ /** One instance per side-nav; coordinates its recursive branch presentations. */
295
+ declare class SideNavStateService {
296
+ private readonly router;
297
+ private readonly activeRoute;
298
+ private readonly i18n;
299
+ private readonly lastSelected;
300
+ private readonly rememberedPath;
301
+ private readonly searchSelected;
302
+ readonly config: import("@angular/core").WritableSignal<ISideNavConfig>;
303
+ readonly sourceGroups: import("@angular/core").WritableSignal<readonly INavigationTreeGroup[]>;
304
+ readonly query: import("@angular/core").WritableSignal<string>;
305
+ readonly itemTemplate: import("@angular/core").WritableSignal<TemplateRef<ISideNavItemContext> | undefined>;
306
+ readonly activated: Subject<INavigationItem>;
307
+ readonly groups: import("@angular/core").Signal<{
308
+ items: INavigationItem[];
309
+ title: string;
310
+ id: string;
311
+ order?: number | undefined;
312
+ icon?: import("@filip.mazev/blocks/icons").IconData | undefined;
313
+ collapsible?: boolean | undefined;
314
+ collapsed?: boolean | undefined;
315
+ showInBreadcrumbs?: boolean | undefined;
316
+ }[]>;
317
+ /** Select the most specific visible route, rather than every matching URL prefix. */
318
+ readonly activeItem: import("@angular/core").Signal<INavigationItem | undefined>;
319
+ readonly activeIds: import("@angular/core").Signal<Set<string>>;
320
+ readonly searchResult: import("@angular/core").Signal<ISideNavSearchResult>;
321
+ readonly revealPath: import("@angular/core").Signal<readonly string[]>;
322
+ readonly target: import("@angular/core").Signal<string | undefined>;
323
+ readonly text: import("@angular/core").Signal<{
324
+ ariaLabel: string;
325
+ searchPlaceholder: string;
326
+ searchLabel: string;
327
+ clearSearchLabel: string;
328
+ emptyText: string;
329
+ openLabel: string;
330
+ closeLabel: string;
331
+ collapseLabel: string;
332
+ expandLabel: string;
333
+ submenuLabel: string;
334
+ resultLabel: string;
335
+ }>;
336
+ constructor();
337
+ isCurrent(item: INavigationItem): boolean;
338
+ search(query: string): void;
339
+ select(item: INavigationItem): void;
340
+ private findActiveItem;
341
+ private routeSpecificity;
342
+ private resolveNav;
343
+ static ɵfac: i0.ɵɵFactoryDeclaration<SideNavStateService, never>;
344
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
345
+ }
346
+ export declare class SideNav {
347
+ private readonly document;
348
+ private readonly router;
349
+ private readonly destroyRef;
350
+ private readonly dimensions;
351
+ private readonly navigation;
352
+ private readonly defaults;
353
+ private readonly scrollLock;
354
+ private readonly cascade;
355
+ private readonly a11y;
356
+ private readonly injector;
357
+ private readonly focusMonitor;
358
+ private readonly toggleElement;
359
+ private readonly saved;
360
+ private readonly loadedKey;
361
+ private readonly lockId;
362
+ private readonly presentation;
363
+ protected readonly drawerAnimated: import("@angular/core").WritableSignal<boolean>;
364
+ protected readonly state: SideNavStateService;
365
+ protected readonly id: string;
366
+ protected readonly headerTemplate: import("@angular/core").WritableSignal<TemplateRef<ISideNavSlotContext> | null>;
367
+ protected readonly footerTemplate: import("@angular/core").WritableSignal<TemplateRef<ISideNavSlotContext> | null>;
368
+ protected readonly reducedMotion: import("@angular/core").Signal<boolean>;
369
+ protected readonly visibleGroups: import("@angular/core").Signal<readonly INavigationTreeGroup[]>;
370
+ protected readonly slotContext: import("@angular/core").Signal<ISideNavSlotContext>;
371
+ readonly config: import("@angular/core").InputSignal<ISideNavConfig>;
372
+ /** Omit to use NavigationService's hierarchical route sections. */
373
+ readonly groups: import("@angular/core").InputSignal<readonly INavigationTreeGroup[] | undefined>;
374
+ /** Optional presentation template; routing and menu semantics remain on the component's surrounding control. */
375
+ readonly itemTemplate: import("@angular/core").InputSignal<TemplateRef<ISideNavItemContext> | undefined>;
376
+ /** Optional controlled desktop state. Without a binding, persisted state and configuration determine the initial value. */
377
+ readonly collapsed: import("@angular/core").InputSignal<boolean | undefined>;
378
+ readonly collapsedChange: import("@angular/core").OutputEmitterRef<boolean>;
379
+ readonly mobileOpen: import("@angular/core").ModelSignal<boolean>;
380
+ readonly itemSelected: import("@angular/core").OutputEmitterRef<INavigationItem>;
381
+ readonly layoutChange: import("@angular/core").OutputEmitterRef<ISideNavLayout>;
382
+ readonly resolvedConfig: import("@angular/core").Signal<{
383
+ side: import("@filip.mazev/blocks/navigation").SideNavSide;
384
+ position: "fixed" | "inline";
385
+ width: string;
386
+ collapsedWidth: string;
387
+ searchable: boolean;
388
+ showItemIcons: boolean;
389
+ showSectionIcons: boolean;
390
+ collapsible: boolean;
391
+ collapsed: boolean;
392
+ persistenceKey?: string;
393
+ mobileBreakpoint: keyof WindowDimensionsService["breakpoints"];
394
+ mobile?: boolean;
395
+ showMobileTrigger: boolean;
396
+ ariaLabel: import("@filip.mazev/blocks/core").ResolvableText;
397
+ searchPlaceholder: import("@filip.mazev/blocks/core").ResolvableText;
398
+ searchLabel: import("@filip.mazev/blocks/core").ResolvableText;
399
+ clearSearchLabel: import("@filip.mazev/blocks/core").ResolvableText;
400
+ emptyText: import("@filip.mazev/blocks/core").ResolvableText;
401
+ openLabel: import("@filip.mazev/blocks/core").ResolvableText;
402
+ closeLabel: import("@filip.mazev/blocks/core").ResolvableText;
403
+ collapseLabel: import("@filip.mazev/blocks/core").ResolvableText;
404
+ expandLabel: import("@filip.mazev/blocks/core").ResolvableText;
405
+ submenuLabel: import("@filip.mazev/blocks/core").ResolvableText;
406
+ resultLabel: import("@filip.mazev/blocks/core").ResolvableText;
407
+ }>;
408
+ readonly isMobile: import("@angular/core").Signal<boolean>;
409
+ readonly isCollapsed: import("@angular/core").Signal<boolean>;
410
+ readonly query: import("@angular/core").Signal<string>;
411
+ readonly layout: import("@angular/core").Signal<ISideNavLayout>;
412
+ private restoreFocus?;
413
+ private focusReturnOrigin;
414
+ private focusRevision;
415
+ constructor();
416
+ setHeaderTemplate(template: TemplateRef<ISideNavSlotContext> | null): void;
417
+ setFooterTemplate(template: TemplateRef<ISideNavSlotContext> | null): void;
418
+ toggle(origin?: HTMLElement | Event): void;
419
+ open(origin?: HTMLElement | Event): void;
420
+ close(): void;
421
+ toggleCollapsed(): void;
422
+ search(query: string): void;
423
+ protected closeFromControl(event: MouseEvent): void;
424
+ protected sectionActive(group: INavigationTreeGroup): boolean;
425
+ protected sectionHighlighted(group: INavigationTreeGroup): boolean;
426
+ protected sectionCollapsed(group: INavigationTreeGroup): boolean;
427
+ protected toggleSection(group: INavigationTreeGroup): void;
428
+ protected menuKey(event: KeyboardEvent): void;
429
+ protected panelKey(event: KeyboardEvent): void;
430
+ private readSavedState;
431
+ static ɵfac: i0.ɵɵFactoryDeclaration<SideNav, never>;
432
+ static ɵcmp: i0.ɵɵComponentDeclaration<SideNav, "bx-side-nav", ["bxSideNav"], {
433
+ "config": {
434
+ "alias": "config";
435
+ "required": false;
436
+ "isSignal": true;
437
+ };
438
+ "groups": {
439
+ "alias": "groups";
440
+ "required": false;
441
+ "isSignal": true;
442
+ };
443
+ "itemTemplate": {
444
+ "alias": "itemTemplate";
445
+ "required": false;
446
+ "isSignal": true;
447
+ };
448
+ "collapsed": {
449
+ "alias": "collapsed";
450
+ "required": false;
451
+ "isSignal": true;
452
+ };
453
+ "mobileOpen": {
454
+ "alias": "mobileOpen";
455
+ "required": false;
456
+ "isSignal": true;
457
+ };
458
+ }, {
459
+ "collapsedChange": "collapsedChange";
460
+ "mobileOpen": "mobileOpenChange";
461
+ "itemSelected": "itemSelected";
462
+ "layoutChange": "layoutChange";
463
+ }, never, never, true, never>;
464
+ }
465
+ /** Registers an ng-template with the containing side-nav, following the modal slot contract. */
466
+ export declare class SideNavHeaderDirective {
467
+ private readonly template;
468
+ private readonly nav;
469
+ constructor();
470
+ static ngTemplateContextGuard(_directive: SideNavHeaderDirective, _context: unknown): _context is ISideNavSlotContext;
471
+ static ɵfac: i0.ɵɵFactoryDeclaration<SideNavHeaderDirective, never>;
472
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SideNavHeaderDirective, "[bxSideNavHeader]", never, {}, {}, never, never, true, never>;
473
+ }
474
+ /** Registers an ng-template with the containing side-nav, following the modal slot contract. */
475
+ export declare class SideNavFooterDirective {
476
+ private readonly template;
477
+ private readonly nav;
478
+ constructor();
479
+ static ngTemplateContextGuard(_directive: SideNavFooterDirective, _context: unknown): _context is ISideNavSlotContext;
480
+ static ɵfac: i0.ɵɵFactoryDeclaration<SideNavFooterDirective, never>;
481
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SideNavFooterDirective, "[bxSideNavFooter]", never, {}, {}, never, never, true, never>;
482
+ }
483
+ export {};
@@ -532,6 +532,8 @@ export type TagVariant = 'filled' | 'tonal' | 'outlined';
532
532
  export type TagSize = 'small' | 'medium';
533
533
  /** Reusable tag appearance; direct component inputs override these optional values. */
534
534
  export interface ITagConfig {
535
+ /** Optional opaque surface. True removes translucency and backdrop blur; otherwise follows application appearance. */
536
+ opaque?: boolean;
535
537
  /** Semantic color role. Defaults to accent. */
536
538
  color?: TagColor;
537
539
  /** Filled, tonal, or outlined treatment. Defaults to tonal. */
@@ -568,6 +570,8 @@ export declare class Tag {
568
570
  protected readonly resolvedTrailingNumber: import("@angular/core").Signal<string>;
569
571
  protected readonly palette: import("@angular/core").Signal<ITagPalette>;
570
572
  protected readonly isNumberOnly: import("@angular/core").Signal<boolean>;
573
+ /** Optional opaque surface; true removes translucency and blur. False or absent follows application appearance. */
574
+ readonly opaque: import("@angular/core").InputSignal<boolean | undefined>;
571
575
  readonly text: import("@angular/core").InputSignal<ResolvableText | undefined>;
572
576
  readonly config: import("@angular/core").InputSignal<ITagConfig>;
573
577
  readonly color: import("@angular/core").InputSignal<TagColor | undefined>;
@@ -588,6 +592,11 @@ export declare class Tag {
588
592
  readonly focusable: import("@angular/core").InputSignal<boolean>;
589
593
  static ɵfac: i0.ɵɵFactoryDeclaration<Tag, never>;
590
594
  static ɵcmp: i0.ɵɵComponentDeclaration<Tag, "bx-tag", never, {
595
+ "opaque": {
596
+ "alias": "opaque";
597
+ "required": false;
598
+ "isSignal": true;
599
+ };
591
600
  "text": {
592
601
  "alias": "text";
593
602
  "required": false;
@@ -675,4 +684,107 @@ export declare class Tag {
675
684
  };
676
685
  }, {}, never, never, true, never>;
677
686
  }
687
+ /** Hover, click, touch and keyboard trigger for nested, opaque bx-menu surfaces. */
688
+ export declare class MenuTriggerDirective {
689
+ private readonly source;
690
+ private readonly overlay;
691
+ private readonly overlayContext;
692
+ private readonly zone;
693
+ private readonly positions;
694
+ private readonly cascade;
695
+ private readonly vcr;
696
+ private readonly traps;
697
+ private readonly opened;
698
+ protected readonly overlayId: import("@angular/core").WritableSignal<string | null>;
699
+ readonly isOpen: import("@angular/core").Signal<boolean>;
700
+ readonly bxMenuTrigger: import("@angular/core").InputSignal<TemplateRef<unknown>>;
701
+ /** The enclosing trigger, when this is a submenu. */
702
+ /** Optional positioning origin when a disclosure button belongs to a wider row. Defaults to the trigger element. */
703
+ readonly menuOrigin: import("@angular/core").InputSignal<HTMLElement | undefined>;
704
+ readonly menuParent: import("@angular/core").InputSignal<MenuTriggerDirective | undefined>;
705
+ /** Physical preferred side; viewport collision handling can flip the menu. Defaults to right. */
706
+ readonly menuSide: import("@angular/core").InputSignal<"left" | "right">;
707
+ /** Allows hover opening. Click and keyboard access always remain available. Defaults to true. */
708
+ readonly menuHover: import("@angular/core").InputSignal<boolean>;
709
+ /** Accessible menu name, normally the trigger's resolved label. */
710
+ readonly menuLabel: import("@angular/core").InputSignal<string>;
711
+ /** Keep a revealed search path open during pointer movement; Escape still dismisses it. */
712
+ readonly menuPinned: import("@angular/core").InputSignal<boolean>;
713
+ readonly menuOpened: import("@angular/core").OutputEmitterRef<void>;
714
+ readonly menuClosed: import("@angular/core").OutputEmitterRef<void>;
715
+ private overlayRef?;
716
+ private trap?;
717
+ private subscriptions;
718
+ private disconnectTheme?;
719
+ private hoverTimer?;
720
+ private positionTracker?;
721
+ constructor();
722
+ toggle(event: MouseEvent): void;
723
+ open(focus?: boolean): void;
724
+ close(restoreFocus?: boolean): void;
725
+ reposition(): void;
726
+ contains(target: Node): boolean;
727
+ scheduleClose(): void;
728
+ protected onPointerEnter(event: PointerEvent): void;
729
+ protected onKey(event: KeyboardEvent): void;
730
+ private cancelClose;
731
+ private focusFirst;
732
+ private onMenuKey;
733
+ static ɵfac: i0.ɵɵFactoryDeclaration<MenuTriggerDirective, never>;
734
+ static ɵdir: i0.ɵɵDirectiveDeclaration<MenuTriggerDirective, "[bxMenuTrigger]", ["bxMenuTrigger"], {
735
+ "bxMenuTrigger": {
736
+ "alias": "bxMenuTrigger";
737
+ "required": true;
738
+ "isSignal": true;
739
+ };
740
+ "menuOrigin": {
741
+ "alias": "menuOrigin";
742
+ "required": false;
743
+ "isSignal": true;
744
+ };
745
+ "menuParent": {
746
+ "alias": "menuParent";
747
+ "required": false;
748
+ "isSignal": true;
749
+ };
750
+ "menuSide": {
751
+ "alias": "menuSide";
752
+ "required": false;
753
+ "isSignal": true;
754
+ };
755
+ "menuHover": {
756
+ "alias": "menuHover";
757
+ "required": false;
758
+ "isSignal": true;
759
+ };
760
+ "menuLabel": {
761
+ "alias": "menuLabel";
762
+ "required": false;
763
+ "isSignal": true;
764
+ };
765
+ "menuPinned": {
766
+ "alias": "menuPinned";
767
+ "required": false;
768
+ "isSignal": true;
769
+ };
770
+ }, {
771
+ "menuOpened": "menuOpened";
772
+ "menuClosed": "menuClosed";
773
+ }, never, never, true, never>;
774
+ }
775
+ /** Coordinates a single open menu path, allowing arbitrary nesting without sibling overlays accumulating. */
776
+ export declare class MenuCascadeService {
777
+ private readonly entries;
778
+ activate(trigger: MenuTriggerDirective): void;
779
+ remove(trigger: MenuTriggerDirective): void;
780
+ closeChildren(trigger: MenuTriggerDirective): void;
781
+ contains(trigger: MenuTriggerDirective, target: Node): boolean;
782
+ hasOpenMenus(): boolean;
783
+ repositionChildren(trigger: MenuTriggerDirective): void;
784
+ closeAll(restoreFocus?: boolean): void;
785
+ static ɵfac: i0.ɵɵFactoryDeclaration<MenuCascadeService, never>;
786
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
787
+ }
788
+ /** Move focus among visible, enabled items in one menu, including wrapped item components. */
789
+ export declare function navigateMenuKey(event: KeyboardEvent, menu: HTMLElement): boolean;
678
790
  export {};
@@ -1 +1 @@
1
- export declare const BLOCKS_VERSION = "1.4.17";
1
+ export declare const BLOCKS_VERSION = "1.4.18";