@brickclay-org/ui 0.1.77 → 0.1.79

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.
Files changed (37) hide show
  1. package/fesm2022/brickclay-org-ui.mjs +1928 -56
  2. package/fesm2022/brickclay-org-ui.mjs.map +1 -1
  3. package/index.d.ts +1139 -19
  4. package/package.json +1 -1
  5. package/src/assets/avatars/300-1.png +0 -0
  6. package/src/assets/avatars/300-2.png +0 -0
  7. package/src/assets/icons/bank-card-icon.svg +6 -0
  8. package/src/assets/icons/global/alert-circle-white.svg +3 -0
  9. package/src/assets/icons/global/calendar-black-icon.svg +12 -0
  10. package/src/assets/icons/global/calendar-white-icon.svg +12 -0
  11. package/src/assets/icons/global/calender.svg +19 -0
  12. package/src/assets/icons/global/kanban-black-icon.svg +5 -0
  13. package/src/assets/icons/global/kanban-white-icon.svg +5 -0
  14. package/src/assets/icons/global/location-black-icon.svg +4 -0
  15. package/src/assets/icons/global/location-white-icon.svg +4 -0
  16. package/src/assets/icons/global/notification.svg +4 -0
  17. package/src/assets/icons/global/resources-black-icon.svg +6 -0
  18. package/src/assets/icons/global/resources-white-icon.svg +6 -0
  19. package/src/assets/icons/global/search.svg +4 -0
  20. package/src/assets/icons/global/setting-black.svg +4 -0
  21. package/src/assets/icons/global/table-black-icon.svg +5 -0
  22. package/src/assets/icons/global/table-white-icon.svg +5 -0
  23. package/src/assets/icons/global/user.svg +11 -0
  24. package/src/assets/icons/no-data-found.jpg +0 -0
  25. package/src/assets/images/icons/global/badge-close.svg +3 -0
  26. package/src/assets/images/icons/global/eye-icon.svg +4 -0
  27. package/src/assets/images/icons/global/eye-slash-icon.svg +8 -0
  28. package/src/assets/images/icons/global/info-circle.svg +5 -0
  29. package/src/assets/images/icons/global/input-arrow-down.svg +3 -0
  30. package/src/lib/breadcrumb/breadcrumb.css +23 -0
  31. package/src/lib/column-select/components/column-select/column-select.css +3 -2
  32. package/src/lib/input/input.css +88 -0
  33. package/src/lib/menu/menu.css +65 -13
  34. package/src/lib/table/table.css +646 -0
  35. package/src/lib/tabs/tabs.css +7 -0
  36. package/src/lib/ui-button/ui-button.css +1 -1
  37. package/src/styles.css +2 -0
package/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnInit, OnDestroy, OnChanges, EventEmitter, ElementRef, Renderer2, SimpleChanges, AfterViewInit, QueryList, ComponentRef, Type, InjectionToken, ApplicationRef, EnvironmentInjector, ChangeDetectorRef } from '@angular/core';
2
+ import { EventEmitter, OnInit, OnDestroy, OnChanges, ElementRef, Renderer2, SimpleChanges, AfterViewInit, QueryList, ComponentRef, Type, InjectionToken, ApplicationRef, EnvironmentInjector, ChangeDetectorRef, TemplateRef, WritableSignal } from '@angular/core';
3
3
  import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors, NgControl, NgModel } from '@angular/forms';
4
4
  import * as rxjs from 'rxjs';
5
5
  import { Observable } from 'rxjs';
6
6
  import * as i1 from '@angular/common';
7
+ import * as i1$3 from '@angular/cdk/drag-drop';
7
8
  import { CdkDragDrop, CdkDragMove, CdkDragStart } from '@angular/cdk/drag-drop';
8
9
  import { NgxMaskDirective } from 'ngx-mask';
9
10
  import * as i1$2 from '@angular/cdk/dialog';
@@ -27,6 +28,33 @@ declare class BrickclayLib {
27
28
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BrickclayLib, "lib-brickclay-lib", never, {}, {}, never, never, true, never>;
28
29
  }
29
30
 
