@koobiq/components 19.2.0 → 19.4.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 (128) hide show
  1. package/autocomplete/autocomplete-trigger.directive.d.ts +5 -0
  2. package/core/animation/animation.d.ts +3 -1
  3. package/core/highlight/highlight.pipe.d.ts +2 -0
  4. package/core/option/action.d.ts +5 -6
  5. package/core/utils/utils.d.ts +4 -0
  6. package/datepicker/datepicker-input.directive.d.ts +6 -1
  7. package/fesm2022/koobiq-components-accordion.mjs +34 -34
  8. package/fesm2022/koobiq-components-actions-panel.mjs +10 -10
  9. package/fesm2022/koobiq-components-alert.mjs +16 -16
  10. package/fesm2022/koobiq-components-app-switcher.mjs +19 -19
  11. package/fesm2022/koobiq-components-autocomplete.mjs +21 -14
  12. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  13. package/fesm2022/koobiq-components-badge.mjs +13 -13
  14. package/fesm2022/koobiq-components-breadcrumbs.mjs +25 -25
  15. package/fesm2022/koobiq-components-button-toggle.mjs +10 -10
  16. package/fesm2022/koobiq-components-button.mjs +13 -13
  17. package/fesm2022/koobiq-components-checkbox.mjs +10 -10
  18. package/fesm2022/koobiq-components-clamped-text.mjs +7 -7
  19. package/fesm2022/koobiq-components-code-block.mjs +10 -10
  20. package/fesm2022/koobiq-components-content-panel.mjs +28 -28
  21. package/fesm2022/koobiq-components-core.mjs +268 -243
  22. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  23. package/fesm2022/koobiq-components-datepicker.mjs +49 -42
  24. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  25. package/fesm2022/koobiq-components-divider.mjs +7 -7
  26. package/fesm2022/koobiq-components-dl.mjs +13 -13
  27. package/fesm2022/koobiq-components-dropdown.mjs +21 -20
  28. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  29. package/fesm2022/koobiq-components-dynamic-translation.mjs +13 -13
  30. package/fesm2022/koobiq-components-ellipsis-center.mjs +7 -7
  31. package/fesm2022/koobiq-components-empty-state.mjs +19 -19
  32. package/fesm2022/koobiq-components-file-upload.mjs +495 -60
  33. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  34. package/fesm2022/koobiq-components-filter-bar.mjs +69 -69
  35. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  36. package/fesm2022/koobiq-components-form-field.mjs +62 -62
  37. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  38. package/fesm2022/koobiq-components-icon.mjs +14 -14
  39. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  40. package/fesm2022/koobiq-components-inline-edit.mjs +19 -28
  41. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  42. package/fesm2022/koobiq-components-input.mjs +22 -22
  43. package/fesm2022/koobiq-components-link.mjs +7 -7
  44. package/fesm2022/koobiq-components-list.mjs +30 -20
  45. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  46. package/fesm2022/koobiq-components-loader-overlay.mjs +16 -16
  47. package/fesm2022/koobiq-components-markdown.mjs +10 -10
  48. package/fesm2022/koobiq-components-modal.mjs +28 -28
  49. package/fesm2022/koobiq-components-navbar-ic.mjs +34 -34
  50. package/fesm2022/koobiq-components-navbar.mjs +43 -43
  51. package/fesm2022/koobiq-components-notification-center.mjs +16 -16
  52. package/fesm2022/koobiq-components-overflow-items.mjs +16 -16
  53. package/fesm2022/koobiq-components-popover.mjs +18 -18
  54. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  55. package/fesm2022/koobiq-components-progress-bar.mjs +13 -13
  56. package/fesm2022/koobiq-components-progress-spinner.mjs +13 -13
  57. package/fesm2022/koobiq-components-radio.mjs +10 -10
  58. package/fesm2022/koobiq-components-resizer.mjs +10 -10
  59. package/fesm2022/koobiq-components-risk-level.mjs +7 -7
  60. package/fesm2022/koobiq-components-scrollbar.mjs +10 -10
  61. package/fesm2022/koobiq-components-search-expandable.mjs +55 -28
  62. package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
  63. package/fesm2022/koobiq-components-select.mjs +16 -14
  64. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  65. package/fesm2022/koobiq-components-sidebar.mjs +13 -13
  66. package/fesm2022/koobiq-components-sidepanel.mjs +166 -61
  67. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  68. package/fesm2022/koobiq-components-skeleton.mjs +37 -0
  69. package/fesm2022/koobiq-components-skeleton.mjs.map +1 -0
  70. package/fesm2022/koobiq-components-split-button.mjs +7 -7
  71. package/fesm2022/koobiq-components-splitter.mjs +16 -16
  72. package/fesm2022/koobiq-components-table.mjs +10 -10
  73. package/fesm2022/koobiq-components-tabs.mjs +52 -52
  74. package/fesm2022/koobiq-components-tags.mjs +50 -35
  75. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  76. package/fesm2022/koobiq-components-textarea.mjs +7 -7
  77. package/fesm2022/koobiq-components-time-range.mjs +22 -22
  78. package/fesm2022/koobiq-components-timepicker.mjs +10 -10
  79. package/fesm2022/koobiq-components-timezone.mjs +22 -22
  80. package/fesm2022/koobiq-components-title.mjs +7 -7
  81. package/fesm2022/koobiq-components-toast.mjs +16 -16
  82. package/fesm2022/koobiq-components-toggle.mjs +7 -7
  83. package/fesm2022/koobiq-components-tooltip.mjs +24 -16
  84. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  85. package/fesm2022/koobiq-components-top-bar.mjs +13 -13
  86. package/fesm2022/koobiq-components-tree-select.mjs +11 -26
  87. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  88. package/fesm2022/koobiq-components-tree.mjs +53 -43
  89. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  90. package/fesm2022/koobiq-components-username.mjs +27 -27
  91. package/file-upload/dropzone.d.ts +147 -0
  92. package/file-upload/dropzone.scss +57 -0
  93. package/file-upload/file-upload.d.ts +3 -0
  94. package/file-upload/multiple-file-upload.component.d.ts +11 -1
  95. package/file-upload/multiple-file-upload.component.scss +1 -1
  96. package/file-upload/primitives/file-drop.d.ts +23 -4
  97. package/file-upload/public-api.d.ts +1 -0
  98. package/file-upload/single-file-upload.component.d.ts +11 -1
  99. package/form-field/_form-field-theme.scss +2 -2
  100. package/form-field/form-field-control.d.ts +2 -0
  101. package/form-field/form-field.scss +0 -1
  102. package/icon/icon-button.scss +5 -4
  103. package/inline-edit/inline-edit-tokens.scss +1 -1
  104. package/inline-edit/inline-edit.d.ts +2 -2
  105. package/inline-edit/inline-edit.scss +1 -1
  106. package/list/list-selection.component.d.ts +1 -0
  107. package/package.json +9 -4
  108. package/popover/_popover-theme.scss +1 -1
  109. package/schematics/ng-add/index.js +2 -2
  110. package/search-expandable/search-expandable.d.ts +19 -4
  111. package/select/select.component.d.ts +2 -1
  112. package/sidepanel/_sidepanel-theme.scss +10 -0
  113. package/sidepanel/sidepanel-animations.d.ts +7 -1
  114. package/sidepanel/sidepanel-container.component.d.ts +12 -2
  115. package/sidepanel/sidepanel-directives.d.ts +8 -0
  116. package/sidepanel/sidepanel-ref.d.ts +12 -0
  117. package/sidepanel/sidepanel-tokens.scss +5 -3
  118. package/sidepanel/sidepanel.scss +78 -18
  119. package/sidepanel/sidepanel.service.d.ts +2 -0
  120. package/skeleton/index.d.ts +2 -0
  121. package/skeleton/module.d.ts +7 -0
  122. package/skeleton/skeleton.d.ts +8 -0
  123. package/skeleton/skeleton.scss +41 -0
  124. package/tags/tag-list.component.d.ts +7 -1
  125. package/tags/tag.component.d.ts +2 -0
  126. package/tooltip/tooltip.component.d.ts +8 -0
  127. package/tree/tree-selection.component.d.ts +2 -1
  128. package/tree-select/tree-select.component.d.ts +2 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koobiq/components",
