@koobiq/components 21.0.1 → 21.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 (180) hide show
  1. package/badge/_badge-theme.scss +31 -0
  2. package/breadcrumbs/breadcrumbs.scss +5 -1
  3. package/checkbox/_checkbox-theme.scss +0 -17
  4. package/checkbox/checkbox-tokens.scss +0 -4
  5. package/code-block/_code-block-theme.scss +7 -6
  6. package/code-block/code-block-tokens.scss +8 -4
  7. package/code-block/code-block.scss +54 -32
  8. package/content-panel/content-panel-header.scss +2 -3
  9. package/content-panel/content-panel.scss +3 -0
  10. package/core/selection/pseudo-checkbox/pseudo-checkbox-tokens.scss +0 -2
  11. package/fesm2022/koobiq-components-accordion.mjs +4 -4
  12. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  13. package/fesm2022/koobiq-components-actions-panel.mjs +10 -2
  14. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  15. package/fesm2022/koobiq-components-app-switcher.mjs +1 -1
  16. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  17. package/fesm2022/koobiq-components-badge.mjs +2 -2
  18. package/fesm2022/koobiq-components-badge.mjs.map +1 -1
  19. package/fesm2022/koobiq-components-breadcrumbs.mjs +2 -2
  20. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  21. package/fesm2022/koobiq-components-button-toggle.mjs +1 -1
  22. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  23. package/fesm2022/koobiq-components-checkbox.mjs +18 -8
  24. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  25. package/fesm2022/koobiq-components-clamped-text.mjs +78 -10
  26. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
  27. package/fesm2022/koobiq-components-code-block.mjs +63 -379
  28. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  29. package/fesm2022/koobiq-components-content-panel.mjs +4 -4
  30. package/fesm2022/koobiq-components-content-panel.mjs.map +1 -1
  31. package/fesm2022/koobiq-components-core.mjs +300 -37
  32. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  33. package/fesm2022/koobiq-components-datepicker.mjs +151 -60
  34. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  35. package/fesm2022/koobiq-components-divider.mjs +3 -3
  36. package/fesm2022/koobiq-components-divider.mjs.map +1 -1
  37. package/fesm2022/koobiq-components-dropdown.mjs +3 -3
  38. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  39. package/fesm2022/koobiq-components-file-upload.mjs +17 -8
  40. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  41. package/fesm2022/koobiq-components-filter-bar.mjs +115 -36
  42. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  43. package/fesm2022/koobiq-components-flag.mjs +3 -3
  44. package/fesm2022/koobiq-components-flag.mjs.map +1 -1
  45. package/fesm2022/koobiq-components-form-field.mjs +90 -27
  46. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  47. package/fesm2022/koobiq-components-icon.mjs +2 -2
  48. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  49. package/fesm2022/koobiq-components-inline-edit.mjs +19 -2
  50. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  51. package/fesm2022/koobiq-components-input.mjs +76 -17
  52. package/fesm2022/koobiq-components-input.mjs.map +1 -1
  53. package/fesm2022/koobiq-components-list.mjs +1 -1
  54. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  55. package/fesm2022/koobiq-components-modal.mjs +3 -3
  56. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  57. package/fesm2022/koobiq-components-navbar.mjs +86 -25
  58. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  59. package/fesm2022/koobiq-components-notification-center.mjs +4 -4
  60. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  61. package/fesm2022/koobiq-components-overflow-items.mjs +116 -38
  62. package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
  63. package/fesm2022/koobiq-components-popover.mjs +86 -7
  64. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  65. package/fesm2022/koobiq-components-radio.mjs +41 -19
  66. package/fesm2022/koobiq-components-radio.mjs.map +1 -1
  67. package/fesm2022/koobiq-components-search-expandable.mjs +29 -17
  68. package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
  69. package/fesm2022/koobiq-components-select.mjs +49 -12
  70. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  71. package/fesm2022/koobiq-components-sidepanel.mjs +198 -186
  72. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  73. package/fesm2022/koobiq-components-splitter.mjs +49 -25
  74. package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
  75. package/fesm2022/koobiq-components-tabs.mjs +30 -11
  76. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  77. package/fesm2022/koobiq-components-tags.mjs +1 -1
  78. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  79. package/fesm2022/koobiq-components-textarea.mjs +28 -11
  80. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  81. package/fesm2022/koobiq-components-time-range.mjs +2 -2
  82. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  83. package/fesm2022/koobiq-components-timepicker.mjs +71 -16
  84. package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
  85. package/fesm2022/koobiq-components-timezone.mjs +2 -2
  86. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  87. package/fesm2022/koobiq-components-toast.mjs +2 -2
  88. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  89. package/fesm2022/koobiq-components-toggle.mjs +25 -9
  90. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  91. package/fesm2022/koobiq-components-tooltip.mjs +90 -17
  92. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  93. package/fesm2022/koobiq-components-top-bar.mjs +27 -7
  94. package/fesm2022/koobiq-components-top-bar.mjs.map +1 -1
  95. package/fesm2022/koobiq-components-tree-select.mjs +4 -4
  96. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  97. package/fesm2022/koobiq-components-tree.mjs +71 -27
  98. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  99. package/file-upload/_file-upload-theme.scss +0 -12
  100. package/file-upload/file-upload-tokens.scss +0 -1
  101. package/file-upload/file-upload.scss +0 -1
  102. package/filter-bar/_filter-bar-theme.scss +7 -8
  103. package/filter-bar/filter-bar.scss +0 -1
  104. package/filter-bar/pipes/base-pipe.scss +36 -2
  105. package/filter-bar/pipes/pipe-multi-tree-select.scss +27 -0
  106. package/form-field/_fieldset-theme.scss +2 -7
  107. package/form-field/_form-field-theme.scss +9 -22
  108. package/form-field/_hint-theme.scss +20 -0
  109. package/form-field/fieldset-tokens.scss +0 -1
  110. package/form-field/fieldset.scss +0 -3
  111. package/form-field/form-field-tokens.scss +1 -1
  112. package/form-field/form-field.scss +9 -0
  113. package/form-field/hint-tokens.scss +3 -0
  114. package/modal/modal.scss +2 -0
  115. package/navbar/_navbar-item_vertical.scss +48 -2
  116. package/navbar/_navbar-theme.scss +11 -3
  117. package/navbar/navbar-item.scss +17 -0
  118. package/navbar/navbar-tokens.scss +3 -0
  119. package/package.json +4 -4
  120. package/popover/popover.scss +1 -1
  121. package/radio/_radio-theme.scss +0 -30
  122. package/radio/radio-tokens.scss +0 -2
  123. package/schematics/migrations/deprecated-icons/README.md +21 -5
  124. package/schematics/migrations/deprecated-icons/index.cjs +8 -22
  125. package/schematics/migrations/deprecated-icons/schema.json +1 -1
  126. package/schematics/migrations/icons-replacement/README.md +16 -2
  127. package/schematics/migrations/icons-replacement/index.cjs +18 -16
  128. package/schematics/migrations/icons-replacement/schema.json +12 -3
  129. package/schematics/migrations/new-icons-pack/README.md +37 -25
  130. package/schematics/migrations/new-icons-pack/index.cjs +22 -32
  131. package/schematics/migrations/new-icons-pack/replacement.json +2 -14
  132. package/schematics/migrations/new-icons-pack/schema.json +3 -3
  133. package/schematics/ng-add/index.cjs +4 -4
  134. package/schematics/utils/custom-data.cjs +64 -0
  135. package/schematics/utils/icon-migration.cjs +9 -3
  136. package/schematics/utils/messages.cjs +4 -0
  137. package/schematics/utils/package-config.cjs +19 -0
  138. package/select/select.scss +7 -0
  139. package/tabs/_tabs-common.scss +23 -0
  140. package/textarea/textarea-tokens.scss +4 -1
  141. package/toast/toast.component.scss +1 -0
  142. package/toggle/_toggle-theme.scss +0 -17
  143. package/tooltip/tooltip.scss +1 -1
  144. package/top-bar/top-bar-tokens.scss +1 -0
  145. package/top-bar/top-bar.scss +10 -0
  146. package/types/koobiq-components-accordion.d.ts +25 -0
  147. package/types/koobiq-components-button-toggle.d.ts +6 -0
  148. package/types/koobiq-components-checkbox.d.ts +30 -0
  149. package/types/koobiq-components-clamped-text.d.ts +16 -3
  150. package/types/koobiq-components-code-block.d.ts +17 -3
  151. package/types/koobiq-components-core.d.ts +226 -13
  152. package/types/koobiq-components-datepicker.d.ts +28 -1
  153. package/types/koobiq-components-divider.d.ts +28 -10
  154. package/types/koobiq-components-dropdown.d.ts +19 -0
  155. package/types/koobiq-components-filter-bar.d.ts +77 -4
  156. package/types/koobiq-components-flag.d.ts +18 -0
  157. package/types/koobiq-components-form-field.d.ts +87 -6
  158. package/types/koobiq-components-icon.d.ts +15 -0
  159. package/types/koobiq-components-inline-edit.d.ts +8 -1
  160. package/types/koobiq-components-input.d.ts +22 -3
  161. package/types/koobiq-components-list.d.ts +6 -0
  162. package/types/koobiq-components-modal.d.ts +7 -0
  163. package/types/koobiq-components-navbar.d.ts +71 -7
  164. package/types/koobiq-components-notification-center.d.ts +13 -0
  165. package/types/koobiq-components-overflow-items.d.ts +26 -2
  166. package/types/koobiq-components-popover.d.ts +38 -3
  167. package/types/koobiq-components-radio.d.ts +30 -0
  168. package/types/koobiq-components-search-expandable.d.ts +10 -0
  169. package/types/koobiq-components-select.d.ts +36 -4
  170. package/types/koobiq-components-sidepanel.d.ts +52 -1
  171. package/types/koobiq-components-splitter.d.ts +13 -4
  172. package/types/koobiq-components-tabs.d.ts +4 -0
  173. package/types/koobiq-components-tags.d.ts +6 -0
  174. package/types/koobiq-components-textarea.d.ts +9 -2
  175. package/types/koobiq-components-timepicker.d.ts +15 -0
  176. package/types/koobiq-components-toggle.d.ts +30 -0
  177. package/types/koobiq-components-tooltip.d.ts +55 -10
  178. package/types/koobiq-components-top-bar.d.ts +11 -3
  179. package/types/koobiq-components-tree-select.d.ts +12 -0
  180. package/types/koobiq-components-tree.d.ts +37 -2
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, ElementRef, ChangeDetectorRef, Injector, signal, viewChild, computed, afterNextRender, ViewEncapsulation, ChangeDetectionStrategy, Component, untracked, Renderer2, input, Directive, booleanAttribute, effect, isDevMode, TemplateRef, Injectable, NgModule } from '@angular/core';
2
+ import { InjectionToken, inject, ElementRef, ChangeDetectorRef, Injector, signal, viewChild, computed, afterNextRender, ViewEncapsulation, ChangeDetectionStrategy, Component, untracked, isDevMode, TemplateRef, Injectable, Renderer2, input, Directive, booleanAttribute, effect, NgModule } from '@angular/core';
3
3
  import { CdkTrapFocus, ConfigurableFocusTrapFactory, FocusTrapFactory, A11yModule } from '@angular/cdk/a11y';
