@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.
Files changed (70) hide show
  1. package/dist/_chunks/{PkStreamingMarkdown-COZApJzT.js → PkStreamingMarkdown-gIAvEY1t.js} +370 -301
  2. package/dist/_chunks/PkStreamingMarkdown-gIAvEY1t.js.map +1 -0
  3. package/dist/_chunks/{PkToolShowArtifact-BZQixk9z.js → PkToolShowArtifact-BwW4Yn6k.js} +2 -2
  4. package/dist/_chunks/{PkToolShowArtifact-BZQixk9z.js.map → PkToolShowArtifact-BwW4Yn6k.js.map} +1 -1
  5. package/dist/_chunks/{PkToolShowContactForm-thS7c8iL.js → PkToolShowContactForm-DTE-iF_c.js} +2 -2
  6. package/dist/_chunks/{PkToolShowContactForm-thS7c8iL.js.map → PkToolShowContactForm-DTE-iF_c.js.map} +1 -1
  7. package/dist/_chunks/PkToolShowImageGallery-CGL-HL6v.js +60 -0
  8. package/dist/_chunks/PkToolShowImageGallery-CGL-HL6v.js.map +1 -0
  9. package/dist/_chunks/{PkToolShowProductList-DEo7XogW.js → PkToolShowProductList-C8YIh0Dw.js} +2 -2
  10. package/dist/_chunks/{PkToolShowProductList-DEo7XogW.js.map → PkToolShowProductList-C8YIh0Dw.js.map} +1 -1
  11. package/dist/_chunks/{PkToolShowSources-BMXftK6O.js → PkToolShowSources-TSjtd1ps.js} +3 -3
  12. package/dist/_chunks/{PkToolShowSources-BMXftK6O.js.map → PkToolShowSources-TSjtd1ps.js.map} +1 -1
  13. package/dist/_chunks/{PkToolShowSuggestedReply-CPAnHI0c.js → PkToolShowSuggestedReply-c9sLv4n4.js} +2 -2
  14. package/dist/_chunks/{PkToolShowSuggestedReply-CPAnHI0c.js.map → PkToolShowSuggestedReply-c9sLv4n4.js.map} +1 -1
  15. package/dist/_chunks/{PkToolShowWeather-DcSUbzx0.js → PkToolShowWeather-ChJ5lB4K.js} +48 -48
  16. package/dist/_chunks/PkToolShowWeather-ChJ5lB4K.js.map +1 -0
  17. package/dist/_chunks/{PkToolShowWebPages-aH_GarEV.js → PkToolShowWebPages-CL2mYxh-.js} +2 -2
  18. package/dist/_chunks/{PkToolShowWebPages-aH_GarEV.js.map → PkToolShowWebPages-CL2mYxh-.js.map} +1 -1
  19. package/dist/_chunks/{PkUrl-BHD0_pal.js → PkUrl-CvztUywv.js} +2 -2
  20. package/dist/_chunks/{PkUrl-BHD0_pal.js.map → PkUrl-CvztUywv.js.map} +1 -1
  21. package/dist/_chunks/{useLightbox-DL_oVBep.js → useLightbox-Ddvue042.js} +5 -3
  22. package/{dist-vue/_chunks/useLightbox-1sB7fmFb.js.map → dist/_chunks/useLightbox-Ddvue042.js.map} +1 -1
  23. package/dist/ai-elements.es.js +3097 -3010
  24. package/dist/ai-elements.es.js.map +1 -1
  25. package/dist-vue/PkChatbot.js +1 -1
  26. package/dist-vue/PkChatbotFilePreview.js +1 -1
  27. package/dist-vue/PkChatbotInput.js +1 -1
  28. package/dist-vue/PkChatbotMessages.js +1 -1
  29. package/dist-vue/PkChatbotViewChat.js +1 -1
  30. package/dist-vue/_chunks/{PkChatbot-B9RSkQmJ.js → PkChatbot-BEJTYq-D.js} +4 -4
  31. package/dist-vue/_chunks/{PkChatbot-B9RSkQmJ.js.map → PkChatbot-BEJTYq-D.js.map} +1 -1
  32. package/dist-vue/_chunks/{PkChatbotFilePreview-DHzuGtz5.js → PkChatbotFilePreview-hRNtv2OJ.js} +2 -2
  33. package/dist-vue/_chunks/{PkChatbotFilePreview-DHzuGtz5.js.map → PkChatbotFilePreview-hRNtv2OJ.js.map} +1 -1
  34. package/dist-vue/_chunks/{PkChatbotInput-C5QSmt21.js → PkChatbotInput-BbGLBVim.js} +124 -116
  35. package/dist-vue/_chunks/PkChatbotInput-BbGLBVim.js.map +1 -0
  36. package/dist-vue/_chunks/PkChatbotMessages-j3ALQmGG.js +467 -0
  37. package/dist-vue/_chunks/PkChatbotMessages-j3ALQmGG.js.map +1 -0
  38. package/dist-vue/_chunks/{PkChatbotViewChat-C2FuDayB.js → PkChatbotViewChat-Z05fqNFE.js} +5 -5
  39. package/dist-vue/_chunks/{PkChatbotViewChat-C2FuDayB.js.map → PkChatbotViewChat-Z05fqNFE.js.map} +1 -1
  40. package/dist-vue/_chunks/{PkStreamingMarkdown-BAhC3uGK.js → PkStreamingMarkdown-BBTAwHd_.js} +311 -252
  41. package/dist-vue/_chunks/PkStreamingMarkdown-BBTAwHd_.js.map +1 -0
  42. package/dist-vue/_chunks/{PkToolShowArtifact-RzrDPcEQ.js → PkToolShowArtifact-CbqpjzCA.js} +2 -2
  43. package/dist-vue/_chunks/{PkToolShowArtifact-RzrDPcEQ.js.map → PkToolShowArtifact-CbqpjzCA.js.map} +1 -1
  44. package/dist-vue/_chunks/{PkToolShowContactForm-5H4jfq1F.js → PkToolShowContactForm-BkgfSyw7.js} +2 -2
  45. package/dist-vue/_chunks/{PkToolShowContactForm-5H4jfq1F.js.map → PkToolShowContactForm-BkgfSyw7.js.map} +1 -1
  46. package/dist-vue/_chunks/{PkToolShowImageGallery-B7Bt6ZGv.js → PkToolShowImageGallery-Ckyxa0mx.js} +18 -21
  47. package/dist-vue/_chunks/PkToolShowImageGallery-Ckyxa0mx.js.map +1 -0
  48. package/dist-vue/_chunks/{PkToolShowSources-Dv0uuvqS.js → PkToolShowSources-7Xt3iK2Z.js} +2 -2
  49. package/dist-vue/_chunks/{PkToolShowSources-Dv0uuvqS.js.map → PkToolShowSources-7Xt3iK2Z.js.map} +1 -1
  50. package/dist-vue/_chunks/{PkToolShowWeather-Coq6H0iv.js → PkToolShowWeather-B5Wp8WAt.js} +26 -26
  51. package/dist-vue/_chunks/PkToolShowWeather-B5Wp8WAt.js.map +1 -0
  52. package/dist-vue/_chunks/{useLightbox-1sB7fmFb.js → useLightbox-Cl8REkfc.js} +5 -3
  53. package/{dist/_chunks/useLightbox-DL_oVBep.js.map → dist-vue/_chunks/useLightbox-Cl8REkfc.js.map} +1 -1
  54. package/dist-vue/index.js +11 -11
  55. package/dist-vue/packages/components/src/chat/PkChatbotMessages.d.ts +4 -5
  56. package/dist-vue/packages/components/src/chat/PkStreamingMarkdown.d.ts +9 -1
  57. package/dist-vue/packages/components/src/chat/useChatScroll.d.ts +15 -0
  58. package/dist-vue/style.css +1 -1
  59. package/package.json +1 -1
  60. package/dist/_chunks/PkStreamingMarkdown-COZApJzT.js.map +0 -1
  61. package/dist/_chunks/PkToolShowImageGallery-DmJztS-Z.js +0 -63
  62. package/dist/_chunks/PkToolShowImageGallery-DmJztS-Z.js.map +0 -1
  63. package/dist/_chunks/PkToolShowWeather-DcSUbzx0.js.map +0 -1
  64. package/dist-vue/_chunks/PkChatbotInput-C5QSmt21.js.map +0 -1
  65. package/dist-vue/_chunks/PkChatbotMessages-DOeUT6YL.js +0 -388
  66. package/dist-vue/_chunks/PkChatbotMessages-DOeUT6YL.js.map +0 -1
  67. package/dist-vue/_chunks/PkStreamingMarkdown-BAhC3uGK.js.map +0 -1
  68. package/dist-vue/_chunks/PkToolShowImageGallery-B7Bt6ZGv.js.map +0 -1
  69. package/dist-vue/_chunks/PkToolShowWeather-Coq6H0iv.js.map +0 -1
  70. /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