@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 +1 @@
1
- {"version":3,"file":"koobiq-components-actions-panel.mjs","sources":["../../../packages/components/actions-panel/actions-panel-config.ts","../../../packages/components/actions-panel/actions-panel-container.ts","../../../packages/components/actions-panel/actions-panel-ref.ts","../../../packages/components/actions-panel/actions-panel-scoped-overlay-container.ts","../../../packages/components/actions-panel/actions-panel.ts","../../../packages/components/actions-panel/module.ts","../../../packages/components/actions-panel/koobiq-components-actions-panel.ts"],"sourcesContent":["import { Direction } from '@angular/cdk/bidi';\nimport { Overlay, ScrollStrategy } from '@angular/cdk/overlay';\nimport { ElementRef, InjectionToken, Injector, Provider } from '@angular/core';\n\n/** Injection token that can be used to specify default actions panel config. */\nexport const KBQ_ACTIONS_PANEL_DEFAULT_CONFIG = new InjectionToken<KbqActionsPanelConfig>(\n 'KBQ_ACTIONS_PANEL_DEFAULT_CONFIG',\n { factory: () => new KbqActionsPanelConfig() }\n);\n\n/**\n * Utility for providing default actions panel config through {@link KBQ_ACTIONS_PANEL_DEFAULT_CONFIG}.\n */\nexport const kbqActionsPanelDefaultConfigProvider = <D>(config: KbqActionsPanelConfig<D>): Provider => ({\n provide: KBQ_ACTIONS_PANEL_DEFAULT_CONFIG,\n useValue: config\n});\n\n/**\n * Configuration for opened actions panel.\n * Based on cdk `DialogConfig`.\n */\nexport class KbqActionsPanelConfig<D = unknown> {\n /**\n * Injector used for the instantiation of the component to be attached.\n */\n injector?: Injector;\n\n /**\n * Data being injected into the child component with {@link KBQ_ACTIONS_PANEL_DATA}.\n */\n data?: D | null = null;\n\n /** Extra CSS classes to be added to the actions panel container. */\n containerClass?: string | string[];\n\n /**\n * Whether the actions panel should be closed of when the user goes backwards/forwards in history.\n * Defaults to `true`.\n * NOTE! This does not apply to router navigation.\n */\n closeOnNavigation?: boolean = true;\n\n /**\n * Element the actions panel overlay is rendered into, instead of the application-wide overlay container. The panel\n * is pinned to the bottom center of that element and resizes with it. An element that sets `overflow: hidden`\n * clips it; at the default `overflow: visible` the entrance animation renders it below the element.\n *\n * The element is mutated for as long as the panel is open: it gains one child node holding the overlay, and a\n * `static` element is promoted to `position: relative`, since the overlay is positioned against it.\n *\n * NOTE: the panel bypasses a globally provided `OverlayContainer` while this is set.\n */\n overlayContainer?: ElementRef<HTMLElement>;\n\n /**\n * Extra CSS classes to be added to the overlay panel.\n */\n overlayPanelClass?: string | string[];\n\n /**\n * Width of the actions panel.\n */\n width?: string;\n\n /**\n * Min-width of the actions panel.\n * If a number is provided, assumes pixel units.\n */\n minWidth?: number | string;\n\n /**\n * Max-width of the actions panel.\n * If a number is provided, assumes pixel units.\n *\n * When omitted, the panel is capped by the width of the overlay container it is rendered into.\n */\n maxWidth?: number | string;\n\n /**\n * Direction of the text in the actions panel. Defaults to `'ltr'`.\n */\n direction?: Direction = 'ltr';\n\n /**\n * Scroll strategy to be used for the actions panel. Defaults to `RepositionScrollStrategy`.\n */\n scrollStrategy?: (overlay: Overlay) => ScrollStrategy = (overlay) => overlay.scrollStrategies.reposition();\n\n /**\n * Whether the user can use ESC or click on close button to close the actions panel. Defaults to `false`.\n */\n disableClose?: boolean = false;\n}\n","import { CdkDialogContainer } from '@angular/cdk/dialog';\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n InjectionToken,\n Injector,\n OnDestroy,\n Provider,\n Renderer2,\n signal,\n ViewEncapsulation\n} from '@angular/core';\nimport { KbqButtonModule } from '@koobiq/components/button';\nimport {\n KbqActionsPanelLocaleConfiguration,\n kbqAfterAnimations,\n kbqAnimationsDisabled,\n KbqDeepPartial,\n kbqLocaleConfigurationOverrideProvider,\n KbqLocaleOverridesDirective,\n ruRULocaleData\n} from '@koobiq/components/core';\nimport { KbqDividerModule } from '@koobiq/components/divider';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqToolTipModule } from '@koobiq/components/tooltip';\nimport { Subject } from 'rxjs';\nimport { KbqActionsPanel } from './actions-panel';\nimport { KbqActionsPanelConfig } from './actions-panel-config';\n\n/** Localization configuration provider. */\nexport const KBQ_ACTIONS_PANEL_LOCALE_CONFIGURATION = new InjectionToken<KbqActionsPanelLocaleConfiguration>(\n 'KbqActionsPanelLocaleConfiguration',\n { factory: () => ruRULocaleData.actionsPanel }\n);\n\n/**\n * Utility provider for `KBQ_ACTIONS_PANEL_LOCALE_CONFIGURATION`. Only the strings you pass are\n * overridden; the rest keep following the active locale.\n */\nexport const kbqActionsPanelLocaleConfigurationProvider = (\n configuration: KbqDeepPartial<KbqActionsPanelLocaleConfiguration>\n): Provider => kbqLocaleConfigurationOverrideProvider('actionsPanel', configuration);\n\n/**\n * Internal component that wraps user-provided actions panel content.\n *\n * @docs-private\n */\n@Component({\n selector: 'kbq-actions-panel-container',\n imports: [\n CdkPortalOutlet,\n KbqDividerModule,\n KbqButtonModule,\n KbqIconModule,\n KbqToolTipModule\n ],\n template: `\n <div class=\"kbq-actions-panel-container__content\">\n <ng-template cdkPortalOutlet />\n </div>\n @if (!config.disableClose) {\n <kbq-divider class=\"kbq-actions-panel-container__vertical-divider\" [vertical]=\"true\" />\n <button\n class=\"kbq-actions-panel-container__close-button\"\n color=\"contrast\"\n kbq-button\n [attr.aria-label]=\"localeConfiguration().closeTooltip\"\n [kbqTooltip]=\"localeConfiguration().closeTooltip\"\n [kbqTooltipOffset]=\"16\"\n (click)=\"close()\"\n >\n <i kbq-icon=\"kbq-circle-xmark_16\"></i>\n </button>\n }\n `,\n styleUrls: [\n './actions-panel-tokens.scss',\n './actions-panel-container.scss'\n ],\n // As the parent `CdkDialogContainer`: component content is attached into this view, so on zone.js, where a tick\n // checks the whole application, content on the eager strategy is refreshed only if this view is checked as well.\n // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-actions-panel-container',\n '[class.kbq-actions-panel-container_rtl]': 'config.direction === \"rtl\"',\n '[class.kbq-actions-panel-container_visible]': \"animationState() === 'visible'\",\n '[class.kbq-animations-disabled]': 'animationsDisabled',\n '(keydown.escape)': 'handleEscape($any($event))'\n },\n // Carrier only: the container is created through the overlay, so there is no element for a consumer to\n // bind on, and it lets the container read its strings through `read()`. Unlike the pop-up panels it\n // reaches no ancestor carrier: `KbqActionsPanel` is provided in root, so the container's injector is\n // parented on the root injector unless the caller passes `config.injector` — pass one to scope an\n // override to the panel.\n hostDirectives: [KbqLocaleOverridesDirective]\n})\nexport class KbqActionsPanelContainer extends CdkDialogContainer implements OnDestroy {\n /**\n * The state of the actions panel animations.\n *\n * @docs-private\n */\n protected readonly animationState = signal<'void' | 'visible' | 'hidden'>('void');\n\n /**\n * Emits the state the actions panel has finished moving to.\n *\n * @docs-private\n */\n readonly animationDone = new Subject<'visible' | 'hidden'>();\n\n /**\n * Whether the actions panel moves without motion.\n *\n * @docs-private\n */\n protected readonly animationsDisabled = kbqAnimationsDisabled();\n\n private readonly injector = inject(Injector);\n\n /** The transition in progress, ended early by the next one. */\n private pendingTransition?: { state: 'visible' | 'hidden'; wait: { destroy(): void } };\n\n /** Whether the actions panel container has been destroyed. */\n private destroyed: boolean;\n\n /**\n * Actions panel configuration.\n *\n * @docs-private\n */\n protected readonly config = inject(KbqActionsPanelConfig);\n\n private readonly actionsPanel = inject(KbqActionsPanel);\n private readonly renderer = inject(Renderer2);\n\n /**\n * Actions panel locale configuration.\n *\n * @docs-private\n */\n protected readonly localeConfiguration = inject(KbqLocaleOverridesDirective, { self: true }).read(\n 'actionsPanel',\n KBQ_ACTIONS_PANEL_LOCALE_CONFIGURATION\n );\n\n override ngOnDestroy() {\n super.ngOnDestroy();\n this.destroyed = true;\n }\n\n /**\n * Close the actions panel.\n *\n * @docs-private\n */\n protected close(): void {\n this.actionsPanel.close();\n }\n\n /**\n * Start animation of the actions panel entrance into view.\n *\n * @docs-private\n */\n startOpenAnimation(): void {\n if (!this.destroyed) {\n this.animationState.set('visible');\n this._changeDetectorRef.detectChanges();\n this.waitForAnimation('visible');\n }\n }\n\n /**\n * Start animation of the actions panel exiting from view.\n *\n * @docs-private\n */\n startCloseAnimation(): void {\n if (!this.destroyed) {\n this.animationState.set('hidden');\n this.waitForAnimation('hidden');\n }\n }\n\n /**\n * Handles escape key events.\n *\n * @docs-private\n */\n protected handleEscape(event: KeyboardEvent): void {\n // A control inside the panel spent the key closing a popup of its own, such as a tooltip.\n if (event.defaultPrevented || this.config.disableClose) return;\n\n event.preventDefault();\n this.close();\n }\n\n /**\n * @docs-private\n */\n protected override _contentAttached(): void {\n this.applyContainerClass();\n }\n\n private waitForAnimation(state: 'visible' | 'hidden'): void {\n const pending = this.pendingTransition;\n\n // An entrance cut short by closing still ends, or the panel would never report having opened.\n if (pending) {\n pending.wait.destroy();\n this.pendingTransition = undefined;\n this.animationDone.next(pending.state);\n }\n\n // A subscriber may have disposed of the panel by now.\n if (this.destroyed) return;\n\n const wait = kbqAfterAnimations(\n () => this._elementRef.nativeElement,\n () => {\n this.pendingTransition = undefined;\n\n if (state === 'visible') {\n this._trapFocus();\n }\n\n this.animationDone.next(state);\n },\n this.injector\n );\n\n this.pendingTransition = { state, wait };\n }\n\n private applyContainerClass(): void {\n const { containerClass } = this.config;\n\n if (containerClass) {\n if (Array.isArray(containerClass)) {\n containerClass.forEach((cssClass) => this.renderer.addClass(this._elementRef.nativeElement, cssClass));\n } else {\n this.renderer.addClass(this._elementRef.nativeElement, containerClass);\n }\n }\n }\n}\n","import { DialogRef } from '@angular/cdk/dialog';\nimport { OverlayRef } from '@angular/cdk/overlay';\nimport { filter, Observable, ReplaySubject, Subject, take } from 'rxjs';\nimport { KbqActionsPanelContainer } from './actions-panel-container';\n\n/**\n * Reference to actions panel opened by `KbqActionsPanel` service.\n */\nexport class KbqActionsPanelRef<I = unknown, R = unknown> {\n /**\n * Instance of the component into which the actions panel content is projected.\n *\n * @docs-private\n */\n containerInstance: KbqActionsPanelContainer;\n\n private readonly afterOpenedSubject = new Subject<void>();\n private readonly beforeOpenedSubject = new ReplaySubject<void>(1);\n private readonly beforeClosedSubject = new Subject<R | undefined>();\n\n /** Emits when keydown events are targeted on the overlay. */\n readonly keydownEvents: Observable<KeyboardEvent> = this.dialogRef.keydownEvents;\n\n /** Emits when the actions panel starts opening, before its entrance animation plays. */\n readonly beforeOpened: Observable<void> = this.beforeOpenedSubject;\n\n /** Emits when the actions panel has opened and appeared, or once closing cuts its entrance short. */\n readonly afterOpened: Observable<void> = this.afterOpenedSubject;\n\n /** Emits when the actions panel starts closing, before its exit animation plays. */\n readonly beforeClosed: Observable<R | undefined> = this.beforeClosedSubject;\n\n /** Emits when the actions panel is finished closing. */\n readonly afterClosed: Observable<R | undefined> = this.dialogRef.closed;\n\n /**\n * Overlay reference for the actions panel.\n *\n * @docs-private\n */\n readonly overlayRef: OverlayRef = this.dialogRef.overlayRef;\n\n /**\n * ID of the actions panel.\n *\n * @docs-private\n */\n readonly id: string = this.dialogRef.id;\n\n /** Result to be passed down to the `afterClosed` stream. */\n private result: R | undefined;\n\n constructor(\n private readonly dialogRef: DialogRef<R, I>,\n containerInstance: KbqActionsPanelContainer\n ) {\n this.containerInstance = containerInstance;\n this.handleAnimation();\n this.handleOverlayDetachments();\n }\n\n /**\n * Opens the actions panel, playing its entrance animation.\n *\n * @docs-private\n */\n open(): void {\n if (!this.containerInstance) {\n return;\n }\n\n this.beforeOpenedSubject.next();\n this.beforeOpenedSubject.complete();\n this.containerInstance.startOpenAnimation();\n }\n\n /** Closes the actions panel. */\n close(result?: R): void {\n const container = this.containerInstance;\n\n if (!container) {\n return;\n }\n\n // The exit ends an entrance still in progress, so it starts ahead of `beforeClosed` for `afterOpened` to\n // come first — and the container is let go before that, since an `afterOpened` subscriber may close again.\n this.containerInstance = null!;\n this.result = result;\n container.startCloseAnimation();\n this.beforeClosedSubject.next(result);\n this.beforeClosedSubject.complete();\n }\n\n private handleAnimation(): void {\n this.containerInstance.animationDone\n .pipe(\n filter((state) => state === 'visible'),\n take(1)\n )\n .subscribe(() => {\n this.afterOpenedSubject.next();\n this.afterOpenedSubject.complete();\n });\n\n this.containerInstance.animationDone\n .pipe(\n filter((state) => state === 'hidden'),\n take(1)\n )\n .subscribe(() => this.dialogRef.close(this.result));\n }\n\n private handleOverlayDetachments(): void {\n this.dialogRef.overlayRef\n .detachments()\n .pipe(take(1))\n .subscribe(() => {\n this.dialogRef.close(this.result);\n });\n }\n}\n","import { OverlayContainer } from '@angular/cdk/overlay';\nimport { ElementRef, inject, Injectable, InjectionToken } from '@angular/core';\nimport { KBQ_WINDOW } from '@koobiq/components/core';\n\n/**\n * Element that {@link KbqActionsPanelScopedOverlayContainer} renders overlays into.\n *\n * @docs-private\n */\nexport const KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_HOST = new InjectionToken<ElementRef<HTMLElement>>(\n 'KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_HOST'\n);\n\n/**\n * Class of the wrapper that {@link KbqActionsPanelScopedOverlayContainer} adds to the host.\n *\n * @docs-private\n */\nexport const KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_CONTAINER_SELECTOR = 'kbq-actions-panel-scoped-overlay-container';\n\n/**\n * Hosts currently promoted to a containing block, with the inline `position` to put back and the number of containers\n * relying on the promotion.\n *\n * The promotion belongs to the host rather than to a container: several containers share one host whenever panels\n * overlap — replacing an open panel creates the new overlay before the old one finishes closing — and the first\n * to be destroyed must not restore a `position` the others still need.\n */\nconst promotedHosts = new WeakMap<HTMLElement, { inlinePosition: string; containers: number }>();\n\n/**\n * `OverlayContainer` that renders overlays inside {@link KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_HOST} instead of\n * `document.body`.\n *\n * CDK resolves the overlay host from the `OverlayContainer` available in DI, and there is exactly one of those per\n * application. Providing this container in a child injector — together with a `Dialog` of its own — is what makes a\n * single overlay render inside a specific element while the rest of the application keeps using the global container.\n *\n * The container is scoped to one host and is not reusable: it is expected to be created and destroyed alongside the\n * overlay it hosts.\n *\n * @docs-private\n */\n@Injectable()\nexport class KbqActionsPanelScopedOverlayContainer extends OverlayContainer {\n private readonly host = inject(KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_HOST).nativeElement;\n private readonly window = inject(KBQ_WINDOW);\n\n /** Wrapper that isolates the container from the host's own content. */\n private wrapperElement: HTMLElement | null = null;\n\n /** Whether this container holds a share of the host's promotion to a containing block. */\n private holdsHostPromotion = false;\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n\n this.wrapperElement?.remove();\n this.wrapperElement = null;\n\n this.releaseHostPromotion();\n }\n\n /**\n * Deliberately does not call `super`: CDK's implementation marks the container with a `platform` attribute and\n * removes every other container carrying one, which is bookkeeping for the single application-wide container. A\n * scoped container is not that container, and joining the scheme would make it delete — and be deleted by — the\n * global one as soon as both exist.\n */\n protected override _createContainer(): void {\n const wrapper = this._document.createElement('div');\n\n wrapper.classList.add(KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_CONTAINER_SELECTOR);\n wrapper.style.position = 'absolute';\n wrapper.style.inset = '0';\n wrapper.style.pointerEvents = 'none';\n\n const container = this._document.createElement('div');\n\n container.classList.add('cdk-overlay-container');\n // CDK styles `.cdk-overlay-container` as a viewport-sized `position: fixed` layer. A scoped container has to\n // cover the host instead; the remaining CDK rules (`top`/`left`/`width`/`height`) already do the right thing\n // once the element is out of the fixed positioning context.\n container.style.position = 'absolute';\n\n // The container gets a wrapper of its own rather than being appended to the host directly, because CDK's\n // `Dialog` marks every sibling of the overlay container with `aria-hidden` while a dialog is open. Inside the\n // host those siblings are the very content the actions panel acts on, so the container is kept as an only\n // child and there is nothing left for CDK to hide.\n wrapper.appendChild(container);\n\n this.promoteHostToContainingBlock();\n this.host.appendChild(wrapper);\n\n this.wrapperElement = wrapper;\n this._containerElement = container;\n }\n\n /**\n * The wrapper is absolutely positioned, so it resolves against the nearest positioned ancestor. A `static` host\n * would let the overlay land on some outer element instead, so it is promoted to `relative`; a host that is\n * already positioned is left untouched.\n */\n private promoteHostToContainingBlock(): void {\n if (!this._platform.isBrowser) {\n return;\n }\n\n const promotion = promotedHosts.get(this.host);\n\n if (promotion) {\n promotion.containers++;\n this.holdsHostPromotion = true;\n\n return;\n }\n\n // A host that is not in the document yet reports no position at all (`getComputedStyle` returns an empty\n // declaration), and is treated as `static`: promoting one that turns out to be positioned is harmless,\n // leaving a `static` one alone is not.\n const { position } = this.window.getComputedStyle(this.host);\n\n if (position && position !== 'static') {\n return;\n }\n\n promotedHosts.set(this.host, { inlinePosition: this.host.style.position, containers: 1 });\n this.host.style.position = 'relative';\n this.holdsHostPromotion = true;\n }\n\n /** Gives the host its own `position` back once no scoped container depends on the promotion any more. */\n private releaseHostPromotion(): void {\n if (!this.holdsHostPromotion) {\n return;\n }\n\n this.holdsHostPromotion = false;\n\n const promotion = promotedHosts.get(this.host)!;\n\n if (--promotion.containers > 0) {\n return;\n }\n\n promotedHosts.delete(this.host);\n this.host.style.position = promotion.inlinePosition;\n }\n}\n","import { Dialog } from '@angular/cdk/dialog';\nimport { ComponentType, Overlay, OVERLAY_DEFAULT_CONFIG, OverlayContainer } from '@angular/cdk/overlay';\nimport {\n createEnvironmentInjector,\n ElementRef,\n EnvironmentInjector,\n inject,\n Injectable,\n InjectionToken,\n Injector,\n OnDestroy,\n TemplateRef\n} from '@angular/core';\nimport { KBQ_ACTIONS_PANEL_DEFAULT_CONFIG, KbqActionsPanelConfig } from './actions-panel-config';\nimport { KbqActionsPanelContainer } from './actions-panel-container';\nimport { KbqActionsPanelRef } from './actions-panel-ref';\nimport {\n KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_HOST,\n KbqActionsPanelScopedOverlayContainer\n} from './actions-panel-scoped-overlay-container';\n\n/** Injection token that can be used to access the data that was passed in to actions panel. */\nexport const KBQ_ACTIONS_PANEL_DATA = new InjectionToken('KBQ_ACTIONS_PANEL_DATA');\n\n/**\n * Context for actions panel template.\n */\nexport type KbqActionsPanelTemplateContext<T = unknown, D = unknown, R = unknown> = {\n /**\n * Data passed to actions panel.\n *\n * Example:\n *\n * ```html\n * <ng-template #actionsPanel let-data>{{ data.KEY }}</ng-template>\n * ````\n */\n $implicit?: D | null;\n\n /**\n * Data passed to actions panel.\n *\n * Example:\n *\n * ```html\n * <ng-template #actionsPanel let-data=\"data\">{{ data.KEY }}</ng-template>\n * ````\n */\n data?: D | null;\n\n /**\n * Opened actions panel reference.\n *\n * Example:\n *\n * ```html\n * <ng-template #actionsPanel let-actionsPanelRef=\"actionsPanelRef\">\n * <button (click)=\"actionsPanelRef.close()\">close</button>\n * </ng-template>\n * ````\n */\n actionsPanelRef: KbqActionsPanelRef<T, R>;\n};\n\n/**\n * Selector for actions panel overlay.\n *\n * @internal\n */\nexport const KBQ_ACTIONS_PANEL_OVERLAY_SELECTOR = 'kbq-actions-panel-overlay';\n\n/**\n * `Dialog` backing a panel that renders into an `overlayContainer`.\n *\n * A child `Dialog` shares `openDialogs` with the root one but keeps an `_ariaHiddenElements` map of its own, and CDK\n * restores the `aria-hidden` marks from whichever instance happens to close the last dialog. Left apart, marks a root\n * dialog put on the application are never taken off again. Adopting the root's map keeps both halves of that\n * bookkeeping on the same object.\n */\n@Injectable()\nclass KbqActionsPanelScopedDialog extends Dialog {\n constructor() {\n super();\n\n this['_ariaHiddenElements'] = inject(Dialog, { skipSelf: true })['_ariaHiddenElements'];\n }\n}\n\n/**\n * Service for opening actions panel.\n */\n@Injectable({ providedIn: 'root' })\nexport class KbqActionsPanel implements OnDestroy {\n private readonly injector = inject(Injector);\n private readonly environmentInjector = inject(EnvironmentInjector);\n private readonly overlay = inject(Overlay);\n private readonly dialog = inject(Dialog);\n private readonly defaultConfig = inject(KBQ_ACTIONS_PANEL_DEFAULT_CONFIG);\n\n /** The reference to the currently opened actions panel. */\n private openedActionsPanelRef: KbqActionsPanelRef | null = null;\n\n ngOnDestroy() {\n this.close();\n }\n\n /**\n * Opens actions panel.\n *\n * @param componentOrTemplateRef Component to be opened into the actions panel.\n * @param config Additional configuration options for the actions panel.\n * @returns A reference to the opened actions panel.\n */\n open<T, D = unknown, R = unknown>(\n component: ComponentType<T>,\n config?: KbqActionsPanelConfig<D>\n ): KbqActionsPanelRef<T, R>;\n\n /**\n * Opens actions panel.\n *\n * @param template TemplateRef to be used as the content.\n * @param config Additional configuration options for the actions panel.\n * @returns A reference to the opened actions panel.\n */\n open<T, D = unknown, R = unknown>(\n template: TemplateRef<T>,\n config?: KbqActionsPanelConfig<D>\n ): KbqActionsPanelRef<T, R>;\n\n open<T, D = unknown, R = unknown>(\n componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,\n config?: KbqActionsPanelConfig<D>\n ): KbqActionsPanelRef<T, R> {\n const _config: KbqActionsPanelConfig<D> = {\n ...(this.defaultConfig as KbqActionsPanelConfig<D>),\n ...config\n };\n const actionsPanelRef = this.openDialog<T, D, R>(componentOrTemplateRef, _config);\n\n actionsPanelRef.afterClosed.subscribe(() => {\n if (this.openedActionsPanelRef === actionsPanelRef) {\n this.openedActionsPanelRef = null;\n }\n });\n\n if (this.openedActionsPanelRef) {\n this.openedActionsPanelRef.afterClosed.subscribe(() => {\n actionsPanelRef.open();\n });\n this.openedActionsPanelRef.close();\n } else {\n actionsPanelRef.open();\n }\n\n this.openedActionsPanelRef = actionsPanelRef as KbqActionsPanelRef;\n\n return actionsPanelRef;\n }\n\n /** Closes the currently opened actions panel. */\n close<R>(result?: R): void {\n this.openedActionsPanelRef?.close(result);\n }\n\n private openDialog<T, D = unknown, R = unknown>(\n componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,\n config: KbqActionsPanelConfig<D> = {}\n ): KbqActionsPanelRef<T, R> {\n let actionsPanelRef!: KbqActionsPanelRef<T, R>;\n const { overlayContainer, overlayPanelClass } = config;\n // CDK takes the overlay host from the `OverlayContainer` its `Dialog` was injected with, and there is one of\n // those per application. Rendering the panel inside `overlayContainer` therefore means giving this panel a\n // `Dialog` of its own, backed by a container scoped to that element.\n const scopedInjector = overlayContainer ? this.createScopedInjector(overlayContainer) : null;\n const dialog = scopedInjector ? scopedInjector.get(Dialog) : this.dialog;\n\n try {\n dialog.open<R, D, T>(componentOrTemplateRef, {\n ...config,\n container: KbqActionsPanelContainer,\n restoreFocus: false,\n autoFocus: null!,\n hasBackdrop: false,\n // Disable closing since we need to sync it up to the animation ourselves\n closeOnOverlayDetachments: false,\n // Disable closing since we need to sync it up to the animation ourselves\n closeOnDestroy: false,\n // Disable closing since we need to sync it up to the animation ourselves\n disableClose: true,\n scrollStrategy: config.scrollStrategy && config.scrollStrategy(this.overlay),\n // Pinned to the bottom center of the overlay container — the viewport by default, `overlayContainer`\n // when one is given. The panel's width follows from `.cdk-overlay-pane`'s `max-width: 100%` in both\n // cases.\n positionStrategy: this.overlay.position().global().centerHorizontally().bottom(),\n templateContext: () => {\n return {\n $implicit: config.data,\n data: config.data,\n actionsPanelRef\n } satisfies KbqActionsPanelTemplateContext<T, D, R>;\n },\n injector: Injector.create({\n parent: config.injector || this.injector,\n providers: [{ provide: KbqActionsPanelConfig, useValue: config }]\n }),\n providers: (dialogRef, _dialogConfig, container) => {\n actionsPanelRef = new KbqActionsPanelRef<T, R>(dialogRef, container as KbqActionsPanelContainer);\n\n return [\n { provide: KbqActionsPanelRef, useValue: actionsPanelRef },\n { provide: KBQ_ACTIONS_PANEL_DATA, useValue: config.data }\n ];\n }\n });\n } catch (error) {\n // `open()` builds the overlay, and with it the scoped container that has already put a wrapper into the\n // host and promoted it. Nothing else would ever destroy the injector, so unwind it here.\n scopedInjector?.destroy();\n\n throw error;\n }\n\n const { overlayRef } = actionsPanelRef;\n\n overlayRef.addPanelClass(KBQ_ACTIONS_PANEL_OVERLAY_SELECTOR);\n\n if (overlayPanelClass) overlayRef.addPanelClass(overlayPanelClass);\n\n if (scopedInjector) {\n // The scoped injector owns the panel's `Dialog` and overlay container, so it lives exactly as long as the\n // panel. `afterClosed` emits after the overlay has been disposed of.\n actionsPanelRef.afterClosed.subscribe(() => scopedInjector.destroy());\n }\n\n return actionsPanelRef;\n }\n\n /** Injector that makes CDK render the panel's overlay inside `host` instead of `document.body`. */\n private createScopedInjector(host: ElementRef<HTMLElement>): EnvironmentInjector {\n return createEnvironmentInjector(\n [\n // A `Dialog` of its own is what carries the scoped container into `createOverlayRef` — the root one\n // resolves the application-wide container. It still reaches the root `Dialog` through `skipSelf` and\n // shares its registry of open dialogs, so `closeAll()` and `afterAllClosed` keep seeing this panel.\n { provide: Dialog, useClass: KbqActionsPanelScopedDialog },\n { provide: KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_HOST, useValue: host },\n { provide: OverlayContainer, useClass: KbqActionsPanelScopedOverlayContainer },\n // A popover is shown in the top layer and laid out against the viewport, wherever its host sits in\n // the DOM: the panel would leave `host` and pin itself to the bottom of the page.\n { provide: OVERLAY_DEFAULT_CONFIG, useValue: { usePopover: false } }\n ],\n this.environmentInjector,\n KbqActionsPanel.name\n );\n }\n}\n","import { NgModule } from '@angular/core';\nimport { KbqActionsPanel } from './actions-panel';\nimport { KbqActionsPanelContainer } from './actions-panel-container';\n\nconst COMPONENTS = [\n KbqActionsPanelContainer\n];\n\n@NgModule({\n imports: COMPONENTS,\n providers: [KbqActionsPanel],\n exports: COMPONENTS\n})\nexport class KbqActionsPanelModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"koobiq-components-actions-panel.mjs","sources":["../../../packages/components/actions-panel/actions-panel-config.ts","../../../packages/components/actions-panel/actions-panel-container.ts","../../../packages/components/actions-panel/actions-panel-ref.ts","../../../packages/components/actions-panel/actions-panel-scoped-overlay-container.ts","../../../packages/components/actions-panel/actions-panel.ts","../../../packages/components/actions-panel/module.ts","../../../packages/components/actions-panel/koobiq-components-actions-panel.ts"],"sourcesContent":["import { Direction } from '@angular/cdk/bidi';\nimport { Overlay, ScrollStrategy } from '@angular/cdk/overlay';\nimport { ElementRef, InjectionToken, Injector, Provider } from '@angular/core';\n\n/** Injection token that can be used to specify default actions panel config. */\nexport const KBQ_ACTIONS_PANEL_DEFAULT_CONFIG = new InjectionToken<KbqActionsPanelConfig>(\n 'KBQ_ACTIONS_PANEL_DEFAULT_CONFIG',\n { factory: () => new KbqActionsPanelConfig() }\n);\n\n/**\n * Utility for providing default actions panel config through {@link KBQ_ACTIONS_PANEL_DEFAULT_CONFIG}.\n */\nexport const kbqActionsPanelDefaultConfigProvider = <D>(config: KbqActionsPanelConfig<D>): Provider => ({\n provide: KBQ_ACTIONS_PANEL_DEFAULT_CONFIG,\n useValue: config\n});\n\n/**\n * Configuration for opened actions panel.\n * Based on cdk `DialogConfig`.\n */\nexport class KbqActionsPanelConfig<D = unknown> {\n /**\n * Injector used for the instantiation of the component to be attached.\n */\n injector?: Injector;\n\n /**\n * Data being injected into the child component with {@link KBQ_ACTIONS_PANEL_DATA}.\n */\n data?: D | null = null;\n\n /** Extra CSS classes to be added to the actions panel container. */\n containerClass?: string | string[];\n\n /**\n * Whether the actions panel should be closed of when the user goes backwards/forwards in history.\n * Defaults to `true`.\n * NOTE! This does not apply to router navigation.\n */\n closeOnNavigation?: boolean = true;\n\n /**\n * Element the actions panel overlay is rendered into, instead of the application-wide overlay container. The panel\n * is pinned to the bottom center of that element and resizes with it. An element that sets `overflow: hidden`\n * clips it; at the default `overflow: visible` the entrance animation renders it below the element.\n *\n * The element is mutated for as long as the panel is open: it gains one child node holding the overlay, and a\n * `static` element is promoted to `position: relative`, since the overlay is positioned against it.\n *\n * NOTE: the panel bypasses a globally provided `OverlayContainer` while this is set.\n */\n overlayContainer?: ElementRef<HTMLElement>;\n\n /**\n * Extra CSS classes to be added to the overlay panel.\n */\n overlayPanelClass?: string | string[];\n\n /**\n * Width of the actions panel.\n */\n width?: string;\n\n /**\n * Min-width of the actions panel.\n * If a number is provided, assumes pixel units.\n */\n minWidth?: number | string;\n\n /**\n * Max-width of the actions panel.\n * If a number is provided, assumes pixel units.\n *\n * When omitted, the panel is capped by the width of the overlay container it is rendered into.\n */\n maxWidth?: number | string;\n\n /**\n * Direction of the text in the actions panel. Defaults to `'ltr'`.\n */\n direction?: Direction = 'ltr';\n\n /**\n * Scroll strategy to be used for the actions panel. Defaults to `RepositionScrollStrategy`.\n */\n scrollStrategy?: (overlay: Overlay) => ScrollStrategy = (overlay) => overlay.scrollStrategies.reposition();\n\n /**\n * Whether the user can use ESC or click on close button to close the actions panel. Defaults to `false`.\n */\n disableClose?: boolean = false;\n}\n","import { CdkDialogContainer } from '@angular/cdk/dialog';\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n InjectionToken,\n Injector,\n OnDestroy,\n Provider,\n Renderer2,\n signal,\n ViewEncapsulation\n} from '@angular/core';\nimport { KbqButtonModule } from '@koobiq/components/button';\nimport {\n KbqActionsPanelLocaleConfiguration,\n kbqAfterAnimations,\n kbqAnimationsDisabled,\n KbqDeepPartial,\n kbqLocaleConfigurationOverrideProvider,\n KbqLocaleOverridesDirective,\n ruRULocaleData\n} from '@koobiq/components/core';\nimport { KbqDividerModule } from '@koobiq/components/divider';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqToolTipModule } from '@koobiq/components/tooltip';\nimport { Subject } from 'rxjs';\nimport { KbqActionsPanel } from './actions-panel';\nimport { KbqActionsPanelConfig } from './actions-panel-config';\n\n/** Localization configuration provider. */\nexport const KBQ_ACTIONS_PANEL_LOCALE_CONFIGURATION = new InjectionToken<KbqActionsPanelLocaleConfiguration>(\n 'KbqActionsPanelLocaleConfiguration',\n { factory: () => ruRULocaleData.actionsPanel }\n);\n\n/**\n * Utility provider for `KBQ_ACTIONS_PANEL_LOCALE_CONFIGURATION`. Only the strings you pass are\n * overridden; the rest keep following the active locale.\n */\nexport const kbqActionsPanelLocaleConfigurationProvider = (\n configuration: KbqDeepPartial<KbqActionsPanelLocaleConfiguration>\n): Provider => kbqLocaleConfigurationOverrideProvider('actionsPanel', configuration);\n\n/**\n * Internal component that wraps user-provided actions panel content.\n *\n * @docs-private\n */\n@Component({\n selector: 'kbq-actions-panel-container',\n imports: [\n CdkPortalOutlet,\n KbqDividerModule,\n KbqButtonModule,\n KbqIconModule,\n KbqToolTipModule\n ],\n template: `\n <div class=\"kbq-actions-panel-container__content\">\n <ng-template cdkPortalOutlet />\n </div>\n @if (!config.disableClose) {\n <kbq-divider class=\"kbq-actions-panel-container__vertical-divider\" [vertical]=\"true\" />\n <button\n class=\"kbq-actions-panel-container__close-button\"\n color=\"contrast\"\n kbq-button\n [attr.aria-label]=\"localeConfiguration().closeTooltip\"\n [kbqTooltip]=\"localeConfiguration().closeTooltip\"\n [kbqTooltipOffset]=\"16\"\n (click)=\"close()\"\n >\n <i kbq-icon=\"kbq-circle-xmark_16\"></i>\n </button>\n }\n `,\n styleUrls: [\n './actions-panel-tokens.scss',\n './actions-panel-container.scss'\n ],\n // As the parent `CdkDialogContainer`: component content is attached into this view, so on zone.js, where a tick\n // checks the whole application, content on the eager strategy is refreshed only if this view is checked as well.\n // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-actions-panel-container',\n '[class.kbq-actions-panel-container_rtl]': 'config.direction === \"rtl\"',\n '[class.kbq-actions-panel-container_visible]': \"animationState() === 'visible'\",\n '[class.kbq-animations-disabled]': 'animationsDisabled',\n '(keydown.escape)': 'handleEscape($any($event))'\n },\n // Carrier only: the container is created through the overlay, so there is no element for a consumer to\n // bind on, and it lets the container read its strings through `read()`. Unlike the pop-up panels it\n // reaches no ancestor carrier: `KbqActionsPanel` is provided in root, so the container's injector is\n // parented on the root injector unless the caller passes `config.injector` — pass one to scope an\n // override to the panel.\n hostDirectives: [KbqLocaleOverridesDirective]\n})\nexport class KbqActionsPanelContainer extends CdkDialogContainer implements OnDestroy {\n /**\n * The state of the actions panel animations.\n *\n * @docs-private\n */\n protected readonly animationState = signal<'void' | 'visible' | 'hidden'>('void');\n\n /**\n * Emits the state the actions panel has finished moving to.\n *\n * @docs-private\n */\n readonly animationDone = new Subject<'visible' | 'hidden'>();\n\n /**\n * Whether the actions panel moves without motion.\n *\n * @docs-private\n */\n protected readonly animationsDisabled = kbqAnimationsDisabled();\n\n private readonly injector = inject(Injector);\n\n /** The transition in progress, ended early by the next one. */\n private pendingTransition?: { state: 'visible' | 'hidden'; wait: { destroy(): void } };\n\n /** Whether the actions panel container has been destroyed. */\n private destroyed: boolean;\n\n /**\n * Actions panel configuration.\n *\n * @docs-private\n */\n protected readonly config = inject(KbqActionsPanelConfig);\n\n private readonly actionsPanel = inject(KbqActionsPanel);\n private readonly renderer = inject(Renderer2);\n\n /**\n * Actions panel locale configuration.\n *\n * @docs-private\n */\n protected readonly localeConfiguration = inject(KbqLocaleOverridesDirective, { self: true }).read(\n 'actionsPanel',\n KBQ_ACTIONS_PANEL_LOCALE_CONFIGURATION\n );\n\n override ngOnDestroy() {\n super.ngOnDestroy();\n this.destroyed = true;\n }\n\n /**\n * Close the actions panel.\n *\n * @docs-private\n */\n protected close(): void {\n this.actionsPanel.close();\n }\n\n /**\n * Start animation of the actions panel entrance into view.\n *\n * @docs-private\n */\n startOpenAnimation(): void {\n if (!this.destroyed) {\n this.animationState.set('visible');\n this._changeDetectorRef.detectChanges();\n this.waitForAnimation('visible');\n }\n }\n\n /**\n * Start animation of the actions panel exiting from view.\n *\n * @docs-private\n */\n startCloseAnimation(): void {\n if (!this.destroyed) {\n this.animationState.set('hidden');\n this.waitForAnimation('hidden');\n }\n }\n\n /**\n * Handles escape key events.\n *\n * @docs-private\n */\n protected handleEscape(event: KeyboardEvent): void {\n // A control inside the panel spent the key closing a popup of its own, such as a tooltip.\n if (event.defaultPrevented || this.config.disableClose) return;\n\n event.preventDefault();\n this.close();\n }\n\n /**\n * @docs-private\n */\n protected override _contentAttached(): void {\n this.applyContainerClass();\n }\n\n private waitForAnimation(state: 'visible' | 'hidden'): void {\n const pending = this.pendingTransition;\n\n // An entrance cut short by closing still ends, or the panel would never report having opened.\n if (pending) {\n pending.wait.destroy();\n this.pendingTransition = undefined;\n this.animationDone.next(pending.state);\n }\n\n // A subscriber may have disposed of the panel by now.\n if (this.destroyed) return;\n\n const wait = kbqAfterAnimations(\n () => this._elementRef.nativeElement,\n () => {\n this.pendingTransition = undefined;\n\n if (state === 'visible') {\n this._trapFocus();\n }\n\n this.animationDone.next(state);\n },\n this.injector\n );\n\n this.pendingTransition = { state, wait };\n }\n\n private applyContainerClass(): void {\n const { containerClass } = this.config;\n\n if (containerClass) {\n if (Array.isArray(containerClass)) {\n containerClass.forEach((cssClass) => this.renderer.addClass(this._elementRef.nativeElement, cssClass));\n } else {\n this.renderer.addClass(this._elementRef.nativeElement, containerClass);\n }\n }\n }\n}\n","import { DialogRef } from '@angular/cdk/dialog';\nimport { OverlayRef } from '@angular/cdk/overlay';\nimport { filter, Observable, ReplaySubject, Subject, take } from 'rxjs';\nimport { KbqActionsPanelContainer } from './actions-panel-container';\n\n/**\n * Reference to actions panel opened by `KbqActionsPanel` service.\n */\nexport class KbqActionsPanelRef<I = unknown, R = unknown> {\n /**\n * Instance of the component into which the actions panel content is projected.\n *\n * @docs-private\n */\n containerInstance: KbqActionsPanelContainer;\n\n private readonly afterOpenedSubject = new Subject<void>();\n private readonly beforeOpenedSubject = new ReplaySubject<void>(1);\n private readonly beforeClosedSubject = new Subject<R | undefined>();\n\n /** Emits when keydown events are targeted on the overlay. */\n readonly keydownEvents: Observable<KeyboardEvent> = this.dialogRef.keydownEvents;\n\n /** Emits when the actions panel starts opening, before its entrance animation plays. */\n readonly beforeOpened: Observable<void> = this.beforeOpenedSubject;\n\n /** Emits when the actions panel has opened and appeared, or once closing cuts its entrance short. */\n readonly afterOpened: Observable<void> = this.afterOpenedSubject;\n\n /** Emits when the actions panel starts closing, before its exit animation plays. */\n readonly beforeClosed: Observable<R | undefined> = this.beforeClosedSubject;\n\n /** Emits when the actions panel is finished closing. */\n readonly afterClosed: Observable<R | undefined> = this.dialogRef.closed;\n\n /**\n * Overlay reference for the actions panel.\n *\n * @docs-private\n */\n readonly overlayRef: OverlayRef = this.dialogRef.overlayRef;\n\n /**\n * ID of the actions panel.\n *\n * @docs-private\n */\n readonly id: string = this.dialogRef.id;\n\n /** Result to be passed down to the `afterClosed` stream. */\n private result: R | undefined;\n\n constructor(\n private readonly dialogRef: DialogRef<R, I>,\n containerInstance: KbqActionsPanelContainer\n ) {\n this.containerInstance = containerInstance;\n this.handleAnimation();\n this.handleOverlayDetachments();\n }\n\n /**\n * Opens the actions panel, playing its entrance animation.\n *\n * @docs-private\n */\n open(): void {\n if (!this.containerInstance) {\n return;\n }\n\n this.beforeOpenedSubject.next();\n this.beforeOpenedSubject.complete();\n this.containerInstance.startOpenAnimation();\n }\n\n /** Closes the actions panel. */\n close(result?: R): void {\n const container = this.containerInstance;\n\n if (!container) {\n return;\n }\n\n // The exit ends an entrance still in progress, so it starts ahead of `beforeClosed` for `afterOpened` to\n // come first — and the container is let go before that, since an `afterOpened` subscriber may close again.\n this.containerInstance = null!;\n this.result = result;\n container.startCloseAnimation();\n this.beforeClosedSubject.next(result);\n this.beforeClosedSubject.complete();\n }\n\n private handleAnimation(): void {\n this.containerInstance.animationDone\n .pipe(\n filter((state) => state === 'visible'),\n take(1)\n )\n .subscribe(() => {\n this.afterOpenedSubject.next();\n this.afterOpenedSubject.complete();\n });\n\n this.containerInstance.animationDone\n .pipe(\n filter((state) => state === 'hidden'),\n take(1)\n )\n .subscribe(() => this.dialogRef.close(this.result));\n }\n\n private handleOverlayDetachments(): void {\n this.dialogRef.overlayRef\n .detachments()\n .pipe(take(1))\n .subscribe(() => {\n this.dialogRef.close(this.result);\n });\n }\n}\n","import { OverlayContainer } from '@angular/cdk/overlay';\nimport { ElementRef, inject, Injectable, InjectionToken } from '@angular/core';\nimport { KBQ_WINDOW } from '@koobiq/components/core';\n\n/**\n * Element that {@link KbqActionsPanelScopedOverlayContainer} renders overlays into.\n *\n * @docs-private\n */\nexport const KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_HOST = new InjectionToken<ElementRef<HTMLElement>>(\n 'KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_HOST'\n);\n\n/**\n * Class of the wrapper that {@link KbqActionsPanelScopedOverlayContainer} adds to the host.\n *\n * @docs-private\n */\nexport const KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_CONTAINER_SELECTOR = 'kbq-actions-panel-scoped-overlay-container';\n\n/**\n * Hosts currently promoted to a containing block, with the inline `position` to put back and the number of containers\n * relying on the promotion.\n *\n * The promotion belongs to the host rather than to a container: several containers share one host whenever panels\n * overlap — replacing an open panel creates the new overlay before the old one finishes closing — and the first\n * to be destroyed must not restore a `position` the others still need.\n */\nconst promotedHosts = new WeakMap<HTMLElement, { inlinePosition: string; containers: number }>();\n\n/**\n * `OverlayContainer` that renders overlays inside {@link KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_HOST} instead of\n * `document.body`.\n *\n * CDK resolves the overlay host from the `OverlayContainer` available in DI, and there is exactly one of those per\n * application. Providing this container in a child injector — together with a `Dialog` of its own — is what makes a\n * single overlay render inside a specific element while the rest of the application keeps using the global container.\n *\n * The container is scoped to one host and is not reusable: it is expected to be created and destroyed alongside the\n * overlay it hosts.\n *\n * @docs-private\n */\n@Injectable()\nexport class KbqActionsPanelScopedOverlayContainer extends OverlayContainer {\n private readonly host = inject(KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_HOST).nativeElement;\n private readonly window = inject(KBQ_WINDOW);\n\n /** Wrapper that isolates the container from the host's own content. */\n private wrapperElement: HTMLElement | null = null;\n\n /** Whether this container holds a share of the host's promotion to a containing block. */\n private holdsHostPromotion = false;\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n\n this.wrapperElement?.remove();\n this.wrapperElement = null;\n\n this.releaseHostPromotion();\n }\n\n /**\n * Deliberately does not call `super`: CDK's implementation marks the container with a `platform` attribute and\n * removes every other container carrying one, which is bookkeeping for the single application-wide container. A\n * scoped container is not that container, and joining the scheme would make it delete — and be deleted by — the\n * global one as soon as both exist.\n */\n protected override _createContainer(): void {\n const wrapper = this._document.createElement('div');\n\n wrapper.classList.add(KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_CONTAINER_SELECTOR);\n wrapper.style.position = 'absolute';\n wrapper.style.inset = '0';\n wrapper.style.pointerEvents = 'none';\n\n const container = this._document.createElement('div');\n\n container.classList.add('cdk-overlay-container');\n // CDK styles `.cdk-overlay-container` as a viewport-sized `position: fixed` layer. A scoped container has to\n // cover the host instead; the remaining CDK rules (`top`/`left`/`width`/`height`) already do the right thing\n // once the element is out of the fixed positioning context.\n container.style.position = 'absolute';\n\n // The container gets a wrapper of its own rather than being appended to the host directly, because CDK's\n // `Dialog` marks every sibling of the overlay container with `aria-hidden` while a dialog is open. Inside the\n // host those siblings are the very content the actions panel acts on, so the container is kept as an only\n // child and there is nothing left for CDK to hide.\n wrapper.appendChild(container);\n\n this.promoteHostToContainingBlock();\n this.host.appendChild(wrapper);\n\n this.wrapperElement = wrapper;\n this._containerElement = container;\n }\n\n /**\n * The wrapper is absolutely positioned, so it resolves against the nearest positioned ancestor. A `static` host\n * would let the overlay land on some outer element instead, so it is promoted to `relative`; a host that is\n * already positioned is left untouched.\n */\n private promoteHostToContainingBlock(): void {\n if (!this._platform.isBrowser) {\n return;\n }\n\n const promotion = promotedHosts.get(this.host);\n\n if (promotion) {\n promotion.containers++;\n this.holdsHostPromotion = true;\n\n return;\n }\n\n // A host that is not in the document yet reports no position at all (`getComputedStyle` returns an empty\n // declaration), and is treated as `static`: promoting one that turns out to be positioned is harmless,\n // leaving a `static` one alone is not.\n const { position } = this.window.getComputedStyle(this.host);\n\n if (position && position !== 'static') {\n return;\n }\n\n promotedHosts.set(this.host, { inlinePosition: this.host.style.position, containers: 1 });\n this.host.style.position = 'relative';\n this.holdsHostPromotion = true;\n }\n\n /** Gives the host its own `position` back once no scoped container depends on the promotion any more. */\n private releaseHostPromotion(): void {\n if (!this.holdsHostPromotion) {\n return;\n }\n\n this.holdsHostPromotion = false;\n\n const promotion = promotedHosts.get(this.host)!;\n\n if (--promotion.containers > 0) {\n return;\n }\n\n promotedHosts.delete(this.host);\n this.host.style.position = promotion.inlinePosition;\n }\n}\n","import { Dialog } from '@angular/cdk/dialog';\nimport { ComponentType, Overlay, OVERLAY_DEFAULT_CONFIG, OverlayContainer } from '@angular/cdk/overlay';\nimport {\n createEnvironmentInjector,\n ElementRef,\n EnvironmentInjector,\n inject,\n Injectable,\n InjectionToken,\n Injector,\n OnDestroy,\n TemplateRef\n} from '@angular/core';\nimport { KBQ_OVERFLOW_ITEMS_RESIZE_OBSERVER_TARGETS } from '@koobiq/components/overflow-items';\nimport { KBQ_ACTIONS_PANEL_DEFAULT_CONFIG, KbqActionsPanelConfig } from './actions-panel-config';\nimport { KbqActionsPanelContainer } from './actions-panel-container';\nimport { KbqActionsPanelRef } from './actions-panel-ref';\nimport {\n KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_HOST,\n KbqActionsPanelScopedOverlayContainer\n} from './actions-panel-scoped-overlay-container';\n\n/** Injection token that can be used to access the data that was passed in to actions panel. */\nexport const KBQ_ACTIONS_PANEL_DATA = new InjectionToken('KBQ_ACTIONS_PANEL_DATA');\n\n/**\n * Context for actions panel template.\n */\nexport type KbqActionsPanelTemplateContext<T = unknown, D = unknown, R = unknown> = {\n /**\n * Data passed to actions panel.\n *\n * Example:\n *\n * ```html\n * <ng-template #actionsPanel let-data>{{ data.KEY }}</ng-template>\n * ````\n */\n $implicit?: D | null;\n\n /**\n * Data passed to actions panel.\n *\n * Example:\n *\n * ```html\n * <ng-template #actionsPanel let-data=\"data\">{{ data.KEY }}</ng-template>\n * ````\n */\n data?: D | null;\n\n /**\n * Opened actions panel reference.\n *\n * Example:\n *\n * ```html\n * <ng-template #actionsPanel let-actionsPanelRef=\"actionsPanelRef\">\n * <button (click)=\"actionsPanelRef.close()\">close</button>\n * </ng-template>\n * ````\n */\n actionsPanelRef: KbqActionsPanelRef<T, R>;\n};\n\n/**\n * Selector for actions panel overlay.\n *\n * @internal\n */\nexport const KBQ_ACTIONS_PANEL_OVERLAY_SELECTOR = 'kbq-actions-panel-overlay';\n\n/**\n * `Dialog` backing a panel that renders into an `overlayContainer`.\n *\n * A child `Dialog` shares `openDialogs` with the root one but keeps an `_ariaHiddenElements` map of its own, and CDK\n * restores the `aria-hidden` marks from whichever instance happens to close the last dialog. Left apart, marks a root\n * dialog put on the application are never taken off again. Adopting the root's map keeps both halves of that\n * bookkeeping on the same object.\n */\n@Injectable()\nclass KbqActionsPanelScopedDialog extends Dialog {\n constructor() {\n super();\n\n this['_ariaHiddenElements'] = inject(Dialog, { skipSelf: true })['_ariaHiddenElements'];\n }\n}\n\n/**\n * Service for opening actions panel.\n */\n@Injectable({ providedIn: 'root' })\nexport class KbqActionsPanel implements OnDestroy {\n private readonly injector = inject(Injector);\n private readonly environmentInjector = inject(EnvironmentInjector);\n private readonly overlay = inject(Overlay);\n private readonly dialog = inject(Dialog);\n private readonly defaultConfig = inject(KBQ_ACTIONS_PANEL_DEFAULT_CONFIG);\n\n /** The reference to the currently opened actions panel. */\n private openedActionsPanelRef: KbqActionsPanelRef | null = null;\n\n ngOnDestroy() {\n this.close();\n }\n\n /**\n * Opens actions panel.\n *\n * @param componentOrTemplateRef Component to be opened into the actions panel.\n * @param config Additional configuration options for the actions panel.\n * @returns A reference to the opened actions panel.\n */\n open<T, D = unknown, R = unknown>(\n component: ComponentType<T>,\n config?: KbqActionsPanelConfig<D>\n ): KbqActionsPanelRef<T, R>;\n\n /**\n * Opens actions panel.\n *\n * @param template TemplateRef to be used as the content.\n * @param config Additional configuration options for the actions panel.\n * @returns A reference to the opened actions panel.\n */\n open<T, D = unknown, R = unknown>(\n template: TemplateRef<T>,\n config?: KbqActionsPanelConfig<D>\n ): KbqActionsPanelRef<T, R>;\n\n open<T, D = unknown, R = unknown>(\n componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,\n config?: KbqActionsPanelConfig<D>\n ): KbqActionsPanelRef<T, R> {\n const _config: KbqActionsPanelConfig<D> = {\n ...(this.defaultConfig as KbqActionsPanelConfig<D>),\n ...config\n };\n const actionsPanelRef = this.openDialog<T, D, R>(componentOrTemplateRef, _config);\n\n actionsPanelRef.afterClosed.subscribe(() => {\n if (this.openedActionsPanelRef === actionsPanelRef) {\n this.openedActionsPanelRef = null;\n }\n });\n\n if (this.openedActionsPanelRef) {\n this.openedActionsPanelRef.afterClosed.subscribe(() => {\n actionsPanelRef.open();\n });\n this.openedActionsPanelRef.close();\n } else {\n actionsPanelRef.open();\n }\n\n this.openedActionsPanelRef = actionsPanelRef as KbqActionsPanelRef;\n\n return actionsPanelRef;\n }\n\n /** Closes the currently opened actions panel. */\n close<R>(result?: R): void {\n this.openedActionsPanelRef?.close(result);\n }\n\n private openDialog<T, D = unknown, R = unknown>(\n componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,\n config: KbqActionsPanelConfig<D> = {}\n ): KbqActionsPanelRef<T, R> {\n let actionsPanelRef!: KbqActionsPanelRef<T, R>;\n const { overlayContainer, overlayPanelClass } = config;\n // CDK takes the overlay host from the `OverlayContainer` its `Dialog` was injected with, and there is one of\n // those per application. Rendering the panel inside `overlayContainer` therefore means giving this panel a\n // `Dialog` of its own, backed by a container scoped to that element.\n const scopedInjector = overlayContainer ? this.createScopedInjector(overlayContainer) : null;\n const dialog = scopedInjector ? scopedInjector.get(Dialog) : this.dialog;\n\n try {\n dialog.open<R, D, T>(componentOrTemplateRef, {\n ...config,\n container: KbqActionsPanelContainer,\n restoreFocus: false,\n autoFocus: null!,\n hasBackdrop: false,\n // Disable closing since we need to sync it up to the animation ourselves\n closeOnOverlayDetachments: false,\n // Disable closing since we need to sync it up to the animation ourselves\n closeOnDestroy: false,\n // Disable closing since we need to sync it up to the animation ourselves\n disableClose: true,\n scrollStrategy: config.scrollStrategy && config.scrollStrategy(this.overlay),\n // Pinned to the bottom center of the overlay container — the viewport by default, `overlayContainer`\n // when one is given. The panel's width follows from `.cdk-overlay-pane`'s `max-width: 100%` in both\n // cases.\n positionStrategy: this.overlay.position().global().centerHorizontally().bottom(),\n templateContext: () => {\n return {\n $implicit: config.data,\n data: config.data,\n actionsPanelRef\n } satisfies KbqActionsPanelTemplateContext<T, D, R>;\n },\n injector: Injector.create({\n parent: config.injector || this.injector,\n providers: [{ provide: KbqActionsPanelConfig, useValue: config }]\n }),\n providers: (dialogRef, _dialogConfig, container) => {\n actionsPanelRef = new KbqActionsPanelRef<T, R>(dialogRef, container as KbqActionsPanelContainer);\n\n return [\n { provide: KbqActionsPanelRef, useValue: actionsPanelRef },\n { provide: KBQ_ACTIONS_PANEL_DATA, useValue: config.data },\n // The panel is as wide as its content, and items hidden by `KbqOverflowItems` drop out of that\n // width, so the panel never grows back by itself. The overlay host spans the space the panel\n // may take: `overlayContainer`, or else the application-wide overlay container.\n {\n provide: KBQ_OVERFLOW_ITEMS_RESIZE_OBSERVER_TARGETS,\n useValue: [dialogRef.overlayRef.hostElement]\n }\n ];\n }\n });\n } catch (error) {\n // `open()` builds the overlay, and with it the scoped container that has already put a wrapper into the\n // host and promoted it. Nothing else would ever destroy the injector, so unwind it here.\n scopedInjector?.destroy();\n\n throw error;\n }\n\n const { overlayRef } = actionsPanelRef;\n\n overlayRef.addPanelClass(KBQ_ACTIONS_PANEL_OVERLAY_SELECTOR);\n\n if (overlayPanelClass) overlayRef.addPanelClass(overlayPanelClass);\n\n if (scopedInjector) {\n // The scoped injector owns the panel's `Dialog` and overlay container, so it lives exactly as long as the\n // panel. `afterClosed` emits after the overlay has been disposed of.\n actionsPanelRef.afterClosed.subscribe(() => scopedInjector.destroy());\n }\n\n return actionsPanelRef;\n }\n\n /** Injector that makes CDK render the panel's overlay inside `host` instead of `document.body`. */\n private createScopedInjector(host: ElementRef<HTMLElement>): EnvironmentInjector {\n return createEnvironmentInjector(\n [\n // A `Dialog` of its own is what carries the scoped container into `createOverlayRef` — the root one\n // resolves the application-wide container. It still reaches the root `Dialog` through `skipSelf` and\n // shares its registry of open dialogs, so `closeAll()` and `afterAllClosed` keep seeing this panel.\n { provide: Dialog, useClass: KbqActionsPanelScopedDialog },\n { provide: KBQ_ACTIONS_PANEL_SCOPED_OVERLAY_HOST, useValue: host },\n { provide: OverlayContainer, useClass: KbqActionsPanelScopedOverlayContainer },\n // A popover is shown in the top layer and laid out against the viewport, wherever its host sits in\n // the DOM: the panel would leave `host` and pin itself to the bottom of the page.\n { provide: OVERLAY_DEFAULT_CONFIG, useValue: { usePopover: false } }\n ],\n this.environmentInjector,\n KbqActionsPanel.name\n );\n }\n}\n","import { NgModule } from '@angular/core';\nimport { KbqActionsPanel } from './actions-panel';\nimport { KbqActionsPanelContainer } from './actions-panel-container';\n\nconst COMPONENTS = [\n KbqActionsPanelContainer\n];\n\n@NgModule({\n imports: COMPONENTS,\n providers: [KbqActionsPanel],\n exports: COMPONENTS\n})\nexport class KbqActionsPanelModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -872,7 +872,7 @@ class KbqAppSwitcherComponent extends KbqPopUp {
872
872
  .filter((site) => site.apps.length > 0);
873
873
  }
874
874
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqAppSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
875
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.25", type: KbqAppSwitcherComponent, isStandalone: true, selector: "kbq-app-switcher", inputs: { triggerInput: { classPropertyName: "triggerInput", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown": "keydownHandler($event)", "focusin": "focusinHandler($event)", "focusout": "focusoutHandler($event)" }, classAttribute: "kbq-app-switcher" }, viewQueries: [{ propertyName: "input", first: true, predicate: KbqInput, descendants: true, isSignal: true }, { propertyName: "otherSites", first: true, predicate: ["otherSites"], descendants: true, isSignal: true }, { propertyName: "allItemsQuery", predicate: KbqDropdownItem, descendants: true, isSignal: true }], usesInheritance: true, usesOnChanges: true, hostDirectives: [{ directive: i1$2.KbqLocaleOverridesDirective }], ngImport: i0, template: "@if (trigger.withSearch) {\n <div class=\"kbq-app-switcher__search-container\" (mouseenter)=\"otherSites()?.close()\">\n <kbq-form-field noBorders>\n <i kbq-icon=\"kbq-magnifying-glass_16\" aria-hidden=\"true\" kbqPrefix></i>\n <input\n placeholder=\"{{ localeConfiguration().searchPlaceholder }}\"\n autocomplete=\"off\"\n kbqInput\n [attr.aria-label]=\"localeConfiguration().searchPlaceholder\"\n [formControl]=\"searchControl\"\n />\n <!-- `kbq-cleaner` is a button with a localized default name; here it clears the search specifically. -->\n <kbq-cleaner [aria-label]=\"localeConfiguration().clearSearch\" />\n </kbq-form-field>\n </div>\n\n <kbq-divider />\n}\n\n<!--\n Everything between `role=\"menu\"` and the `role=\"menuitem\"` rows is marked `role=\"none\"`: the menu role\n requires its owned elements to be menu items, and the layout wrappers (and the dropdown host that provides\n the panel styling) would otherwise break that ownership chain. The scrollbar host cannot carry the menu\n role for the same reason - it injects its own focusable viewport element in between.\n-->\n<kbq-scrollbar>\n @if (!searchControl.getRawValue()) {\n <div role=\"menu\" aria-orientation=\"vertical\">\n <div class=\"kbq-app-switcher__app-container\" role=\"none\" (mouseenter)=\"otherSites()?.close()\">\n @if (trigger.sitesMode) {\n <div class=\"kbq-app-switcher-group-header\" role=\"none\">\n <div class=\"kbq-app-switcher-group-header__text\">{{ trigger.selectedSite()?.name }}</div>\n @if (trigger.selectedSite()?.status; as status) {\n <kbq-badge class=\"kbq-app-switcher-group-header__badge\" [compact]=\"true\">\n {{ status }}\n </kbq-badge>\n }\n </div>\n }\n\n <kbq-dropdown role=\"none\" [class]=\"'kbq-app-switcher-sites'\">\n <div kbqDropdownStaticContent role=\"none\" class=\"kbq-app-switcher-site\">\n @for (app of trigger.currentApps; track app.id || app.name) {\n @if (!app.aliases) {\n <a\n rel=\"noopener noreferrer\"\n kbq-app-switcher-list-item\n [attr.href]=\"app.link ?? null\"\n [attr.aria-current]=\"app.id === trigger.selectedApp()?.id ? 'true' : null\"\n [class.kbq-selected]=\"app.id === trigger.selectedApp()?.id\"\n [app]=\"app\"\n [toggle]=\"!!app.aliases\"\n ></a>\n } @else {\n <div\n #appSwitcherApp=\"kbqAppSwitcherApp\"\n kbq-app-switcher-list-item\n [app]=\"app\"\n [toggle]=\"!!app.aliases\"\n ></div>\n\n @if (!appSwitcherApp.collapsed()) {\n @for (alias of app.aliases; track alias.id) {\n <a\n rel=\"noopener noreferrer\"\n kbq-app-switcher-list-item\n [attr.href]=\"alias.link ?? null\"\n [attr.aria-current]=\"alias.id === trigger.selectedApp()?.id ? 'true' : null\"\n [class]=\"nestedAliasClass\"\n [class.kbq-selected]=\"alias.id === trigger.selectedApp()?.id\"\n [app]=\"alias\"\n ></a>\n }\n }\n }\n }\n </div>\n </kbq-dropdown>\n </div>\n\n @if (trigger.sitesMode) {\n <kbq-divider />\n\n <div class=\"kbq-app-switcher__sites-container\" role=\"none\">\n <div class=\"kbq-app-switcher-group-header\" role=\"none\">\n <div class=\"kbq-app-switcher-group-header__text\">{{ localeConfiguration().sitesHeader }}</div>\n </div>\n\n <kbq-dropdown #otherSites=\"kbqDropdown\" role=\"none\">\n <div kbqDropdownStaticContent role=\"none\" class=\"kbq-app-switcher-sites\">\n @for (site of trigger.sites; track site.id) {\n @if (site.id !== trigger.selectedSite()?.id) {\n <div\n [kbq-app-switcher-dropdown-site]=\"site\"\n [kbqDropdownTriggerFor]=\"dropdownWithSelectedSite\"\n [kbqDropdownTriggerData]=\"{ site }\"\n [offsetX]=\"0\"\n ></div>\n }\n }\n </div>\n </kbq-dropdown>\n </div>\n\n <!--\n The flyout panels must stay in the same view as the triggers above: a template reference\n variable is only visible inside the view that declares it. Their hosts render empty (the\n content moves into an overlay when opened), so `role=\"none\"` keeps the menu ownership\n chain intact.\n\n Each panel is shared by its triggers, so it renders the data of the trigger that opened it\n (`kbqDropdownTriggerData`), not of the last hovered row: the safe area keeps a panel open\n while the pointer crosses other triggers.\n -->\n <kbq-dropdown #dropdownWithSelectedSite=\"kbqDropdown\" role=\"none\" [class]=\"'kbq-app-switcher-sites'\">\n <ng-template let-site=\"site\" kbqDropdownContent>\n @for (app of site.apps; track app.id || app.name) {\n @if (app.aliases) {\n <div\n #dropdownWithGroupedAppsTrigger=\"kbqDropdownTrigger\"\n [kbq-app-switcher-dropdown-app]=\"app\"\n [kbqDropdownTriggerFor]=\"dropdownWithGroupedApps\"\n [kbqDropdownTriggerData]=\"{ site, app }\"\n [offsetX]=\"0\"\n [class.kbq-pressed]=\"dropdownWithGroupedAppsTrigger.opened\"\n ></div>\n } @else {\n <a\n rel=\"noopener noreferrer\"\n [attr.href]=\"app.link ?? null\"\n [kbq-app-switcher-dropdown-app]=\"app\"\n (click)=\"selectAppInSite(site, app)\"\n ></a>\n }\n }\n </ng-template>\n </kbq-dropdown>\n\n <kbq-dropdown #dropdownWithGroupedApps=\"kbqDropdown\" role=\"none\" [class]=\"'kbq-app-switcher-sites'\">\n <ng-template let-site=\"site\" let-app=\"app\" kbqDropdownContent>\n @for (alias of app.aliases; track alias.id) {\n <a\n rel=\"noopener noreferrer\"\n [attr.href]=\"alias.link ?? null\"\n [kbq-app-switcher-dropdown-app]=\"alias\"\n (click)=\"selectAppInSite(site, alias)\"\n ></a>\n }\n </ng-template>\n </kbq-dropdown>\n }\n </div>\n } @else {\n <div class=\"kbq-app-switcher__search-result\">\n @if (filteredSites.length) {\n <div role=\"menu\" aria-orientation=\"vertical\">\n <kbq-dropdown role=\"none\" [class]=\"'kbq-app-switcher-sites'\">\n <div kbqDropdownStaticContent role=\"none\" class=\"kbq-app-switcher-site\">\n @for (site of filteredSites; track site.id) {\n @if (trigger.sitesMode && site.apps) {\n <kbq-optgroup label=\"{{ site.name }}\" role=\"none\" />\n }\n\n @for (app of site.apps; track app.id || app.name) {\n <a\n rel=\"noopener noreferrer\"\n kbq-app-switcher-list-item\n [attr.href]=\"app.link ?? null\"\n [app]=\"app\"\n [highlightText]=\"searchControl.getRawValue() ?? ''\"\n ></a>\n }\n }\n </div>\n </kbq-dropdown>\n </div>\n }\n\n <!--\n Outside the menu: a status message is not a menu item. The live region itself stays mounted\n while the query changes, so the message is announced once it appears - a region inserted into\n the DOM together with its text is announced unreliably. It collapses while there are results\n (`:empty`, see app-switcher.scss).\n -->\n <div class=\"kbq-app-switcher__empty-search-result\" role=\"status\">\n @if (!filteredSites.length) {\n {{ localeConfiguration().searchEmptyResult }}\n }\n </div>\n </div>\n }\n</kbq-scrollbar>\n", styles: [".kbq-app-switcher{position:relative;display:flex;flex-direction:column;margin-top:var(--kbq-size-xxs);margin-bottom:var(--kbq-size-xxs);width:var(--kbq-app-switcher-size-container-width, 320px);border-radius:var(--kbq-size-xs)}@supports (corner-shape: squircle){.kbq-app-switcher{corner-shape:squircle;border-radius:clamp(var(--kbq-size-xs) * 1.85,var(--kbq-size-xs) * 2.3 - 3.6px,var(--kbq-size-xs) * 2)}}.kbq-app-switcher{box-shadow:var(--kbq-shadow-popup);box-sizing:border-box;z-index:1}.kbq-app-switcher__search-container{padding-top:var(--kbq-size-xxs)}.kbq-app-switcher__search-result{max-width:var(--kbq-app-switcher-size-container-width, 320px);min-height:0;padding:var(--kbq-size-s) var(--kbq-size-xxs)}.kbq-app-switcher__empty-search-result{display:flex;justify-content:center;align-items:center;height:var(--kbq-app-switcher-size-empty-search-result-height, 96px)}.kbq-app-switcher__empty-search-result:empty{display:none}.kbq-app-switcher__app-container{display:flex;flex-direction:column;min-height:0;padding:var(--kbq-size-s) var(--kbq-size-xxs)}.kbq-app-switcher-group-header{padding:var(--kbq-size-s) var(--kbq-size-m);display:flex;flex-direction:row;justify-content:space-between}.kbq-app-switcher__sites-container{padding:var(--kbq-size-xxs)}.kbq-app-switcher{background:var(--kbq-background-card)}.kbq-app-switcher .kbq-app-switcher-group-header,.kbq-app-switcher__empty-search-result{color:var(--kbq-foreground-contrast-secondary)}.kbq-app-switcher,.kbq-app-switcher__empty-search-result{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-app-switcher-group-header__text{font-size:var(--kbq-typography-caps-compact-strong-font-size);font-style:var(--kbq-typography-caps-compact-strong-font-style);font-weight:var(--kbq-typography-caps-compact-strong-font-weight);line-height:var(--kbq-typography-caps-compact-strong-line-height);font-family:var(--kbq-typography-caps-compact-strong-font-family);text-transform:var(--kbq-typography-caps-compact-strong-text-transform);font-feature-settings:var(--kbq-typography-caps-compact-strong-font-feature-settings);letter-spacing:var(--kbq-typography-caps-compact-strong-letter-spacing)}.kbq-app-switcher-group-header__badge{font-size:var(--kbq-typography-text-compact-medium-font-size);font-style:var(--kbq-typography-text-compact-medium-font-style);font-weight:var(--kbq-typography-text-compact-medium-font-weight);line-height:var(--kbq-typography-text-compact-medium-line-height);font-family:var(--kbq-typography-text-compact-medium-font-family);text-transform:var(--kbq-typography-text-compact-medium-text-transform);font-feature-settings:var(--kbq-typography-text-compact-medium-font-feature-settings);letter-spacing:var(--kbq-typography-text-compact-medium-letter-spacing)}\n", ".kbq-app-switcher,.kbq-app-switcher-sites{--kbq-app-switcher-size-container-width: 320px;--kbq-app-switcher-size-empty-search-result-height: 96px;--kbq-app-switcher-size-list-item-height-min: 38px;--kbq-app-switcher-size-dropdown-app-height-min: 50px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: KbqInputModule }, { kind: "directive", type: i3.KbqInput, selector: "input[kbqInput],input[kbqNumberInput]", inputs: ["errorStateMatcher", "placeholder", "disabled", "id", "required", "type", "value"], exportAs: ["kbqInput"] }, { kind: "component", type: i4.KbqCleaner, selector: "kbq-cleaner", inputs: ["aria-label"], exportAs: ["kbqCleaner"] }, { kind: "component", type: i4.KbqFormField, selector: "kbq-form-field", inputs: ["noBorders", "inOverlay", "horizontal", "labelClass", "contentClass"], outputs: ["inOverlayChange"], exportAs: ["kbqFormField"] }, { kind: "directive", type: i4.KbqPrefix, selector: "[kbqPrefix]", exportAs: ["kbqPrefix"] }, { kind: "directive", type: i4.KbqTrim, selector: "[kbqInput], [kbqTextarea]", exportAs: ["KbqTrim"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i1$1.KbqIcon, selector: "[kbq-icon]", inputs: ["aria-hidden", "iconSize", "autoColor", "kbq-icon"] }, { kind: "ngmodule", type: KbqDividerModule }, { kind: "component", type: i6.KbqDivider, selector: "kbq-divider", inputs: ["vertical", "paddings", "decorative", "length"] }, { kind: "ngmodule", type: KbqBadgeModule }, { kind: "component", type: i1.KbqBadge, selector: "kbq-badge", inputs: ["compact", "outline", "badgeColor"] }, { kind: "directive", type: i1.KbqBadgeCssStyler, selector: "kbq-badge" }, { kind: "ngmodule", type: KbqDropdownModule }, { kind: "component", type: i8.KbqDropdown, selector: "kbq-dropdown", inputs: ["activeDescendantNavigation", "navigationWithWrap", "xPosition", "yPosition", "overlapTriggerY", "overlapTriggerX", "hasBackdrop", "class", "backdropClass", "panelWidth", "panelMinWidth", "panelMaxWidth", "safeArea"], outputs: ["xPositionChange", "yPositionChange", "overlapTriggerYChange", "overlapTriggerXChange", "closed"], exportAs: ["kbqDropdown"] }, { kind: "directive", type: i8.KbqDropdownTrigger, selector: "[kbqDropdownTriggerFor]", inputs: ["offsetX", "offsetY", "kbqDropdownTriggerData", "openByArrowDown", "kbqDropdownTriggerOrigin", "kbqDropdownTriggerAutoFocus", "kbqDropdownTriggerRestoreFocus", "kbqDropdownTriggerFor"], outputs: ["offsetXChange", "openByArrowDownChange", "kbqDropdownTriggerRestoreFocusChange", "dropdownOpened", "dropdownClosed"], exportAs: ["kbqDropdownTrigger"] }, { kind: "directive", type: i8.KbqDropdownContent, selector: "ng-template[kbqDropdownContent]" }, { kind: "directive", type: i8.KbqDropdownStaticContent, selector: "[kbqDropdownStaticContent]" }, { kind: "component", type: KbqScrollbar, selector: "kbq-scrollbar", inputs: ["kbqScrollbarMode", "kbqScrollbarHideDelay"], exportAs: ["kbqScrollbar"] }, { kind: "ngmodule", type: KbqOptionModule }, { kind: "component", type: i1$2.KbqOptgroup, selector: "kbq-optgroup", inputs: ["label", "disabled"], exportAs: ["kbqOptgroup"] }, { kind: "component", type: KbqAppSwitcherDropdownApp, selector: "[kbq-app-switcher-dropdown-app]", inputs: ["kbq-app-switcher-dropdown-app"], exportAs: ["kbqAppSwitcherDropdownApp"] }, { kind: "component", type: KbqAppSwitcherDropdownSite, selector: "[kbq-app-switcher-dropdown-site]", inputs: ["kbq-app-switcher-dropdown-site"], exportAs: ["kbqAppSwitcherDropdownSite"] }, { kind: "component", type: KbqAppSwitcherListItem, selector: "[kbq-app-switcher-list-item]", inputs: ["app", "toggle", "highlightText", "collapsed"], outputs: ["collapsedChange"], exportAs: ["kbqAppSwitcherApp"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
875
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.25", type: KbqAppSwitcherComponent, isStandalone: true, selector: "kbq-app-switcher", inputs: { triggerInput: { classPropertyName: "triggerInput", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown": "keydownHandler($event)", "focusin": "focusinHandler($event)", "focusout": "focusoutHandler($event)" }, classAttribute: "kbq-app-switcher" }, viewQueries: [{ propertyName: "input", first: true, predicate: KbqInput, descendants: true, isSignal: true }, { propertyName: "otherSites", first: true, predicate: ["otherSites"], descendants: true, isSignal: true }, { propertyName: "allItemsQuery", predicate: KbqDropdownItem, descendants: true, isSignal: true }], usesInheritance: true, usesOnChanges: true, hostDirectives: [{ directive: i1$2.KbqLocaleOverridesDirective }], ngImport: i0, template: "@if (trigger.withSearch) {\n <div class=\"kbq-app-switcher__search-container\" (mouseenter)=\"otherSites()?.close()\">\n <kbq-form-field noBorders>\n <i kbq-icon=\"kbq-magnifying-glass_16\" aria-hidden=\"true\" kbqPrefix></i>\n <input\n placeholder=\"{{ localeConfiguration().searchPlaceholder }}\"\n autocomplete=\"off\"\n kbqInput\n [attr.aria-label]=\"localeConfiguration().searchPlaceholder\"\n [formControl]=\"searchControl\"\n />\n <!-- `kbq-cleaner` is a button with a localized default name; here it clears the search specifically. -->\n <kbq-cleaner [aria-label]=\"localeConfiguration().clearSearch\" />\n </kbq-form-field>\n </div>\n\n <kbq-divider />\n}\n\n<!--\n Everything between `role=\"menu\"` and the `role=\"menuitem\"` rows is marked `role=\"none\"`: the menu role\n requires its owned elements to be menu items, and the layout wrappers (and the dropdown host that provides\n the panel styling) would otherwise break that ownership chain. The scrollbar host cannot carry the menu\n role for the same reason - it injects its own focusable viewport element in between.\n-->\n<kbq-scrollbar>\n @if (!searchControl.getRawValue()) {\n <div role=\"menu\" aria-orientation=\"vertical\">\n <div class=\"kbq-app-switcher__app-container\" role=\"none\" (mouseenter)=\"otherSites()?.close()\">\n @if (trigger.sitesMode) {\n <div class=\"kbq-app-switcher-group-header\" role=\"none\">\n <div class=\"kbq-app-switcher-group-header__text\">{{ trigger.selectedSite()?.name }}</div>\n @if (trigger.selectedSite()?.status; as status) {\n <kbq-badge class=\"kbq-app-switcher-group-header__badge\" [compact]=\"true\">\n {{ status }}\n </kbq-badge>\n }\n </div>\n }\n\n <kbq-dropdown role=\"none\" [class]=\"'kbq-app-switcher-sites'\">\n <div kbqDropdownStaticContent role=\"none\" class=\"kbq-app-switcher-site\">\n @for (app of trigger.currentApps; track app.id || app.name) {\n @if (!app.aliases) {\n <a\n rel=\"noopener noreferrer\"\n kbq-app-switcher-list-item\n [attr.href]=\"app.link ?? null\"\n [attr.aria-current]=\"app.id === trigger.selectedApp()?.id ? 'true' : null\"\n [class.kbq-selected]=\"app.id === trigger.selectedApp()?.id\"\n [app]=\"app\"\n [toggle]=\"!!app.aliases\"\n ></a>\n } @else {\n <div\n #appSwitcherApp=\"kbqAppSwitcherApp\"\n kbq-app-switcher-list-item\n [app]=\"app\"\n [toggle]=\"!!app.aliases\"\n ></div>\n\n @if (!appSwitcherApp.collapsed()) {\n @for (alias of app.aliases; track alias.id) {\n <a\n rel=\"noopener noreferrer\"\n kbq-app-switcher-list-item\n [attr.href]=\"alias.link ?? null\"\n [attr.aria-current]=\"alias.id === trigger.selectedApp()?.id ? 'true' : null\"\n [class]=\"nestedAliasClass\"\n [class.kbq-selected]=\"alias.id === trigger.selectedApp()?.id\"\n [app]=\"alias\"\n ></a>\n }\n }\n }\n }\n </div>\n </kbq-dropdown>\n </div>\n\n @if (trigger.sitesMode) {\n <kbq-divider />\n\n <div class=\"kbq-app-switcher__sites-container\" role=\"none\">\n <div class=\"kbq-app-switcher-group-header\" role=\"none\">\n <div class=\"kbq-app-switcher-group-header__text\">{{ localeConfiguration().sitesHeader }}</div>\n </div>\n\n <kbq-dropdown #otherSites=\"kbqDropdown\" role=\"none\">\n <div kbqDropdownStaticContent role=\"none\" class=\"kbq-app-switcher-sites\">\n @for (site of trigger.sites; track site.id) {\n @if (site.id !== trigger.selectedSite()?.id) {\n <div\n [kbq-app-switcher-dropdown-site]=\"site\"\n [kbqDropdownTriggerFor]=\"dropdownWithSelectedSite\"\n [kbqDropdownTriggerData]=\"{ site }\"\n [offsetX]=\"0\"\n ></div>\n }\n }\n </div>\n </kbq-dropdown>\n </div>\n\n <!--\n The flyout panels must stay in the same view as the triggers above: a template reference\n variable is only visible inside the view that declares it. Their hosts render empty (the\n content moves into an overlay when opened), so `role=\"none\"` keeps the menu ownership\n chain intact.\n\n Each panel is shared by its triggers, so it renders the data of the trigger that opened it\n (`kbqDropdownTriggerData`), not of the last hovered row: the safe area keeps a panel open\n while the pointer crosses other triggers.\n -->\n <kbq-dropdown #dropdownWithSelectedSite=\"kbqDropdown\" role=\"none\" [class]=\"'kbq-app-switcher-sites'\">\n <ng-template let-site=\"site\" kbqDropdownContent>\n @for (app of site.apps; track app.id || app.name) {\n @if (app.aliases) {\n <div\n #dropdownWithGroupedAppsTrigger=\"kbqDropdownTrigger\"\n [kbq-app-switcher-dropdown-app]=\"app\"\n [kbqDropdownTriggerFor]=\"dropdownWithGroupedApps\"\n [kbqDropdownTriggerData]=\"{ site, app }\"\n [offsetX]=\"0\"\n [class.kbq-pressed]=\"dropdownWithGroupedAppsTrigger.opened\"\n ></div>\n } @else {\n <a\n rel=\"noopener noreferrer\"\n [attr.href]=\"app.link ?? null\"\n [kbq-app-switcher-dropdown-app]=\"app\"\n (click)=\"selectAppInSite(site, app)\"\n ></a>\n }\n }\n </ng-template>\n </kbq-dropdown>\n\n <kbq-dropdown #dropdownWithGroupedApps=\"kbqDropdown\" role=\"none\" [class]=\"'kbq-app-switcher-sites'\">\n <ng-template let-site=\"site\" let-app=\"app\" kbqDropdownContent>\n @for (alias of app.aliases; track alias.id) {\n <a\n rel=\"noopener noreferrer\"\n [attr.href]=\"alias.link ?? null\"\n [kbq-app-switcher-dropdown-app]=\"alias\"\n (click)=\"selectAppInSite(site, alias)\"\n ></a>\n }\n </ng-template>\n </kbq-dropdown>\n }\n </div>\n } @else {\n <div class=\"kbq-app-switcher__search-result\">\n @if (filteredSites.length) {\n <div role=\"menu\" aria-orientation=\"vertical\">\n <kbq-dropdown role=\"none\" [class]=\"'kbq-app-switcher-sites'\">\n <div kbqDropdownStaticContent role=\"none\" class=\"kbq-app-switcher-site\">\n @for (site of filteredSites; track site.id) {\n @if (trigger.sitesMode && site.apps) {\n <kbq-optgroup label=\"{{ site.name }}\" role=\"none\" />\n }\n\n @for (app of site.apps; track app.id || app.name) {\n <a\n rel=\"noopener noreferrer\"\n kbq-app-switcher-list-item\n [attr.href]=\"app.link ?? null\"\n [app]=\"app\"\n [highlightText]=\"searchControl.getRawValue() ?? ''\"\n ></a>\n }\n }\n </div>\n </kbq-dropdown>\n </div>\n }\n\n <!--\n Outside the menu: a status message is not a menu item. The live region itself stays mounted\n while the query changes, so the message is announced once it appears - a region inserted into\n the DOM together with its text is announced unreliably. It collapses while there are results\n (`:empty`, see app-switcher.scss).\n -->\n <div class=\"kbq-app-switcher__empty-search-result\" role=\"status\">\n @if (!filteredSites.length) {\n {{ localeConfiguration().searchEmptyResult }}\n }\n </div>\n </div>\n }\n</kbq-scrollbar>\n", styles: [".kbq-app-switcher{position:relative;display:flex;flex-direction:column;margin-top:var(--kbq-size-xxs);margin-bottom:var(--kbq-size-xxs);width:var(--kbq-app-switcher-size-container-width, 320px);border-radius:var(--kbq-size-xs)}@supports (corner-shape: squircle){.kbq-app-switcher{corner-shape:squircle;border-radius:clamp(var(--kbq-size-xs) * 1.85,var(--kbq-size-xs) * 2.3 - 3.6px,var(--kbq-size-xs) * 2)}}.kbq-app-switcher{box-shadow:var(--kbq-shadow-popup);box-sizing:border-box;z-index:1}.kbq-app-switcher__search-container{padding-top:var(--kbq-size-xxs)}.kbq-app-switcher__search-result{max-width:var(--kbq-app-switcher-size-container-width, 320px);min-height:0;padding:var(--kbq-size-s) var(--kbq-size-xxs)}.kbq-app-switcher__empty-search-result{display:flex;justify-content:center;align-items:center;height:var(--kbq-app-switcher-size-empty-search-result-height, 96px)}.kbq-app-switcher__empty-search-result:empty{display:none}.kbq-app-switcher__app-container{display:flex;flex-direction:column;min-height:0;padding:var(--kbq-size-s) var(--kbq-size-xxs)}.kbq-app-switcher-group-header{padding:var(--kbq-size-s) var(--kbq-size-m);display:flex;flex-direction:row;justify-content:space-between}.kbq-app-switcher__sites-container{padding:var(--kbq-size-xxs)}.kbq-app-switcher{background:var(--kbq-background-card)}.kbq-app-switcher .kbq-app-switcher-group-header,.kbq-app-switcher__empty-search-result{color:var(--kbq-foreground-contrast-secondary)}.kbq-app-switcher,.kbq-app-switcher__empty-search-result{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-app-switcher-group-header__text{font-size:var(--kbq-typography-caps-compact-strong-font-size);font-style:var(--kbq-typography-caps-compact-strong-font-style);font-weight:var(--kbq-typography-caps-compact-strong-font-weight);line-height:var(--kbq-typography-caps-compact-strong-line-height);font-family:var(--kbq-typography-caps-compact-strong-font-family);text-transform:var(--kbq-typography-caps-compact-strong-text-transform);font-feature-settings:var(--kbq-typography-caps-compact-strong-font-feature-settings);letter-spacing:var(--kbq-typography-caps-compact-strong-letter-spacing)}.kbq-app-switcher-group-header__badge{font-size:var(--kbq-typography-text-compact-medium-font-size);font-style:var(--kbq-typography-text-compact-medium-font-style);font-weight:var(--kbq-typography-text-compact-medium-font-weight);line-height:var(--kbq-typography-text-compact-medium-line-height);font-family:var(--kbq-typography-text-compact-medium-font-family);text-transform:var(--kbq-typography-text-compact-medium-text-transform);font-feature-settings:var(--kbq-typography-text-compact-medium-font-feature-settings);letter-spacing:var(--kbq-typography-text-compact-medium-letter-spacing)}\n", ".kbq-app-switcher,.kbq-app-switcher-sites{--kbq-app-switcher-size-container-width: 320px;--kbq-app-switcher-size-empty-search-result-height: 96px;--kbq-app-switcher-size-list-item-height-min: 38px;--kbq-app-switcher-size-dropdown-app-height-min: 50px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: KbqInputModule }, { kind: "directive", type: i3.KbqInput, selector: "input[kbqInput],input[kbqNumberInput]", inputs: ["errorStateMatcher", "placeholder", "disabled", "readonly", "id", "required", "type", "value"], exportAs: ["kbqInput"] }, { kind: "component", type: i4.KbqCleaner, selector: "kbq-cleaner", inputs: ["aria-label"], exportAs: ["kbqCleaner"] }, { kind: "component", type: i4.KbqFormField, selector: "kbq-form-field", inputs: ["noBorders", "inOverlay", "horizontal", "labelClass", "contentClass", "showRequiredMarker"], outputs: ["inOverlayChange"], exportAs: ["kbqFormField"] }, { kind: "directive", type: i4.KbqPrefix, selector: "[kbqPrefix]", exportAs: ["kbqPrefix"] }, { kind: "directive", type: i4.KbqTrim, selector: "[kbqInput], [kbqTextarea]", exportAs: ["KbqTrim"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i1$1.KbqIcon, selector: "[kbq-icon]", inputs: ["aria-hidden", "iconSize", "autoColor", "kbq-icon"] }, { kind: "ngmodule", type: KbqDividerModule }, { kind: "component", type: i6.KbqDivider, selector: "kbq-divider", inputs: ["vertical", "paddings", "decorative", "length"] }, { kind: "ngmodule", type: KbqBadgeModule }, { kind: "component", type: i1.KbqBadge, selector: "kbq-badge", inputs: ["compact", "outline", "badgeColor"] }, { kind: "directive", type: i1.KbqBadgeCssStyler, selector: "kbq-badge" }, { kind: "ngmodule", type: KbqDropdownModule }, { kind: "component", type: i8.KbqDropdown, selector: "kbq-dropdown", inputs: ["activeDescendantNavigation", "navigationWithWrap", "xPosition", "yPosition", "overlapTriggerY", "overlapTriggerX", "hasBackdrop", "class", "backdropClass", "panelWidth", "panelMinWidth", "panelMaxWidth", "safeArea"], outputs: ["xPositionChange", "yPositionChange", "overlapTriggerYChange", "overlapTriggerXChange", "closed"], exportAs: ["kbqDropdown"] }, { kind: "directive", type: i8.KbqDropdownTrigger, selector: "[kbqDropdownTriggerFor]", inputs: ["offsetX", "offsetY", "kbqDropdownTriggerData", "openByArrowDown", "kbqDropdownTriggerOrigin", "kbqDropdownTriggerAutoFocus", "kbqDropdownTriggerRestoreFocus", "kbqDropdownTriggerFor"], outputs: ["offsetXChange", "openByArrowDownChange", "kbqDropdownTriggerRestoreFocusChange", "dropdownOpened", "dropdownClosed"], exportAs: ["kbqDropdownTrigger"] }, { kind: "directive", type: i8.KbqDropdownContent, selector: "ng-template[kbqDropdownContent]" }, { kind: "directive", type: i8.KbqDropdownStaticContent, selector: "[kbqDropdownStaticContent]" }, { kind: "component", type: KbqScrollbar, selector: "kbq-scrollbar", inputs: ["kbqScrollbarMode", "kbqScrollbarHideDelay"], exportAs: ["kbqScrollbar"] }, { kind: "ngmodule", type: KbqOptionModule }, { kind: "component", type: i1$2.KbqOptgroup, selector: "kbq-optgroup", inputs: ["label", "disabled"], exportAs: ["kbqOptgroup"] }, { kind: "component", type: KbqAppSwitcherDropdownApp, selector: "[kbq-app-switcher-dropdown-app]", inputs: ["kbq-app-switcher-dropdown-app"], exportAs: ["kbqAppSwitcherDropdownApp"] }, { kind: "component", type: KbqAppSwitcherDropdownSite, selector: "[kbq-app-switcher-dropdown-site]", inputs: ["kbq-app-switcher-dropdown-site"], exportAs: ["kbqAppSwitcherDropdownSite"] }, { kind: "component", type: KbqAppSwitcherListItem, selector: "[kbq-app-switcher-list-item]", inputs: ["app", "toggle", "highlightText", "collapsed"], outputs: ["collapsedChange"], exportAs: ["kbqAppSwitcherApp"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
876
876
  }
877
877
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqAppSwitcherComponent, decorators: [{
878
878
  type: Component,