@copilotkitnext/angular 0.0.9-alpha.2 → 0.0.10

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 (210) hide show
  1. package/dist/esm2022/index.mjs +2 -70
  2. package/dist/esm2022/lib/agent.mjs +73 -0
  3. package/dist/esm2022/lib/chat-config.mjs +35 -0
  4. package/dist/esm2022/lib/chat-state.mjs +18 -0
  5. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +344 -0
  6. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +260 -0
  7. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +22 -0
  8. package/dist/esm2022/{components/chat/copilot-chat-assistant-message.component.mjs → lib/components/chat/copilot-chat-assistant-message.mjs} +216 -240
  9. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
  10. package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +196 -0
  11. package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +299 -0
  12. package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +39 -0
  13. package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +634 -0
  14. package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +10 -0
  15. package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +27 -0
  16. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +268 -0
  17. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +2 -0
  18. package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +139 -0
  19. package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +36 -0
  20. package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +20 -0
  21. package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +203 -0
  22. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +118 -0
  23. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +182 -0
  24. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +28 -0
  25. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +25 -0
  26. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +306 -0
  27. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +2 -0
  28. package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +48 -0
  29. package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +41 -0
  30. package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +19 -0
  31. package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +96 -0
  32. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +89 -0
  33. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +456 -0
  34. package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +404 -0
  35. package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +2 -0
  36. package/dist/esm2022/lib/components/chat/copilot-chat.mjs +167 -0
  37. package/dist/esm2022/lib/config.mjs +9 -0
  38. package/dist/esm2022/lib/copilotkit.mjs +124 -0
  39. package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +130 -0
  40. package/dist/esm2022/lib/directives/stick-to-bottom.mjs +170 -0
  41. package/dist/esm2022/lib/directives/tooltip.mjs +217 -0
  42. package/dist/esm2022/lib/human-in-the-loop.mjs +19 -0
  43. package/dist/esm2022/lib/render-tool-calls.mjs +131 -0
  44. package/dist/esm2022/lib/resize-observer.mjs +152 -0
  45. package/dist/esm2022/lib/scroll-position.mjs +124 -0
  46. package/dist/esm2022/lib/slots/copilot-slot.mjs +156 -0
  47. package/dist/esm2022/lib/slots/index.mjs +4 -0
  48. package/dist/esm2022/lib/slots/slot.types.mjs +3 -3
  49. package/dist/esm2022/lib/slots/slot.utils.mjs +19 -15
  50. package/dist/esm2022/lib/tools.mjs +31 -0
  51. package/dist/esm2022/lib/utils.mjs +3 -3
  52. package/dist/esm2022/public-api.mjs +47 -0
  53. package/dist/fesm2022/copilotkitnext-angular.mjs +5249 -8271
  54. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  55. package/dist/index.d.ts +1 -55
  56. package/dist/lib/agent.d.ts +53 -0
  57. package/dist/{core/chat-configuration/chat-configuration.types.d.ts → lib/chat-config.d.ts} +4 -8
  58. package/dist/lib/chat-state.d.ts +10 -0
  59. package/dist/lib/components/chat/copilot-chat-assistant-message-buttons.d.ts +68 -0
  60. package/dist/lib/components/chat/copilot-chat-assistant-message-renderer.d.ts +26 -0
  61. package/dist/lib/components/chat/copilot-chat-assistant-message-toolbar.d.ts +7 -0
  62. package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +178 -0
  63. package/dist/{components → lib/components}/chat/copilot-chat-assistant-message.types.d.ts +1 -1
  64. package/dist/{components/chat/copilot-chat-audio-recorder.component.d.ts → lib/components/chat/copilot-chat-audio-recorder.d.ts} +10 -10
  65. package/dist/lib/components/chat/copilot-chat-buttons.d.ts +65 -0
  66. package/dist/lib/components/chat/copilot-chat-input-defaults.d.ts +38 -0
  67. package/dist/lib/components/chat/copilot-chat-input.d.ts +133 -0
  68. package/dist/{components → lib/components}/chat/copilot-chat-input.types.d.ts +11 -11
  69. package/dist/lib/components/chat/copilot-chat-message-view-cursor.d.ts +11 -0
  70. package/dist/{components/chat/copilot-chat-message-view.component.d.ts → lib/components/chat/copilot-chat-message-view.d.ts} +68 -36
  71. package/dist/{components → lib/components}/chat/copilot-chat-message-view.types.d.ts +2 -2
  72. package/dist/lib/components/chat/copilot-chat-textarea.d.ts +41 -0
  73. package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +55 -0
  74. package/dist/lib/components/chat/copilot-chat-toolbar.d.ts +7 -0
  75. package/dist/lib/components/chat/copilot-chat-tools-menu.d.ts +20 -0
  76. package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +20 -0
  77. package/dist/lib/components/chat/copilot-chat-user-message-buttons.d.ts +35 -0
  78. package/dist/lib/components/chat/copilot-chat-user-message-renderer.d.ts +8 -0
  79. package/dist/lib/components/chat/copilot-chat-user-message-toolbar.d.ts +7 -0
  80. package/dist/lib/components/chat/copilot-chat-user-message.d.ts +55 -0
  81. package/dist/{components → lib/components}/chat/copilot-chat-user-message.types.d.ts +2 -2
  82. package/dist/lib/components/chat/copilot-chat-view-disclaimer.d.ts +15 -0
  83. package/dist/{components/chat/copilot-chat-view-feather.component.d.ts → lib/components/chat/copilot-chat-view-feather.d.ts} +6 -6
  84. package/dist/{components/chat/copilot-chat-view-handlers.service.d.ts → lib/components/chat/copilot-chat-view-handlers.d.ts} +3 -3
  85. package/dist/lib/components/chat/copilot-chat-view-input-container.d.ts +23 -0
  86. package/dist/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.d.ts +16 -0
  87. package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +114 -0
  88. package/dist/lib/components/chat/copilot-chat-view.d.ts +239 -0
  89. package/dist/{components → lib/components}/chat/copilot-chat-view.types.d.ts +2 -2
  90. package/dist/lib/components/chat/copilot-chat.d.ts +67 -0
  91. package/dist/lib/config.d.ts +16 -0
  92. package/dist/lib/copilotkit.d.ts +29 -0
  93. package/dist/{directives/copilotkit-agent-context.directive.d.ts → lib/directives/copilotkit-agent-context.d.ts} +5 -5
  94. package/dist/lib/directives/stick-to-bottom.d.ts +62 -0
  95. package/dist/lib/directives/tooltip.d.ts +33 -0
  96. package/dist/lib/human-in-the-loop.d.ts +13 -0
  97. package/dist/lib/render-tool-calls.d.ts +75 -0
  98. package/dist/{services/resize-observer.service.d.ts → lib/resize-observer.d.ts} +2 -2
  99. package/dist/{services/scroll-position.service.d.ts → lib/scroll-position.d.ts} +6 -6
  100. package/dist/lib/slots/copilot-slot.d.ts +34 -0
  101. package/dist/lib/slots/index.d.ts +3 -0
  102. package/dist/lib/slots/slot.types.d.ts +1 -1
  103. package/dist/lib/slots/slot.utils.d.ts +6 -4
  104. package/dist/lib/tools.d.ts +63 -0
  105. package/dist/lib/utils.d.ts +1 -1
  106. package/dist/public-api.d.ts +46 -0
  107. package/dist/styles.css +0 -69
  108. package/package.json +3 -3
  109. package/dist/components/chat/copilot-chat-assistant-message-buttons.component.d.ts +0 -75
  110. package/dist/components/chat/copilot-chat-assistant-message-renderer.component.d.ts +0 -31
  111. package/dist/components/chat/copilot-chat-assistant-message-toolbar.component.d.ts +0 -8
  112. package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +0 -132
  113. package/dist/components/chat/copilot-chat-buttons.component.d.ts +0 -66
  114. package/dist/components/chat/copilot-chat-input-defaults.d.ts +0 -37
  115. package/dist/components/chat/copilot-chat-input.component.d.ts +0 -133
  116. package/dist/components/chat/copilot-chat-message-view-cursor.component.d.ts +0 -15
  117. package/dist/components/chat/copilot-chat-textarea.component.d.ts +0 -45
  118. package/dist/components/chat/copilot-chat-tool-calls-view.component.d.ts +0 -35
  119. package/dist/components/chat/copilot-chat-toolbar.component.d.ts +0 -8
  120. package/dist/components/chat/copilot-chat-tools-menu.component.d.ts +0 -20
  121. package/dist/components/chat/copilot-chat-user-message-branch-navigation.component.d.ts +0 -23
  122. package/dist/components/chat/copilot-chat-user-message-buttons.component.d.ts +0 -39
  123. package/dist/components/chat/copilot-chat-user-message-renderer.component.d.ts +0 -9
  124. package/dist/components/chat/copilot-chat-user-message-toolbar.component.d.ts +0 -8
  125. package/dist/components/chat/copilot-chat-user-message.component.d.ts +0 -55
  126. package/dist/components/chat/copilot-chat-view-disclaimer.component.d.ts +0 -15
  127. package/dist/components/chat/copilot-chat-view-input-container.component.d.ts +0 -23
  128. package/dist/components/chat/copilot-chat-view-scroll-to-bottom-button.component.d.ts +0 -17
  129. package/dist/components/chat/copilot-chat-view-scroll-view.component.d.ts +0 -84
  130. package/dist/components/chat/copilot-chat-view.component.d.ts +0 -205
  131. package/dist/components/chat/copilot-chat.component.d.ts +0 -36
  132. package/dist/components/copilotkit-tool-render.component.d.ts +0 -25
  133. package/dist/core/chat-configuration/chat-configuration.providers.d.ts +0 -54
  134. package/dist/core/chat-configuration/chat-configuration.service.d.ts +0 -75
  135. package/dist/core/copilotkit.providers.d.ts +0 -13
  136. package/dist/core/copilotkit.service.d.ts +0 -119
  137. package/dist/core/copilotkit.types.d.ts +0 -81
  138. package/dist/directives/copilotkit-agent.directive.d.ts +0 -106
  139. package/dist/directives/copilotkit-chat-config.directive.d.ts +0 -84
  140. package/dist/directives/copilotkit-config.directive.d.ts +0 -44
  141. package/dist/directives/copilotkit-frontend-tool.directive.d.ts +0 -25
  142. package/dist/directives/copilotkit-human-in-the-loop.directive.d.ts +0 -124
  143. package/dist/directives/stick-to-bottom.directive.d.ts +0 -62
  144. package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +0 -384
  145. package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +0 -286
  146. package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +0 -27
  147. package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
  148. package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +0 -202
  149. package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +0 -321
  150. package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +0 -38
  151. package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +0 -666
  152. package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +0 -10
  153. package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +0 -45
  154. package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +0 -296
  155. package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +0 -2
  156. package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +0 -188
  157. package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +0 -222
  158. package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +0 -25
  159. package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +0 -199
  160. package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +0 -137
  161. package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +0 -207
  162. package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +0 -35
  163. package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +0 -34
  164. package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +0 -341
  165. package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +0 -2
  166. package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +0 -52
  167. package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +0 -55
  168. package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +0 -19
  169. package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +0 -110
  170. package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +0 -93
  171. package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +0 -443
  172. package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +0 -479
  173. package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +0 -2
  174. package/dist/esm2022/components/chat/copilot-chat.component.mjs +0 -220
  175. package/dist/esm2022/components/copilotkit-tool-render.component.mjs +0 -150
  176. package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +0 -65
  177. package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +0 -145
  178. package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +0 -26
  179. package/dist/esm2022/core/copilotkit.providers.mjs +0 -34
  180. package/dist/esm2022/core/copilotkit.service.mjs +0 -411
  181. package/dist/esm2022/core/copilotkit.types.mjs +0 -13
  182. package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +0 -130
  183. package/dist/esm2022/directives/copilotkit-agent.directive.mjs +0 -221
  184. package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +0 -218
  185. package/dist/esm2022/directives/copilotkit-config.directive.mjs +0 -94
  186. package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +0 -128
  187. package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +0 -265
  188. package/dist/esm2022/directives/stick-to-bottom.directive.mjs +0 -181
  189. package/dist/esm2022/lib/directives/tooltip.directive.mjs +0 -211
  190. package/dist/esm2022/lib/slots/copilot-slot.component.mjs +0 -154
  191. package/dist/esm2022/services/resize-observer.service.mjs +0 -152
  192. package/dist/esm2022/services/scroll-position.service.mjs +0 -124
  193. package/dist/esm2022/types/frontend-tool.mjs +0 -2
  194. package/dist/esm2022/types/human-in-the-loop.mjs +0 -2
  195. package/dist/esm2022/utils/agent-context.utils.mjs +0 -114
  196. package/dist/esm2022/utils/agent.utils.mjs +0 -212
  197. package/dist/esm2022/utils/chat-config.utils.mjs +0 -186
  198. package/dist/esm2022/utils/copilotkit.utils.mjs +0 -20
  199. package/dist/esm2022/utils/frontend-tool.utils.mjs +0 -224
  200. package/dist/esm2022/utils/human-in-the-loop.utils.mjs +0 -293
  201. package/dist/lib/directives/tooltip.directive.d.ts +0 -33
  202. package/dist/lib/slots/copilot-slot.component.d.ts +0 -34
  203. package/dist/types/frontend-tool.d.ts +0 -37
  204. package/dist/types/human-in-the-loop.d.ts +0 -44
  205. package/dist/utils/agent-context.utils.d.ts +0 -75
  206. package/dist/utils/agent.utils.d.ts +0 -108
  207. package/dist/utils/chat-config.utils.d.ts +0 -166
  208. package/dist/utils/copilotkit.utils.d.ts +0 -16
  209. package/dist/utils/frontend-tool.utils.d.ts +0 -119
  210. package/dist/utils/human-in-the-loop.utils.d.ts +0 -92