4
4
  import { BasePortalOutlet, CdkPortalOutlet, TemplatePortal, ComponentPortal, PortalModule } from '@angular/cdk/portal';
5
5
  import * as i1 from '@koobiq/components/core';
6
- import { kbqAnimationsDisabled, kbqAfterAnimations, ESCAPE, isHtmlElement, KbqLocaleOverridesDirective, KBQ_A11Y_LOCALE_CONFIGURATION, KbqOverflowShadowContainer, KBQ_STATE_STORE, KbqStateSavingService } from '@koobiq/components/core';
6
+ import { kbqAnimationsDisabled, kbqAfterAnimations, ESCAPE, isHtmlElement, KBQ_STATE_STORE, KbqStateSavingService, KbqLocaleOverridesDirective, KBQ_A11Y_LOCALE_CONFIGURATION, KbqOverflowShadowContainer } from '@koobiq/components/core';
7
7
  import { Subject, merge } from 'rxjs';
8
8
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
9
  import * as i2 from '@koobiq/components/button';
@@ -46,7 +46,7 @@ class KbqSidepanelConfig {
46
46
  }
47
47
  }
48
48
 
49
- /** @internal */
49
+ /** @docs-private */
50
50
  var KbqSidepanelAnimationState;
51
51
  (function (KbqSidepanelAnimationState) {
52
52
  KbqSidepanelAnimationState["Void"] = "void";
@@ -106,13 +106,13 @@ class KbqSidepanelContainerComponent extends BasePortalOutlet {
106
106
  /**
107
107
  * The state of the sidepanel: on screen, closing, or stacked under another one.
108
108
  *
109
- * @internal
109
+ * @docs-private
110
110
  */
111
111
  this.animationState = signal(KbqSidepanelAnimationState.Void, ...(ngDevMode ? [{ debugName: "animationState" }] : /* istanbul ignore next */ []));
112
112
  /**
113
113
  * Reports each state transition starting and ending.
114
114
  *
115
- * @internal
115
+ * @docs-private
116
116
  */
117
117
  this.animationStateChanged = new Subject();
118
118
  /** Transition events held until the render that applies the state, in the order they happened. */
@@ -122,7 +122,7 @@ class KbqSidepanelContainerComponent extends BasePortalOutlet {
122
122
  /**
123
123
  * Transform of the panel in its current state.
124
124
  *
125
- * @internal
125
+ * @docs-private
126
126
  */
127
127
  this.stateTransform = computed(() => {
128
128
  const transforms = kbqSidepanelTransformAnimation[this.position];
@@ -144,7 +144,7 @@ class KbqSidepanelContainerComponent extends BasePortalOutlet {
144
144
  /**
145
145
  * Opacity of the panel in its current state.
146
146
  *
147
- * @internal
147
+ * @docs-private
148
148
  */
149
149
  this.stateOpacity = computed(() => {
150
150
  switch (this.animationState()) {
@@ -236,7 +236,7 @@ class KbqSidepanelContainerComponent extends BasePortalOutlet {
236
236
  return;
237
237
  this.setAnimationState(KbqSidepanelAnimationState.Hidden);
238
238
  }
239
- /** @internal */
239
+ /** @docs-private */
240
240
  setAnimationState(state) {
241
241
  if (this.destroyed)
242
242
  return;
@@ -447,184 +447,6 @@ class KbqSidepanelRef {
447
447
  }
448
448
  }
449
449
 
450
- /**
451
- * Button that will close the current sidepanel.
452
- */
453
- class KbqSidepanelClose {
454
- constructor() {
455
- // `CdkPortalOutlet.attachTemplatePortal()` forwards the portal injector to the embedded view, so the
456
- // ref is reachable from a `<ng-template>` sidepanel as well as from a component one.
457
- this.sidepanelRef = inject(KbqSidepanelRef);
458
- this.elementRef = inject(ElementRef);
459
- this.renderer = inject(Renderer2);
460
- /** Value handed to `KbqSidepanelRef.close()`, under the hyphenated spelling of the selector. */
461
- this.sidepanelResult = input(undefined, { ...(ngDevMode ? { debugName: "sidepanelResult" } : /* istanbul ignore next */ {}), alias: 'kbq-sidepanel-close' });
462
- /** The same value, under the camel-case spelling. */
463
- this.kbqSidepanelClose = input(...(ngDevMode ? [undefined, { debugName: "kbqSidepanelClose" }] : /* istanbul ignore next */ []));
464
- afterNextRender(() => {
465
- // A button with no type submits the form it sits in, so closing a sidepanel from inside a form would
466
- // submit it too. A type the author set is left alone. The element carries its static attributes by
467
- // the time a directive is constructed, so this needs no lifecycle hook.
468
- if (!this.elementRef.nativeElement.hasAttribute('type')) {
469
- this.renderer.setAttribute(this.elementRef.nativeElement, 'type', 'button');
470
- }
471
- });
472
- }
473
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelClose, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
474
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.25", type: KbqSidepanelClose, isStandalone: true, selector: "button[kbq-sidepanel-close], button[kbqSidepanelClose]", inputs: { sidepanelResult: { classPropertyName: "sidepanelResult", publicName: "kbq-sidepanel-close", isSignal: true, isRequired: false, transformFunction: null }, kbqSidepanelClose: { classPropertyName: "kbqSidepanelClose", publicName: "kbqSidepanelClose", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "sidepanelRef.close(kbqSidepanelClose() ?? sidepanelResult())" }, classAttribute: "kbq-sidepanel-close" }, ngImport: i0 }); }
475
- }
476
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelClose, decorators: [{
477
- type: Directive,
478
- args: [{
479
- selector: 'button[kbq-sidepanel-close], button[kbqSidepanelClose]',
480
- host: {
481
- class: 'kbq-sidepanel-close',
482
- // The camel-case spelling wins when a template binds both, as it did before.
483
- '(click)': 'sidepanelRef.close(kbqSidepanelClose() ?? sidepanelResult())'
484
- }
485
- }]
486
- }], ctorParameters: () => [], propDecorators: { sidepanelResult: [{ type: i0.Input, args: [{ isSignal: true, alias: "kbq-sidepanel-close", required: false }] }], kbqSidepanelClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "kbqSidepanelClose", required: false }] }] } });
487
- /**
488
- * Header of a sidepanel.
489
- */
490
- class KbqSidepanelHeader {
491
- constructor() {
492
- /** Accessible name for the icon-only close button. */
493
- this.a11yLocaleConfiguration = inject(KbqLocaleOverridesDirective, { self: true }).read('a11y', KBQ_A11Y_LOCALE_CONFIGURATION);
494
- /** Add button for close sidepanel. Default false */
495
- this.closeable = input(false, { ...(ngDevMode ? { debugName: "closeable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
496
- /** Enables text truncation. Default true */
497
- this.truncateText = input(true, { ...(ngDevMode ? { debugName: "truncateText" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
498
- /** @docs-private */
499
- this.sidepanelRef = inject(KbqSidepanelRef);
500
- /** Id of the title element, which is what names the sidepanel to assistive technology. */
501
- this.titleId = `${this.sidepanelRef.id}-title`;
502
- this.sidepanelRef.containerInstance.setAriaLabelledBy(this.titleId);
503
- }
504
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelHeader, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
505
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.25", type: KbqSidepanelHeader, isStandalone: true, selector: "kbq-sidepanel-header", inputs: { closeable: { classPropertyName: "closeable", publicName: "closeable", isSignal: true, isRequired: false, transformFunction: null }, truncateText: { classPropertyName: "truncateText", publicName: "truncateText", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.kbq-sidepanel-header_truncate-text": "truncateText()", "style.box-shadow": "sidepanelRef.bodyOverflow().top ? \"var(--kbq-shadow-overflow-normal-bottom)\" : null" }, classAttribute: "kbq-sidepanel-header" }, hostDirectives: [{ directive: i1.KbqLocaleOverridesDirective, inputs: ["kbqLocaleOverrides", "localeOverrides"] }], ngImport: i0, template: `
506
- <div class="kbq-sidepanel-title" kbq-title [attr.id]="titleId">
507
- <ng-content />
508
- </div>
509
-
510
- @if (closeable()) {
511
- <button
512
- kbq-button
513
- kbq-sidepanel-close
514
- type="button"
515
- [attr.aria-label]="a11yLocaleConfiguration().close"
516
- [color]="'contrast'"
517
- [kbqStyle]="'transparent'"
518
- >
519
- <i kbq-icon="kbq-xmark_16" [color]="'contrast'"></i>
520
- </button>
521
- }
522
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: KbqButtonModule }, { kind: "component", type: i2.KbqButton, selector: "[kbq-button]", inputs: ["kbqStyle", "disabled", "tabIndex"] }, { kind: "directive", type: i2.KbqButtonCssStyler, selector: "[kbq-button]" }, { kind: "directive", type: KbqSidepanelClose, selector: "button[kbq-sidepanel-close], button[kbqSidepanelClose]", inputs: ["kbq-sidepanel-close", "kbqSidepanelClose"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i3.KbqIcon, selector: "[kbq-icon]", inputs: ["aria-hidden", "iconSize", "autoColor", "kbq-icon"] }, { kind: "directive", type: KbqTitleDirective, selector: "[kbq-title]", inputs: ["kbq-title", "ignoreTooltipPointerEvents"], exportAs: ["kbqTitle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
523
- }
524
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelHeader, decorators: [{
525
- type: Component,
526
- args: [{
527
- selector: 'kbq-sidepanel-header',
528
- imports: [
529
- KbqButtonModule,
530
- KbqSidepanelClose,
531
- KbqIconModule,
532
- KbqTitleDirective
533
- ],
534
- template: `
535
- <div class="kbq-sidepanel-title" kbq-title [attr.id]="titleId">
536
- <ng-content />
537
- </div>
538
-
539
- @if (closeable()) {
540
- <button
541
- kbq-button
542
- kbq-sidepanel-close
543
- type="button"
544
- [attr.aria-label]="a11yLocaleConfiguration().close"
545
- [color]="'contrast'"
546
- [kbqStyle]="'transparent'"
547
- >
548
- <i kbq-icon="kbq-xmark_16" [color]="'contrast'"></i>
549
- </button>
550
- }
551
- `,
552
- changeDetection: ChangeDetectionStrategy.OnPush,
553
- host: {
554
- class: 'kbq-sidepanel-header',
555
- '[class.kbq-sidepanel-header_truncate-text]': 'truncateText()',
556
- '[style.box-shadow]': 'sidepanelRef.bodyOverflow().top ? "var(--kbq-shadow-overflow-normal-bottom)" : null'
557
- },
558
- hostDirectives: [
559
- { directive: KbqLocaleOverridesDirective, inputs: ['kbqLocaleOverrides: localeOverrides'] }
560
- ]
561
- }]
562
- }], ctorParameters: () => [], propDecorators: { closeable: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeable", required: false }] }], truncateText: [{ type: i0.Input, args: [{ isSignal: true, alias: "truncateText", required: false }] }] } });
563
- /**
564
- * Scrollable content container of a sidepanel.
565
- */
566
- class KbqSidepanelBody {
567
- constructor() {
568
- this.sidepanelRef = inject(KbqSidepanelRef);
569
- this.overflowContainer = inject(KbqOverflowShadowContainer);
570
- this.scrollbarViewport = inject(KbqScrollbarViewport);
571
- effect(() => this.sidepanelRef.bodyOverflow.set(this.overflowContainer.overflow()));
572
- this.sidepanelRef
573
- .afterOpened()
574
- .pipe(takeUntilDestroyed())
575
- .subscribe(() => this.scrollbarViewport.flashScrollIndicators());
576
- }
577
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelBody, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
578
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.25", type: KbqSidepanelBody, isStandalone: true, selector: "kbq-sidepanel-body, [kbq-sidepanel-body], kbqSidepanelBody", host: { classAttribute: "kbq-sidepanel-body" }, hostDirectives: [{ directive: i1.KbqOverflowShadowContainer }, { directive: i4.KbqScrollbarViewport }], ngImport: i0 }); }
579
- }
580
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelBody, decorators: [{
581
- type: Directive,
582
- args: [{
583
- selector: 'kbq-sidepanel-body, [kbq-sidepanel-body], kbqSidepanelBody',
584
- host: {
585
- class: 'kbq-sidepanel-body'
586
- },
587
- hostDirectives: [KbqOverflowShadowContainer, KbqScrollbarViewport]
588
- }]
589
- }], ctorParameters: () => [] });
590
- /**
591
- * Footer of a sidepanel.
592
- */
593
- class KbqSidepanelFooter {
594
- constructor() {
595
- /** @docs-private */
596
- this.sidepanelRef = inject(KbqSidepanelRef);
597
- }
598
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
599
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.25", type: KbqSidepanelFooter, isStandalone: true, selector: "kbq-sidepanel-footer, [kbq-sidepanel-footer], kbqSidepanelFooter", host: { properties: { "style.box-shadow": "sidepanelRef.bodyOverflow().bottom ? \"var(--kbq-shadow-overflow-normal-top)\" : null" }, classAttribute: "kbq-sidepanel-footer" }, ngImport: i0 }); }
600
- }
601
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelFooter, decorators: [{
602
- type: Directive,
603
- args: [{
604
- selector: 'kbq-sidepanel-footer, [kbq-sidepanel-footer], kbqSidepanelFooter',
605
- host: {
606
- class: 'kbq-sidepanel-footer',
607
- '[style.box-shadow]': 'sidepanelRef.bodyOverflow().bottom ? "var(--kbq-shadow-overflow-normal-top)" : null'
608
- }
609
- }]
610
- }] });
611
- /**
612
- * Actions block of a sidepanel footer.
613
- */
614
- class KbqSidepanelActions {
615
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelActions, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
616
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.25", type: KbqSidepanelActions, isStandalone: true, selector: "kbq-sidepanel-actions, [kbq-sidepanel-actions], kbqSidepanelActions", host: { classAttribute: "kbq-sidepanel-actions" }, ngImport: i0 }); }
617
- }
618
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelActions, decorators: [{
619
- type: Directive,
620
- args: [{
621
- selector: 'kbq-sidepanel-actions, [kbq-sidepanel-actions], kbqSidepanelActions',
622
- host: {
623
- class: 'kbq-sidepanel-actions'
624
- }
625
- }]
626
- }] });
627
-
628
450
  /** Injection token that can be used to specify default sidepanel options. */
629
451
  const KBQ_SIDEPANEL_DEFAULT_OPTIONS = new InjectionToken('kbq-sidepanel-default-options');
630
452
  /**
@@ -1064,6 +886,196 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
1064
886
  args: [{ providedIn: 'root' }]
1065
887
  }] });
1066
888
 
889
+ /**
890
+ * Button that will close the current sidepanel.
891
+ */
892
+ class KbqSidepanelClose {
893
+ /**
894
+ * Sidepanel the button closes: the one it is rendered in. A button rendered outside any sidepanel, such as
895
+ * an item of a dropdown opened from one, closes the sidepanel its template is declared in.
896
+ */
897
+ get sidepanelRef() {
898
+ const container = this.elementRef.nativeElement.closest('.kbq-sidepanel-container');
899
+ const renderedIn = container && this.sidepanelService.openedSidepanels.find(({ id }) => id === container.id);
900
+ const sidepanelRef = renderedIn ?? this.declaredSidepanelRef;
901
+ if (!sidepanelRef) {
902
+ throw Error('kbqSidepanelClose: the button is neither rendered nor declared inside a sidepanel.');
903
+ }
904
+ return sidepanelRef;
905
+ }
906
+ constructor() {
907
+ this.declaredSidepanelRef = inject(KbqSidepanelRef, { optional: true });
908
+ this.sidepanelService = inject(KbqSidepanelService);
909
+ this.elementRef = inject(ElementRef);
910
+ this.renderer = inject(Renderer2);
911
+ /** Value handed to `KbqSidepanelRef.close()`, under the hyphenated spelling of the selector. */
912
+ this.sidepanelResult = input(undefined, { ...(ngDevMode ? { debugName: "sidepanelResult" } : /* istanbul ignore next */ {}), alias: 'kbq-sidepanel-close' });
913
+ /** The same value, under the camel-case spelling. */
914
+ this.kbqSidepanelClose = input(...(ngDevMode ? [undefined, { debugName: "kbqSidepanelClose" }] : /* istanbul ignore next */ []));
915
+ afterNextRender(() => {
916
+ // A button with no type submits the form it sits in, so closing a sidepanel from inside a form would
917
+ // submit it too. A type the author set is left alone. The element carries its static attributes by
918
+ // the time a directive is constructed, so this needs no lifecycle hook.
919
+ if (!this.elementRef.nativeElement.hasAttribute('type')) {
920
+ this.renderer.setAttribute(this.elementRef.nativeElement, 'type', 'button');
921
+ }
922
+ });
923
+ }
924
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelClose, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
925
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.25", type: KbqSidepanelClose, isStandalone: true, selector: "button[kbq-sidepanel-close], button[kbqSidepanelClose]", inputs: { sidepanelResult: { classPropertyName: "sidepanelResult", publicName: "kbq-sidepanel-close", isSignal: true, isRequired: false, transformFunction: null }, kbqSidepanelClose: { classPropertyName: "kbqSidepanelClose", publicName: "kbqSidepanelClose", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "sidepanelRef.close(kbqSidepanelClose() ?? sidepanelResult())" }, classAttribute: "kbq-sidepanel-close" }, ngImport: i0 }); }
926
+ }
927
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelClose, decorators: [{
928
+ type: Directive,
929
+ args: [{
930
+ selector: 'button[kbq-sidepanel-close], button[kbqSidepanelClose]',
931
+ host: {
932
+ class: 'kbq-sidepanel-close',
933
+ // The camel-case spelling wins when a template binds both, as it did before.
934
+ '(click)': 'sidepanelRef.close(kbqSidepanelClose() ?? sidepanelResult())'
935
+ }
936
+ }]
937
+ }], ctorParameters: () => [], propDecorators: { sidepanelResult: [{ type: i0.Input, args: [{ isSignal: true, alias: "kbq-sidepanel-close", required: false }] }], kbqSidepanelClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "kbqSidepanelClose", required: false }] }] } });
938
+ /**
939
+ * Header of a sidepanel.
940
+ */
941
+ class KbqSidepanelHeader {
942
+ constructor() {
943
+ /** Accessible name for the icon-only close button. */
944
+ this.a11yLocaleConfiguration = inject(KbqLocaleOverridesDirective, { self: true }).read('a11y', KBQ_A11Y_LOCALE_CONFIGURATION);
945
+ /** Add button for close sidepanel. Default false */
946
+ this.closeable = input(false, { ...(ngDevMode ? { debugName: "closeable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
947
+ /** Enables text truncation. Default true */
948
+ this.truncateText = input(true, { ...(ngDevMode ? { debugName: "truncateText" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
949
+ /** @docs-private */
950
+ this.sidepanelRef = inject(KbqSidepanelRef);
951
+ /** Id of the title element, which is what names the sidepanel to assistive technology. */
952
+ this.titleId = `${this.sidepanelRef.id}-title`;
953
+ this.sidepanelRef.containerInstance.setAriaLabelledBy(this.titleId);
954
+ }
955
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelHeader, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
956
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.25", type: KbqSidepanelHeader, isStandalone: true, selector: "kbq-sidepanel-header", inputs: { closeable: { classPropertyName: "closeable", publicName: "closeable", isSignal: true, isRequired: false, transformFunction: null }, truncateText: { classPropertyName: "truncateText", publicName: "truncateText", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.kbq-sidepanel-header_truncate-text": "truncateText()", "style.box-shadow": "sidepanelRef.bodyOverflow().top ? \"var(--kbq-shadow-overflow-normal-bottom)\" : null" }, classAttribute: "kbq-sidepanel-header" }, hostDirectives: [{ directive: i1.KbqLocaleOverridesDirective, inputs: ["kbqLocaleOverrides", "localeOverrides"] }], ngImport: i0, template: `
957
+ <div class="kbq-sidepanel-title" kbq-title [attr.id]="titleId">
958
+ <ng-content />
959
+ </div>
960
+
961
+ @if (closeable()) {
962
+ <button
963
+ kbq-button
964
+ kbq-sidepanel-close
965
+ type="button"
966
+ [attr.aria-label]="a11yLocaleConfiguration().close"
967
+ [color]="'contrast'"
968
+ [kbqStyle]="'transparent'"
969
+ >
970
+ <i kbq-icon="kbq-xmark_16" [color]="'contrast'"></i>
971
+ </button>
972
+ }
973
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: KbqButtonModule }, { kind: "component", type: i2.KbqButton, selector: "[kbq-button]", inputs: ["kbqStyle", "disabled", "tabIndex"] }, { kind: "directive", type: i2.KbqButtonCssStyler, selector: "[kbq-button]" }, { kind: "directive", type: KbqSidepanelClose, selector: "button[kbq-sidepanel-close], button[kbqSidepanelClose]", inputs: ["kbq-sidepanel-close", "kbqSidepanelClose"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i3.KbqIcon, selector: "[kbq-icon]", inputs: ["aria-hidden", "iconSize", "autoColor", "kbq-icon"] }, { kind: "directive", type: KbqTitleDirective, selector: "[kbq-title]", inputs: ["kbq-title", "ignoreTooltipPointerEvents"], exportAs: ["kbqTitle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
974
+ }
975
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelHeader, decorators: [{
976
+ type: Component,
977
+ args: [{
978
+ selector: 'kbq-sidepanel-header',
979
+ imports: [
980
+ KbqButtonModule,
981
+ KbqSidepanelClose,
982
+ KbqIconModule,
983
+ KbqTitleDirective
984
+ ],
985
+ template: `
986
+ <div class="kbq-sidepanel-title" kbq-title [attr.id]="titleId">
987
+ <ng-content />
988
+ </div>
989
+
990
+ @if (closeable()) {
991
+ <button
992
+ kbq-button
993
+ kbq-sidepanel-close
994
+ type="button"
995
+ [attr.aria-label]="a11yLocaleConfiguration().close"
996
+ [color]="'contrast'"
997
+ [kbqStyle]="'transparent'"
998
+ >
999
+ <i kbq-icon="kbq-xmark_16" [color]="'contrast'"></i>
1000
+ </button>
1001
+ }
1002
+ `,
1003
+ changeDetection: ChangeDetectionStrategy.OnPush,
1004
+ host: {
1005
+ class: 'kbq-sidepanel-header',
1006
+ '[class.kbq-sidepanel-header_truncate-text]': 'truncateText()',
1007
+ '[style.box-shadow]': 'sidepanelRef.bodyOverflow().top ? "var(--kbq-shadow-overflow-normal-bottom)" : null'
1008
+ },
1009
+ hostDirectives: [
1010
+ { directive: KbqLocaleOverridesDirective, inputs: ['kbqLocaleOverrides: localeOverrides'] }
1011
+ ]
1012
+ }]
1013
+ }], ctorParameters: () => [], propDecorators: { closeable: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeable", required: false }] }], truncateText: [{ type: i0.Input, args: [{ isSignal: true, alias: "truncateText", required: false }] }] } });
1014
+ /**
1015
+ * Scrollable content container of a sidepanel.
1016
+ */
1017
+ class KbqSidepanelBody {
1018
+ constructor() {
1019
+ this.sidepanelRef = inject(KbqSidepanelRef);
1020
+ this.overflowContainer = inject(KbqOverflowShadowContainer);
1021
+ this.scrollbarViewport = inject(KbqScrollbarViewport);
1022
+ effect(() => this.sidepanelRef.bodyOverflow.set(this.overflowContainer.overflow()));
1023
+ this.sidepanelRef
1024
+ .afterOpened()
1025
+ .pipe(takeUntilDestroyed())
1026
+ .subscribe(() => this.scrollbarViewport.flashScrollIndicators());
1027
+ }
1028
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelBody, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1029
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.25", type: KbqSidepanelBody, isStandalone: true, selector: "kbq-sidepanel-body, [kbq-sidepanel-body], kbqSidepanelBody", host: { classAttribute: "kbq-sidepanel-body" }, hostDirectives: [{ directive: i1.KbqOverflowShadowContainer }, { directive: i4.KbqScrollbarViewport }], ngImport: i0 }); }
1030
+ }
1031
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelBody, decorators: [{
1032
+ type: Directive,
1033
+ args: [{
1034
+ selector: 'kbq-sidepanel-body, [kbq-sidepanel-body], kbqSidepanelBody',
1035
+ host: {
1036
+ class: 'kbq-sidepanel-body'
1037
+ },
1038
+ hostDirectives: [KbqOverflowShadowContainer, KbqScrollbarViewport]
1039
+ }]
1040
+ }], ctorParameters: () => [] });
1041
+ /**
1042
+ * Footer of a sidepanel.
1043
+ */
1044
+ class KbqSidepanelFooter {
1045
+ constructor() {
1046
+ /** @docs-private */
1047
+ this.sidepanelRef = inject(KbqSidepanelRef);
1048
+ }
1049
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1050
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.25", type: KbqSidepanelFooter, isStandalone: true, selector: "kbq-sidepanel-footer, [kbq-sidepanel-footer], kbqSidepanelFooter", host: { properties: { "style.box-shadow": "sidepanelRef.bodyOverflow().bottom ? \"var(--kbq-shadow-overflow-normal-top)\" : null" }, classAttribute: "kbq-sidepanel-footer" }, ngImport: i0 }); }
1051
+ }
1052
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelFooter, decorators: [{
1053
+ type: Directive,
1054
+ args: [{
1055
+ selector: 'kbq-sidepanel-footer, [kbq-sidepanel-footer], kbqSidepanelFooter',
1056
+ host: {
1057
+ class: 'kbq-sidepanel-footer',
1058
+ '[style.box-shadow]': 'sidepanelRef.bodyOverflow().bottom ? "var(--kbq-shadow-overflow-normal-top)" : null'
1059
+ }
1060
+ }]
1061
+ }] });
1062
+ /**
1063
+ * Actions block of a sidepanel footer.
1064
+ */
1065
+ class KbqSidepanelActions {
1066
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelActions, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1067
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.25", type: KbqSidepanelActions, isStandalone: true, selector: "kbq-sidepanel-actions, [kbq-sidepanel-actions], kbqSidepanelActions", host: { classAttribute: "kbq-sidepanel-actions" }, ngImport: i0 }); }
1068
+ }
1069
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelActions, decorators: [{
1070
+ type: Directive,
1071
+ args: [{
1072
+ selector: 'kbq-sidepanel-actions, [kbq-sidepanel-actions], kbqSidepanelActions',
1073
+ host: {
1074
+ class: 'kbq-sidepanel-actions'
1075
+ }
1076
+ }]
1077
+ }] });
1078
+
1067
1079
  class KbqSidepanelModule {
1068
1080
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1069
1081
  /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.25", ngImport: i0, type: KbqSidepanelModule, imports: [OverlayModule,