3
- "version": "19.2.0",
3
+ "version": "19.4.0",
4
4
  "description": "koobiq",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21,12 +21,13 @@
21
21
  },
22
22
  "homepage": "https://github.com/koobiq/angular-components#readme",
23
23
  "peerDependencies": {
24
+ "@angular/animations": "^19.0.0",
24
25
  "@angular/cdk": "^19.0.0",
25
26
  "@angular/core": "^19.0.0",
26
27
  "@angular/forms": "^19.0.0",
27
- "@koobiq/cdk": "19.2.0",
28
- "@koobiq/angular-moment-adapter": "19.2.0",
29
- "@koobiq/angular-luxon-adapter": "19.2.0",
28
+ "@koobiq/cdk": "19.4.0",
29
+ "@koobiq/angular-moment-adapter": "19.4.0",
30
+ "@koobiq/angular-luxon-adapter": "19.4.0",
30
31
  "@koobiq/date-formatter": "^3.2.3",
31
32
  "@koobiq/icons": "^11.1.3",
32
33
  "@koobiq/tokens-builder": "3.11.0",
@@ -249,6 +250,10 @@
249
250
  "types": "./sidepanel/index.d.ts",
250
251
  "default": "./fesm2022/koobiq-components-sidepanel.mjs"
251
252
  },
253
+ "./skeleton": {
254
+ "types": "./skeleton/index.d.ts",
255
+ "default": "./fesm2022/koobiq-components-skeleton.mjs"
256
+ },
252
257
  "./split-button": {
253
258
  "types": "./split-button/index.d.ts",
254
259
  "default": "./fesm2022/koobiq-components-split-button.mjs"
@@ -18,7 +18,7 @@
18
18
  background: var(--kbq-popover-container-background);
19
19
  }
20
20
 
