@copilotkitnext/angular 1.52.0-next.8 → 1.52.1-next.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.
- package/README.md +225 -432
- package/dist/README.md +225 -432
- package/dist/fesm2022/copilotkitnext-angular.mjs +322 -164
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/lib/agent.d.ts +20 -20
- package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +46 -46
- package/dist/lib/components/chat/copilot-chat-message-view.d.ts +126 -126
- package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +23 -23
- package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +6 -6
- package/dist/lib/components/chat/copilot-chat-user-message.d.ts +6 -6
- package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +18 -18
- package/dist/lib/components/chat/copilot-chat-view.d.ts +54 -54
- package/dist/lib/components/chat/copilot-chat.d.ts +18 -18
- package/dist/lib/config.d.ts +2 -0
- package/dist/lib/copilotkit.d.ts +7 -1
- package/dist/lib/license-watermark.d.ts +1 -0
- package/dist/lib/render-tool-calls.d.ts +23 -23
- package/dist/styles.css +3 -0
- package/package.json +18 -18
- package/dist/esm2022/copilotkitnext-angular.mjs +0 -5
- package/dist/esm2022/index.mjs +0 -2
- package/dist/esm2022/lib/agent-context.mjs +0 -25
- package/dist/esm2022/lib/agent.mjs +0 -73
- package/dist/esm2022/lib/chat-config.mjs +0 -35
- package/dist/esm2022/lib/chat-state.mjs +0 -18
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +0 -344
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +0 -260
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +0 -22
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.mjs +0 -415
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
- package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +0 -196
- package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +0 -299
- package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +0 -39
- package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +0 -634
- package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +0 -10
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +0 -27
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +0 -269
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +0 -2
- package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +0 -139
- package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +0 -36
- package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +0 -20
- package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +0 -203
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +0 -118
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +0 -182
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +0 -28
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +0 -25
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +0 -328
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +0 -2
- package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +0 -48
- package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +0 -41
- package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +0 -19
- package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +0 -96
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +0 -89
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +0 -456
- package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +0 -404
- package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +0 -2
- package/dist/esm2022/lib/components/chat/copilot-chat.mjs +0 -165
- package/dist/esm2022/lib/config.mjs +0 -9
- package/dist/esm2022/lib/copilotkit.mjs +0 -125
- package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +0 -130
- package/dist/esm2022/lib/directives/stick-to-bottom.mjs +0 -170
- package/dist/esm2022/lib/directives/tooltip.mjs +0 -217
- package/dist/esm2022/lib/human-in-the-loop.mjs +0 -19
- package/dist/esm2022/lib/render-tool-calls.mjs +0 -167
- package/dist/esm2022/lib/resize-observer.mjs +0 -152
- package/dist/esm2022/lib/scroll-position.mjs +0 -123
- package/dist/esm2022/lib/slots/copilot-slot.mjs +0 -156
- package/dist/esm2022/lib/slots/index.mjs +0 -4
- package/dist/esm2022/lib/slots/slot.types.mjs +0 -6
- package/dist/esm2022/lib/slots/slot.utils.mjs +0 -235
- package/dist/esm2022/lib/tools.mjs +0 -31
- package/dist/esm2022/lib/utils.mjs +0 -10
- package/dist/esm2022/public-api.mjs +0 -48
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import { Directive, ElementRef, inject, input, output, } from "@angular/core";
|
|
2
|
-
import { ScrollPosition } from "../scroll-position";
|
|
3
|
-
import { ResizeObserverService } from "../resize-observer";
|
|
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 StickToBottom {
|
|
24
|
-
enabled = input(true);
|
|
25
|
-
threshold = input(10);
|
|
26
|
-
initialBehavior = input("smooth");
|
|
27
|
-
resizeBehavior = input("smooth");
|
|
28
|
-
debounceMs = input(100);
|
|
29
|
-
isAtBottomChange = output();
|
|
30
|
-
scrollToBottomRequested = output();
|
|
31
|
-
elementRef = inject(ElementRef);
|
|
32
|
-
scrollService = inject(ScrollPosition);
|
|
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
|
|
66
|
-
.monitorScrollPosition(element, this.threshold())
|
|
67
|
-
.pipe(takeUntil(this.destroy$), debounceTime(this.debounceMs()), distinctUntilChanged((a, b) => a.isAtBottom === b.isAtBottom))
|
|
68
|
-
.subscribe((state) => {
|
|
69
|
-
const wasAtBottom = this.wasAtBottom;
|
|
70
|
-
this.wasAtBottom = state.isAtBottom;
|
|
71
|
-
// Detect user scroll
|
|
72
|
-
if (!state.isAtBottom && wasAtBottom && this.hasInitialized) {
|
|
73
|
-
this.userHasScrolled = true;
|
|
74
|
-
}
|
|
75
|
-
else if (state.isAtBottom) {
|
|
76
|
-
this.userHasScrolled = false;
|
|
77
|
-
}
|
|
78
|
-
// Emit change
|
|
79
|
-
this.isAtBottomChange.emit(state.isAtBottom);
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
setupResizeMonitoring() {
|
|
83
|
-
if (!this.enabled() || !this.contentElement)
|
|
84
|
-
return;
|
|
85
|
-
// Monitor content resize
|
|
86
|
-
this.resizeService
|
|
87
|
-
.observeElement(this.contentElement, 0, 250)
|
|
88
|
-
.pipe(takeUntil(this.destroy$), filter(() => this.enabled() && !this.userHasScrolled))
|
|
89
|
-
.subscribe((state) => {
|
|
90
|
-
// Auto-scroll on resize if we were at bottom
|
|
91
|
-
if (this.wasAtBottom && !state.isResizing) {
|
|
92
|
-
this.scrollToBottom(this.resizeBehavior());
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
// Monitor container resize
|
|
96
|
-
const element = this.elementRef.nativeElement;
|
|
97
|
-
this.resizeService
|
|
98
|
-
.observeElement(element, 0, 250)
|
|
99
|
-
.pipe(takeUntil(this.destroy$), filter(() => this.enabled() && !this.userHasScrolled && this.wasAtBottom))
|
|
100
|
-
.subscribe(() => {
|
|
101
|
-
// Adjust scroll on container resize
|
|
102
|
-
this.scrollToBottom(this.resizeBehavior());
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
setupContentMutationObserver() {
|
|
106
|
-
if (!this.enabled() || !this.contentElement)
|
|
107
|
-
return;
|
|
108
|
-
const mutationObserver = new MutationObserver(() => {
|
|
109
|
-
if (this.enabled() && this.wasAtBottom && !this.userHasScrolled) {
|
|
110
|
-
// Content changed, scroll to bottom if we were there
|
|
111
|
-
requestAnimationFrame(() => {
|
|
112
|
-
this.scrollToBottom(this.resizeBehavior());
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
mutationObserver.observe(this.contentElement, {
|
|
117
|
-
childList: true,
|
|
118
|
-
subtree: true,
|
|
119
|
-
characterData: true,
|
|
120
|
-
});
|
|
121
|
-
// Cleanup on destroy
|
|
122
|
-
this.destroy$.subscribe(() => {
|
|
123
|
-
mutationObserver.disconnect();
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Public method to scroll to bottom
|
|
128
|
-
* Can be called from parent component
|
|
129
|
-
*/
|
|
130
|
-
scrollToBottom(behavior = "smooth") {
|
|
131
|
-
const element = this.elementRef.nativeElement;
|
|
132
|
-
const smooth = behavior === "smooth";
|
|
133
|
-
this.scrollService.scrollToBottom(element, smooth);
|
|
134
|
-
this.userHasScrolled = false;
|
|
135
|
-
this.scrollToBottomRequested.emit();
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Check if currently at bottom
|
|
139
|
-
*/
|
|
140
|
-
isAtBottom() {
|
|
141
|
-
return this.scrollService.isAtBottom(this.elementRef.nativeElement, this.threshold());
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Get current scroll state
|
|
145
|
-
*/
|
|
146
|
-
getScrollState() {
|
|
147
|
-
const element = this.elementRef.nativeElement;
|
|
148
|
-
return {
|
|
149
|
-
scrollTop: element.scrollTop,
|
|
150
|
-
scrollHeight: element.scrollHeight,
|
|
151
|
-
clientHeight: element.clientHeight,
|
|
152
|
-
isAtBottom: this.isAtBottom(),
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
ngOnDestroy() {
|
|
156
|
-
this.destroy$.next();
|
|
157
|
-
this.destroy$.complete();
|
|
158
|
-
}
|
|
159
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StickToBottom, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
160
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: StickToBottom, isStandalone: true, selector: "[copilotStickToBottom]", inputs: { enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, threshold: { classPropertyName: "threshold", publicName: "threshold", isSignal: true, isRequired: false, transformFunction: null }, initialBehavior: { classPropertyName: "initialBehavior", publicName: "initialBehavior", isSignal: true, isRequired: false, transformFunction: null }, resizeBehavior: { classPropertyName: "resizeBehavior", publicName: "resizeBehavior", isSignal: true, isRequired: false, transformFunction: null }, debounceMs: { classPropertyName: "debounceMs", publicName: "debounceMs", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isAtBottomChange: "isAtBottomChange", scrollToBottomRequested: "scrollToBottomRequested" }, providers: [ScrollPosition, ResizeObserverService], ngImport: i0 });
|
|
161
|
-
}
|
|
162
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StickToBottom, decorators: [{
|
|
163
|
-
type: Directive,
|
|
164
|
-
args: [{
|
|
165
|
-
standalone: true,
|
|
166
|
-
selector: "[copilotStickToBottom]",
|
|
167
|
-
providers: [ScrollPosition, ResizeObserverService],
|
|
168
|
-
}]
|
|
169
|
-
}] });
|
|
170
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpY2stdG8tYm90dG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9kaXJlY3RpdmVzL3N0aWNrLXRvLWJvdHRvbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFJVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sb0JBQW9CLEdBQ3JCLE1BQU0sZ0JBQWdCLENBQUM7O0FBSXhCOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQU1ILE1BQU0sT0FBTyxhQUFhO0lBQ3hCLE9BQU8sR0FBRyxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUM7SUFDL0IsU0FBUyxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUM5QixlQUFlLEdBQUcsS0FBSyxDQUFpQixRQUFRLENBQUMsQ0FBQztJQUNsRCxjQUFjLEdBQUcsS0FBSyxDQUFpQixRQUFRLENBQUMsQ0FBQztJQUNqRCxVQUFVLEdBQUcsS0FBSyxDQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRWhDLGdCQUFnQixHQUFHLE1BQU0sRUFBVyxDQUFDO0lBQ3JDLHVCQUF1QixHQUFHLE1BQU0sRUFBUSxDQUFDO0lBRWpDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN2QyxhQUFhLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFOUMsUUFBUSxHQUFHLElBQUksT0FBTyxF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WSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1lBQ2xDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1NBQzlCLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQTdLVSxhQUFhOzRGQUFiLGFBQWEsMDJCQUZiLENBQUMsY0FBYyxFQUFFLHFCQUFxQixDQUFDOzs0RkFFdkMsYUFBYTtrQkFMekIsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLHFCQUFxQixDQUFDO2lCQUNuRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIEFmdGVyVmlld0luaXQsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFNjcm9sbFBvc2l0aW9uIH0gZnJvbSBcIi4uL3Njcm9sbC1wb3NpdGlvblwiO1xuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3Jlc2l6ZS1vYnNlcnZlclwiO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1xuICB0YWtlVW50aWwsXG4gIGRlYm91bmNlVGltZSxcbiAgZmlsdGVyLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbn0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbmV4cG9ydCB0eXBlIFNjcm9sbEJlaGF2aW9yID0gXCJzbW9vdGhcIiB8IFwiaW5zdGFudFwiIHwgXCJhdXRvXCI7XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBpbXBsZW1lbnRpbmcgc3RpY2stdG8tYm90dG9tIHNjcm9sbCBiZWhhdmlvclxuICogU2ltaWxhciB0byB0aGUgUmVhY3QgdXNlLXN0aWNrLXRvLWJvdHRvbSBsaWJyYXJ5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxkaXYgY29waWxvdFN0aWNrVG9Cb3R0b21cbiAqICAgICAgW2VuYWJsZWRdPVwidHJ1ZVwiXG4gKiAgICAgIFt0aHJlc2hvbGRdPVwiMTBcIlxuICogICAgICBbaW5pdGlhbEJlaGF2aW9yXT1cIidzbW9vdGgnXCJcbiAqICAgICAgW3Jlc2l6ZUJlaGF2aW9yXT1cIidzbW9vdGgnXCJcbiAqICAgICAgKGlzQXRCb3R0b21DaGFuZ2UpPVwib25Cb3R0b21DaGFuZ2UoJGV2ZW50KVwiPlxuICogICA8IS0tIENvbnRlbnQgLS0+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6IFwiW2NvcGlsb3RTdGlja1RvQm90dG9tXVwiLFxuICBwcm92aWRlcnM6IFtTY3JvbGxQb3NpdGlvbiwgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgU3RpY2tUb0JvdHRvbSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgZW5hYmxlZCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICB0aHJlc2hvbGQgPSBpbnB1dDxudW1iZXI+KDEwKTtcbiAgaW5pdGlhbEJlaGF2aW9yID0gaW5wdXQ8U2Nyb2xsQmVoYXZpb3I+KFwic21vb3RoXCIpO1xuICByZXNpemVCZWhhdmlvciA9IGlucHV0PFNjcm9sbEJlaGF2aW9yPihcInNtb290aFwiKTtcbiAgZGVib3VuY2VNcyA9IGlucHV0PG51bWJlcj4oMTAwKTtcblxuICBpc0F0Qm90dG9tQ2hhbmdlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHNjcm9sbFRvQm90dG9tUmVxdWVzdGVkID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHNjcm9sbFNlcnZpY2UgPSBpbmplY3QoU2Nyb2xsUG9zaXRpb24pO1xuICBwcml2YXRlIHJlc2l6ZVNlcnZpY2UgPSBpbmplY3QoUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlKTtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBjb250ZW50RWxlbWVudD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHdhc0F0Qm90dG9tID0gdHJ1ZTtcbiAgcHJpdmF0ZSBoYXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIHVzZXJIYXNTY3JvbGxlZCA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFNldHVwIHdpbGwgaGFwcGVuIGluIG5nQWZ0ZXJWaWV3SW5pdFxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIC8vIEZpbmQgb3IgY3JlYXRlIGNvbnRlbnQgd3JhcHBlclxuICAgIHRoaXMuY29udGVudEVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBcIltkYXRhLXN0aWNrLXRvLWJvdHRvbS1jb250ZW50XVwiLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRFbGVtZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICB0aGlzLnNldHVwU2Nyb2xsTW9uaXRvcmluZygpO1xuICAgIHRoaXMuc2V0dXBSZXNpemVNb25pdG9yaW5nKCk7XG4gICAgdGhpcy5zZXR1cENvbnRlbnRNdXRhdGlvbk9ic2VydmVyKCk7XG5cbiAgICAvLyBJbml0aWFsIHNjcm9sbCB0byBib3R0b20gaWYgZW5hYmxlZFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5oYXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5lbmFibGVkKCkpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSh0aGlzLmluaXRpYWxCZWhhdmlvcigpKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBTY3JvbGxNb25pdG9yaW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkpIHJldHVybjtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgIC8vIE1vbml0b3Igc2Nyb2xsIHBvc2l0aW9uXG4gICAgdGhpcy5zY3JvbGxTZXJ2aWNlXG4gICAgICAubW9uaXRvclNjcm9sbFBvc2l0aW9uKGVsZW1lbnQsIHRoaXMudGhyZXNob2xkKCkpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZU1zKCkpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gYS5pc0F0Qm90dG9tID09PSBiLmlzQXRCb3R0b20pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3Qgd2FzQXRCb3R0b20gPSB0aGlzLndhc0F0Qm90dG9tO1xuICAgICAgICB0aGlzLndhc0F0Qm90dG9tID0gc3RhdGUuaXNBdEJvdHRvbTtcblxuICAgICAgICAvLyBEZXRlY3QgdXNlciBzY3JvbGxcbiAgICAgICAgaWYgKCFzdGF0ZS5pc0F0Qm90dG9tICYmIHdhc0F0Qm90dG9tICYmIHRoaXMuaGFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICB0aGlzLnVzZXJIYXNTY3JvbGxlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaXNBdEJvdHRvbSkge1xuICAgICAgICAgIHRoaXMudXNlckhhc1Njcm9sbGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGNoYW5nZVxuICAgICAgICB0aGlzLmlzQXRCb3R0b21DaGFuZ2UuZW1pdChzdGF0ZS5pc0F0Qm90dG9tKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFJlc2l6ZU1vbml0b3JpbmcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5jb250ZW50RWxlbWVudCkgcmV0dXJuO1xuXG4gICAgLy8gTW9uaXRvciBjb250ZW50IHJlc2l6ZVxuICAgIHRoaXMucmVzaXplU2VydmljZVxuICAgICAgLm9ic2VydmVFbGVtZW50KHRoaXMuY29udGVudEVsZW1lbnQsIDAsIDI1MClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQoKSAmJiAhdGhpcy51c2VySGFzU2Nyb2xsZWQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgICAgLy8gQXV0by1zY3JvbGwgb24gcmVzaXplIGlmIHdlIHdlcmUgYXQgYm90dG9tXG4gICAgICAgIGlmICh0aGlzLndhc0F0Qm90dG9tICYmICFzdGF0ZS5pc1Jlc2l6aW5nKSB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSh0aGlzLnJlc2l6ZUJlaGF2aW9yKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIE1vbml0b3IgY29udGFpbmVyIHJlc2l6ZVxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnJlc2l6ZVNlcnZpY2VcbiAgICAgIC5vYnNlcnZlRWxlbWVudChlbGVtZW50LCAwLCAyNTApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgKCkgPT4gdGhpcy5lbmFibGVkKCkgJiYgIXRoaXMudXNlckhhc1Njcm9sbGVkICYmIHRoaXMud2FzQXRCb3R0b20sXG4gICAgICAgICksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gQWRqdXN0IHNjcm9sbCBvbiBjb250YWluZXIgcmVzaXplXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5yZXNpemVCZWhhdmlvcigpKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cENvbnRlbnRNdXRhdGlvbk9ic2VydmVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkgfHwgIXRoaXMuY29udGVudEVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5lbmFibGVkKCkgJiYgdGhpcy53YXNBdEJvdHRvbSAmJiAhdGhpcy51c2VySGFzU2Nyb2xsZWQpIHtcbiAgICAgICAgLy8gQ29udGVudCBjaGFuZ2VkLCBzY3JvbGwgdG8gYm90dG9tIGlmIHdlIHdlcmUgdGhlcmVcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMucmVzaXplQmVoYXZpb3IoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKHRoaXMuY29udGVudEVsZW1lbnQsIHtcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gICAgdGhpcy5kZXN0cm95JC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIG1ldGhvZCB0byBzY3JvbGwgdG8gYm90dG9tXG4gICAqIENhbiBiZSBjYWxsZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsVG9Cb3R0b20oYmVoYXZpb3I6IFNjcm9sbEJlaGF2aW9yID0gXCJzbW9vdGhcIik6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBzbW9vdGggPSBiZWhhdmlvciA9PT0gXCJzbW9vdGhcIjtcblxuICAgIHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxUb0JvdHRvbShlbGVtZW50LCBzbW9vdGgpO1xuICAgIHRoaXMudXNlckhhc1Njcm9sbGVkID0gZmFsc2U7XG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbVJlcXVlc3RlZC5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudGx5IGF0IGJvdHRvbVxuICAgKi9cbiAgcHVibGljIGlzQXRCb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsU2VydmljZS5pc0F0Qm90dG9tKFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLnRocmVzaG9sZCgpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgc2Nyb2xsIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0U2Nyb2xsU3RhdGUoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHJldHVybiB7XG4gICAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wLFxuICAgICAgc2Nyb2xsSGVpZ2h0OiBlbGVtZW50LnNjcm9sbEhlaWdodCxcbiAgICAgIGNsaWVudEhlaWdodDogZWxlbWVudC5jbGllbnRIZWlnaHQsXG4gICAgICBpc0F0Qm90dG9tOiB0aGlzLmlzQXRCb3R0b20oKSxcbiAgICB9O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,217 +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 TooltipContent {
|
|
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.14", ngImport: i0, type: TooltipContent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
21
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TooltipContent, 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.14", ngImport: i0, type: TooltipContent, decorators: [{
|
|
31
|
-
type: Component,
|
|
32
|
-
args: [{ selector: "copilot-tooltip-content", standalone: true, 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, 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 CopilotTooltip {
|
|
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(TooltipContent, 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
|
-
? [
|
|
175
|
-
...(positions.above || []),
|
|
176
|
-
...(positions.left || []),
|
|
177
|
-
...(positions.right || []),
|
|
178
|
-
]
|
|
179
|
-
: Object.values(positions)
|
|
180
|
-
.filter((p) => p !== primary)
|
|
181
|
-
.flat();
|
|
182
|
-
return [...(primary || []), ...fallbacks];
|
|
183
|
-
}
|
|
184
|
-
ngOnDestroy() {
|
|
185
|
-
if (this.tooltipTimeout) {
|
|
186
|
-
clearTimeout(this.tooltipTimeout);
|
|
187
|
-
}
|
|
188
|
-
// Restore original title if it existed
|
|
189
|
-
if (this.originalTitle !== undefined) {
|
|
190
|
-
this.elementRef.nativeElement.setAttribute("title", this.originalTitle);
|
|
191
|
-
}
|
|
192
|
-
this.hide();
|
|
193
|
-
}
|
|
194
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CopilotTooltip, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
195
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: CopilotTooltip, isStandalone: true, selector: "[copilotTooltip]", inputs: { tooltipText: ["copilotTooltip", "tooltipText"], tooltipPosition: "tooltipPosition", tooltipDelay: "tooltipDelay" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, ngImport: i0 });
|
|
196
|
-
}
|
|
197
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CopilotTooltip, decorators: [{
|
|
198
|
-
type: Directive,
|
|
199
|
-
args: [{
|
|
200
|
-
selector: "[copilotTooltip]",
|
|
201
|
-
standalone: true,
|
|
202
|
-
}]
|
|
203
|
-
}], propDecorators: { tooltipText: [{
|
|
204
|
-
type: Input,
|
|
205
|
-
args: ["copilotTooltip"]
|
|
206
|
-
}], tooltipPosition: [{
|
|
207
|
-
type: Input
|
|
208
|
-
}], tooltipDelay: [{
|
|
209
|
-
type: Input
|
|
210
|
-
}], onMouseEnter: [{
|
|
211
|
-
type: HostListener,
|
|
212
|
-
args: ["mouseenter"]
|
|
213
|
-
}], onMouseLeave: [{
|
|
214
|
-
type: HostListener,
|
|
215
|
-
args: ["mouseleave"]
|
|
216
|
-
}] } });
|
|
217
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGlyZWN0aXZlcy90b29sdGlwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixZQUFZLEVBRVosTUFBTSxFQUNOLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUVQLHNCQUFzQixHQUV2QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixHQUV4QixNQUFNLGVBQWUsQ0FBQzs7QUEwRnZCLE1BQU0sT0FBTyxjQUFjO0lBYUw7SUFacEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNGLFNBQVMsR0FBeUMsT0FBTyxDQUFDO0lBRWxFLElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsS0FBMkM7UUFDdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7SUFBRyxDQUFDO3dHQWJuQyxjQUFjOzRGQUFkLGNBQWMsbUZBckZmOzs7Ozs7O0dBT1Q7OzRGQThFVSxjQUFjO2tCQXhGMUIsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxZQUNOOzs7Ozs7O0dBT1QsbUJBNEVnQix1QkFBdUIsQ0FBQyxNQUFNOztBQXNCakQsTUFBTSxPQUFPLGNBQWM7SUFDQSxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLGVBQWUsR0FBeUMsT0FBTyxDQUFDO0lBQ2hFLFlBQVksR0FB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QyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztpQkFDckIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO2lCQUM1QixJQUFJLEVBQUUsQ0FBQztRQUVoQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsdUNBQXVDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQzt3R0EvS1UsY0FBYzs0RkFBZCxjQUFjOzs0RkFBZCxjQUFjO2tCQUoxQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs4QkFFMEIsV0FBVztzQkFBbkMsS0FBSzt1QkFBQyxnQkFBZ0I7Z0JBQ2QsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQVlOLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZO2dCQXVCMUIsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIE9uRGVzdHJveSxcbiAgaW5qZWN0LFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgT3ZlcmxheSxcbiAgT3ZlcmxheVJlZixcbiAgT3ZlcmxheVBvc2l0aW9uQnVpbGRlcixcbiAgQ29ubmVjdGVkUG9zaXRpb24sXG59IGZyb20gXCJAYW5ndWxhci9jZGsvb3ZlcmxheVwiO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9wb3J0YWxcIjtcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiY29waWxvdC10b29sdGlwLWNvbnRlbnRcIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29waWxvdC10b29sdGlwLXdyYXBwZXJcIiBbYXR0ci5kYXRhLXBvc2l0aW9uXT1cInBvc2l0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29waWxvdC10b29sdGlwXCI+XG4gICAgICAgIHt7IHRleHQgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvcGlsb3QtdG9vbHRpcC1hcnJvd1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuY29waWxvdC10b29sdGlwLXdyYXBwZXIge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgYW5pbWF0aW9uOiBmYWRlSW4gMC4xNXMgZWFzZS1pbi1vdXQ7XG4gICAgICB9XG5cbiAgICAgIC5jb3BpbG90LXRvb2x0aXAge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWExYTFhO1xuICAgICAgICBjb2xvcjogd2hpdGU7XG4gICAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gICAgICB9XG5cbiAgICAgIC5jb3BpbG90LXRvb2x0aXAtYXJyb3cge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHdpZHRoOiAwO1xuICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gICAgICB9XG5cbiAgICAgIC8qIEFycm93IGZvciB0b29sdGlwIGJlbG93IGVsZW1lbnQgKGFycm93IHBvaW50cyB1cCB0byB0b29sdGlwKSAqL1xuICAgICAgLmNvcGlsb3QtdG9vbHRpcC13cmFwcGVyW2RhdGEtcG9zaXRpb249XCJiZWxvd1wiXSAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgICAgdG9wOiAtNHB4O1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgYm9yZGVyLXdpZHRoOiAwIDRweCA0cHggNHB4O1xuICAgICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICMxYTFhMWEgdHJhbnNwYXJlbnQ7XG4gICAgICB9XG5cbiAgICAgIC8qIEFycm93IGZvciB0b29sdGlwIGFib3ZlIGVsZW1lbnQgKGFycm93IHBvaW50cyBkb3duIHRvIGVsZW1lbnQpICovXG4gICAgICAuY29waWxvdC10b29sdGlwLXdyYXBwZXJbZGF0YS1wb3NpdGlvbj1cImFib3ZlXCJdIC5jb3BpbG90LXRvb2x0aXAtYXJyb3cge1xuICAgICAgICBib3R0b206IC00cHg7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgICBib3JkZXItd2lkdGg6IDRweCA0cHggMCA0cHg7XG4gICAgICAgIGJvcmRlci1jb2xvcjogIzFhMWExYSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcbiAgICAgIH1cblxuICAgICAgLyogQXJyb3cgZm9yIHRvb2x0aXAgdG8gdGhlIGxlZnQgKi9cbiAgICAgIC5jb3BpbG90LXRvb2x0aXAtd3JhcHBlcltkYXRhLXBvc2l0aW9uPVwibGVmdFwiXSAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgICAgcmlnaHQ6IC00cHg7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgIGJvcmRlci13aWR0aDogNHB4IDAgNHB4IDRweDtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjMWExYTFhO1xuICAgICAgfVxuXG4gICAgICAvKiBBcnJvdyBmb3IgdG9vbHRpcCB0byB0aGUgcmlnaHQgKi9cbiAgICAgIC5jb3BpbG90LXRvb2x0aXAtd3JhcHBlcltkYXRhLXBvc2l0aW9uPVwicmlnaHRcIl0gLmNvcGlsb3QtdG9vbHRpcC1hcnJvdyB7XG4gICAgICAgIGxlZnQ6IC00cHg7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgIGJvcmRlci13aWR0aDogNHB4IDRweCA0cHggMDtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCAjMWExYTFhIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIGZhZGVJbiB7XG4gICAgICAgIGZyb20ge1xuICAgICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDJweCk7XG4gICAgICAgIH1cbiAgICAgICAgdG8ge1xuICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRvb2x0aXBDb250ZW50IHtcbiAgdGV4dCA9IFwiXCI7XG4gIHByaXZhdGUgX3Bvc2l0aW9uOiBcImFib3ZlXCIgfCBcImJlbG93XCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiA9IFwiYmVsb3dcIjtcblxuICBnZXQgcG9zaXRpb24oKTogXCJhYm92ZVwiIHwgXCJiZWxvd1wiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIge1xuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgfVxuXG4gIHNldCBwb3NpdGlvbih2YWx1ZTogXCJhYm92ZVwiIHwgXCJiZWxvd1wiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIpIHtcbiAgICB0aGlzLl9wb3NpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW2NvcGlsb3RUb29sdGlwXVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBDb3BpbG90VG9vbHRpcCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBJbnB1dChcImNvcGlsb3RUb29sdGlwXCIpIHRvb2x0aXBUZXh0ID0gXCJcIjtcbiAgQElucHV0KCkgdG9vbHRpcFBvc2l0aW9uOiBcImFib3ZlXCIgfCBcImJlbG93XCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiA9IFwiYmVsb3dcIjtcbiAgQElucHV0KCkgdG9vbHRpcERlbGF5ID0gNTAwOyAvLyBtaWxsaXNlY29uZHNcblxuICBwcml2YXRlIG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgb3ZlcmxheVBvc2l0aW9uQnVpbGRlciA9IGluamVjdChPdmVybGF5UG9zaXRpb25CdWlsZGVyKTtcbiAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHZpZXdDb250YWluZXJSZWYgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG5cbiAgcHJpdmF0ZSBvdmVybGF5UmVmPzogT3ZlcmxheVJlZjtcbiAgcHJpdmF0ZSB0b29sdGlwVGltZW91dD86IG51bWJlcjtcbiAgcHJpdmF0ZSBvcmlnaW5hbFRpdGxlPzogc3RyaW5nO1xuXG4gIEBIb3N0TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIpXG4gIG9uTW91c2VFbnRlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudG9vbHRpcFRleHQpIHJldHVybjtcblxuICAgIC8vIFN0b3JlIGFuZCByZW1vdmUgbmF0aXZlIHRpdGxlIHRvIHByZXZlbnQgT1MgdG9vbHRpcFxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSkge1xuICAgICAgdGhpcy5vcmlnaW5hbFRpdGxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIHRpbWVvdXRcbiAgICBpZiAodGhpcy50b29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aW1lb3V0IHRvIHNob3cgdG9vbHRpcCBhZnRlciBkZWxheVxuICAgIHRoaXMudG9vbHRpcFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9LCB0aGlzLnRvb2x0aXBEZWxheSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwibW91c2VsZWF2ZVwiKVxuICBvbk1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGltZW91dCBpZiBtb3VzZSBsZWF2ZXMgYmVmb3JlIHRvb2x0aXAgc2hvd3NcbiAgICBpZiAodGhpcy50b29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpO1xuICAgICAgdGhpcy50b29sdGlwVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHRpdGxlIGlmIGl0IGV4aXN0ZWRcbiAgICBpZiAodGhpcy5vcmlnaW5hbFRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZShcInRpdGxlXCIsIHRoaXMub3JpZ2luYWxUaXRsZSk7XG4gICAgICB0aGlzLm9yaWdpbmFsVGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gSGlkZSB0b29sdGlwIGlmIGl0J3Mgc2hvd2luZ1xuICAgIHRoaXMuaGlkZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgb3ZlcmxheVxuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXlQb3NpdGlvbkJ1aWxkZXJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZilcbiAgICAgIC53aXRoUG9zaXRpb25zKHRoaXMuZ2V0UG9zaXRpb25zKCkpXG4gICAgICAud2l0aFB1c2goZmFsc2UpO1xuXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmNsb3NlKCksXG4gICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50IHBvcnRhbCBhbmQgYXR0YWNoXG4gICAgY29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChUb29sdGlwQ29udGVudCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XG4gICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnRleHQgPSB0aGlzLnRvb2x0aXBUZXh0O1xuXG4gICAgLy8gRGV0ZWN0IGFjdHVhbCBwb3NpdGlvbiBhZnRlciBvdmVybGF5IGlzIHBvc2l0aW9uZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdG9vbHRpcFJlY3QgPVxuICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudFJlY3QgPVxuICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGxldCBhY3R1YWxQb3NpdGlvbjogXCJhYm92ZVwiIHwgXCJiZWxvd1wiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgPSBcImJlbG93XCI7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGFjdHVhbCBwb3NpdGlvbiBiYXNlZCBvbiByZWxhdGl2ZSBwb3NpdGlvbnNcbiAgICAgICAgaWYgKHRvb2x0aXBSZWN0LmJvdHRvbSA8PSBlbGVtZW50UmVjdC50b3ApIHtcbiAgICAgICAgICBhY3R1YWxQb3NpdGlvbiA9IFwiYWJvdmVcIjtcbiAgICAgICAgfSBlbHNlIGlmICh0b29sdGlwUmVjdC50b3AgPj0gZWxlbWVudFJlY3QuYm90dG9tKSB7XG4gICAgICAgICAgYWN0dWFsUG9zaXRpb24gPSBcImJlbG93XCI7XG4gICAgICAgIH0gZWxzZSBpZiAodG9vbHRpcFJlY3QucmlnaHQgPD0gZWxlbWVudFJlY3QubGVmdCkge1xuICAgICAgICAgIGFjdHVhbFBvc2l0aW9uID0gXCJsZWZ0XCI7XG4gICAgICAgIH0gZWxzZSBpZiAodG9vbHRpcFJlY3QubGVmdCA+PSBlbGVtZW50UmVjdC5yaWdodCkge1xuICAgICAgICAgIGFjdHVhbFBvc2l0aW9uID0gXCJyaWdodFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnBvc2l0aW9uID0gYWN0dWFsUG9zaXRpb247XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGhpZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFBvc2l0aW9ucygpOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICBjb25zdCBwb3NpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbm5lY3RlZFBvc2l0aW9uW10+ID0ge1xuICAgICAgYWJvdmU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXG4gICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICBvdmVybGF5WDogXCJjZW50ZXJcIixcbiAgICAgICAgICBvdmVybGF5WTogXCJib3R0b21cIixcbiAgICAgICAgICBvZmZzZXRZOiAtMTIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYmVsb3c6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXG4gICAgICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcbiAgICAgICAgICBvdmVybGF5WDogXCJjZW50ZXJcIixcbiAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIixcbiAgICAgICAgICBvZmZzZXRZOiAxMixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiBcInN0YXJ0XCIsXG4gICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcbiAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICBvdmVybGF5WTogXCJjZW50ZXJcIixcbiAgICAgICAgICBvZmZzZXRYOiAtMTIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcmlnaHQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6IFwiZW5kXCIsXG4gICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcbiAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxuICAgICAgICAgIG92ZXJsYXlZOiBcImNlbnRlclwiLFxuICAgICAgICAgIG9mZnNldFg6IDEyLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgLy8gUHJlZmVyIGJlbG93IHBvc2l0aW9uLCBidXQgdXNlIGFib3ZlIGFzIGZhbGxiYWNrXG4gICAgY29uc3QgcHJpbWFyeSA9IHBvc2l0aW9uc1t0aGlzLnRvb2x0aXBQb3NpdGlvbl0gfHwgcG9zaXRpb25zLmJlbG93O1xuICAgIC8vIEZvciBiZWxvdyBwb3NpdGlvbiwgYWRkIGFib3ZlIGFzIGZpcnN0IGZhbGxiYWNrXG4gICAgY29uc3QgZmFsbGJhY2tzID1cbiAgICAgIHRoaXMudG9vbHRpcFBvc2l0aW9uID09PSBcImJlbG93XCJcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAuLi4ocG9zaXRpb25zLmFib3ZlIHx8IFtdKSxcbiAgICAgICAgICAgIC4uLihwb3NpdGlvbnMubGVmdCB8fCBbXSksXG4gICAgICAgICAgICAuLi4ocG9zaXRpb25zLnJpZ2h0IHx8IFtdKSxcbiAgICAgICAgICBdXG4gICAgICAgIDogT2JqZWN0LnZhbHVlcyhwb3NpdGlvbnMpXG4gICAgICAgICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBwcmltYXJ5KVxuICAgICAgICAgICAgLmZsYXQoKTtcblxuICAgIHJldHVybiBbLi4uKHByaW1hcnkgfHwgW10pLCAuLi5mYWxsYmFja3NdO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICB9XG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCB0aXRsZSBpZiBpdCBleGlzdGVkXG4gICAgaWYgKHRoaXMub3JpZ2luYWxUaXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiLCB0aGlzLm9yaWdpbmFsVGl0bGUpO1xuICAgIH1cbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxufVxuIl19
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Injectable } from "@angular/core";
|
|
2
|
-
import { filter, lastValueFrom, Subject, take } from "rxjs";
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export class HumanInTheLoop {
|
|
5
|
-
results = new Subject();
|
|
6
|
-
addResult(toolCallId, toolName, result) {
|
|
7
|
-
this.results.next({ toolCallId, toolName, result });
|
|
8
|
-
}
|
|
9
|
-
onResult(toolCallId, toolName) {
|
|
10
|
-
return lastValueFrom(this.results.pipe(filter((result) => result.toolCallId === toolCallId && result.toolName === toolName), take(1)));
|
|
11
|
-
}
|
|
12
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HumanInTheLoop, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
13
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HumanInTheLoop, providedIn: "root" });
|
|
14
|
-
}
|
|
15
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HumanInTheLoop, decorators: [{
|
|
16
|
-
type: Injectable,
|
|
17
|
-
args: [{ providedIn: "root" }]
|
|
18
|
-
}] });
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVtYW4taW4tdGhlLWxvb3AuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2h1bWFuLWluLXRoZS1sb29wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFHNUQsTUFBTSxPQUFPLGNBQWM7SUFDekIsT0FBTyxHQUFHLElBQUksT0FBTyxFQUlqQixDQUFDO0lBRUwsU0FBUyxDQUFDLFVBQWtCLEVBQUUsUUFBZ0IsRUFBRSxNQUFlO1FBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxRQUFRLENBQUMsVUFBa0IsRUFBRSxRQUFnQjtRQUMzQyxPQUFPLGFBQWEsQ0FDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsTUFBTSxDQUNKLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDVCxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FDbkUsRUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1IsQ0FDRixDQUFDO0lBQ0osQ0FBQzt3R0FyQlUsY0FBYzs0R0FBZCxjQUFjLGNBREQsTUFBTTs7NEZBQ25CLGNBQWM7a0JBRDFCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBmaWx0ZXIsIGxhc3RWYWx1ZUZyb20sIFN1YmplY3QsIHRha2UgfSBmcm9tIFwicnhqc1wiO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgSHVtYW5JblRoZUxvb3Age1xuICByZXN1bHRzID0gbmV3IFN1YmplY3Q8e1xuICAgIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgICB0b29sTmFtZTogc3RyaW5nO1xuICAgIHJlc3VsdDogdW5rbm93bjtcbiAgfT4oKTtcblxuICBhZGRSZXN1bHQodG9vbENhbGxJZDogc3RyaW5nLCB0b29sTmFtZTogc3RyaW5nLCByZXN1bHQ6IHVua25vd24pIHtcbiAgICB0aGlzLnJlc3VsdHMubmV4dCh7IHRvb2xDYWxsSWQsIHRvb2xOYW1lLCByZXN1bHQgfSk7XG4gIH1cblxuICBvblJlc3VsdCh0b29sQ2FsbElkOiBzdHJpbmcsIHRvb2xOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gbGFzdFZhbHVlRnJvbShcbiAgICAgIHRoaXMucmVzdWx0cy5waXBlKFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgKHJlc3VsdCkgPT5cbiAgICAgICAgICAgIHJlc3VsdC50b29sQ2FsbElkID09PSB0b29sQ2FsbElkICYmIHJlc3VsdC50b29sTmFtZSA9PT0gdG9vbE5hbWUsXG4gICAgICAgICksXG4gICAgICAgIHRha2UoMSksXG4gICAgICApLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|