@koobiq/components 20.0.0 → 20.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/accordion/accordion-trigger.component.scss +0 -18
  2. package/accordion/accordion.component.scss +9 -2
  3. package/actions-panel/index.d.ts +1 -0
  4. package/alert/_alert-theme.scss +0 -4
  5. package/alert/alert-tokens.scss +4 -4
  6. package/app-switcher/app-switcher-dropdown-app.scss +2 -0
  7. package/breadcrumbs/breadcrumbs.scss +4 -0
  8. package/breadcrumbs/index.d.ts +2 -1
  9. package/button/button-group.scss +42 -2
  10. package/button-toggle/button-toggle.scss +23 -0
  11. package/button-toggle/index.d.ts +3 -1
  12. package/checkbox/checkbox.scss +5 -4
  13. package/clamped-text/index.d.ts +1 -0
  14. package/core/index.d.ts +402 -13
  15. package/core/styles/common/_animation.scss +4 -0
  16. package/core/styles/theming/_components-theming.scss +1 -1
  17. package/core/styles/theming/_scrollbar-theme.scss +4 -0
  18. package/datepicker/_datepicker-theme.scss +1 -1
  19. package/datepicker/datepicker-toggle.scss +3 -3
  20. package/dl/index.d.ts +1 -0
  21. package/dropdown/dropdown.scss +2 -2
  22. package/fesm2022/koobiq-components-accordion.mjs +4 -4
  23. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  24. package/fesm2022/koobiq-components-actions-panel.mjs +14 -5
  25. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  26. package/fesm2022/koobiq-components-alert.mjs +2 -2
  27. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  28. package/fesm2022/koobiq-components-app-switcher.mjs +6 -6
  29. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  30. package/fesm2022/koobiq-components-breadcrumbs.mjs +6 -4
  31. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  32. package/fesm2022/koobiq-components-button-toggle.mjs +9 -6
  33. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  34. package/fesm2022/koobiq-components-button.mjs +4 -4
  35. package/fesm2022/koobiq-components-button.mjs.map +1 -1
  36. package/fesm2022/koobiq-components-checkbox.mjs +2 -2
  37. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  38. package/fesm2022/koobiq-components-clamped-text.mjs +4 -0
  39. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
  40. package/fesm2022/koobiq-components-code-block.mjs +4 -0
  41. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  42. package/fesm2022/koobiq-components-core.mjs +449 -112
  43. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  44. package/fesm2022/koobiq-components-datepicker.mjs +5 -5
  45. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  46. package/fesm2022/koobiq-components-dl.mjs +3 -2
  47. package/fesm2022/koobiq-components-dl.mjs.map +1 -1
  48. package/fesm2022/koobiq-components-dropdown.mjs +8 -13
  49. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  50. package/fesm2022/koobiq-components-file-upload.mjs +33 -22
  51. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  52. package/fesm2022/koobiq-components-filter-bar.mjs +974 -758
  53. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  54. package/fesm2022/koobiq-components-flag.mjs +66 -0
  55. package/fesm2022/koobiq-components-flag.mjs.map +1 -0
  56. package/fesm2022/koobiq-components-form-field.mjs +2 -2
  57. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  58. package/fesm2022/koobiq-components-icon.mjs +2 -2
  59. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  60. package/fesm2022/koobiq-components-inline-edit.mjs +27 -6
  61. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  62. package/fesm2022/koobiq-components-list.mjs +39 -20
  63. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  64. package/fesm2022/koobiq-components-loader-overlay.mjs +2 -2
  65. package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
  66. package/fesm2022/koobiq-components-modal.mjs +9 -5
  67. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  68. package/fesm2022/koobiq-components-navbar.mjs +10 -9
  69. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  70. package/fesm2022/koobiq-components-notification-center.mjs +178 -19
  71. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  72. package/fesm2022/koobiq-components-overflow-items.mjs +12 -4
  73. package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
  74. package/fesm2022/koobiq-components-popover.mjs +4 -4
  75. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  76. package/fesm2022/koobiq-components-progress-bar.mjs +2 -2
  77. package/fesm2022/koobiq-components-progress-bar.mjs.map +1 -1
  78. package/fesm2022/koobiq-components-progress-spinner.mjs +2 -2
  79. package/fesm2022/koobiq-components-progress-spinner.mjs.map +1 -1
  80. package/fesm2022/koobiq-components-radio.mjs +3 -7
  81. package/fesm2022/koobiq-components-radio.mjs.map +1 -1
  82. package/fesm2022/koobiq-components-select.mjs +38 -16
  83. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  84. package/fesm2022/koobiq-components-sidebar.mjs +4 -0
  85. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  86. package/fesm2022/koobiq-components-sidepanel.mjs +3 -3
  87. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  88. package/fesm2022/koobiq-components-skeleton.mjs +2 -2
  89. package/fesm2022/koobiq-components-skeleton.mjs.map +1 -1
  90. package/fesm2022/koobiq-components-split-button.mjs +2 -2
  91. package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
  92. package/fesm2022/koobiq-components-splitter.mjs +6 -2
  93. package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
  94. package/fesm2022/koobiq-components-table.mjs +8 -6
  95. package/fesm2022/koobiq-components-table.mjs.map +1 -1
  96. package/fesm2022/koobiq-components-tabs.mjs +19 -7
  97. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  98. package/fesm2022/koobiq-components-tags.mjs +7 -0
  99. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  100. package/fesm2022/koobiq-components-textarea.mjs +7 -14
  101. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  102. package/fesm2022/koobiq-components-time-range.mjs +4 -4
  103. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  104. package/fesm2022/koobiq-components-timezone.mjs +6 -0
  105. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  106. package/fesm2022/koobiq-components-title.mjs +132 -14
  107. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  108. package/fesm2022/koobiq-components-toast.mjs +1 -1
  109. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  110. package/fesm2022/koobiq-components-toggle.mjs +2 -2
  111. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  112. package/fesm2022/koobiq-components-tooltip.mjs +50 -2
  113. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  114. package/fesm2022/koobiq-components-tree-select.mjs +44 -11
  115. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  116. package/fesm2022/koobiq-components-tree.mjs +67 -41
  117. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  118. package/fesm2022/koobiq-components-username.mjs +16 -3
  119. package/fesm2022/koobiq-components-username.mjs.map +1 -1
  120. package/file-upload/file-upload-tokens.scss +1 -0
  121. package/file-upload/index.d.ts +10 -7
  122. package/filter-bar/_filter-bar-theme.scss +86 -0
  123. package/filter-bar/filter-bar-tokens.scss +6 -0
  124. package/filter-bar/filter-bar.scss +10 -4
  125. package/filter-bar/filter-refresher.scss +1 -1
  126. package/filter-bar/filters.scss +23 -19
  127. package/filter-bar/index.d.ts +707 -338
  128. package/filter-bar/pipes/base-pipe.scss +14 -35
  129. package/filter-bar/pipes/pipe-date.scss +20 -14
  130. package/filter-bar/pipes/pipe-multi-tree-select.scss +5 -3
  131. package/filter-bar/pipes/pipe-multiselect.scss +5 -3
  132. package/filter-bar/pipes/pipe-readonly.scss +4 -13
  133. package/filter-bar/pipes/pipe-select.scss +3 -1
  134. package/filter-bar/pipes/pipe-tree-select.scss +3 -1
  135. package/flag/flag.scss +53 -0
  136. package/flag/index.d.ts +44 -0
  137. package/icon/icon-item-tokens.scss +1 -1
  138. package/inline-edit/index.d.ts +5 -0
  139. package/inline-edit/inline-edit.scss +7 -7
  140. package/link/link-tokens.scss +2 -2
  141. package/list/index.d.ts +11 -2
  142. package/loader-overlay/loader-overlay-tokens.scss +1 -1
  143. package/modal/_modal-animation.scss +6 -6
  144. package/modal/_modal-theme.scss +5 -0
  145. package/modal/index.d.ts +3 -1
  146. package/modal/modal.scss +15 -0
  147. package/navbar/index.d.ts +1 -0
  148. package/navbar/navbar-item.scss +9 -0
  149. package/notification-center/_notification-center-theme.scss +2 -1
  150. package/notification-center/index.d.ts +88 -3
  151. package/notification-center/notification-center.scss +42 -4
  152. package/notification-center/notification-item.scss +3 -2
  153. package/overflow-items/index.d.ts +1 -0
  154. package/package.json +7 -3
  155. package/prebuilt-themes/dark-theme.css +1 -1
  156. package/prebuilt-themes/light-theme.css +1 -1
  157. package/prebuilt-themes/theme.css +1 -1
  158. package/progress-bar/progress-bar.scss +4 -0
  159. package/progress-spinner/progress-spinner.scss +5 -1
  160. package/radio/index.d.ts +1 -5
  161. package/radio/radio.scss +18 -4
  162. package/schematics/collection.json +5 -0
  163. package/schematics/migrations/filter-bar-signals/README.md +66 -0
  164. package/schematics/migrations/filter-bar-signals/data.js +72 -0
  165. package/schematics/migrations/filter-bar-signals/index.js +316 -0
  166. package/schematics/migrations/filter-bar-signals/schema.json +20 -0
  167. package/schematics/migrations.json +5 -0
  168. package/schematics/ng-add/index.js +1 -1
  169. package/select/index.d.ts +10 -2
  170. package/sidebar/index.d.ts +1 -0
  171. package/skeleton/skeleton.scss +4 -0
  172. package/split-button/_split-button-theme.scss +2 -2
  173. package/splitter/_splitter-theme.scss +2 -2
  174. package/splitter/index.d.ts +1 -0
  175. package/table/_table-theme.scss +4 -0
  176. package/table/index.d.ts +3 -2
  177. package/tabs/index.d.ts +2 -0
  178. package/tabs/tab-header.scss +1 -0
  179. package/tabs/tabs-tokens.scss +1 -1
  180. package/textarea/index.d.ts +0 -1
  181. package/time-range/time-range.scss +0 -8
  182. package/timepicker/timepicker.scss +2 -2
  183. package/timezone/index.d.ts +1 -0
  184. package/title/index.d.ts +92 -2
  185. package/tooltip/index.d.ts +51 -3
  186. package/tree/_tree-theme.scss +2 -7
  187. package/tree/index.d.ts +19 -4
  188. package/tree/toggle.scss +5 -0
  189. package/tree/tree-option.scss +0 -4
  190. package/tree-select/_tree-select-theme.scss +1 -1
  191. package/tree-select/index.d.ts +9 -2
  192. package/username/index.d.ts +20 -2
