@koobiq/components 20.2.0 → 20.3.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 (212) hide show
  1. package/accordion/_accordion-theme.scss +5 -1
  2. package/accordion/accordion-tokens.scss +2 -0
  3. package/accordion/accordion-trigger.scss +6 -0
  4. package/accordion/accordion.scss +21 -0
  5. package/accordion/index.d.ts +55 -8
  6. package/actions-panel/index.d.ts +25 -13
  7. package/app-switcher/app-switcher-dropdown-app.scss +7 -5
  8. package/app-switcher/app-switcher-dropdown-site.scss +6 -4
  9. package/app-switcher/index.d.ts +41 -4
  10. package/app-switcher/kbq-app-switcher-list-item.scss +6 -8
  11. package/autocomplete/index.d.ts +24 -9
  12. package/breadcrumbs/index.d.ts +1 -1
  13. package/button/index.d.ts +2 -2
  14. package/button-toggle/button-toggle-tokens.scss +2 -0
  15. package/button-toggle/button-toggle.scss +9 -0
  16. package/button-toggle/index.d.ts +5 -0
  17. package/checkbox/index.d.ts +33 -29
  18. package/clamped-text/index.d.ts +1 -1
  19. package/code-block/index.d.ts +24 -19
  20. package/content-panel/index.d.ts +1 -1
  21. package/core/index.d.ts +1125 -199
  22. package/core/option/_action-container-mixins.scss +28 -0
  23. package/core/option/_option-theme.scss +24 -0
  24. package/core/option/action.scss +7 -0
  25. package/core/styles/_koobiq-theme.scss +2 -0
  26. package/core/styles/_tokens.scss +1 -0
  27. package/core/styles/common/_connected-overlay.scss +6 -3
  28. package/core/styles/common/_select.scss +12 -0
  29. package/core/styles/common/_tokens.scss +0 -9
  30. package/core/styles/theming/_index.scss +0 -1
  31. package/core/styles/theming/_theming.scss +34 -5
  32. package/datepicker/index.d.ts +46 -15
  33. package/dl/dl.scss +26 -0
  34. package/dl/index.d.ts +8 -1
  35. package/dropdown/_dropdown-theme.scss +28 -2
  36. package/dropdown/dropdown-item.scss +13 -0
  37. package/dropdown/dropdown.scss +7 -1
  38. package/dropdown/index.d.ts +264 -17
  39. package/dynamic-translation/index.d.ts +1 -1
  40. package/fesm2022/koobiq-components-accordion.mjs +106 -46
  41. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  42. package/fesm2022/koobiq-components-actions-panel.mjs +57 -46
  43. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  44. package/fesm2022/koobiq-components-alert.mjs +16 -16
  45. package/fesm2022/koobiq-components-app-switcher.mjs +233 -38
  46. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  47. package/fesm2022/koobiq-components-autocomplete.mjs +54 -31
  48. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  49. package/fesm2022/koobiq-components-badge.mjs +13 -13
  50. package/fesm2022/koobiq-components-breadcrumbs.mjs +25 -25
  51. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  52. package/fesm2022/koobiq-components-button-toggle.mjs +17 -12
  53. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  54. package/fesm2022/koobiq-components-button.mjs +25 -25
  55. package/fesm2022/koobiq-components-checkbox.mjs +69 -92
  56. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  57. package/fesm2022/koobiq-components-clamped-text.mjs +13 -13
  58. package/fesm2022/koobiq-components-code-block.mjs +56 -69
  59. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  60. package/fesm2022/koobiq-components-content-panel.mjs +29 -29
  61. package/fesm2022/koobiq-components-core.mjs +2445 -789
  62. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  63. package/fesm2022/koobiq-components-datepicker.mjs +160 -121
  64. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  65. package/fesm2022/koobiq-components-divider.mjs +7 -7
  66. package/fesm2022/koobiq-components-dl.mjs +23 -15
  67. package/fesm2022/koobiq-components-dl.mjs.map +1 -1
  68. package/fesm2022/koobiq-components-dropdown.mjs +754 -155
  69. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  70. package/fesm2022/koobiq-components-dynamic-translation.mjs +13 -13
  71. package/fesm2022/koobiq-components-ellipsis-center.mjs +7 -7
  72. package/fesm2022/koobiq-components-empty-state.mjs +19 -19
  73. package/fesm2022/koobiq-components-file-upload.mjs +74 -42
  74. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  75. package/fesm2022/koobiq-components-filter-bar.mjs +605 -192
  76. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  77. package/fesm2022/koobiq-components-flag.mjs +7 -7
  78. package/fesm2022/koobiq-components-form-field.mjs +346 -158
  79. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  80. package/fesm2022/koobiq-components-icon.mjs +39 -21
  81. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  82. package/fesm2022/koobiq-components-inline-edit.mjs +172 -27
  83. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  84. package/fesm2022/koobiq-components-input.mjs +41 -24
  85. package/fesm2022/koobiq-components-input.mjs.map +1 -1
  86. package/fesm2022/koobiq-components-link.mjs +8 -8
  87. package/fesm2022/koobiq-components-list.mjs +657 -143
  88. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  89. package/fesm2022/koobiq-components-loader-overlay.mjs +16 -16
  90. package/fesm2022/koobiq-components-markdown.mjs +14 -11
  91. package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
  92. package/fesm2022/koobiq-components-modal.mjs +59 -35
  93. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  94. package/fesm2022/koobiq-components-navbar.mjs +69 -54
  95. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  96. package/fesm2022/koobiq-components-notification-center.mjs +23 -22
  97. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  98. package/fesm2022/koobiq-components-overflow-items.mjs +16 -17
  99. package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
  100. package/fesm2022/koobiq-components-popover.mjs +26 -21
  101. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  102. package/fesm2022/koobiq-components-progress-bar.mjs +13 -13
  103. package/fesm2022/koobiq-components-progress-spinner.mjs +13 -13
  104. package/fesm2022/koobiq-components-radio.mjs +10 -10
  105. package/fesm2022/koobiq-components-resizer.mjs +33 -14
  106. package/fesm2022/koobiq-components-resizer.mjs.map +1 -1
  107. package/fesm2022/koobiq-components-scrollbar.mjs +10 -10
  108. package/fesm2022/koobiq-components-search-expandable.mjs +7 -7
  109. package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
  110. package/fesm2022/koobiq-components-select.mjs +419 -106
  111. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  112. package/fesm2022/koobiq-components-sidebar.mjs +14 -14
  113. package/fesm2022/koobiq-components-sidepanel.mjs +26 -26
  114. package/fesm2022/koobiq-components-skeleton.mjs +10 -10
  115. package/fesm2022/koobiq-components-split-button.mjs +7 -7
  116. package/fesm2022/koobiq-components-splitter.mjs +17 -17
  117. package/fesm2022/koobiq-components-table.mjs +15 -13
  118. package/fesm2022/koobiq-components-table.mjs.map +1 -1
  119. package/fesm2022/koobiq-components-tabs.mjs +54 -54
  120. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  121. package/fesm2022/koobiq-components-tags.mjs +283 -122
  122. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  123. package/fesm2022/koobiq-components-textarea.mjs +13 -8
  124. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  125. package/fesm2022/koobiq-components-time-range.mjs +29 -24
  126. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  127. package/fesm2022/koobiq-components-timepicker.mjs +58 -26
  128. package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
  129. package/fesm2022/koobiq-components-timezone.mjs +76 -39
  130. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  131. package/fesm2022/koobiq-components-title.mjs +7 -7
  132. package/fesm2022/koobiq-components-toast.mjs +51 -26
  133. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  134. package/fesm2022/koobiq-components-toggle.mjs +72 -64
  135. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  136. package/fesm2022/koobiq-components-tooltip.mjs +115 -36
  137. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  138. package/fesm2022/koobiq-components-top-bar.mjs +13 -13
  139. package/fesm2022/koobiq-components-tree-select.mjs +189 -55
  140. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  141. package/fesm2022/koobiq-components-tree.mjs +302 -81
  142. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  143. package/fesm2022/koobiq-components-username.mjs +27 -27
  144. package/file-upload/index.d.ts +25 -6
  145. package/file-upload/multiple-file-upload.component.scss +14 -0
  146. package/filter-bar/_filter-bar-theme.scss +0 -6
  147. package/filter-bar/index.d.ts +222 -9
  148. package/filter-bar/pipes/pipe-multi-tree-select.scss +0 -6
  149. package/filter-bar/pipes/pipe-multiselect.scss +0 -6
  150. package/filter-bar/pipes/pipe-tree-select.scss +0 -6
  151. package/form-field/_form-field-theme.scss +76 -20
  152. package/form-field/fieldset.scss +10 -0
  153. package/form-field/form-field-tokens.scss +15 -1
  154. package/form-field/form-field.scss +15 -19
  155. package/form-field/index.d.ts +147 -65
  156. package/icon/index.d.ts +31 -6
  157. package/inline-edit/index.d.ts +57 -4
  158. package/inline-edit/inline-edit.scss +10 -0
  159. package/input/index.d.ts +17 -2
  160. package/list/_list-theme.scss +42 -10
  161. package/list/index.d.ts +326 -79
  162. package/list/list-tokens.scss +43 -8
  163. package/list/list.scss +186 -12
  164. package/markdown/index.d.ts +1 -1
  165. package/modal/index.d.ts +21 -4
  166. package/modal/modal-tokens.scss +1 -1
  167. package/navbar/index.d.ts +16 -1
  168. package/navbar/navbar-brand.scss +6 -0
  169. package/navbar/vertical-navbar.scss +6 -0
  170. package/notification-center/notification-item.scss +6 -0
  171. package/package.json +3 -6
  172. package/popover/index.d.ts +2 -2
  173. package/prebuilt-themes/dark-theme.css +1 -1
  174. package/prebuilt-themes/light-theme.css +1 -1
  175. package/prebuilt-themes/theme.css +1 -1
  176. package/resizer/index.d.ts +12 -0
  177. package/schematics/migrations/deprecated-icons/README.md +29 -4
  178. package/schematics/migrations/deprecated-icons/data.js +7 -0
  179. package/schematics/migrations/deprecated-icons/index.js +62 -35
  180. package/schematics/migrations/new-icons-pack/README.md +37 -2
  181. package/schematics/migrations/new-icons-pack/data.js +8 -0
  182. package/schematics/migrations/new-icons-pack/index.js +144 -53
  183. package/schematics/ng-add/index.js +3 -3
  184. package/schematics/utils/angular-parsing.js +30 -12
  185. package/schematics/utils/ast.js +31 -0
  186. package/schematics/utils/icon-migration.js +530 -0
  187. package/schematics/utils/typescript.js +44 -0
  188. package/scrollbar/index.d.ts +1 -1
  189. package/select/index.d.ts +163 -18
  190. package/select/select-tokens.scss +0 -1
  191. package/select/select.scss +0 -2
  192. package/splitter/index.d.ts +1 -1
  193. package/table/_table-theme.scss +4 -0
  194. package/table/index.d.ts +2 -1
  195. package/table/table.scss +8 -0
  196. package/tags/index.d.ts +128 -29
  197. package/textarea/index.d.ts +5 -0
  198. package/time-range/index.d.ts +1 -1
  199. package/timepicker/index.d.ts +4 -0
  200. package/timezone/index.d.ts +9 -5
  201. package/toast/index.d.ts +26 -3
  202. package/toggle/index.d.ts +34 -14
  203. package/tooltip/index.d.ts +54 -11
  204. package/tree/_tree-theme.scss +25 -5
  205. package/tree/index.d.ts +71 -3
  206. package/tree/tree-option.scss +2 -8
  207. package/tree-select/_tree-select-theme.scss +22 -0
  208. package/tree-select/index.d.ts +83 -16
  209. package/core/styles/_tokens.kbq.import.scss +0 -4
  210. package/core/styles/theming/_components-theming.scss +0 -1927
  211. package/filter-bar/pipes/pipe-select.scss +0 -5
  212. package/overflow-items/overflow-items.scss +0 -20
