@8wave/ai-elements 0.77.0 → 0.78.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/_chunks/{PkStreamingMarkdown-COZApJzT.js → PkStreamingMarkdown-gIAvEY1t.js} +370 -301
- package/dist/_chunks/PkStreamingMarkdown-gIAvEY1t.js.map +1 -0
- package/dist/_chunks/{PkToolShowArtifact-BZQixk9z.js → PkToolShowArtifact-BwW4Yn6k.js} +2 -2
- package/dist/_chunks/{PkToolShowArtifact-BZQixk9z.js.map → PkToolShowArtifact-BwW4Yn6k.js.map} +1 -1
- package/dist/_chunks/{PkToolShowContactForm-thS7c8iL.js → PkToolShowContactForm-DTE-iF_c.js} +2 -2
- package/dist/_chunks/{PkToolShowContactForm-thS7c8iL.js.map → PkToolShowContactForm-DTE-iF_c.js.map} +1 -1
- package/dist/_chunks/PkToolShowImageGallery-CGL-HL6v.js +60 -0
- package/dist/_chunks/PkToolShowImageGallery-CGL-HL6v.js.map +1 -0
- package/dist/_chunks/{PkToolShowProductList-DEo7XogW.js → PkToolShowProductList-C8YIh0Dw.js} +2 -2
- package/dist/_chunks/{PkToolShowProductList-DEo7XogW.js.map → PkToolShowProductList-C8YIh0Dw.js.map} +1 -1
- package/dist/_chunks/{PkToolShowSources-BMXftK6O.js → PkToolShowSources-TSjtd1ps.js} +3 -3
- package/dist/_chunks/{PkToolShowSources-BMXftK6O.js.map → PkToolShowSources-TSjtd1ps.js.map} +1 -1
- package/dist/_chunks/{PkToolShowSuggestedReply-CPAnHI0c.js → PkToolShowSuggestedReply-c9sLv4n4.js} +2 -2
- package/dist/_chunks/{PkToolShowSuggestedReply-CPAnHI0c.js.map → PkToolShowSuggestedReply-c9sLv4n4.js.map} +1 -1
- package/dist/_chunks/{PkToolShowWeather-DcSUbzx0.js → PkToolShowWeather-ChJ5lB4K.js} +48 -48
- package/dist/_chunks/PkToolShowWeather-ChJ5lB4K.js.map +1 -0
- package/dist/_chunks/{PkToolShowWebPages-aH_GarEV.js → PkToolShowWebPages-CL2mYxh-.js} +2 -2
- package/dist/_chunks/{PkToolShowWebPages-aH_GarEV.js.map → PkToolShowWebPages-CL2mYxh-.js.map} +1 -1
- package/dist/_chunks/{PkUrl-BHD0_pal.js → PkUrl-CvztUywv.js} +2 -2
- package/dist/_chunks/{PkUrl-BHD0_pal.js.map → PkUrl-CvztUywv.js.map} +1 -1
- package/dist/_chunks/{useLightbox-DL_oVBep.js → useLightbox-Ddvue042.js} +5 -3
- package/{dist-vue/_chunks/useLightbox-1sB7fmFb.js.map → dist/_chunks/useLightbox-Ddvue042.js.map} +1 -1
- package/dist/ai-elements.es.js +3097 -3010
- package/dist/ai-elements.es.js.map +1 -1
- package/dist-vue/PkChatbot.js +1 -1
- package/dist-vue/PkChatbotFilePreview.js +1 -1
- package/dist-vue/PkChatbotInput.js +1 -1
- package/dist-vue/PkChatbotMessages.js +1 -1
- package/dist-vue/PkChatbotViewChat.js +1 -1
- package/dist-vue/_chunks/{PkChatbot-B9RSkQmJ.js → PkChatbot-BEJTYq-D.js} +4 -4
- package/dist-vue/_chunks/{PkChatbot-B9RSkQmJ.js.map → PkChatbot-BEJTYq-D.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotFilePreview-DHzuGtz5.js → PkChatbotFilePreview-hRNtv2OJ.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotFilePreview-DHzuGtz5.js.map → PkChatbotFilePreview-hRNtv2OJ.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotInput-C5QSmt21.js → PkChatbotInput-BbGLBVim.js} +124 -116
- package/dist-vue/_chunks/PkChatbotInput-BbGLBVim.js.map +1 -0
- package/dist-vue/_chunks/PkChatbotMessages-j3ALQmGG.js +467 -0
- package/dist-vue/_chunks/PkChatbotMessages-j3ALQmGG.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbotViewChat-C2FuDayB.js → PkChatbotViewChat-Z05fqNFE.js} +5 -5
- package/dist-vue/_chunks/{PkChatbotViewChat-C2FuDayB.js.map → PkChatbotViewChat-Z05fqNFE.js.map} +1 -1
- package/dist-vue/_chunks/{PkStreamingMarkdown-BAhC3uGK.js → PkStreamingMarkdown-BBTAwHd_.js} +311 -252
- package/dist-vue/_chunks/PkStreamingMarkdown-BBTAwHd_.js.map +1 -0
- package/dist-vue/_chunks/{PkToolShowArtifact-RzrDPcEQ.js → PkToolShowArtifact-CbqpjzCA.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowArtifact-RzrDPcEQ.js.map → PkToolShowArtifact-CbqpjzCA.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowContactForm-5H4jfq1F.js → PkToolShowContactForm-BkgfSyw7.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowContactForm-5H4jfq1F.js.map → PkToolShowContactForm-BkgfSyw7.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowImageGallery-B7Bt6ZGv.js → PkToolShowImageGallery-Ckyxa0mx.js} +18 -21
- package/dist-vue/_chunks/PkToolShowImageGallery-Ckyxa0mx.js.map +1 -0
- package/dist-vue/_chunks/{PkToolShowSources-Dv0uuvqS.js → PkToolShowSources-7Xt3iK2Z.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowSources-Dv0uuvqS.js.map → PkToolShowSources-7Xt3iK2Z.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowWeather-Coq6H0iv.js → PkToolShowWeather-B5Wp8WAt.js} +26 -26
- package/dist-vue/_chunks/PkToolShowWeather-B5Wp8WAt.js.map +1 -0
- package/dist-vue/_chunks/{useLightbox-1sB7fmFb.js → useLightbox-Cl8REkfc.js} +5 -3
- package/{dist/_chunks/useLightbox-DL_oVBep.js.map → dist-vue/_chunks/useLightbox-Cl8REkfc.js.map} +1 -1
- package/dist-vue/index.js +11 -11
- package/dist-vue/packages/components/src/chat/PkChatbotMessages.d.ts +4 -5
- package/dist-vue/packages/components/src/chat/PkStreamingMarkdown.d.ts +9 -1
- package/dist-vue/packages/components/src/chat/useChatScroll.d.ts +15 -0
- package/dist-vue/style.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/PkStreamingMarkdown-COZApJzT.js.map +0 -1
- package/dist/_chunks/PkToolShowImageGallery-DmJztS-Z.js +0 -63
- package/dist/_chunks/PkToolShowImageGallery-DmJztS-Z.js.map +0 -1
- package/dist/_chunks/PkToolShowWeather-DcSUbzx0.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotInput-C5QSmt21.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotMessages-DOeUT6YL.js +0 -388
- package/dist-vue/_chunks/PkChatbotMessages-DOeUT6YL.js.map +0 -1
- package/dist-vue/_chunks/PkStreamingMarkdown-BAhC3uGK.js.map +0 -1
- package/dist-vue/_chunks/PkToolShowImageGallery-B7Bt6ZGv.js.map +0 -1
- package/dist-vue/_chunks/PkToolShowWeather-Coq6H0iv.js.map +0 -1
- /package/dist/_chunks/{_plugin-vue_export-helper-BI3pHb34.js → _plugin-vue_export-helper-C6kC663S.js} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PkChatbotInput-C5QSmt21.js","names":["$t","$slots","$n"],"sources":["../../../../node_modules/.pnpm/autosize@6.0.1/node_modules/autosize/dist/autosize.esm.js","../../../../packages/components/src/chat/PkChatbotInput.vue","../../../../packages/components/src/chat/PkChatbotInput.vue"],"sourcesContent":["var e=new Map;function t(t){var o=e.get(t);o&&o.destroy()}function o(t){var o=e.get(t);o&&o.update()}var r=null;\"undefined\"==typeof window?((r=function(e){return e}).destroy=function(e){return e},r.update=function(e){return e}):((r=function(t,o){return t&&Array.prototype.forEach.call(t.length?t:[t],function(t){return function(t){if(t&&t.nodeName&&\"TEXTAREA\"===t.nodeName&&!e.has(t)){var o,r=null,n=window.getComputedStyle(t),i=(o=t.value,function(){a({testForHeightReduction:\"\"===o||!t.value.startsWith(o),restoreTextAlign:null}),o=t.value}),l=function(o){t.removeEventListener(\"autosize:destroy\",l),t.removeEventListener(\"autosize:update\",s),t.removeEventListener(\"input\",i),window.removeEventListener(\"resize\",s),Object.keys(o).forEach(function(e){return t.style[e]=o[e]}),e.delete(t)}.bind(t,{height:t.style.height,resize:t.style.resize,textAlign:t.style.textAlign,overflowY:t.style.overflowY,overflowX:t.style.overflowX,wordWrap:t.style.wordWrap});t.addEventListener(\"autosize:destroy\",l),t.addEventListener(\"autosize:update\",s),t.addEventListener(\"input\",i),window.addEventListener(\"resize\",s),t.style.overflowX=\"hidden\",t.style.wordWrap=\"break-word\",e.set(t,{destroy:l,update:s}),s()}function a(e){var o,i,l=e.restoreTextAlign,s=void 0===l?null:l,d=e.testForHeightReduction,u=void 0===d||d,c=n.overflowY;if(0!==t.scrollHeight&&(\"vertical\"===n.resize?t.style.resize=\"none\":\"both\"===n.resize&&(t.style.resize=\"horizontal\"),u&&(o=function(e){for(var t=[];e&&e.parentNode&&e.parentNode instanceof Element;)e.parentNode.scrollTop&&t.push([e.parentNode,e.parentNode.scrollTop]),e=e.parentNode;return function(){return t.forEach(function(e){var t=e[0],o=e[1];t.style.scrollBehavior=\"auto\",t.scrollTop=o,t.style.scrollBehavior=null})}}(t),t.style.height=\"\"),i=\"content-box\"===n.boxSizing?t.scrollHeight-(parseFloat(n.paddingTop)+parseFloat(n.paddingBottom)):t.scrollHeight+parseFloat(n.borderTopWidth)+parseFloat(n.borderBottomWidth),\"none\"!==n.maxHeight&&i>parseFloat(n.maxHeight)?(\"hidden\"===n.overflowY&&(t.style.overflow=\"scroll\"),i=parseFloat(n.maxHeight)):\"hidden\"!==n.overflowY&&(t.style.overflow=\"hidden\"),t.style.height=i+\"px\",s&&(t.style.textAlign=s),o&&o(),r!==i&&(t.dispatchEvent(new Event(\"autosize:resized\",{bubbles:!0})),r=i),c!==n.overflow&&!s)){var v=n.textAlign;\"hidden\"===n.overflow&&(t.style.textAlign=\"start\"===v?\"end\":\"start\"),a({restoreTextAlign:v,testForHeightReduction:!0})}}function s(){a({testForHeightReduction:!0,restoreTextAlign:null})}}(t)}),t}).destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],t),e},r.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],o),e});var n=r;export default n;\n","<script setup lang=\"ts\">\n // @ts-expect-error - no types for autosize\n import autosize from 'autosize'\n import {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n useTemplateRef,\n } from 'vue'\n import { useDropZone } from '@vueuse/core'\n import type { AgentFileUpload } from 'models'\n import type { PendingAttachment } from 'composables'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n import PkChatbotFilePreview from './PkChatbotFilePreview.vue'\n\n const modelValue = defineModel<string>()\n const pendingAttachments = defineModel<PendingAttachment[]>(\n 'pendingAttachments',\n { default: () => [] },\n )\n\n const emit = defineEmits<{\n submit: []\n 'stop-generation': []\n 'file-select': [file: File]\n }>()\n\n const props = defineProps<{\n placeholder?: string\n dismissableNotice?: string\n status?: 'submitted' | 'streaming' | 'ready' | 'error'\n maxMessageLength?: number\n fileUpload?: AgentFileUpload\n enableDragDrop?: boolean\n }>()\n\n const isDismissableNoticeVisible = ref<boolean>(true)\n const closeDismissableNotice = () => {\n isDismissableNoticeVisible.value = false\n }\n\n const textareaEl = useTemplateRef<HTMLTextAreaElement>('textareaEl')\n const fileInputEl = useTemplateRef<HTMLInputElement>('fileInputEl')\n const cameraInputEl = useTemplateRef<HTMLInputElement>('cameraInputEl')\n const formEl = useTemplateRef<HTMLFormElement>('formEl')\n\n const hasCaptureSupport = 'capture' in document.createElement('input')\n\n onMounted(() => {\n try {\n if (textareaEl.value) {\n autosize(textareaEl.value)\n }\n } catch {\n // autosize initialization failed, textarea remains functional\n }\n })\n\n onBeforeUnmount(() => {\n try {\n if (textareaEl.value) {\n autosize.destroy(textareaEl.value)\n }\n } catch {\n // ignore cleanup errors\n }\n for (const att of pendingAttachments.value) {\n URL.revokeObjectURL(att.localUrl)\n }\n })\n\n const isStreaming = computed(() => {\n return props.status === 'streaming'\n })\n const isSubmitted = computed(() => {\n return props.status === 'submitted'\n })\n\n const currentLength = computed(() => modelValue.value?.length ?? 0)\n\n const isOverLimit = computed(() => {\n return (\n props.maxMessageLength !== undefined &&\n currentLength.value > props.maxMessageLength\n )\n })\n\n const isUploadingAnyFile = computed(() =>\n pendingAttachments.value.some((a) => a.state === 'uploading'),\n )\n\n const acceptMimeTypes = computed(\n () => props.fileUpload?.allowedMimeTypes?.join(',') ?? '',\n )\n\n const acceptImageMimeTypes = computed(() =>\n (props.fileUpload?.allowedMimeTypes ?? [])\n .filter((m) => m.startsWith('image/'))\n .join(','),\n )\n\n const showCameraOption = computed(\n () => hasCaptureSupport && acceptImageMimeTypes.value.length > 0,\n )\n\n const isSubmitEnabled = computed(() => {\n if (isStreaming.value || isSubmitted.value) {\n return false\n }\n if (isUploadingAnyFile.value) {\n return false\n }\n if (isOverLimit.value) {\n return false\n }\n return (modelValue.value?.trim().length ?? 0) > 0\n })\n\n const autosizeTextarea = () => {\n if (textareaEl.value) {\n autosize.update(textareaEl.value)\n }\n }\n\n const handleSubmit = () => {\n if (isSubmitEnabled.value) {\n emit('submit')\n nextTick(() => {\n autosizeTextarea()\n textareaEl.value?.blur()\n })\n }\n }\n\n const openFilePicker = () => {\n fileInputEl.value?.click()\n }\n\n const openCameraPicker = () => {\n cameraInputEl.value?.click()\n }\n\n const onFileChange = (event: Event) => {\n const input = event.target as HTMLInputElement\n const file = input.files?.[0]\n if (file) {\n emit('file-select', file)\n }\n // Reset so the same file can be selected again\n input.value = ''\n }\n\n const removeAttachment = (id: string) => {\n const att = pendingAttachments.value.find((a) => a.id === id)\n if (att) {\n URL.revokeObjectURL(att.localUrl)\n }\n pendingAttachments.value = pendingAttachments.value.filter(\n (a) => a.id !== id,\n )\n }\n\n const isDragDropEnabled = computed(\n () => (props.enableDragDrop ?? true) && !!props.fileUpload?.enabled,\n )\n\n const handleDrop = (files: File[] | null) => {\n if (!isDragDropEnabled.value || !files) {\n return\n }\n for (const file of files) {\n emit('file-select', file)\n }\n }\n\n const { isOverDropZone } = useDropZone(formEl, {\n dataTypes: computed(() => props.fileUpload?.allowedMimeTypes ?? []),\n onDrop: handleDrop,\n })\n</script>\n\n<template>\n <div class=\"pk-chatbot-input\">\n <div\n v-if=\"dismissableNotice && isDismissableNoticeVisible\"\n class=\"pk-chatbot-input-dismissable-notice\">\n <PkStreamingMarkdown\n :markdown=\"dismissableNotice\"\n class=\"wysiwyg\" />\n <VvButton\n v-if=\"dismissableNotice\"\n :title=\"$t('action.close')\"\n modifiers=\"action-quiet\"\n icon=\"ri:close-line\"\n class=\"w-18 h-18\"\n @click=\"closeDismissableNotice\" />\n </div>\n <form\n ref=\"formEl\"\n class=\"pk-chatbot-input__form\"\n @submit.prevent=\"handleSubmit\">\n <div\n v-if=\"isOverDropZone && isDragDropEnabled\"\n class=\"pk-chatbot-input__drop-overlay\">\n <VvIcon\n name=\"ri:upload-cloud-2-line\"\n class=\"pk-chatbot-input__drop-overlay-icon\" />\n <span>{{ $t('action.dropFile') }}</span>\n </div>\n <div\n v-if=\"pendingAttachments.length\"\n class=\"pk-chatbot-input__attachments\">\n <PkChatbotFilePreview\n v-for=\"att in pendingAttachments\"\n :key=\"att.id\"\n :media-type=\"att.file.type\"\n :url=\"att.localUrl\"\n :filename=\"att.file.name\"\n :loading=\"att.state === 'uploading'\"\n :error=\"att.state === 'error' ? att.error : undefined\"\n :removable=\"att.state !== 'uploading'\"\n @remove=\"removeAttachment(att.id)\" />\n </div>\n <div class=\"pk-chatbot-input__fieldset\">\n <VvDropdown\n v-if=\"\n fileUpload &&\n fileUpload.enabled &&\n (showCameraOption || $slots['additional-actions'])\n \"\n v-bind=\"{\n placement: 'top-start',\n modifiers: 'menu',\n flip: true,\n offset: 3,\n }\">\n <template #default=\"{ init, toggle, aria }\">\n <button\n :ref=\"(e: any) => init(e)\"\n v-bind=\"aria\"\n class=\"pk-chatbot-input__button\"\n type=\"button\"\n :title=\"$t('action.attachFile')\"\n :disabled=\"isStreaming || isSubmitted\"\n @click=\"toggle\">\n <VvIcon\n name=\"ri:add-line\"\n class=\"pk-chatbot-input__button-icon\" />\n </button>\n </template>\n <template #items>\n <VvDropdownAction\n v-if=\"showCameraOption\"\n :disabled=\"isStreaming || isSubmitted\"\n @click=\"openCameraPicker\">\n <VvIcon\n name=\"ri:camera-line\"\n class=\"pk-chatbot-input__dropdown-icon\" />\n {{ $t('action.takePhoto') }}\n </VvDropdownAction>\n <VvDropdownAction\n :disabled=\"isStreaming || isSubmitted\"\n @click=\"openFilePicker\">\n <VvIcon\n name=\"ri:attachment-line\"\n class=\"pk-chatbot-input__dropdown-icon\" />\n {{ $t('action.attachFile') }}\n </VvDropdownAction>\n <slot name=\"additional-actions\" />\n </template>\n </VvDropdown>\n <button\n v-else-if=\"fileUpload && fileUpload.enabled\"\n class=\"pk-chatbot-input__button\"\n type=\"button\"\n :title=\"$t('action.attachFile')\"\n :disabled=\"isStreaming || isSubmitted\"\n @click=\"openFilePicker\">\n <VvIcon\n name=\"ri:add-line\"\n class=\"pk-chatbot-input__button-icon\" />\n </button>\n <input\n v-if=\"fileUpload && fileUpload.enabled\"\n ref=\"fileInputEl\"\n type=\"file\"\n hidden\n :accept=\"acceptMimeTypes\"\n @change=\"onFileChange\" />\n <input\n v-if=\"fileUpload && fileUpload.enabled && showCameraOption\"\n ref=\"cameraInputEl\"\n type=\"file\"\n capture=\"environment\"\n hidden\n :accept=\"acceptImageMimeTypes\"\n @change=\"onFileChange\" />\n <div class=\"pk-chatbot-input__content\">\n <textarea\n ref=\"textareaEl\"\n v-model=\"modelValue\"\n class=\"pk-chatbot-input__textarea\"\n name=\"message\"\n rows=\"1\"\n :placeholder\n @focus=\"autosizeTextarea\"\n @blur=\"autosizeTextarea\"\n @paste=\"nextTick(autosizeTextarea)\"\n @keydown.enter.prevent=\"handleSubmit\"></textarea>\n </div>\n <div\n v-if=\"maxMessageLength\"\n class=\"pk-chatbot-input__counter\"\n :class=\"{ 'pk-chatbot-input__counter--over': isOverLimit }\">\n {{ $n(currentLength, 'integer') }}/<span\n class=\"opacity-60\"\n >{{ $n(maxMessageLength, 'integer') }}</span\n >\n </div>\n <button\n v-if=\"isStreaming\"\n class=\"pk-chatbot-input__button\"\n type=\"button\"\n :title=\"$t('action.stop')\"\n @click=\"emit('stop-generation')\">\n <VvIcon\n name=\"ri:stop-circle-line\"\n class=\"pk-chatbot-input__button-icon\" />\n </button>\n <button\n v-else\n class=\"pk-chatbot-input__button\"\n type=\"submit\"\n :title=\"\n isSubmitEnabled\n ? $t('action.submit')\n : $t('label.disabled')\n \"\n :disabled=\"!isSubmitEnabled\">\n <VvIcon\n :name=\"\n isSubmitted\n ? 'line-md:loading-loop'\n : isSubmitEnabled\n ? 'ri:send-ins-fill'\n : 'ri:send-ins-line'\n \"\n class=\"pk-chatbot-input__button-icon\" />\n </button>\n </div>\n </form>\n </div>\n</template>\n\n<style lang=\"scss\">\n .pk-chatbot-input {\n position: relative;\n display: flex;\n flex-direction: column;\n margin-inline: var(--spacing-sm);\n margin-bottom: var(--spacing-sm);\n\n &-dismissable-notice {\n position: relative;\n padding: var(--spacing-sm);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--spacing-sm);\n background-color: var(--color-surface-1);\n border-top-left-radius: var(--rounded-xl);\n border-top-right-radius: var(--rounded-xl);\n transition-property: var(--transition-property-all);\n transition-duration: var(--duration-300);\n transition-timing-function: var(--ease-in-out);\n font-size: var(--text-14);\n color: var(--color-word-2);\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n bottom: calc(-1 * var(--spacing-12));\n height: var(--spacing-12);\n background: var(--color-surface-1);\n z-index: 1;\n }\n }\n\n &__form {\n position: relative;\n display: flex;\n z-index: 1;\n flex-direction: column;\n border-radius: var(--rounded-xl);\n border: 1px solid var(--color-surface-3);\n background-color: var(--color-surface);\n padding: var(--spacing-14);\n box-shadow: var(--shadow-lg);\n font-size: var(\n --text-16\n ); // prevent ios zoom on input focus by using a font size >= 16px\n gap: var(--spacing-xs);\n transition: border-color var(--duration-200) var(--ease-in-out);\n\n @include media-breakpoint-up('sm', $breakpoints) {\n font-size: var(--text-14);\n padding: var(--spacing-10);\n }\n\n &:has(:focus-within) {\n border-color: var(--color-word-5);\n }\n }\n\n &__drop-overlay {\n position: absolute;\n inset: 0;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-xs);\n border-radius: var(--rounded-xl);\n background-color: color-mix(\n in srgb,\n var(--color-surface) 85%,\n transparent\n );\n pointer-events: none;\n }\n\n &__fieldset {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n flex: 1;\n }\n\n &__content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-4);\n min-width: 0;\n overflow: hidden;\n }\n\n &__textarea {\n display: block;\n border: none;\n outline: none;\n resize: none;\n width: 100%;\n color: var(--color-word-1);\n background-color: var(--color-surface);\n overflow: hidden;\n\n &::placeholder {\n color: var(--color-word-4);\n }\n }\n\n &__attachments {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-4);\n padding-bottom: var(--spacing-xs);\n border-bottom: 1px solid var(--color-surface-2);\n }\n\n &__button {\n background-color: transparent;\n border: none;\n cursor: pointer;\n color: var(--color-word-1);\n padding: var(--spacing-4);\n flex-shrink: 0;\n transition: var(--transition-colors);\n border-radius: var(--rounded);\n\n &:hover {\n background-color: var(--color-surface-2);\n }\n\n &:focus-visible {\n outline: 1px solid var(--color-surface-5);\n outline-offset: 0;\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n &-icon {\n display: block;\n width: var(--spacing-20);\n height: var(--spacing-20);\n }\n }\n\n &__counter {\n background-color: var(--color-surface-1);\n border: 1px solid var(--color-surface-3);\n border-radius: var(--rounded-md);\n font-size: var(--text-12);\n color: var(--color-word-3);\n line-height: 1;\n padding-inline: var(--spacing-6);\n padding-block: var(--spacing-4);\n z-index: 1;\n font-variant-numeric: tabular-nums;\n font-family: var(--font-mono);\n font-weight: var(--font-bold);\n\n &--over {\n color: var(--color-danger);\n border-color: var(--color-danger-lighten-5);\n font-weight: var(--font-bold);\n }\n }\n }\n</style>\n","<script setup lang=\"ts\">\n // @ts-expect-error - no types for autosize\n import autosize from 'autosize'\n import {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n useTemplateRef,\n } from 'vue'\n import { useDropZone } from '@vueuse/core'\n import type { AgentFileUpload } from 'models'\n import type { PendingAttachment } from 'composables'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n import PkChatbotFilePreview from './PkChatbotFilePreview.vue'\n\n const modelValue = defineModel<string>()\n const pendingAttachments = defineModel<PendingAttachment[]>(\n 'pendingAttachments',\n { default: () => [] },\n )\n\n const emit = defineEmits<{\n submit: []\n 'stop-generation': []\n 'file-select': [file: File]\n }>()\n\n const props = defineProps<{\n placeholder?: string\n dismissableNotice?: string\n status?: 'submitted' | 'streaming' | 'ready' | 'error'\n maxMessageLength?: number\n fileUpload?: AgentFileUpload\n enableDragDrop?: boolean\n }>()\n\n const isDismissableNoticeVisible = ref<boolean>(true)\n const closeDismissableNotice = () => {\n isDismissableNoticeVisible.value = false\n }\n\n const textareaEl = useTemplateRef<HTMLTextAreaElement>('textareaEl')\n const fileInputEl = useTemplateRef<HTMLInputElement>('fileInputEl')\n const cameraInputEl = useTemplateRef<HTMLInputElement>('cameraInputEl')\n const formEl = useTemplateRef<HTMLFormElement>('formEl')\n\n const hasCaptureSupport = 'capture' in document.createElement('input')\n\n onMounted(() => {\n try {\n if (textareaEl.value) {\n autosize(textareaEl.value)\n }\n } catch {\n // autosize initialization failed, textarea remains functional\n }\n })\n\n onBeforeUnmount(() => {\n try {\n if (textareaEl.value) {\n autosize.destroy(textareaEl.value)\n }\n } catch {\n // ignore cleanup errors\n }\n for (const att of pendingAttachments.value) {\n URL.revokeObjectURL(att.localUrl)\n }\n })\n\n const isStreaming = computed(() => {\n return props.status === 'streaming'\n })\n const isSubmitted = computed(() => {\n return props.status === 'submitted'\n })\n\n const currentLength = computed(() => modelValue.value?.length ?? 0)\n\n const isOverLimit = computed(() => {\n return (\n props.maxMessageLength !== undefined &&\n currentLength.value > props.maxMessageLength\n )\n })\n\n const isUploadingAnyFile = computed(() =>\n pendingAttachments.value.some((a) => a.state === 'uploading'),\n )\n\n const acceptMimeTypes = computed(\n () => props.fileUpload?.allowedMimeTypes?.join(',') ?? '',\n )\n\n const acceptImageMimeTypes = computed(() =>\n (props.fileUpload?.allowedMimeTypes ?? [])\n .filter((m) => m.startsWith('image/'))\n .join(','),\n )\n\n const showCameraOption = computed(\n () => hasCaptureSupport && acceptImageMimeTypes.value.length > 0,\n )\n\n const isSubmitEnabled = computed(() => {\n if (isStreaming.value || isSubmitted.value) {\n return false\n }\n if (isUploadingAnyFile.value) {\n return false\n }\n if (isOverLimit.value) {\n return false\n }\n return (modelValue.value?.trim().length ?? 0) > 0\n })\n\n const autosizeTextarea = () => {\n if (textareaEl.value) {\n autosize.update(textareaEl.value)\n }\n }\n\n const handleSubmit = () => {\n if (isSubmitEnabled.value) {\n emit('submit')\n nextTick(() => {\n autosizeTextarea()\n textareaEl.value?.blur()\n })\n }\n }\n\n const openFilePicker = () => {\n fileInputEl.value?.click()\n }\n\n const openCameraPicker = () => {\n cameraInputEl.value?.click()\n }\n\n const onFileChange = (event: Event) => {\n const input = event.target as HTMLInputElement\n const file = input.files?.[0]\n if (file) {\n emit('file-select', file)\n }\n // Reset so the same file can be selected again\n input.value = ''\n }\n\n const removeAttachment = (id: string) => {\n const att = pendingAttachments.value.find((a) => a.id === id)\n if (att) {\n URL.revokeObjectURL(att.localUrl)\n }\n pendingAttachments.value = pendingAttachments.value.filter(\n (a) => a.id !== id,\n )\n }\n\n const isDragDropEnabled = computed(\n () => (props.enableDragDrop ?? true) && !!props.fileUpload?.enabled,\n )\n\n const handleDrop = (files: File[] | null) => {\n if (!isDragDropEnabled.value || !files) {\n return\n }\n for (const file of files) {\n emit('file-select', file)\n }\n }\n\n const { isOverDropZone } = useDropZone(formEl, {\n dataTypes: computed(() => props.fileUpload?.allowedMimeTypes ?? []),\n onDrop: handleDrop,\n })\n</script>\n\n<template>\n <div class=\"pk-chatbot-input\">\n <div\n v-if=\"dismissableNotice && isDismissableNoticeVisible\"\n class=\"pk-chatbot-input-dismissable-notice\">\n <PkStreamingMarkdown\n :markdown=\"dismissableNotice\"\n class=\"wysiwyg\" />\n <VvButton\n v-if=\"dismissableNotice\"\n :title=\"$t('action.close')\"\n modifiers=\"action-quiet\"\n icon=\"ri:close-line\"\n class=\"w-18 h-18\"\n @click=\"closeDismissableNotice\" />\n </div>\n <form\n ref=\"formEl\"\n class=\"pk-chatbot-input__form\"\n @submit.prevent=\"handleSubmit\">\n <div\n v-if=\"isOverDropZone && isDragDropEnabled\"\n class=\"pk-chatbot-input__drop-overlay\">\n <VvIcon\n name=\"ri:upload-cloud-2-line\"\n class=\"pk-chatbot-input__drop-overlay-icon\" />\n <span>{{ $t('action.dropFile') }}</span>\n </div>\n <div\n v-if=\"pendingAttachments.length\"\n class=\"pk-chatbot-input__attachments\">\n <PkChatbotFilePreview\n v-for=\"att in pendingAttachments\"\n :key=\"att.id\"\n :media-type=\"att.file.type\"\n :url=\"att.localUrl\"\n :filename=\"att.file.name\"\n :loading=\"att.state === 'uploading'\"\n :error=\"att.state === 'error' ? att.error : undefined\"\n :removable=\"att.state !== 'uploading'\"\n @remove=\"removeAttachment(att.id)\" />\n </div>\n <div class=\"pk-chatbot-input__fieldset\">\n <VvDropdown\n v-if=\"\n fileUpload &&\n fileUpload.enabled &&\n (showCameraOption || $slots['additional-actions'])\n \"\n v-bind=\"{\n placement: 'top-start',\n modifiers: 'menu',\n flip: true,\n offset: 3,\n }\">\n <template #default=\"{ init, toggle, aria }\">\n <button\n :ref=\"(e: any) => init(e)\"\n v-bind=\"aria\"\n class=\"pk-chatbot-input__button\"\n type=\"button\"\n :title=\"$t('action.attachFile')\"\n :disabled=\"isStreaming || isSubmitted\"\n @click=\"toggle\">\n <VvIcon\n name=\"ri:add-line\"\n class=\"pk-chatbot-input__button-icon\" />\n </button>\n </template>\n <template #items>\n <VvDropdownAction\n v-if=\"showCameraOption\"\n :disabled=\"isStreaming || isSubmitted\"\n @click=\"openCameraPicker\">\n <VvIcon\n name=\"ri:camera-line\"\n class=\"pk-chatbot-input__dropdown-icon\" />\n {{ $t('action.takePhoto') }}\n </VvDropdownAction>\n <VvDropdownAction\n :disabled=\"isStreaming || isSubmitted\"\n @click=\"openFilePicker\">\n <VvIcon\n name=\"ri:attachment-line\"\n class=\"pk-chatbot-input__dropdown-icon\" />\n {{ $t('action.attachFile') }}\n </VvDropdownAction>\n <slot name=\"additional-actions\" />\n </template>\n </VvDropdown>\n <button\n v-else-if=\"fileUpload && fileUpload.enabled\"\n class=\"pk-chatbot-input__button\"\n type=\"button\"\n :title=\"$t('action.attachFile')\"\n :disabled=\"isStreaming || isSubmitted\"\n @click=\"openFilePicker\">\n <VvIcon\n name=\"ri:add-line\"\n class=\"pk-chatbot-input__button-icon\" />\n </button>\n <input\n v-if=\"fileUpload && fileUpload.enabled\"\n ref=\"fileInputEl\"\n type=\"file\"\n hidden\n :accept=\"acceptMimeTypes\"\n @change=\"onFileChange\" />\n <input\n v-if=\"fileUpload && fileUpload.enabled && showCameraOption\"\n ref=\"cameraInputEl\"\n type=\"file\"\n capture=\"environment\"\n hidden\n :accept=\"acceptImageMimeTypes\"\n @change=\"onFileChange\" />\n <div class=\"pk-chatbot-input__content\">\n <textarea\n ref=\"textareaEl\"\n v-model=\"modelValue\"\n class=\"pk-chatbot-input__textarea\"\n name=\"message\"\n rows=\"1\"\n :placeholder\n @focus=\"autosizeTextarea\"\n @blur=\"autosizeTextarea\"\n @paste=\"nextTick(autosizeTextarea)\"\n @keydown.enter.prevent=\"handleSubmit\"></textarea>\n </div>\n <div\n v-if=\"maxMessageLength\"\n class=\"pk-chatbot-input__counter\"\n :class=\"{ 'pk-chatbot-input__counter--over': isOverLimit }\">\n {{ $n(currentLength, 'integer') }}/<span\n class=\"opacity-60\"\n >{{ $n(maxMessageLength, 'integer') }}</span\n >\n </div>\n <button\n v-if=\"isStreaming\"\n class=\"pk-chatbot-input__button\"\n type=\"button\"\n :title=\"$t('action.stop')\"\n @click=\"emit('stop-generation')\">\n <VvIcon\n name=\"ri:stop-circle-line\"\n class=\"pk-chatbot-input__button-icon\" />\n </button>\n <button\n v-else\n class=\"pk-chatbot-input__button\"\n type=\"submit\"\n :title=\"\n isSubmitEnabled\n ? $t('action.submit')\n : $t('label.disabled')\n \"\n :disabled=\"!isSubmitEnabled\">\n <VvIcon\n :name=\"\n isSubmitted\n ? 'line-md:loading-loop'\n : isSubmitEnabled\n ? 'ri:send-ins-fill'\n : 'ri:send-ins-line'\n \"\n class=\"pk-chatbot-input__button-icon\" />\n </button>\n </div>\n </form>\n </div>\n</template>\n\n<style lang=\"scss\">\n .pk-chatbot-input {\n position: relative;\n display: flex;\n flex-direction: column;\n margin-inline: var(--spacing-sm);\n margin-bottom: var(--spacing-sm);\n\n &-dismissable-notice {\n position: relative;\n padding: var(--spacing-sm);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--spacing-sm);\n background-color: var(--color-surface-1);\n border-top-left-radius: var(--rounded-xl);\n border-top-right-radius: var(--rounded-xl);\n transition-property: var(--transition-property-all);\n transition-duration: var(--duration-300);\n transition-timing-function: var(--ease-in-out);\n font-size: var(--text-14);\n color: var(--color-word-2);\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n bottom: calc(-1 * var(--spacing-12));\n height: var(--spacing-12);\n background: var(--color-surface-1);\n z-index: 1;\n }\n }\n\n &__form {\n position: relative;\n display: flex;\n z-index: 1;\n flex-direction: column;\n border-radius: var(--rounded-xl);\n border: 1px solid var(--color-surface-3);\n background-color: var(--color-surface);\n padding: var(--spacing-14);\n box-shadow: var(--shadow-lg);\n font-size: var(\n --text-16\n ); // prevent ios zoom on input focus by using a font size >= 16px\n gap: var(--spacing-xs);\n transition: border-color var(--duration-200) var(--ease-in-out);\n\n @include media-breakpoint-up('sm', $breakpoints) {\n font-size: var(--text-14);\n padding: var(--spacing-10);\n }\n\n &:has(:focus-within) {\n border-color: var(--color-word-5);\n }\n }\n\n &__drop-overlay {\n position: absolute;\n inset: 0;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-xs);\n border-radius: var(--rounded-xl);\n background-color: color-mix(\n in srgb,\n var(--color-surface) 85%,\n transparent\n );\n pointer-events: none;\n }\n\n &__fieldset {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n flex: 1;\n }\n\n &__content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-4);\n min-width: 0;\n overflow: hidden;\n }\n\n &__textarea {\n display: block;\n border: none;\n outline: none;\n resize: none;\n width: 100%;\n color: var(--color-word-1);\n background-color: var(--color-surface);\n overflow: hidden;\n\n &::placeholder {\n color: var(--color-word-4);\n }\n }\n\n &__attachments {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-4);\n padding-bottom: var(--spacing-xs);\n border-bottom: 1px solid var(--color-surface-2);\n }\n\n &__button {\n background-color: transparent;\n border: none;\n cursor: pointer;\n color: var(--color-word-1);\n padding: var(--spacing-4);\n flex-shrink: 0;\n transition: var(--transition-colors);\n border-radius: var(--rounded);\n\n &:hover {\n background-color: var(--color-surface-2);\n }\n\n &:focus-visible {\n outline: 1px solid var(--color-surface-5);\n outline-offset: 0;\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n &-icon {\n display: block;\n width: var(--spacing-20);\n height: var(--spacing-20);\n }\n }\n\n &__counter {\n background-color: var(--color-surface-1);\n border: 1px solid var(--color-surface-3);\n border-radius: var(--rounded-md);\n font-size: var(--text-12);\n color: var(--color-word-3);\n line-height: 1;\n padding-inline: var(--spacing-6);\n padding-block: var(--spacing-4);\n z-index: 1;\n font-variant-numeric: tabular-nums;\n font-family: var(--font-mono);\n font-weight: var(--font-bold);\n\n &--over {\n color: var(--color-danger);\n border-color: var(--color-danger-lighten-5);\n font-weight: var(--font-bold);\n }\n }\n }\n</style>\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1,388 +0,0 @@
|
|
|
1
|
-
import { t as e } from "./PkChatbotError-CvZxHGlI.js";
|
|
2
|
-
import { c as t, f as n, o as r, p as i, u as a } from "./src-EtGd6cRz.js";
|
|
3
|
-
import { t as o } from "./PkRelativeTime-WZ2aPcp_.js";
|
|
4
|
-
import { t as ee } from "./PkStreamingMarkdown-BAhC3uGK.js";
|
|
5
|
-
import { t as s } from "./PkChatbotFeedbackForm-lj9CHdhn.js";
|
|
6
|
-
import { t as te } from "./PkChatbotFilePreview-DHzuGtz5.js";
|
|
7
|
-
import { a as ne, n as re, o as c, r as l, t as u } from "./utils-BegUBK7s.js";
|
|
8
|
-
import { Fragment as d, Transition as f, computed as p, createBlock as m, createCommentVNode as h, createElementBlock as g, createElementVNode as _, createTextVNode as v, createVNode as y, defineAsyncComponent as b, defineComponent as x, mergeProps as S, nextTick as C, normalizeClass as w, normalizeStyle as T, onMounted as E, openBlock as D, ref as O, renderList as ie, renderSlot as ae, resolveDynamicComponent as oe, toDisplayString as k, unref as A, useSlots as se, useTemplateRef as ce, watch as j, withCtx as M, withModifiers as N } from "vue";
|
|
9
|
-
import { VvButton as le, VvButtonGroup as ue, VvIcon as de } from "@volverjs/ui-vue/components";
|
|
10
|
-
import { useI18n as fe } from "vue-i18n";
|
|
11
|
-
//#region ../../packages/components/src/chat/toolComponentMap.ts
|
|
12
|
-
var P = {
|
|
13
|
-
showArtifact: b(() => import("./PkToolShowArtifact-RzrDPcEQ.js").then((e) => e.n)),
|
|
14
|
-
showCalendarEvent: b(() => import("./PkToolShowCalendarEvent-DXRAzzKm.js").then((e) => e.n)),
|
|
15
|
-
showComparison: b(() => import("./PkToolShowComparison-CqN_pqBW.js").then((e) => e.n)),
|
|
16
|
-
showContactForm: b(() => import("./PkToolShowContactForm-5H4jfq1F.js").then((e) => e.n)),
|
|
17
|
-
showEmail: b(() => import("./PkToolShowEmail-B7YiliCE.js").then((e) => e.n)),
|
|
18
|
-
showImageGallery: b(() => import("./PkToolShowImageGallery-B7Bt6ZGv.js").then((e) => e.n)),
|
|
19
|
-
showLocation: b(() => import("./PkToolShowLocation-DteWf0Cs.js").then((e) => e.n)),
|
|
20
|
-
showMessage: b(() => import("./PkToolShowMessage-ujP26Ae3.js").then((e) => e.n)),
|
|
21
|
-
showMultipleChoice: b(() => import("./PkToolShowMultipleChoice-DZXfWtQp.js").then((e) => e.n)),
|
|
22
|
-
showProductList: b(() => import("./PkToolShowProductList-CtqWK0x4.js").then((e) => e.n)),
|
|
23
|
-
showQrCode: b(() => import("./PkToolShowQrCode-B4ex3m8i.js").then((e) => e.n)),
|
|
24
|
-
showSources: b(() => import("./PkToolShowSources-Dv0uuvqS.js").then((e) => e.n)),
|
|
25
|
-
showSuggestedReply: b(() => import("./PkToolShowSuggestedReply-30m9yWDL.js").then((e) => e.n)),
|
|
26
|
-
showWeather: b(() => import("./PkToolShowWeather-Coq6H0iv.js")),
|
|
27
|
-
showWebPages: b(() => import("./PkToolShowWebPages-DZIdrdWs.js").then((e) => e.n))
|
|
28
|
-
}, pe = /* @__PURE__ */ x({
|
|
29
|
-
__name: "PkStreamingMarkdownAutoscroll",
|
|
30
|
-
props: {
|
|
31
|
-
markdown: {},
|
|
32
|
-
innerClass: {}
|
|
33
|
-
},
|
|
34
|
-
setup(e) {
|
|
35
|
-
let t = e, n = O(), r = O(0), i = O(!1), a = () => {
|
|
36
|
-
if (!n.value) return;
|
|
37
|
-
let e = n.value.scrollTop;
|
|
38
|
-
e < r.value && r.value - e < 50 && (i.value = !0), e > r.value && e === n.value.scrollHeight - n.value.clientHeight && (i.value = !1), r.value = e;
|
|
39
|
-
};
|
|
40
|
-
return j(() => t.markdown, async () => {
|
|
41
|
-
await C(), n.value && !i.value && (n.value.scrollTop = n.value.scrollHeight);
|
|
42
|
-
}, { immediate: !0 }), (t, r) => (D(), g("div", {
|
|
43
|
-
ref_key: "scrollEl",
|
|
44
|
-
ref: n,
|
|
45
|
-
class: "overflow-auto light-scrollbar",
|
|
46
|
-
onScroll: a
|
|
47
|
-
}, [y(ee, {
|
|
48
|
-
markdown: e.markdown,
|
|
49
|
-
class: w(e.innerClass)
|
|
50
|
-
}, null, 8, ["markdown", "class"])], 544));
|
|
51
|
-
}
|
|
52
|
-
}), me = { class: "pk-chatbot-messages__wrapper" }, he = {
|
|
53
|
-
key: 0,
|
|
54
|
-
class: "pk-chatbot-divider"
|
|
55
|
-
}, ge = { class: "pk-chatbot-divider__label" }, _e = {
|
|
56
|
-
key: 0,
|
|
57
|
-
class: "pk-chatbot-message__text"
|
|
58
|
-
}, ve = {
|
|
59
|
-
key: 0,
|
|
60
|
-
class: "pk-chatbot-message__loading-info"
|
|
61
|
-
}, ye = { class: "flex gap-8 items-center" }, be = { class: "font-mono rounded text-10" }, xe = { class: "flex gap-8 items-center" }, Se = {
|
|
62
|
-
key: 0,
|
|
63
|
-
class: "pk-chatbot-message__footer"
|
|
64
|
-
}, Ce = {
|
|
65
|
-
key: 0,
|
|
66
|
-
class: "flex items-center gap-4 text-12 text-word-3"
|
|
67
|
-
}, we = ["datetime"], Te = {
|
|
68
|
-
key: 2,
|
|
69
|
-
class: "flex items-center gap-4 text-12 text-word-3"
|
|
70
|
-
}, F = /* @__PURE__ */ x({
|
|
71
|
-
__name: "PkChatbotMessages",
|
|
72
|
-
props: {
|
|
73
|
-
status: {},
|
|
74
|
-
messages: {},
|
|
75
|
-
logo: {},
|
|
76
|
-
name: {},
|
|
77
|
-
error: {},
|
|
78
|
-
actions: {},
|
|
79
|
-
mainColor: {},
|
|
80
|
-
textColor: {},
|
|
81
|
-
revisedAnswers: {},
|
|
82
|
-
messageFeedbacks: {},
|
|
83
|
-
disableHeightAdjustment: { type: Boolean },
|
|
84
|
-
showMessageDateTime: { type: Boolean },
|
|
85
|
-
showMessageTokensCount: { type: Boolean },
|
|
86
|
-
showAllMessageParts: { type: Boolean },
|
|
87
|
-
feedbackMessageId: {},
|
|
88
|
-
feedbackLoading: { type: Boolean },
|
|
89
|
-
feedbackSubmitted: { type: Boolean },
|
|
90
|
-
feedbackError: {}
|
|
91
|
-
},
|
|
92
|
-
emits: [
|
|
93
|
-
"show-info",
|
|
94
|
-
"regenerate",
|
|
95
|
-
"revise",
|
|
96
|
-
"upvote",
|
|
97
|
-
"downvote",
|
|
98
|
-
"feedback",
|
|
99
|
-
"feedback-submit",
|
|
100
|
-
"feedback-close",
|
|
101
|
-
"scroll-up",
|
|
102
|
-
"scroll-down",
|
|
103
|
-
"auto-retry",
|
|
104
|
-
"reset-chat"
|
|
105
|
-
],
|
|
106
|
-
setup(b, { emit: x }) {
|
|
107
|
-
let F = b, Ee = x, { t: I } = fe({ useScope: "global" }), De = se(), L = ce("scrollEl"), R = O(), z = O(0), B = O(!1), Oe = p(() => c(F.textColor, F.mainColor)), ke = () => {
|
|
108
|
-
if (!L.value) return;
|
|
109
|
-
let e = L.value.scrollTop;
|
|
110
|
-
e < z.value && (z.value - e < 50 && (B.value = !0), Ee("scroll-up")), e > z.value && (Ee("scroll-down"), e === L.value.scrollHeight - L.value.clientHeight && (B.value = !1)), z.value = e;
|
|
111
|
-
}, V = () => {
|
|
112
|
-
L.value && (R.value && clearTimeout(R.value), !B.value && (R.value = setTimeout(() => {
|
|
113
|
-
L.value?.scrollTo({
|
|
114
|
-
top: L.value.scrollHeight,
|
|
115
|
-
behavior: "smooth"
|
|
116
|
-
});
|
|
117
|
-
}, 10)));
|
|
118
|
-
};
|
|
119
|
-
j(() => F.status, (e) => {
|
|
120
|
-
e === "ready" && V();
|
|
121
|
-
});
|
|
122
|
-
let Ae = ce("messagesEl"), H = O(0);
|
|
123
|
-
j(() => F.messages, async (e) => {
|
|
124
|
-
if (e?.[e.length - 1]?.role !== "assistant") {
|
|
125
|
-
B.value = !1;
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
if (await C(), V(), F.disableHeightAdjustment) return;
|
|
129
|
-
let t = (L.value?.clientHeight ?? 0) - 48, n = e.map((e) => e.role).lastIndexOf("user"), r = t - (Ae.value?.[n]?.clientHeight ?? 0);
|
|
130
|
-
r && (H.value = r);
|
|
131
|
-
}, { deep: !0 }), E(() => {
|
|
132
|
-
V();
|
|
133
|
-
});
|
|
134
|
-
let U = (e) => F.revisedAnswers?.some((t) => t.messageId === e), W = (e) => F.messageFeedbacks?.find((t) => t.messageId === e), je = p(() => F.messages?.[F.messages.length - 1]), G = p(() => {
|
|
135
|
-
let e = je.value;
|
|
136
|
-
return e ? e.parts[e.parts.length - 1] : null;
|
|
137
|
-
}), K = p(() => F.status === "submitted" || F.status === "streaming"), q = p(() => F.status === "error"), J = p(() => {
|
|
138
|
-
let e = G.value;
|
|
139
|
-
return l(I, e);
|
|
140
|
-
}), Y = p(() => {
|
|
141
|
-
let e = G.value;
|
|
142
|
-
return u(e);
|
|
143
|
-
}), Me = (e) => F.messages?.findIndex((t) => t.id === e), X = (e) => e === void 0 || !F.messages ? !1 : e === (F.messages?.length ?? 0) - 1, Ne = (e) => X(e) && F.status === "ready" && F.actions?.includes("regenerate"), Z = (e, t) => (X(t) && F.status === "ready" || !X(t)) && F.actions?.includes(e), Pe = (e) => {
|
|
144
|
-
let t = e.parts[e.parts.length - 1];
|
|
145
|
-
return n(t);
|
|
146
|
-
}, Q = (e) => e.role === "assistant", Fe = (e) => e.role === "user", Ie = (e) => F.messages?.slice(0, e).reverse().find((e) => Q(e)), Le = (e) => F.messages?.slice(e + 1).find((e) => Q(e)), Re = (e) => {
|
|
147
|
-
let t = Ie(e), n = Le(e);
|
|
148
|
-
if (!t?.metadata?.createdAt || !n?.metadata?.createdAt) return !1;
|
|
149
|
-
let r = new Date(t.metadata.createdAt), i = new Date(n.metadata.createdAt);
|
|
150
|
-
return r.getFullYear() !== i.getFullYear() || r.getMonth() !== i.getMonth() || r.getDate() !== i.getDate();
|
|
151
|
-
}, ze = (e, t) => t === 0 || e.role !== "assistant" ? !1 : F.actions?.length || F.showMessageDateTime && e.metadata?.createdAt !== void 0 || F.showMessageTokensCount && e.metadata?.totalTokens !== void 0, $ = O();
|
|
152
|
-
return j(() => F.feedbackMessageId, async () => {
|
|
153
|
-
await C(), setTimeout(() => {
|
|
154
|
-
if (F.feedbackMessageId && $.value?.[0]?.$el) {
|
|
155
|
-
if (X(Me(F.feedbackMessageId))) {
|
|
156
|
-
V();
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
$.value[0].$el.scrollIntoView({
|
|
160
|
-
behavior: "smooth",
|
|
161
|
-
block: "center"
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
}, 10);
|
|
165
|
-
}), (c, l) => {
|
|
166
|
-
let p = de, x = le, C = ue;
|
|
167
|
-
return D(), g("div", {
|
|
168
|
-
ref_key: "scrollEl",
|
|
169
|
-
ref: L,
|
|
170
|
-
class: "pk-chatbot-messages",
|
|
171
|
-
style: T({
|
|
172
|
-
"--chatbot-main-color": b.mainColor,
|
|
173
|
-
"--chatbot-contrast-color": Oe.value
|
|
174
|
-
}),
|
|
175
|
-
onScroll: ke
|
|
176
|
-
}, [_("div", me, [
|
|
177
|
-
(D(!0), g(d, null, ie(b.messages, (e, E) => (D(), g(d, { key: e.id }, [E > 0 && Fe(e) && Re(E) ? (D(), g("div", he, [_("span", ge, k(c.$d(new Date(Le(E)?.metadata?.createdAt ?? ""), "short")), 1)])) : h("", !0), e.parts.length || X(E) && K.value && Q(e) ? (D(), g("div", {
|
|
178
|
-
key: 1,
|
|
179
|
-
ref_for: !0,
|
|
180
|
-
ref: "messagesEl",
|
|
181
|
-
class: w(["pk-chatbot-message", [`pk-chatbot-message--${e.role}`, { "pk-chatbot-message--loading": K.value && X(E) && Q(e) }]]),
|
|
182
|
-
style: T({ minHeight: X(E) && Q(e) && !q.value ? `${H.value}px` : void 0 })
|
|
183
|
-
}, [
|
|
184
|
-
(D(!0), g(d, null, ie(e.parts, (o, s) => (D(), g(d, { key: s }, [A(n)(o) && o.text.trim() ? (D(), g("div", _e, [ae(c.$slots, "text", S({ ref_for: !0 }, {
|
|
185
|
-
message: e,
|
|
186
|
-
part: o,
|
|
187
|
-
index: E,
|
|
188
|
-
isLoading: K.value
|
|
189
|
-
}), () => [Q(e) ? (D(), m(ee, {
|
|
190
|
-
key: 0,
|
|
191
|
-
class: "wysiwyg",
|
|
192
|
-
markdown: o.text,
|
|
193
|
-
loading: E === (b.messages?.length ?? 0) - 1 && b.status === "streaming"
|
|
194
|
-
}, null, 8, ["markdown", "loading"])) : (D(), g(d, { key: 1 }, [v(k(o.text), 1)], 64))])])) : A(a)(o) ? (D(), m(te, {
|
|
195
|
-
key: 1,
|
|
196
|
-
"media-type": o.mediaType,
|
|
197
|
-
url: o.url,
|
|
198
|
-
filename: o.filename
|
|
199
|
-
}, null, 8, [
|
|
200
|
-
"media-type",
|
|
201
|
-
"url",
|
|
202
|
-
"filename"
|
|
203
|
-
])) : A(i)(o) && !A(ne)(o) ? (D(), g(d, { key: 2 }, [!A(De)[o.type] && A(P)[A(t)(o)] ? (D(), m(oe(A(P)[A(t)(o)]), {
|
|
204
|
-
key: `component-${s}-${A(re)(o)}`,
|
|
205
|
-
part: o
|
|
206
|
-
}, null, 8, ["part"])) : ae(c.$slots, o.type, S({ key: `slot-${s}-${A(re)(o)}` }, { ref_for: !0 }, {
|
|
207
|
-
message: e,
|
|
208
|
-
part: o,
|
|
209
|
-
index: E,
|
|
210
|
-
isLoading: K.value
|
|
211
|
-
}), () => [b.showAllMessageParts ? (D(), g("div", ve, [_("div", ye, [A(u)(o) ? (D(), m(p, {
|
|
212
|
-
key: 0,
|
|
213
|
-
name: A(u)(o),
|
|
214
|
-
class: "shrink-0"
|
|
215
|
-
}, null, 8, ["name"])) : h("", !0), _("code", be, k(A(r)(o.type)), 1)])])) : h("", !0)])], 64)) : h("", !0)], 64))), 128)),
|
|
216
|
-
y(f, { mode: "out-in" }, {
|
|
217
|
-
default: M(() => [K.value && X(E) && !Pe(e) && Q(e) ? (D(), g("div", {
|
|
218
|
-
key: `loading-info-${e.id}`,
|
|
219
|
-
class: "pk-chatbot-message__loading-info"
|
|
220
|
-
}, [_("div", xe, [
|
|
221
|
-
y(p, {
|
|
222
|
-
name: "line-md:loading-loop",
|
|
223
|
-
class: "shrink-0"
|
|
224
|
-
}),
|
|
225
|
-
y(f, { mode: "out-in" }, {
|
|
226
|
-
default: M(() => [Y.value ? (D(), m(p, {
|
|
227
|
-
key: Y.value,
|
|
228
|
-
class: "shrink-0",
|
|
229
|
-
name: Y.value
|
|
230
|
-
}, null, 8, ["name"])) : h("", !0)]),
|
|
231
|
-
_: 1
|
|
232
|
-
}),
|
|
233
|
-
y(f, { mode: "out-in" }, {
|
|
234
|
-
default: M(() => [J.value ? (D(), g("span", {
|
|
235
|
-
key: J.value,
|
|
236
|
-
class: "text-10"
|
|
237
|
-
}, k(J.value), 1)) : h("", !0)]),
|
|
238
|
-
_: 1
|
|
239
|
-
})
|
|
240
|
-
]), y(f, { mode: "out-in" }, {
|
|
241
|
-
default: M(() => [G.value && "text" in G.value && G.value.text.trim() ? (D(), m(pe, {
|
|
242
|
-
key: 0,
|
|
243
|
-
markdown: G.value.text,
|
|
244
|
-
"inner-class": "wysiwyg",
|
|
245
|
-
class: "border border-surface-4 rounded p-4 mt-8 bg-surface-1 max-h-64 text-10 w-full"
|
|
246
|
-
}, null, 8, ["markdown"])) : h("", !0)]),
|
|
247
|
-
_: 1
|
|
248
|
-
})])) : h("", !0)]),
|
|
249
|
-
_: 2
|
|
250
|
-
}, 1024),
|
|
251
|
-
y(f, { mode: "out-in" }, {
|
|
252
|
-
default: M(() => [ze(e, E) ? (D(), g("div", Se, [
|
|
253
|
-
y(C, {
|
|
254
|
-
modifiers: "compact",
|
|
255
|
-
class: "mr-auto"
|
|
256
|
-
}, {
|
|
257
|
-
default: M(() => [
|
|
258
|
-
y(f, { mode: "out-in" }, {
|
|
259
|
-
default: M(() => [Ne(E) ? (D(), m(x, {
|
|
260
|
-
key: 0,
|
|
261
|
-
icon: "ri:reset-right-line",
|
|
262
|
-
modifiers: "action-quiet-small",
|
|
263
|
-
title: A(I)("action.regenerate"),
|
|
264
|
-
onClick: l[0] ||= N((e) => c.$emit("regenerate"), ["stop"])
|
|
265
|
-
}, null, 8, ["title"])) : h("", !0)]),
|
|
266
|
-
_: 2
|
|
267
|
-
}, 1024),
|
|
268
|
-
y(f, { mode: "out-in" }, {
|
|
269
|
-
default: M(() => [Z("show-info", E) ? (D(), m(x, {
|
|
270
|
-
key: 0,
|
|
271
|
-
icon: "ri:information-line",
|
|
272
|
-
title: A(I)("action.getMoreInfo"),
|
|
273
|
-
modifiers: "action-quiet-small",
|
|
274
|
-
onClick: N((t) => c.$emit("show-info", e), ["stop"])
|
|
275
|
-
}, null, 8, ["title", "onClick"])) : h("", !0)]),
|
|
276
|
-
_: 2
|
|
277
|
-
}, 1024),
|
|
278
|
-
y(f, { mode: "out-in" }, {
|
|
279
|
-
default: M(() => [Z("revise", E) ? (D(), m(x, {
|
|
280
|
-
key: 0,
|
|
281
|
-
icon: U(e.id) ? "ri:file-edit-fill" : "ri:file-edit-line",
|
|
282
|
-
title: U(e.id) ? A(I)("action.editRevise") : A(I)("action.createRevise"),
|
|
283
|
-
modifiers: "action-quiet-small",
|
|
284
|
-
class: w({ "text-brand": U(e.id) }),
|
|
285
|
-
onClick: N((t) => c.$emit("revise", e), ["stop"])
|
|
286
|
-
}, null, 8, [
|
|
287
|
-
"icon",
|
|
288
|
-
"title",
|
|
289
|
-
"class",
|
|
290
|
-
"onClick"
|
|
291
|
-
])) : h("", !0)]),
|
|
292
|
-
_: 2
|
|
293
|
-
}, 1024),
|
|
294
|
-
y(f, { mode: "out-in" }, {
|
|
295
|
-
default: M(() => [Z("upvote", E) ? (D(), m(x, {
|
|
296
|
-
key: 0,
|
|
297
|
-
icon: W(e.id)?.vote === "upvote" ? "ri:thumb-up-fill" : "ri:thumb-up-line",
|
|
298
|
-
title: A(I)("action.upvote"),
|
|
299
|
-
modifiers: "action-quiet-small",
|
|
300
|
-
onClick: N((t) => c.$emit("upvote", e), ["stop"])
|
|
301
|
-
}, null, 8, [
|
|
302
|
-
"icon",
|
|
303
|
-
"title",
|
|
304
|
-
"onClick"
|
|
305
|
-
])) : h("", !0)]),
|
|
306
|
-
_: 2
|
|
307
|
-
}, 1024),
|
|
308
|
-
y(f, { mode: "out-in" }, {
|
|
309
|
-
default: M(() => [Z("downvote", E) ? (D(), m(x, {
|
|
310
|
-
key: 0,
|
|
311
|
-
icon: W(e.id)?.vote === "downvote" ? "ri:thumb-down-fill" : "ri:thumb-down-line",
|
|
312
|
-
title: A(I)("action.downvote"),
|
|
313
|
-
modifiers: "action-quiet-small",
|
|
314
|
-
onClick: N((t) => c.$emit("downvote", e), ["stop"])
|
|
315
|
-
}, null, 8, [
|
|
316
|
-
"icon",
|
|
317
|
-
"title",
|
|
318
|
-
"onClick"
|
|
319
|
-
])) : h("", !0)]),
|
|
320
|
-
_: 2
|
|
321
|
-
}, 1024),
|
|
322
|
-
y(f, { mode: "out-in" }, {
|
|
323
|
-
default: M(() => [Z("feedback", E) ? (D(), m(x, {
|
|
324
|
-
key: 0,
|
|
325
|
-
icon: W(e.id)?.comment ? "ri:feedback-fill" : "ri:feedback-line",
|
|
326
|
-
title: A(I)("action.feedback"),
|
|
327
|
-
modifiers: "action-quiet-small",
|
|
328
|
-
onClick: N((t) => c.$emit("feedback", e), ["stop"])
|
|
329
|
-
}, null, 8, [
|
|
330
|
-
"icon",
|
|
331
|
-
"title",
|
|
332
|
-
"onClick"
|
|
333
|
-
])) : h("", !0)]),
|
|
334
|
-
_: 2
|
|
335
|
-
}, 1024)
|
|
336
|
-
]),
|
|
337
|
-
_: 2
|
|
338
|
-
}, 1024),
|
|
339
|
-
b.showMessageTokensCount && e.metadata?.totalTokens ? (D(), g("span", Ce, [y(p, { name: "ri:ai-generate-2-line" }), v(" " + k(c.$n(e.metadata.totalTokens, "integer")) + " " + k(A(I)("label.tokens")), 1)])) : h("", !0),
|
|
340
|
-
b.showMessageDateTime && e.metadata?.createdAt ? (D(), g("time", {
|
|
341
|
-
key: 1,
|
|
342
|
-
datetime: new Date(e.metadata?.createdAt).toISOString(),
|
|
343
|
-
class: "flex items-center gap-4 text-12 text-word-3"
|
|
344
|
-
}, [y(p, { name: "ri:time-line" }), v(" " + k(c.$d(new Date(e.metadata?.createdAt), "date-time")), 1)], 8, we)) : h("", !0),
|
|
345
|
-
b.showMessageDateTime && e?.metadata?.completedAt && e?.metadata?.createdAt ? (D(), g("div", Te, [y(p, { name: "ri:hourglass-line" }), y(o, {
|
|
346
|
-
date: e.metadata?.createdAt,
|
|
347
|
-
"end-date": e.metadata?.completedAt
|
|
348
|
-
}, null, 8, ["date", "end-date"])])) : h("", !0)
|
|
349
|
-
])) : h("", !0)]),
|
|
350
|
-
_: 2
|
|
351
|
-
}, 1024),
|
|
352
|
-
y(f, { mode: "out-in" }, {
|
|
353
|
-
default: M(() => [e.id === b.feedbackMessageId ? (D(), m(s, {
|
|
354
|
-
key: 0,
|
|
355
|
-
ref_for: !0,
|
|
356
|
-
ref_key: "feedbackMessageEl",
|
|
357
|
-
ref: $,
|
|
358
|
-
loading: b.feedbackLoading,
|
|
359
|
-
submitted: b.feedbackSubmitted,
|
|
360
|
-
error: b.feedbackError,
|
|
361
|
-
onSubmit: l[1] ||= (e) => c.$emit("feedback-submit", e),
|
|
362
|
-
onClose: l[2] ||= (e) => c.$emit("feedback-close")
|
|
363
|
-
}, null, 8, [
|
|
364
|
-
"loading",
|
|
365
|
-
"submitted",
|
|
366
|
-
"error"
|
|
367
|
-
])) : h("", !0)]),
|
|
368
|
-
_: 2
|
|
369
|
-
}, 1024)
|
|
370
|
-
], 6)) : h("", !0)], 64))), 128)),
|
|
371
|
-
q.value ? (D(), m(e, {
|
|
372
|
-
key: 0,
|
|
373
|
-
error: b.error,
|
|
374
|
-
onRetry: l[3] ||= (e) => c.$emit("auto-retry"),
|
|
375
|
-
onReset: l[4] ||= (e) => c.$emit("reset-chat")
|
|
376
|
-
}, null, 8, ["error"])) : h("", !0),
|
|
377
|
-
je.value?.role === "user" || q.value ? (D(), g("div", {
|
|
378
|
-
key: 1,
|
|
379
|
-
style: T({ minHeight: `${H.value}px` })
|
|
380
|
-
}, null, 4)) : h("", !0)
|
|
381
|
-
])], 36);
|
|
382
|
-
};
|
|
383
|
-
}
|
|
384
|
-
});
|
|
385
|
-
//#endregion
|
|
386
|
-
export { pe as n, F as t };
|
|
387
|
-
|
|
388
|
-
//# sourceMappingURL=PkChatbotMessages-DOeUT6YL.js.map
|