31
+ interface BreadcrumbItem {
32
+ /** Visible text. */
33
+ label: string;
34
+ /**
35
+ * Opaque payload the consumer defines (a route path, an id, …) — carried back
36
+ * on `itemClick`. Absence makes the segment plain, non-interactive text,
37
+ * which is how a page names its own current location in the trail.
38
+ */
39
+ url?: string;
40
+ }
41
+ /**
42
+ * A simple breadcrumb trail: an optional home icon, then `label`s separated by
43
+ * chevrons. Segments with a `url` render as buttons and emit `itemClick`;
44
+ * navigation itself is left to the consumer (same split as `bk-menu`), so this
45
+ * stays usable with any router or none.
46
+ */
47
+ declare class BkBreadcrumb {
48
+ items: BreadcrumbItem[];
49
+ /** Payload for the leading home icon; omit to hide it. */
50
+ homeUrl: string | null;
51
+ itemClick: EventEmitter<BreadcrumbItem>;
52
+ onHomeClick(): void;
53
+ onItemClick(item: BreadcrumbItem): void;
54
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkBreadcrumb, never>;
55
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkBreadcrumb, "bk-breadcrumb", never, { "items": { "alias": "items"; "required": false; }; "homeUrl": { "alias": "homeUrl"; "required": false; }; }, { "itemClick": "itemClick"; }, never, never, true, never>;
56
+ }
57
+
30
58
  interface CalendarRange {
31
59
  start: Date;
32
60
  end: Date;
@@ -903,6 +931,9 @@ interface TableIcon {
903
931
  tooltipPosition?: 'left' | 'right' | 'top' | 'bottom';
904
932
  url: string;
905
933
  }
934
+ interface TableRows {
935
+ class?: string;
936
+ }
906
937
 
907
938
  type SortDirection = 'asc' | 'desc';
908
939
  declare class BkGrid<T = any> {
@@ -915,6 +946,11 @@ declare class BkGrid<T = any> {
915
946
  actionClass: string;
916
947
  showNoRecords: boolean;
917
948
  noRecordFoundHeight: string;
949
+ /** Custom illustration for the empty state. Falls back to a built-in SVG when omitted. */
950
+ noRecordImgUrl?: string;
951
+ noRecordMessage: string;
952
+ /** Static row class or a function that returns a class per row. Row data may also include `class` via TableRows. */
953
+ rows?: string | ((row: T) => string | undefined);
918
954
  change: EventEmitter<{
919
955
  row: T;
920
956
  column: TableColumn<T>;
@@ -941,6 +977,8 @@ declare class BkGrid<T = any> {
941
977
  getBadge(row: T, column: TableColumn<T>): TableBadge | undefined;
942
978
  getIcons(row: T, column: TableColumn<T>): TableIcon[];
943
979
  getTooltipValue(row: T, column: TableColumn<T>): string;
980
+ getRowClass(row: T): string;
981
+ getCellClasses(row: T, column: TableColumn<T>): string;
944
982
  getRowActions(row: T, column?: TableColumn<T>): TableAction<T>[];
945
983
  isActionVisible(action: TableAction<T>, row: T): boolean;
946
984
  isActionDisabled(action: TableAction<T>, row: T): boolean;
@@ -948,8 +986,9 @@ declare class BkGrid<T = any> {
948
986
  dropList(event: CdkDragDrop<T[]>): void;
949
987
  onDragMoved(event: CdkDragMove<any>): void;
950
988
  onDragStart(event: CdkDragStart<any>): void;
989
+ get noRecordImagePath(): string;
951
990
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkGrid<any>, never>;
952
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkGrid<any>, "bk-grid", never, { "draggable": { "alias": "draggable"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "result": { "alias": "result"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "customClass": { "alias": "customClass"; "required": false; }; "actionIconClass": { "alias": "actionIconClass"; "required": false; }; "actionClass": { "alias": "actionClass"; "required": false; }; "showNoRecords": { "alias": "showNoRecords"; "required": false; }; "noRecordFoundHeight": { "alias": "noRecordFoundHeight"; "required": false; }; }, { "change": "change"; "actionClick": "actionClick"; "sortChange": "sortChange"; "dragDropChange": "dragDropChange"; }, never, never, true, never>;
991
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkGrid<any>, "bk-grid", never, { "draggable": { "alias": "draggable"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "result": { "alias": "result"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "customClass": { "alias": "customClass"; "required": false; }; "actionIconClass": { "alias": "actionIconClass"; "required": false; }; "actionClass": { "alias": "actionClass"; "required": false; }; "showNoRecords": { "alias": "showNoRecords"; "required": false; }; "noRecordFoundHeight": { "alias": "noRecordFoundHeight"; "required": false; }; "noRecordImgUrl": { "alias": "noRecordImgUrl"; "required": false; }; "noRecordMessage": { "alias": "noRecordMessage"; "required": false; }; "rows": { "alias": "rows"; "required": false; }; }, { "change": "change"; "actionClick": "actionClick"; "sortChange": "sortChange"; "dragDropChange": "dragDropChange"; }, never, never, true, never>;
953
992
  }
954
993
 
955
994
  /** How an accent colour is applied to a control. */
@@ -1035,7 +1074,7 @@ declare class BkSelect implements ControlValueAccessor, AfterViewInit, OnDestroy
1035
1074
  disabled: _angular_core.ModelSignal<boolean>;
1036
1075
  loading: _angular_core.InputSignal<boolean>;
1037
1076
  closeOnSelect: _angular_core.InputSignal<boolean>;
1038
- dropdownPosition: _angular_core.InputSignal<"bottom" | "top">;
1077
+ dropdownPosition: _angular_core.InputSignal<"top" | "bottom">;
1039
1078
  hasError: boolean;
1040
1079
  errorMessage: string;
1041
1080
  appendToBody: _angular_core.InputSignal<boolean>;
@@ -1064,7 +1103,7 @@ declare class BkSelect implements ControlValueAccessor, AfterViewInit, OnDestroy
1064
1103
  selectedOptions: _angular_core.WritableSignal<any[]>;
1065
1104
  searchTerm: _angular_core.WritableSignal<string>;
1066
1105
  markedIndex: _angular_core.WritableSignal<number>;
1067
- placement: _angular_core.WritableSignal<"bottom" | "top">;
1106
+ placement: _angular_core.WritableSignal<"top" | "bottom">;
1068
1107
  private originalPanelParent;
1069
1108
  private originalPanelAnchor;
1070
1109
  private panelInBody;
@@ -1204,6 +1243,7 @@ type BkInputAutoComplete = 'on' | 'off' | 'name' | 'honorific-prefix' | 'given-n
1204
1243
  type BkInputAutoCapitalize = 'off' | 'none' | 'on' | 'sentences' | 'words' | 'characters';
1205
1244
  type BkInputMode = 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';
1206
1245
  type IconOrientation = 'left' | 'right';
1246
+ type BkInputSize = 'default' | 'sm';
1207
1247
  interface CountryOption {
1208
1248
  code: string;
1209
1249
  name: string;
@@ -1222,6 +1262,8 @@ declare class BkInput implements OnInit, OnDestroy, AfterViewInit, ControlValueA
1222
1262
  hint: string;
1223
1263
  required: boolean;
1224
1264
  type: BkInputType;
1265
+ /** 'sm' shrinks height, padding, font size and icon sizing for compact contexts (e.g. dropdown search boxes). */
1266
+ size: BkInputSize;
1225
1267
  value: string;
1226
1268
  hasError: boolean;
1227
1269
  showErrorIcon: boolean;
@@ -1290,7 +1332,7 @@ declare class BkInput implements OnInit, OnDestroy, AfterViewInit, ControlValueA
1290
1332
  get currentInputType(): string;
1291
1333
  private writeMaskedViewValue;
1292
1334
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkInput, never>;
1293
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkInput, "bk-input", never, { "id": { "alias": "id"; "required": false; }; "name": { "alias": "name"; "required": false; }; "mask": { "alias": "mask"; "required": false; }; "dropSpecialCharacters": { "alias": "dropSpecialCharacters"; "required": false; }; "autoComplete": { "alias": "autoComplete"; "required": false; }; "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "hint": { "alias": "hint"; "required": false; }; "required": { "alias": "required"; "required": false; }; "type": { "alias": "type"; "required": false; }; "value": { "alias": "value"; "required": false; }; "hasError": { "alias": "hasError"; "required": false; }; "showErrorIcon": { "alias": "showErrorIcon"; "required": false; }; "errorMessage": { "alias": "errorMessage"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "autoCapitalize": { "alias": "autoCapitalize"; "required": false; }; "inputMode": { "alias": "inputMode"; "required": false; }; "iconSrc": { "alias": "iconSrc"; "required": false; }; "iconAlt": { "alias": "iconAlt"; "required": false; }; "showIcon": { "alias": "showIcon"; "required": false; }; "phone": { "alias": "phone"; "required": false; }; "countryCode": { "alias": "countryCode"; "required": false; }; "countryOptions": { "alias": "countryOptions"; "required": false; }; "iconOrientation": { "alias": "iconOrientation"; "required": false; }; "password": { "alias": "password"; "required": false; }; "showPassword": { "alias": "showPassword"; "required": false; }; "pattern": { "alias": "pattern"; "required": false; }; "max": { "alias": "max"; "required": false; }; "min": { "alias": "min"; "required": false; }; "step": { "alias": "step"; "required": false; }; "maxlength": { "alias": "maxlength"; "required": false; }; "minlength": { "alias": "minlength"; "required": false; }; }, { "input": "input"; "change": "change"; "focus": "focus"; "blur": "blur"; "clicked": "clicked"; }, never, never, true, never>;
1335
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkInput, "bk-input", never, { "id": { "alias": "id"; "required": false; }; "name": { "alias": "name"; "required": false; }; "mask": { "alias": "mask"; "required": false; }; "dropSpecialCharacters": { "alias": "dropSpecialCharacters"; "required": false; }; "autoComplete": { "alias": "autoComplete"; "required": false; }; "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "hint": { "alias": "hint"; "required": false; }; "required": { "alias": "required"; "required": false; }; "type": { "alias": "type"; "required": false; }; "size": { "alias": "size"; "required": false; }; "value": { "alias": "value"; "required": false; }; "hasError": { "alias": "hasError"; "required": false; }; "showErrorIcon": { "alias": "showErrorIcon"; "required": false; }; "errorMessage": { "alias": "errorMessage"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "autoCapitalize": { "alias": "autoCapitalize"; "required": false; }; "inputMode": { "alias": "inputMode"; "required": false; }; "iconSrc": { "alias": "iconSrc"; "required": false; }; "iconAlt": { "alias": "iconAlt"; "required": false; }; "showIcon": { "alias": "showIcon"; "required": false; }; "phone": { "alias": "phone"; "required": false; }; "countryCode": { "alias": "countryCode"; "required": false; }; "countryOptions": { "alias": "countryOptions"; "required": false; }; "iconOrientation": { "alias": "iconOrientation"; "required": false; }; "password": { "alias": "password"; "required": false; }; "showPassword": { "alias": "showPassword"; "required": false; }; "pattern": { "alias": "pattern"; "required": false; }; "max": { "alias": "max"; "required": false; }; "min": { "alias": "min"; "required": false; }; "step": { "alias": "step"; "required": false; }; "maxlength": { "alias": "maxlength"; "required": false; }; "minlength": { "alias": "minlength"; "required": false; }; }, { "input": "input"; "change": "change"; "focus": "focus"; "blur": "blur"; "clicked": "clicked"; }, never, never, true, never>;
1294
1336
  }
1295
1337
 
1296
1338
  declare class BkInputChips implements ControlValueAccessor, AfterViewInit {
@@ -1392,7 +1434,12 @@ declare class BkTabs {
1392
1434
  * Optional — defaults to false, so navigation stays free unless opted in.
1393
1435
  */
1394
1436
  lockNavigationOnError: boolean;
1395
- /** Fallback error icon used when a tab has `showErrorIcon` but no `errorIcon`. */
1437
+ /**
1438
+ * Fallback error icon used when a tab has `showErrorIcon` but no `errorIcon`.
1439
+ * Inlined as a data URI (rather than an asset path) so it renders correctly
1440
+ * in any consuming app without requiring that app to wire up a build step
1441
+ * that copies this library's assets into its own output.
1442
+ */
1396
1443
  private readonly defaultErrorIcon;
1397
1444
  get isVertical(): boolean;
1398
1445
  get isSegmented(): boolean;
@@ -2076,6 +2123,9 @@ declare class BKTooltipDirective implements OnInit, OnChanges, OnDestroy {
2076
2123
  onInteract(): void;
2077
2124
  onWindowChange(): void;
2078
2125
  private isTooltipContentEmpty;
2126
+ /** Snap-hide with no fade: used when something else (a dropdown panel, another
2127
+ * tooltip) is opening right now, so the two never visibly overlap mid-fade. */
2128
+ private hideTooltipInstant;
2079
2129
  private hideTooltip;
2080
2130
  private setupTooltipHoverListeners;
2081
2131
  private cleanupTooltipListeners;
@@ -2221,7 +2271,7 @@ declare class BkHierarchicalSelect implements ControlValueAccessor, AfterViewIni
2221
2271
  /** When true, dropdown is positioned fixed and sized to the trigger (use inside modals/popups). */
2222
2272
  appendToBody: _angular_core.InputSignal<boolean>;
2223
2273
  /** Open above or below the trigger (also used when appendToBody is true for fixed coordinates). */
2224
- dropdownPosition: _angular_core.InputSignal<"bottom" | "top">;
2274
+ dropdownPosition: _angular_core.InputSignal<"top" | "bottom">;
2225
2275
  /** Key for option color (e.g. "color"). When set, option label and selected value use this color. */
2226
2276
  colorKey: _angular_core.InputSignal<string>;
2227
2277
  /**
@@ -2250,7 +2300,7 @@ declare class BkHierarchicalSelect implements ControlValueAccessor, AfterViewIni
2250
2300
  controlWrapper: ElementRef<HTMLDivElement>;
2251
2301
  dropdownPanel?: ElementRef<HTMLDivElement>;
2252
2302
  private el;
2253
- placement: _angular_core.WritableSignal<"bottom" | "top">;
2303
+ placement: _angular_core.WritableSignal<"top" | "bottom">;
2254
2304
  private originalPanelParent;
2255
2305
  private originalPanelAnchor;
2256
2306
  private panelInBody;
@@ -2499,6 +2549,9 @@ declare class BkColumnFilterService {
2499
2549
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<BkColumnFilterService>;
2500
2550
  }
2501
2551
 
2552
+ type BkColumnSelectVertical = 'top' | 'bottom';
2553
+ type BkColumnSelectHorizontal = 'left' | 'right';
2554
+ type BkColumnSelectPosition = `${BkColumnSelectVertical}-${BkColumnSelectHorizontal}`;
2502
2555
  declare class BkColumnSelect implements ControlValueAccessor, OnChanges {
2503
2556
  columnFilterService: BkColumnFilterService;
2504
2557
  searchable: boolean;
@@ -2508,8 +2561,15 @@ declare class BkColumnSelect implements ControlValueAccessor, OnChanges {
2508
2561
  isOpened: boolean;
2509
2562
  label: string;
2510
2563
  lefticon: string;
2564
+ /** Corner the dropdown opens from, relative to the trigger button. */
2565
+ position: BkColumnSelectPosition;
2566
+ /** When true, flips each axis independently if there isn't enough viewport room for `position`. */
2567
+ autoFlip: boolean;
2511
2568
  isOpenedChange: EventEmitter<boolean>;
2512
2569
  formBoxRef: ElementRef;
2570
+ triggerRef?: ElementRef<HTMLElement>;
2571
+ /** Corner actually rendered on — starts from `position`, auto-flipped on open when needed. */
2572
+ resolvedPosition: BkColumnSelectPosition;
2513
2573
  /** Value bound via ngModel – only updated when user ticks/unticks a checkbox, never on search. */
2514
2574
  columnsFilterList: ColumnFilterOption[];
2515
2575
  search: string;
@@ -2518,6 +2578,12 @@ declare class BkColumnSelect implements ControlValueAccessor, OnChanges {
2518
2578
  constructor(columnFilterService: BkColumnFilterService);
2519
2579
  writeValue(value: ColumnFilterOption[] | null | undefined): void;
2520
2580
  ngOnChanges(changes: SimpleChanges): void;
2581
+ /** Picks `position`, flipping each axis independently if the trigger doesn't have room for it. */
2582
+ private computePlacement;
2583
+ /** Flips `current` to its opposite when it doesn't have `needed` space and the opposite has more room. */
2584
+ private flipIfShort;
2585
+ /** Tailwind classes placing the panel on `resolvedPosition`'s corner of the trigger. */
2586
+ get panelPositionClass(): string;
2521
2587
  private shouldLoadFromService;
2522
2588
  private loadColumnsFilterListFromService;
2523
2589
  registerOnChange(fn: (value: ColumnFilterOption[]) => void): void;
@@ -2531,7 +2597,7 @@ declare class BkColumnSelect implements ControlValueAccessor, OnChanges {
2531
2597
  onClick(event: Event): void;
2532
2598
  get list(): ColumnFilterOption[];
2533
2599
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkColumnSelect, never>;
2534
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkColumnSelect, "bk-column-select", never, { "searchable": { "alias": "searchable"; "required": false; }; "buttonClass": { "alias": "buttonClass"; "required": false; }; "cacheKey": { "alias": "cacheKey"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "isOpened": { "alias": "isOpened"; "required": false; }; "label": { "alias": "label"; "required": false; }; "lefticon": { "alias": "lefticon"; "required": false; }; }, { "isOpenedChange": "isOpenedChange"; }, never, never, true, never>;
2600
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkColumnSelect, "bk-column-select", never, { "searchable": { "alias": "searchable"; "required": false; }; "buttonClass": { "alias": "buttonClass"; "required": false; }; "cacheKey": { "alias": "cacheKey"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "isOpened": { "alias": "isOpened"; "required": false; }; "label": { "alias": "label"; "required": false; }; "lefticon": { "alias": "lefticon"; "required": false; }; "position": { "alias": "position"; "required": false; }; "autoFlip": { "alias": "autoFlip"; "required": false; }; }, { "isOpenedChange": "isOpenedChange"; }, never, never, true, never>;
2535
2601
  }
2536
2602
 
2537
2603
  declare class BkFilePicker implements ControlValueAccessor, Validator {
@@ -2594,6 +2660,13 @@ interface BkPageSize {
2594
2660
  key: number;
2595
2661
  value: number;
2596
2662
  }
2663
+ /** Fine-grained control over the "Rows per page" block: hide just the label, just the
2664
+ * select, or both. A plain boolean is still accepted for the common "show everything or
2665
+ * nothing" case, and is what an omitted `label`/`input` key falls back to as well. */
2666
+ type BkPageSizeVisibility = boolean | {
2667
+ label?: boolean;
2668
+ input?: boolean;
2669
+ };
2597
2670
  declare class BkPagination implements OnChanges {
2598
2671
  pageSize?: number;
2599
2672
  total?: number;
@@ -2602,6 +2675,29 @@ declare class BkPagination implements OnChanges {
2602
2675
  pages: number[];
2603
2676
  activePage: number;
2604
2677
  activePageChange: EventEmitter<number>;
2678
+ /** Gates the "Rows per page" block. `true`/`false` shows or hides the label and the
2679
+ * select together; `{ label?, input? }` hides just one of the two (the other keeps
2680
+ * its own default of shown). */
2681
+ showPageSize: BkPageSizeVisibility;
2682
+ /** Gates the "Showing X to Y of Z Records" text. */
2683
+ showRecordsText: boolean;
2684
+ /** Gates the "N-M of P" page-count text. */
2685
+ showPageCount: boolean;
2686
+ /** Extra classes (Tailwind or custom), applied in two places at once:
2687
+ * - the flex row wrapping the top-level blocks (page size / records text / nav) —
2688
+ * not the outer padding/border element — so e.g. `justify-end` controls their
2689
+ * arrangement when some are hidden.
2690
+ * - the nav itself, which only has room to act on when it's the sole visible
2691
+ * block (it then grows to fill the row) — there, the same class instead spreads
2692
+ * *its* two children, e.g. `justify-between` between the page-count text and
2693
+ * the page-number list. */
2694
+ customClass: string;
2695
+ /** Whether the "Rows per page" label renders, normalizing `showPageSize`'s boolean-or-object shape. */
2696
+ get showPageSizeLabel(): boolean;
2697
+ /** Whether the bk-select renders, normalizing `showPageSize`'s boolean-or-object shape. */
2698
+ get showPageSizeInput(): boolean;
2699
+ /** True once neither half is shown — the whole page-size block drops out, same as `showPageSize=false` today. */
2700
+ get pageSizeHidden(): boolean;
2605
2701
  pager: number;
2606
2702
  isMenuHovered: boolean;
2607
2703
  startingPage: number;
@@ -2622,7 +2718,7 @@ declare class BkPagination implements OnChanges {
2622
2718
  get totalItems(): number;
2623
2719
  getTotalPages(): number;
2624
2720
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkPagination, never>;
2625
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkPagination, "bk-pagination", never, { "pageSize": { "alias": "pageSize"; "required": false; }; "total": { "alias": "total"; "required": false; }; "activePage": { "alias": "activePage"; "required": false; }; }, { "changePageSize": "changePageSize"; "pageChanged": "pageChanged"; "activePageChange": "activePageChange"; }, never, never, true, never>;
2721
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkPagination, "bk-pagination", never, { "pageSize": { "alias": "pageSize"; "required": false; }; "total": { "alias": "total"; "required": false; }; "activePage": { "alias": "activePage"; "required": false; }; "showPageSize": { "alias": "showPageSize"; "required": false; }; "showRecordsText": { "alias": "showRecordsText"; "required": false; }; "showPageCount": { "alias": "showPageCount"; "required": false; }; "customClass": { "alias": "customClass"; "required": false; }; }, { "changePageSize": "changePageSize"; "pageChanged": "pageChanged"; "activePageChange": "activePageChange"; }, never, never, true, never>;
2626
2722
  }
2627
2723
 
2628
2724
  type BkLoaderVariant = 'dots' | 'spinners';
@@ -2725,6 +2821,15 @@ interface MenuItem {
2725
2821
  disabled?: boolean;
2726
2822
  /** Heading shown above this item's children, titling the group. */
2727
2823
  childrenLabel?: string;
2824
+ /**
2825
+ * Splits this item among its siblings into a labeled section — a heading
2826
+ * above the run of siblings that share the same `groupLabel`, with a rule
2827
+ * before each section after the first. Unlike `childrenLabel` (one heading
2828
+ * for a whole `children` array), this groups items within a single flat
2829
+ * list, so several named sections can sit in one always-visible panel (e.g.
2830
+ * a mega-menu). Siblings without a `groupLabel` render ungrouped, as today.
2831
+ */
2832
+ groupLabel?: string;
2728
2833
  /** Nested items — presence of children turns this into an expandable node. */
2729
2834
  children?: MenuItem[];
2730
2835
  }
@@ -2737,10 +2842,11 @@ interface MenuItem {
2737
2842
  * open/closed.
2738
2843
  * - Submenus render inline (accordion) or as pop-ups, opened by hover or click.
2739
2844
  * Pop-ups adapt to the orientation: they drop *below* a horizontal top-level
2740
- * item and fly out to the side for vertical menus / deeper levels, flipping
2741
- * whenever the preferred side has no room.
2845
+ * item and fly out to the side for vertical menus / deeper levels. Side
2846
+ * fly-outs flip when the preferred side has no room; menubar drop-downs never
2847
+ * flip — they stay under their trigger and scroll instead.
2742
2848
  */
2743
- declare class BkMenu implements OnDestroy {
2849
+ declare class BkMenu implements OnChanges, OnDestroy {
2744
2850
  private readonly host;
2745
2851
  items: MenuItem[];
2746
2852
  orientation: MenuOrientation;
@@ -2753,12 +2859,27 @@ declare class BkMenu implements OnDestroy {
2753
2859
  trigger: MenuTrigger;
2754
2860
  /** `compact` shrinks the type, padding and icons for dense layouts. */
2755
2861
  size: MenuSize;
2862
+ /** Fallback grace period for the pointer to cross the gap into a fly-out. */
2863
+ private static readonly HOVER_CLOSE_DELAY_MS;
2864
+ /**
2865
+ * Hover mode only: how long (ms) a fly-out survives after the pointer leaves,
2866
+ * giving it time to cross the gap into the panel. Raise it for menus whose
2867
+ * fly-outs sit further from their trigger, or for touch-ish pointers.
2868
+ */
2869
+ hoverCloseDelay: number;
2756
2870
  /**
2757
2871
  * Keep only one submenu open per level: opening a parent collapses its
2758
2872
  * siblings (and their descendants) so the menu stays compact. Pop-up mode
2759
2873
  * always behaves this way; this input adds it to inline (accordion) mode.
2760
2874
  */
2761
2875
  singleOpen: boolean;
2876
+ /**
2877
+ * Tints an inline (accordion) submenu's whole block — title + rows — with
2878
+ * the lightest gray token. Off by default. Pop-up submenus don't offer
2879
+ * this: their padding/insets are different, and the panel's own border
2880
+ * already sets it apart from the page.
2881
+ */
2882
+ submenuBackground: boolean;
2762
2883
  /** Id of the currently selected leaf item. Two-way bindable. */
2763
2884
  activeItemId: string;
2764
2885
  /** Tint item icons: dark by default, white on the active (dark) row. */
@@ -2773,7 +2894,7 @@ declare class BkMenu implements OnDestroy {
2773
2894
  itemClick: EventEmitter<MenuItem>;
2774
2895
  /** Ids of currently expanded/opened parent nodes. */
2775
2896
  private readonly openIds;
2776
- /** Viewport coordinates for each open fixed-position fly-out, keyed by id. */
2897
+ /** Viewport box for each open fixed-position fly-out, keyed by id. */
2777
2898
  private readonly popupPos;
2778
2899
  /** Side each open fly-out resolved to — drives the chevron and hover bridge. */
2779
2900
  private readonly popupSide;
@@ -2783,10 +2904,30 @@ declare class BkMenu implements OnDestroy {
2783
2904
  * position never flashes on the wrong side.
2784
2905
  */
2785
2906
  private readonly measuredIds;
2786
- /** Grace period for the pointer to cross the gap into a fly-out. */
2787
- private static readonly HOVER_CLOSE_DELAY_MS;
2907
+ /** Floor for a fly-out's height cap, so a trigger near the bottom edge still
2908
+ * gets a usable (scrollable) panel rather than a sliver. */
2909
+ private static readonly MIN_POPUP_H;
2910
+ /**
2911
+ * Ceiling for a fly-out's height — automatic, not a consumer input. Without
2912
+ * one, a popup with many items grows to fill nearly the whole viewport just
2913
+ * because the room is there. Same three-tier breakpoints bk-select uses for
2914
+ * its options list, so a "large" panel reads the same across the design
2915
+ * system regardless of which component renders it.
2916
+ */
2917
+ private static popupHeightCeiling;
2788
2918
  private closeTimer;
2789
2919
  constructor(host: ElementRef<HTMLElement>);
2920
+ /**
2921
+ * Inline mode: whenever the active leaf is (re)set — including the very
2922
+ * first binding, so a deep link or a page refresh lands with the section
2923
+ * already open — expand every ancestor on its path. Pop-up fly-outs are
2924
+ * driven by hover/click, not by which leaf is active, so this is skipped
2925
+ * in `popup` mode.
2926
+ */
2927
+ ngOnChanges(changes: SimpleChanges): void;
2928
+ private expandAncestorsOfActive;
2929
+ /** Ids of every ancestor leading to `targetId` (root-first), `[]` if it's top-level, or `null` if not found. */
2930
+ private findAncestorChain;
2790
2931
  get isVertical(): boolean;
2791
2932
  get isPopup(): boolean;
2792
2933
  get isCompact(): boolean;
@@ -2794,6 +2935,9 @@ declare class BkMenu implements OnDestroy {
2794
2935
  get maxHeightStyle(): string | null;
2795
2936
  popupTop(item: MenuItem): number | null;
2796
2937
  popupLeft(item: MenuItem): number | null;
2938
+ popupMaxWidth(item: MenuItem): string | null;
2939
+ popupMaxHeight(item: MenuItem): string | null;
2940
+ onLabelEnter(event: MouseEvent): void;
2797
2941
  /** Resolved side of an open fly-out, or null before it has been placed. */
2798
2942
  submenuSide(item: MenuItem): MenuPopupSide | null;
2799
2943
  /** True while a fly-out is open but not yet measured — kept transparent. */
@@ -2801,6 +2945,7 @@ declare class BkMenu implements OnDestroy {
2801
2945
  /** Which way the parent's chevron points. */
2802
2946
  chevronDir(item: MenuItem, level: number): 'down' | 'right' | 'left';
2803
2947
  hasChildren(item: MenuItem): boolean;
2948
+ isGroupStart(items: MenuItem[], index: number): boolean;
2804
2949
  isOpen(item: MenuItem): boolean;
2805
2950
  isActive(item: MenuItem): boolean;
2806
2951
  isActiveAncestor(item: MenuItem): boolean;
@@ -2823,7 +2968,7 @@ declare class BkMenu implements OnDestroy {
2823
2968
  onDocumentClick(event: MouseEvent): void;
2824
2969
  onViewportChange(): void;
2825
2970
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkMenu, never>;
2826
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkMenu, "bk-menu", never, { "items": { "alias": "items"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; "submenuMode": { "alias": "submenuMode"; "required": false; }; "trigger": { "alias": "trigger"; "required": false; }; "size": { "alias": "size"; "required": false; }; "singleOpen": { "alias": "singleOpen"; "required": false; }; "activeItemId": { "alias": "activeItemId"; "required": false; }; "tintIcons": { "alias": "tintIcons"; "required": false; }; "maxHeight": { "alias": "maxHeight"; "required": false; }; }, { "activeItemIdChange": "activeItemIdChange"; "itemClick": "itemClick"; }, never, never, true, never>;
2971
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkMenu, "bk-menu", never, { "items": { "alias": "items"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; "submenuMode": { "alias": "submenuMode"; "required": false; }; "trigger": { "alias": "trigger"; "required": false; }; "size": { "alias": "size"; "required": false; }; "hoverCloseDelay": { "alias": "hoverCloseDelay"; "required": false; }; "singleOpen": { "alias": "singleOpen"; "required": false; }; "submenuBackground": { "alias": "submenuBackground"; "required": false; }; "activeItemId": { "alias": "activeItemId"; "required": false; }; "tintIcons": { "alias": "tintIcons"; "required": false; }; "maxHeight": { "alias": "maxHeight"; "required": false; }; }, { "activeItemIdChange": "activeItemIdChange"; "itemClick": "itemClick"; }, never, never, true, never>;
2827
2972
  }
2828
2973
 
2829
2974
  /** Which edge of the anchor the panel sits against. */
@@ -3037,5 +3182,980 @@ declare class BkAvatarGroup {
3037
3182
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkAvatarGroup, "bk-avatar-group", never, { "avatars": { "alias": "avatars"; "required": false; }; "size": { "alias": "size"; "required": false; }; "max": { "alias": "max"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "showOverflow": { "alias": "showOverflow"; "required": false; }; }, {}, never, never, true, never>;
3038
3183
  }
3039
3184
 
3040
- export { BKTooltipDirective, BK_DEFAULT_DIALOG_CONFIG, BK_DIALOG_DATA, BK_DIALOG_GLOBAL_CONFIG, BkAvatar, BkAvatarGroup, BkAvatarUploader, BkBadge, BkButton, BkButtonGroup, BkCalendarManagerService, BkCheckbox, BkColumnFilterService, BkColumnSelect, BkCustomCalendar, BkDialogActions, BkDialogClose, BkDialogContent, BkDialogModule, BkDialogRef, BkDialogService, BkDialogTitle, BkDropdown, BkFileCard, BkFilePicker, BkGrid, BkHierarchicalSelect, BkIconButton, BkInput, BkInputChips, BkLoader, BkMenu, BkPagination, BkPill, BkPopover, BkRadioButton, BkScheduledDatePicker, BkSelect, BkSpinner, BkTabs, BkTextarea, BkTimePicker, BkToastr, BkToastrService, BkToggle, BkValidator, BrickclayIcons, BrickclayLib, CalendarModule, CalendarSelection, ColumnFilterOption, NEUTRAL_APPEARANCE, POPOVER_PLACEMENTS, computePopoverPosition, deriveAppearance, getDialogBackdropAnimation, getDialogPanelAnimation, joinPlacement, parseColor, splitPlacement };
3041
- export type { AvatarFallback, AvatarGroupItem, AvatarSize, AvatarVariant, BadgeColor, BadgeSize, BadgeVariant, BkAnimationKeyframes, BkAvatarFallback, BkAvatarSize, BkDialogAnimation, BkDialogConfig, BkDialogPosition, BkInputAutoCapitalize, BkInputAutoComplete, BkInputMode, BkInputType, BkLoaderVariant, BkPageSize, BkTextAreaAutoCapitalize, BkTextAreaAutoComplete, BkTextAreaInputMode, ButtonSize, ButtonVariant, CalendarRange, ColorAppearance, ColorFill, CountryOption, CustomRangesConfig, DotPosition, DotStatus, DropdownItem, DropdownPlacement, DropdownSize, DropdownTrigger, DropdownVariant, FileState, GroupItem, GroupMode, HierarchicalNode, IconButtonSize, IconButtonVariant, IconOrientation, MenuItem, MenuOrientation, MenuPopupSide, MenuSize, MenuSubmenuMode, MenuTrigger, PillColor, PillSize, PillVariant, PopoverAlign, PopoverPlacement, PopoverPosition, PopoverPositionOptions, PopoverSide, Rect, ScheduledDateSelection, Size, SortDirection, SpinnerSize, TabIconDirection, TabItem, TableAction, TableBadge, TableColumn, TableIcon, TabsColors, TabsOrientation, TabsVariant, TimeConfiguration, ToastConfig, ToastMessage, ToastMethodOptions, ToastPosition, ToastSeverity };
3185
+ /**
3186
+ * Types for bk-table.
3187
+ *
3188
+ * The control is template-driven: consumers write their own <thead>/<tbody>
3189
+ * markup and the component supplies behaviour. These types describe the
3190
+ * contracts passed *into* that markup — sorting, filtering and query state.
3191
+ */
3192
+ /** Ascending, descending, or unsorted. Matches the tri-state sort cycle. */
3193
+ type BkSortOrder = 'ascend' | 'descend' | null;
3194
+ /** Which orders a column cycles through, in order. `null` clears the sort. */
3195
+ type BkSortDirection = BkSortOrder;
3196
+ /**
3197
+ * How a column sorts.
3198
+ *
3199
+ * A comparator sorts client-side. `true` means "this column is sortable but
3200
+ * the server does the work" — the table emits queryParams and leaves the rows
3201
+ * untouched.
3202
+ */
3203
+ type BkSortFn<T = any> = ((a: T, b: T, sortOrder: BkSortOrder) => number) | boolean;
3204
+ /** One entry in a column's filter menu. */
3205
+ interface BkFilterOption {
3206
+ text: string;
3207
+ value: any;
3208
+ /** Pre-select this option on first render. */
3209
+ byDefault?: boolean;
3210
+ }
3211
+ /**
3212
+ * How a column filters.
3213
+ *
3214
+ * The predicate receives the selected values (always an array, even in single
3215
+ * mode) and a row, and returns whether the row survives. `true` defers to the
3216
+ * server, like the sort equivalent.
3217
+ */
3218
+ type BkFilterFn<T = any> = ((selected: any[], item: T) => boolean) | boolean;
3219
+ /** Everything the server needs to reproduce the current view. */
3220
+ interface BkTableQueryParams {
3221
+ pageIndex: number;
3222
+ pageSize: number;
3223
+ sort: {
3224
+ key: string;
3225
+ value: BkSortOrder;
3226
+ }[];
3227
+ filter: {
3228
+ key: string;
3229
+ value: any[];
3230
+ }[];
3231
+ }
3232
+ /**
3233
+ * Table density, roomiest first: `lg`, `default`, `md`, `sm`.
3234
+ *
3235
+ * `sm` is the one to reach for inside a modal, where the surrounding chrome
3236
+ * has already spent most of the height. `middle` and `small` are ng-zorro's
3237
+ * names for `md` and `sm`, kept so existing markup keeps working.
3238
+ */
3239
+ type BkTableSize = 'lg' | 'default' | 'md' | 'sm' | 'middle' | 'small';
3240
+ /** The four real densities, once the ng-zorro aliases are resolved. */
3241
+ type BkTableSizeToken = 'lg' | 'default' | 'md' | 'sm';
3242
+ declare function normalizeBkTableSize(size: BkTableSize): BkTableSizeToken;
3243
+ /**
3244
+ * Fixed-header / fixed-column configuration.
3245
+ *
3246
+ * `x` sets a minimum table width so columns stop collapsing and scroll
3247
+ * horizontally instead; `y` caps body height and pins the header.
3248
+ */
3249
+ interface BkTableScroll {
3250
+ x?: string | null;
3251
+ y?: string | null;
3252
+ /**
3253
+ * `y` is a ceiling by default (`max-height`) — a table with fewer rows
3254
+ * than that shrinks to fit them, same as `nz-table`. Set `fill` to make it
3255
+ * a floor instead (`height`): the body always occupies that space, even
3256
+ * with one row, so surrounding layout (a pager below it, a page built
3257
+ * around a fixed grid height) doesn't shift with the row count.
3258
+ */
3259
+ fill?: boolean;
3260
+ }
3261
+ /** A custom entry in the select-all dropdown (e.g. "Select odd rows"). */
3262
+ interface BkTableSelection {
3263
+ text: string;
3264
+ onSelect: () => void;
3265
+ }
3266
+ /**
3267
+ * Empty-state override for bk-table.
3268
+ *
3269
+ * Both fields are optional — pass just the one you want to change and the
3270
+ * other keeps its built-in default, rather than forcing every consumer to
3271
+ * restate both together.
3272
+ */
3273
+ interface BkTableNoResult {
3274
+ text?: string;
3275
+ image?: string;
3276
+ }
3277
+ /** Horizontal cell alignment. */
3278
+ type BkCellAlign = 'left' | 'center' | 'right';
3279
+ /**
3280
+ * Flattens a tree into the linear array a <tbody> can iterate, keeping only
3281
+ * the branches whose ancestors are all expanded.
3282
+ *
3283
+ * The table can't do this itself: it never sees the tree, only the rows you
3284
+ * hand it. Call this in your component whenever expansion state changes.
3285
+ *
3286
+ * @param root top-level nodes
3287
+ * @param childrenKey property holding each node's children
3288
+ * @param isExpanded whether a node's children should be visible
3289
+ */
3290
+ interface BkTreeRow<T> {
3291
+ data: T;
3292
+ level: number;
3293
+ /** Undefined at the root. Carrying it is what makes a drop resolvable. */
3294
+ parent?: T;
3295
+ }
3296
+ declare function flattenBkTreeData<T extends Record<string, any>>(root: T[], childrenKey?: keyof T & string, isExpanded?: (node: T) => boolean): BkTreeRow<T>[];
3297
+ /**
3298
+ * Whether `node` sits anywhere inside `ancestor`'s subtree.
3299
+ *
3300
+ * The guard a tree drag cannot do without: dropping a node into its own
3301
+ * descendant detaches that whole branch from the tree, and nothing afterwards
3302
+ * can find it again.
3303
+ */
3304
+ declare function containsBkTreeNode<T extends Record<string, any>>(ancestor: T, node: T, childrenKey?: keyof T & string): boolean;
3305
+ /**
3306
+ * Where a tree drop lands relative to its target row: as the sibling before
3307
+ * it, the sibling after it, or as its child.
3308
+ */
3309
+ type BkTreeDropPosition = 'before' | 'after' | 'inside';
3310
+ /** What `BkTreeDrag` resolves a completed drag into. */
3311
+ interface BkTreeDropEvent<T = any> {
3312
+ dragged: BkTreeRow<T>;
3313
+ target: BkTreeRow<T>;
3314
+ position: BkTreeDropPosition;
3315
+ }
3316
+ /**
3317
+ * Applies a resolved tree drop to the tree behind the rows.
3318
+ *
3319
+ * `before` / `after` insert into the target's sibling list; `inside` makes the
3320
+ * dragged node the target's **first** child — first, not last, so the row
3321
+ * appears directly beneath the row it was dropped on rather than teleporting
3322
+ * to the bottom of a long branch.
3323
+ *
3324
+ * A node's subtree travels with it, because it is nested inside it. Dropping a
3325
+ * node into its own descendant is refused: that move would detach the branch
3326
+ * from the tree with nothing left pointing at it.
3327
+ *
3328
+ * Mutates `root` in place and reports whether anything moved; re-emit your
3329
+ * signal with a fresh array identity when it returns true.
3330
+ */
3331
+ declare function moveBkTreeNode<T extends Record<string, any>>(root: T[], dragged: BkTreeRow<T>, target: BkTreeRow<T>, position: BkTreeDropPosition, childrenKey?: keyof T & string): boolean;
3332
+
3333
+ /** Marks projected content as the table's title bar. */
3334
+ declare class BkTableTitle {
3335
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkTableTitle, never>;
3336
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BkTableTitle, "[bkTableTitle]", never, {}, {}, never, never, true, never>;
3337
+ }
3338
+ /** Marks projected content as the table's footer bar. */
3339
+ declare class BkTableFooter {
3340
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkTableFooter, never>;
3341
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BkTableFooter, "[bkTableFooter]", never, {}, {}, never, never, true, never>;
3342
+ }
3343
+ /**
3344
+ * Row template for virtual scroll mode.
3345
+ *
3346
+ * Virtual scrolling can't use a projected <tbody> — the rows have to be created
3347
+ * and destroyed by the viewport as it scrolls, so they must come from a
3348
+ * template the table instantiates itself:
3349
+ *
3350
+ * <tbody>
3351
+ * <ng-template bkVirtualScroll let-row let-i="index">
3352
+ * <tr>…</tr>
3353
+ * </ng-template>
3354
+ * </tbody>
3355
+ */
3356
+ declare class BkVirtualScroll {
3357
+ templateRef: TemplateRef<{
3358
+ $implicit: any;
3359
+ index: number;
3360
+ }>;
3361
+ constructor(templateRef: TemplateRef<{
3362
+ $implicit: any;
3363
+ index: number;
3364
+ }>);
3365
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkVirtualScroll, never>;
3366
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BkVirtualScroll, "[bkVirtualScroll]", never, {}, {}, never, never, true, never>;
3367
+ }
3368
+ /**
3369
+ * Anything a column needs to expose so the table can sort and filter it.
3370
+ * `th[bk-th]` implements this and registers itself on construction; the
3371
+ * interface exists only to keep the two files from importing each other.
3372
+ */
3373
+ interface BkColumnRef {
3374
+ columnKey: string | null;
3375
+ width: string | null;
3376
+ sortOrder: WritableSignal<BkSortOrder>;
3377
+ sortPriority: number | null;
3378
+ clientSortFn: ((a: any, b: any, order: BkSortOrder) => number) | null;
3379
+ filterValue: WritableSignal<any[]>;
3380
+ clientFilterFn: ((selected: any[], item: any) => boolean) | null;
3381
+ clearSort(): void;
3382
+ clearFilter(): void;
3383
+ }
3384
+ /**
3385
+ * Template-driven table.
3386
+ *
3387
+ * Unlike `bk-grid`, this component renders none of your cells — you write the
3388
+ * `<thead>`/`<tbody>` markup and it supplies behaviour: sort and filter state,
3389
+ * pagination, sticky header and columns, virtual scrolling. That's what makes
3390
+ * colspan, nested tables, editable cells and grouped headers possible at all;
3391
+ * none of them can be expressed as a column config object.
3392
+ *
3393
+ * <bk-table #t [data]="rows" [bordered]="true" size="middle">
3394
+ * <thead>
3395
+ * <tr><th bk-th [sortFn]="byName">Name</th></tr>
3396
+ * </thead>
3397
+ * <tbody>
3398
+ * @for (row of t.renderData(); track row.id) {
3399
+ * <tr><td bk-td>{{ row.name }}</td></tr>
3400
+ * }
3401
+ * </tbody>
3402
+ * </bk-table>
3403
+ *
3404
+ * Client vs server work is decided per column, exactly like ng-zorro: pass a
3405
+ * comparator to `sortFn` and the table sorts; pass `true` and it only reports
3406
+ * the change through `queryParams` for you to handle.
3407
+ */
3408
+ declare class BkTable<T = any> implements AfterViewInit, OnDestroy {
3409
+ private readonly host;
3410
+ private readonly zone;
3411
+ constructor();
3412
+ /** Full row set. In server mode, only the current page's rows. */
3413
+ data: _angular_core.InputSignal<readonly T[]>;
3414
+ /** Roomiest first: `lg`, `default`, `md`, `sm`. `sm` suits modals. */
3415
+ size: _angular_core.InputSignal<BkTableSize>;
3416
+ /** One class rather than a binding per size, and it resolves the aliases. */
3417
+ readonly sizeClass: _angular_core.Signal<string>;
3418
+ bordered: _angular_core.InputSignal<boolean>;
3419
+ /** Convenience alternative to projecting `[bkTableTitle]`. */
3420
+ title: _angular_core.InputSignal<string>;
3421
+ /** Convenience alternative to projecting `[bkTableFooter]`. */
3422
+ footer: _angular_core.InputSignal<string>;
3423
+ /**
3424
+ * `x` is a min-width that forces horizontal scrolling instead of column
3425
+ * collapse; `y` caps the body height and pins the header. Fixed columns
3426
+ * (`th[bk-th][left]`) need `x` set to have anything to scroll over.
3427
+ */
3428
+ scroll: _angular_core.InputSignal<BkTableScroll>;
3429
+ loading: _angular_core.InputSignal<boolean>;
3430
+ /**
3431
+ * `loading` always suppresses the empty state — a fetch in flight isn't
3432
+ * "no data," and shouldn't flash that message just because the previous
3433
+ * page's rows haven't arrived yet. This is only about the *spinner*
3434
+ * overlay `loading` draws on top of the table. Turn it off when a
3435
+ * consumer already shows its own loading indicator elsewhere and doesn't
3436
+ * want a second one competing with it — `loading` keeps doing its other
3437
+ * job either way.
3438
+ */
3439
+ showLoadingOverlay: _angular_core.InputSignal<boolean>;
3440
+ /**
3441
+ * Shown when there are no rows to render. Pass either `text` or `image` (or
3442
+ * both) to override just that piece — anything left out keeps the default.
3443
+ */
3444
+ noResult: _angular_core.InputSignal<BkTableNoResult>;
3445
+ noResultText: _angular_core.Signal<string>;
3446
+ noResultImage: _angular_core.Signal<string>;
3447
+ /**
3448
+ * Set once `noResultImage()` fails to load, so the template can drop the
3449
+ * `<img>` instead of leaving the browser's broken-image glyph sitting next
3450
+ * to the empty-state text — bk-grid's empty state does exactly that on any
3451
+ * deployment where the asset path doesn't resolve. The text alone still
3452
+ * communicates "no data"; a broken icon just looks like the component is
3453
+ * broken.
3454
+ */
3455
+ readonly emptyImageFailed: WritableSignal<boolean>;
3456
+ onEmptyImageError(): void;
3457
+ showPagination: _angular_core.InputSignal<boolean>;
3458
+ /**
3459
+ * When true the table slices `data` itself. Turn it off for server-side
3460
+ * paging and feed `total` instead.
3461
+ */
3462
+ frontPagination: _angular_core.InputSignal<boolean>;
3463
+ pageIndex: _angular_core.ModelSignal<number>;
3464
+ /**
3465
+ * Defaults to 25 because that is the smallest size `bk-pagination` offers
3466
+ * (25/50/75/100). A value outside that list matches no option and leaves its
3467
+ * "rows per page" select rendering blank.
3468
+ */
3469
+ pageSize: _angular_core.ModelSignal<number>;
3470
+ /** Row count for server mode. Ignored when `frontPagination` is on. */
3471
+ total: _angular_core.InputSignal<number>;
3472
+ /**
3473
+ * Row height in px. Required for virtual scroll — the viewport can't measure
3474
+ * rows it hasn't created. Rows must be uniform height, which is why virtual
3475
+ * scroll does not combine with rowspan, tree data or expandable rows.
3476
+ */
3477
+ virtualItemSize: _angular_core.InputSignal<number>;
3478
+ virtualTrackBy: _angular_core.InputSignal<(index: number, item: T) => any>;
3479
+ private viewport?;
3480
+ /**
3481
+ * Scrolls the virtual viewport so the row at `index` (into `renderData()`)
3482
+ * lands at the top.
3483
+ *
3484
+ * Indexes are 0-based against the rendered rows, not the raw `data` input —
3485
+ * sorting/filtering already reduced it to what's actually on screen, and
3486
+ * jumping against the raw array would land on the wrong row the moment
3487
+ * either is active.
3488
+ */
3489
+ scrollToIndex(index: number, behavior?: ScrollBehavior): void;
3490
+ /**
3491
+ * Hold the columns still once they have been measured.
3492
+ *
3493
+ * A table left on `table-layout: auto` sizes its columns from whatever
3494
+ * content is currently on screen, so sorting, filtering or paging — none of
3495
+ * which change the columns — visibly resizes them. Freezing the proportions
3496
+ * after the first real layout keeps the header from jumping under the
3497
+ * pointer that just clicked it.
3498
+ *
3499
+ * Turn it off if the content genuinely should drive the widths on every
3500
+ * change. Columns with an explicit `width` are never overwritten either way.
3501
+ */
3502
+ stableColumnWidth: _angular_core.InputSignal<boolean>;
3503
+ /** Everything the server needs to reproduce the current view. */
3504
+ queryParams: _angular_core.OutputEmitterRef<BkTableQueryParams>;
3505
+ /** The rows actually rendered, after filter/sort/paging. */
3506
+ currentPageDataChange: _angular_core.OutputEmitterRef<readonly T[]>;
3507
+ titleContent?: BkTableTitle;
3508
+ footerContent?: BkTableFooter;
3509
+ virtualScroll?: BkVirtualScroll;
3510
+ /**
3511
+ * Registered `th[bk-th]` instances. Sorting and filtering are driven by
3512
+ * column state, so the pipeline below reads through this signal — replacing
3513
+ * the array (rather than mutating it) is what makes the computeds re-run.
3514
+ */
3515
+ readonly columns: WritableSignal<BkColumnRef[]>;
3516
+ registerColumn(column: BkColumnRef): void;
3517
+ unregisterColumn(column: BkColumnRef): void;
3518
+ /**
3519
+ * Re-emits query params. Columns call this when their sort or filter
3520
+ * changes; the data pipeline reacts on its own through signals, so this
3521
+ * exists purely to notify the consumer.
3522
+ */
3523
+ onColumnStateChange(): void;
3524
+ /**
3525
+ * Rows surviving every column's client-side filter. Columns whose filter is
3526
+ * handled server-side contribute nothing here.
3527
+ */
3528
+ private readonly filtered;
3529
+ /**
3530
+ * Filtered rows in sort order.
3531
+ *
3532
+ * Multi-sort runs columns by descending `sortPriority`, and comparators are
3533
+ * applied in that order until one breaks the tie — so a priority-2 column
3534
+ * only orders rows a priority-3 column considers equal.
3535
+ */
3536
+ private readonly sorted;
3537
+ /** Row count before paging — what the pager needs to size itself. */
3538
+ readonly totalCount: _angular_core.Signal<number>;
3539
+ /**
3540
+ * The rows to render. Iterate this in your `<tbody>`, not the raw input:
3541
+ * it is the input after filtering, sorting and paging.
3542
+ */
3543
+ readonly renderData: _angular_core.Signal<readonly T[]>;
3544
+ readonly isVirtual: _angular_core.Signal<boolean>;
3545
+ /**
3546
+ * Column widths for the virtual-scroll `<colgroup>`.
3547
+ *
3548
+ * Virtual scroll splits the header and body into two tables, so they can no
3549
+ * longer size each other — a shared colgroup is what keeps their columns
3550
+ * lined up, and it needs a declared width per column to do it.
3551
+ */
3552
+ readonly colWidths: _angular_core.Signal<(string | null)[]>;
3553
+ readonly hasTitle: _angular_core.Signal<boolean>;
3554
+ readonly hasFooter: _angular_core.Signal<boolean>;
3555
+ readonly isEmpty: _angular_core.Signal<boolean>;
3556
+ /** Floor for the empty state's home: `.bk-table-empty` is absolutely
3557
+ * positioned against this container (see table.css), so without either
3558
+ * `scroll.y` or this fallback it'd have a ~0px-tall box to center in
3559
+ * (just the header row, since an empty `<tbody>` contributes nothing)
3560
+ * and get clipped by `overflow-auto`. */
3561
+ private static readonly EMPTY_STATE_MIN_HEIGHT;
3562
+ readonly containerStyle: _angular_core.Signal<{
3563
+ 'min-height': string;
3564
+ 'overflow-y'?: undefined;
3565
+ } | {
3566
+ 'min-height'?: undefined;
3567
+ 'overflow-y'?: undefined;
3568
+ } | {
3569
+ [x: string]: string;
3570
+ 'overflow-y': string;
3571
+ 'min-height'?: undefined;
3572
+ }>;
3573
+ /** Set once the columns have been measured and pinned. */
3574
+ readonly layoutFixed: WritableSignal<boolean>;
3575
+ readonly tableStyle: _angular_core.Signal<Record<string, string>>;
3576
+ virtualHead?: ElementRef<HTMLElement>;
3577
+ private headResizeObserver?;
3578
+ private layoutResizeObserver?;
3579
+ ngAfterViewInit(): void;
3580
+ ngOnDestroy(): void;
3581
+ /**
3582
+ * Publishes the first header row's height as `--bk-thead-row-1`.
3583
+ *
3584
+ * A grouped header's second row has to stick *below* the first, which means
3585
+ * knowing how tall the first is — and that changes with density, with font
3586
+ * loading, and with any header that wraps. Measuring it is the only offset
3587
+ * that stays correct; a constant is right for exactly one configuration.
3588
+ */
3589
+ private observeHeaderHeight;
3590
+ /**
3591
+ * Two unrelated jobs that both boil down to "re-check this whenever the
3592
+ * table's or the container's box size changes," so one `ResizeObserver`
3593
+ * watching both elements does them together.
3594
+ *
3595
+ * **Retries the column freeze.** A table that mounts inside a `[hidden]`
3596
+ * ancestor — a collapsed `tr[bkExpand]` holding a nested `bk-table`, most
3597
+ * commonly — measures 0 on its first freeze attempt, so
3598
+ * `freezeColumnWidths()` correctly declines to pin widths it can't see
3599
+ * (`if (!tableWidth) return;`). Nothing else ever asks it to try again: the
3600
+ * constructor effect only reruns when one of its own signals changes, and
3601
+ * none of them do just because the table became visible. Left alone, that
3602
+ * table stays on `table-layout: auto` forever — and an auto-layout cell
3603
+ * can't give a nested table's `min-width: 100%` a real number to resolve
3604
+ * against, which is what leaves a nested `bk-table` stuck at its own
3605
+ * shrink-to-fit width even after the row expands. Once `layoutFixed` is
3606
+ * true the call is a no-op, so this can just stay connected for the
3607
+ * table's life rather than tracking whether it still needs to be.
3608
+ *
3609
+ * **Tracks whether the rows fall short of the container.** See
3610
+ * `updateUnderfilled`.
3611
+ */
3612
+ private observeTableVisibility;
3613
+ /**
3614
+ * Marks the host when rows end well short of a reserved `scroll.y`
3615
+ * (`fill`, most commonly) height, so `.bk-table-underfilled` in the
3616
+ * stylesheet can close the real data off with a border instead of letting
3617
+ * it trail into blank reserved space with nothing marking where it
3618
+ * stopped. Left off whenever rows fill or overflow the container — the
3619
+ * frame's own border (or the scroll cutoff) already closes those cases,
3620
+ * and adding another border would double up against it.
3621
+ */
3622
+ private updateUnderfilled;
3623
+ /**
3624
+ * Pins the columns at the proportions auto layout arrived at.
3625
+ *
3626
+ * Widths are stored as percentages, not pixels: under `table-layout: fixed`
3627
+ * a percentage resolves against the table, so the columns keep their
3628
+ * relationship when the container resizes. Pixels would freeze the table at
3629
+ * whatever width it happened to have when the rows first arrived.
3630
+ *
3631
+ * Only the first header row is written to — that is the row `table-layout:
3632
+ * fixed` reads widths from. A grouped header's second row inherits its share
3633
+ * of whatever the group above it was given.
3634
+ */
3635
+ private freezeColumnWidths;
3636
+ /** The cells this component wrote a width to, so it can undo exactly those. */
3637
+ private frozenCells;
3638
+ /** Column count the frozen widths were measured against. */
3639
+ private frozenColumnCount;
3640
+ /** Guards against stacking timeouts while columns are still registering. */
3641
+ private freezeScheduled;
3642
+ /**
3643
+ * Drops the frozen widths so the columns are measured again. Call it after
3644
+ * replacing the dataset with one whose shape is different enough that the
3645
+ * old proportions no longer suit it.
3646
+ */
3647
+ remeasureColumns(): void;
3648
+ /**
3649
+ * Keeps the detached virtual-scroll header aligned with the body it no
3650
+ * longer shares a table with.
3651
+ */
3652
+ onViewportScroll(event: Event): void;
3653
+ onPageIndexChange(index: number): void;
3654
+ onPageSizeChange(size: number): void;
3655
+ /** Clears every column's sort. Backs "reset sorters" in the demo. */
3656
+ clearSort(): void;
3657
+ /** Clears every column's filter selection. */
3658
+ clearFilter(): void;
3659
+ /** Clears sorts and filters together and returns to the first page. */
3660
+ reset(): void;
3661
+ private emitQueryParams;
3662
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkTable<any>, never>;
3663
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkTable<any>, "bk-table", ["bkTable"], { "data": { "alias": "data"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "footer": { "alias": "footer"; "required": false; "isSignal": true; }; "scroll": { "alias": "scroll"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "showLoadingOverlay": { "alias": "showLoadingOverlay"; "required": false; "isSignal": true; }; "noResult": { "alias": "noResult"; "required": false; "isSignal": true; }; "showPagination": { "alias": "showPagination"; "required": false; "isSignal": true; }; "frontPagination": { "alias": "frontPagination"; "required": false; "isSignal": true; }; "pageIndex": { "alias": "pageIndex"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "virtualItemSize": { "alias": "virtualItemSize"; "required": false; "isSignal": true; }; "virtualTrackBy": { "alias": "virtualTrackBy"; "required": false; "isSignal": true; }; "stableColumnWidth": { "alias": "stableColumnWidth"; "required": false; "isSignal": true; }; }, { "pageIndex": "pageIndexChange"; "pageSize": "pageSizeChange"; "queryParams": "queryParams"; "currentPageDataChange": "currentPageDataChange"; }, ["titleContent", "footerContent", "virtualScroll"], ["thead", "tbody", "tfoot", "[bkTableTitle]", "[bkTableFooter]"], true, never>;
3664
+ }
3665
+
3666
+ /**
3667
+ * Behaviour shared by `th[bk-th]` and `td[bk-td]`: fixed columns, text
3668
+ * overflow handling and alignment.
3669
+ *
3670
+ * Fixed columns are `position: sticky`, which needs a pixel offset — and the
3671
+ * correct offset is the cell's distance from the edge of the table, which is
3672
+ * only knowable after layout. Subclasses get that measurement for free.
3673
+ */
3674
+ declare abstract class BkCellBase implements AfterViewInit, OnDestroy {
3675
+ protected readonly el: ElementRef<any>;
3676
+ private readonly zone;
3677
+ /**
3678
+ * Pin this column to the left edge while the table scrolls horizontally.
3679
+ * `true` measures the offset; a string sets it explicitly.
3680
+ *
3681
+ * Pinned columns must be contiguous from the edge — a gap leaves the columns
3682
+ * beyond it overlapping as they scroll underneath.
3683
+ */
3684
+ left: _angular_core.InputSignal<string | boolean>;
3685
+ /** Pin to the right edge. Same rules as `left`. */
3686
+ right: _angular_core.InputSignal<string | boolean>;
3687
+ /**
3688
+ * Truncate overflow with an ellipsis instead of wrapping.
3689
+ *
3690
+ * Put it on the `td`, not the `th`. It works by setting `max-width: 0` on
3691
+ * whichever cell carries it, and `table-layout: fixed` sizes a column from
3692
+ * its header cell alone — a `max-width` on the header collapses the whole
3693
+ * column toward zero regardless of any declared `width`. A `td`'s own width
3694
+ * is never consulted by `fixed` layout, so the same rule there only clips
3695
+ * the content, which is the point.
3696
+ */
3697
+ ellipsis: _angular_core.InputSignal<boolean>;
3698
+ /**
3699
+ * Allow breaks *inside* words. Without it a long unbroken string (a URL, an
3700
+ * ID) pushes past the cell instead of wrapping.
3701
+ */
3702
+ breakWord: _angular_core.InputSignal<boolean>;
3703
+ align: _angular_core.InputSignal<BkCellAlign | null>;
3704
+ /** Resolved sticky offsets, written after measurement. */
3705
+ protected readonly stickyLeft: _angular_core.WritableSignal<string | null>;
3706
+ protected readonly stickyRight: _angular_core.WritableSignal<string | null>;
3707
+ private resizeObserver?;
3708
+ get isSticky(): boolean;
3709
+ ngAfterViewInit(): void;
3710
+ ngOnDestroy(): void;
3711
+ /**
3712
+ * Resolves the sticky offsets.
3713
+ *
3714
+ * Offsets are summed from sibling `offsetWidth`s rather than read from
3715
+ * `getBoundingClientRect()`: once a cell is sticky its rect reflects where it
3716
+ * has been *held*, not where the column sits, so measuring a scrolled table
3717
+ * that way feeds each cell its own displacement back. `offsetWidth` is
3718
+ * unaffected by the sticky shift.
3719
+ */
3720
+ protected measure(): void;
3721
+ private sumWidths;
3722
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkCellBase, never>;
3723
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BkCellBase, never, never, { "left": { "alias": "left"; "required": false; "isSignal": true; }; "right": { "alias": "right"; "required": false; "isSignal": true; }; "ellipsis": { "alias": "ellipsis"; "required": false; "isSignal": true; }; "breakWord": { "alias": "breakWord"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3724
+ }
3725
+
3726
+ /**
3727
+ * Header cell.
3728
+ *
3729
+ * Carries a column's sort state, filter menu and select-all checkbox, and
3730
+ * registers itself with the parent `bk-table` so the table's data pipeline can
3731
+ * read them. It renders whatever you project as the label:
3732
+ *
3733
+ * <th bk-th [sortFn]="byName" [filters]="statuses" [filterFn]="byStatus">
3734
+ * Name
3735
+ * </th>
3736
+ *
3737
+ * Use the native `colspan` / `rowspan` attributes for grouped headers — they
3738
+ * need no wrapper input.
3739
+ */
3740
+ declare class BkTh extends BkCellBase implements BkColumnRef, OnInit, OnDestroy {
3741
+ /** Optional: the parent table only exists when the th is inside one. */
3742
+ private readonly table;
3743
+ /** Identifies the column in `queryParams`. Required for server-side work. */
3744
+ columnKeyInput: _angular_core.InputSignal<string | null>;
3745
+ /**
3746
+ * Column width. Required in virtual-scroll mode, where the header is a
3747
+ * separate table and has no body cells to size itself against.
3748
+ */
3749
+ widthInput: _angular_core.InputSignal<string | null>;
3750
+ /** Plain-value views of the inputs, so the table can read them off BkColumnRef. */
3751
+ get columnKey(): string | null;
3752
+ get width(): string | null;
3753
+ /**
3754
+ * A comparator sorts client-side; `true` marks the column sortable but
3755
+ * leaves the sorting to the server.
3756
+ */
3757
+ sortFn: _angular_core.InputSignal<BkSortFn | null>;
3758
+ sortOrder: _angular_core.ModelSignal<BkSortOrder>;
3759
+ /** The cycle the header steps through on each click. */
3760
+ sortDirections: _angular_core.InputSignal<BkSortOrder[]>;
3761
+ /**
3762
+ * Ranks this column against other sorted columns — higher wins. Columns
3763
+ * without a priority sort in registration order after those with one.
3764
+ */
3765
+ sortPriorityInput: _angular_core.InputSignal<number | null>;
3766
+ /** Options for the filter menu. An empty list hides the funnel icon. */
3767
+ filters: _angular_core.InputSignal<BkFilterOption[]>;
3768
+ /** Predicate for client-side filtering, or `true` to defer to the server. */
3769
+ filterFn: _angular_core.InputSignal<BkFilterFn | null>;
3770
+ /** Multiple shows checkboxes; single shows radios and closes on pick. */
3771
+ filterMultiple: _angular_core.InputSignal<boolean>;
3772
+ checkbox: _angular_core.InputSignal<boolean>;
3773
+ checked: _angular_core.ModelSignal<boolean>;
3774
+ indeterminate: _angular_core.InputSignal<boolean>;
3775
+ disabled: _angular_core.InputSignal<boolean>;
3776
+ /**
3777
+ * Extra entries in the select-all dropdown ("Select odd rows", …). Providing
3778
+ * any adds a caret beside the checkbox.
3779
+ */
3780
+ selections: _angular_core.InputSignal<BkTableSelection[]>;
3781
+ /** Reserves the narrow width used by the expand-icon column. */
3782
+ showExpand: _angular_core.InputSignal<boolean>;
3783
+ readonly filterValue: _angular_core.WritableSignal<any[]>;
3784
+ /** Menu selection while the popover is open, before OK is pressed. */
3785
+ readonly pendingFilter: _angular_core.WritableSignal<any[]>;
3786
+ readonly showSort: _angular_core.Signal<boolean>;
3787
+ readonly showFilter: _angular_core.Signal<boolean>;
3788
+ readonly isFiltered: _angular_core.Signal<boolean>;
3789
+ /** Only comparators run in-process; `true` means the server sorts. */
3790
+ get clientSortFn(): ((a: any, b: any, order: BkSortOrder) => number) | null;
3791
+ get clientFilterFn(): ((selected: any[], item: any) => boolean) | null;
3792
+ get sortPriority(): number | null;
3793
+ ngOnInit(): void;
3794
+ ngOnDestroy(): void;
3795
+ /** Advances to the next order in `sortDirections`, wrapping at the end. */
3796
+ onSortClick(): void;
3797
+ clearSort(): void;
3798
+ isPending(value: any): boolean;
3799
+ /**
3800
+ * Single-select view of the pending selection, for the radio list. The
3801
+ * underlying state stays an array in both modes so the filter predicate has
3802
+ * one shape to handle.
3803
+ */
3804
+ get singleFilter(): any;
3805
+ set singleFilter(value: any);
3806
+ toggleFilterOption(value: any, selected: boolean): void;
3807
+ applyFilter(popover?: BkPopover): void;
3808
+ resetFilter(popover?: BkPopover): void;
3809
+ clearFilter(): void;
3810
+ /** Re-syncs the menu to the applied state so a cancelled edit doesn't stick. */
3811
+ onFilterMenuOpen(): void;
3812
+ onCheckedChange(value: boolean): void;
3813
+ runSelection(selection: BkTableSelection, popover?: BkPopover): void;
3814
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkTh, never>;
3815
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkTh, "th[bk-th]", never, { "columnKeyInput": { "alias": "columnKey"; "required": false; "isSignal": true; }; "widthInput": { "alias": "width"; "required": false; "isSignal": true; }; "sortFn": { "alias": "sortFn"; "required": false; "isSignal": true; }; "sortOrder": { "alias": "sortOrder"; "required": false; "isSignal": true; }; "sortDirections": { "alias": "sortDirections"; "required": false; "isSignal": true; }; "sortPriorityInput": { "alias": "sortPriority"; "required": false; "isSignal": true; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "filterFn": { "alias": "filterFn"; "required": false; "isSignal": true; }; "filterMultiple": { "alias": "filterMultiple"; "required": false; "isSignal": true; }; "checkbox": { "alias": "checkbox"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "selections": { "alias": "selections"; "required": false; "isSignal": true; }; "showExpand": { "alias": "showExpand"; "required": false; "isSignal": true; }; }, { "sortOrder": "sortOrderChange"; "checked": "checkedChange"; }, never, ["*"], true, never>;
3816
+ }
3817
+
3818
+ /**
3819
+ * Body cell.
3820
+ *
3821
+ * Handles the parts of a cell the consumer shouldn't have to rebuild each
3822
+ * time — row checkbox, expand toggle, tree indentation, sticky positioning —
3823
+ * and projects everything else through untouched:
3824
+ *
3825
+ * <td bk-td [(checked)]="row.checked"></td>
3826
+ * <td bk-td [showExpand]="row.hasChildren" [(expand)]="row.expand"
3827
+ * [indentLevel]="row.level" [indentSize]="20">{{ row.name }}</td>
3828
+ *
3829
+ * Use the native `colspan` / `rowspan` attributes for spanning cells.
3830
+ */
3831
+ declare class BkTd extends BkCellBase implements AfterViewInit, OnDestroy {
3832
+ private readonly ngZone;
3833
+ private ellipsisResizeObserver?;
3834
+ /**
3835
+ * The tooltip's content, and the switch for whether it shows at all — see
3836
+ * `observeEllipsisTruncation()`. Bound in the template onto the innermost
3837
+ * `.bk-td-ellipsis-text` span wrapping the projected content, not the `td`
3838
+ * or `.bk-td-content`: both of those are wider than the actual (possibly
3839
+ * truncated) text, and the tooltip should point at what's actually there.
3840
+ */
3841
+ protected readonly truncatedTooltip: _angular_core.WritableSignal<string>;
3842
+ /** Forwarded to the content wrapper's `bkTooltip`. Override on a column whose default 'right' would run into its neighbour. */
3843
+ tooltipPosition: _angular_core.InputSignal<"left" | "right" | "top" | "bottom">;
3844
+ /** Only present when `ellipsis()` is true — see the `@else` branch in the template. */
3845
+ private ellipsisTextRef?;
3846
+ checkbox: _angular_core.InputSignal<boolean>;
3847
+ checked: _angular_core.ModelSignal<boolean>;
3848
+ disabled: _angular_core.InputSignal<boolean>;
3849
+ indeterminate: _angular_core.InputSignal<boolean>;
3850
+ /**
3851
+ * Renders the expand toggle. Set it false on leaf rows in a tree — the cell
3852
+ * still reserves the icon's width so labels stay aligned down the column.
3853
+ */
3854
+ showExpand: _angular_core.InputSignal<boolean>;
3855
+ expand: _angular_core.ModelSignal<boolean>;
3856
+ /**
3857
+ * Custom expand icon. The template receives the open state as `$implicit`:
3858
+ *
3859
+ * <ng-template #icon let-expanded>{{ expanded ? '−' : '+' }}</ng-template>
3860
+ */
3861
+ expandIcon: _angular_core.InputSignal<TemplateRef<{
3862
+ $implicit: boolean;
3863
+ }> | null>;
3864
+ /** Depth of this row in the tree. Multiplied by `indentSize`. */
3865
+ indentLevel: _angular_core.InputSignal<number>;
3866
+ /** Pixels of indent per level. */
3867
+ indentSize: _angular_core.InputSignal<number>;
3868
+ /**
3869
+ * Marks the column that carries the tree. Leaf rows in such a column get a
3870
+ * blank spacer where the toggle would be, so their labels line up with the
3871
+ * labels of siblings that do have children — including at depth 0, where
3872
+ * indentation alone gives nothing to align against.
3873
+ */
3874
+ treeCell: _angular_core.InputSignal<boolean>;
3875
+ /**
3876
+ * The projected content is block-level and should fill the cell — a nested
3877
+ * `bk-table`, most commonly — rather than the default shrink-to-fit inline
3878
+ * box that lets ordinary text/icon content size to itself and still honour
3879
+ * `align` via `text-align`. Turning this on trades that `align` behaviour
3880
+ * away for whatever the block content does with the full width itself.
3881
+ */
3882
+ block: _angular_core.InputSignal<boolean>;
3883
+ readonly indentPx: _angular_core.Signal<number>;
3884
+ /** A tree cell with no toggle of its own still reserves the toggle's width. */
3885
+ readonly isLeafSpacer: _angular_core.Signal<boolean>;
3886
+ onExpandClick(): void;
3887
+ onCheckedChange(value: boolean): void;
3888
+ ngAfterViewInit(): void;
3889
+ ngOnDestroy(): void;
3890
+ /**
3891
+ * Drives `truncatedTooltip` from measured truncation rather than the
3892
+ * content being present unconditionally: `bkTooltip`'s own emptiness check
3893
+ * already suppresses the tooltip when there's nothing to show, so setting
3894
+ * it only when the cell is genuinely clipped (`scrollWidth > clientWidth`)
3895
+ * is what makes it show "for the truncated item only" — an `ellipsis` cell
3896
+ * whose text happens to fit never gets a tooltip at all.
3897
+ *
3898
+ * Measures the inner `.bk-td-ellipsis-text` span, not the `td` — that span
3899
+ * is now the element that actually owns `overflow: hidden` (see
3900
+ * `.bk-td-ellipsis-text` in table.css, and why: the ellipsis marker needs
3901
+ * a plain, non-flex element to render on at all). Because it clips its own
3902
+ * overflow, that overflow never reaches the `td`'s own `scrollWidth`
3903
+ * anymore — measuring the `td` here would read `scrollWidth ===
3904
+ * clientWidth` even when the text is visibly cut off, since the span
3905
+ * absorbs it first.
3906
+ *
3907
+ * Measured on resize, not on hover: `bkTooltip`'s own `mouseenter` listener
3908
+ * fires independently of this, so content has to already be correct
3909
+ * *before* any hover — computing it reactively to the hover would risk
3910
+ * showing whatever was last set instead of what's true at that moment.
3911
+ */
3912
+ private observeEllipsisTruncation;
3913
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkTd, never>;
3914
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkTd, "td[bk-td]", never, { "tooltipPosition": { "alias": "tooltipPosition"; "required": false; "isSignal": true; }; "checkbox": { "alias": "checkbox"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "showExpand": { "alias": "showExpand"; "required": false; "isSignal": true; }; "expand": { "alias": "expand"; "required": false; "isSignal": true; }; "expandIcon": { "alias": "expandIcon"; "required": false; "isSignal": true; }; "indentLevel": { "alias": "indentLevel"; "required": false; "isSignal": true; }; "indentSize": { "alias": "indentSize"; "required": false; "isSignal": true; }; "treeCell": { "alias": "treeCell"; "required": false; "isSignal": true; }; "block": { "alias": "block"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "expand": "expandChange"; }, never, ["*"], true, never>;
3915
+ }
3916
+
3917
+ /**
3918
+ * A detail row that appears beneath its parent when expanded.
3919
+ *
3920
+ * <tr [bkExpand]="row.expand">
3921
+ * <td colspan="5">…anything…</td>
3922
+ * </tr>
3923
+ *
3924
+ * The row is hidden rather than destroyed, so state inside it (a scrolled
3925
+ * nested table, a half-filled form) survives being collapsed and reopened.
3926
+ * Wrap it in `@if` instead when the content is expensive enough that keeping
3927
+ * it alive costs more than rebuilding it.
3928
+ */
3929
+ declare class BkTrExpand {
3930
+ bkExpand: _angular_core.InputSignal<boolean>;
3931
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkTrExpand, never>;
3932
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BkTrExpand, "tr[bkExpand]", never, { "bkExpand": { "alias": "bkExpand"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3933
+ }
3934
+ /**
3935
+ * Summary / totals rows, placed in a `<tfoot>`.
3936
+ *
3937
+ * <tfoot bkTableSummary [fixed]="true">
3938
+ * <tr><td bk-td>Total</td><td bk-td>{{ total }}</td></tr>
3939
+ * </tfoot>
3940
+ *
3941
+ * `fixed` pins the footer to the bottom of the scroll container so totals stay
3942
+ * visible while the body scrolls — the counterpart to the fixed header.
3943
+ */
3944
+ declare class BkTableSummary {
3945
+ fixed: _angular_core.InputSignal<boolean>;
3946
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkTableSummary, never>;
3947
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BkTableSummary, "tfoot[bkTableSummary]", never, { "fixed": { "alias": "fixed"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3948
+ }
3949
+
3950
+ /**
3951
+ * Makes CDK row dragging behave inside a `<table>`.
3952
+ *
3953
+ * Two problems the CDK doesn't solve on its own, both carried over from
3954
+ * `bk-grid` where they were already working:
3955
+ *
3956
+ * 1. The drag preview is a detached copy of the `<tr>`, so it loses the column
3957
+ * widths the table gave it and collapses to its content. Widths are copied
3958
+ * across at drag start — from the *placeholder*, not the dragged row: by
3959
+ * the time `cdkDragStarted` fires, the CDK has already swapped the row out
3960
+ * for the placeholder and moved the row itself out to `<body>`, so the row
3961
+ * is no longer sitting inside the table and no longer reports the table's
3962
+ * widths. The placeholder is a clone left in the row's place, still inside
3963
+ * the table, so it's the one still telling the truth.
3964
+ * 2. Dragging to the edge of a scrolling table doesn't scroll it, so rows below
3965
+ * the fold are unreachable. Nearing an edge scrolls proportionally to how
3966
+ * close the pointer is.
3967
+ *
3968
+ * <div class="wrap" #d="bkTableDrag" bkTableDrag>
3969
+ * <bk-table>
3970
+ * <tbody cdkDropList (cdkDropListDropped)="drop($event)">
3971
+ * @for (row of rows; track row.id) {
3972
+ * <tr cdkDrag cdkDragLockAxis="y"
3973
+ * (cdkDragStarted)="d.onStart($event)"
3974
+ * (cdkDragMoved)="d.onMove($event)">
3975
+ *
3976
+ * The scroll container is resolved from the host, so put this on the element
3977
+ * that actually scrolls (or any ancestor of it).
3978
+ */
3979
+ declare class BkTableDrag {
3980
+ private readonly el;
3981
+ /** Distance from an edge, in px, at which auto-scroll kicks in. */
3982
+ private readonly edgeThreshold;
3983
+ /** Fastest scroll step per move event, in px. */
3984
+ private readonly maxScrollSpeed;
3985
+ onStart(event: CdkDragStart): void;
3986
+ onMove(event: CdkDragMove): void;
3987
+ /**
3988
+ * The nearest descendant that actually scrolls. `bk-table` puts the overflow
3989
+ * on an inner container, so the host itself usually isn't the scroller.
3990
+ * Protected so `BkTreeDrag` can position its drop indicator inside it.
3991
+ */
3992
+ protected scrollContainer(): HTMLElement | null;
3993
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkTableDrag, never>;
3994
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BkTableDrag, "[bkTableDrag]", ["bkTableDrag"], {}, {}, never, never, true, never>;
3995
+ }
3996
+
3997
+ /**
3998
+ * The grip a row is dragged by — a reusable handle instead of a glyph copied
3999
+ * into every drag-sort table.
4000
+ *
4001
+ * `hostDirectives: [CdkDragHandle]` puts `cdkDragHandle` on the component's
4002
+ * own host element, so it registers as the drag origin the moment it appears
4003
+ * anywhere inside a `cdkDrag` row — no need to add the CDK directive by hand,
4004
+ * and no requirement about *where* in the row it sits:
4005
+ *
4006
+ * <!-- its own column -->
4007
+ * <td bk-td><bk-drag-handle></bk-drag-handle></td>
4008
+ * <td bk-td>{{ row.name }}</td>
4009
+ *
4010
+ * <!-- inline with the first column, no dedicated column at all -->
4011
+ * <td bk-td><bk-drag-handle></bk-drag-handle> {{ row.name }}</td>
4012
+ *
4013
+ * The icon is a default grip — swap it per table by passing a template:
4014
+ *
4015
+ * <ng-template #bars><svg>…</svg></ng-template>
4016
+ * <bk-drag-handle [icon]="bars"></bk-drag-handle>
4017
+ *
4018
+ * Same shape as `expandIcon` on `td[bk-td]`: a `TemplateRef` input the
4019
+ * component falls back from when it's `null`, rather than a projected slot —
4020
+ * `<ng-content>` has no way to render a default only when nothing was
4021
+ * projected into it.
4022
+ */
4023
+ declare class BkDragHandle {
4024
+ icon: _angular_core.InputSignal<TemplateRef<void> | null>;
4025
+ ariaLabel: _angular_core.InputSignal<string>;
4026
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkDragHandle, never>;
4027
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkDragHandle, "bk-drag-handle", ["bkDragHandle"], { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1$3.CdkDragHandle; inputs: {}; outputs: {}; }]>;
4028
+ }
4029
+
4030
+ /**
4031
+ * How far a drag is allowed to travel through the tree.
4032
+ *
4033
+ * - `'anywhere'` — full re-parenting: before, after or inside any legal target
4034
+ * at any depth. Right for a generic outliner or file explorer, where the
4035
+ * levels carry no meaning of their own.
4036
+ * - `'siblings'` — reorder only, among the dragged node's current siblings.
4037
+ * No re-parenting, no nesting. Right whenever the levels *do* mean
4038
+ * something — an org chart, a category tree, a fixed-depth menu — where an
4039
+ * unrestricted drag lets you build a tree that violates whatever the levels
4040
+ * were supposed to represent. The cycle guard stops a node from swallowing
4041
+ * itself either way, but nothing else stops a leaf from ending up three
4042
+ * levels deep under an unrelated parent unless this is set.
4043
+ */
4044
+ type BkTreeDragScope = 'anywhere' | 'siblings';
4045
+ /**
4046
+ * Tree-aware row dragging: before / after / inside.
4047
+ *
4048
+ * A table flattens the tree into one list of `<tr>` — every row is a sibling
4049
+ * in the same `<tbody>` whatever its depth, so nested `cdkDropList`s have
4050
+ * nothing to nest on. Instead the CDK is kept for what it is good at (the
4051
+ * preview, the placeholder, returning the row on release) with its sorting
4052
+ * turned off, and this directive does the targeting: the pointer's position
4053
+ * within the row under it picks the relationship —
4054
+ *
4055
+ * top third insert BEFORE the target, as a sibling
4056
+ * middle third drop INSIDE the target, as its child
4057
+ * bottom third insert AFTER the target, as a sibling
4058
+ *
4059
+ * — drawn live as a line above, a line below, or a tinted row, so the drop
4060
+ * never lands somewhere the indicator didn't say it would. Illegal targets
4061
+ * (the dragged row itself, anything in its own subtree, anything the `canDrop`
4062
+ * predicate vetoes) simply show no indicator.
4063
+ *
4064
+ * Set `scope="siblings"` to restrict dragging to reordering among the node's
4065
+ * current siblings — no re-parenting, no nesting, and no `inside` zone at all
4066
+ * (see `BkTreeDragScope`). That is the right default whenever the tree's
4067
+ * levels mean something specific; `canDrop` covers anything more particular
4068
+ * than the two built-in scopes.
4069
+ *
4070
+ * The directive never touches the tree. It resolves the drag into one event —
4071
+ * `{ dragged, target, position }` — and the consumer applies it, usually with
4072
+ * `moveBkTreeNode`. Hovering the middle of a row for `expandDelay` emits
4073
+ * `treeExpand` so collapsed branches can be opened mid-drag; acting on it is
4074
+ * likewise the consumer's call.
4075
+ *
4076
+ * <div bkTreeDrag #td="bkTreeDrag" [treeRows]="t.renderData()"
4077
+ * (treeDrop)="onDrop($event)" (treeExpand)="open($event)">
4078
+ * <bk-table #t [data]="rows()">
4079
+ * <tbody cdkDropList [cdkDropListSortingDisabled]="true">
4080
+ * @for (row of t.renderData(); track row.data.id) {
4081
+ * <tr cdkDrag cdkDragLockAxis="y"
4082
+ * (cdkDragStarted)="td.onDragStart($event, row)"
4083
+ * (cdkDragMoved)="td.onDragMove($event)"
4084
+ * (cdkDragEnded)="td.onDragEnd()">
4085
+ *
4086
+ * Sorting stays disabled on the drop list deliberately: with rows shuffling
4087
+ * under the pointer, an open branch's children sit still while their parent
4088
+ * moves. With a static list and an indicator, nothing lies.
4089
+ *
4090
+ * Extends `BkTableDrag`, so the preview keeps its column widths and dragging
4091
+ * near an edge still scrolls the table.
4092
+ */
4093
+ declare class BkTreeDrag<T = any> extends BkTableDrag implements OnDestroy {
4094
+ /**
4095
+ * The flattened rows currently rendered, in render order — the same array
4096
+ * the `<tbody>` iterates. Row *i* of the tbody is entry *i* here; that
4097
+ * index mapping is the whole basis of the hit-testing.
4098
+ */
4099
+ treeRows: _angular_core.InputSignal<readonly BkTreeRow<T>[]>;
4100
+ /** See `BkTreeDragScope`. Defaults to full re-parenting. */
4101
+ scope: _angular_core.InputSignal<BkTreeDragScope>;
4102
+ /**
4103
+ * Consumer veto over and above the built-in guards — e.g. "a person cannot
4104
+ * contain a team". Return false and the indicator never appears.
4105
+ */
4106
+ canDrop: _angular_core.InputSignal<((dragged: BkTreeRow<T>, target: BkTreeRow<T>, position: BkTreeDropPosition) => boolean) | null>;
4107
+ /** How long the pointer rests on a row's middle before `treeExpand` fires. */
4108
+ expandDelay: _angular_core.InputSignal<number>;
4109
+ treeDrop: _angular_core.OutputEmitterRef<BkTreeDropEvent<T>>;
4110
+ treeExpand: _angular_core.OutputEmitterRef<BkTreeRow<T>>;
4111
+ private dragged;
4112
+ private target;
4113
+ private position;
4114
+ private line;
4115
+ private insideRow;
4116
+ private expandTimer;
4117
+ private expandFor;
4118
+ onDragStart(event: CdkDragStart, row: BkTreeRow<T>): void;
4119
+ onDragMove(event: CdkDragMove): void;
4120
+ onDragEnd(): void;
4121
+ ngOnDestroy(): void;
4122
+ /**
4123
+ * Structural legality, before the zone is even known. Dropping a node
4124
+ * anywhere inside its own subtree would detach that branch from the tree
4125
+ * with nothing left pointing at it — walking the parent chain is cheaper
4126
+ * than searching the subtree, and `flattenBkTreeData` already carries it.
4127
+ *
4128
+ * In `'siblings'` scope, the only legal targets are the dragged node's
4129
+ * current siblings — same `parent` reference, root-level nodes included
4130
+ * (`undefined === undefined`). That alone also rules out every cycle: a
4131
+ * node's siblings can never be its own ancestor.
4132
+ */
4133
+ private isLegal;
4134
+ private canDropAt;
4135
+ private setTarget;
4136
+ private drawLine;
4137
+ private clearIndicator;
4138
+ /**
4139
+ * One timer per hovered node: moving within the same row keeps it running,
4140
+ * moving to another row restarts it. The directive only reports the dwell —
4141
+ * whether the node has children to show is the consumer's knowledge.
4142
+ */
4143
+ private armExpandTimer;
4144
+ private clearExpandTimer;
4145
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkTreeDrag<any>, never>;
4146
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BkTreeDrag<any>, "[bkTreeDrag]", ["bkTreeDrag"], { "treeRows": { "alias": "treeRows"; "required": false; "isSignal": true; }; "scope": { "alias": "scope"; "required": false; "isSignal": true; }; "canDrop": { "alias": "canDrop"; "required": false; "isSignal": true; }; "expandDelay": { "alias": "expandDelay"; "required": false; "isSignal": true; }; }, { "treeDrop": "treeDrop"; "treeExpand": "treeExpand"; }, never, never, true, never>;
4147
+ }
4148
+
4149
+ /**
4150
+ * bk-table public surface.
4151
+ *
4152
+ * `BK_TABLE` is the convenience bundle — spread it into a standalone
4153
+ * component's `imports` rather than listing eight symbols by hand:
4154
+ *
4155
+ * imports: [...BK_TABLE]
4156
+ */
4157
+
4158
+ declare const BK_TABLE: readonly [typeof BkTable, typeof BkTableTitle, typeof BkTableFooter, typeof BkVirtualScroll, typeof BkTh, typeof BkTd, typeof BkTrExpand, typeof BkTableSummary, typeof BkTableDrag, typeof BkDragHandle, typeof BkTreeDrag];
4159
+
4160
+ export { BKTooltipDirective, BK_DEFAULT_DIALOG_CONFIG, BK_DIALOG_DATA, BK_DIALOG_GLOBAL_CONFIG, BK_TABLE, BkAvatar, BkAvatarGroup, BkAvatarUploader, BkBadge, BkBreadcrumb, BkButton, BkButtonGroup, BkCalendarManagerService, BkCheckbox, BkColumnFilterService, BkColumnSelect, BkCustomCalendar, BkDialogActions, BkDialogClose, BkDialogContent, BkDialogModule, BkDialogRef, BkDialogService, BkDialogTitle, BkDragHandle, BkDropdown, BkFileCard, BkFilePicker, BkGrid, BkHierarchicalSelect, BkIconButton, BkInput, BkInputChips, BkLoader, BkMenu, BkPagination, BkPill, BkPopover, BkRadioButton, BkScheduledDatePicker, BkSelect, BkSpinner, BkTable, BkTableDrag, BkTableFooter, BkTableSummary, BkTableTitle, BkTabs, BkTd, BkTextarea, BkTh, BkTimePicker, BkToastr, BkToastrService, BkToggle, BkTrExpand, BkTreeDrag, BkValidator, BkVirtualScroll, BrickclayIcons, BrickclayLib, CalendarModule, CalendarSelection, ColumnFilterOption, NEUTRAL_APPEARANCE, POPOVER_PLACEMENTS, computePopoverPosition, containsBkTreeNode, deriveAppearance, flattenBkTreeData, getDialogBackdropAnimation, getDialogPanelAnimation, joinPlacement, moveBkTreeNode, normalizeBkTableSize, parseColor, splitPlacement };
4161
+ export type { AvatarFallback, AvatarGroupItem, AvatarSize, AvatarVariant, BadgeColor, BadgeSize, BadgeVariant, BkAnimationKeyframes, BkAvatarFallback, BkAvatarSize, BkCellAlign, BkColumnRef, BkColumnSelectPosition, BkDialogAnimation, BkDialogConfig, BkDialogPosition, BkFilterFn, BkFilterOption, BkInputAutoCapitalize, BkInputAutoComplete, BkInputMode, BkInputSize, BkInputType, BkLoaderVariant, BkPageSize, BkPageSizeVisibility, BkSortDirection, BkSortFn, BkSortOrder, BkTableNoResult, BkTableQueryParams, BkTableScroll, BkTableSelection, BkTableSize, BkTableSizeToken, BkTextAreaAutoCapitalize, BkTextAreaAutoComplete, BkTextAreaInputMode, BkTreeDragScope, BkTreeDropEvent, BkTreeDropPosition, BkTreeRow, BreadcrumbItem, ButtonSize, ButtonVariant, CalendarRange, ColorAppearance, ColorFill, CountryOption, CustomRangesConfig, DotPosition, DotStatus, DropdownItem, DropdownPlacement, DropdownSize, DropdownTrigger, DropdownVariant, FileState, GroupItem, GroupMode, HierarchicalNode, IconButtonSize, IconButtonVariant, IconOrientation, MenuItem, MenuOrientation, MenuPopupSide, MenuSize, MenuSubmenuMode, MenuTrigger, PillColor, PillSize, PillVariant, PopoverAlign, PopoverPlacement, PopoverPosition, PopoverPositionOptions, PopoverSide, Rect, ScheduledDateSelection, Size, SortDirection, SpinnerSize, TabIconDirection, TabItem, TableAction, TableBadge, TableColumn, TableIcon, TableRows, TabsColors, TabsOrientation, TabsVariant, TimeConfiguration, ToastConfig, ToastMessage, ToastMethodOptions, ToastPosition, ToastSeverity };