@@ -1,181 +0,0 @@
1
- import { Directive, Input, Output, EventEmitter, ElementRef, inject } from '@angular/core';
2
- import { ScrollPositionService } from '../services/scroll-position.service';
3
- import { ResizeObserverService } from '../services/resize-observer.service';
4
- import { Subject } from 'rxjs';
5
- import { takeUntil, debounceTime, filter, distinctUntilChanged } from 'rxjs/operators';
6
- import * as i0 from "@angular/core";
7
- /**
8
- * Directive for implementing stick-to-bottom scroll behavior
9
- * Similar to the React use-stick-to-bottom library
10
- *
11
- * @example
12
- * ```html
13
- * <div copilotStickToBottom
14
- * [enabled]="true"
15
- * [threshold]="10"
16
- * [initialBehavior]="'smooth'"
17
- * [resizeBehavior]="'smooth'"
18
- * (isAtBottomChange)="onBottomChange($event)">
19
- * <!-- Content -->
20
- * </div>
21
- * ```
22
- */
23
- export class StickToBottomDirective {
24
- enabled = true;
25
- threshold = 10;
26
- initialBehavior = 'smooth';
27
- resizeBehavior = 'smooth';
28
- debounceMs = 100;
29
- isAtBottomChange = new EventEmitter();
30
- scrollToBottomRequested = new EventEmitter();
31
- elementRef = inject(ElementRef);
32
- scrollService = inject(ScrollPositionService);
33
- resizeService = inject(ResizeObserverService);
34
- destroy$ = new Subject();
35
- contentElement;
36
- wasAtBottom = true;
37
- hasInitialized = false;
38
- userHasScrolled = false;
39
- ngOnInit() {
40
- // Setup will happen in ngAfterViewInit
41
- }
42
- ngAfterViewInit() {
43
- const element = this.elementRef.nativeElement;
44
- // Find or create content wrapper
45
- this.contentElement = element.querySelector('[data-stick-to-bottom-content]');
46
- if (!this.contentElement) {
47
- this.contentElement = element;
48
- }
49
- this.setupScrollMonitoring();
50
- this.setupResizeMonitoring();
51
- this.setupContentMutationObserver();
52
- // Initial scroll to bottom if enabled
53
- setTimeout(() => {
54
- this.hasInitialized = true;
55
- if (this.enabled) {
56
- this.scrollToBottom(this.initialBehavior);
57
- }
58
- }, 0);
59
- }
60
- setupScrollMonitoring() {
61
- if (!this.enabled)
62
- return;
63
- const element = this.elementRef.nativeElement;
64
- // Monitor scroll position
65
- this.scrollService.monitorScrollPosition(element, this.threshold)
66
- .pipe(takeUntil(this.destroy$), debounceTime(this.debounceMs), distinctUntilChanged((a, b) => a.isAtBottom === b.isAtBottom))
67
- .subscribe(state => {
68
- const wasAtBottom = this.wasAtBottom;
69
- this.wasAtBottom = state.isAtBottom;
70
- // Detect user scroll
71
- if (!state.isAtBottom && wasAtBottom && this.hasInitialized) {
72
- this.userHasScrolled = true;
73
- }
74
- else if (state.isAtBottom) {
75
- this.userHasScrolled = false;
76
- }
77
- // Emit change
78
- this.isAtBottomChange.emit(state.isAtBottom);
79
- });
80
- }
81
- setupResizeMonitoring() {
82
- if (!this.enabled || !this.contentElement)
83
- return;
84
- // Monitor content resize
85
- this.resizeService.observeElement(this.contentElement, 0, 250)
86
- .pipe(takeUntil(this.destroy$), filter(() => this.enabled && !this.userHasScrolled))
87
- .subscribe(state => {
88
- // Auto-scroll on resize if we were at bottom
89
- if (this.wasAtBottom && !state.isResizing) {
90
- this.scrollToBottom(this.resizeBehavior);
91
- }
92
- });
93
- // Monitor container resize
94
- const element = this.elementRef.nativeElement;
95
- this.resizeService.observeElement(element, 0, 250)
96
- .pipe(takeUntil(this.destroy$), filter(() => this.enabled && !this.userHasScrolled && this.wasAtBottom))
97
- .subscribe(() => {
98
- // Adjust scroll on container resize
99
- this.scrollToBottom(this.resizeBehavior);
100
- });
101
- }
102
- setupContentMutationObserver() {
103
- if (!this.enabled || !this.contentElement)
104
- return;
105
- const mutationObserver = new MutationObserver(() => {
106
- if (this.enabled && this.wasAtBottom && !this.userHasScrolled) {
107
- // Content changed, scroll to bottom if we were there
108
- requestAnimationFrame(() => {
109
- this.scrollToBottom(this.resizeBehavior);
110
- });
111
- }
112
- });
113
- mutationObserver.observe(this.contentElement, {
114
- childList: true,
115
- subtree: true,
116
- characterData: true
117
- });
118
- // Cleanup on destroy
119
- this.destroy$.subscribe(() => {
120
- mutationObserver.disconnect();
121
- });
122
- }
123
- /**
124
- * Public method to scroll to bottom
125
- * Can be called from parent component
126
- */
127
- scrollToBottom(behavior = 'smooth') {
128
- const element = this.elementRef.nativeElement;
129
- const smooth = behavior === 'smooth';
130
- this.scrollService.scrollToBottom(element, smooth);
131
- this.userHasScrolled = false;
132
- this.scrollToBottomRequested.emit();
133
- }
134
- /**
135
- * Check if currently at bottom
136
- */
137
- isAtBottom() {
138
- return this.scrollService.isAtBottom(this.elementRef.nativeElement, this.threshold);
139
- }
140
- /**
141
- * Get current scroll state
142
- */
143
- getScrollState() {
144
- const element = this.elementRef.nativeElement;
145
- return {
146
- scrollTop: element.scrollTop,
147
- scrollHeight: element.scrollHeight,
148
- clientHeight: element.clientHeight,
149
- isAtBottom: this.isAtBottom()
150
- };
151
- }
152
- ngOnDestroy() {
153
- this.destroy$.next();
154
- this.destroy$.complete();
155
- }
156
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickToBottomDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
157
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: StickToBottomDirective, isStandalone: true, selector: "[copilotStickToBottom]", inputs: { enabled: "enabled", threshold: "threshold", initialBehavior: "initialBehavior", resizeBehavior: "resizeBehavior", debounceMs: "debounceMs" }, outputs: { isAtBottomChange: "isAtBottomChange", scrollToBottomRequested: "scrollToBottomRequested" }, providers: [ScrollPositionService, ResizeObserverService], ngImport: i0 });
158
- }
159
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickToBottomDirective, decorators: [{
160
- type: Directive,
161
- args: [{
162
- selector: '[copilotStickToBottom]',
163
- standalone: true,
164
- providers: [ScrollPositionService, ResizeObserverService]
165
- }]
166
- }], propDecorators: { enabled: [{
167
- type: Input
168
- }], threshold: [{
169
- type: Input
170
- }], initialBehavior: [{
171
- type: Input
172
- }], resizeBehavior: [{
173
- type: Input
174
- }], debounceMs: [{
175
- type: Input
176
- }], isAtBottomChange: [{
177
- type: Output
178
- }], scrollToBottomRequested: [{
179
- type: Output
180
- }] } });
181
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpY2stdG8tYm90dG9tLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kaXJlY3RpdmVzL3N0aWNrLXRvLWJvdHRvbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixVQUFVLEVBSVYsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxPQUFPLEVBQXdCLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUl2Rjs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFNSCxNQUFNLE9BQU8sc0JBQXNCO0lBQ3hCLE9BQU8sR0FBWSxJQUFJLENBQUM7SUFDeEIsU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUN2QixlQUFlLEdBQW1CLFFBQVEsQ0FBQztJQUMzQyxjQUFjLEdBQW1CLFFBQVEsQ0FBQztJQUMxQyxVQUFVLEdBQVcsR0FBRyxDQUFDO0lBRXhCLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDL0MsdUJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUVyRCxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLGFBQWEsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUM5QyxhQUFhLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFOUMsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDL0IsY0FBYyxDQUFlO0lBQzdCLFdBQVcs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RUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0FuS1Usc0JBQXNCOzRGQUF0QixzQkFBc0Isb1VBRnRCLENBQUMscUJBQXFCLEVBQUUscUJBQXFCLENBQUM7OzRGQUU5QyxzQkFBc0I7a0JBTGxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFNBQVMsRUFBRSxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDO2lCQUMxRDs4QkFFVSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBBZnRlclZpZXdJbml0LFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTY3JvbGxQb3NpdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zY3JvbGwtcG9zaXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBSZXNpemVPYnNlcnZlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXNpemUtb2JzZXJ2ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCB0eXBlIFNjcm9sbEJlaGF2aW9yID0gJ3Ntb290aCcgfCAnaW5zdGFudCcgfCAnYXV0byc7XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBpbXBsZW1lbnRpbmcgc3RpY2stdG8tYm90dG9tIHNjcm9sbCBiZWhhdmlvclxuICogU2ltaWxhciB0byB0aGUgUmVhY3QgdXNlLXN0aWNrLXRvLWJvdHRvbSBsaWJyYXJ5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8ZGl2IGNvcGlsb3RTdGlja1RvQm90dG9tXG4gKiAgICAgIFtlbmFibGVkXT1cInRydWVcIlxuICogICAgICBbdGhyZXNob2xkXT1cIjEwXCJcbiAqICAgICAgW2luaXRpYWxCZWhhdmlvcl09XCInc21vb3RoJ1wiXG4gKiAgICAgIFtyZXNpemVCZWhhdmlvcl09XCInc21vb3RoJ1wiXG4gKiAgICAgIChpc0F0Qm90dG9tQ2hhbmdlKT1cIm9uQm90dG9tQ2hhbmdlKCRldmVudClcIj5cbiAqICAgPCEtLSBDb250ZW50IC0tPlxuICogPC9kaXY+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NvcGlsb3RTdGlja1RvQm90dG9tXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHByb3ZpZGVyczogW1Njcm9sbFBvc2l0aW9uU2VydmljZSwgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBTdGlja1RvQm90dG9tRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBlbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgdGhyZXNob2xkOiBudW1iZXIgPSAxMDtcbiAgQElucHV0KCkgaW5pdGlhbEJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9ICdzbW9vdGgnO1xuICBASW5wdXQoKSByZXNpemVCZWhhdmlvcjogU2Nyb2xsQmVoYXZpb3IgPSAnc21vb3RoJztcbiAgQElucHV0KCkgZGVib3VuY2VNczogbnVtYmVyID0gMTAwO1xuICBcbiAgQE91dHB1dCgpIGlzQXRCb3R0b21DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBzY3JvbGxUb0JvdHRvbVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIHByaXZhdGUgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSBzY3JvbGxTZXJ2aWNlID0gaW5qZWN0KFNjcm9sbFBvc2l0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVzaXplU2VydmljZSA9IGluamVjdChSZXNpemVPYnNlcnZlclNlcnZpY2UpO1xuICBcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgY29udGVudEVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSB3YXNBdEJvdHRvbSA9IHRydWU7XG4gIHByaXZhdGUgaGFzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSB1c2VySGFzU2Nyb2xsZWQgPSBmYWxzZTtcbiAgXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFNldHVwIHdpbGwgaGFwcGVuIGluIG5nQWZ0ZXJWaWV3SW5pdFxuICB9XG4gIFxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIFxuICAgIC8vIEZpbmQgb3IgY3JlYXRlIGNvbnRlbnQgd3JhcHBlclxuICAgIHRoaXMuY29udGVudEVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXN0aWNrLXRvLWJvdHRvbS1jb250ZW50XScpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghdGhpcy5jb250ZW50RWxlbWVudCkge1xuICAgICAgdGhpcy5jb250ZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuc2V0dXBTY3JvbGxNb25pdG9yaW5nKCk7XG4gICAgdGhpcy5zZXR1cFJlc2l6ZU1vbml0b3JpbmcoKTtcbiAgICB0aGlzLnNldHVwQ29udGVudE11dGF0aW9uT2JzZXJ2ZXIoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsIHNjcm9sbCB0byBib3R0b20gaWYgZW5hYmxlZFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5oYXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5lbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5pbml0aWFsQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG4gIFxuICBwcml2YXRlIHNldHVwU2Nyb2xsTW9uaXRvcmluZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBcbiAgICAvLyBNb25pdG9yIHNjcm9sbCBwb3NpdGlvblxuICAgIHRoaXMuc2Nyb2xsU2VydmljZS5tb25pdG9yU2Nyb2xsUG9zaXRpb24oZWxlbWVudCwgdGhpcy50aHJlc2hvbGQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZU1zKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGEuaXNBdEJvdHRvbSA9PT0gYi5pc0F0Qm90dG9tKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICAgIGNvbnN0IHdhc0F0Qm90dG9tID0gdGhpcy53YXNBdEJvdHRvbTtcbiAgICAgICAgdGhpcy53YXNBdEJvdHRvbSA9IHN0YXRlLmlzQXRCb3R0b207XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlY3QgdXNlciBzY3JvbGxcbiAgICAgICAgaWYgKCFzdGF0ZS5pc0F0Qm90dG9tICYmIHdhc0F0Qm90dG9tICYmIHRoaXMuaGFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICB0aGlzLnVzZXJIYXNTY3JvbGxlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaXNBdEJvdHRvbSkge1xuICAgICAgICAgIHRoaXMudXNlckhhc1Njcm9sbGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEVtaXQgY2hhbmdlXG4gICAgICAgIHRoaXMuaXNBdEJvdHRvbUNoYW5nZS5lbWl0KHN0YXRlLmlzQXRCb3R0b20pO1xuICAgICAgfSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc2V0dXBSZXNpemVNb25pdG9yaW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVkIHx8ICF0aGlzLmNvbnRlbnRFbGVtZW50KSByZXR1cm47XG4gICAgXG4gICAgLy8gTW9uaXRvciBjb250ZW50IHJlc2l6ZVxuICAgIHRoaXMucmVzaXplU2VydmljZS5vYnNlcnZlRWxlbWVudCh0aGlzLmNvbnRlbnRFbGVtZW50LCAwLCAyNTApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkICYmICF0aGlzLnVzZXJIYXNTY3JvbGxlZClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuICAgICAgICAvLyBBdXRvLXNjcm9sbCBvbiByZXNpemUgaWYgd2Ugd2VyZSBhdCBib3R0b21cbiAgICAgICAgaWYgKHRoaXMud2FzQXRCb3R0b20gJiYgIXN0YXRlLmlzUmVzaXppbmcpIHtcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMucmVzaXplQmVoYXZpb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBcbiAgICAvLyBNb25pdG9yIGNvbnRhaW5lciByZXNpemVcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZXNpemVTZXJ2aWNlLm9ic2VydmVFbGVtZW50KGVsZW1lbnQsIDAsIDI1MClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQgJiYgIXRoaXMudXNlckhhc1Njcm9sbGVkICYmIHRoaXMud2FzQXRCb3R0b20pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gQWRqdXN0IHNjcm9sbCBvbiBjb250YWluZXIgcmVzaXplXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5yZXNpemVCZWhhdmlvcik7XG4gICAgICB9KTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzZXR1cENvbnRlbnRNdXRhdGlvbk9ic2VydmVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVkIHx8ICF0aGlzLmNvbnRlbnRFbGVtZW50KSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgJiYgdGhpcy53YXNBdEJvdHRvbSAmJiAhdGhpcy51c2VySGFzU2Nyb2xsZWQpIHtcbiAgICAgICAgLy8gQ29udGVudCBjaGFuZ2VkLCBzY3JvbGwgdG8gYm90dG9tIGlmIHdlIHdlcmUgdGhlcmVcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMucmVzaXplQmVoYXZpb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5jb250ZW50RWxlbWVudCwge1xuICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBDbGVhbnVwIG9uIGRlc3Ryb3lcbiAgICB0aGlzLmRlc3Ryb3kkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFB1YmxpYyBtZXRob2QgdG8gc2Nyb2xsIHRvIGJvdHRvbVxuICAgKiBDYW4gYmUgY2FsbGVkIGZyb20gcGFyZW50IGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIHNjcm9sbFRvQm90dG9tKGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9ICdzbW9vdGgnKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHNtb290aCA9IGJlaGF2aW9yID09PSAnc21vb3RoJztcbiAgICBcbiAgICB0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsVG9Cb3R0b20oZWxlbWVudCwgc21vb3RoKTtcbiAgICB0aGlzLnVzZXJIYXNTY3JvbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b21SZXF1ZXN0ZWQuZW1pdCgpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudGx5IGF0IGJvdHRvbVxuICAgKi9cbiAgcHVibGljIGlzQXRCb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsU2VydmljZS5pc0F0Qm90dG9tKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnRocmVzaG9sZCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBzY3JvbGwgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXRTY3JvbGxTdGF0ZSgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3AsXG4gICAgICBzY3JvbGxIZWlnaHQ6IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0LFxuICAgICAgY2xpZW50SGVpZ2h0OiBlbGVtZW50LmNsaWVudEhlaWdodCxcbiAgICAgIGlzQXRCb3R0b206IHRoaXMuaXNBdEJvdHRvbSgpXG4gICAgfTtcbiAgfVxuICBcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59Il19
@@ -1,211 +0,0 @@
1
- import { Directive, Input, ElementRef, HostListener, inject, ViewContainerRef } from '@angular/core';
2
- import { Overlay, OverlayPositionBuilder } from '@angular/cdk/overlay';
3
- import { ComponentPortal } from '@angular/cdk/portal';
4
- import { Component, ChangeDetectionStrategy } from '@angular/core';
5
- import * as i0 from "@angular/core";
6
- export class TooltipContentComponent {
7
- cdr;
8
- text = '';
9
- _position = 'below';
10
- get position() {
11
- return this._position;
12
- }
13
- set position(value) {
14
- this._position = value;
15
- this.cdr.markForCheck();
16
- }
17
- constructor(cdr) {
18
- this.cdr = cdr;
19
- }
20
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TooltipContentComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
21
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TooltipContentComponent, isStandalone: true, selector: "copilot-tooltip-content", ngImport: i0, template: `
22
- <div class="copilot-tooltip-wrapper" [attr.data-position]="position">
23
- <div class="copilot-tooltip">
24
- {{ text }}
25
- </div>
26
- <div class="copilot-tooltip-arrow"></div>
27
- </div>
28
- `, isInline: true, styles: [".copilot-tooltip-wrapper{position:relative;display:inline-block;animation:fadeIn .15s ease-in-out}.copilot-tooltip{background-color:#1a1a1a;color:#fff;padding:6px 10px;border-radius:6px;font-size:12px;font-weight:500;white-space:nowrap;max-width:200px;box-shadow:0 2px 8px #00000026}.copilot-tooltip-arrow{position:absolute;width:0;height:0;border-style:solid}.copilot-tooltip-wrapper[data-position=below] .copilot-tooltip-arrow{top:-4px;left:50%;transform:translate(-50%);border-width:0 4px 4px 4px;border-color:transparent transparent #1a1a1a transparent}.copilot-tooltip-wrapper[data-position=above] .copilot-tooltip-arrow{bottom:-4px;left:50%;transform:translate(-50%);border-width:4px 4px 0 4px;border-color:#1a1a1a transparent transparent transparent}.copilot-tooltip-wrapper[data-position=left] .copilot-tooltip-arrow{right:-4px;top:50%;transform:translateY(-50%);border-width:4px 0 4px 4px;border-color:transparent transparent transparent #1a1a1a}.copilot-tooltip-wrapper[data-position=right] .copilot-tooltip-arrow{left:-4px;top:50%;transform:translateY(-50%);border-width:4px 4px 4px 0;border-color:transparent #1a1a1a transparent transparent}@keyframes fadeIn{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
29
- }
30
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TooltipContentComponent, decorators: [{
31
- type: Component,
32
- args: [{ selector: 'copilot-tooltip-content', template: `
33
- <div class="copilot-tooltip-wrapper" [attr.data-position]="position">
34
- <div class="copilot-tooltip">
35
- {{ text }}
36
- </div>
37
- <div class="copilot-tooltip-arrow"></div>
38
- </div>
39
- `, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, styles: [".copilot-tooltip-wrapper{position:relative;display:inline-block;animation:fadeIn .15s ease-in-out}.copilot-tooltip{background-color:#1a1a1a;color:#fff;padding:6px 10px;border-radius:6px;font-size:12px;font-weight:500;white-space:nowrap;max-width:200px;box-shadow:0 2px 8px #00000026}.copilot-tooltip-arrow{position:absolute;width:0;height:0;border-style:solid}.copilot-tooltip-wrapper[data-position=below] .copilot-tooltip-arrow{top:-4px;left:50%;transform:translate(-50%);border-width:0 4px 4px 4px;border-color:transparent transparent #1a1a1a transparent}.copilot-tooltip-wrapper[data-position=above] .copilot-tooltip-arrow{bottom:-4px;left:50%;transform:translate(-50%);border-width:4px 4px 0 4px;border-color:#1a1a1a transparent transparent transparent}.copilot-tooltip-wrapper[data-position=left] .copilot-tooltip-arrow{right:-4px;top:50%;transform:translateY(-50%);border-width:4px 0 4px 4px;border-color:transparent transparent transparent #1a1a1a}.copilot-tooltip-wrapper[data-position=right] .copilot-tooltip-arrow{left:-4px;top:50%;transform:translateY(-50%);border-width:4px 4px 4px 0;border-color:transparent #1a1a1a transparent transparent}@keyframes fadeIn{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}\n"] }]
40
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }] });
41
- export class CopilotTooltipDirective {
42
- tooltipText = '';
43
- tooltipPosition = 'below';
44
- tooltipDelay = 500; // milliseconds
45
- overlay = inject(Overlay);
46
- overlayPositionBuilder = inject(OverlayPositionBuilder);
47
- elementRef = inject(ElementRef);
48
- viewContainerRef = inject(ViewContainerRef);
49
- overlayRef;
50
- tooltipTimeout;
51
- originalTitle;
52
- onMouseEnter() {
53
- if (!this.tooltipText)
54
- return;
55
- // Store and remove native title to prevent OS tooltip
56
- const element = this.elementRef.nativeElement;
57
- if (element.hasAttribute('title')) {
58
- this.originalTitle = element.getAttribute('title');
59
- element.removeAttribute('title');
60
- }
61
- // Clear any existing timeout
62
- if (this.tooltipTimeout) {
63
- clearTimeout(this.tooltipTimeout);
64
- }
65
- // Set timeout to show tooltip after delay
66
- this.tooltipTimeout = window.setTimeout(() => {
67
- this.show();
68
- }, this.tooltipDelay);
69
- }
70
- onMouseLeave() {
71
- // Clear timeout if mouse leaves before tooltip shows
72
- if (this.tooltipTimeout) {
73
- clearTimeout(this.tooltipTimeout);
74
- this.tooltipTimeout = undefined;
75
- }
76
- // Restore original title if it existed
77
- if (this.originalTitle !== undefined) {
78
- this.elementRef.nativeElement.setAttribute('title', this.originalTitle);
79
- this.originalTitle = undefined;
80
- }
81
- // Hide tooltip if it's showing
82
- this.hide();
83
- }
84
- show() {
85
- if (this.overlayRef) {
86
- return;
87
- }
88
- // Create overlay
89
- const positionStrategy = this.overlayPositionBuilder
90
- .flexibleConnectedTo(this.elementRef)
91
- .withPositions(this.getPositions())
92
- .withPush(false);
93
- this.overlayRef = this.overlay.create({
94
- positionStrategy,
95
- scrollStrategy: this.overlay.scrollStrategies.close(),
96
- hasBackdrop: false
97
- });
98
- // Create component portal and attach
99
- const portal = new ComponentPortal(TooltipContentComponent, this.viewContainerRef);
100
- const componentRef = this.overlayRef.attach(portal);
101
- componentRef.instance.text = this.tooltipText;
102
- // Detect actual position after overlay is positioned
103
- setTimeout(() => {
104
- if (this.overlayRef && this.elementRef.nativeElement) {
105
- const tooltipRect = this.overlayRef.overlayElement.getBoundingClientRect();
106
- const elementRect = this.elementRef.nativeElement.getBoundingClientRect();
107
- let actualPosition = 'below';
108
- // Determine actual position based on relative positions
109
- if (tooltipRect.bottom <= elementRect.top) {
110
- actualPosition = 'above';
111
- }
112
- else if (tooltipRect.top >= elementRect.bottom) {
113
- actualPosition = 'below';
114
- }
115
- else if (tooltipRect.right <= elementRect.left) {
116
- actualPosition = 'left';
117
- }
118
- else if (tooltipRect.left >= elementRect.right) {
119
- actualPosition = 'right';
120
- }
121
- componentRef.instance.position = actualPosition;
122
- }
123
- }, 0);
124
- }
125
- hide() {
126
- if (this.overlayRef) {
127
- this.overlayRef.dispose();
128
- this.overlayRef = undefined;
129
- }
130
- }
131
- getPositions() {
132
- const positions = {
133
- above: [
134
- {
135
- originX: 'center',
136
- originY: 'top',
137
- overlayX: 'center',
138
- overlayY: 'bottom',
139
- offsetY: -12
140
- }
141
- ],
142
- below: [
143
- {
144
- originX: 'center',
145
- originY: 'bottom',
146
- overlayX: 'center',
147
- overlayY: 'top',
148
- offsetY: 12
149
- }
150
- ],
151
- left: [
152
- {
153
- originX: 'start',
154
- originY: 'center',
155
- overlayX: 'end',
156
- overlayY: 'center',
157
- offsetX: -12
158
- }
159
- ],
160
- right: [
161
- {
162
- originX: 'end',
163
- originY: 'center',
164
- overlayX: 'start',
165
- overlayY: 'center',
166
- offsetX: 12
167
- }
168
- ]
169
- };
170
- // Prefer below position, but use above as fallback
171
- const primary = positions[this.tooltipPosition] || positions.below;
172
- // For below position, add above as first fallback
173
- const fallbacks = this.tooltipPosition === 'below'
174
- ? [...(positions.above || []), ...(positions.left || []), ...(positions.right || [])]
175
- : Object.values(positions).filter(p => p !== primary).flat();
176
- return [...(primary || []), ...fallbacks];
177
- }
178
- ngOnDestroy() {
179
- if (this.tooltipTimeout) {
180
- clearTimeout(this.tooltipTimeout);
181
- }
182
- // Restore original title if it existed
183
- if (this.originalTitle !== undefined) {
184
- this.elementRef.nativeElement.setAttribute('title', this.originalTitle);
185
- }
186
- this.hide();
187
- }
188
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotTooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
189
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotTooltipDirective, isStandalone: true, selector: "[copilotTooltip]", inputs: { tooltipText: ["copilotTooltip", "tooltipText"], tooltipPosition: "tooltipPosition", tooltipDelay: "tooltipDelay" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, ngImport: i0 });
190
- }
191
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotTooltipDirective, decorators: [{
192
- type: Directive,
193
- args: [{
194
- selector: '[copilotTooltip]',
195
- standalone: true
196
- }]
197
- }], propDecorators: { tooltipText: [{
198
- type: Input,
199
- args: ['copilotTooltip']
200
- }], tooltipPosition: [{
201
- type: Input
202
- }], tooltipDelay: [{
203
- type: Input
204
- }], onMouseEnter: [{
205
- type: HostListener,
206
- args: ['mouseenter']
207
- }], onMouseLeave: [{
208
- type: HostListener,
209
- args: ['mouseleave']
210
- }] } });
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RpcmVjdGl2ZXMvdG9vbHRpcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsVUFBVSxFQUNWLFlBQVksRUFFWixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxPQUFPLEVBRVAsc0JBQXNCLEVBRXZCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQXFCLE1BQU0sZUFBZSxDQUFDOztBQXdGdEYsTUFBTSxPQUFPLHVCQUF1QjtJQWFkO0lBWnBCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDRixTQUFTLEdBQXlDLE9BQU8sQ0FBQztJQUVsRSxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLEtBQTJDO1FBQ3RELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO0lBQUcsQ0FBQzt3R0FibkMsdUJBQXVCOzRGQUF2Qix1QkFBdUIsbUZBcEZ4Qjs7Ozs7OztHQU9UOzs0RkE2RVUsdUJBQXVCO2tCQXRGbkMsU0FBUzsrQkFDRSx5QkFBeUIsWUFDekI7Ozs7Ozs7R0FPVCxtQkEwRWdCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSTs7QUFzQmxCLE1BQU0sT0FBTyx1QkFBdUI7SUFDVCxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLGVB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LEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUvRCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsdUNBQXVDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQzt3R0F0S1UsdUJBQXVCOzRGQUF2Qix1QkFBdUI7OzRGQUF2Qix1QkFBdUI7a0JBSm5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzhCQUUwQixXQUFXO3NCQUFuQyxLQUFLO3VCQUFDLGdCQUFnQjtnQkFDZCxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBWU4sWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFlBQVk7Z0JBdUIxQixZQUFZO3NCQURYLFlBQVk7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgSW5wdXQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgT25EZXN0cm95LFxuICBpbmplY3QsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBPdmVybGF5LFxuICBPdmVybGF5UmVmLFxuICBPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxuICBDb25uZWN0ZWRQb3NpdGlvblxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IENvbXBvbmVudCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvcGlsb3QtdG9vbHRpcC1jb250ZW50JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29waWxvdC10b29sdGlwLXdyYXBwZXJcIiBbYXR0ci5kYXRhLXBvc2l0aW9uXT1cInBvc2l0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29waWxvdC10b29sdGlwXCI+XG4gICAgICAgIHt7IHRleHQgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvcGlsb3QtdG9vbHRpcC1hcnJvd1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLmNvcGlsb3QtdG9vbHRpcC13cmFwcGVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMTVzIGVhc2UtaW4tb3V0O1xuICAgIH1cbiAgICBcbiAgICAuY29waWxvdC10b29sdGlwIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMxYTFhMWE7XG4gICAgICBjb2xvcjogd2hpdGU7XG4gICAgICBwYWRkaW5nOiA2cHggMTBweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgbWF4LXdpZHRoOiAyMDBweDtcbiAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICAgIH1cbiAgICBcbiAgICAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiAwO1xuICAgICAgaGVpZ2h0OiAwO1xuICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgICB9XG4gICAgXG4gICAgLyogQXJyb3cgZm9yIHRvb2x0aXAgYmVsb3cgZWxlbWVudCAoYXJyb3cgcG9pbnRzIHVwIHRvIHRvb2x0aXApICovXG4gICAgLmNvcGlsb3QtdG9vbHRpcC13cmFwcGVyW2RhdGEtcG9zaXRpb249XCJiZWxvd1wiXSAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgIHRvcDogLTRweDtcbiAgICAgIGxlZnQ6IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgIGJvcmRlci13aWR0aDogMCA0cHggNHB4IDRweDtcbiAgICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzFhMWExYSB0cmFuc3BhcmVudDtcbiAgICB9XG4gICAgXG4gICAgLyogQXJyb3cgZm9yIHRvb2x0aXAgYWJvdmUgZWxlbWVudCAoYXJyb3cgcG9pbnRzIGRvd24gdG8gZWxlbWVudCkgKi9cbiAgICAuY29waWxvdC10b29sdGlwLXdyYXBwZXJbZGF0YS1wb3NpdGlvbj1cImFib3ZlXCJdIC5jb3BpbG90LXRvb2x0aXAtYXJyb3cge1xuICAgICAgYm90dG9tOiAtNHB4O1xuICAgICAgbGVmdDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgYm9yZGVyLXdpZHRoOiA0cHggNHB4IDAgNHB4O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjMWExYTFhIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICAgIH1cbiAgICBcbiAgICAvKiBBcnJvdyBmb3IgdG9vbHRpcCB0byB0aGUgbGVmdCAqL1xuICAgIC5jb3BpbG90LXRvb2x0aXAtd3JhcHBlcltkYXRhLXBvc2l0aW9uPVwibGVmdFwiXSAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgIHJpZ2h0OiAtNHB4O1xuICAgICAgdG9wOiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICBib3JkZXItd2lkdGg6IDRweCAwIDRweCA0cHg7XG4gICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICMxYTFhMWE7XG4gICAgfVxuICAgIFxuICAgIC8qIEFycm93IGZvciB0b29sdGlwIHRvIHRoZSByaWdodCAqL1xuICAgIC5jb3BpbG90LXRvb2x0aXAtd3JhcHBlcltkYXRhLXBvc2l0aW9uPVwicmlnaHRcIl0gLmNvcGlsb3QtdG9vbHRpcC1hcnJvdyB7XG4gICAgICBsZWZ0OiAtNHB4O1xuICAgICAgdG9wOiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICBib3JkZXItd2lkdGg6IDRweCA0cHggNHB4IDA7XG4gICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50ICMxYTFhMWEgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG4gICAgfVxuICAgIFxuICAgIEBrZXlmcmFtZXMgZmFkZUluIHtcbiAgICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KTtcbiAgICAgIH1cbiAgICAgIHRvIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICAgICAgfVxuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIFRvb2x0aXBDb250ZW50Q29tcG9uZW50IHtcbiAgdGV4dCA9ICcnO1xuICBwcml2YXRlIF9wb3NpdGlvbjogJ2Fib3ZlJyB8ICdiZWxvdycgfCAnbGVmdCcgfCAncmlnaHQnID0gJ2JlbG93JztcbiAgXG4gIGdldCBwb3NpdGlvbigpOiAnYWJvdmUnIHwgJ2JlbG93JyB8ICdsZWZ0JyB8ICdyaWdodCcge1xuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgfVxuICBcbiAgc2V0IHBvc2l0aW9uKHZhbHVlOiAnYWJvdmUnIHwgJ2JlbG93JyB8ICdsZWZ0JyB8ICdyaWdodCcpIHtcbiAgICB0aGlzLl9wb3NpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIFxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tjb3BpbG90VG9vbHRpcF0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RUb29sdGlwRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KCdjb3BpbG90VG9vbHRpcCcpIHRvb2x0aXBUZXh0ID0gJyc7XG4gIEBJbnB1dCgpIHRvb2x0aXBQb3NpdGlvbjogJ2Fib3ZlJyB8ICdiZWxvdycgfCAnbGVmdCcgfCAncmlnaHQnID0gJ2JlbG93JztcbiAgQElucHV0KCkgdG9vbHRpcERlbGF5ID0gNTAwOyAvLyBtaWxsaXNlY29uZHNcbiAgXG4gIHByaXZhdGUgb3ZlcmxheSA9IGluamVjdChPdmVybGF5KTtcbiAgcHJpdmF0ZSBvdmVybGF5UG9zaXRpb25CdWlsZGVyID0gaW5qZWN0KE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIpO1xuICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgXG4gIHByaXZhdGUgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWY7XG4gIHByaXZhdGUgdG9vbHRpcFRpbWVvdXQ/OiBudW1iZXI7XG4gIHByaXZhdGUgb3JpZ2luYWxUaXRsZT86IHN0cmluZztcbiAgXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInKVxuICBvbk1vdXNlRW50ZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRvb2x0aXBUZXh0KSByZXR1cm47XG4gICAgXG4gICAgLy8gU3RvcmUgYW5kIHJlbW92ZSBuYXRpdmUgdGl0bGUgdG8gcHJldmVudCBPUyB0b29sdGlwXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndGl0bGUnKSkge1xuICAgICAgdGhpcy5vcmlnaW5hbFRpdGxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIHRpbWVvdXRcbiAgICBpZiAodGhpcy50b29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXQgdGltZW91dCB0byBzaG93IHRvb2x0aXAgYWZ0ZXIgZGVsYXlcbiAgICB0aGlzLnRvb2x0aXBUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfSwgdGhpcy50b29sdGlwRGVsYXkpO1xuICB9XG4gIFxuICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcbiAgb25Nb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRpbWVvdXQgaWYgbW91c2UgbGVhdmVzIGJlZm9yZSB0b29sdGlwIHNob3dzXG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICAgIHRoaXMudG9vbHRpcFRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgdGl0bGUgaWYgaXQgZXhpc3RlZFxuICAgIGlmICh0aGlzLm9yaWdpbmFsVGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMub3JpZ2luYWxUaXRsZSk7XG4gICAgICB0aGlzLm9yaWdpbmFsVGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIEhpZGUgdG9vbHRpcCBpZiBpdCdzIHNob3dpbmdcbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzaG93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIG92ZXJsYXlcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5UG9zaXRpb25CdWlsZGVyXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLmVsZW1lbnRSZWYpXG4gICAgICAud2l0aFBvc2l0aW9ucyh0aGlzLmdldFBvc2l0aW9ucygpKVxuICAgICAgLndpdGhQdXNoKGZhbHNlKTtcbiAgICBcbiAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuY2xvc2UoKSxcbiAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZVxuICAgIH0pO1xuICAgIFxuICAgIC8vIENyZWF0ZSBjb21wb25lbnQgcG9ydGFsIGFuZCBhdHRhY2hcbiAgICBjb25zdCBwb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKFRvb2x0aXBDb250ZW50Q29tcG9uZW50LCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMub3ZlcmxheVJlZi5hdHRhY2gocG9ydGFsKTtcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UudGV4dCA9IHRoaXMudG9vbHRpcFRleHQ7XG4gICAgXG4gICAgLy8gRGV0ZWN0IGFjdHVhbCBwb3NpdGlvbiBhZnRlciBvdmVybGF5IGlzIHBvc2l0aW9uZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0aGlzLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIFxuICAgICAgICBsZXQgYWN0dWFsUG9zaXRpb246ICdhYm92ZScgfCAnYmVsb3cnIHwgJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdiZWxvdyc7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgYWN0dWFsIHBvc2l0aW9uIGJhc2VkIG9uIHJlbGF0aXZlIHBvc2l0aW9uc1xuICAgICAgICBpZiAodG9vbHRpcFJlY3QuYm90dG9tIDw9IGVsZW1lbnRSZWN0LnRvcCkge1xuICAgICAgICAgIGFjdHVhbFBvc2l0aW9uID0gJ2Fib3ZlJztcbiAgICAgICAgfSBlbHNlIGlmICh0b29sdGlwUmVjdC50b3AgPj0gZWxlbWVudFJlY3QuYm90dG9tKSB7XG4gICAgICAgICAgYWN0dWFsUG9zaXRpb24gPSAnYmVsb3cnO1xuICAgICAgICB9IGVsc2UgaWYgKHRvb2x0aXBSZWN0LnJpZ2h0IDw9IGVsZW1lbnRSZWN0LmxlZnQpIHtcbiAgICAgICAgICBhY3R1YWxQb3NpdGlvbiA9ICdsZWZ0JztcbiAgICAgICAgfSBlbHNlIGlmICh0b29sdGlwUmVjdC5sZWZ0ID49IGVsZW1lbnRSZWN0LnJpZ2h0KSB7XG4gICAgICAgICAgYWN0dWFsUG9zaXRpb24gPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UucG9zaXRpb24gPSBhY3R1YWxQb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBoaWRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGdldFBvc2l0aW9ucygpOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICBjb25zdCBwb3NpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbm5lY3RlZFBvc2l0aW9uW10+ID0ge1xuICAgICAgYWJvdmU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdjZW50ZXInLFxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcbiAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICAgICAgb2Zmc2V0WTogLTEyXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBiZWxvdzogW1xuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgICBvZmZzZXRZOiAxMlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgbGVmdDogW1xuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcbiAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdjZW50ZXInLFxuICAgICAgICAgIG9mZnNldFg6IC0xMlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgcmlnaHQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICdjZW50ZXInLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcbiAgICAgICAgICBvZmZzZXRYOiAxMlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgICBcbiAgICAvLyBQcmVmZXIgYmVsb3cgcG9zaXRpb24sIGJ1dCB1c2UgYWJvdmUgYXMgZmFsbGJhY2tcbiAgICBjb25zdCBwcmltYXJ5ID0gcG9zaXRpb25zW3RoaXMudG9vbHRpcFBvc2l0aW9uXSB8fCBwb3NpdGlvbnMuYmVsb3c7XG4gICAgLy8gRm9yIGJlbG93IHBvc2l0aW9uLCBhZGQgYWJvdmUgYXMgZmlyc3QgZmFsbGJhY2tcbiAgICBjb25zdCBmYWxsYmFja3MgPSB0aGlzLnRvb2x0aXBQb3NpdGlvbiA9PT0gJ2JlbG93JyBcbiAgICAgID8gWy4uLihwb3NpdGlvbnMuYWJvdmUgfHwgW10pLCAuLi4ocG9zaXRpb25zLmxlZnQgfHwgW10pLCAuLi4ocG9zaXRpb25zLnJpZ2h0IHx8IFtdKV1cbiAgICAgIDogT2JqZWN0LnZhbHVlcyhwb3NpdGlvbnMpLmZpbHRlcihwID0+IHAgIT09IHByaW1hcnkpLmZsYXQoKTtcbiAgICBcbiAgICByZXR1cm4gWy4uLihwcmltYXJ5IHx8IFtdKSwgLi4uZmFsbGJhY2tzXTtcbiAgfVxuICBcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICB9XG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCB0aXRsZSBpZiBpdCBleGlzdGVkXG4gICAgaWYgKHRoaXMub3JpZ2luYWxUaXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5vcmlnaW5hbFRpdGxlKTtcbiAgICB9XG4gICAgdGhpcy5oaWRlKCk7XG4gIH1cbn0iXX0=
@@ -1,154 +0,0 @@
1
- import { Component, Input, TemplateRef, ViewContainerRef, Inject, ChangeDetectionStrategy, ViewChild } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { renderSlot } from './slot.utils';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- /**
7
- * @internal - This component is for internal use only.
8
- * Simple slot component for rendering custom content or defaults.
9
- * Supports templates and components only.
10
- *
11
- * @example
12
- * ```html
13
- * <!-- With template -->
14
- * <copilot-slot [slot]="sendButtonTemplate" [context]="buttonContext">
15
- * <button class="default-btn">Default</button>
16
- * </copilot-slot>
17
- * ```
18
- */
19
- export class CopilotSlotComponent {
20
- viewContainer;
21
- cdr;
22
- slot;
23
- context;
24
- defaultComponent;
25
- outputs;
26
- slotContainer;
27
- componentRef;
28
- constructor(viewContainer, cdr) {
29
- this.viewContainer = viewContainer;
30
- this.cdr = cdr;
31
- }
32
- ngOnInit() {
33
- this.renderSlot();
34
- }
35
- ngOnChanges(changes) {
36
- if (changes['slot']) {
37
- // Slot changed, need to re-render completely
38
- this.renderSlot();
39
- }
40
- else if (changes['context'] && this.componentRef) {
41
- // Just context changed, update existing component
42
- this.updateComponentProps();
43
- this.cdr.detectChanges();
44
- }
45
- else if (changes['context']) {
46
- // No component ref yet, render the slot
47
- this.renderSlot();
48
- }
49
- }
50
- isTemplate(value) {
51
- return value instanceof TemplateRef;
52
- }
53
- renderSlot() {
54
- // Skip if it's a template (handled by ngTemplateOutlet)
55
- if (this.slot && this.isTemplate(this.slot)) {
56
- this.componentRef = null;
57
- return;
58
- }
59
- // Clear previous content
60
- this.slotContainer.clear();
61
- this.componentRef = null;
62
- // Skip if no slot and no default component
63
- if (!this.slot && !this.defaultComponent) {
64
- return;
65
- }
66
- // Use the utility to render other slot types
67
- if (this.slot || this.defaultComponent) {
68
- this.componentRef = renderSlot(this.slotContainer, {
69
- slot: this.slot,
70
- defaultComponent: this.defaultComponent,
71
- props: this.context,
72
- outputs: this.outputs
73
- });
74
- }
75
- }
76
- updateComponentProps() {
77
- if (!this.componentRef || !this.componentRef.instance) {
78
- return;
79
- }
80
- const props = this.context;
81
- // Update props using setInput, only for declared inputs
82
- if (props) {
83
- const ctor = this.componentRef.instance.constructor;
84
- const cmpDef = ctor?.ɵcmp;
85
- const declaredInputs = new Set(Object.keys(cmpDef?.inputs ?? {}));
86
- if (declaredInputs.has('props')) {
87
- this.componentRef.setInput('props', props);
88
- }
89
- else {
90
- for (const key in props) {
91
- if (declaredInputs.has(key)) {
92
- const value = props[key];
93
- this.componentRef.setInput(key, value);
94
- }
95
- }
96
- }
97
- }
98
- // Trigger change detection
99
- if (this.componentRef.changeDetectorRef) {
100
- this.componentRef.changeDetectorRef.detectChanges();
101
- }
102
- }
103
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotSlotComponent, deps: [{ token: ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
104
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotSlotComponent, isStandalone: true, selector: "copilot-slot", inputs: { slot: "slot", context: "context", defaultComponent: "defaultComponent", outputs: "outputs" }, viewQueries: [{ propertyName: "slotContainer", first: true, predicate: ["slotContainer"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: `
105
- <!-- If slot template provided, render it -->
106
- <ng-container *ngIf="slot && isTemplate(slot)"
107
- [ngTemplateOutlet]="slot"
108
- [ngTemplateOutletContext]="context || {}">
109
- </ng-container>
110
-
111
- <!-- If not a template, we'll handle in code -->
112
- <ng-container #slotContainer></ng-container>
113
-
114
- <!-- Default content (only shown if no slot) -->
115
- <ng-content *ngIf="!slot && !defaultComponent"></ng-content>
116
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
117
- }
118
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotSlotComponent, decorators: [{
119
- type: Component,
120
- args: [{
121
- selector: 'copilot-slot',
122
- standalone: true,
123
- imports: [CommonModule],
124
- template: `
125
- <!-- If slot template provided, render it -->
126
- <ng-container *ngIf="slot && isTemplate(slot)"
127
- [ngTemplateOutlet]="slot"
128
- [ngTemplateOutletContext]="context || {}">
129
- </ng-container>
130
-
131
- <!-- If not a template, we'll handle in code -->
132
- <ng-container #slotContainer></ng-container>
133
-
134
- <!-- Default content (only shown if no slot) -->
135
- <ng-content *ngIf="!slot && !defaultComponent"></ng-content>
136
- `,
137
- changeDetection: ChangeDetectionStrategy.OnPush
138
- }]
139
- }], ctorParameters: () => [{ type: i0.ViewContainerRef, decorators: [{
140
- type: Inject,
141
- args: [ViewContainerRef]
142
- }] }, { type: i0.ChangeDetectorRef }], propDecorators: { slot: [{
143
- type: Input
144
- }], context: [{
145
- type: Input
146
- }], defaultComponent: [{
147
- type: Input
148
- }], outputs: [{
149
- type: Input
150
- }], slotContainer: [{
151
- type: ViewChild,
152
- args: ['slotContainer', { read: ViewContainerRef, static: true }]
153
- }] } });
154
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1zbG90LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2xvdHMvY29waWxvdC1zbG90LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxXQUFXLEVBQ1gsZ0JBQWdCLEVBSWhCLE1BQU0sRUFDTix1QkFBdUIsRUFFdkIsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7QUFHMUM7Ozs7Ozs7Ozs7OztHQVlHO0FBb0JILE1BQU0sT0FBTyxvQkFBb0I7SUFZSztJQUMxQjtJQVpELElBQUksQ0FBZ0M7SUFDcEMsT0FBTyxDQUFPO0lBQ2QsZ0JBQWdCLENBQWE7SUFDN0IsT0FBTyxDQUF3QztJQUdoRCxhQUFhLENBQW9CO0lBRWpDLFlBQVksQ0FBTztJQUUzQixZQUNvQyxhQUErQixFQUN6RCxHQUFzQjtRQURJLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUN6RCxRQUFHLEdBQUgsR0FBRyxDQUFtQjtJQUM3QixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDcEIsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ25ELGtEQUFrRDtZQUNsRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEs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Ozs7Ozs7R0FZVCwyREFiUyxZQUFZOzs0RkFnQlgsb0JBQW9CO2tCQW5CaEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7R0FZVDtvQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7OzBCQWFJLE1BQU07MkJBQUMsZ0JBQWdCO3lFQVhqQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0UsYUFBYTtzQkFEcEIsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgSW5qZWN0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyByZW5kZXJTbG90IH0gZnJvbSAnLi9zbG90LnV0aWxzJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBAaW50ZXJuYWwgLSBUaGlzIGNvbXBvbmVudCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gKiBTaW1wbGUgc2xvdCBjb21wb25lbnQgZm9yIHJlbmRlcmluZyBjdXN0b20gY29udGVudCBvciBkZWZhdWx0cy5cbiAqIFN1cHBvcnRzIHRlbXBsYXRlcyBhbmQgY29tcG9uZW50cyBvbmx5LlxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPCEtLSBXaXRoIHRlbXBsYXRlIC0tPlxuICogPGNvcGlsb3Qtc2xvdCBbc2xvdF09XCJzZW5kQnV0dG9uVGVtcGxhdGVcIiBbY29udGV4dF09XCJidXR0b25Db250ZXh0XCI+XG4gKiAgIDxidXR0b24gY2xhc3M9XCJkZWZhdWx0LWJ0blwiPkRlZmF1bHQ8L2J1dHRvbj5cbiAqIDwvY29waWxvdC1zbG90PlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvcGlsb3Qtc2xvdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDwhLS0gSWYgc2xvdCB0ZW1wbGF0ZSBwcm92aWRlZCwgcmVuZGVyIGl0IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzbG90ICYmIGlzVGVtcGxhdGUoc2xvdClcIlxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic2xvdFwiXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiY29udGV4dCB8fCB7fVwiPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIFxuICAgIDwhLS0gSWYgbm90IGEgdGVtcGxhdGUsIHdlJ2xsIGhhbmRsZSBpbiBjb2RlIC0tPlxuICAgIDxuZy1jb250YWluZXIgI3Nsb3RDb250YWluZXI+PC9uZy1jb250YWluZXI+XG4gICAgXG4gICAgPCEtLSBEZWZhdWx0IGNvbnRlbnQgKG9ubHkgc2hvd24gaWYgbm8gc2xvdCkgLS0+XG4gICAgPG5nLWNvbnRlbnQgKm5nSWY9XCIhc2xvdCAmJiAhZGVmYXVsdENvbXBvbmVudFwiPjwvbmctY29udGVudD5cbiAgYCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdFNsb3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHNsb3Q/OiBUZW1wbGF0ZVJlZjxhbnk+IHwgVHlwZTxhbnk+O1xuICBASW5wdXQoKSBjb250ZXh0PzogYW55O1xuICBASW5wdXQoKSBkZWZhdWx0Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBASW5wdXQoKSBvdXRwdXRzPzogUmVjb3JkPHN0cmluZywgKGV2ZW50OiBhbnkpID0+IHZvaWQ+O1xuICBcbiAgQFZpZXdDaGlsZCgnc2xvdENvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pIFxuICBwcml2YXRlIHNsb3RDb250YWluZXIhOiBWaWV3Q29udGFpbmVyUmVmO1xuICBcbiAgcHJpdmF0ZSBjb21wb25lbnRSZWY/OiBhbnk7XG4gIFxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFZpZXdDb250YWluZXJSZWYpIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuICBcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJTbG90KCk7XG4gIH1cbiAgXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc2xvdCddKSB7XG4gICAgICAvLyBTbG90IGNoYW5nZWQsIG5lZWQgdG8gcmUtcmVuZGVyIGNvbXBsZXRlbHlcbiAgICAgIHRoaXMucmVuZGVyU2xvdCgpO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlc1snY29udGV4dCddICYmIHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICAvLyBKdXN0IGNvbnRleHQgY2hhbmdlZCwgdXBkYXRlIGV4aXN0aW5nIGNvbXBvbmVudFxuICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRQcm9wcygpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlc1snY29udGV4dCddKSB7XG4gICAgICAvLyBObyBjb21wb25lbnQgcmVmIHlldCwgcmVuZGVyIHRoZSBzbG90XG4gICAgICB0aGlzLnJlbmRlclNsb3QoKTtcbiAgICB9XG4gIH1cbiAgXG4gIGlzVGVtcGxhdGUodmFsdWU6IGFueSk6IHZhbHVlIGlzIFRlbXBsYXRlUmVmPGFueT4ge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICB9XG4gIFxuICBwcml2YXRlIHJlbmRlclNsb3QoKTogdm9pZCB7XG4gICAgLy8gU2tpcCBpZiBpdCdzIGEgdGVtcGxhdGUgKGhhbmRsZWQgYnkgbmdUZW1wbGF0ZU91dGxldClcbiAgICBpZiAodGhpcy5zbG90ICYmIHRoaXMuaXNUZW1wbGF0ZSh0aGlzLnNsb3QpKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZiA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFyIHByZXZpb3VzIGNvbnRlbnRcbiAgICB0aGlzLnNsb3RDb250YWluZXIuY2xlYXIoKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZiA9IG51bGw7XG4gICAgXG4gICAgLy8gU2tpcCBpZiBubyBzbG90IGFuZCBubyBkZWZhdWx0IGNvbXBvbmVudFxuICAgIGlmICghdGhpcy5zbG90ICYmICF0aGlzLmRlZmF1bHRDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIHRoZSB1dGlsaXR5IHRvIHJlbmRlciBvdGhlciBzbG90IHR5cGVzXG4gICAgaWYgKHRoaXMuc2xvdCB8fCB0aGlzLmRlZmF1bHRDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmID0gcmVuZGVyU2xvdCh0aGlzLnNsb3RDb250YWluZXIsIHtcbiAgICAgICAgc2xvdDogdGhpcy5zbG90LFxuICAgICAgICBkZWZhdWx0Q29tcG9uZW50OiB0aGlzLmRlZmF1bHRDb21wb25lbnQhLFxuICAgICAgICBwcm9wczogdGhpcy5jb250ZXh0LFxuICAgICAgICBvdXRwdXRzOiB0aGlzLm91dHB1dHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSB1cGRhdGVDb21wb25lbnRQcm9wcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29tcG9uZW50UmVmIHx8ICF0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBwcm9wcyA9IHRoaXMuY29udGV4dDtcbiAgICBcbiAgICAvLyBVcGRhdGUgcHJvcHMgdXNpbmcgc2V0SW5wdXQsIG9ubHkgZm9yIGRlY2xhcmVkIGlucHV0c1xuICAgIGlmIChwcm9wcykge1xuICAgICAgY29uc3QgY3RvciA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmNvbnN0cnVjdG9yIGFzIGFueTtcbiAgICAgIGNvbnN0IGNtcERlZjogYW55ID0gY3Rvcj8uybVjbXA7XG4gICAgICBjb25zdCBkZWNsYXJlZElucHV0cyA9IG5ldyBTZXQ8c3RyaW5nPihPYmplY3Qua2V5cyhjbXBEZWY/LmlucHV0cyA/PyB7fSkpO1xuXG4gICAgICBpZiAoZGVjbGFyZWRJbnB1dHMuaGFzKCdwcm9wcycpKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdwcm9wcycsIHByb3BzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgICAgaWYgKGRlY2xhcmVkSW5wdXRzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHByb3BzW2tleV07XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dChrZXksIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG59XG4iXX0=