package/tags/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnDestroy, AfterContentInit, AfterViewInit, ChangeDetectorRef, ElementRef, DoCheck, QueryList, OnChanges, InjectionToken } from '@angular/core';
2
+ import { Signal, OnDestroy, AfterContentInit, AfterViewInit, ChangeDetectorRef, ElementRef, DoCheck, QueryList, InjectionToken, OnChanges, Provider } from '@angular/core';
3
3
  import { NgControl, ControlValueAccessor, NgForm, FormGroupDirective } from '@angular/forms';
4
4
  import { KbqAutocompleteTrigger } from '@koobiq/components/autocomplete';
5
5
  import * as i2 from '@angular/cdk/drag-drop';
@@ -12,14 +12,23 @@ import { FocusOrigin } from '@angular/cdk/a11y';
12
12
  import { KbqIcon } from '@koobiq/components/icon';
13
13
  import * as i1$1 from '@angular/cdk/platform';
14
14
 
15
- /** Interface for a text control that is used to drive interaction with a kbq-tag-list. */
16
-
15
+ /**
16
+ * Interface for a text control that is used to drive interaction with a kbq-tag-list.
17
+ *
18
+ * @docs-private
19
+ */
17
20
  interface KbqTagTextControl {
18
21
  id: string;
19
22
  placeholder: string;
20
23
  focused: boolean;
21
24
  empty: boolean;
22
- ngControl?: NgControl;
25
+ /** Whether the control's value was filled in by the browser. */
26
+ autofilled?: Signal<boolean>;
27
+ /**
28
+ * @deprecated Unused by the library: validation lives on the `<kbq-tag-list>` control.
29
+ * Will be removed in a future major release.
30
+ */
31
+ ngControl?: NgControl | null;
23
32
  focus(): void;
24
33
  }