package/table/index.d.ts CHANGED
@@ -4,9 +4,10 @@ import * as i1 from '@angular/cdk/a11y';
4
4
  import * as i2 from '@angular/cdk/platform';
5
5
 
6
6
  declare class KbqTable {
7
- readonly border: i0.InputSignal<boolean>;
7
+ readonly border: i0.InputSignalWithTransform<boolean, unknown>;
8
+ readonly disableHover: i0.InputSignalWithTransform<boolean, unknown>;
8
9
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqTable, never>;
9
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqTable, "table[kbq-table]", ["kbqTable"], { "border": { "alias": "border"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
10
+ static ɵcmp: i0.ɵɵComponentDeclaration<KbqTable, "table[kbq-table]", ["kbqTable"], { "border": { "alias": "border"; "required": false; "isSignal": true; }; "disableHover": { "alias": "disableHover"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
10
11
  }
11
12
  declare class KbqTableCellContent {
12
13
  readonly button: i0.Signal<KbqButton | undefined>;
package/tabs/index.d.ts CHANGED
@@ -408,6 +408,7 @@ declare class KbqTabHeader extends KbqPaginatedTabHeader {
408
408
  readonly tabList: ElementRef;
409
409
  readonly nextPaginator: ElementRef<HTMLElement>;
410
410
  readonly previousPaginator: ElementRef<HTMLElement>;
411
+ private readonly isBrowser;
411
412
  /** Width of the active tab, adjusted for icon-only tab margins. */
412
413
  protected get activeTabOffsetWidth(): number | undefined;
413
414
  /** Left offset of the active tab, adjusted for icon-only tab margins. */
@@ -554,6 +555,7 @@ declare class KbqTabNavBar extends KbqPaginatedTabHeader implements AfterContent
554
555
  readonly nextPaginator: ElementRef<HTMLElement>;
555
556
  readonly previousPaginator: ElementRef<HTMLElement>;
556
557
  readonly items: QueryList<KbqTabLink>;
558
+ private readonly isBrowser;
557
559
  /** Whether the nav bar background should be transparent. */
558
560
  readonly transparent: i0.InputSignalWithTransform<boolean, unknown>;
559
561
  readonly onSurface: i0.InputSignalWithTransform<boolean, unknown>;
@@ -8,6 +8,7 @@
8
8
  overflow: hidden;
9
9
  position: relative;
10
10
  flex-shrink: 0;
11
+ border-radius: var(--kbq-tabs-size-tab-stack-horizontal-border-radius);
11
12
  }
12
13
 
13
14
  .kbq-tab-list__content {
@@ -5,7 +5,7 @@
5
5
  --kbq-tabs-size-tab-item-content-gap-horizontal: var(--kbq-size-xxs);
6
6
  --kbq-tabs-size-tab-item-border-radius: var(--kbq-size-s);
7
7
  --kbq-tabs-size-tab-item-focus-outline-width: var(--kbq-size-3xs);
8
- --kbq-tabs-size-tab-stack-horizontal-border-radius: var(--kbq-size-s);
8
+ --kbq-tabs-size-tab-stack-horizontal-border-radius: var(--kbq-size-border-radius);
9
9
  --kbq-tabs-size-tab-stack-vertical-content-gap-vertical: var(--kbq-size-s);
10
10
  /* THEME TOKENS */
11
11
  --kbq-tabs-tab-item-filled-on-background-default-background: transparent;
@@ -88,7 +88,6 @@ declare class KbqTextarea implements KbqFormFieldControl<any>, OnInit, OnChanges
88
88
  private _id;
89
89
  private _required;
90
90
  private valueAccessor;
91
- private growSubscription;
92
91
  private lineHeight;
93
92
  private minHeight;
94
93
  private rowsCount;
@@ -33,14 +33,6 @@
33
33
  flex-direction: column;
34
34
  gap: var(--kbq-size-s);
35
35
 
36
- .kbq-time-range-editor__predefined {
37
- column-count: 2;
38
-
39
- .kbq-time-range-editor__predefined-option {
40
- display: block;
41
- }
42
- }
43
-
44
36
  .kbq-time-range-editor__date-time {
45
37
  display: flex;
46
38
  flex-direction: row;
@@ -1,8 +1,8 @@
1
1
  @use '../core/styles/common/tokens' as *;
2
2
 
3
3
  .kbq-timepicker {
4
- // FIXME: default token doesn't exist
5
- padding-right: var(--kbq-timepicker-size-padding-right);
4
+ // @TODO define --kbq-timepicker-size-padding-right in design-tokens; fallback keeps spacing meanwhile
5
+ padding-right: var(--kbq-timepicker-size-padding-right, var(--kbq-size-s));
6
6
  }
7
7
 
8
8
  .kbq-form-field-type-timepicker {
@@ -48,6 +48,7 @@ declare class KbqTimezoneOptionTooltip extends KbqTooltipTrigger implements Afte
48
48
  private readonly changeDetectorRef;
49
49
  private readonly resizeObserver;
50
50
  private readonly contentObserver;
51
+ private readonly platform;
51
52
  private readonly debounceInterval;
52
53
  private resizeSubscription;
53
54
  private contentObserverSubscription;
package/title/index.d.ts CHANGED
@@ -1,35 +1,125 @@
1
1
  import * as i0 from '@angular/core';
2
- import { AfterViewInit, OnDestroy } from '@angular/core';
2
+ import { AfterViewInit, OnDestroy, TemplateRef } from '@angular/core';
3
3
  import * as i1 from '@koobiq/components/tooltip';
4
4
  import { KbqTooltipTrigger } from '@koobiq/components/tooltip';
5
5
  import { Subject } from 'rxjs';
6
6
 
7
+ /**
8
+ * Shows a tooltip with the full text of the host element, but only when that text is truncated —
9
+ * i.e. it overflows horizontally, or vertically when clamped to several lines. The tooltip opens on
10
+ * hover and on keyboard focus, and hides on blur, mouse leave, or window resize.
11
+ *
12
+ * By default, the tooltip content is the trimmed `textContent` of the host. Provide explicit content
13
+ * with `[kbq-title]="stringOrTemplateRef"`. For nested markup, mark the measured container with the
14
+ * `#kbqTitleContainer` template reference and the text element(s) with `#kbqTitleText`; several
15
+ * `#kbqTitleText` elements are supported and the tooltip is shown when any of them overflows.
16
+ *
17
+ * Host components that provide `KBQ_TITLE_TEXT_REF` (e.g. `KbqOption`) supply the text and parent
18
+ * elements automatically, so the directive works without explicit template references.
19
+ */
7
20
  declare class KbqTitleDirective extends KbqTooltipTrigger implements AfterViewInit, OnDestroy {
21
+ /** Optional host component that exposes the measured text/parent elements via `KBQ_TITLE_TEXT_REF`. */
8
22
  private componentInstance;
23
+ /** Host native element the directive is attached to. */
9
24
  private readonly nativeElement;
25
+ /** SSR-safe window reference used for `getComputedStyle` reads. */
26
+ private readonly window;
27
+ /** Observes host content mutations to re-evaluate overflow and refresh the resolved tooltip content. */
10
28
  private contentObserver;
29
+ /**
30
+ * Optional explicit tooltip content. Accepts a `TemplateRef` (rendered as rich tooltip content) or a string.
31
+ * When omitted (a bare `kbq-title` attribute resolves to an empty string), the directive falls back to the
32
+ * trimmed `textContent` of the host (`viewValue`), preserving the default behavior.
33
+ */
34
+ readonly titleContent: i0.InputSignal<string | TemplateRef<any>>;
11
35
  set trigger(value: string);
36
+ /**
37
+ * The pop-up trigger. Always reports `PopUpTriggers.Hover`, so the title tooltip reacts to hover and
38
+ * keyboard focus regardless of the assigned value. The setter is kept only as a no-op workaround so a
39
+ * host that also uses a popover can assign a trigger without breaking `kbq-title`.
40
+ */
12
41
  get trigger(): string;
42
+ /**
43
+ * Whether the host content is clipped and therefore needs a tooltip. Returns `true` if any measured
44
+ * text element overflows the parent — covering multiple `#kbqTitleText` elements, the sub-pixel
45
+ * special case, and both horizontal and vertical overflow.
46
+ */
13
47
  get isOverflown(): boolean;
48
+ /** Whether the text is clipped horizontally: the parent `offsetWidth` is smaller than the child `scrollWidth`. */
14
49
  get isHorizontalOverflown(): boolean;
50
+ /** Whether the text is clipped vertically: the parent `offsetHeight` is smaller than the child `scrollHeight`. */
15
51
  get isVerticalOverflown(): boolean;
52
+ /**
53
+ * Compares measured widths, treating only *visible* clipping as overflow. With `text-overflow: ellipsis`
54
+ * any positive difference counts (even a sub-pixel overflow shows `…`). With `text-overflow: clip` the
55
+ * widths are rounded to whole CSS pixels first — mirroring the integer `offsetWidth`/`scrollWidth` path —
56
+ * so an imperceptible sub-pixel clip is not treated as truncation.
57
+ * @docs-private */
58
+ private isWidthOverflown;
59
+ /** Trimmed `textContent` of the measured parent, used as the default tooltip content. */
16
60
  get viewValue(): string;
61
+ /**
62
+ * Measured container element. Resolved as the projected `#kbqTitleContainer`, otherwise the
63
+ * `KBQ_TITLE_TEXT_REF` host's `parentTextElement`, otherwise the host element itself.
64
+ * @docs-private */
17
65
  get parent(): HTMLElement;
66
+ /** First effective text element used for overflow detection (the first entry of `childElements`).
67
+ * @docs-private */
18
68
  get child(): HTMLElement;
69
+ /** Whether the host element contains exactly one child node and that node is a text node. */
19
70
  get hasOnlyText(): boolean;
71
+ /**
72
+ * Whether the measured text truncates with an ellipsis on either the child text element or its
73
+ * wrapping container. Only then is a sub-pixel overflow actually visible (the trailing glyph is
74
+ * replaced by `…`); with the default `text-overflow: clip` a sub-pixel clip is imperceptible, so
75
+ * it must not be reported as truncation. Both elements are checked because `text-overflow` is not
76
+ * inherited and consumers place it differently: `KbqOption`/`KbqDropdownItem` style the measured
77
+ * `child`, whereas `KbqTreeOption` styles the `parent` container that wraps the child.
78
+ * @docs-private */
79
+ private get hasEllipsis();
80
+ /** Whether the element's computed `text-overflow` renders an ellipsis.
81
+ * @docs-private */
82
+ private elementHasEllipsis;
83
+ /**
84
+ * Effective text elements used for overflow detection. Resolves to the projected `#kbqTitleText` elements,
85
+ * otherwise falls back to the `KbqTitleTextRef` host's `textElement`, otherwise to the host element itself.
86
+ * Always contains at least one element.
87
+ * @docs-private */
88
+ private get childElements();
89
+ /** Resolved tooltip content: the explicit `titleContent` input when provided, otherwise the host text.
90
+ * @docs-private */
91
+ private get resolvedContent();
92
+ /** Emits `window:resize` events; subscribed to re-evaluate overflow after the viewport changes.
93
+ * @docs-private */
20
94
  readonly resizeStream: Subject<Event>;
95
+ /** Debounce/throttle interval (ms) applied to the resize and content-observer streams. */
21
96
  private readonly debounceInterval;
97
+ /** Subscription to `resizeStream`, torn down in `ngOnDestroy`. */
22
98
  private resizeSubscription;
99
+ /** Subscription to the content observer, torn down in `ngOnDestroy`. */
23
100
  private contentObserverSubscription;
101
+ /** Subscription to the focus monitor, torn down in `ngOnDestroy`. */
24
102
  private focusMonitorSubscription;
103
+ /** Projected text elements marked with the `#kbqTitleText` template reference. */
25
104
  private childContainer;
105
+ /** Projected container element marked with the `#kbqTitleContainer` template reference. */
26
106
  private parentContainer;
107
+ /**
108
+ * Sets the initial tooltip content and wires the streams that toggle the tooltip's `disabled` state:
109
+ * window resize and content mutations re-evaluate overflow, and keyboard focus opens the tooltip
110
+ * while other focus origins hide it.
111
+ */
27
112
  ngAfterViewInit(): void;
113
+ /** Unsubscribes from the resize, content-observer and focus-monitor streams and stops focus monitoring. */
28
114
  ngOnDestroy(): void;
115
+ /** Enables the tooltip only when the content is overflown. Bound to `mouseenter` and keyboard focus.
116
+ * @docs-private */
29
117
  handleElementEnter(): void;
118
+ /** Always disables (hides) the tooltip. Bound to `mouseleave` and non-keyboard focus changes.
119
+ * @docs-private */
30
120
  hideTooltip(): void;
31
121
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqTitleDirective, never>;
32
- static ɵdir: i0.ɵɵDirectiveDeclaration<KbqTitleDirective, "[kbq-title]", ["kbqTitle"], {}, {}, ["childContainer", "parentContainer"], never, true, never>;
122
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KbqTitleDirective, "[kbq-title]", ["kbqTitle"], { "titleContent": { "alias": "kbq-title"; "required": false; "isSignal": true; }; }, {}, ["parentContainer", "childContainer"], never, true, never>;
33
123
  }
34
124
 
35
125
  declare class KbqTitleModule {
@@ -43,9 +43,17 @@ declare const KBQ_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER: {
43
43
  deps: (typeof Overlay)[];
44
44
  useFactory: typeof kbqTooltipScrollStrategyFactory;
45
45
  };
46
+ /**
47
+ * Trigger directive that shows a `KbqTooltipComponent` for its host element. Extends `KbqPopUpTrigger` with
48
+ * tooltip-specific inputs (content, placement, color, arrow, enter/leave delays, modifier and header) and
49
+ * behavior such as opening on keyboard focus only and positioning relative to the mouse cursor.
50
+ */
46
51
  declare class KbqTooltipTrigger extends KbqPopUpTrigger<KbqTooltipComponent> implements AfterViewInit, OnChanges, OnDestroy {
52
+ /** @docs-private */
47
53
  protected scrollStrategy: () => ScrollStrategy;
54
+ /** @docs-private */
48
55
  protected parentPopup: KbqParentPopup | null;
56
+ /** @docs-private */
49
57
  protected focusMonitor: FocusMonitor;
50
58
  /** @docs-private */
51
59
  protected renderer: Renderer2;
@@ -70,40 +78,61 @@ declare class KbqTooltipTrigger extends KbqPopUpTrigger<KbqTooltipComponent> imp
70
78
  * to tooltip.
71
79
  */
72
80
  hideWithTimeout: boolean;
81
+ /** Input (`kbqVisible`) that programmatically shows or hides the tooltip; reflects the current `visible` state. */
73
82
  get tooltipVisible(): boolean;
74
83
  set tooltipVisible(value: boolean);
84
+ /** Input (`kbqPlacement`) that sets the tooltip placement relative to its trigger; reflects the current `placement`. */
75
85
  get tooltipPlacement(): KbqPopUpPlacementValues;
86
+ set tooltipPlacement(value: KbqPopUpPlacementValues);
76
87
  /**
77
88
  * Positions the tooltip relative to the mouse cursor. Only available for top and bottom kbqPlacement.
78
89
  * Does not work with kbqPlacementPriority.
79
90
  */
80
91
  relativeToPointer: boolean;
81
- set tooltipPlacement(value: KbqPopUpPlacementValues);
92
+ /** Input (`kbqPlacementPriority`) that sets the ordered fallback placements; reflects the current `placementPriority`. */
82
93
  get tooltipPlacementPriority(): string | string[] | null;
83
94
  set tooltipPlacementPriority(value: string | string[] | null);
95
+ /** Input (`kbqTooltip`) with the tooltip content — a string or a template. Updating it refreshes an open tooltip. */
84
96
  get content(): string | TemplateRef<any>;
85
97
  set content(content: string | TemplateRef<any>);
98
+ /** Input (`kbqTooltipDisabled`) controlling whether the tooltip is disabled; setting it to `true` hides it. */
86
99
  get disabled(): boolean;
87
100
  set disabled(value: boolean);
101
+ /** Input (`kbqEnterDelay`) — delay in milliseconds before the tooltip is shown. Defaults to `400`. */
88
102
  enterDelay: number;
103
+ /** Input (`kbqLeaveDelay`) — delay in milliseconds before the tooltip is hidden. Defaults to `0`. */
89
104
  leaveDelay: number;
105
+ /** Input (`kbqTrigger`) with the comma-separated trigger events. An empty value resets to hover + focus and rebinds listeners. */
90
106
  get trigger(): string;
91
107
  set trigger(value: string);
108
+ /** Backing field for `trigger`; defaults to hover + focus. */
92
109
  protected _trigger: string;
110
+ /** Input (`kbqTooltipClass`) with an extra CSS class applied to the tooltip; updating it refreshes the class map. */
93
111
  get customClass(): string;
94
112
  set customClass(value: string);
113
+ /** Input (`kbqTooltipContext`) with the context object passed to a template tooltip; updating it refreshes the open tooltip. */
95
114
  get context(): any;
96
115
  set context(ctx: any);
116
+ /** Backing field for `context`. */
97
117
  private _context;
118
+ /** Input (`kbqTooltipColor`) with the tooltip color theme; the getter returns the `kbq-`-prefixed CSS class. */
98
119
  get color(): string;
99
120
  set color(value: KbqComponentColors | string);
121
+ /** Backing field for `color`; defaults to `KbqComponentColors.Contrast`. */
100
122
  private _color;
123
+ /** Input (`kbqTooltipArrow`) — whether to render the tooltip's arrow/pointer. Defaults to `false`. */
101
124
  arrow: boolean;
125
+ /** Input (`kbqTooltipOffset`) — distance in pixels between the tooltip and its trigger; `null` uses the default. */
102
126
  offset: number | null;
127
+ /** Output (`kbqPlacementChange`) that emits the new placement whenever the tooltip repositions. */
103
128
  readonly placementChange: EventEmitter<any>;
129
+ /** Output (`kbqVisibleChange`) that emits when the tooltip's visibility changes. */
104
130
  readonly visibleChange: EventEmitter<boolean>;
131
+ /** Whether the configured trigger list includes the `click` trigger. */
105
132
  private get hasClickInTrigger();
133
+ /** @docs-private */
106
134
  protected originSelector: string;
135
+ /** @docs-private */
107
136
  protected overlayConfig: OverlayConfig;
108
137
  /**
109
138
  * Visual variant of the tooltip. Accepts `'default'` | `'warning'` | `'extended'`.
@@ -126,11 +155,25 @@ declare class KbqTooltipTrigger extends KbqPopUpTrigger<KbqTooltipComponent> imp
126
155
  * the next show/hide cycle.
127
156
  */
128
157
  ngOnChanges(changes: SimpleChanges): void;
158
+ /**
159
+ * Sets up an effect that mirrors a `forDisabledComponent`'s disabled signal: when that component is disabled it
160
+ * makes the host focusable (so the tooltip can still be triggered) and enables the tooltip, otherwise disables it.
161
+ */
129
162
  constructor();
163
+ /**
164
+ * Hides the tooltip when a parent pop-up closes, starts focus monitoring on the host, and—when
165
+ * `ignoreTooltipPointerEvents` is set—adds the panel class that makes the tooltip ignore pointer events.
166
+ */
130
167
  ngAfterViewInit(): void;
168
+ /** Stops focus monitoring on the host element and runs the base-class teardown. */
131
169
  ngOnDestroy(): void;
170
+ /**
171
+ * Shows the tooltip after `delay` ms. Suppresses showing on a focus trigger that did not originate from
172
+ * the keyboard, and applies cursor-relative positioning when `relativeToPointer` is enabled.
173
+ */
132
174
  show(delay?: number): void;
133
- /** method allows to show the tooltip relative to the given mouse event. */
175
+ /** method allows to show the tooltip relative to the given mouse event.
176
+ * @docs-private */
134
177
  showForMouseEvent(event: MouseEvent): void;
135
178
  /**
136
179
  * method allows to show the tooltip relative to the element
@@ -139,12 +182,17 @@ declare class KbqTooltipTrigger extends KbqPopUpTrigger<KbqTooltipComponent> imp
139
182
  * For example:
140
183
  * const tooltip = new KbqTooltipTrigger();
141
184
  * tooltip.showForElement(element);
142
- */
185
+ * @docs-private */
143
186
  showForElement(element: HTMLElement): void;
187
+ /** @docs-private */
144
188
  updateData(): void;
189
+ /** @docs-private */
145
190
  closingActions(): rxjs.Observable<void | MouseEvent>;
191
+ /** @docs-private */
146
192
  getOverlayHandleComponentType(): Type<KbqTooltipComponent>;
193
+ /** @docs-private */
147
194
  updateClassMap(newPlacement?: string): void;
195
+ /** @docs-private */
148
196
  protected applyRelativeToPointer(): void;
149
197
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqTooltipTrigger, never>;
150
198
  static ɵdir: i0.ɵɵDirectiveDeclaration<KbqTooltipTrigger, "[kbqTooltip]", ["kbqTooltip"], { "forDisabledComponent": { "alias": "forDisabledComponent"; "required": false; "isSignal": true; }; "ignoreTooltipPointerEvents": { "alias": "ignoreTooltipPointerEvents"; "required": false; "isSignal": true; }; "hideWithTimeout": { "alias": "hideWithTimeout"; "required": false; }; "tooltipVisible": { "alias": "kbqVisible"; "required": false; }; "tooltipPlacement": { "alias": "kbqPlacement"; "required": false; }; "relativeToPointer": { "alias": "kbqRelativeToPointer"; "required": false; }; "tooltipPlacementPriority": { "alias": "kbqPlacementPriority"; "required": false; }; "content": { "alias": "kbqTooltip"; "required": false; }; "disabled": { "alias": "kbqTooltipDisabled"; "required": false; }; "enterDelay": { "alias": "kbqEnterDelay"; "required": false; }; "leaveDelay": { "alias": "kbqLeaveDelay"; "required": false; }; "trigger": { "alias": "kbqTrigger"; "required": false; }; "customClass": { "alias": "kbqTooltipClass"; "required": false; }; "context": { "alias": "kbqTooltipContext"; "required": false; }; "color": { "alias": "kbqTooltipColor"; "required": false; }; "arrow": { "alias": "kbqTooltipArrow"; "required": false; }; "offset": { "alias": "kbqTooltipOffset"; "required": false; }; "modifier": { "alias": "kbqTooltipModifier"; "required": false; }; "header": { "alias": "kbqTooltipHeader"; "required": false; }; }, { "placementChange": "kbqPlacementChange"; "visibleChange": "kbqVisibleChange"; }, never, never, true, never>;
@@ -11,11 +11,6 @@
11
11
  color: var(--kbq-tree-#{$state-name}-text-color);
12
12
  }
13
13
 
14
- .kbq-tree-node-toggle .kbq-icon.kbq-empty,
15
- .kbq-icon.kbq-empty.kbq-tree-node-toggle {
16
- color: var(--kbq-tree-#{$state-name}-tree-toggle-color);
17
- }
18
-
19
14
  .kbq-option-action .kbq-icon.kbq-empty {
20
15
  color: var(--kbq-tree-#{$state-name}-action-button-color);
21
16
  }
@@ -69,7 +64,7 @@
69
64
  &.kbq-disabled {
70
65
  @include kbq-tree-option(states-disabled);
71
66
 
72
- & .kbq-icon.kbq-empty {
67
+ & .kbq-icon.kbq-empty:not(.kbq-tree-node-toggle .kbq-icon) {
73
68
  color: var(--kbq-states-icon-disabled);
74
69
  }
75
70
  }
@@ -91,7 +86,7 @@
91
86
  @include kbq-typography-level-to-styles-css-variables(typography, text-normal);
92
87
  }
93
88
 
94
- .kbq-tree-option-caption {
89
+ .kbq-option-caption {
95
90
  @include kbq-typography-level-to-styles-css-variables(typography, text-compact);
96
91
  }
97
92
  }
package/tree/index.d.ts CHANGED
@@ -605,9 +605,15 @@ declare class KbqTreeSelection extends KbqTreeBase<any> implements ControlValueA
605
605
  private elementRef;
606
606
  private scheduler;
607
607
  private clipboard;
608
+ private readonly platform;
608
609
  protected readonly focusMonitor: FocusMonitor;
609
- /** Indicates whether this component is placed inside a KbqFormField component. */
610
- protected readonly inSelect: boolean;
610
+ /**
611
+ * Whether this tree-selection is rendered inside a select panel (enables option
612
+ * hover-to-focus). Defaults to detecting a wrapping `KbqFormField`, and is forced to `true`
613
+ * by the host `KbqTreeSelect` so hover works even when the tree-select has no form-field
614
+ * wrapper (e.g. the filter-bar pipes render the tree-select bare).
615
+ */
616
+ inSelect: boolean;
611
617
  renderedOptions: QueryList<KbqTreeOption>;
612
618
  keyManager: FocusKeyManager<KbqTreeOption>;
613
619
  selectionModel: SelectionModel<SelectionModelOption>;
@@ -633,6 +639,8 @@ declare class KbqTreeSelection extends KbqTreeBase<any> implements ControlValueA
633
639
  get noUnselectLast(): boolean;
634
640
  set noUnselectLast(value: boolean);
635
641
  private _noUnselectLast;
642
+ /** When `true`, a repeated Ctrl/Cmd+A deselects all options. Off by default (Ctrl+A only selects). */
643
+ readonly selectAllToggle: i0.InputSignalWithTransform<boolean, unknown>;
636
644
  get disabled(): boolean;
637
645
  set disabled(rawValue: boolean);
638
646
  private _disabled;
@@ -660,7 +668,14 @@ declare class KbqTreeSelection extends KbqTreeBase<any> implements ControlValueA
660
668
  renderNodeChanges(data: KbqTreeOption[], dataDiffer?: IterableDiffer<KbqTreeOption>, viewContainer?: ViewContainerRef, parentData?: KbqTreeOption): void;
661
669
  emitNavigationEvent(option: KbqTreeOption): void;
662
670
  emitChangeEvent(option: KbqTreeOption): void;
663
- selectAllOptions(): void;
671
+ /**
672
+ * Function for handling the combination Ctrl + A (select all). By default, the internal handler is used,
673
+ * which toggles the selection of all non-disabled, selectable options.
674
+ */
675
+ get selectAllHandler(): (event: KeyboardEvent, tree: KbqTreeSelection) => void;
676
+ set selectAllHandler(fn: (event: KeyboardEvent, tree: KbqTreeSelection) => void);
677
+ private _selectAllHandler;
678
+ selectAllOptions(allowDeselect?: boolean): void;
664
679
  copyActiveOption(event: KeyboardEvent): void;
665
680
  writeValue(value: any): void;
666
681
  /** `View -> model callback called when value changes` */
@@ -705,7 +720,7 @@ declare class KbqTreeSelection extends KbqTreeBase<any> implements ControlValueA
705
720
  private canDeselectLast;
706
721
  private isFocusReceivedFromNestedOption;
707
722
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqTreeSelection, never>;
708
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqTreeSelection, "kbq-tree-selection", ["kbqTreeSelection"], { "treeControl": { "alias": "treeControl"; "required": false; }; "autoSelect": { "alias": "autoSelect"; "required": false; }; "noUnselectLast": { "alias": "noUnselectLast"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; }, { "navigationChange": "navigationChange"; "selectionChange": "selectionChange"; "onSelectAll": "onSelectAll"; "onCopy": "onCopy"; }, ["unorderedOptions"], never, true, never>;
723
+ static ɵcmp: i0.ɵɵComponentDeclaration<KbqTreeSelection, "kbq-tree-selection", ["kbqTreeSelection"], { "treeControl": { "alias": "treeControl"; "required": false; }; "autoSelect": { "alias": "autoSelect"; "required": false; }; "noUnselectLast": { "alias": "noUnselectLast"; "required": false; }; "selectAllToggle": { "alias": "selectAllToggle"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "selectAllHandler": { "alias": "selectAllHandler"; "required": false; }; }, { "navigationChange": "navigationChange"; "selectionChange": "selectionChange"; "onSelectAll": "onSelectAll"; "onCopy": "onCopy"; }, ["unorderedOptions"], never, true, never>;
709
724
  }
710
725
 
711
726
  declare class KbqTreeModule {
package/tree/toggle.scss CHANGED
@@ -9,6 +9,7 @@
9
9
  flex-shrink: 0;
10
10
 
11
11
  height: 100%;
12
+
12
13
  // FIXME: default token doesn't exist
13
14
  padding-left: var(--kbq-tree-size-toggle-padding);
14
15
  padding-right: var(--kbq-tree-size-toggle-padding);
@@ -27,6 +28,10 @@
27
28
 
28
29
  &[disabled] {
29
30
  cursor: default;
31
+
32
+ & .kbq-icon {
33
+ color: var(--kbq-tree-states-disabled-tree-toggle-color);
34
+ }
30
35
  }
31
36
  }
32
37
 
@@ -70,10 +70,6 @@
70
70
  outline: none;
71
71
  }
72
72
 
73
- &.kbq-disabled .kbq-icon {
74
- cursor: default;
75
- }
76
-
77
73
  &:not(.kbq-disabled) {
78
74
  cursor: pointer;
79
75
 
@@ -9,7 +9,7 @@
9
9
  &.kbq-control_has-validate-directive.ng-invalid,
10
10
  // Invalid by control `ErrorStateMatcher`
11
11
  &.kbq-invalid {
12
- color: var(--kbq-error-default);
12
+ color: var(--kbq-foreground-error);
13
13
 
14
14
  .kbq-select__placeholder {
15
15
  color: var(--kbq-form-field-states-error-placeholder);
@@ -6,7 +6,7 @@ import * as i1 from '@angular/cdk/overlay';
6
6
  import { ConnectedPosition, CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
7
7
  import { ControlValueAccessor, NgForm, FormGroupDirective, NgControl } from '@angular/forms';
8
8
  import * as i5 from '@koobiq/components/core';
9
- import { KbqAbstractSelect, CanUpdateErrorState, ErrorStateMatcher, KbqSelectTrigger, KbqSelectMatcher, KbqSelectSearch, KbqComponentColors } from '@koobiq/components/core';
9
+ import { KbqAbstractSelect, CanUpdateErrorState, ErrorStateMatcher, KbqSelectTrigger, KbqSelectMatcher, KbqSelectSearch, KbqSelectAllEvent, KbqComponentColors } from '@koobiq/components/core';
10
10
  import * as i9 from '@koobiq/components/form-field';
11
11
  import { KbqFormFieldControl, KbqCleaner } from '@koobiq/components/form-field';
12
12
  import * as i4 from '@koobiq/components/tags';
@@ -151,6 +151,11 @@ declare class KbqTreeSelect extends KbqAbstractSelect implements AfterContentIni
151
151
  readonly closedStream: Observable<void>;
152
152
  /** Event emitted when the selected value has been changed by the user. */
153
153
  readonly selectionChange: _angular_core.OutputEmitterRef<KbqTreeSelectChange>;
154
+ /**
155
+ * Event emitted when all options are selected or deselected via the Ctrl/Cmd + A shortcut.
156
+ * Not emitted when a custom `selectAllHandler` is supplied — the handler owns the behaviour then.
157
+ */
158
+ readonly onSelectAll: _angular_core.OutputEmitterRef<KbqSelectAllEvent<KbqTreeOption, KbqTreeSelect>>;
154
159
  /**
155
160
  * Event that emits whenever the raw value of the select changes. This is here primarily
156
161
  * to facilitate the two-way binding for the `value` input.
@@ -189,6 +194,8 @@ declare class KbqTreeSelect extends KbqAbstractSelect implements AfterContentIni
189
194
  get autoSelect(): boolean;
190
195
  set autoSelect(value: boolean);
191
196
  private _autoSelect;
197
+ /** When `true`, a repeated Ctrl/Cmd+A deselects all options. Off by default (Ctrl+A only selects). */
198
+ readonly selectAllToggle: _angular_core.InputSignalWithTransform<boolean, unknown>;
192
199
  get value(): any;
193
200
  get id(): string;
194
201
  set id(value: string);
@@ -362,7 +369,7 @@ declare class KbqTreeSelect extends KbqAbstractSelect implements AfterContentIni
362
369
  private scrollActiveOptionIntoView;
363
370
  private subscribeOnSearchChanges;
364
371
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqTreeSelect, never>;
365
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqTreeSelect, "kbq-tree-select", ["kbqTreeSelect"], { "hiddenItemsText": { "alias": "hiddenItemsText"; "required": false; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "backdropClass": { "alias": "backdropClass"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; }; "sortComparator": { "alias": "sortComparator"; "required": false; "isSignal": true; }; "multiline": { "alias": "multiline"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; }; "required": { "alias": "required"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "autoSelect": { "alias": "autoSelect"; "required": false; }; "id": { "alias": "id"; "required": false; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "selectAllHandler": { "alias": "selectAllHandler"; "required": false; }; "panelMinWidth": { "alias": "panelMinWidth"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "searchMinOptionsThreshold": { "alias": "searchMinOptionsThreshold"; "required": false; }; "hiddenItemsTextFormatter": { "alias": "hiddenItemsTextFormatter"; "required": false; }; }, { "openedChange": "openedChange"; "openedStream": "opened"; "closedStream": "closed"; "selectionChange": "selectionChange"; "valueChange": "valueChange"; }, ["cleaner", "customTrigger", "customMatcher", "customTagTemplateRef", "tree", "search"], ["kbq-select-matcher, [kbq-select-matcher]", "kbq-select-trigger, [kbq-select-trigger]", "kbq-cleaner", "[kbqSelectSearch]", "[kbq-select-search-empty-result]", "kbq-tree-selection", "kbq-select-footer,[kbq-tree-select-footer]"], true, never>;
372
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqTreeSelect, "kbq-tree-select", ["kbqTreeSelect"], { "hiddenItemsText": { "alias": "hiddenItemsText"; "required": false; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "backdropClass": { "alias": "backdropClass"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; }; "sortComparator": { "alias": "sortComparator"; "required": false; "isSignal": true; }; "multiline": { "alias": "multiline"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; }; "required": { "alias": "required"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "autoSelect": { "alias": "autoSelect"; "required": false; }; "selectAllToggle": { "alias": "selectAllToggle"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "selectAllHandler": { "alias": "selectAllHandler"; "required": false; }; "panelMinWidth": { "alias": "panelMinWidth"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "searchMinOptionsThreshold": { "alias": "searchMinOptionsThreshold"; "required": false; }; "hiddenItemsTextFormatter": { "alias": "hiddenItemsTextFormatter"; "required": false; }; }, { "openedChange": "openedChange"; "openedStream": "opened"; "closedStream": "closed"; "selectionChange": "selectionChange"; "onSelectAll": "onSelectAll"; "valueChange": "valueChange"; }, ["cleaner", "customTrigger", "customMatcher", "customTagTemplateRef", "tree", "search"], ["kbq-select-matcher, [kbq-select-matcher]", "kbq-select-trigger, [kbq-select-trigger]", "kbq-cleaner", "[kbqSelectSearch]", "[kbq-select-search-empty-result]", "kbq-tree-selection", "kbq-select-footer,[kbq-tree-select-footer]"], true, never>;
366
373
  static ngAcceptInputType_multiple: unknown;
367
374
  static ngAcceptInputType_disabled: unknown;
368
375
  }
@@ -165,6 +165,24 @@ declare class KbqUsernameCustomPipe<T = unknown> implements PipeTransform {
165
165
  static ɵpipe: i0.ɵɵPipeDeclaration<KbqUsernameCustomPipe<any>, "kbqUsernameCustom", true>;
166
166
  static ɵprov: i0.ɵɵInjectableDeclaration<KbqUsernameCustomPipe<any>>;
167
167
  }
168
+ interface KbqUsernameTextOptions {
169
+ /** Formats the login segment. Defaults to identity. */
170
+ formatLogin?: (login: string) => string;
171
+ /**
172
+ * Formats the site segment.
173
+ * Defaults to wrapping in parentheses, matching kbq-username display.
174
+ */
175
+ formatSite?: (site: string) => string;
176
+ }
177
+ /**
178
+ * Builds a full username string from a pre-formatted name plus optional login and site,
179
+ * mirroring the text rendered by `kbq-username`.
180
+ *
181
+ * Provide custom `formatLogin` / `formatSite` to tailor the output.
182
+ */
183
+ declare function kbqBuildUsernameText(data: {
184
+ name: string;
185
+ } & Partial<Pick<KbqUserInfo, 'login' | 'site'>>, options?: KbqUsernameTextOptions): string;
168
186
 
169
187
  declare class KbqUsernameModule {
170
188
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqUsernameModule, never>;
@@ -172,5 +190,5 @@ declare class KbqUsernameModule {
172
190
  static ɵinj: i0.ɵɵInjectorDeclaration<KbqUsernameModule>;
173
191
  }
174
192
 
175
- export { KBQ_PROFILE_MAPPING, KbqMappingMissingError, KbqUsername, KbqUsernameCustomPipe, KbqUsernameCustomView, KbqUsernameFormatKey, KbqUsernameModule, KbqUsernamePipe, KbqUsernamePrimary, KbqUsernameSecondary, KbqUsernameSecondaryHint, kbqDefaultFullNameFormat, kbqDefaultFullNameFormatCustom };
176
- export type { KbqFormatKeyToProfileMapping, KbqFormatKeyToProfileMappingExtended, KbqUserInfo, KbqUsernameMode, KbqUsernameStyle };
193
+ export { KBQ_PROFILE_MAPPING, KbqMappingMissingError, KbqUsername, KbqUsernameCustomPipe, KbqUsernameCustomView, KbqUsernameFormatKey, KbqUsernameModule, KbqUsernamePipe, KbqUsernamePrimary, KbqUsernameSecondary, KbqUsernameSecondaryHint, kbqBuildUsernameText, kbqDefaultFullNameFormat, kbqDefaultFullNameFormatCustom };
194
+ export type { KbqFormatKeyToProfileMapping, KbqFormatKeyToProfileMappingExtended, KbqUserInfo, KbqUsernameMode, KbqUsernameStyle, KbqUsernameTextOptions };