@aleph-alpha/chat-kit 0.9.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CkInput.vue_vue_type_script_setup_true_lang-DmcLXAgB.js → CkInput.vue_vue_type_script_setup_true_lang-DpYyyCgU.js} +481 -79
- package/dist/chat-kit.css +9 -14
- package/dist/components/base/CkAgentMessage/CkAgentMessage.stories.d.ts +20 -0
- package/dist/components/base/CkAgentMessage/CkAgentMessage.stories.d.ts.map +1 -1
- package/dist/components/base/CkAgentMessage/CkAgentMessage.vue.d.ts.map +1 -1
- package/dist/components/base/CkAgentMessage/index.d.ts +1 -0
- package/dist/components/base/CkAgentMessage/index.d.ts.map +1 -1
- package/dist/components/base/CkAgentMessage/types.d.ts +12 -0
- package/dist/components/base/CkAgentMessage/types.d.ts.map +1 -0
- package/dist/components/base/CkConversationLayout/CkConversationLayout.stories.d.ts +13 -0
- package/dist/components/base/CkConversationLayout/CkConversationLayout.stories.d.ts.map +1 -1
- package/dist/components/base/CkConversationLayout/CkConversationLayout.vue.d.ts.map +1 -1
- package/dist/components/base/CkConversationLayout/types.d.ts +9 -2
- package/dist/components/base/CkConversationLayout/types.d.ts.map +1 -1
- package/dist/components/base/CkCopyMessageActionButton/CkCopyMessageActionButton.stories.d.ts +8 -0
- package/dist/components/base/CkCopyMessageActionButton/CkCopyMessageActionButton.stories.d.ts.map +1 -1
- package/dist/components/base/CkCopyMessageActionButton/CkCopyMessageActionButton.vue.d.ts +3 -15
- package/dist/components/base/CkCopyMessageActionButton/CkCopyMessageActionButton.vue.d.ts.map +1 -1
- package/dist/components/base/CkCopyMessageActionButton/index.d.ts +1 -0
- package/dist/components/base/CkCopyMessageActionButton/index.d.ts.map +1 -1
- package/dist/components/base/CkCopyMessageActionButton/types.d.ts +45 -0
- package/dist/components/base/CkCopyMessageActionButton/types.d.ts.map +1 -0
- package/dist/components/base/CkHistoryItem/CkHistoryItem.stories.d.ts +31 -0
- package/dist/components/base/CkHistoryItem/CkHistoryItem.stories.d.ts.map +1 -0
- package/dist/components/base/CkHistoryItem/CkHistoryItem.vue.d.ts +31 -0
- package/dist/components/base/CkHistoryItem/CkHistoryItem.vue.d.ts.map +1 -0
- package/dist/components/base/CkHistoryItem/activeIndicator.d.ts +15 -0
- package/dist/components/base/CkHistoryItem/activeIndicator.d.ts.map +1 -0
- package/dist/components/base/CkHistoryItem/index.d.ts +3 -0
- package/dist/components/base/CkHistoryItem/index.d.ts.map +1 -0
- package/dist/components/base/CkHistoryItem/types.d.ts +96 -0
- package/dist/components/base/CkHistoryItem/types.d.ts.map +1 -0
- package/dist/components/base/CkHistoryWrapper/CkHistoryWrapper.stories.d.ts +16 -0
- package/dist/components/base/CkHistoryWrapper/CkHistoryWrapper.stories.d.ts.map +1 -0
- package/dist/components/base/CkHistoryWrapper/CkHistoryWrapper.vue.d.ts +17 -0
- package/dist/components/base/CkHistoryWrapper/CkHistoryWrapper.vue.d.ts.map +1 -0
- package/dist/components/base/CkHistoryWrapper/index.d.ts +3 -0
- package/dist/components/base/CkHistoryWrapper/index.d.ts.map +1 -0
- package/dist/components/base/CkHistoryWrapper/types.d.ts +17 -0
- package/dist/components/base/CkHistoryWrapper/types.d.ts.map +1 -0
- package/dist/components/base/CkMarkdownRenderer/CkMarkdownRenderer.stories.d.ts +28 -0
- package/dist/components/base/CkMarkdownRenderer/CkMarkdownRenderer.stories.d.ts.map +1 -1
- package/dist/components/base/CkMarkdownRenderer/CkMarkdownRenderer.vue.d.ts.map +1 -1
- package/dist/components/base/CkMarkdownRenderer/index.d.ts +1 -1
- package/dist/components/base/CkMarkdownRenderer/index.d.ts.map +1 -1
- package/dist/components/base/CkMarkdownRenderer/types.d.ts +16 -0
- package/dist/components/base/CkMarkdownRenderer/types.d.ts.map +1 -1
- package/dist/components/base/CkMessageActionButton/CkMessageActionButton.stories.d.ts +4 -0
- package/dist/components/base/CkMessageActionButton/CkMessageActionButton.stories.d.ts.map +1 -1
- package/dist/components/base/CkMessageActionButton/CkMessageActionButton.vue.d.ts +2 -5
- package/dist/components/base/CkMessageActionButton/CkMessageActionButton.vue.d.ts.map +1 -1
- package/dist/components/base/CkMessageActionButton/index.d.ts +1 -0
- package/dist/components/base/CkMessageActionButton/index.d.ts.map +1 -1
- package/dist/components/base/CkMessageActionButton/types.d.ts +22 -0
- package/dist/components/base/CkMessageActionButton/types.d.ts.map +1 -0
- package/dist/components/base/CkPromptActionButton/CkPromptActionButton.stories.d.ts +12 -0
- package/dist/components/base/CkPromptActionButton/CkPromptActionButton.stories.d.ts.map +1 -1
- package/dist/components/base/CkPromptActionButton/CkPromptActionButton.vue.d.ts +2 -7
- package/dist/components/base/CkPromptActionButton/CkPromptActionButton.vue.d.ts.map +1 -1
- package/dist/components/base/CkPromptActionButton/index.d.ts +1 -0
- package/dist/components/base/CkPromptActionButton/index.d.ts.map +1 -1
- package/dist/components/base/CkPromptActionButton/types.d.ts +33 -0
- package/dist/components/base/CkPromptActionButton/types.d.ts.map +1 -0
- package/dist/components/base/CkPromptInput/CkPromptInput.stories.d.ts +17 -0
- package/dist/components/base/CkPromptInput/CkPromptInput.stories.d.ts.map +1 -1
- package/dist/components/base/CkPromptInput/CkPromptInput.vue.d.ts +3 -9
- package/dist/components/base/CkPromptInput/CkPromptInput.vue.d.ts.map +1 -1
- package/dist/components/base/CkPromptInput/index.d.ts +1 -0
- package/dist/components/base/CkPromptInput/index.d.ts.map +1 -1
- package/dist/components/base/CkPromptInput/types.d.ts +39 -0
- package/dist/components/base/CkPromptInput/types.d.ts.map +1 -0
- package/dist/components/base/CkPromptInputDisclaimer/CkPromptInputDisclaimer.stories.d.ts +12 -0
- package/dist/components/base/CkPromptInputDisclaimer/CkPromptInputDisclaimer.stories.d.ts.map +1 -1
- package/dist/components/base/CkPromptInputDisclaimer/CkPromptInputDisclaimer.vue.d.ts +2 -4
- package/dist/components/base/CkPromptInputDisclaimer/CkPromptInputDisclaimer.vue.d.ts.map +1 -1
- package/dist/components/base/CkPromptInputDisclaimer/index.d.ts +1 -0
- package/dist/components/base/CkPromptInputDisclaimer/index.d.ts.map +1 -1
- package/dist/components/base/CkPromptInputDisclaimer/types.d.ts +18 -0
- package/dist/components/base/CkPromptInputDisclaimer/types.d.ts.map +1 -0
- package/dist/components/base/CkPromptStopButton/CkPromptStopButton.stories.d.ts +8 -0
- package/dist/components/base/CkPromptStopButton/CkPromptStopButton.stories.d.ts.map +1 -1
- package/dist/components/base/CkPromptStopButton/CkPromptStopButton.vue.d.ts +3 -6
- package/dist/components/base/CkPromptStopButton/CkPromptStopButton.vue.d.ts.map +1 -1
- package/dist/components/base/CkPromptStopButton/index.d.ts +1 -0
- package/dist/components/base/CkPromptStopButton/index.d.ts.map +1 -1
- package/dist/components/base/CkPromptStopButton/types.d.ts +28 -0
- package/dist/components/base/CkPromptStopButton/types.d.ts.map +1 -0
- package/dist/components/base/CkUserMessage/CkUserMessage.stories.d.ts +15 -0
- package/dist/components/base/CkUserMessage/CkUserMessage.stories.d.ts.map +1 -1
- package/dist/components/base/CkUserMessage/CkUserMessage.vue.d.ts.map +1 -1
- package/dist/components/base/CkUserMessage/types.d.ts +9 -2
- package/dist/components/base/CkUserMessage/types.d.ts.map +1 -1
- package/dist/components/base/icons/CkStopIcon.vue.d.ts.map +1 -1
- package/dist/components/base/index.d.ts +5 -1
- package/dist/components/base/index.d.ts.map +1 -1
- package/dist/components/composed/CkConversation/CkConversation.stories.d.ts +55 -0
- package/dist/components/composed/CkConversation/CkConversation.stories.d.ts.map +1 -1
- package/dist/components/composed/CkConversation/CkConversation.vue.d.ts.map +1 -1
- package/dist/components/composed/CkConversation/types.d.ts +25 -6
- package/dist/components/composed/CkConversation/types.d.ts.map +1 -1
- package/dist/components/composed/CkHistory/CkHistory.stories.d.ts +33 -0
- package/dist/components/composed/CkHistory/CkHistory.stories.d.ts.map +1 -0
- package/dist/components/composed/CkHistory/CkHistory.vue.d.ts +50 -0
- package/dist/components/composed/CkHistory/CkHistory.vue.d.ts.map +1 -0
- package/dist/components/composed/CkHistory/index.d.ts +3 -0
- package/dist/components/composed/CkHistory/index.d.ts.map +1 -0
- package/dist/components/composed/CkHistory/types.d.ts +71 -0
- package/dist/components/composed/CkHistory/types.d.ts.map +1 -0
- package/dist/components/composed/CkInput/CkInput.stories.d.ts +31 -1
- package/dist/components/composed/CkInput/CkInput.stories.d.ts.map +1 -1
- package/dist/components/composed/CkInput/CkInput.vue.d.ts +3 -12
- package/dist/components/composed/CkInput/CkInput.vue.d.ts.map +1 -1
- package/dist/components/composed/CkInput/index.d.ts +1 -0
- package/dist/components/composed/CkInput/index.d.ts.map +1 -1
- package/dist/components/composed/CkInput/types.d.ts +60 -0
- package/dist/components/composed/CkInput/types.d.ts.map +1 -0
- package/dist/components/composed/index.d.ts +2 -0
- package/dist/components/composed/index.d.ts.map +1 -1
- package/dist/components/index.d.ts +4 -4
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +14 -11
- package/dist/composables/index.d.ts +2 -0
- package/dist/composables/index.d.ts.map +1 -1
- package/dist/composables/index.js +3 -3
- package/dist/composables/useConversations.d.ts +72 -0
- package/dist/composables/useConversations.d.ts.map +1 -0
- package/dist/generateId-BHf0W4Rq.js +6 -0
- package/dist/handlers/index.js +2 -2
- package/dist/handlers/useChatKitLabels.d.ts +8 -0
- package/dist/handlers/useChatKitLabels.d.ts.map +1 -1
- package/dist/handlers/useMarkdownParser.d.ts.map +1 -1
- package/dist/helpers/conversationTree.d.ts.map +1 -1
- package/dist/helpers/index.d.ts +2 -0
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/secondsToDate.d.ts +6 -0
- package/dist/helpers/secondsToDate.d.ts.map +1 -0
- package/dist/helpers/toError.d.ts +7 -0
- package/dist/helpers/toError.d.ts.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -16
- package/dist/services/ChatService.d.ts.map +1 -1
- package/dist/services/MockChatService.d.ts.map +1 -1
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +4 -1
- package/dist/services/types.d.ts +53 -0
- package/dist/services/types.d.ts.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/{useChatKitLabels-DNwoZ1x6.js → useChatKitLabels-Dvi2FmjE.js} +8 -2
- package/dist/useConversations-Ca242D2P.js +195 -0
- package/dist/{useMessageHandler-D7OdrrcB.js → useMessageHandler-uLHNac39.js} +1 -3
- package/package.json +5 -4
- package/src/components/base/CkAgentMessage/CkAgentMessage.spec.ts +91 -0
- package/src/components/base/CkAgentMessage/CkAgentMessage.stories.ts +215 -0
- package/src/components/base/CkAgentMessage/CkAgentMessage.vue +25 -0
- package/src/components/base/CkAgentMessage/index.ts +2 -0
- package/src/components/base/CkAgentMessage/types.ts +11 -0
- package/src/components/base/CkConversationLayout/CkConversationLayout.spec.ts +129 -0
- package/src/components/base/CkConversationLayout/CkConversationLayout.stories.ts +251 -0
- package/src/components/base/CkConversationLayout/CkConversationLayout.vue +206 -0
- package/src/components/base/CkConversationLayout/index.ts +2 -0
- package/src/components/base/CkConversationLayout/types.ts +18 -0
- package/src/components/base/CkCopyMessageActionButton/CkCopyMessageActionButton.spec.ts +89 -0
- package/src/components/base/CkCopyMessageActionButton/CkCopyMessageActionButton.stories.ts +70 -0
- package/src/components/base/CkCopyMessageActionButton/CkCopyMessageActionButton.vue +110 -0
- package/src/components/base/CkCopyMessageActionButton/index.ts +2 -0
- package/src/components/base/CkCopyMessageActionButton/types.ts +43 -0
- package/src/components/base/CkHistoryItem/CkHistoryItem.spec.ts +42 -0
- package/src/components/base/CkHistoryItem/CkHistoryItem.stories.ts +230 -0
- package/src/components/base/CkHistoryItem/CkHistoryItem.vue +285 -0
- package/src/components/base/CkHistoryItem/activeIndicator.ts +15 -0
- package/src/components/base/CkHistoryItem/index.ts +2 -0
- package/src/components/base/CkHistoryItem/types.ts +111 -0
- package/src/components/base/CkHistoryWrapper/CkHistoryWrapper.spec.ts +26 -0
- package/src/components/base/CkHistoryWrapper/CkHistoryWrapper.stories.ts +149 -0
- package/src/components/base/CkHistoryWrapper/CkHistoryWrapper.vue +36 -0
- package/src/components/base/CkHistoryWrapper/index.ts +2 -0
- package/src/components/base/CkHistoryWrapper/types.ts +16 -0
- package/src/components/base/CkMarkdownRenderer/CkMarkdownRenderer.spec.ts +348 -0
- package/src/components/base/CkMarkdownRenderer/CkMarkdownRenderer.stories.ts +382 -0
- package/src/components/base/CkMarkdownRenderer/CkMarkdownRenderer.vue +89 -0
- package/src/components/base/CkMarkdownRenderer/defaultMarkdownClasses.ts +19 -0
- package/src/components/base/CkMarkdownRenderer/index.ts +5 -0
- package/src/components/base/CkMarkdownRenderer/types.ts +53 -0
- package/src/components/base/CkMessageActionButton/CkMessageActionButton.spec.ts +40 -0
- package/src/components/base/CkMessageActionButton/CkMessageActionButton.stories.ts +56 -0
- package/src/components/base/CkMessageActionButton/CkMessageActionButton.vue +23 -0
- package/src/components/base/CkMessageActionButton/index.ts +2 -0
- package/src/components/base/CkMessageActionButton/types.ts +21 -0
- package/src/components/base/CkPromptActionButton/CkPromptActionButton.spec.ts +52 -0
- package/src/components/base/CkPromptActionButton/CkPromptActionButton.stories.ts +126 -0
- package/src/components/base/CkPromptActionButton/CkPromptActionButton.vue +25 -0
- package/src/components/base/CkPromptActionButton/index.ts +2 -0
- package/src/components/base/CkPromptActionButton/types.ts +32 -0
- package/src/components/base/CkPromptInput/CkPromptInput.spec.ts +181 -0
- package/src/components/base/CkPromptInput/CkPromptInput.stories.ts +224 -0
- package/src/components/base/CkPromptInput/CkPromptInput.vue +104 -0
- package/src/components/base/CkPromptInput/index.ts +2 -0
- package/src/components/base/CkPromptInput/types.ts +39 -0
- package/src/components/base/CkPromptInputDisclaimer/CkPromptInputDisclaimer.spec.ts +40 -0
- package/src/components/base/CkPromptInputDisclaimer/CkPromptInputDisclaimer.stories.ts +103 -0
- package/src/components/base/CkPromptInputDisclaimer/CkPromptInputDisclaimer.vue +16 -0
- package/src/components/base/CkPromptInputDisclaimer/index.ts +2 -0
- package/src/components/base/CkPromptInputDisclaimer/types.ts +17 -0
- package/src/components/base/CkPromptStopButton/CkPromptStopButton.spec.ts +64 -0
- package/src/components/base/CkPromptStopButton/CkPromptStopButton.stories.ts +81 -0
- package/src/components/base/CkPromptStopButton/CkPromptStopButton.vue +27 -0
- package/src/components/base/CkPromptStopButton/index.ts +2 -0
- package/src/components/base/CkPromptStopButton/types.ts +28 -0
- package/src/components/base/CkUserMessage/CkUserMessage.spec.ts +20 -0
- package/src/components/base/CkUserMessage/CkUserMessage.stories.ts +112 -0
- package/src/components/base/CkUserMessage/CkUserMessage.vue +19 -0
- package/src/components/base/CkUserMessage/index.ts +2 -0
- package/src/components/base/CkUserMessage/types.ts +14 -0
- package/src/components/base/icons/CkSendIcon.vue +22 -0
- package/src/components/base/icons/CkStopIcon.vue +18 -0
- package/src/components/base/icons/index.ts +2 -0
- package/src/components/base/index.ts +21 -0
- package/src/components/composed/CkConversation/CkConversation.spec.ts +439 -0
- package/src/components/composed/CkConversation/CkConversation.stories.ts +642 -0
- package/src/components/composed/CkConversation/CkConversation.vue +146 -0
- package/src/components/composed/CkConversation/index.ts +2 -0
- package/src/components/composed/CkConversation/types.ts +37 -0
- package/src/components/composed/CkHistory/CkHistory.spec.ts +327 -0
- package/src/components/composed/CkHistory/CkHistory.stories.ts +373 -0
- package/src/components/composed/CkHistory/CkHistory.vue +126 -0
- package/src/components/composed/CkHistory/index.ts +2 -0
- package/src/components/composed/CkHistory/types.ts +72 -0
- package/src/components/composed/CkInput/CkInput.spec.ts +191 -0
- package/src/components/composed/CkInput/CkInput.stories.ts +438 -0
- package/src/components/composed/CkInput/CkInput.vue +104 -0
- package/src/components/composed/CkInput/index.ts +2 -0
- package/src/components/composed/CkInput/types.ts +60 -0
- package/src/components/composed/index.ts +5 -0
- package/src/components/index.ts +34 -0
- package/src/composables/index.ts +9 -0
- package/src/composables/types.ts +36 -0
- package/src/composables/useChat.ts +18 -0
- package/src/composables/useConversations.spec.ts +557 -0
- package/src/composables/useConversations.ts +321 -0
- package/src/handlers/index.ts +9 -0
- package/src/handlers/useChatKitLabels.spec.ts +290 -0
- package/src/handlers/useChatKitLabels.ts +96 -0
- package/src/handlers/useMarkdownParser.spec.ts +112 -0
- package/src/handlers/useMarkdownParser.ts +47 -0
- package/src/handlers/useMessageHandler.spec.ts +535 -0
- package/src/handlers/useMessageHandler.ts +138 -0
- package/src/helpers/conversationTree.spec.ts +423 -0
- package/src/helpers/conversationTree.ts +117 -0
- package/src/helpers/generateId.ts +5 -0
- package/src/helpers/index.ts +4 -0
- package/src/helpers/secondsToDate.ts +7 -0
- package/src/helpers/toError.ts +8 -0
- package/src/index.ts +79 -0
- package/src/services/ChatService.ts +60 -0
- package/src/services/MockChatService.ts +47 -0
- package/src/services/index.ts +12 -0
- package/src/services/types.ts +92 -0
- package/src/test-setup.ts +12 -0
- package/src/test-utils/createTextPlugin.ts +9 -0
- package/src/types.ts +47 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { CkMessageActionButton } from '../CkMessageActionButton';
|
|
3
|
+
import type { CkCopyMessageActionButtonProps } from './types';
|
|
4
|
+
import { UiIcon, UiTooltip } from '@aleph-alpha/ui-library';
|
|
5
|
+
import { onUnmounted, ref } from 'vue';
|
|
6
|
+
|
|
7
|
+
defineOptions({
|
|
8
|
+
name: 'CkCopyMessageActionButton',
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const props = withDefaults(defineProps<CkCopyMessageActionButtonProps>(), {
|
|
12
|
+
disabled: false,
|
|
13
|
+
durationMs: 3000,
|
|
14
|
+
ariaLabelCopy: 'Copy message',
|
|
15
|
+
ariaLabelCopied: 'Copied',
|
|
16
|
+
writeToClipboard: undefined,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const emit = defineEmits<{
|
|
20
|
+
copy: [payload: { success: boolean }];
|
|
21
|
+
}>();
|
|
22
|
+
|
|
23
|
+
const copied = ref(false);
|
|
24
|
+
const tooltipOpen = ref(false);
|
|
25
|
+
let resetTimer: ReturnType<typeof setTimeout> | undefined;
|
|
26
|
+
|
|
27
|
+
onUnmounted(() => {
|
|
28
|
+
if (resetTimer !== undefined) {
|
|
29
|
+
clearTimeout(resetTimer);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
async function handleClick() {
|
|
34
|
+
if (props.disabled) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The underlying tooltip auto-dismisses on pointerdown of the trigger.
|
|
39
|
+
// Force it open synchronously so the "copied" state is visible on click.
|
|
40
|
+
tooltipOpen.value = true;
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
const write =
|
|
44
|
+
props.writeToClipboard ??
|
|
45
|
+
((t: string) => globalThis.navigator.clipboard.writeText(t));
|
|
46
|
+
await write(props.text);
|
|
47
|
+
copied.value = true;
|
|
48
|
+
tooltipOpen.value = true;
|
|
49
|
+
emit('copy', { success: true });
|
|
50
|
+
if (resetTimer !== undefined) {
|
|
51
|
+
clearTimeout(resetTimer);
|
|
52
|
+
}
|
|
53
|
+
resetTimer = setTimeout(() => {
|
|
54
|
+
copied.value = false;
|
|
55
|
+
resetTimer = undefined;
|
|
56
|
+
}, props.durationMs);
|
|
57
|
+
} catch {
|
|
58
|
+
emit('copy', { success: false });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<template>
|
|
64
|
+
<UiTooltip
|
|
65
|
+
v-model:open="tooltipOpen"
|
|
66
|
+
:content="copied ? ariaLabelCopied : ariaLabelCopy"
|
|
67
|
+
side="bottom"
|
|
68
|
+
align="center"
|
|
69
|
+
:delay-duration="0"
|
|
70
|
+
>
|
|
71
|
+
<CkMessageActionButton
|
|
72
|
+
v-bind="{ ariaLabel: copied ? ariaLabelCopied : ariaLabelCopy }"
|
|
73
|
+
:disabled="disabled"
|
|
74
|
+
@click="handleClick"
|
|
75
|
+
>
|
|
76
|
+
<Transition name="copy-message-icon-fade" mode="out-in">
|
|
77
|
+
<UiIcon
|
|
78
|
+
v-if="!copied"
|
|
79
|
+
key="copy"
|
|
80
|
+
name="copy"
|
|
81
|
+
:size="16"
|
|
82
|
+
aria-hidden="true"
|
|
83
|
+
/>
|
|
84
|
+
<UiIcon v-else key="check" name="check" :size="16" aria-hidden="true" />
|
|
85
|
+
</Transition>
|
|
86
|
+
</CkMessageActionButton>
|
|
87
|
+
<span class="sr-only" aria-live="polite">
|
|
88
|
+
{{ copied ? ariaLabelCopied : ariaLabelCopy }}
|
|
89
|
+
</span>
|
|
90
|
+
</UiTooltip>
|
|
91
|
+
</template>
|
|
92
|
+
|
|
93
|
+
<style scoped>
|
|
94
|
+
.copy-message-icon-fade-enter-active,
|
|
95
|
+
.copy-message-icon-fade-leave-active {
|
|
96
|
+
transition: opacity 0.15s ease-out;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.copy-message-icon-fade-enter-from,
|
|
100
|
+
.copy-message-icon-fade-leave-to {
|
|
101
|
+
opacity: 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@media (prefers-reduced-motion: reduce) {
|
|
105
|
+
.copy-message-icon-fade-enter-active,
|
|
106
|
+
.copy-message-icon-fade-leave-active {
|
|
107
|
+
transition-duration: 0.01ms;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
</style>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy-to-clipboard action button for chat messages. Shows a check icon and
|
|
3
|
+
* announces success for assistive technologies, then reverts after a delay.
|
|
4
|
+
*
|
|
5
|
+
* @category Actions
|
|
6
|
+
* @useCases copy assistant reply, copy message to clipboard, chat message action, feedback action on message footer
|
|
7
|
+
* @keywords copy, clipboard, action, message, button, icon, feedback
|
|
8
|
+
* @related CkMessageActionButton, CkAgentMessage, CkConversation
|
|
9
|
+
*/
|
|
10
|
+
export interface CkCopyMessageActionButtonProps {
|
|
11
|
+
/** Plain text to copy to the clipboard. */
|
|
12
|
+
text: string;
|
|
13
|
+
/**
|
|
14
|
+
* Whether the button is disabled.
|
|
15
|
+
* @default false
|
|
16
|
+
*/
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* How long to show the success state (checkmark) before reverting, in ms.
|
|
20
|
+
* @default 3000
|
|
21
|
+
*/
|
|
22
|
+
durationMs?: number;
|
|
23
|
+
/**
|
|
24
|
+
* `aria-label` used while the button is in its idle (copy) state.
|
|
25
|
+
* @default 'Copy message'
|
|
26
|
+
*/
|
|
27
|
+
ariaLabelCopy?: string;
|
|
28
|
+
/**
|
|
29
|
+
* `aria-label` used after the text has been copied.
|
|
30
|
+
* @default 'Copied'
|
|
31
|
+
*/
|
|
32
|
+
ariaLabelCopied?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Optional clipboard writer for testing or custom implementations.
|
|
35
|
+
* When omitted, uses `navigator.clipboard.writeText`.
|
|
36
|
+
*/
|
|
37
|
+
writeToClipboard?: (text: string) => Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface CkCopyMessageActionButtonEmits {
|
|
41
|
+
/** Emitted after the clipboard operation finishes (success or failure). */
|
|
42
|
+
(e: 'copy', payload: { success: boolean }): void;
|
|
43
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/vue';
|
|
2
|
+
import userEvent from '@testing-library/user-event';
|
|
3
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import CkHistoryItem from './CkHistoryItem.vue';
|
|
5
|
+
|
|
6
|
+
describe('CkHistoryItem', () => {
|
|
7
|
+
it('renders the title and meta', () => {
|
|
8
|
+
render(CkHistoryItem, {
|
|
9
|
+
props: {
|
|
10
|
+
title: 'Thread A',
|
|
11
|
+
metaStart: 'Mon',
|
|
12
|
+
metaEnd: 'Berlin',
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
expect(screen.getByText('Thread A')).toBeInTheDocument();
|
|
17
|
+
expect(screen.getByText('Mon')).toBeInTheDocument();
|
|
18
|
+
expect(screen.getByText('Berlin')).toBeInTheDocument();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('emits action-click when the action button is clicked', async () => {
|
|
22
|
+
const user = userEvent.setup();
|
|
23
|
+
const onAction = vi.fn();
|
|
24
|
+
|
|
25
|
+
const { emitted } = render(CkHistoryItem, {
|
|
26
|
+
props: {
|
|
27
|
+
title: 'Thread A',
|
|
28
|
+
metaStart: 'Mon',
|
|
29
|
+
showActionOnHover: false,
|
|
30
|
+
actionAriaLabel: 'More',
|
|
31
|
+
},
|
|
32
|
+
attrs: {
|
|
33
|
+
onActionClick: onAction,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
await user.click(screen.getByRole('button', { name: 'More' }));
|
|
38
|
+
|
|
39
|
+
expect(onAction).toHaveBeenCalledTimes(1);
|
|
40
|
+
expect(emitted('action-click')).toBeTruthy();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/vue3-vite';
|
|
2
|
+
import { ref } from 'vue';
|
|
3
|
+
import CkHistoryItem from './CkHistoryItem.vue';
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof CkHistoryItem> = {
|
|
6
|
+
title: 'Base/CkHistoryItem',
|
|
7
|
+
component: CkHistoryItem,
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: 'padded',
|
|
11
|
+
docs: {
|
|
12
|
+
description: {
|
|
13
|
+
component:
|
|
14
|
+
'Single chat history entry: title, optional meta line, row focus ring, and trailing action (button or popover). Emits **`action-click`** when the action is a plain button; use **`actionPopover`** with `#action-popover` slot for menu content. Sidebar-agnostic.',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
args: {
|
|
19
|
+
title: 'Project Proposal Overview',
|
|
20
|
+
metaStart: 'Today',
|
|
21
|
+
metaEnd: 'Innsbruck',
|
|
22
|
+
actionTooltip: 'More actions',
|
|
23
|
+
},
|
|
24
|
+
argTypes: {
|
|
25
|
+
isActive: {
|
|
26
|
+
control: 'boolean',
|
|
27
|
+
description: 'Applies the active row treatment (rail + background).',
|
|
28
|
+
},
|
|
29
|
+
showActionOnHover: {
|
|
30
|
+
control: 'boolean',
|
|
31
|
+
description: 'Fade in the action until row hover/focus-within.',
|
|
32
|
+
},
|
|
33
|
+
actionPopover: {
|
|
34
|
+
control: 'boolean',
|
|
35
|
+
description:
|
|
36
|
+
'Render the action as a popover trigger; supply body via `#action-popover` slot.',
|
|
37
|
+
},
|
|
38
|
+
actionIcon: {
|
|
39
|
+
control: false,
|
|
40
|
+
description: 'Custom icon component (assign in code).',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export default meta;
|
|
46
|
+
|
|
47
|
+
type Story = StoryObj<typeof CkHistoryItem>;
|
|
48
|
+
|
|
49
|
+
const defaultTemplateSource = `<script setup lang="ts">
|
|
50
|
+
import { CkHistoryItem } from '@aleph-alpha/chat-kit';
|
|
51
|
+
|
|
52
|
+
function handleActionClick() {
|
|
53
|
+
// open row menu, etc.
|
|
54
|
+
}
|
|
55
|
+
</script>
|
|
56
|
+
|
|
57
|
+
<template>
|
|
58
|
+
<CkHistoryItem
|
|
59
|
+
title="Project Proposal Overview"
|
|
60
|
+
meta-start="Today"
|
|
61
|
+
meta-end="Innsbruck"
|
|
62
|
+
action-tooltip="More actions"
|
|
63
|
+
@action-click="handleActionClick"
|
|
64
|
+
/>
|
|
65
|
+
</template>`;
|
|
66
|
+
|
|
67
|
+
const activeTemplateSource = `<script setup lang="ts">
|
|
68
|
+
import { CkHistoryItem } from '@aleph-alpha/chat-kit';
|
|
69
|
+
</script>
|
|
70
|
+
|
|
71
|
+
<template>
|
|
72
|
+
<CkHistoryItem
|
|
73
|
+
title="Project Proposal Overview"
|
|
74
|
+
meta-start="Today"
|
|
75
|
+
meta-end="Innsbruck"
|
|
76
|
+
action-tooltip="More actions"
|
|
77
|
+
is-active
|
|
78
|
+
/>
|
|
79
|
+
</template>`;
|
|
80
|
+
|
|
81
|
+
const alwaysShowActionTemplateSource = `<script setup lang="ts">
|
|
82
|
+
import { CkHistoryItem } from '@aleph-alpha/chat-kit';
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<template>
|
|
86
|
+
<CkHistoryItem
|
|
87
|
+
title="Project Proposal Overview"
|
|
88
|
+
meta-start="Today"
|
|
89
|
+
meta-end="Innsbruck"
|
|
90
|
+
action-tooltip="More actions"
|
|
91
|
+
:show-action-on-hover="false"
|
|
92
|
+
/>
|
|
93
|
+
</template>`;
|
|
94
|
+
|
|
95
|
+
const noMetaTemplateSource = `<script setup lang="ts">
|
|
96
|
+
import { CkHistoryItem } from '@aleph-alpha/chat-kit';
|
|
97
|
+
</script>
|
|
98
|
+
|
|
99
|
+
<template>
|
|
100
|
+
<CkHistoryItem title="Project Proposal Overview" action-tooltip="More actions" />
|
|
101
|
+
</template>`;
|
|
102
|
+
|
|
103
|
+
const withActionPopoverTemplateSource = `<script setup lang="ts">
|
|
104
|
+
import { CkHistoryItem } from '@aleph-alpha/chat-kit';
|
|
105
|
+
</script>
|
|
106
|
+
|
|
107
|
+
<template>
|
|
108
|
+
<CkHistoryItem
|
|
109
|
+
title="Project Proposal Overview"
|
|
110
|
+
meta-start="Today"
|
|
111
|
+
meta-end="Innsbruck"
|
|
112
|
+
action-popover
|
|
113
|
+
action-aria-label="Chat options"
|
|
114
|
+
>
|
|
115
|
+
<template #action-popover>
|
|
116
|
+
<div class="flex flex-col gap-0.5 p-1">
|
|
117
|
+
<button type="button">Rename</button>
|
|
118
|
+
<button type="button">Delete</button>
|
|
119
|
+
</div>
|
|
120
|
+
</template>
|
|
121
|
+
</CkHistoryItem>
|
|
122
|
+
</template>`;
|
|
123
|
+
|
|
124
|
+
const renderStory = (args: Story['args']) => ({
|
|
125
|
+
components: { CkHistoryItem },
|
|
126
|
+
setup() {
|
|
127
|
+
const actionCount = ref(0);
|
|
128
|
+
|
|
129
|
+
function handleActionClick() {
|
|
130
|
+
actionCount.value += 1;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return { actionCount, args, handleActionClick };
|
|
134
|
+
},
|
|
135
|
+
template: `
|
|
136
|
+
<div class="bg-background-surface-primary p-4 w-[22rem]">
|
|
137
|
+
<CkHistoryItem v-bind="args" @action-click="handleActionClick" />
|
|
138
|
+
<p class="label-12-regular mt-3 text-content-on-surface-muted">
|
|
139
|
+
Action clicks: {{ actionCount }}
|
|
140
|
+
</p>
|
|
141
|
+
</div>
|
|
142
|
+
`,
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Default row with title, two-segment meta line, and a kebab action that
|
|
147
|
+
* appears on hover. Use for one-off rows outside of `CkHistory`.
|
|
148
|
+
*/
|
|
149
|
+
export const Default: Story = {
|
|
150
|
+
render: renderStory,
|
|
151
|
+
parameters: { docs: { source: { code: defaultTemplateSource } } },
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Active treatment — shows the left rail and highlighted background. Use
|
|
156
|
+
* when the row represents the conversation currently displayed.
|
|
157
|
+
*/
|
|
158
|
+
export const Active: Story = {
|
|
159
|
+
args: {
|
|
160
|
+
isActive: true,
|
|
161
|
+
},
|
|
162
|
+
render: renderStory,
|
|
163
|
+
parameters: { docs: { source: { code: activeTemplateSource } } },
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Forces the trailing action to stay visible (`show-action-on-hover="false"`).
|
|
168
|
+
* Use on touch devices or when hover isn't available.
|
|
169
|
+
*/
|
|
170
|
+
export const AlwaysShowAction: Story = {
|
|
171
|
+
args: {
|
|
172
|
+
showActionOnHover: false,
|
|
173
|
+
},
|
|
174
|
+
render: renderStory,
|
|
175
|
+
parameters: { docs: { source: { code: alwaysShowActionTemplateSource } } },
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Row without any meta text. Use for compact lists where only the title
|
|
180
|
+
* matters.
|
|
181
|
+
*/
|
|
182
|
+
export const NoMeta: Story = {
|
|
183
|
+
args: {
|
|
184
|
+
metaStart: '',
|
|
185
|
+
metaEnd: '',
|
|
186
|
+
},
|
|
187
|
+
render: renderStory,
|
|
188
|
+
parameters: { docs: { source: { code: noMetaTemplateSource } } },
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Renders the trailing action as a popover trigger. Pass menu items via the
|
|
193
|
+
* `#action-popover` slot; the component handles opening and focus.
|
|
194
|
+
*/
|
|
195
|
+
export const WithActionPopover: Story = {
|
|
196
|
+
args: {
|
|
197
|
+
actionPopover: true,
|
|
198
|
+
actionTooltip: '',
|
|
199
|
+
actionAriaLabel: 'Chat options',
|
|
200
|
+
},
|
|
201
|
+
render: (args) => ({
|
|
202
|
+
components: { CkHistoryItem },
|
|
203
|
+
setup() {
|
|
204
|
+
return { args };
|
|
205
|
+
},
|
|
206
|
+
template: `
|
|
207
|
+
<div class="bg-background-surface-primary p-4 w-[22rem]">
|
|
208
|
+
<CkHistoryItem v-bind="args">
|
|
209
|
+
<template #action-popover>
|
|
210
|
+
<div class="flex flex-col gap-0.5 p-1">
|
|
211
|
+
<button
|
|
212
|
+
type="button"
|
|
213
|
+
class="flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left body-14-regular text-content-on-surface-primary hover-layer hover-layer-default"
|
|
214
|
+
>
|
|
215
|
+
Rename
|
|
216
|
+
</button>
|
|
217
|
+
<button
|
|
218
|
+
type="button"
|
|
219
|
+
class="flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left body-14-regular text-content-on-surface-primary hover-layer hover-layer-default"
|
|
220
|
+
>
|
|
221
|
+
Delete
|
|
222
|
+
</button>
|
|
223
|
+
</div>
|
|
224
|
+
</template>
|
|
225
|
+
</CkHistoryItem>
|
|
226
|
+
</div>
|
|
227
|
+
`,
|
|
228
|
+
}),
|
|
229
|
+
parameters: { docs: { source: { code: withActionPopoverTemplateSource } } },
|
|
230
|
+
};
|