@copilotkitnext/angular 0.0.2 → 0.0.5
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 +3 -3
- package/dist/README.md +3 -3
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
- package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
- package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
- package/dist/core/copilotkit.providers.d.ts +1 -1
- package/dist/core/copilotkit.service.d.ts +5 -5
- package/dist/core/copilotkit.types.d.ts +8 -10
- package/dist/directives/copilotkit-frontend-tool.directive.d.ts +1 -1
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
- package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
- package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
- package/dist/esm2022/core/copilotkit.service.mjs +426 -0
- package/dist/esm2022/core/copilotkit.types.mjs +13 -0
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +128 -0
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +265 -0
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
- package/dist/esm2022/index.mjs +70 -0
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
- package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
- package/dist/esm2022/lib/utils.mjs +10 -0
- package/dist/esm2022/services/resize-observer.service.mjs +152 -0
- package/dist/esm2022/services/scroll-position.service.mjs +124 -0
- package/dist/esm2022/types/frontend-tool.mjs +2 -0
- package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
- package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
- package/dist/esm2022/utils/agent.utils.mjs +204 -0
- package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
- package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
- package/dist/esm2022/utils/frontend-tool.utils.mjs +224 -0
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +293 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +174 -187
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/utils/frontend-tool.utils.d.ts +1 -1
- package/package.json +23 -20
- package/vitest.config.mts +32 -21
- package/.turbo/turbo-build.log +0 -38
- package/.turbo/turbo-check-types.log +0 -0
- package/.turbo/turbo-test.log +0 -71
- package/ng-package.json +0 -19
- package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
- package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
- package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
- package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
- package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
- package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
- package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
- package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
- package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
- package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
- package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
- package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
- package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
- package/src/components/chat/copilot-chat-input.component.ts +0 -512
- package/src/components/chat/copilot-chat-input.types.ts +0 -148
- package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
- package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
- package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
- package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
- package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
- package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
- package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
- package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
- package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
- package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
- package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
- package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
- package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
- package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
- package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
- package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
- package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
- package/src/components/chat/copilot-chat-view.component.ts +0 -420
- package/src/components/chat/copilot-chat-view.types.ts +0 -52
- package/src/components/chat/copilot-chat.component.ts +0 -232
- package/src/components/copilotkit-tool-render.component.ts +0 -169
- package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
- package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
- package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
- package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
- package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
- package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
- package/src/core/copilotkit.providers.ts +0 -59
- package/src/core/copilotkit.service.ts +0 -542
- package/src/core/copilotkit.types.ts +0 -132
- package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
- package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
- package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
- package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
- package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
- package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
- package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
- package/src/directives/copilotkit-agent-context.directive.ts +0 -138
- package/src/directives/copilotkit-agent.directive.ts +0 -225
- package/src/directives/copilotkit-chat-config.directive.ts +0 -241
- package/src/directives/copilotkit-config.directive.ts +0 -81
- package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
- package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
- package/src/directives/stick-to-bottom.directive.ts +0 -204
- package/src/index.ts +0 -105
- package/src/lib/directives/tooltip.directive.ts +0 -292
- package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
- package/src/lib/slots/copilot-slot.component.ts +0 -135
- package/src/lib/slots/index.ts +0 -3
- package/src/lib/slots/slot.types.ts +0 -64
- package/src/lib/slots/slot.utils.ts +0 -289
- package/src/lib/utils.ts +0 -10
- package/src/public-api.ts +0 -1
- package/src/services/resize-observer.service.ts +0 -181
- package/src/services/scroll-position.service.ts +0 -169
- package/src/styles/globals.css +0 -266
- package/src/styles/index.css +0 -3
- package/src/test-setup.ts +0 -15
- package/src/testing/index.ts +0 -3
- package/src/testing/testing.utils.ts +0 -248
- package/src/types/frontend-tool.ts +0 -44
- package/src/types/human-in-the-loop.ts +0 -52
- package/src/utils/__tests__/agent.utils.spec.ts +0 -234
- package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
- package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
- package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
- package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
- package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
- package/src/utils/agent-context.utils.ts +0 -133
- package/src/utils/agent.utils.ts +0 -239
- package/src/utils/chat-config.utils.ts +0 -221
- package/src/utils/copilotkit.utils.ts +0 -20
- package/src/utils/frontend-tool.utils.ts +0 -266
- package/src/utils/human-in-the-loop.utils.ts +0 -359
- package/tsconfig.spec.json +0 -12
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzc2lzdGFudE1lc3NhZ2UgfSBmcm9tICdAYWctdWkvY2xpZW50JztcblxuLy8gQ29udGV4dCBpbnRlcmZhY2VzIGZvciBzbG90c1xuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnRNZXNzYWdlTWFya2Rvd25SZW5kZXJlckNvbnRleHQge1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50TWVzc2FnZVRvb2xiYXJDb250ZXh0IHtcbiAgY2hpbGRyZW4/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50TWVzc2FnZUNvcHlCdXR0b25Db250ZXh0IHtcbiAgY29udGVudD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHVtYnNVcEJ1dHRvbkNvbnRleHQge1xuICAvLyBFbXB0eSBjb250ZXh0IC0gY2xpY2sgaGFuZGxlZCB2aWEgb3V0cHV0cyBtYXBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHVtYnNEb3duQnV0dG9uQ29udGV4dCB7XG4gIC8vIEVtcHR5IGNvbnRleHQgLSBjbGljayBoYW5kbGVkIHZpYSBvdXRwdXRzIG1hcFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRBbG91ZEJ1dHRvbkNvbnRleHQge1xuICAvLyBFbXB0eSBjb250ZXh0IC0gY2xpY2sgaGFuZGxlZCB2aWEgb3V0cHV0cyBtYXBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdlbmVyYXRlQnV0dG9uQ29udGV4dCB7XG4gIC8vIEVtcHR5IGNvbnRleHQgLSBjbGljayBoYW5kbGVkIHZpYSBvdXRwdXRzIG1hcFxufVxuXG4vLyBFdmVudCBoYW5kbGVyIHByb3BzXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZU9uVGh1bWJzVXBQcm9wcyB7XG4gIG1lc3NhZ2U6IEFzc2lzdGFudE1lc3NhZ2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlT25UaHVtYnNEb3duUHJvcHMge1xuICBtZXNzYWdlOiBBc3Npc3RhbnRNZXNzYWdlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZU9uUmVhZEFsb3VkUHJvcHMge1xuICBtZXNzYWdlOiBBc3Npc3RhbnRNZXNzYWdlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZU9uUmVnZW5lcmF0ZVByb3BzIHtcbiAgbWVzc2FnZTogQXNzaXN0YW50TWVzc2FnZTtcbn1cblxuLy8gUmUtZXhwb3J0IGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgeyBBc3Npc3RhbnRNZXNzYWdlIH07Il19
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild, signal, computed, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { AudioRecorderError } from './copilot-chat-input.types';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class CopilotChatAudioRecorderComponent {
|
|
5
|
+
canvasRef;
|
|
6
|
+
set inputClass(val) {
|
|
7
|
+
this.customClass.set(val);
|
|
8
|
+
}
|
|
9
|
+
set inputShowControls(val) {
|
|
10
|
+
this.showControls.set(val ?? false);
|
|
11
|
+
}
|
|
12
|
+
stateChange = new EventEmitter();
|
|
13
|
+
error = new EventEmitter();
|
|
14
|
+
// Signals for state management
|
|
15
|
+
state = signal('idle');
|
|
16
|
+
customClass = signal(undefined);
|
|
17
|
+
showControls = signal(false);
|
|
18
|
+
// Computed values
|
|
19
|
+
computedClass = computed(() => {
|
|
20
|
+
const baseClasses = 'h-11 w-full px-5';
|
|
21
|
+
return `${baseClasses} ${this.customClass() || ''}`;
|
|
22
|
+
});
|
|
23
|
+
statusText = computed(() => {
|
|
24
|
+
switch (this.state()) {
|
|
25
|
+
case 'recording':
|
|
26
|
+
return 'Recording...';
|
|
27
|
+
case 'processing':
|
|
28
|
+
return 'Processing...';
|
|
29
|
+
default:
|
|
30
|
+
return 'Ready';
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
// Animation and canvas properties
|
|
34
|
+
animationFrameId;
|
|
35
|
+
ngAfterViewInit() {
|
|
36
|
+
this.startAnimation();
|
|
37
|
+
}
|
|
38
|
+
ngOnDestroy() {
|
|
39
|
+
this.dispose();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Start recording audio
|
|
43
|
+
*/
|
|
44
|
+
async start() {
|
|
45
|
+
try {
|
|
46
|
+
if (this.state() === 'recording') {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this.setState('recording');
|
|
50
|
+
this.startAnimation();
|
|
51
|
+
// In a real implementation, this would start actual audio recording
|
|
52
|
+
// For now, we just simulate the recording state
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
const error = new AudioRecorderError(err instanceof Error ? err.message : 'Failed to start recording');
|
|
56
|
+
this.error.emit(error);
|
|
57
|
+
this.setState('idle');
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Stop recording audio and return blob
|
|
63
|
+
*/
|
|
64
|
+
async stop() {
|
|
65
|
+
try {
|
|
66
|
+
this.setState('idle');
|
|
67
|
+
// Return empty blob - stub implementation
|
|
68
|
+
const emptyBlob = new Blob([], { type: 'audio/webm' });
|
|
69
|
+
return emptyBlob;
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
const error = new AudioRecorderError(err instanceof Error ? err.message : 'Failed to stop recording');
|
|
73
|
+
this.error.emit(error);
|
|
74
|
+
this.setState('idle');
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get current recorder state
|
|
80
|
+
*/
|
|
81
|
+
getState() {
|
|
82
|
+
return this.state();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Dispose of resources
|
|
86
|
+
*/
|
|
87
|
+
dispose() {
|
|
88
|
+
this.stopAnimation();
|
|
89
|
+
}
|
|
90
|
+
setState(state) {
|
|
91
|
+
this.state.set(state);
|
|
92
|
+
this.stateChange.emit(state);
|
|
93
|
+
}
|
|
94
|
+
startAnimation() {
|
|
95
|
+
const canvas = this.canvasRef.nativeElement;
|
|
96
|
+
if (!canvas)
|
|
97
|
+
return;
|
|
98
|
+
const ctx = canvas.getContext('2d');
|
|
99
|
+
if (!ctx)
|
|
100
|
+
return;
|
|
101
|
+
const draw = () => {
|
|
102
|
+
const rect = canvas.getBoundingClientRect();
|
|
103
|
+
const dpr = window.devicePixelRatio || 1;
|
|
104
|
+
// Update canvas dimensions if container resized
|
|
105
|
+
if (canvas.width !== rect.width * dpr ||
|
|
106
|
+
canvas.height !== rect.height * dpr) {
|
|
107
|
+
canvas.width = rect.width * dpr;
|
|
108
|
+
canvas.height = rect.height * dpr;
|
|
109
|
+
ctx.scale(dpr, dpr);
|
|
110
|
+
ctx.imageSmoothingEnabled = false;
|
|
111
|
+
}
|
|
112
|
+
// Configuration
|
|
113
|
+
const barWidth = 2;
|
|
114
|
+
const minHeight = 2;
|
|
115
|
+
const maxHeight = 20;
|
|
116
|
+
const gap = 2;
|
|
117
|
+
const numSamples = Math.ceil(rect.width / (barWidth + gap));
|
|
118
|
+
// Get loudness data
|
|
119
|
+
const loudnessData = this.getLoudness(numSamples);
|
|
120
|
+
// Clear canvas
|
|
121
|
+
ctx.clearRect(0, 0, rect.width, rect.height);
|
|
122
|
+
// Get current foreground color
|
|
123
|
+
const computedStyle = getComputedStyle(canvas);
|
|
124
|
+
const currentForeground = computedStyle.color;
|
|
125
|
+
// Draw bars
|
|
126
|
+
ctx.fillStyle = currentForeground;
|
|
127
|
+
const centerY = rect.height / 2;
|
|
128
|
+
for (let i = 0; i < loudnessData.length; i++) {
|
|
129
|
+
const sample = loudnessData[i] ?? 0;
|
|
130
|
+
const barHeight = Math.round(sample * (maxHeight - minHeight) + minHeight);
|
|
131
|
+
const x = Math.round(i * (barWidth + gap));
|
|
132
|
+
const y = Math.round(centerY - barHeight / 2);
|
|
133
|
+
ctx.fillRect(x, y, barWidth, barHeight);
|
|
134
|
+
}
|
|
135
|
+
this.animationFrameId = requestAnimationFrame(draw);
|
|
136
|
+
};
|
|
137
|
+
draw();
|
|
138
|
+
}
|
|
139
|
+
stopAnimation() {
|
|
140
|
+
if (this.animationFrameId) {
|
|
141
|
+
cancelAnimationFrame(this.animationFrameId);
|
|
142
|
+
this.animationFrameId = undefined;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
getLoudness(n) {
|
|
146
|
+
const elapsed = Date.now() / 1000; // Use current timestamp directly
|
|
147
|
+
const samples = [];
|
|
148
|
+
for (let i = 0; i < n; i++) {
|
|
149
|
+
// Create a position that moves from left to right over time
|
|
150
|
+
const position = (i / n) * 10 + elapsed * 0.5; // Scroll speed (slower)
|
|
151
|
+
// Generate waveform using multiple sine waves for realism
|
|
152
|
+
const wave1 = Math.sin(position * 2) * 0.3;
|
|
153
|
+
const wave2 = Math.sin(position * 5 + elapsed) * 0.2;
|
|
154
|
+
const wave3 = Math.sin(position * 0.5 + elapsed * 0.3) * 0.4;
|
|
155
|
+
// Add some randomness for natural variation
|
|
156
|
+
const noise = (Math.random() - 0.5) * 0.1;
|
|
157
|
+
// Combine waves and add envelope for realistic amplitude variation
|
|
158
|
+
const envelope = Math.sin(elapsed * 0.7) * 0.5 + 0.5; // Slow amplitude modulation
|
|
159
|
+
let amplitude = (wave1 + wave2 + wave3 + noise) * envelope;
|
|
160
|
+
// Clamp to 0-1 range
|
|
161
|
+
amplitude = Math.max(0, Math.min(1, amplitude * 0.5 + 0.3));
|
|
162
|
+
samples.push(amplitude);
|
|
163
|
+
}
|
|
164
|
+
return samples;
|
|
165
|
+
}
|
|
166
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAudioRecorderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
167
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatAudioRecorderComponent, isStandalone: true, selector: "copilot-chat-audio-recorder", inputs: { inputClass: "inputClass", inputShowControls: "inputShowControls" }, outputs: { stateChange: "stateChange", error: "error" }, host: { properties: { "class.copilot-chat-audio-recorder": "true" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvasRef"], descendants: true, static: true }], ngImport: i0, template: `
|
|
168
|
+
<div [class]="computedClass()">
|
|
169
|
+
<canvas
|
|
170
|
+
#canvasRef
|
|
171
|
+
class="w-full h-full"
|
|
172
|
+
[style.imageRendering]="'pixelated'"
|
|
173
|
+
></canvas>
|
|
174
|
+
</div>
|
|
175
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
176
|
+
}
|
|
177
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAudioRecorderComponent, decorators: [{
|
|
178
|
+
type: Component,
|
|
179
|
+
args: [{ selector: 'copilot-chat-audio-recorder', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
180
|
+
<div [class]="computedClass()">
|
|
181
|
+
<canvas
|
|
182
|
+
#canvasRef
|
|
183
|
+
class="w-full h-full"
|
|
184
|
+
[style.imageRendering]="'pixelated'"
|
|
185
|
+
></canvas>
|
|
186
|
+
</div>
|
|
187
|
+
`, host: {
|
|
188
|
+
'[class.copilot-chat-audio-recorder]': 'true'
|
|
189
|
+
} }]
|
|
190
|
+
}], propDecorators: { canvasRef: [{
|
|
191
|
+
type: ViewChild,
|
|
192
|
+
args: ['canvasRef', { static: true }]
|
|
193
|
+
}], inputClass: [{
|
|
194
|
+
type: Input
|
|
195
|
+
}], inputShowControls: [{
|
|
196
|
+
type: Input
|
|
197
|
+
}], stateChange: [{
|
|
198
|
+
type: Output
|
|
199
|
+
}], error: [{
|
|
200
|
+
type: Output
|
|
201
|
+
}] } });
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFNBQVMsRUFJVCxNQUFNLEVBQ04sUUFBUSxFQUNSLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFzQixrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQXFCcEYsTUFBTSxPQUFPLGlDQUFpQztJQUNGLFNBQVMsQ0FBaUM7SUFFcEYsSUFBYSxVQUFVLENBQUMsR0FBdUI7UUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQWEsaUJBQWlCLENBQUMsR0FBd0I7UUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFUyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7SUFDckQsS0FBSyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO0lBRXpELCtCQUErQjtJQUMvQixLQUFLLEdBQUcsTUFBTSxDQUFxQixNQUFNLENBQUMsQ0FBQztJQUMzQyxXQUFXLEdBQUcsTUFBTSxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUNwRCxZQUFZLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRXRDLGtCQUFrQjtJQUNsQixhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUM1QixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztRQUN2QyxPQUFPLEdBQUcs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QUFHLFFBQVEsQ0FBQztZQUUzRCxxQkFBcUI7WUFDckIsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU1RCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO3dHQTVNVSxpQ0FBaUM7NEZBQWpDLGlDQUFpQywyWkFkbEM7Ozs7Ozs7O0dBUVQ7OzRGQU1VLGlDQUFpQztrQkFuQjdDLFNBQVM7K0JBQ0UsNkJBQTZCLGNBQzNCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxZQUMzQjs7Ozs7Ozs7R0FRVCxRQUVLO3dCQUNKLHFDQUFxQyxFQUFFLE1BQU07cUJBQzlDOzhCQUd5QyxTQUFTO3NCQUFsRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRTNCLFVBQVU7c0JBQXRCLEtBQUs7Z0JBSU8saUJBQWlCO3NCQUE3QixLQUFLO2dCQUlJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT25EZXN0cm95LFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdWRpb1JlY29yZGVyU3RhdGUsIEF1ZGlvUmVjb3JkZXJFcnJvciB9IGZyb20gJy4vY29waWxvdC1jaGF0LWlucHV0LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzcygpXCI+XG4gICAgICA8Y2FudmFzXG4gICAgICAgICNjYW52YXNSZWZcbiAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsXCJcbiAgICAgICAgW3N0eWxlLmltYWdlUmVuZGVyaW5nXT1cIidwaXhlbGF0ZWQnXCJcbiAgICAgID48L2NhbnZhcz5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyXSc6ICd0cnVlJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0QXVkaW9SZWNvcmRlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ2NhbnZhc1JlZicsIHsgc3RhdGljOiB0cnVlIH0pIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuICBcbiAgQElucHV0KCkgc2V0IGlucHV0Q2xhc3ModmFsOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmN1c3RvbUNsYXNzLnNldCh2YWwpO1xuICB9XG4gIFxuICBASW5wdXQoKSBzZXQgaW5wdXRTaG93Q29udHJvbHModmFsOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zaG93Q29udHJvbHMuc2V0KHZhbCA/PyBmYWxzZSk7XG4gIH1cbiAgXG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXVkaW9SZWNvcmRlclN0YXRlPigpO1xuICBAT3V0cHV0KCkgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPEF1ZGlvUmVjb3JkZXJFcnJvcj4oKTtcbiAgXG4gIC8vIFNpZ25hbHMgZm9yIHN0YXRlIG1hbmFnZW1lbnRcbiAgc3RhdGUgPSBzaWduYWw8QXVkaW9SZWNvcmRlclN0YXRlPignaWRsZScpO1xuICBjdXN0b21DbGFzcyA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHNob3dDb250cm9scyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIFxuICAvLyBDb21wdXRlZCB2YWx1ZXNcbiAgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdoLTExIHctZnVsbCBweC01JztcbiAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9ICR7dGhpcy5jdXN0b21DbGFzcygpIHx8ICcnfWA7XG4gIH0pO1xuICBcbiAgc3RhdHVzVGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMuc3RhdGUoKSkge1xuICAgICAgY2FzZSAncmVjb3JkaW5nJzpcbiAgICAgICAgcmV0dXJuICdSZWNvcmRpbmcuLi4nO1xuICAgICAgY2FzZSAncHJvY2Vzc2luZyc6XG4gICAgICAgIHJldHVybiAnUHJvY2Vzc2luZy4uLic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ1JlYWR5JztcbiAgICB9XG4gIH0pO1xuICBcbiAgLy8gQW5pbWF0aW9uIGFuZCBjYW52YXMgcHJvcGVydGllc1xuICBwcml2YXRlIGFuaW1hdGlvbkZyYW1lSWQ/OiBudW1iZXI7XG4gIFxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFN0YXJ0IHJlY29yZGluZyBhdWRpb1xuICAgKi9cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlKCkgPT09ICdyZWNvcmRpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5zZXRTdGF0ZSgncmVjb3JkaW5nJyk7XG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XG4gICAgICBcbiAgICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCBzdGFydCBhY3R1YWwgYXVkaW8gcmVjb3JkaW5nXG4gICAgICAvLyBGb3Igbm93LCB3ZSBqdXN0IHNpbXVsYXRlIHRoZSByZWNvcmRpbmcgc3RhdGVcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQXVkaW9SZWNvcmRlckVycm9yKFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBzdGFydCByZWNvcmRpbmcnXG4gICAgICApO1xuICAgICAgdGhpcy5lcnJvci5lbWl0KGVycm9yKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoJ2lkbGUnKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFN0b3AgcmVjb3JkaW5nIGF1ZGlvIGFuZCByZXR1cm4gYmxvYlxuICAgKi9cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPEJsb2I+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgnaWRsZScpO1xuICAgICAgLy8gUmV0dXJuIGVtcHR5IGJsb2IgLSBzdHViIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBlbXB0eUJsb2IgPSBuZXcgQmxvYihbXSwgeyB0eXBlOiAnYXVkaW8vd2VibScgfSk7XG4gICAgICByZXR1cm4gZW1wdHlCbG9iO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQXVkaW9SZWNvcmRlckVycm9yKFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBzdG9wIHJlY29yZGluZydcbiAgICAgICk7XG4gICAgICB0aGlzLmVycm9yLmVtaXQoZXJyb3IpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSgnaWRsZScpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgcmVjb3JkZXIgc3RhdGVcbiAgICovXG4gIGdldFN0YXRlKCk6IEF1ZGlvUmVjb3JkZXJTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgcmVzb3VyY2VzXG4gICAqL1xuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdGF0ZShzdGF0ZTogQXVkaW9SZWNvcmRlclN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5zZXQoc3RhdGUpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdChzdGF0ZSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc3RhcnRBbmltYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcblxuICAgIGNvbnN0IGRyYXcgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgZHByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgICAgLy8gVXBkYXRlIGNhbnZhcyBkaW1lbnNpb25zIGlmIGNvbnRhaW5lciByZXNpemVkXG4gICAgICBpZiAoXG4gICAgICAgIGNhbnZhcy53aWR0aCAhPT0gcmVjdC53aWR0aCAqIGRwciB8fFxuICAgICAgICBjYW52YXMuaGVpZ2h0ICE9PSByZWN0LmhlaWdodCAqIGRwclxuICAgICAgKSB7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHJlY3Qud2lkdGggKiBkcHI7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSByZWN0LmhlaWdodCAqIGRwcjtcbiAgICAgICAgY3R4LnNjYWxlKGRwciwgZHByKTtcbiAgICAgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25maWd1cmF0aW9uXG4gICAgICBjb25zdCBiYXJXaWR0aCA9IDI7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSAyO1xuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gMjA7XG4gICAgICBjb25zdCBnYXAgPSAyO1xuICAgICAgY29uc3QgbnVtU2FtcGxlcyA9IE1hdGguY2VpbChyZWN0LndpZHRoIC8gKGJhcldpZHRoICsgZ2FwKSk7XG5cbiAgICAgIC8vIEdldCBsb3VkbmVzcyBkYXRhXG4gICAgICBjb25zdCBsb3VkbmVzc0RhdGEgPSB0aGlzLmdldExvdWRuZXNzKG51bVNhbXBsZXMpO1xuXG4gICAgICAvLyBDbGVhciBjYW52YXNcbiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuXG4gICAgICAvLyBHZXQgY3VycmVudCBmb3JlZ3JvdW5kIGNvbG9yXG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjYW52YXMpO1xuICAgICAgY29uc3QgY3VycmVudEZvcmVncm91bmQgPSBjb21wdXRlZFN0eWxlLmNvbG9yO1xuXG4gICAgICAvLyBEcmF3IGJhcnNcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBjdXJyZW50Rm9yZWdyb3VuZDtcbiAgICAgIGNvbnN0IGNlbnRlclkgPSByZWN0LmhlaWdodCAvIDI7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG91ZG5lc3NEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNhbXBsZSA9IGxvdWRuZXNzRGF0YVtpXSA/PyAwO1xuICAgICAgICBjb25zdCBiYXJIZWlnaHQgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIHNhbXBsZSAqIChtYXhIZWlnaHQgLSBtaW5IZWlnaHQpICsgbWluSGVpZ2h0XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHggPSBNYXRoLnJvdW5kKGkgKiAoYmFyV2lkdGggKyBnYXApKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGgucm91bmQoY2VudGVyWSAtIGJhckhlaWdodCAvIDIpO1xuXG4gICAgICAgIGN0eC5maWxsUmVjdCh4LCB5LCBiYXJXaWR0aCwgYmFySGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRyYXcpO1xuICAgIH07XG5cbiAgICBkcmF3KCk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc3RvcEFuaW1hdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZUlkKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lSWQpO1xuICAgICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG91ZG5lc3MobjogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC8gMTAwMDsgLy8gVXNlIGN1cnJlbnQgdGltZXN0YW1wIGRpcmVjdGx5XG4gICAgY29uc3Qgc2FtcGxlczogbnVtYmVyW10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAvLyBDcmVhdGUgYSBwb3NpdGlvbiB0aGF0IG1vdmVzIGZyb20gbGVmdCB0byByaWdodCBvdmVyIHRpbWVcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gKGkgLyBuKSAqIDEwICsgZWxhcHNlZCAqIDAuNTsgLy8gU2Nyb2xsIHNwZWVkIChzbG93ZXIpXG5cbiAgICAgIC8vIEdlbmVyYXRlIHdhdmVmb3JtIHVzaW5nIG11bHRpcGxlIHNpbmUgd2F2ZXMgZm9yIHJlYWxpc21cbiAgICAgIGNvbnN0IHdhdmUxID0gTWF0aC5zaW4ocG9zaXRpb24gKiAyKSAqIDAuMztcbiAgICAgIGNvbnN0IHdhdmUyID0gTWF0aC5zaW4ocG9zaXRpb24gKiA1ICsgZWxhcHNlZCkgKiAwLjI7XG4gICAgICBjb25zdCB3YXZlMyA9IE1hdGguc2luKHBvc2l0aW9uICogMC41ICsgZWxhcHNlZCAqIDAuMykgKiAwLjQ7XG5cbiAgICAgIC8vIEFkZCBzb21lIHJhbmRvbW5lc3MgZm9yIG5hdHVyYWwgdmFyaWF0aW9uXG4gICAgICBjb25zdCBub2lzZSA9IChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDAuMTtcblxuICAgICAgLy8gQ29tYmluZSB3YXZlcyBhbmQgYWRkIGVudmVsb3BlIGZvciByZWFsaXN0aWMgYW1wbGl0dWRlIHZhcmlhdGlvblxuICAgICAgY29uc3QgZW52ZWxvcGUgPSBNYXRoLnNpbihlbGFwc2VkICogMC43KSAqIDAuNSArIDAuNTsgLy8gU2xvdyBhbXBsaXR1ZGUgbW9kdWxhdGlvblxuICAgICAgbGV0IGFtcGxpdHVkZSA9ICh3YXZlMSArIHdhdmUyICsgd2F2ZTMgKyBub2lzZSkgKiBlbnZlbG9wZTtcblxuICAgICAgLy8gQ2xhbXAgdG8gMC0xIHJhbmdlXG4gICAgICBhbXBsaXR1ZGUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhbXBsaXR1ZGUgKiAwLjUgKyAwLjMpKTtcblxuICAgICAgc2FtcGxlcy5wdXNoKGFtcGxpdHVkZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhbXBsZXM7XG4gIH1cbn0iXX0=
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, inject, signal, computed, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { LucideAngularModule, ArrowUp, Mic, X, Check, Plus } from 'lucide-angular';
|
|
4
|
+
import { CopilotChatConfigurationService } from '../../core/chat-configuration/chat-configuration.service';
|
|
5
|
+
import { CopilotTooltipDirective } from '../../lib/directives/tooltip.directive';
|
|
6
|
+
import { cn } from '../../lib/utils';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "lucide-angular";
|
|
9
|
+
// Base button classes matching React's button variants
|
|
10
|
+
const buttonBase = cn('inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium', 'transition-all disabled:pointer-events-none disabled:opacity-50', 'shrink-0 outline-none', 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]');
|
|
11
|
+
const chatInputToolbarPrimary = cn('cursor-pointer',
|
|
12
|
+
// Background and text
|
|
13
|
+
'bg-black text-white',
|
|
14
|
+
// Dark mode
|
|
15
|
+
'dark:bg-white dark:text-black dark:focus-visible:outline-white',
|
|
16
|
+
// Shape and sizing
|
|
17
|
+
'rounded-full h-9 w-9',
|
|
18
|
+
// Interactions
|
|
19
|
+
'transition-colors',
|
|
20
|
+
// Focus states
|
|
21
|
+
'focus:outline-none',
|
|
22
|
+
// Hover states
|
|
23
|
+
'hover:opacity-70 disabled:hover:opacity-100',
|
|
24
|
+
// Disabled states
|
|
25
|
+
'disabled:cursor-not-allowed disabled:bg-[#00000014] disabled:text-[rgb(13,13,13)]', 'dark:disabled:bg-[#454545] dark:disabled:text-white');
|
|
26
|
+
const chatInputToolbarSecondary = cn('cursor-pointer',
|
|
27
|
+
// Background and text
|
|
28
|
+
'bg-transparent text-[#444444]',
|
|
29
|
+
// Dark mode
|
|
30
|
+
'dark:text-white dark:border-[#404040]',
|
|
31
|
+
// Shape and sizing
|
|
32
|
+
'rounded-full h-9 w-9',
|
|
33
|
+
// Interactions
|
|
34
|
+
'transition-colors',
|
|
35
|
+
// Focus states
|
|
36
|
+
'focus:outline-none',
|
|
37
|
+
// Hover states
|
|
38
|
+
'hover:bg-[#f8f8f8] hover:text-[#333333]', 'dark:hover:bg-[#404040] dark:hover:text-[#FFFFFF]',
|
|
39
|
+
// Disabled states
|
|
40
|
+
'disabled:cursor-not-allowed disabled:opacity-50', 'disabled:hover:bg-transparent disabled:hover:text-[#444444]', 'dark:disabled:hover:bg-transparent dark:disabled:hover:text-[#CCCCCC]');
|
|
41
|
+
export class CopilotChatSendButtonComponent {
|
|
42
|
+
disabled = false;
|
|
43
|
+
clicked = new EventEmitter();
|
|
44
|
+
ArrowUpIcon = ArrowUp;
|
|
45
|
+
buttonClass = cn(buttonBase, chatInputToolbarPrimary);
|
|
46
|
+
onClick() {
|
|
47
|
+
if (!this.disabled) {
|
|
48
|
+
this.clicked.emit();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatSendButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
52
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatSendButtonComponent, isStandalone: true, selector: "copilot-chat-send-button", inputs: { disabled: "disabled" }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
|
|
53
|
+
<div class="mr-[10px]">
|
|
54
|
+
<button
|
|
55
|
+
type="button"
|
|
56
|
+
[disabled]="disabled"
|
|
57
|
+
[class]="buttonClass"
|
|
58
|
+
(click)="onClick()"
|
|
59
|
+
>
|
|
60
|
+
<lucide-angular [img]="ArrowUpIcon" [size]="18"></lucide-angular>
|
|
61
|
+
</button>
|
|
62
|
+
</div>
|
|
63
|
+
`, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
64
|
+
}
|
|
65
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatSendButtonComponent, decorators: [{
|
|
66
|
+
type: Component,
|
|
67
|
+
args: [{ selector: 'copilot-chat-send-button', standalone: true, imports: [CommonModule, LucideAngularModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
68
|
+
<div class="mr-[10px]">
|
|
69
|
+
<button
|
|
70
|
+
type="button"
|
|
71
|
+
[disabled]="disabled"
|
|
72
|
+
[class]="buttonClass"
|
|
73
|
+
(click)="onClick()"
|
|
74
|
+
>
|
|
75
|
+
<lucide-angular [img]="ArrowUpIcon" [size]="18"></lucide-angular>
|
|
76
|
+
</button>
|
|
77
|
+
</div>
|
|
78
|
+
` }]
|
|
79
|
+
}], propDecorators: { disabled: [{
|
|
80
|
+
type: Input
|
|
81
|
+
}], clicked: [{
|
|
82
|
+
type: Output
|
|
83
|
+
}] } });
|
|
84
|
+
export class CopilotChatStartTranscribeButtonComponent {
|
|
85
|
+
disabled = false;
|
|
86
|
+
clicked = new EventEmitter();
|
|
87
|
+
chatConfig = inject(CopilotChatConfigurationService);
|
|
88
|
+
MicIcon = Mic;
|
|
89
|
+
buttonClass = cn(buttonBase, chatInputToolbarSecondary, 'mr-2');
|
|
90
|
+
get label() {
|
|
91
|
+
return this.chatConfig.labels().chatInputToolbarStartTranscribeButtonLabel;
|
|
92
|
+
}
|
|
93
|
+
onClick() {
|
|
94
|
+
if (!this.disabled) {
|
|
95
|
+
this.clicked.emit();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatStartTranscribeButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
99
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatStartTranscribeButtonComponent, isStandalone: true, selector: "copilot-chat-start-transcribe-button", inputs: { disabled: "disabled" }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
|
|
100
|
+
<button
|
|
101
|
+
type="button"
|
|
102
|
+
[disabled]="disabled"
|
|
103
|
+
[class]="buttonClass"
|
|
104
|
+
[copilotTooltip]="label"
|
|
105
|
+
tooltipPosition="below"
|
|
106
|
+
(click)="onClick()"
|
|
107
|
+
>
|
|
108
|
+
<lucide-angular [img]="MicIcon" [size]="18"></lucide-angular>
|
|
109
|
+
</button>
|
|
110
|
+
`, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "directive", type: CopilotTooltipDirective, selector: "[copilotTooltip]", inputs: ["copilotTooltip", "tooltipPosition", "tooltipDelay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
111
|
+
}
|
|
112
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatStartTranscribeButtonComponent, decorators: [{
|
|
113
|
+
type: Component,
|
|
114
|
+
args: [{ selector: 'copilot-chat-start-transcribe-button', standalone: true, imports: [CommonModule, LucideAngularModule, CopilotTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
115
|
+
<button
|
|
116
|
+
type="button"
|
|
117
|
+
[disabled]="disabled"
|
|
118
|
+
[class]="buttonClass"
|
|
119
|
+
[copilotTooltip]="label"
|
|
120
|
+
tooltipPosition="below"
|
|
121
|
+
(click)="onClick()"
|
|
122
|
+
>
|
|
123
|
+
<lucide-angular [img]="MicIcon" [size]="18"></lucide-angular>
|
|
124
|
+
</button>
|
|
125
|
+
` }]
|
|
126
|
+
}], propDecorators: { disabled: [{
|
|
127
|
+
type: Input
|
|
128
|
+
}], clicked: [{
|
|
129
|
+
type: Output
|
|
130
|
+
}] } });
|
|
131
|
+
export class CopilotChatCancelTranscribeButtonComponent {
|
|
132
|
+
disabled = false;
|
|
133
|
+
clicked = new EventEmitter();
|
|
134
|
+
chatConfig = inject(CopilotChatConfigurationService);
|
|
135
|
+
XIcon = X;
|
|
136
|
+
buttonClass = cn(buttonBase, chatInputToolbarSecondary, 'mr-2');
|
|
137
|
+
get label() {
|
|
138
|
+
return this.chatConfig.labels().chatInputToolbarCancelTranscribeButtonLabel;
|
|
139
|
+
}
|
|
140
|
+
onClick() {
|
|
141
|
+
if (!this.disabled) {
|
|
142
|
+
this.clicked.emit();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatCancelTranscribeButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
146
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatCancelTranscribeButtonComponent, isStandalone: true, selector: "copilot-chat-cancel-transcribe-button", inputs: { disabled: "disabled" }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
|
|
147
|
+
<button
|
|
148
|
+
type="button"
|
|
149
|
+
[disabled]="disabled"
|
|
150
|
+
[class]="buttonClass"
|
|
151
|
+
[copilotTooltip]="label"
|
|
152
|
+
tooltipPosition="below"
|
|
153
|
+
(click)="onClick()"
|
|
154
|
+
>
|
|
155
|
+
<lucide-angular [img]="XIcon" [size]="18"></lucide-angular>
|
|
156
|
+
</button>
|
|
157
|
+
`, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "directive", type: CopilotTooltipDirective, selector: "[copilotTooltip]", inputs: ["copilotTooltip", "tooltipPosition", "tooltipDelay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
158
|
+
}
|
|
159
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatCancelTranscribeButtonComponent, decorators: [{
|
|
160
|
+
type: Component,
|
|
161
|
+
args: [{ selector: 'copilot-chat-cancel-transcribe-button', standalone: true, imports: [CommonModule, LucideAngularModule, CopilotTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
162
|
+
<button
|
|
163
|
+
type="button"
|
|
164
|
+
[disabled]="disabled"
|
|
165
|
+
[class]="buttonClass"
|
|
166
|
+
[copilotTooltip]="label"
|
|
167
|
+
tooltipPosition="below"
|
|
168
|
+
(click)="onClick()"
|
|
169
|
+
>
|
|
170
|
+
<lucide-angular [img]="XIcon" [size]="18"></lucide-angular>
|
|
171
|
+
</button>
|
|
172
|
+
` }]
|
|
173
|
+
}], propDecorators: { disabled: [{
|
|
174
|
+
type: Input
|
|
175
|
+
}], clicked: [{
|
|
176
|
+
type: Output
|
|
177
|
+
}] } });
|
|
178
|
+
export class CopilotChatFinishTranscribeButtonComponent {
|
|
179
|
+
disabled = false;
|
|
180
|
+
clicked = new EventEmitter();
|
|
181
|
+
chatConfig = inject(CopilotChatConfigurationService);
|
|
182
|
+
CheckIcon = Check;
|
|
183
|
+
buttonClass = cn(buttonBase, chatInputToolbarSecondary, 'mr-[10px]');
|
|
184
|
+
get label() {
|
|
185
|
+
return this.chatConfig.labels().chatInputToolbarFinishTranscribeButtonLabel;
|
|
186
|
+
}
|
|
187
|
+
onClick() {
|
|
188
|
+
if (!this.disabled) {
|
|
189
|
+
this.clicked.emit();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatFinishTranscribeButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
193
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatFinishTranscribeButtonComponent, isStandalone: true, selector: "copilot-chat-finish-transcribe-button", inputs: { disabled: "disabled" }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
|
|
194
|
+
<button
|
|
195
|
+
type="button"
|
|
196
|
+
[disabled]="disabled"
|
|
197
|
+
[class]="buttonClass"
|
|
198
|
+
[copilotTooltip]="label"
|
|
199
|
+
tooltipPosition="below"
|
|
200
|
+
(click)="onClick()"
|
|
201
|
+
>
|
|
202
|
+
<lucide-angular [img]="CheckIcon" [size]="18"></lucide-angular>
|
|
203
|
+
</button>
|
|
204
|
+
`, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "directive", type: CopilotTooltipDirective, selector: "[copilotTooltip]", inputs: ["copilotTooltip", "tooltipPosition", "tooltipDelay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
205
|
+
}
|
|
206
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatFinishTranscribeButtonComponent, decorators: [{
|
|
207
|
+
type: Component,
|
|
208
|
+
args: [{ selector: 'copilot-chat-finish-transcribe-button', standalone: true, imports: [CommonModule, LucideAngularModule, CopilotTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
209
|
+
<button
|
|
210
|
+
type="button"
|
|
211
|
+
[disabled]="disabled"
|
|
212
|
+
[class]="buttonClass"
|
|
213
|
+
[copilotTooltip]="label"
|
|
214
|
+
tooltipPosition="below"
|
|
215
|
+
(click)="onClick()"
|
|
216
|
+
>
|
|
217
|
+
<lucide-angular [img]="CheckIcon" [size]="18"></lucide-angular>
|
|
218
|
+
</button>
|
|
219
|
+
` }]
|
|
220
|
+
}], propDecorators: { disabled: [{
|
|
221
|
+
type: Input
|
|
222
|
+
}], clicked: [{
|
|
223
|
+
type: Output
|
|
224
|
+
}] } });
|
|
225
|
+
export class CopilotChatAddFileButtonComponent {
|
|
226
|
+
disabled = false;
|
|
227
|
+
clicked = new EventEmitter();
|
|
228
|
+
chatConfig = inject(CopilotChatConfigurationService);
|
|
229
|
+
PlusIcon = Plus;
|
|
230
|
+
buttonClass = cn(buttonBase, chatInputToolbarSecondary, 'ml-2');
|
|
231
|
+
get label() {
|
|
232
|
+
return this.chatConfig.labels().chatInputToolbarAddButtonLabel;
|
|
233
|
+
}
|
|
234
|
+
onClick() {
|
|
235
|
+
if (!this.disabled) {
|
|
236
|
+
this.clicked.emit();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAddFileButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
240
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatAddFileButtonComponent, isStandalone: true, selector: "copilot-chat-add-file-button", inputs: { disabled: "disabled" }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
|
|
241
|
+
<button
|
|
242
|
+
type="button"
|
|
243
|
+
[disabled]="disabled"
|
|
244
|
+
[class]="buttonClass"
|
|
245
|
+
[copilotTooltip]="label"
|
|
246
|
+
tooltipPosition="below"
|
|
247
|
+
(click)="onClick()"
|
|
248
|
+
>
|
|
249
|
+
<lucide-angular [img]="PlusIcon" [size]="20"></lucide-angular>
|
|
250
|
+
</button>
|
|
251
|
+
`, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "directive", type: CopilotTooltipDirective, selector: "[copilotTooltip]", inputs: ["copilotTooltip", "tooltipPosition", "tooltipDelay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
252
|
+
}
|
|
253
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAddFileButtonComponent, decorators: [{
|
|
254
|
+
type: Component,
|
|
255
|
+
args: [{ selector: 'copilot-chat-add-file-button', standalone: true, imports: [CommonModule, LucideAngularModule, CopilotTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
256
|
+
<button
|
|
257
|
+
type="button"
|
|
258
|
+
[disabled]="disabled"
|
|
259
|
+
[class]="buttonClass"
|
|
260
|
+
[copilotTooltip]="label"
|
|
261
|
+
tooltipPosition="below"
|
|
262
|
+
(click)="onClick()"
|
|
263
|
+
>
|
|
264
|
+
<lucide-angular [img]="PlusIcon" [size]="20"></lucide-angular>
|
|
265
|
+
</button>
|
|
266
|
+
` }]
|
|
267
|
+
}], propDecorators: { disabled: [{
|
|
268
|
+
type: Input
|
|
269
|
+
}], clicked: [{
|
|
270
|
+
type: Output
|
|
271
|
+
}] } });
|
|
272
|
+
// Base toolbar button component that other buttons can use
|
|
273
|
+
export class CopilotChatToolbarButtonComponent {
|
|
274
|
+
disabled = signal(false);
|
|
275
|
+
variant = signal('secondary');
|
|
276
|
+
customClass = signal('');
|
|
277
|
+
title = signal('');
|
|
278
|
+
clicked = new EventEmitter();
|
|
279
|
+
computedClass = computed(() => {
|
|
280
|
+
const variantClass = this.variant() === 'primary'
|
|
281
|
+
? chatInputToolbarPrimary
|
|
282
|
+
: chatInputToolbarSecondary;
|
|
283
|
+
return cn(buttonBase, variantClass, this.customClass());
|
|
284
|
+
});
|
|
285
|
+
onClick() {
|
|
286
|
+
if (!this.disabled()) {
|
|
287
|
+
this.clicked.emit();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatToolbarButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
291
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatToolbarButtonComponent, isStandalone: true, selector: "copilot-chat-toolbar-button", outputs: { clicked: "clicked" }, ngImport: i0, template: `
|
|
292
|
+
<button
|
|
293
|
+
type="button"
|
|
294
|
+
[disabled]="disabled()"
|
|
295
|
+
[class]="computedClass()"
|
|
296
|
+
[copilotTooltip]="title()"
|
|
297
|
+
tooltipPosition="below"
|
|
298
|
+
(click)="onClick()"
|
|
299
|
+
>
|
|
300
|
+
<ng-content></ng-content>
|
|
301
|
+
</button>
|
|
302
|
+
`, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: CopilotTooltipDirective, selector: "[copilotTooltip]", inputs: ["copilotTooltip", "tooltipPosition", "tooltipDelay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
303
|
+
}
|
|
304
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatToolbarButtonComponent, decorators: [{
|
|
305
|
+
type: Component,
|
|
306
|
+
args: [{ selector: 'copilot-chat-toolbar-button', standalone: true, imports: [CommonModule, CopilotTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
307
|
+
<button
|
|
308
|
+
type="button"
|
|
309
|
+
[disabled]="disabled()"
|
|
310
|
+
[class]="computedClass()"
|
|
311
|
+
[copilotTooltip]="title()"
|
|
312
|
+
tooltipPosition="below"
|
|
313
|
+
(click)="onClick()"
|
|
314
|
+
>
|
|
315
|
+
<ng-content></ng-content>
|
|
316
|
+
</button>
|
|
317
|
+
` }]
|
|
318
|
+
}], propDecorators: { clicked: [{
|
|
319
|
+
type: Output
|
|
320
|
+
}] } });
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWJ1dHRvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYnV0dG9ucy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLE9BQU8sRUFDUCxHQUFHLEVBQ0gsQ0FBQyxFQUNELEtBQUssRUFDTCxJQUFJLEVBQ0wsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUMzRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQUVyQyx1REFBdUQ7QUFDdkQsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUNuQixnR0FBZ0csRUFDaEcsaUVBQWlFLEVBQ2pFLHVCQUF1QixFQUN2QiwrRUFBK0UsQ0FDaEYsQ0FBQztBQUVGLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUNoQyxnQkFBZ0I7QUFDaEIsc0JBQXNCO0FBQ3RCLHFCQUFxQjtBQUNyQixZQUFZO0FBQ1osZ0VBQWdFO0FBQ2hFLG1CQUFtQjtBQUNuQixzQkFBc0I7QUFDdEIsZUFBZTtBQUNmLG1CQUFtQjtBQUNuQixlQUFlO0FBQ2Ysb0JBQW9CO0FBQ3BCLGVBQWU7QUFDZiw2Q0FBNkM7QUFDN0Msa0JBQWtCO0FBQ2xCLG1GQUFtRixFQUNuRixxREFBcUQsQ0FDdEQsQ0FBQztBQUVGLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUNsQyxnQkFBZ0I7QUFDaEIsc0JBQXNCO0FBQ3RCLCtCQUErQjtBQUMvQixZQUFZO0FBQ1osdUNBQXVDO0FBQ3ZDLG1CQUFtQjtBQUNuQixzQkFBc0I7QUFDdEIsZUFBZTtBQUNmLG1CQUFtQjtBQUNuQixlQUFlO0FBQ2Ysb0JBQW9CO0FBQ3BCLGVBQWU7QUFDZix5Q0FBeUMsRUFDekMsbURBQW1EO0FBQ25ELGtCQUFrQjtBQUNsQixpREFBaUQsRUFDakQsNkRBQTZELEVBQzdELHVFQUF1RSxDQUN4RSxDQUFDO0FBc0JGLE1BQU0sT0FBTyw4QkFBOEI7SUFDaEMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNoQixPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUVwQyxXQUFXLEdBQUcsT0FBTyxDQUFDO0lBQy9CLFdBQVcsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFFdEQsT0FBTztRQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQzt3R0FYVSw4QkFBOEI7NEZBQTlCLDhCQUE4Qix1SkFkL0I7Ozs7Ozs7Ozs7O0dBV1QseUVBZFMsWUFBWSw4QkFBRSxtQkFBbUI7OzRGQWlCaEMsOEJBQThCO2tCQXBCMUMsU0FBUzsrQkFDRSwwQkFBMEIsY0FDeEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLG1CQUMzQix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFlBQzNCOzs7Ozs7Ozs7OztHQVdUOzhCQUlRLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksT0FBTztzQkFBaEIsTUFBTTs7QUFnQ1QsTUFBTSxPQUFPLHlDQUF5QztJQUMzQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRXJDLFVBQVUsR0FBRyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUVwRCxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3ZCLFdBQVcsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRWhFLElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQywwQ0FBMEMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQzt3R0FqQlUseUNBQXlDOzRGQUF6Qyx5Q0FBeUMsbUtBZDFDOzs7Ozs7Ozs7OztHQVdULHlFQWRTLFlBQVksOEJBQUUsbUJBQW1CLGdQQUFFLHVCQUF1Qjs7NEZBaUJ6RCx5Q0FBeUM7a0JBcEJyRCxTQUFTOytCQUNFLHNDQUFzQyxjQUNwQyxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLENBQUMsbUJBQ3BELHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksWUFDM0I7Ozs7Ozs7Ozs7O0dBV1Q7OEJBSVEsUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxPQUFPO3NCQUFoQixNQUFNOztBQXNDVCxNQUFNLE9BQU8sMENBQTBDO0lBQzVDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDaEIsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFFckMsVUFBVSxHQUFHLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBRXBELEtBQUssR0FBRyxDQUFDLENBQUM7SUFDbkIsV0FBVyxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFaEUsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLDJDQUEyQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO3dHQWpCVSwwQ0FBMEM7NEZBQTFDLDBDQUEwQyxvS0FkM0M7Ozs7Ozs7Ozs7O0dBV1QseUVBZFMsWUFBWSw4QkFBRSxtQkFBbUIsZ1BBQUUsdUJBQXVCOzs0RkFpQnpELDBDQUEwQztrQkFwQnRELFNBQVM7K0JBQ0UsdUNBQXVDLGNBQ3JDLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsQ0FBQyxtQkFDcEQsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxZQUMzQjs7Ozs7Ozs7Ozs7R0FXVDs4QkFJUSxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLE9BQU87c0JBQWhCLE1BQU07O0FBc0NULE1BQU0sT0FBTywwQ0FBMEM7SUFDNUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNoQixPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUVyQyxVQUFVLEdBQUcsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFFcEQsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUMzQixXQUFXLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSx5QkFBeUIsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVyRSxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsMkNBQTJDLENBQUM7SUFDOUUsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7d0dBakJVLDBDQUEwQzs0RkFBMUMsMENBQTBDLG9LQWQzQzs7Ozs7Ozs7Ozs7R0FXVCx5RUFkUyxZQUFZLDhCQUFFLG1CQUFtQixnUEFBRSx1QkFBdUI7OzRGQWlCekQsMENBQTBDO2tCQXBCdEQsU0FBUzsrQkFDRSx1Q0FBdUMsY0FDckMsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLHVCQUF1QixDQUFDLG1CQUNwRCx1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFlBQzNCOzs7Ozs7Ozs7OztHQVdUOzhCQUlRLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksT0FBTztzQkFBaEIsTUFBTTs7QUFzQ1QsTUFBTSxPQUFPLGlDQUFpQztJQUNuQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRXJDLFVBQVUsR0FBRyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUVwRCxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLFdBQVcsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRWhFLElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQztJQUNqRSxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQzt3R0FqQlUsaUNBQWlDOzRGQUFqQyxpQ0FBaUMsMkpBZGxDOzs7Ozs7Ozs7OztHQVdULHlFQWRTLFlBQVksOEJBQUUsbUJBQW1CLGdQQUFFLHVCQUF1Qjs7NEZBaUJ6RCxpQ0FBaUM7a0JBcEI3QyxTQUFTOytCQUNFLDhCQUE4QixjQUM1QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLENBQUMsbUJBQ3BELHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksWUFDM0I7Ozs7Ozs7Ozs7O0dBV1Q7OEJBSVEsUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxPQUFPO3NCQUFoQixNQUFNOztBQWtCVCwyREFBMkQ7QUFxQjNELE1BQU0sT0FBTyxpQ0FBaUM7SUFDNUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixPQUFPLEdBQUcsTUFBTSxDQUEwQixXQUFXLENBQUMsQ0FBQztJQUN2RCxXQUFXLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFVCxPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUU3QyxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUM1QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUztZQUMvQyxDQUFDLENBQUMsdUJBQXVCO1lBQ3pCLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQztRQUM5QixPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO3dHQW5CVSxpQ0FBaUM7NEZBQWpDLGlDQUFpQyx3SEFkbEM7Ozs7Ozs7Ozs7O0dBV1QseUVBZFMsWUFBWSwrQkFBRSx1QkFBdUI7OzRGQWlCcEMsaUNBQWlDO2tCQXBCN0MsU0FBUzsrQkFDRSw2QkFBNkIsY0FDM0IsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHVCQUF1QixDQUFDLG1CQUMvQix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFlBQzNCOzs7Ozs7Ozs7OztHQVdUOzhCQVNTLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIGluamVjdCxcbiAgc2lnbmFsLFxuICBjb21wdXRlZCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgXG4gIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsXG4gIEFycm93VXAsXG4gIE1pYyxcbiAgWCxcbiAgQ2hlY2ssXG4gIFBsdXNcbn0gZnJvbSAnbHVjaWRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgQ29waWxvdENoYXRDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvY2hhdC1jb25maWd1cmF0aW9uL2NoYXQtY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENvcGlsb3RUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vbGliL2RpcmVjdGl2ZXMvdG9vbHRpcC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuXG4vLyBCYXNlIGJ1dHRvbiBjbGFzc2VzIG1hdGNoaW5nIFJlYWN0J3MgYnV0dG9uIHZhcmlhbnRzXG5jb25zdCBidXR0b25CYXNlID0gY24oXG4gICdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIgd2hpdGVzcGFjZS1ub3dyYXAgcm91bmRlZC1tZCB0ZXh0LXNtIGZvbnQtbWVkaXVtJyxcbiAgJ3RyYW5zaXRpb24tYWxsIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6b3BhY2l0eS01MCcsXG4gICdzaHJpbmstMCBvdXRsaW5lLW5vbmUnLFxuICAnZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0nXG4pO1xuXG5jb25zdCBjaGF0SW5wdXRUb29sYmFyUHJpbWFyeSA9IGNuKFxuICAnY3Vyc29yLXBvaW50ZXInLFxuICAvLyBCYWNrZ3JvdW5kIGFuZCB0ZXh0XG4gICdiZy1ibGFjayB0ZXh0LXdoaXRlJyxcbiAgLy8gRGFyayBtb2RlXG4gICdkYXJrOmJnLXdoaXRlIGRhcms6dGV4dC1ibGFjayBkYXJrOmZvY3VzLXZpc2libGU6b3V0bGluZS13aGl0ZScsXG4gIC8vIFNoYXBlIGFuZCBzaXppbmdcbiAgJ3JvdW5kZWQtZnVsbCBoLTkgdy05JyxcbiAgLy8gSW50ZXJhY3Rpb25zXG4gICd0cmFuc2l0aW9uLWNvbG9ycycsXG4gIC8vIEZvY3VzIHN0YXRlc1xuICAnZm9jdXM6b3V0bGluZS1ub25lJyxcbiAgLy8gSG92ZXIgc3RhdGVzXG4gICdob3ZlcjpvcGFjaXR5LTcwIGRpc2FibGVkOmhvdmVyOm9wYWNpdHktMTAwJyxcbiAgLy8gRGlzYWJsZWQgc3RhdGVzXG4gICdkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6YmctWyMwMDAwMDAxNF0gZGlzYWJsZWQ6dGV4dC1bcmdiKDEzLDEzLDEzKV0nLFxuICAnZGFyazpkaXNhYmxlZDpiZy1bIzQ1NDU0NV0gZGFyazpkaXNhYmxlZDp0ZXh0LXdoaXRlJ1xuKTtcblxuY29uc3QgY2hhdElucHV0VG9vbGJhclNlY29uZGFyeSA9IGNuKFxuICAnY3Vyc29yLXBvaW50ZXInLFxuICAvLyBCYWNrZ3JvdW5kIGFuZCB0ZXh0XG4gICdiZy10cmFuc3BhcmVudCB0ZXh0LVsjNDQ0NDQ0XScsXG4gIC8vIERhcmsgbW9kZVxuICAnZGFyazp0ZXh0LXdoaXRlIGRhcms6Ym9yZGVyLVsjNDA0MDQwXScsXG4gIC8vIFNoYXBlIGFuZCBzaXppbmdcbiAgJ3JvdW5kZWQtZnVsbCBoLTkgdy05JyxcbiAgLy8gSW50ZXJhY3Rpb25zXG4gICd0cmFuc2l0aW9uLWNvbG9ycycsXG4gIC8vIEZvY3VzIHN0YXRlc1xuICAnZm9jdXM6b3V0bGluZS1ub25lJyxcbiAgLy8gSG92ZXIgc3RhdGVzXG4gICdob3ZlcjpiZy1bI2Y4ZjhmOF0gaG92ZXI6dGV4dC1bIzMzMzMzM10nLFxuICAnZGFyazpob3ZlcjpiZy1bIzQwNDA0MF0gZGFyazpob3Zlcjp0ZXh0LVsjRkZGRkZGXScsXG4gIC8vIERpc2FibGVkIHN0YXRlc1xuICAnZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAnLFxuICAnZGlzYWJsZWQ6aG92ZXI6YmctdHJhbnNwYXJlbnQgZGlzYWJsZWQ6aG92ZXI6dGV4dC1bIzQ0NDQ0NF0nLFxuICAnZGFyazpkaXNhYmxlZDpob3ZlcjpiZy10cmFuc3BhcmVudCBkYXJrOmRpc2FibGVkOmhvdmVyOnRleHQtWyNDQ0NDQ0NdJ1xuKTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29waWxvdC1jaGF0LXNlbmQtYnV0dG9uJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTHVjaWRlQW5ndWxhck1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJtci1bMTBweF1cIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtjbGFzc109XCJidXR0b25DbGFzc1wiXG4gICAgICAgIChjbGljayk9XCJvbkNsaWNrKClcIlxuICAgICAgPlxuICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgW2ltZ109XCJBcnJvd1VwSWNvblwiIFtzaXplXT1cIjE4XCI+PC9sdWNpZGUtYW5ndWxhcj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgYF1cbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdENoYXRTZW5kQnV0dG9uQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQE91dHB1dCgpIGNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIFxuICByZWFkb25seSBBcnJvd1VwSWNvbiA9IEFycm93VXA7XG4gIGJ1dHRvbkNsYXNzID0gY24oYnV0dG9uQmFzZSwgY2hhdElucHV0VG9vbGJhclByaW1hcnkpO1xuICBcbiAgb25DbGljaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY2xpY2tlZC5lbWl0KCk7XG4gICAgfVxuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvcGlsb3QtY2hhdC1zdGFydC10cmFuc2NyaWJlLWJ1dHRvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsIENvcGlsb3RUb29sdGlwRGlyZWN0aXZlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2NsYXNzXT1cImJ1dHRvbkNsYXNzXCJcbiAgICAgIFtjb3BpbG90VG9vbHRpcF09XCJsYWJlbFwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgICA+XG4gICAgICA8bHVjaWRlLWFuZ3VsYXIgW2ltZ109XCJNaWNJY29uXCIgW3NpemVdPVwiMThcIj48L2x1Y2lkZS1hbmd1bGFyPlxuICAgIDwvYnV0dG9uPlxuICBgLFxuICBzdHlsZXM6IFtgYF1cbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdENoYXRTdGFydFRyYW5zY3JpYmVCdXR0b25Db21wb25lbnQge1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBAT3V0cHV0KCkgY2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIHByaXZhdGUgY2hhdENvbmZpZyA9IGluamVjdChDb3BpbG90Q2hhdENvbmZpZ3VyYXRpb25TZXJ2aWNlKTtcbiAgXG4gIHJlYWRvbmx5IE1pY0ljb24gPSBNaWM7XG4gIGJ1dHRvbkNsYXNzID0gY24oYnV0dG9uQmFzZSwgY2hhdElucHV0VG9vbGJhclNlY29uZGFyeSwgJ21yLTInKTtcbiAgXG4gIGdldCBsYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNoYXRDb25maWcubGFiZWxzKCkuY2hhdElucHV0VG9vbGJhclN0YXJ0VHJhbnNjcmliZUJ1dHRvbkxhYmVsO1xuICB9XG4gIFxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5jbGlja2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29waWxvdC1jaGF0LWNhbmNlbC10cmFuc2NyaWJlLWJ1dHRvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsIENvcGlsb3RUb29sdGlwRGlyZWN0aXZlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2NsYXNzXT1cImJ1dHRvbkNsYXNzXCJcbiAgICAgIFtjb3BpbG90VG9vbHRpcF09XCJsYWJlbFwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgICA+XG4gICAgICA8bHVjaWRlLWFuZ3VsYXIgW2ltZ109XCJYSWNvblwiIFtzaXplXT1cIjE4XCI+PC9sdWNpZGUtYW5ndWxhcj5cbiAgICA8L2J1dHRvbj5cbiAgYCxcbiAgc3R5bGVzOiBbYGBdXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0Q2FuY2VsVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgcHJpdmF0ZSBjaGF0Q29uZmlnID0gaW5qZWN0KENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UpO1xuICBcbiAgcmVhZG9ubHkgWEljb24gPSBYO1xuICBidXR0b25DbGFzcyA9IGNuKGJ1dHRvbkJhc2UsIGNoYXRJbnB1dFRvb2xiYXJTZWNvbmRhcnksICdtci0yJyk7XG4gIFxuICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGF0Q29uZmlnLmxhYmVscygpLmNoYXRJbnB1dFRvb2xiYXJDYW5jZWxUcmFuc2NyaWJlQnV0dG9uTGFiZWw7XG4gIH1cbiAgXG4gIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmNsaWNrZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb3BpbG90LWNoYXQtZmluaXNoLXRyYW5zY3JpYmUtYnV0dG9uJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTHVjaWRlQW5ndWxhck1vZHVsZSwgQ29waWxvdFRvb2x0aXBEaXJlY3RpdmVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbY2xhc3NdPVwiYnV0dG9uQ2xhc3NcIlxuICAgICAgW2NvcGlsb3RUb29sdGlwXT1cImxhYmVsXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIChjbGljayk9XCJvbkNsaWNrKClcIlxuICAgID5cbiAgICAgIDxsdWNpZGUtYW5ndWxhciBbaW1nXT1cIkNoZWNrSWNvblwiIFtzaXplXT1cIjE4XCI+PC9sdWNpZGUtYW5ndWxhcj5cbiAgICA8L2J1dHRvbj5cbiAgYCxcbiAgc3R5bGVzOiBbYGBdXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0RmluaXNoVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgcHJpdmF0ZSBjaGF0Q29uZmlnID0gaW5qZWN0KENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UpO1xuICBcbiAgcmVhZG9ubHkgQ2hlY2tJY29uID0gQ2hlY2s7XG4gIGJ1dHRvbkNsYXNzID0gY24oYnV0dG9uQmFzZSwgY2hhdElucHV0VG9vbGJhclNlY29uZGFyeSwgJ21yLVsxMHB4XScpO1xuICBcbiAgZ2V0IGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2hhdENvbmZpZy5sYWJlbHMoKS5jaGF0SW5wdXRUb29sYmFyRmluaXNoVHJhbnNjcmliZUJ1dHRvbkxhYmVsO1xuICB9XG4gIFxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5jbGlja2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29waWxvdC1jaGF0LWFkZC1maWxlLWJ1dHRvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsIENvcGlsb3RUb29sdGlwRGlyZWN0aXZlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2NsYXNzXT1cImJ1dHRvbkNsYXNzXCJcbiAgICAgIFtjb3BpbG90VG9vbHRpcF09XCJsYWJlbFwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgICA+XG4gICAgICA8bHVjaWRlLWFuZ3VsYXIgW2ltZ109XCJQbHVzSWNvblwiIFtzaXplXT1cIjIwXCI+PC9sdWNpZGUtYW5ndWxhcj5cbiAgICA8L2J1dHRvbj5cbiAgYCxcbiAgc3R5bGVzOiBbYGBdXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0QWRkRmlsZUJ1dHRvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgcHJpdmF0ZSBjaGF0Q29uZmlnID0gaW5qZWN0KENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UpO1xuICBcbiAgcmVhZG9ubHkgUGx1c0ljb24gPSBQbHVzO1xuICBidXR0b25DbGFzcyA9IGNuKGJ1dHRvbkJhc2UsIGNoYXRJbnB1dFRvb2xiYXJTZWNvbmRhcnksICdtbC0yJyk7XG4gIFxuICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGF0Q29uZmlnLmxhYmVscygpLmNoYXRJbnB1dFRvb2xiYXJBZGRCdXR0b25MYWJlbDtcbiAgfVxuICBcbiAgb25DbGljaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY2xpY2tlZC5lbWl0KCk7XG4gICAgfVxuICB9XG59XG5cbi8vIEJhc2UgdG9vbGJhciBidXR0b24gY29tcG9uZW50IHRoYXQgb3RoZXIgYnV0dG9ucyBjYW4gdXNlXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb3BpbG90LWNoYXQtdG9vbGJhci1idXR0b24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBDb3BpbG90VG9vbHRpcERpcmVjdGl2ZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgICAgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3MoKVwiXG4gICAgICBbY29waWxvdFRvb2x0aXBdPVwidGl0bGUoKVwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgICA+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9idXR0b24+XG4gIGAsXG4gIHN0eWxlczogW2BgXVxufSlcbmV4cG9ydCBjbGFzcyBDb3BpbG90Q2hhdFRvb2xiYXJCdXR0b25Db21wb25lbnQge1xuICBkaXNhYmxlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHZhcmlhbnQgPSBzaWduYWw8J3ByaW1hcnknIHwgJ3NlY29uZGFyeSc+KCdzZWNvbmRhcnknKTtcbiAgY3VzdG9tQ2xhc3MgPSBzaWduYWwoJycpO1xuICB0aXRsZSA9IHNpZ25hbCgnJyk7XG4gIFxuICBAT3V0cHV0KCkgY2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIGNvbXB1dGVkQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdmFyaWFudENsYXNzID0gdGhpcy52YXJpYW50KCkgPT09ICdwcmltYXJ5JyBcbiAgICAgID8gY2hhdElucHV0VG9vbGJhclByaW1hcnkgXG4gICAgICA6IGNoYXRJbnB1dFRvb2xiYXJTZWNvbmRhcnk7XG4gICAgcmV0dXJuIGNuKGJ1dHRvbkJhc2UsIHZhcmlhbnRDbGFzcywgdGhpcy5jdXN0b21DbGFzcygpKTtcbiAgfSk7XG4gIFxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLmNsaWNrZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { CopilotChatTextareaComponent } from "./copilot-chat-textarea.component";
|
|
2
|
+
import { CopilotChatAudioRecorderComponent } from "./copilot-chat-audio-recorder.component";
|
|
3
|
+
import { CopilotChatSendButtonComponent, CopilotChatStartTranscribeButtonComponent, CopilotChatCancelTranscribeButtonComponent, CopilotChatFinishTranscribeButtonComponent, CopilotChatAddFileButtonComponent, } from "./copilot-chat-buttons.component";
|
|
4
|
+
import { CopilotChatToolbarComponent } from "./copilot-chat-toolbar.component";
|
|
5
|
+
import { CopilotChatToolsMenuComponent } from "./copilot-chat-tools-menu.component";
|
|
6
|
+
/**
|
|
7
|
+
* Default components used by CopilotChatInput.
|
|
8
|
+
* These can be imported and reused when creating custom slot implementations.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { CopilotChatInputDefaults } from '@copilotkitnext/angular';
|
|
13
|
+
*
|
|
14
|
+
* @Component({
|
|
15
|
+
* template: `
|
|
16
|
+
* <copilot-chat-input [sendButtonSlot]="CustomSendButton">
|
|
17
|
+
* </copilot-chat-input>
|
|
18
|
+
* `
|
|
19
|
+
* })
|
|
20
|
+
* export class MyComponent {
|
|
21
|
+
* CustomSendButton = class extends CopilotChatInputDefaults.SendButton {
|
|
22
|
+
* // Custom implementation
|
|
23
|
+
* };
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export class CopilotChatInputDefaults {
|
|
28
|
+
static TextArea = CopilotChatTextareaComponent;
|
|
29
|
+
static AudioRecorder = CopilotChatAudioRecorderComponent;
|
|
30
|
+
static SendButton = CopilotChatSendButtonComponent;
|
|
31
|
+
static StartTranscribeButton = CopilotChatStartTranscribeButtonComponent;
|
|
32
|
+
static CancelTranscribeButton = CopilotChatCancelTranscribeButtonComponent;
|
|
33
|
+
static FinishTranscribeButton = CopilotChatFinishTranscribeButtonComponent;
|
|
34
|
+
static AddFileButton = CopilotChatAddFileButtonComponent;
|
|
35
|
+
static Toolbar = CopilotChatToolbarComponent;
|
|
36
|
+
static ToolsMenu = CopilotChatToolsMenuComponent;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWlucHV0LWRlZmF1bHRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtaW5wdXQtZGVmYXVsdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDNUYsT0FBTyxFQUNMLDhCQUE4QixFQUM5Qix5Q0FBeUMsRUFDekMsMENBQTBDLEVBQzFDLDBDQUEwQyxFQUMxQyxpQ0FBaUMsR0FDbEMsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUVwRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLE9BQU8sd0JBQXdCO0lBQ25DLE1BQU0sQ0FBVSxRQUFRLEdBQUcsNEJBQTRCLENBQUM7SUFDeEQsTUFBTSxDQUFVLGFBQWEsR0FBRyxpQ0FBaUMsQ0FBQztJQUNsRSxNQUFNLENBQVUsVUFBVSxHQUFHLDhCQUE4QixDQUFDO0lBQzVELE1BQU0sQ0FBVSxxQkFBcUIsR0FDbkMseUNBQXlDLENBQUM7SUFDNUMsTUFBTSxDQUFVLHNCQUFzQixHQUNwQywwQ0FBMEMsQ0FBQztJQUM3QyxNQUFNLENBQVUsc0JBQXNCLEdBQ3BDLDBDQUEwQyxDQUFDO0lBQzdDLE1BQU0sQ0FBVSxhQUFhLEdBQUcsaUNBQWlDLENBQUM7SUFDbEUsTUFBTSxDQUFVLE9BQU8sR0FBRywyQkFBMkIsQ0FBQztJQUN0RCxNQUFNLENBQVUsU0FBUyxHQUFHLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29waWxvdENoYXRUZXh0YXJlYUNvbXBvbmVudCB9IGZyb20gXCIuL2NvcGlsb3QtY2hhdC10ZXh0YXJlYS5jb21wb25lbnRcIjtcbmltcG9ydCB7IENvcGlsb3RDaGF0QXVkaW9SZWNvcmRlckNvbXBvbmVudCB9IGZyb20gXCIuL2NvcGlsb3QtY2hhdC1hdWRpby1yZWNvcmRlci5jb21wb25lbnRcIjtcbmltcG9ydCB7XG4gIENvcGlsb3RDaGF0U2VuZEJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRTdGFydFRyYW5zY3JpYmVCdXR0b25Db21wb25lbnQsXG4gIENvcGlsb3RDaGF0Q2FuY2VsVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRGaW5pc2hUcmFuc2NyaWJlQnV0dG9uQ29tcG9uZW50LFxuICBDb3BpbG90Q2hhdEFkZEZpbGVCdXR0b25Db21wb25lbnQsXG59IGZyb20gXCIuL2NvcGlsb3QtY2hhdC1idXR0b25zLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ29waWxvdENoYXRUb29sYmFyQ29tcG9uZW50IH0gZnJvbSBcIi4vY29waWxvdC1jaGF0LXRvb2xiYXIuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdFRvb2xzTWVudUNvbXBvbmVudCB9IGZyb20gXCIuL2NvcGlsb3QtY2hhdC10b29scy1tZW51LmNvbXBvbmVudFwiO1xuXG4vKipcbiAqIERlZmF1bHQgY29tcG9uZW50cyB1c2VkIGJ5IENvcGlsb3RDaGF0SW5wdXQuXG4gKiBUaGVzZSBjYW4gYmUgaW1wb3J0ZWQgYW5kIHJldXNlZCB3aGVuIGNyZWF0aW5nIGN1c3RvbSBzbG90IGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQ29waWxvdENoYXRJbnB1dERlZmF1bHRzIH0gZnJvbSAnQGNvcGlsb3RraXRuZXh0L2FuZ3VsYXInO1xuICpcbiAqIEBDb21wb25lbnQoe1xuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxjb3BpbG90LWNoYXQtaW5wdXQgW3NlbmRCdXR0b25TbG90XT1cIkN1c3RvbVNlbmRCdXR0b25cIj5cbiAqICAgICA8L2NvcGlsb3QtY2hhdC1pbnB1dD5cbiAqICAgYFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIEN1c3RvbVNlbmRCdXR0b24gPSBjbGFzcyBleHRlbmRzIENvcGlsb3RDaGF0SW5wdXREZWZhdWx0cy5TZW5kQnV0dG9uIHtcbiAqICAgICAvLyBDdXN0b20gaW1wbGVtZW50YXRpb25cbiAqICAgfTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ29waWxvdENoYXRJbnB1dERlZmF1bHRzIHtcbiAgc3RhdGljIHJlYWRvbmx5IFRleHRBcmVhID0gQ29waWxvdENoYXRUZXh0YXJlYUNvbXBvbmVudDtcbiAgc3RhdGljIHJlYWRvbmx5IEF1ZGlvUmVjb3JkZXIgPSBDb3BpbG90Q2hhdEF1ZGlvUmVjb3JkZXJDb21wb25lbnQ7XG4gIHN0YXRpYyByZWFkb25seSBTZW5kQnV0dG9uID0gQ29waWxvdENoYXRTZW5kQnV0dG9uQ29tcG9uZW50O1xuICBzdGF0aWMgcmVhZG9ubHkgU3RhcnRUcmFuc2NyaWJlQnV0dG9uID1cbiAgICBDb3BpbG90Q2hhdFN0YXJ0VHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudDtcbiAgc3RhdGljIHJlYWRvbmx5IENhbmNlbFRyYW5zY3JpYmVCdXR0b24gPVxuICAgIENvcGlsb3RDaGF0Q2FuY2VsVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudDtcbiAgc3RhdGljIHJlYWRvbmx5IEZpbmlzaFRyYW5zY3JpYmVCdXR0b24gPVxuICAgIENvcGlsb3RDaGF0RmluaXNoVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudDtcbiAgc3RhdGljIHJlYWRvbmx5IEFkZEZpbGVCdXR0b24gPSBDb3BpbG90Q2hhdEFkZEZpbGVCdXR0b25Db21wb25lbnQ7XG4gIHN0YXRpYyByZWFkb25seSBUb29sYmFyID0gQ29waWxvdENoYXRUb29sYmFyQ29tcG9uZW50O1xuICBzdGF0aWMgcmVhZG9ubHkgVG9vbHNNZW51ID0gQ29waWxvdENoYXRUb29sc01lbnVDb21wb25lbnQ7XG59XG4iXX0=
|