25
34
 
@@ -389,6 +398,13 @@ declare class KbqTagList implements KbqFormFieldControl<any>, ControlValueAccess
389
398
  private _placeholder;
390
399
  /** Whether any tags or the kbqTagInput inside of this tag-list has focus. */
391
400
  get focused(): boolean;
401
+ /**
402
+ * Implemented as part of KbqFormFieldControl. Forwarded from the registered `kbqTagInput`, which
403
+ * is the element the browser actually autofills — the tag list itself is not an input.
404
+ *
405
+ * @docs-private
406
+ */
407
+ readonly autofilled: _angular_core.Signal<boolean>;
392
408
  /**
393
409
  * Implemented as part of KbqFormFieldControl.
394
410
  * @docs-private
@@ -469,8 +485,15 @@ declare class KbqTagList implements KbqFormFieldControl<any>, ControlValueAccess
469
485
  errorState: boolean;
470
486
  /** The tag input to add more tags */
471
487
  private tagInput;
488
+ /**
489
+ * The same control as `tagInput`, kept in a signal so `autofilled` can track it reactively —
490
+ * `registerInput()` runs after the first read.
491
+ */
492
+ private readonly registeredInput;
472
493
  /** True when the next `tags.changes` emission is triggered by a UI action, not programmatic update. */
473
494
  private pendingUIChange;
495
+ /** Shared range selection state used by pointer and keyboard interactions. */
496
+ private rangeSelection;
474
497
  /**
475
498
  * When a tag is destroyed, we store the index of the destroyed tag until the tags
476
499
  * query list notifies about the update. This is necessary because we cannot determine an
@@ -530,6 +553,12 @@ declare class KbqTagList implements KbqFormFieldControl<any>, ControlValueAccess
530
553
  * @docs-private
531
554
  */
532
555
  focusInput(): void;
556
+ /**
557
+ * Establishes a range origin or extends the current range to the specified tag.
558
+ *
559
+ * @docs-private
560
+ */
561
+ handleSelectionInteraction(tag: KbqTag, extendRange: boolean): void;
533
562
  /**
534
563
  * Pass events to the keyboard manager. Available here for tests.
535
564
  *
@@ -576,6 +605,8 @@ declare class KbqTagList implements KbqFormFieldControl<any>, ControlValueAccess
576
605
  * @docs-private
577
606
  */
578
607
  removeSelected(): void;
608
+ /** Whether the rendered tags no longer match the value this control last reported. */
609
+ private hasTagsValueChanged;
579
610
  private propagateTagsChanges;
580
611
  private resetTags;
581
612
  /** Listens to user-generated selection events on each tag. */
@@ -588,6 +619,8 @@ declare class KbqTagList implements KbqFormFieldControl<any>, ControlValueAccess
588
619
  private setupDropListInitialProperties;
589
620
  private syncDropListDisabledState;
590
621
  private setupFocusMonitor;