21
- .kbq-popover__close {
21
+ .kbq-popover__close.kbq-popover__close_background-overlay-inverse {
22
22
  background-color: var(--kbq-background-overlay-inverse);
23
23
  }
24
24
 
@@ -27,8 +27,8 @@ function ngAdd(options) {
27
27
  }
28
28
  // Installing dependencies
29
29
  utils_packageConfig.addPackageToPackageJson(tree, '@angular/cdk', "^19.2.19");
30
- utils_packageConfig.addPackageToPackageJson(tree, '@koobiq/cdk', "^19.2.0");
31
- utils_packageConfig.addPackageToPackageJson(tree, '@koobiq/angular-luxon-adapter', "^19.2.0");
30
+ utils_packageConfig.addPackageToPackageJson(tree, '@koobiq/cdk', "^19.4.0");
31
+ utils_packageConfig.addPackageToPackageJson(tree, '@koobiq/angular-luxon-adapter', "^19.4.0");
32
32
  utils_packageConfig.addPackageToPackageJson(tree, '@koobiq/date-formatter', "^3.4.0");
33
33
  utils_packageConfig.addPackageToPackageJson(tree, '@koobiq/date-adapter', "^3.4.0");
34
34
  utils_packageConfig.addPackageToPackageJson(tree, '@koobiq/icons', "^11.2.0");
@@ -1,6 +1,6 @@
1
1
  import { FocusMonitor } from '@angular/cdk/a11y';
2
- import { AfterViewInit, ChangeDetectorRef, DestroyRef, EventEmitter, InjectionToken } from '@angular/core';
3
- import { ControlValueAccessor } from '@angular/forms';
2
+ import { AfterViewInit, ChangeDetectorRef, DestroyRef, EventEmitter, InjectionToken, OnDestroy } from '@angular/core';
3
+ import { ControlValueAccessor, NgControl } from '@angular/forms';
4
4
  import { BehaviorSubject } from 'rxjs';
5
5
  import * as i0 from "@angular/core";
6
6
  /** default configuration of search-expandable */
@@ -12,7 +12,9 @@ export declare const KBQ_SEARCH_EXPANDABLE_DEFAULT_CONFIGURATION: {
12
12
  export declare const KBQ_SEARCH_EXPANDABLE_CONFIGURATION: InjectionToken<unknown>;
13
13
  export declare const defaultValue = "";
14
14
  export declare const defaultEmitValueTimeout = 200;
15
- export declare class KbqSearchExpandable implements ControlValueAccessor, AfterViewInit {
15
+ export declare class KbqSearchExpandable implements ControlValueAccessor, AfterViewInit, OnDestroy {
16
+ /** @docs-private */
17
+ protected readonly ngControl: NgControl | null;
16
18
  /** @docs-private */
17
19
  protected readonly focusMonitor: FocusMonitor;
18
20
  /** @docs-private */
@@ -41,6 +43,12 @@ export declare class KbqSearchExpandable implements ControlValueAccessor, AfterV
41
43
  get placeholder(): string;
42
44
  set placeholder(value: string);
43
45
  private _placeholder;
46
+ get disabled(): boolean;
47
+ set disabled(value: boolean);
48
+ private _disabled;
49
+ get tabIndex(): number;
50
+ set tabIndex(value: number);
51
+ private _tabIndex;
44
52
  /** Event emitted when the search has been toggled. */
45
53
  readonly isOpenedChange: EventEmitter<boolean>;
46
54
  /** localized data
@@ -49,6 +57,7 @@ export declare class KbqSearchExpandable implements ControlValueAccessor, AfterV
49
57
  private lastEmittedValue;
50
58
  constructor();
51
59
  ngAfterViewInit(): void;
60
+ ngOnDestroy(): void;
52
61
  /** @docs-private */
53
62
  onChange: (value: string) => void;
54
63
  /** @docs-private */
@@ -59,12 +68,18 @@ export declare class KbqSearchExpandable implements ControlValueAccessor, AfterV
59
68
  registerOnTouched(fn: () => void): void;
60
69
  /** Implemented as part of ControlValueAccessor. */
61
70
  writeValue(value: string): void;
71
+ /** Implemented as part of ControlValueAccessor. */
72
+ setDisabledState(isDisabled: boolean): void;
62
73
  toggle(): void;
63
74
  private updateLocaleParams;
64
75
  private initDefaultParams;
65
76
  private emitValue;
77
+ private runFocusMonitor;
78
+ private stopFocusMonitor;
66
79
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqSearchExpandable, never>;
67
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqSearchExpandable, "kbq-search-expandable", never, { "isOpened": { "alias": "isOpened"; "required": false; }; "isEmitValueByEnterEnabled": { "alias": "isEmitValueByEnterEnabled"; "required": false; }; "emitValueTimeout": { "alias": "emitValueTimeout"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; }, { "isOpenedChange": "isOpenedChange"; }, never, never, true, never>;
80
+ static ɵcmp: i0.ɵɵComponentDeclaration<KbqSearchExpandable, "kbq-search-expandable", never, { "isOpened": { "alias": "isOpened"; "required": false; }; "isEmitValueByEnterEnabled": { "alias": "isEmitValueByEnterEnabled"; "required": false; }; "emitValueTimeout": { "alias": "emitValueTimeout"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; }, { "isOpenedChange": "isOpenedChange"; }, never, never, true, never>;
68
81
  static ngAcceptInputType_isOpened: unknown;
69
82
  static ngAcceptInputType_emitValueTimeout: unknown;
83
+ static ngAcceptInputType_disabled: unknown;
84
+ static ngAcceptInputType_tabIndex: unknown;
70
85
  }
@@ -249,8 +249,9 @@ export declare class KbqSelect extends KbqAbstractSelect implements AfterContent
249
249
  get focused(): boolean;
250
250
  set focused(value: boolean);
251
251
  panelOpen: boolean;
252
+ /** true if virtual scrolling is used. */
253
+ withVirtualScroll: boolean;
252
254
  private _focused;
253
- private withVirtualScroll;
254
255
  get isEmptySearchResult(): boolean;
255
256
  get canShowCleaner(): boolean;
256
257
  get selected(): KbqOptionBase | KbqOptionBase[];
@@ -15,6 +15,16 @@
15
15
  box-shadow: var(--kbq-sidepanel-container-shadow);
16
16
  }
17
17
  }
18
+
19
+ // @TODO do proper animation (#DS-4539)
20
+ .kbq-overlay-dark-backdrop {
21
+ background: transparent;
22
+
23
+ &:not(:has(~ .kbq-overlay-dark-backdrop)) {
24
+ transition: unset;
25
+ background: var(--kbq-background-overlay) !important;
26
+ }
27
+ }
18
28
  }
19
29
 
20
30
  @mixin kbq-sidepanel-typography() {
@@ -3,11 +3,17 @@ import { KbqSidepanelPosition } from './sidepanel-config';
3
3
  export declare enum KbqSidepanelAnimationState {
4
4
  Void = "void",
5
5
  Visible = "visible",
6
- Hidden = "hidden"
6
+ Hidden = "hidden",
7
+ Lower = "lower",
8
+ BottomPanel = "bottom-panel",
9
+ BecomingNormal = "becoming-normal"
7
10
  }
8
11
  export declare const kbqSidepanelTransformAnimation: Record<KbqSidepanelPosition, {
9
12
  in: string;
10
13
  out: string;
14
+ lower: string;
15
+ bottomPanel: string;
16
+ becomingNormal: string;
11
17
  }>;
12
18
  export declare const kbqSidepanelAnimations: {
13
19
  readonly sidepanelState: AnimationTriggerMetadata;
@@ -6,33 +6,40 @@ import { KbqSidepanelAnimationState } from './sidepanel-animations';
6
6
  import { KbqSidepanelConfig } from './sidepanel-config';
7
7
  import * as i0 from "@angular/core";
8
8
  export declare const KBQ_SIDEPANEL_WITH_INDENT: InjectionToken<boolean>;
9
+ /** @deprecated */
9
10
  export declare const KBQ_SIDEPANEL_WITH_SHADOW: InjectionToken<boolean>;
10
11
  export declare class KbqSidepanelContainerComponent extends BasePortalOutlet implements OnDestroy {
11
12
  private elementRef;
12
13
  private changeDetectorRef;
13
14
  sidepanelConfig: KbqSidepanelConfig;
14
15
  withIndent: boolean;
15
- withShadow: boolean;
16
16
  /** ID for the container DOM element. */
17
17
  id: string;
18
18
  /** The portal outlet inside of this container into which the content will be loaded. */
19
19
  portalOutlet: CdkPortalOutlet;
20
20
  /** The state of the sidepanel animations. */
21
21
  animationState: KbqSidepanelAnimationState;
22
+ /** @docs-private */
22
23
  animationTransform: {
23
24
  transformIn: string;
24
25
  transformOut: string;
26
+ lower: string;
27
+ bottomPanel: string;
28
+ becomingNormal: string;
25
29
  };
26
30
  /** Emits whenever the state of the animation changes. */
27
31
  animationStateChanged: EventEmitter<AnimationEvent>;
32
+ /** @docs-private */
28
33
  get size(): string;
34
+ /** @docs-private */
29
35
  get trapFocusAutoCapture(): boolean;
36
+ /** @docs-private */
30
37
  get trapFocus(): boolean;
31
38
  /** @docs-private */
32
39
  protected readonly indentClickEmitter: Subject<MouseEvent>;
33
40
  /** Whether the component has been destroyed. */
34
41
  private destroyed;
35
- constructor(elementRef: ElementRef<HTMLElement>, changeDetectorRef: ChangeDetectorRef, sidepanelConfig: KbqSidepanelConfig, withIndent: boolean, withShadow: boolean);
42
+ constructor(elementRef: ElementRef<HTMLElement>, changeDetectorRef: ChangeDetectorRef, sidepanelConfig: KbqSidepanelConfig, withIndent: boolean);
36
43
  ngOnDestroy(): void;
37
44
  /**
38
45
  * Gets an observable that emits when the indent has been clicked.
@@ -48,7 +55,10 @@ export declare class KbqSidepanelContainerComponent extends BasePortalOutlet imp
48
55
  enter(): void;
49
56
  /** Begin animation of the sidepanel exiting from view. */
50
57
  exit(): void;
58
+ /** @docs-private */
51
59
  onAnimation(event: AnimationEvent): void;
60
+ /** @docs-private */
61
+ setAnimationState(state: KbqSidepanelAnimationState): void;
52
62
  private setAnimation;
53
63
  private setPanelClass;
54
64
  private validatePortalAttached;
@@ -25,6 +25,8 @@ export declare class KbqSidepanelHeader {
25
25
  closeable: boolean;
26
26
  /** Enables text truncation. Default true */
27
27
  truncateText: boolean;
28
+ /** @docs-private */
29
+ protected sidepanelRef: KbqSidepanelRef<any, any>;
28
30
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqSidepanelHeader, never>;
29
31
  static ɵcmp: i0.ɵɵComponentDeclaration<KbqSidepanelHeader, "kbq-sidepanel-header", never, { "closeable": { "alias": "closeable"; "required": false; }; "truncateText": { "alias": "truncateText"; "required": false; }; }, {}, never, ["*"], true, never>;
30
32
  static ngAcceptInputType_closeable: unknown;
@@ -34,6 +36,10 @@ export declare class KbqSidepanelHeader {
34
36
  * Scrollable content container of a sidepanel.
35
37
  */
36
38
  export declare class KbqSidepanelBody {
39
+ private readonly sidepanelRef;
40
+ private readonly elementRef;
41
+ /** @docs-private */
42
+ protected checkOverflow(): void;
37
43
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqSidepanelBody, never>;
38
44
  static ɵdir: i0.ɵɵDirectiveDeclaration<KbqSidepanelBody, "kbq-sidepanel-body, [kbq-sidepanel-body], kbqSidepanelBody", never, {}, {}, never, never, true, never>;
39
45
  }
@@ -41,6 +47,8 @@ export declare class KbqSidepanelBody {
41
47
  * Footer of a sidepanel.
42
48
  */
43
49
  export declare class KbqSidepanelFooter {
50
+ /** @docs-private */
51
+ protected sidepanelRef: KbqSidepanelRef<any, any>;
44
52
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqSidepanelFooter, never>;
45
53
  static ɵdir: i0.ɵɵDirectiveDeclaration<KbqSidepanelFooter, "kbq-sidepanel-footer, [kbq-sidepanel-footer], kbqSidepanelFooter", never, {}, {}, never, never, true, never>;
46
54
  }
@@ -7,16 +7,28 @@ export declare class KbqSidepanelRef<T = any, R = any> {
7
7
  readonly overlayRef: OverlayRef;
8
8
  readonly config: KbqSidepanelConfig;
9
9
  readonly id: string;
10
+ /**
11
+ * Vertical scroll overflow state of the sidepanel body.
12
+ * Updated on scroll and used for visual adjustments.
13
+ */
14
+ bodyOverflow: import("@angular/core").WritableSignal<{
15
+ top: boolean;
16
+ bottom: boolean;
17
+ }>;
10
18
  /** Instance of the component making up the content of the sidepanel. */
11
19
  instance: T;
12
20
  /** Subject for notifying the user that the sidepanel has been closed and dismissed. */
13
21
  private readonly afterClosed$;
22
+ /** Subject for notifying the user that the sidepanel starting closing. */
23
+ private readonly beforeClosed$;
14
24
  /** Subject for notifying the user that the sidepanel has opened and appeared. */
15
25
  private readonly afterOpened$;
16
26
  /** Result to be passed down to the `afterDismissed` stream. */
17
27
  private result;
18
28
  constructor(containerInstance: KbqSidepanelContainerComponent, overlayRef: OverlayRef, config: KbqSidepanelConfig);
19
29
  close(result?: R): void;
30
+ /** Gets an observable that is notified when the sidepanel is started closing. */
31
+ beforeClosed(): Observable<void>;
20
32
  /** Gets an observable that is notified when the sidepanel is finished closing. */
21
33
  afterClosed(): Observable<R | undefined>;
22
34
  /** Gets an observable that is notified when the sidepanel has opened and appeared. */
@@ -8,16 +8,18 @@
8
8
  --kbq-sidepanel-size-close-button-margin-left: var(--kbq-size-s);
9
9
  --kbq-sidepanel-size-content-padding-horizontal: var(--kbq-size-xxl);
10
10
  --kbq-sidepanel-size-content-padding-bottom: var(--kbq-size-xxl);
11
+ --kbq-sidepanel-size-panel-viewport-margin: var(--kbq-size-s);
12
+ --kbq-sidepanel-size-panel-lower-offset: var(--kbq-size-l);
11
13
  // Added top padding to prevent the outline of the first focused field from being clipped
12
14
  --kbq-sidepanel-size-content-padding-top: 1px;
13
- --kbq-sidepanel-size-footer-padding-top: var(--kbq-size-s);
14
- --kbq-sidepanel-size-footer-padding-bottom: var(--kbq-size-3xl);
15
+ --kbq-sidepanel-size-footer-padding-top: var(--kbq-size-xl);
16
+ --kbq-sidepanel-size-footer-padding-bottom: var(--kbq-size-xl);
15
17
  --kbq-sidepanel-size-footer-padding-horizontal: var(--kbq-size-xxl);
16
18
  --kbq-sidepanel-size-footer-content-gap-horizontal: var(--kbq-size-l);
17
19
  /* THEME TOKENS */
18
20
  --kbq-sidepanel-overlay-background: var(--kbq-background-overlay);
19
21
  --kbq-sidepanel-container-background: var(--kbq-background-card);
20
- --kbq-sidepanel-container-shadow: var(--kbq-shadow-overlay);
22
+ --kbq-sidepanel-container-shadow: var(--kbq-shadow-popup);
21
23
  --kbq-sidepanel-header-text-color: var(--kbq-foreground-contrast);
22
24
  --kbq-sidepanel-content-text-color: var(--kbq-foreground-contrast);
23
25
  }
@@ -1,20 +1,32 @@
1
+ @use 'sass:map';
2
+
1
3
  @use '../core/styles/common';
2
4
 
3
5
  @use '../core/styles/common/tokens' as *;
4
6
 
5
7
  @use './sidepanel-theme' as *;
6
8
 
7
- .kbq-sidepanel-container_top,
8
- .kbq-sidepanel-container_bottom {
9
- flex-direction: column;
10
- height: 33%;
11
- min-height: 400px;
12
- width: 100%;
13
- left: 0;
9
+ $indent-offset: calc(-1 * var(--kbq-sidepanel-size-panel-lower-offset));
10
+
11
+ @mixin _sidepanel-container($selected-side) {
12
+ $sides: top, right, bottom, left;
13
+ $opposite-sides: (
14
+ 'top': 'bottom',
15
+ 'right': 'left',
16
+ 'left': 'right',
17
+ 'bottom': 'top'
18
+ );
19
+
20
+ .kbq-sidepanel-content {
21
+ @each $side in $sides {
22
+ @if (not (map.get($opposite-sides, $selected-side) == $side)) {
23
+ margin-#{$side}: var(--kbq-sidepanel-size-panel-viewport-margin);
24
+ }
25
+ }
26
+ }
14
27
 
15
- .kbq-sidepanel-indent {
16
- height: 16px;
17
- width: 100%;
28
+ & {
29
+ transform-origin: center #{map.get($opposite-sides, $selected-side)};
18
30
  }
19
31
  }
20
32
 
@@ -51,10 +63,24 @@
51
63
  }
52
64
 
53
65
  .kbq-sidepanel-indent {
54
- width: 16px;
66
+ width: var(--kbq-sidepanel-size-panel-lower-offset);
55
67
  height: 100%;
56
68
  }
57
69
  }
70
+
71
+ &.kbq-sidepanel-container_top,
72
+ &.kbq-sidepanel-container_bottom {
73
+ flex-direction: column;
74
+ height: 33%;
75
+ min-height: 400px;
76
+ width: calc(100% - 2 * var(--kbq-sidepanel-size-panel-viewport-margin));
77
+ left: 0;
78
+
79
+ .kbq-sidepanel-indent {
80
+ height: var(--kbq-sidepanel-size-panel-lower-offset);
81
+ width: 100%;
82
+ }
83
+ }
58
84
  }
59
85
 
60
86
  .kbq-sidepanel-container_right {
@@ -64,6 +90,8 @@
64
90
  .kbq-sidepanel-wrapper {
65
91
  flex-direction: row;
66
92
  }
93
+
94
+ @include _sidepanel-container(right);
67
95
  }
68
96
 
69
97
  .kbq-sidepanel-container_left {
@@ -73,6 +101,8 @@
73
101
  .kbq-sidepanel-wrapper {
74
102
  flex-direction: row-reverse;
75
103
  }
104
+
105
+ @include _sidepanel-container(left);
76
106
  }
77
107
 
78
108
  .kbq-sidepanel-container_top {
@@ -82,6 +112,8 @@
82
112
  .kbq-sidepanel-wrapper {
83
113
  flex-direction: column-reverse;
84
114
  }
115
+
116
+ @include _sidepanel-container(top);
85
117
  }
86
118
 
87
119
  .kbq-sidepanel-container_bottom {
@@ -91,6 +123,8 @@
91
123
  .kbq-sidepanel-wrapper {
92
124
  flex-direction: column;
93
125
  }
126
+
127
+ @include _sidepanel-container(bottom);
94
128
  }
95
129
 
96
130
  .kbq-sidepanel-wrapper {
@@ -98,11 +132,31 @@
98
132
  flex: 1;
99
133
  min-height: 0;
100
134
  width: 100%;
135
+ position: relative;
101
136
  }
102
137
 
103
138
  .kbq-sidepanel-indent {
104
139
  display: flex;
105
140
  flex: 0 0 auto;
141
+ cursor: pointer;
142
+
143
+ position: absolute;
144
+
145
+ .kbq-sidepanel-container_top & {
146
+ bottom: $indent-offset;
147
+ }
148
+
149
+ .kbq-sidepanel-container_right & {
150
+ left: $indent-offset;
151
+ }
152
+
153
+ .kbq-sidepanel-container_bottom & {
154
+ top: $indent-offset;
155
+ }
156
+
157
+ .kbq-sidepanel-container_left & {
158
+ right: $indent-offset;
159
+ }
106
160
  }
107
161
 
108
162
  .kbq-sidepanel-content {
@@ -112,6 +166,7 @@
112
166
  min-height: 0;
113
167
  min-width: 0;
114
168
  width: 100%;
169
+ border-radius: var(--kbq-size-border-radius);
115
170
  }
116
171
 
117
172
  .kbq-sidepanel-header {
@@ -121,6 +176,7 @@
121
176
 
122
177
  flex-flow: row nowrap;
123
178
  flex: 0 0 auto;
179
+ transition: box-shadow 100ms ease-in-out;
124
180
 
125
181
  padding: var(--kbq-sidepanel-size-header-padding-vertical) var(--kbq-sidepanel-size-header-padding-right)
126
182
  var(--kbq-sidepanel-size-header-padding-vertical) var(--kbq-sidepanel-size-header-padding-left);
@@ -136,6 +192,10 @@
136
192
  @include common.kbq-truncate-line();
137
193
  }
138
194
  }
195
+
196
+ &.kbq-sidepanel-header_bottom-overflown {
197
+ box-shadow: var(--kbq-shadow-overflow-normal-bottom);
198
+ }
139
199
  }
140
200
 
141
201
  .kbq-sidepanel-title {
@@ -149,13 +209,8 @@
149
209
  flex-direction: column;
150
210
  min-height: 0;
151
211
 
152
- padding-top: var(--kbq-sidepanel-size-content-padding-top);
153
-
154
- padding-right: var(--kbq-sidepanel-size-content-padding-horizontal);
155
-
156
- padding-left: var(--kbq-sidepanel-size-content-padding-horizontal);
157
-
158
- padding-bottom: var(--kbq-sidepanel-size-content-padding-bottom);
212
+ padding: var(--kbq-sidepanel-size-content-padding-top) var(--kbq-sidepanel-size-content-padding-horizontal)
213
+ var(--kbq-sidepanel-size-content-padding-bottom);
159
214
  }
160
215
 
161
216
  .kbq-sidepanel-footer {
@@ -165,6 +220,7 @@
165
220
 
166
221
  flex-flow: row nowrap;
167
222
  flex: 0 0 auto;
223
+ transition: box-shadow 100ms ease-in-out;
168
224
 
169
225
  padding: var(--kbq-sidepanel-size-footer-padding-top) var(--kbq-sidepanel-size-footer-padding-horizontal)
170
226
  var(--kbq-sidepanel-size-footer-padding-bottom);
@@ -185,6 +241,10 @@
185
241
 
186
242
  gap: var(--kbq-sidepanel-size-footer-content-gap-horizontal);
187
243
  }
244
+
245
+ &.kbq-sidepanel-footer_top-overflown {
246
+ box-shadow: var(--kbq-shadow-overflow-normal-top);
247
+ }
188
248
  }
189
249
 
190
250
  @include kbq-sidepanel-theme();
@@ -47,11 +47,13 @@ export declare class KbqSidepanelService implements OnDestroy {
47
47
  private closeSidepanels;
48
48
  private getBackdropClass;
49
49
  private getOpenedSidepanelsWithSamePosition;
50
+ private updateAnimationState;
50
51
  /**
51
52
  * Removes a sidepanel from the array of open sidepanels.
52
53
  * @param sidepanelRef Sidepanel to be removed.
53
54
  */
54
55
  private removeOpenSidepanel;
56
+ private getLowerSidepanelsWithSamePosition;
55
57
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqSidepanelService, [null, null, { optional: true; }, { optional: true; skipSelf: true; }]>;
56
58
  static ɵprov: i0.ɵɵInjectableDeclaration<KbqSidepanelService>;
57
59
  }
@@ -0,0 +1,2 @@
1
+ export * from './module';
2
+ export * from './skeleton';
@@ -0,0 +1,7 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./skeleton";
3
+ export declare class KbqSkeletonModule {
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<KbqSkeletonModule, never>;
5
+ static ɵmod: i0.ɵɵNgModuleDeclaration<KbqSkeletonModule, never, [typeof i1.KbqSkeleton], [typeof i1.KbqSkeleton]>;
6
+ static ɵinj: i0.ɵɵInjectorDeclaration<KbqSkeletonModule>;
7
+ }
@@ -0,0 +1,8 @@
1
+ import * as i0 from "@angular/core";
2
+ /**
3
+ * Component representing a skeleton placeholder.
4
+ */
5
+ export declare class KbqSkeleton {
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<KbqSkeleton, never>;
7
+ static ɵcmp: i0.ɵɵComponentDeclaration<KbqSkeleton, "kbq-skeleton", ["kbqSkeleton"], {}, {}, never, never, true, never>;
8
+ }
@@ -0,0 +1,41 @@
1
+ @keyframes wave {
2
+ from {
3
+ transform: translateX(calc(var(--kbq-skeleton-wave-width) * -1));
4
+ }
5
+
6
+ to {
7
+ transform: translateX(100vw);
8
+ }
9
+ }
10
+
11
+ .kbq-skeleton {
12
+ --kbq-skeleton-min-height: var(--kbq-size-l);
13
+ --kbq-skeleton-animation-duration: 1.2s;
14
+ --kbq-skeleton-border-radius: var(--kbq-size-xxs);
15
+ --kbq-skeleton-wave-width: 100px;
16
+
17
+ position: relative;
18
+ display: flex;
19
+ min-height: var(--kbq-skeleton-min-height);
20
+ border-radius: var(--kbq-skeleton-border-radius);
21
+ background-color: var(--kbq-skeleton-background);
22
+ overflow: hidden;
23
+ clip-path: inset(0);
24
+ user-select: none;
25
+ pointer-events: none;
26
+
27
+ &::after {
28
+ content: '';
29
+ position: fixed;
30
+ inset-block: 0;
31
+ left: calc(var(--kbq-skeleton-wave-width) * -1);
32
+ width: var(--kbq-skeleton-wave-width);
33
+ background: linear-gradient(
34
+ 90deg,
35
+ var(--kbq-skeleton-animation-wave-start) 0%,
36
+ var(--kbq-skeleton-animation-wave-center) 50%,
37
+ var(--kbq-skeleton-animation-wave-end) 100%
38
+ );
39
+ animation: wave var(--kbq-skeleton-animation-duration) ease-in infinite;
40
+ }
41
+ }
@@ -154,6 +154,11 @@ export declare class KbqTagList implements KbqFormFieldControl<any>, ControlValu
154
154
  selectable: boolean;
155
155
  /** Whether the tags in the list are editable. */
156
156
  editable: boolean;
157
+ /**
158
+ * Whether to emit change events when tags are added/removed.
159
+ * Set to `false` to prevent the form control from being marked as dirty during programmatic updates.
160
+ */
161
+ emitOnTagChanges: boolean;
157
162
  /** Whether the tags in the list are removable. */
158
163
  get removable(): boolean;
159
164
  set removable(value: boolean);
@@ -352,11 +357,12 @@ export declare class KbqTagList implements KbqFormFieldControl<any>, ControlValu
352
357
  private syncDropListDisabledState;
353
358
  private setupFocusMonitor;
354
359
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqTagList, [null, null, null, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; self: true; }]>;
355
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqTagList, "kbq-tag-list", ["kbqTagList"], { "multiple": { "alias": "multiple"; "required": false; }; "compareWith": { "alias": "compareWith"; "required": false; }; "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; }; "editable": { "alias": "editable"; "required": false; }; "removable": { "alias": "removable"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; }, { "dropped": "dropped"; "valueChange": "valueChange"; "change": "change"; }, ["cleaner", "tags"], ["*", "kbq-cleaner"], true, [{ directive: typeof i1.CdkDropList; inputs: {}; outputs: {}; }]>;
360
+ static ɵcmp: i0.ɵɵComponentDeclaration<KbqTagList, "kbq-tag-list", ["kbqTagList"], { "multiple": { "alias": "multiple"; "required": false; }; "compareWith": { "alias": "compareWith"; "required": false; }; "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; }; "editable": { "alias": "editable"; "required": false; }; "emitOnTagChanges": { "alias": "emitOnTagChanges"; "required": false; }; "removable": { "alias": "removable"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; }, { "dropped": "dropped"; "valueChange": "valueChange"; "change": "change"; }, ["cleaner", "tags"], ["*", "kbq-cleaner"], true, [{ directive: typeof i1.CdkDropList; inputs: {}; outputs: {}; }]>;
356
361
  static ngAcceptInputType_multiple: unknown;
357
362
  static ngAcceptInputType_disabled: unknown;
358
363
  static ngAcceptInputType_draggable: unknown;
359
364
  static ngAcceptInputType_selectable: unknown;
360
365
  static ngAcceptInputType_editable: unknown;
366
+ static ngAcceptInputType_emitOnTagChanges: unknown;
361
367
  static ngAcceptInputType_removable: unknown;
362
368
  }
@@ -72,6 +72,8 @@ export declare class KbqTagEditSubmit {
72
72
  export declare class KbqTagEditInput {
73
73
  private readonly tag;
74
74
  /** @docs-private */
75
+ protected handleClick(event: MouseEvent): void;
76
+ /** @docs-private */
75
77
  protected handleKeydown(event: KeyboardEvent): void;
76
78
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqTagEditInput, never>;
77
79
  static ɵdir: i0.ɵɵDirectiveDeclaration<KbqTagEditInput, "[kbqTagEditInput]", ["kbqTagEditInput"], {}, {}, never, never, true, [{ directive: typeof i1.KbqFieldSizingContent; inputs: {}; outputs: {}; }]>;
@@ -108,6 +108,10 @@ export declare class KbqTooltipTrigger extends KbqPopUpTrigger<KbqTooltipCompone
108
108
  static ngAcceptInputType_arrow: unknown;
109
109
  static ngAcceptInputType_offset: unknown;
110
110
  }
111
+ /**
112
+ * @docs-private
113
+ * @deprecated Will be removed in next major release
114
+ */
111
115
  export declare class KbqWarningTooltipTrigger extends KbqTooltipTrigger {
112
116
  get content(): string | TemplateRef<any>;
113
117
  set content(content: string | TemplateRef<any>);
@@ -115,6 +119,10 @@ export declare class KbqWarningTooltipTrigger extends KbqTooltipTrigger {
115
119
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqWarningTooltipTrigger, never>;
116
120
  static ɵdir: i0.ɵɵDirectiveDeclaration<KbqWarningTooltipTrigger, "[kbqWarningTooltip]", ["kbqWarningTooltip"], { "content": { "alias": "kbqWarningTooltip"; "required": false; }; }, {}, never, never, true, never>;
117
121
  }
122
+ /**
123
+ * @docs-private
124
+ * @deprecated Will be removed in next major release
125
+ */
118
126
  export declare class KbqExtendedTooltipTrigger extends KbqTooltipTrigger {
119
127
  get content(): string | TemplateRef<any>;
120
128
  set content(content: string | TemplateRef<any>);
@@ -40,7 +40,8 @@ export declare class KbqTreeNavigationChange<T> {
40
40
  export declare class KbqTreeSelectionChange<T> {
41
41
  source: KbqTreeSelection;
42
42
  option: T;
43
- constructor(source: KbqTreeSelection, option: T);
43
+ options?: T[] | undefined;
44
+ constructor(source: KbqTreeSelection, option: T, options?: T[] | undefined);
44
45
  }
45
46
  interface SelectionModelOption {
46
47
  id: number | string;