622
+ private extendSelectionTo;
623
+ private setRangeOrigin;
591
624
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqTagList, never>;
592
625
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqTagList, "kbq-tag-list", ["kbqTagList"], { "value": { "alias": "value"; "required": false; }; "required": { "alias": "required"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "draggable": { "alias": "draggable"; "required": false; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; }; }, { "dropped": "dropped"; "valueChange": "valueChange"; "change": "change"; }, ["cleaner", "tags"], ["*", "kbq-cleaner"], true, [{ directive: typeof i2.CdkDropList; inputs: {}; outputs: {}; }]>;
593
626
  static ngAcceptInputType_disabled: unknown;
@@ -602,10 +635,42 @@ interface KbqTagInputEvent {
602
635
  /** The value of the input. */
603
636
  value: string;
604
637
  }
638
+ /** Contexts a `KbqTagSeparator` can be active in. */
639
+ type KbqTagSeparatorContext = 'input' | 'paste';
640
+ /** Defines a character or pattern that ends a tag, and the contexts in which it applies. */
605
641
  interface KbqTagSeparator {
642
+ /** Regular expression used to match/split this separator in text. */
606
643
  symbol: RegExp;
607
- key: string;
644
+ /**
645
+ * `KeyboardEvent.key` that triggers this separator while typing.
646
+ * Omit for separators with no single-keystroke equivalent (e.g. a run of whitespace) —
647
+ * those are implicitly paste-only, since they can never match a `keydown`.
648
+ */
649
+ key?: string;
650
+ /**
651
+ * Numeric key code gating whether this separator is enabled, set via `kbqTagInputSeparatorKeyCodes`.
652
+ * Omit together with `key` for separators that should always be active regardless of that input.
653
+ */
654
+ keyCode?: number;
655
+ /**
656
+ * Contexts this separator applies to.
657
+ * @default ['input', 'paste']
658
+ */
659
+ appliesTo?: KbqTagSeparatorContext[];
660
+ }
661
+ /** Default options for the tags module that can be overridden. */
662
+ interface KbqTagsDefaultOptions {
663
+ /** The list of key codes that will trigger a tagEnd event. */
664
+ separatorKeyCodes: number[];
665
+ /** Custom separator definitions to use instead of the built-in defaults. */
666
+ separators?: KbqTagSeparator[];
667
+ /** Whether the tagEnd event will be emitted when text is pasted. */
668
+ addOnPaste?: boolean;
608
669
  }
670
+ /** Injection token to be used to override the default options. */
671
+ declare const KBQ_TAGS_DEFAULT_OPTIONS: InjectionToken<KbqTagsDefaultOptions>;
672
+ /** Utility provider for `KBQ_TAGS_DEFAULT_OPTIONS`. */
673
+ declare const kbqTagsDefaultOptionsProvider: (options: Partial<KbqTagsDefaultOptions>) => Provider;
609
674
  /**
610
675
  * Directive that adds tag-specific behaviors to an input element inside `<kbq-form-field>`.
611
676
  * May be placed inside or outside of an `<kbq-tag-list>`.
@@ -614,10 +679,28 @@ declare class KbqTagInput implements KbqTagTextControl, OnChanges {
614
679
  private elementRef;
615
680
  private defaultOptions;
616
681
  private trimDirective;
617
- ngControl: NgControl;
682
+ /**
683
+ * The form control instance bound to the input, if any.
684
+ *
685
+ * @deprecated Read only, and unused by the library: validation lives on the `<kbq-tag-list>`
686
+ * control. Binding `[formControl]`/`[ngModel]` to the input itself stays supported — it is what
687
+ * `kbqAutocomplete` drives the input through — only its validators are not consulted.
688
+ * Will be removed in a future major release.
689
+ * @docs-private
690
+ */
691
+ ngControl: NgControl | null;
692
+ /**
693
+ * The autocomplete trigger attached to the input, if any.
694
+ * @docs-private
695
+ */
618
696
  autocompleteTrigger?: KbqAutocompleteTrigger | null | undefined;
619
- /** Whether the control is focused. */
697
+ /**
698
+ * Whether the control is focused.
699
+ * @docs-private
700
+ */
620
701
  focused: boolean;
702
+ /** Whether the control's value was filled in by the browser. */
703
+ readonly autofilled: _angular_core.Signal<boolean>;
621
704
  /**
622
705
  * The list of key codes that will trigger a tagEnd event.
623
706
  *
@@ -625,7 +708,12 @@ declare class KbqTagInput implements KbqTagTextControl, OnChanges {
625
708
  */
626
709
  set separatorKeyCodes(value: number[]);
627
710
  private _separatorKeyCodes;
628
- /** @docs-private */
711
+ /**
712
+ * The effective set of separators: entries gated by `keyCode` are included only when that
713
+ * code is present in `separatorKeyCodes`; entries without a `keyCode` (no single-keystroke
714
+ * equivalent, e.g. a run of whitespace) are always included.
715
+ * @docs-private
716
+ */
629
717
  get separators(): KbqTagSeparator[];
630
718
  private _separators;
631
719
  /** Emitted when a tag is to be added. */
@@ -662,45 +750,56 @@ declare class KbqTagInput implements KbqTagTextControl, OnChanges {
662
750
  ngOnChanges(): void;
663
751
  /** @docs-private */
664
752
  onKeydown(event: KeyboardEvent): void;
665
- /** Checks to see if the blur should emit the (tagEnd) event. */
753
+ /**
754
+ * Checks to see if the blur should emit the (tagEnd) event.
755
+ * @docs-private
756
+ */
666
757
  blur(event: FocusEvent): void;
758
+ /**
759
+ * @deprecated No-op. Validation belongs to the `<kbq-tag-list>` form control, which
760
+ * revalidates itself whenever its value changes. Will be removed in a future major release.
761
+ * @docs-private
762
+ */
667
763
  triggerValidation(): void;
668
- /** Checks to see if the (tagEnd) event needs to be emitted. */
764
+ /**
765
+ * Checks to see if the (tagEnd) event needs to be emitted.
766
+ * @docs-private
767
+ */
669
768
  emitTagEnd(): void;
769
+ /**
770
+ * Whether the current input value duplicates an existing tag.
771
+ * @docs-private
772
+ */
670
773
  get hasDuplicates(): boolean;
774
+ /** @docs-private */
671
775
  onInput(): void;
776
+ /** @docs-private */
672
777
  onPaste($event: ClipboardEvent): void;
673
778
  /** @docs-private */
674
779
  onFocus(): void;
675
780
  /** Focuses the input. */
676
781
  focus(): void;
677
- private getSeparatorsForString;
782
+ private getPasteSeparatorPatterns;
783
+ /**
784
+ * Single path for adding a tag, shared by typed input, blur and paste.
785
+ * `existingValues` is `null` unless `distinct` is on, and is mutated as values are accepted.
786
+ */
787
+ private addTag;
788
+ /** Values to dedupe against, or `null` when duplicates are allowed. */
789
+ private existingTagValues;
790
+ private tagValues;
678
791
  private trimValue;
679
- private getSeparatorByKeyCode;
680
- private hasControl;
681
- /** Checks whether a keycode is one of the configured separators. */
682
- private isSeparatorKey;
792
+ /** Checks whether a keydown event matches a separator that applies to typed input. */
793
+ private matchesInputSeparator;
683
794
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqTagInput, never>;
684
795
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KbqTagInput, "input[kbqTagInputFor]", ["kbqTagInput", "kbqTagInputFor"], { "separatorKeyCodes": { "alias": "kbqTagInputSeparatorKeyCodes"; "required": false; }; "distinct": { "alias": "distinct"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; }; "id": { "alias": "id"; "required": false; }; "tagList": { "alias": "kbqTagInputFor"; "required": false; }; "addOnBlur": { "alias": "kbqTagInputAddOnBlur"; "required": false; }; "addOnPaste": { "alias": "kbqTagInputAddOnPaste"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "tagEnd": "kbqTagInputTokenEnd"; }, never, never, true, [{ directive: typeof i1.KbqFieldSizingContent; inputs: {}; outputs: {}; }]>;
685
796
  }
686
797
 
687
- /** Default options, for the chips module, that can be overridden. */
688
- interface KbqTagsDefaultOptions {
689
- /** The list of key codes that will trigger a chipEnd event. */
690
- separatorKeyCodes: number[];
691
- separators?: {
692
- [key: number]: KbqTagSeparator;
693
- };
694
- addOnPaste?: boolean;
695
- }
696
- /** Injection token to be used to override the default options for the chips module. */
697
- declare const KBQ_TAGS_DEFAULT_OPTIONS: InjectionToken<KbqTagsDefaultOptions>;
698
-
699
798
  declare class KbqTagsModule {
700
799
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqTagsModule, never>;
701
800
  static ɵmod: _angular_core.ɵɵNgModuleDeclaration<KbqTagsModule, never, [typeof i1$1.PlatformModule, typeof KbqTagEditSubmit, typeof KbqTagEditInput, typeof KbqTagList, typeof KbqTag, typeof KbqTagInput, typeof KbqTagTrailingIcon, typeof KbqTagAvatar, typeof KbqTagRemove], [typeof KbqTagList, typeof KbqTag, typeof KbqTagInput, typeof KbqTagTrailingIcon, typeof KbqTagAvatar, typeof KbqTagRemove, typeof KbqTagEditSubmit, typeof KbqTagEditInput]>;
702
801
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<KbqTagsModule>;
703
802
  }
704
803
 
705
- export { KBQ_TAGS_DEFAULT_OPTIONS, KbqTag, KbqTagAvatar, KbqTagEditChange, KbqTagEditInput, KbqTagEditSubmit, KbqTagInput, KbqTagList, KbqTagListChange, KbqTagRemove, KbqTagSelectionChange, KbqTagTrailingIcon, KbqTagsModule };
706
- export type { KbqTagDragData, KbqTagEvent, KbqTagFocusEvent, KbqTagInputEvent, KbqTagListDroppedEvent, KbqTagSeparator, KbqTagsDefaultOptions };
804
+ export { KBQ_TAGS_DEFAULT_OPTIONS, KbqTag, KbqTagAvatar, KbqTagEditChange, KbqTagEditInput, KbqTagEditSubmit, KbqTagInput, KbqTagList, KbqTagListChange, KbqTagRemove, KbqTagSelectionChange, KbqTagTrailingIcon, KbqTagsModule, kbqTagsDefaultOptionsProvider };
805
+ export type { KbqTagDragData, KbqTagEvent, KbqTagFocusEvent, KbqTagInputEvent, KbqTagListDroppedEvent, KbqTagSeparator, KbqTagSeparatorContext, KbqTagsDefaultOptions };
@@ -38,6 +38,11 @@ declare class KbqTextarea implements KbqFormFieldControl<any>, OnInit, OnChanges
38
38
  * @docs-private
39
39
  */
40
40
  focused: boolean;
41
+ /**
42
+ * Implemented as part of KbqFormFieldControl.
43
+ * @docs-private
44
+ */
45
+ readonly autofilled: i0.Signal<boolean>;
41
46
  /**
42
47
  * Implemented as part of KbqFormFieldControl.
43
48
  * @docs-private
@@ -1,7 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { InjectionToken, OnInit, TemplateRef, WritableSignal, Provider, Injector } from '@angular/core';
3
3
  import { ValidatorFn, ControlValueAccessor, NgControl, FormControl, Validator, FormGroup, AbstractControl, FormGroupDirective, NgForm, ValidationErrors } from '@angular/forms';
4
- import { DateAdapter, DateFormatter, PopUpSizes, PopUpPlacements, KbqTimeRangeLocaleConfig, ErrorStateMatcher } from '@koobiq/components/core';
4
+ import { DateAdapter, DateFormatter, KbqTimeRangeLocaleConfig, PopUpSizes, PopUpPlacements, ErrorStateMatcher } from '@koobiq/components/core';
5
5
  import { KbqPopoverTrigger } from '@koobiq/components/popover';
6
6
  import { DurationObjectUnits, DurationUnit } from '@koobiq/date-adapter';
7
7
  import { KbqTimepicker, TimeFormats } from '@koobiq/components/timepicker';
@@ -42,6 +42,7 @@ declare class KbqTimepicker<D> implements KbqFormFieldControl<D>, ControlValueAc
42
42
  private renderer;
43
43
  private dateAdapter;
44
44
  private localeService;
45
+ private readonly timezoneService;
45
46
  /**
46
47
  * Implemented as part of KbqFormFieldControl.
47
48
  * @docs-private
@@ -149,6 +150,8 @@ declare class KbqTimepicker<D> implements KbqFormFieldControl<D>, ControlValueAc
149
150
  private formatUserInput;
150
151
  private replaceSymbols;
151
152
  private replaceNumbers;
153
+ /** Clamps a time part to the allowed maximum and trims it to two digits */
154
+ private normalizeTimePart;
152
155
  /** Checks whether the input is invalid based on the native validation. */
153
156
  private isBadInput;
154
157
  private spaceKeyHandler;
@@ -174,6 +177,7 @@ declare class KbqTimepicker<D> implements KbqFormFieldControl<D>, ControlValueAc
174
177
  private maxValidator;
175
178
  private getValidDateOrNull;
176
179
  private setViewValue;
180
+ private setSelection;
177
181
  private updateView;
178
182
  /** @docs-private */
179
183
  updateErrorState(): void;
@@ -33,13 +33,15 @@ interface KbqTimezonesByCountry {
33
33
  declare class KbqTimezoneOption extends KbqOption {
34
34
  readonly tooltipContentWrapper: i0.Signal<ElementRef<HTMLElement>>;
35
35
  readonly tooltipContent: i0.Signal<ElementRef<HTMLElement>>;
36
- readonly highlightText: i0.InputSignal<string>;
36
+ readonly highlightText: i0.InputSignal<string | readonly string[]>;
37
+ /** Whether `highlightText` was matched with diacritic folding (e.g. via `createSearchPredicate`) — see `kbqHighlightBackground`. */
38
+ readonly foldDiacritics: i0.InputSignal<boolean>;
37
39
  get timezone(): KbqTimezoneZone;
38
40
  set timezone(zone: KbqTimezoneZone);
39
41
  private _timezone;
40
42
  get viewValue(): string;
41
43
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqTimezoneOption, never>;
42
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqTimezoneOption, "kbq-timezone-option", ["kbqTimezoneOption"], { "highlightText": { "alias": "highlightText"; "required": false; "isSignal": true; }; "timezone": { "alias": "timezone"; "required": false; }; }, {}, never, never, true, never>;
44
+ static ɵcmp: i0.ɵɵComponentDeclaration<KbqTimezoneOption, "kbq-timezone-option", ["kbqTimezoneOption"], { "highlightText": { "alias": "highlightText"; "required": false; "isSignal": true; }; "foldDiacritics": { "alias": "foldDiacritics"; "required": false; "isSignal": true; }; "timezone": { "alias": "timezone"; "required": false; }; }, {}, never, never, true, never>;
43
45
  }
44
46
 
45
47
  declare const TOOLTIP_VISIBLE_ROWS_COUNT = 3;
@@ -84,7 +86,7 @@ declare class UtcOffsetPipe implements PipeTransform {
84
86
  }
85
87
 
86
88
  declare class CitiesByFilterPipe implements PipeTransform {
87
- transform(value: string, searchPattern?: string): string;
89
+ transform(value: string, searchPattern?: string | readonly string[]): string;
88
90
  static ɵfac: i0.ɵɵFactoryDeclaration<CitiesByFilterPipe, never>;
89
91
  static ɵpipe: i0.ɵɵPipeDeclaration<CitiesByFilterPipe, "citiesByFilter", true>;
90
92
  }
@@ -113,9 +115,11 @@ declare function offsetFormatterAsObject(value: string): {
113
115
  */
114
116
  declare function timezonesSortComparator(first: KbqTimezoneZone, second: KbqTimezoneZone): number;
115
117
  /**
116
- * Filtering timezone cities by search string
118
+ * Filtering timezone cities by search string. Accepts a single pattern or several (matching a
119
+ * city if it satisfies any one of them) — patterns that look like a bare UTC offset (e.g. `+3`)
120
+ * are ignored here, since they describe the zone rather than a city name.
117
121
  */
118
- declare function filterCitiesBySearchString(cities: string, searchPattern?: string): string;
122
+ declare function filterCitiesBySearchString(cities: string, searchPattern?: string | readonly string[]): string;
119
123
 
120
124
  export { KbqTimezoneModule, KbqTimezoneOption, KbqTimezoneOptionTooltip, KbqTimezoneSelect, KbqTimezoneSelectTrigger, TOOLTIP_VISIBLE_ROWS_COUNT, filterCitiesBySearchString, getZonesGroupedByCountry, offset, offsetFormatter, offsetFormatterAsObject, parseOffset, timezonesSortComparator };
121
125
  export type { KbqTimezoneGroup, KbqTimezoneZone, KbqTimezonesByCountry };
package/toast/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { TemplateRef, InjectionToken, Provider, OnDestroy, ElementRef, ComponentRef, EmbeddedViewRef, ViewContainerRef, ViewRef, Injector } from '@angular/core';
2
+ import { InjectionToken, TemplateRef, Provider, OnDestroy, ElementRef, ComponentRef, EmbeddedViewRef, ViewContainerRef, ViewRef, Injector } from '@angular/core';
3
3
  import { CdkScrollable } from '@angular/cdk/overlay';
4
4
  import * as rxjs from 'rxjs';
5
- import { BehaviorSubject } from 'rxjs';
5
+ import { BehaviorSubject, Observable } from 'rxjs';
6
6
  import { AnimationEvent } from '@angular/animations';
7
7
  import * as i1 from '@koobiq/components/core';
8
8
  import { KbqReadStateDirective, ThemePalette } from '@koobiq/components/core';
@@ -144,11 +144,34 @@ declare class KbqToastContainerComponent extends CdkScrollable {
144
144
  private changeDetectorRef;
145
145
  readonly service: KbqToastService<any>;
146
146
  readonly viewContainer: i0.Signal<ViewContainerRef>;
147
- constructor();
147
+ /**
148
+ * Emits while the stack re-lays-out. Toasts are ordinary flow children, so removing one slides the
149
+ * rest for as long as its height animates — and an overlay opened from inside a toast is anchored to
150
+ * a trigger that is moving. CDK only re-measures the origin on a scroll or a viewport resize, so the
151
+ * stack has to say when it moved.
152
+ *
153
+ * The container's own box tracks the reflow exactly: continuously while a leaving toast animates its
154
+ * height away, and once for a removal that is not animated at all, such as a template toast.
155
+ */
156
+ private readonly reflowed;
157
+ /**
158
+ * `ScrollDispatcher` subscribes to this method when the container registers itself, so merging the
159
+ * reflow signal in re-broadcasts it to every overlay that repositions on scroll — which is what
160
+ * `kbq-select` and the dropdown trigger do by default.
161
+ */
162
+ elementScrolled(): Observable<Event>;
148
163
  createToast<C>(data: KbqToastData, componentType: any, onTop: boolean): ComponentRef<C>;
149
164
  createTemplate<C>(data: KbqToastData, template: TemplateRef<any>, onTop: boolean): EmbeddedViewRef<C>;
150
165
  remove(viewRef: ViewRef): void;
151
166
  getInjector(data: KbqToastData): Injector;
167
+ /**
168
+ * Fakes a scroll on the container so that overlays anchored inside a toast are repositioned by their
169
+ * `RepositionScrollStrategy` when the stack shifts.
170
+ *
171
+ * @deprecated The container reports its own reflow through `elementScrolled()`, so nothing calls this.
172
+ * It is kept only for callers that already hold a container reference — the instance created by
173
+ * `KbqToastService` is not exposed.
174
+ */
152
175
  dispatchScrollEvent: () => void;
153
176
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqToastContainerComponent, never>;
154
177
  static ɵcmp: i0.ɵɵComponentDeclaration<KbqToastContainerComponent, "kbq-toast-container", never, {}, {}, never, never, true, never>;
package/toggle/index.d.ts CHANGED
@@ -1,18 +1,23 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { AfterViewInit, OnDestroy, ElementRef } from '@angular/core';
3
3
  import { ControlValueAccessor } from '@angular/forms';
4
- import { TransitionCheckState, KbqCheckboxClickAction } from '@koobiq/components/checkbox';
5
- import { KbqColorDirective, KbqCheckedState } from '@koobiq/components/core';
6
- import * as i1 from '@angular/cdk/a11y';
4
+ import * as i1 from '@koobiq/components/core';
5
+ import { KbqColorDirective, TransitionCheckState, KbqCheckableClickAction, KbqCheckedState } from '@koobiq/components/core';
6
+ import * as i1$1 from '@angular/cdk/a11y';
7
7
 
8
8
  type ToggleLabelPositionType = 'left' | 'right';
9
9
  declare class KbqToggleChange {
10
10
  source: KbqToggleComponent;
11
11
  checked: boolean;
12
12
  }
13
+ /**
14
+ * Toggle click action when user click on input element. Alias of `KbqCheckableClickAction`.
15
+ */
16
+ type KbqToggleClickAction = KbqCheckableClickAction;
13
17
  declare class KbqToggleComponent extends KbqColorDirective implements AfterViewInit, ControlValueAccessor, OnDestroy {
14
- private focusMonitor;
15
- private changeDetectorRef;
18
+ private readonly changeDetectorRef;
19
+ private readonly focusMonitor;
20
+ private readonly checkable;
16
21
  readonly big: _angular_core.InputSignal<boolean>;
17
22
  readonly inputElement: _angular_core.Signal<ElementRef<HTMLInputElement>>;
18
23
  readonly labelPosition: _angular_core.InputSignal<ToggleLabelPositionType>;
@@ -24,13 +29,10 @@ declare class KbqToggleComponent extends KbqColorDirective implements AfterViewI
24
29
  readonly value: _angular_core.InputSignal<string>;
25
30
  get disabled(): any;
26
31
  set disabled(value: any);
27
- private _disabled;
28
32
  get tabIndex(): number;
29
33
  set tabIndex(value: number);
30
- private _tabIndex;
31
34
  get checked(): boolean;
32
35
  set checked(value: boolean);
33
- private _checked;
34
36
  /**
35
37
  * Whether the toggle is indeterminate. This is also known as "mixed" mode and can be used to
36
38
  * represent a checkbox with three states, e.g. a checkbox that represents a nested list of
@@ -39,7 +41,6 @@ declare class KbqToggleComponent extends KbqColorDirective implements AfterViewI
39
41
  */
40
42
  get indeterminate(): boolean;
41
43
  set indeterminate(value: boolean);
42
- private _indeterminate;
43
44
  /**
44
45
  * Property for manually set loading state.
45
46
  */
@@ -50,7 +51,7 @@ declare class KbqToggleComponent extends KbqColorDirective implements AfterViewI
50
51
  /** @docs-private */
51
52
  protected currentCheckState: TransitionCheckState;
52
53
  /** Defines the behavior when a user clicks on the toggle. */
53
- clickAction: KbqCheckboxClickAction;
54
+ clickAction: KbqToggleClickAction;
54
55
  private uniqueId;
55
56
  constructor();
56
57
  ngAfterViewInit(): void;
@@ -60,25 +61,44 @@ declare class KbqToggleComponent extends KbqColorDirective implements AfterViewI
60
61
  onChangeEvent(event: Event): void;
61
62
  onLabelTextChange(): void;
62
63
  onInputClick(event: MouseEvent): void;
64
+ /**
65
+ * Implemented as part of ControlValueAccessor.
66
+ * @deprecated Unused - `ControlValueAccessor` is now implemented by the `KbqCheckable` host directive,
67
+ * so this is never called by Angular forms. Will be removed in the next major version.
68
+ */
63
69
  writeValue(value: any): void;
70
+ /**
71
+ * Implemented as part of ControlValueAccessor.
72
+ * @deprecated Unused - `ControlValueAccessor` is now implemented by the `KbqCheckable` host directive,
73
+ * so this is never called by Angular forms. Will be removed in the next major version.
74
+ */
64
75
  registerOnChange(fn: any): void;
76
+ /**
77
+ * Implemented as part of ControlValueAccessor.
78
+ * @deprecated Unused - `ControlValueAccessor` is now implemented by the `KbqCheckable` host directive,
79
+ * so this is never called by Angular forms. Will be removed in the next major version.
80
+ */
65
81
  registerOnTouched(fn: any): void;
82
+ /**
83
+ * Implemented as part of ControlValueAccessor.
84
+ * @deprecated Unused - `ControlValueAccessor` is now implemented by the `KbqCheckable` host directive,
85
+ * so this is never called by Angular forms. Will be removed in the next major version.
86
+ */
66
87
  setDisabledState(isDisabled: boolean): void;
67
88
  private setTransitionCheckState;
68
- private onTouchedCallback;
69
- private onChangeCallback;
70
89
  private transitionCheckState;
71
90
  private emitChangeEvent;
72
91
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqToggleComponent, never>;
73
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqToggleComponent, "kbq-toggle", ["kbqToggle"], { "big": { "alias": "big"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "checked": { "alias": "checked"; "required": false; }; "indeterminate": { "alias": "indeterminate"; "required": false; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "clickAction": { "alias": "clickAction"; "required": false; }; }, { "change": "change"; "indeterminateChange": "indeterminateChange"; }, never, ["*", "kbq-hint"], true, never>;
92
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqToggleComponent, "kbq-toggle", ["kbqToggle"], { "big": { "alias": "big"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "checked": { "alias": "checked"; "required": false; }; "indeterminate": { "alias": "indeterminate"; "required": false; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "clickAction": { "alias": "clickAction"; "required": false; }; }, { "change": "change"; "indeterminateChange": "indeterminateChange"; }, never, ["*", "kbq-hint"], true, [{ directive: typeof i1.KbqCheckable; inputs: {}; outputs: {}; }]>;
74
93
  static ngAcceptInputType_tabIndex: unknown;
75
94
  static ngAcceptInputType_indeterminate: unknown;
76
95
  }
77
96
 
78
97
  declare class KbqToggleModule {
79
98
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqToggleModule, never>;
80
- static ɵmod: _angular_core.ɵɵNgModuleDeclaration<KbqToggleModule, never, [typeof i1.A11yModule, typeof KbqToggleComponent], [typeof KbqToggleComponent]>;
99
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<KbqToggleModule, never, [typeof i1$1.A11yModule, typeof KbqToggleComponent], [typeof KbqToggleComponent]>;
81
100
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<KbqToggleModule>;
82
101
  }
83
102
 
84
103
  export { KbqToggleChange, KbqToggleComponent, KbqToggleModule };
104
+ export type { KbqToggleClickAction };
@@ -15,7 +15,7 @@ declare const KBQ_TOOLTIP_SINGLE_INSTANCE_DEFAULT: InjectionToken<boolean>;
15
15
  * @docs-private
16
16
  */
17
17
  interface KbqExclusiveTooltip {
18
- /** Hides the tooltip because another one has taken its place. */
18
+ /** Hides the tooltip because another tooltip — or a pop-up on the same element — has taken its place. */
19
19
  hideAsInactive(): void;
20
20
  }
21
21
  /**
@@ -83,10 +83,25 @@ declare const KBQ_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER: {
83
83
  declare class KbqTooltipTrigger extends KbqPopUpTrigger<KbqTooltipComponent> implements AfterViewInit, OnChanges, OnDestroy, KbqExclusiveTooltip {
84
84
  /** Registry holding the single tooltip that is currently visible. */
85
85
  private readonly tooltipRegistry;
86
+ private readonly injectedScrollStrategy;
87
+ /**
88
+ * Per-instance override for the scroll strategy, taking precedence over `KBQ_TOOLTIP_SCROLL_STRATEGY`
89
+ * when set. An `@Input` rather than a DI override so it applies to this tooltip instance only, without
90
+ * leaking into other `kbqTooltip`s nested inside the same host (DI overrides are visible to every
91
+ * descendant in the element-injector tree, not just the element they're declared on).
92
+ * @docs-private
93
+ */
94
+ readonly scrollStrategyOverride: i0.InputSignal<(() => ScrollStrategy) | undefined>;
86
95
  /** @docs-private */
87
- protected scrollStrategy: () => ScrollStrategy;
96
+ protected get scrollStrategy(): () => ScrollStrategy;
88
97
  /** @docs-private */
89
98
  protected parentPopup: KbqParentPopup | null;
99
+ /**
100
+ * Pop-ups anchored to the very same element — a popover, a dropdown, a select and so on. Resolved with
101
+ * `self` so a pop-up further up the tree (which the tooltip merely lives inside) is not picked up; that
102
+ * case is covered by `parentPopup`.
103
+ */
104
+ private readonly siblingPopups;
90
105
  /** @docs-private */
91
106
  protected focusMonitor: FocusMonitor;
92
107
  /** @docs-private */
@@ -208,15 +223,31 @@ declare class KbqTooltipTrigger extends KbqPopUpTrigger<KbqTooltipComponent> imp
208
223
  * assign `trigger = 'manual'` and therefore stay out of the group.
209
224
  */
210
225
  private get participatesInSingleInstance();
226
+ /**
227
+ * Whether `kbqTrigger` contains at least one user-driven event, i.e. the tooltip is not driven purely
228
+ * imperatively. `manual`/`none` tooltips (the validation hints of datepicker, timepicker and inline-edit)
229
+ * bind no listeners and are expected to stay pinned while the user keeps interacting elsewhere.
230
+ */
231
+ private get hasInteractiveTrigger();
232
+ /**
233
+ * Whether the tooltip is muted because a pop-up on the same element has taken over the anchor.
234
+ *
235
+ * Set when that pop-up opens and released only once the pointer or the focus genuinely leaves the host,
236
+ * never on the pop-up closing. Both matter: a pop-up restores focus to its trigger when it closes (see
237
+ * `KbqPopoverComponent.onEscape`), and removing its backdrop replays `mouseenter` on the trigger without
238
+ * the pointer having moved — either would otherwise pop the tooltip up out of nowhere.
239
+ */
240
+ private mutedBySiblingPopup;
211
241
  /**
212
242
  * Sets up an effect that mirrors a `forDisabledComponent`'s disabled signal: when that component is disabled it
213
243
  * makes the host focusable (so the tooltip can still be triggered) and enables the tooltip, otherwise disables it.
214
244
  *
215
- * Also joins the "only one tooltip is visible at a time" group. Both the subscription and the teardown live
216
- * here rather than in `ngAfterViewInit`/`ngOnDestroy` because several subclasses override those hooks:
217
- * `KbqTitleDirective` and `KbqEllipsisCenterDirective` skip `super.ngAfterViewInit()`, and `KbqPasswordToggle`
218
- * skips `super` in both hooks entirely. `destroyRef` additionally covers a trigger destroyed while its
219
- * tooltip is still visible — that path disposes the overlay without emitting `visibleChange(false)`.
245
+ * Also joins the "only one tooltip is visible at a time" group and mutes the tooltip while a pop-up on the
246
+ * same element is open. All of this wiring lives here rather than in `ngAfterViewInit`/`ngOnDestroy` because
247
+ * several subclasses override those hooks: `KbqTitleDirective` and `KbqEllipsisCenterDirective` skip
248
+ * `super.ngAfterViewInit()`, and `KbqPasswordToggle` skips `super` in both hooks entirely. `destroyRef`
249
+ * additionally covers a trigger destroyed while its tooltip is still visible — that path disposes the
250
+ * overlay without emitting `visibleChange(false)`.
220
251
  */
221
252
  constructor();
222
253
  /**
@@ -227,12 +258,24 @@ declare class KbqTooltipTrigger extends KbqPopUpTrigger<KbqTooltipComponent> imp
227
258
  /** Stops focus monitoring on the host element and runs the base-class teardown. */
228
259
  ngOnDestroy(): void;
229
260
  /**
230
- * Shows the tooltip after `delay` ms. Suppresses showing on a focus trigger that did not originate from
231
- * the keyboard, and applies cursor-relative positioning when `relativeToPointer` is enabled.
261
+ * Shows the tooltip after `delay` ms. Suppresses showing while a pop-up on the same element holds the
262
+ * anchor or on a focus trigger that did not originate from the keyboard, and applies cursor-relative
263
+ * positioning when `relativeToPointer` is enabled.
232
264
  */
233
265
  show(delay?: number): void;
234
266
  /**
235
- * Hides the tooltip because another tooltip became visible.
267
+ * Hides the tooltip after `delay` ms and, when the user has genuinely left the host, un-mutes a tooltip
268
+ * that a pop-up on the same element had muted.
269
+ *
270
+ * `mouseleave` and `blur` are the release signals because the base class binds `hide` to both regardless
271
+ * of whether the tooltip is currently visible. A pop-up that is still attached does not count: its
272
+ * backdrop steals the hover from the trigger while the pointer stands still, and that `mouseleave` must
273
+ * not be mistaken for the user leaving.
274
+ */
275
+ hide(delay?: number): void;
276
+ /**
277
+ * Hides the tooltip because something else took its place — another tooltip became visible, or a pop-up
278
+ * anchored to the same element opened.
236
279
  *
237
280
  * Goes straight to the pop-up instead of `hide()`: `hide()` silently no-ops when the last recorded
238
281
  * `triggerName` is `mouseleave` and the pop-up itself is hovered. Hiding through the instance keeps
@@ -263,7 +306,7 @@ declare class KbqTooltipTrigger extends KbqPopUpTrigger<KbqTooltipComponent> imp
263
306
  /** @docs-private */
264
307
  protected applyRelativeToPointer(): void;
265
308
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqTooltipTrigger, never>;
266
- static ɵdir: i0.ɵɵDirectiveDeclaration<KbqTooltipTrigger, "[kbqTooltip]", ["kbqTooltip"], { "forDisabledComponent": { "alias": "forDisabledComponent"; "required": false; "isSignal": true; }; "ignoreTooltipPointerEvents": { "alias": "ignoreTooltipPointerEvents"; "required": false; "isSignal": true; }; "singleInstance": { "alias": "kbqTooltipSingleInstance"; "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>;
309
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KbqTooltipTrigger, "[kbqTooltip]", ["kbqTooltip"], { "scrollStrategyOverride": { "alias": "kbqTooltipScrollStrategy"; "required": false; "isSignal": true; }; "forDisabledComponent": { "alias": "forDisabledComponent"; "required": false; "isSignal": true; }; "ignoreTooltipPointerEvents": { "alias": "ignoreTooltipPointerEvents"; "required": false; "isSignal": true; }; "singleInstance": { "alias": "kbqTooltipSingleInstance"; "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>;
267
310
  static ngAcceptInputType_hideWithTimeout: unknown;
268
311
  static ngAcceptInputType_relativeToPointer: unknown;
269
312
  static ngAcceptInputType_arrow: unknown;