@8wave/ai-elements 0.75.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-rIdQh5_D.js → PkStreamingMarkdown-gIAvEY1t.js} +372 -303
- package/dist/_chunks/PkStreamingMarkdown-gIAvEY1t.js.map +1 -0
- package/dist/_chunks/{PkToolShowArtifact-CeLgwZBA.js → PkToolShowArtifact-BwW4Yn6k.js} +5 -5
- package/dist/_chunks/{PkToolShowArtifact-CeLgwZBA.js.map → PkToolShowArtifact-BwW4Yn6k.js.map} +1 -1
- package/dist/_chunks/{PkToolShowCalendarEvent-cQpAAE3a.js → PkToolShowCalendarEvent-BEqn5iEb.js} +6 -6
- package/dist/_chunks/{PkToolShowCalendarEvent-cQpAAE3a.js.map → PkToolShowCalendarEvent-BEqn5iEb.js.map} +1 -1
- package/dist/_chunks/{PkToolShowComparison-Cu-zT8-Z.js → PkToolShowComparison-p34r0Hhd.js} +4 -4
- package/dist/_chunks/{PkToolShowComparison-Cu-zT8-Z.js.map → PkToolShowComparison-p34r0Hhd.js.map} +1 -1
- package/dist/_chunks/{PkToolShowContactForm-CqoSVvjG.js → PkToolShowContactForm-DTE-iF_c.js} +18 -18
- package/dist/_chunks/{PkToolShowContactForm-CqoSVvjG.js.map → PkToolShowContactForm-DTE-iF_c.js.map} +1 -1
- package/dist/_chunks/{PkToolShowEmail-oLGym0R9.js → PkToolShowEmail-Be8FvWjw.js} +4 -4
- package/dist/_chunks/{PkToolShowEmail-oLGym0R9.js.map → PkToolShowEmail-Be8FvWjw.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/{PkToolShowLocation-BtRUdoEw.js → PkToolShowLocation-DOoLCHzS.js} +6 -6
- package/dist/_chunks/{PkToolShowLocation-BtRUdoEw.js.map → PkToolShowLocation-DOoLCHzS.js.map} +1 -1
- package/dist/_chunks/{PkToolShowMessage-tJQGRhce.js → PkToolShowMessage-DgeULbdQ.js} +4 -4
- package/dist/_chunks/{PkToolShowMessage-tJQGRhce.js.map → PkToolShowMessage-DgeULbdQ.js.map} +1 -1
- package/dist/_chunks/{PkToolShowMultipleChoice-CtVvdyDg.js → PkToolShowMultipleChoice-CpGyn_bZ.js} +3 -3
- package/dist/_chunks/{PkToolShowMultipleChoice-CtVvdyDg.js.map → PkToolShowMultipleChoice-CpGyn_bZ.js.map} +1 -1
- package/dist/_chunks/{PkToolShowProductList-D_k6CDdb.js → PkToolShowProductList-C8YIh0Dw.js} +4 -4
- package/dist/_chunks/{PkToolShowProductList-D_k6CDdb.js.map → PkToolShowProductList-C8YIh0Dw.js.map} +1 -1
- package/dist/_chunks/{PkToolShowQrCode-S1j_T8wQ.js → PkToolShowQrCode-UE4uSyvJ.js} +4 -4
- package/dist/_chunks/{PkToolShowQrCode-S1j_T8wQ.js.map → PkToolShowQrCode-UE4uSyvJ.js.map} +1 -1
- package/dist/_chunks/{PkToolShowSources-CroItMtG.js → PkToolShowSources-TSjtd1ps.js} +7 -7
- package/dist/_chunks/PkToolShowSources-TSjtd1ps.js.map +1 -0
- package/dist/_chunks/{PkToolShowSuggestedReply-BRa5Lpti.js → PkToolShowSuggestedReply-c9sLv4n4.js} +4 -4
- package/dist/_chunks/{PkToolShowSuggestedReply-BRa5Lpti.js.map → PkToolShowSuggestedReply-c9sLv4n4.js.map} +1 -1
- package/dist/_chunks/{PkToolShowWeather-CUpCJ8Nj.js → PkToolShowWeather-ChJ5lB4K.js} +51 -51
- package/dist/_chunks/PkToolShowWeather-ChJ5lB4K.js.map +1 -0
- package/dist/_chunks/{PkToolShowWebPages-f-dHyxfD.js → PkToolShowWebPages-CL2mYxh-.js} +5 -5
- package/dist/_chunks/{PkToolShowWebPages-f-dHyxfD.js.map → PkToolShowWebPages-CL2mYxh-.js.map} +1 -1
- package/dist/_chunks/{PkUrl-CI17WkYu.js → PkUrl-CvztUywv.js} +3 -3
- package/dist/_chunks/{PkUrl-CI17WkYu.js.map → PkUrl-CvztUywv.js.map} +1 -1
- package/dist/_chunks/{VvCheckbox.es-BF8Mdg0O.js → VvCheckbox.es-ohF87NOe.js} +3 -3
- package/dist/_chunks/{VvCheckbox.es-BF8Mdg0O.js.map → VvCheckbox.es-ohF87NOe.js.map} +1 -1
- package/dist/_chunks/{VvCheckboxGroup.es-BJc8MmJ3.js → VvCheckboxGroup.es-DZCbyLN0.js} +4 -4
- package/dist/_chunks/{VvCheckboxGroup.es-BJc8MmJ3.js.map → VvCheckboxGroup.es-DZCbyLN0.js.map} +1 -1
- package/dist/_chunks/{VvCombobox.es-ILRHqAye.js → VvCombobox.es-YLPD7MpO.js} +6 -6
- package/dist/_chunks/{VvCombobox.es-ILRHqAye.js.map → VvCombobox.es-YLPD7MpO.js.map} +1 -1
- package/dist/_chunks/{VvInputText.es-CDnMeO26.js → VvInputText.es-DAnAXfBO.js} +7 -7
- package/dist/_chunks/{VvInputText.es-CDnMeO26.js.map → VvInputText.es-DAnAXfBO.js.map} +1 -1
- package/dist/_chunks/{VvRadio.es-C2p5vvAx.js → VvRadio.es-Do9oyNtV.js} +3 -3
- package/dist/_chunks/{VvRadio.es-C2p5vvAx.js.map → VvRadio.es-Do9oyNtV.js.map} +1 -1
- package/dist/_chunks/{VvRadioGroup.es-6GlWuDjY.js → VvRadioGroup.es-BHcqcJFC.js} +4 -4
- package/dist/_chunks/{VvRadioGroup.es-6GlWuDjY.js.map → VvRadioGroup.es-BHcqcJFC.js.map} +1 -1
- package/dist/_chunks/{VvSelect.es-i4lO9onq.js → VvSelect.es-CP_y02fy.js} +5 -5
- package/dist/_chunks/{VvSelect.es-i4lO9onq.js.map → VvSelect.es-CP_y02fy.js.map} +1 -1
- package/dist/_chunks/{VvTextarea.es-CGpiCS4S.js → VvTextarea.es-DetA_2DM.js} +6 -6
- package/dist/_chunks/{VvTextarea.es-CGpiCS4S.js.map → VvTextarea.es-DetA_2DM.js.map} +1 -1
- package/dist/_chunks/{dist-BTnzL-m0.js → dist-yqV26MWM.js} +4 -4
- package/dist/_chunks/{dist-BTnzL-m0.js.map → dist-yqV26MWM.js.map} +1 -1
- package/dist/_chunks/{esm-0nyRYwmP.js → esm-DLxNpT06.js} +7 -7
- package/dist/_chunks/{esm-0nyRYwmP.js.map → esm-DLxNpT06.js.map} +1 -1
- package/dist/_chunks/{floating-ui.vue-B5ZV-j8C.js → floating-ui.vue-tVPpNXUc.js} +3 -3
- package/dist/_chunks/{floating-ui.vue-B5ZV-j8C.js.map → floating-ui.vue-tVPpNXUc.js.map} +1 -1
- package/dist/_chunks/{iconify-C1EOwL90.js → iconify-y0w2FIJH.js} +3 -3
- package/dist/_chunks/{iconify-C1EOwL90.js.map → iconify-y0w2FIJH.js.map} +1 -1
- package/dist/_chunks/{index.es-CUjDCkXD.js → index.es-7fUi-rc0.js} +7 -7
- package/dist/_chunks/{index.es-CUjDCkXD.js.map → index.es-7fUi-rc0.js.map} +1 -1
- package/dist/_chunks/{src-C_wl-KYN.js → src-BfoQF6Z3.js} +2 -2
- package/dist/_chunks/{src-C_wl-KYN.js.map → src-BfoQF6Z3.js.map} +1 -1
- package/dist/_chunks/{useLightbox-CH1KeVqr.js → useLightbox-Ddvue042.js} +7 -5
- package/dist/_chunks/{useLightbox-CH1KeVqr.js.map → useLightbox-Ddvue042.js.map} +1 -1
- package/dist/_chunks/{vue-i18n-KvYvoek4.js → vue-i18n-DAH6nDTN.js} +3 -3
- package/dist/_chunks/{vue-i18n-KvYvoek4.js.map → vue-i18n-DAH6nDTN.js.map} +1 -1
- package/dist/_chunks/{vue.runtime.esm-bundler-BmggS4HU.js → vue.runtime.esm-bundler-Dq29dQrz.js} +16 -10
- package/dist/_chunks/vue.runtime.esm-bundler-Dq29dQrz.js.map +1 -0
- package/dist/ai-elements.es.js +3138 -3039
- package/dist/ai-elements.es.js.map +1 -1
- package/dist-vue/PkChatbot.js +1 -1
- package/dist-vue/PkChatbotFeedbackForm.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/PkChatbotViewConversations.js +1 -1
- package/dist-vue/PkChatbotViewProfile.js +1 -1
- package/dist-vue/_chunks/{Media-CXQSoKqt.js → Media-kK7BnZGr.js} +2 -2
- package/dist-vue/_chunks/Media-kK7BnZGr.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbot-DAzGc7al.js → PkChatbot-BEJTYq-D.js} +7 -7
- package/dist-vue/_chunks/{PkChatbot-DAzGc7al.js.map → PkChatbot-BEJTYq-D.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotFeedbackForm-DvUzirPP.js → PkChatbotFeedbackForm-lj9CHdhn.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotFeedbackForm-DvUzirPP.js.map → PkChatbotFeedbackForm-lj9CHdhn.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-CjoezIyz.js → PkChatbotViewChat-Z05fqNFE.js} +6 -6
- package/dist-vue/_chunks/{PkChatbotViewChat-CjoezIyz.js.map → PkChatbotViewChat-Z05fqNFE.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewConversations-DSQu6vY1.js → PkChatbotViewConversations-2xc0o-fO.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotViewConversations-DSQu6vY1.js.map → PkChatbotViewConversations-2xc0o-fO.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewProfile-BJJiaG9H.js → PkChatbotViewProfile-CoT1JnMk.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotViewProfile-BJJiaG9H.js.map → PkChatbotViewProfile-CoT1JnMk.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-r_GgO-ZX.js → PkToolShowContactForm-BkgfSyw7.js} +3 -3
- package/dist-vue/_chunks/{PkToolShowContactForm-r_GgO-ZX.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-DK2DCvU3.js → PkToolShowSources-7Xt3iK2Z.js} +3 -3
- package/dist-vue/_chunks/{PkToolShowSources-DK2DCvU3.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/{createChatbotApiClient-f86KwRcq.js → createChatbotApiClient-CvDRMmDa.js} +2 -2
- package/dist-vue/_chunks/{createChatbotApiClient-f86KwRcq.js.map → createChatbotApiClient-CvDRMmDa.js.map} +1 -1
- package/dist-vue/_chunks/{index.es-_14zrNZB.js → index.es-Dk_HaA08.js} +2 -2
- package/dist-vue/_chunks/{index.es-_14zrNZB.js.map → index.es-Dk_HaA08.js.map} +1 -1
- package/dist-vue/_chunks/{useChatbotStore-CJlkoNn7.js → useChatbotStore-DMDbzuub.js} +5 -5
- package/dist-vue/_chunks/{useChatbotStore-CJlkoNn7.js.map → useChatbotStore-DMDbzuub.js.map} +1 -1
- package/dist-vue/_chunks/{useLightbox-1sB7fmFb.js → useLightbox-Cl8REkfc.js} +5 -3
- package/dist-vue/_chunks/{useLightbox-1sB7fmFb.js.map → useLightbox-Cl8REkfc.js.map} +1 -1
- package/dist-vue/api.js +1 -1
- package/dist-vue/composables.js +2 -2
- package/dist-vue/index.js +24 -24
- package/dist-vue/index.js.map +1 -1
- 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/packages/models/src/schema/AgentEndpoint.d.ts +1 -1
- package/dist-vue/packages/models/src/schema/constants.d.ts +3 -1
- package/dist-vue/style.css +1 -1
- package/package.json +2 -2
- package/dist/_chunks/PkStreamingMarkdown-rIdQh5_D.js.map +0 -1
- package/dist/_chunks/PkToolShowImageGallery-CDXSL1Mg.js +0 -63
- package/dist/_chunks/PkToolShowImageGallery-CDXSL1Mg.js.map +0 -1
- package/dist/_chunks/PkToolShowSources-CroItMtG.js.map +0 -1
- package/dist/_chunks/PkToolShowWeather-CUpCJ8Nj.js.map +0 -1
- package/dist/_chunks/vue.runtime.esm-bundler-BmggS4HU.js.map +0 -1
- package/dist-vue/_chunks/Media-CXQSoKqt.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotInput-C5QSmt21.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotMessages-dsjB0-26.js +0 -388
- package/dist-vue/_chunks/PkChatbotMessages-dsjB0-26.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,29 +1,29 @@
|
|
|
1
|
-
import { t as e } from "./PkStreamingMarkdown-
|
|
2
|
-
import { t } from "./PkChatbotFilePreview-
|
|
3
|
-
import { Fragment as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createTextVNode as c, createVNode as l, defineComponent as u, mergeModels as d, mergeProps as f, nextTick as p, normalizeClass as ee, normalizeProps as
|
|
4
|
-
import { VvButton as
|
|
5
|
-
import { useDropZone as
|
|
1
|
+
import { t as e } from "./PkStreamingMarkdown-BBTAwHd_.js";
|
|
2
|
+
import { t } from "./PkChatbotFilePreview-hRNtv2OJ.js";
|
|
3
|
+
import { Fragment as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createTextVNode as c, createVNode as l, defineComponent as u, mergeModels as d, mergeProps as f, nextTick as p, normalizeClass as ee, normalizeProps as m, onBeforeUnmount as h, onMounted as g, openBlock as _, ref as v, renderList as te, renderSlot as y, toDisplayString as b, unref as ne, useModel as x, useTemplateRef as S, watch as re, withCtx as C, withKeys as ie, withModifiers as w } from "vue";
|
|
4
|
+
import { VvButton as ae, VvDropdown as oe, VvDropdownAction as se, VvIcon as ce } from "@volverjs/ui-vue/components";
|
|
5
|
+
import { useDropZone as le } from "@vueuse/core";
|
|
6
6
|
//#region ../../node_modules/.pnpm/autosize@6.0.1/node_modules/autosize/dist/autosize.esm.js
|
|
7
|
-
var
|
|
8
|
-
function
|
|
9
|
-
var t =
|
|
7
|
+
var T = /* @__PURE__ */ new Map();
|
|
8
|
+
function E(e) {
|
|
9
|
+
var t = T.get(e);
|
|
10
10
|
t && t.destroy();
|
|
11
11
|
}
|
|
12
|
-
function
|
|
13
|
-
var t =
|
|
12
|
+
function D(e) {
|
|
13
|
+
var t = T.get(e);
|
|
14
14
|
t && t.update();
|
|
15
15
|
}
|
|
16
|
-
var
|
|
17
|
-
typeof window > "u" ? ((
|
|
16
|
+
var O = null;
|
|
17
|
+
typeof window > "u" ? ((O = function(e) {
|
|
18
18
|
return e;
|
|
19
19
|
}).destroy = function(e) {
|
|
20
20
|
return e;
|
|
21
|
-
},
|
|
21
|
+
}, O.update = function(e) {
|
|
22
22
|
return e;
|
|
23
|
-
}) : ((
|
|
23
|
+
}) : ((O = function(e, t) {
|
|
24
24
|
return e && Array.prototype.forEach.call(e.length ? e : [e], function(e) {
|
|
25
25
|
return function(e) {
|
|
26
|
-
if (e && e.nodeName && e.nodeName === "TEXTAREA" && !
|
|
26
|
+
if (e && e.nodeName && e.nodeName === "TEXTAREA" && !T.has(e)) {
|
|
27
27
|
var t, n = null, r = window.getComputedStyle(e), i = (t = e.value, function() {
|
|
28
28
|
o({
|
|
29
29
|
testForHeightReduction: t === "" || !e.value.startsWith(t),
|
|
@@ -32,7 +32,7 @@ typeof window > "u" ? ((D = function(e) {
|
|
|
32
32
|
}), a = function(t) {
|
|
33
33
|
e.removeEventListener("autosize:destroy", a), e.removeEventListener("autosize:update", s), e.removeEventListener("input", i), window.removeEventListener("resize", s), Object.keys(t).forEach(function(n) {
|
|
34
34
|
return e.style[n] = t[n];
|
|
35
|
-
}),
|
|
35
|
+
}), T.delete(e);
|
|
36
36
|
}.bind(e, {
|
|
37
37
|
height: e.style.height,
|
|
38
38
|
resize: e.style.resize,
|
|
@@ -41,7 +41,7 @@ typeof window > "u" ? ((D = function(e) {
|
|
|
41
41
|
overflowX: e.style.overflowX,
|
|
42
42
|
wordWrap: e.style.wordWrap
|
|
43
43
|
});
|
|
44
|
-
e.addEventListener("autosize:destroy", a), e.addEventListener("autosize:update", s), e.addEventListener("input", i), window.addEventListener("resize", s), e.style.overflowX = "hidden", e.style.wordWrap = "break-word",
|
|
44
|
+
e.addEventListener("autosize:destroy", a), e.addEventListener("autosize:update", s), e.addEventListener("input", i), window.addEventListener("resize", s), e.style.overflowX = "hidden", e.style.wordWrap = "break-word", T.set(e, {
|
|
45
45
|
destroy: a,
|
|
46
46
|
update: s
|
|
47
47
|
}), s();
|
|
@@ -73,24 +73,28 @@ typeof window > "u" ? ((D = function(e) {
|
|
|
73
73
|
}(e);
|
|
74
74
|
}), e;
|
|
75
75
|
}).destroy = function(e) {
|
|
76
|
-
return e && Array.prototype.forEach.call(e.length ? e : [e], T), e;
|
|
77
|
-
}, D.update = function(e) {
|
|
78
76
|
return e && Array.prototype.forEach.call(e.length ? e : [e], E), e;
|
|
77
|
+
}, O.update = function(e) {
|
|
78
|
+
return e && Array.prototype.forEach.call(e.length ? e : [e], D), e;
|
|
79
79
|
});
|
|
80
|
-
var
|
|
80
|
+
var k = O, ue = { class: "pk-chatbot-input" }, de = {
|
|
81
81
|
key: 0,
|
|
82
82
|
class: "pk-chatbot-input-dismissable-notice"
|
|
83
|
-
},
|
|
83
|
+
}, fe = {
|
|
84
84
|
key: 0,
|
|
85
85
|
class: "pk-chatbot-input__drop-overlay"
|
|
86
|
-
},
|
|
86
|
+
}, pe = {
|
|
87
87
|
key: 1,
|
|
88
88
|
class: "pk-chatbot-input__attachments"
|
|
89
|
-
},
|
|
89
|
+
}, me = { class: "pk-chatbot-input__fieldset" }, he = [
|
|
90
90
|
"title",
|
|
91
91
|
"disabled",
|
|
92
92
|
"onClick"
|
|
93
|
-
],
|
|
93
|
+
], ge = ["title", "disabled"], _e = ["accept"], ve = ["accept"], ye = { class: "pk-chatbot-input__content" }, A = [
|
|
94
|
+
"value",
|
|
95
|
+
"placeholder",
|
|
96
|
+
"onKeydown"
|
|
97
|
+
], j = { class: "opacity-60" }, M = ["title"], N = ["title", "disabled"], P = /* @__PURE__ */ u({
|
|
94
98
|
__name: "PkChatbotInput",
|
|
95
99
|
props: /* @__PURE__ */ d({
|
|
96
100
|
placeholder: {},
|
|
@@ -111,64 +115,70 @@ var O = D, fe = { class: "pk-chatbot-input" }, pe = {
|
|
|
111
115
|
"file-select"
|
|
112
116
|
], ["update:modelValue", "update:pendingAttachments"]),
|
|
113
117
|
setup(u, { emit: d }) {
|
|
114
|
-
let
|
|
115
|
-
|
|
116
|
-
},
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
try {
|
|
123
|
-
R.value && O.destroy(R.value);
|
|
124
|
-
} catch {}
|
|
125
|
-
for (let e of T.value) URL.revokeObjectURL(e.localUrl);
|
|
126
|
-
});
|
|
127
|
-
let H = r(() => D.status === "streaming"), U = r(() => D.status === "submitted"), W = r(() => w.value?.length ?? 0), G = r(() => D.maxMessageLength !== void 0 && W.value > D.maxMessageLength), be = r(() => T.value.some((e) => e.state === "uploading")), xe = r(() => D.fileUpload?.allowedMimeTypes?.join(",") ?? ""), K = r(() => (D.fileUpload?.allowedMimeTypes ?? []).filter((e) => e.startsWith("image/")).join(",")), q = r(() => ye && K.value.length > 0), J = r(() => H.value || U.value || be.value || G.value ? !1 : (w.value?.trim().length ?? 0) > 0), Y = () => {
|
|
128
|
-
R.value && O.update(R.value);
|
|
129
|
-
}, X = () => {
|
|
130
|
-
J.value && (E("submit"), p(() => {
|
|
131
|
-
Y(), R.value?.blur();
|
|
132
|
-
}));
|
|
133
|
-
}, Z = () => {
|
|
134
|
-
z.value?.click();
|
|
118
|
+
let T = x(u, "modelValue"), E = x(u, "pendingAttachments"), D = d, O = u, P = S("textareaEl"), F = S("fileInputEl"), I = S("cameraInputEl"), L = S("formEl"), R = v(T.value ?? ""), z = null, B = () => {
|
|
119
|
+
z !== null && (clearTimeout(z), z = null);
|
|
120
|
+
}, be = () => {
|
|
121
|
+
B(), T.value = R.value;
|
|
122
|
+
}, xe = () => {
|
|
123
|
+
B(), z = setTimeout(() => {
|
|
124
|
+
T.value = R.value, z = null;
|
|
125
|
+
}, 300);
|
|
135
126
|
}, Se = () => {
|
|
136
|
-
|
|
137
|
-
}
|
|
127
|
+
R.value = P.value?.value ?? "", xe();
|
|
128
|
+
};
|
|
129
|
+
re(T, (e) => {
|
|
130
|
+
e !== R.value && (R.value = e ?? "", p(() => {
|
|
131
|
+
P.value && k.update(P.value);
|
|
132
|
+
}));
|
|
133
|
+
});
|
|
134
|
+
let V = r(() => O.status === "streaming"), H = r(() => O.status === "submitted"), U = r(() => V.value || H.value), W = r(() => R.value.length), G = r(() => O.maxMessageLength !== void 0 && W.value > O.maxMessageLength), Ce = r(() => E.value.some((e) => e.state === "uploading")), K = r(() => U.value || Ce.value || G.value ? !1 : R.value.trim().length > 0), we = "capture" in document.createElement("input"), Te = r(() => O.fileUpload?.allowedMimeTypes?.join(",") ?? ""), q = r(() => (O.fileUpload?.allowedMimeTypes ?? []).filter((e) => e.startsWith("image/")).join(",")), J = r(() => we && q.value.length > 0), Y = () => {
|
|
135
|
+
F.value?.click();
|
|
136
|
+
}, Ee = () => {
|
|
137
|
+
I.value?.click();
|
|
138
|
+
}, X = (e) => {
|
|
138
139
|
let t = e.target, n = t.files?.[0];
|
|
139
|
-
n &&
|
|
140
|
-
},
|
|
141
|
-
let t =
|
|
142
|
-
t && URL.revokeObjectURL(t.localUrl),
|
|
143
|
-
},
|
|
144
|
-
dataTypes: r(() =>
|
|
140
|
+
n && D("file-select", n), t.value = "";
|
|
141
|
+
}, De = (e) => {
|
|
142
|
+
let t = E.value.find((t) => t.id === e);
|
|
143
|
+
t && URL.revokeObjectURL(t.localUrl), E.value = E.value.filter((t) => t.id !== e);
|
|
144
|
+
}, Z = r(() => (O.enableDragDrop ?? !0) && !!O.fileUpload?.enabled), { isOverDropZone: Oe } = le(L, {
|
|
145
|
+
dataTypes: r(() => O.fileUpload?.allowedMimeTypes ?? []),
|
|
145
146
|
onDrop: (e) => {
|
|
146
|
-
if (!(
|
|
147
|
+
if (!(!Z.value || !e)) for (let t of e) D("file-select", t);
|
|
147
148
|
}
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
149
|
+
}), Q = v(!0), ke = () => {
|
|
150
|
+
Q.value = !1;
|
|
151
|
+
}, $ = () => {
|
|
152
|
+
K.value && (be(), D("submit"));
|
|
153
|
+
};
|
|
154
|
+
return g(() => {
|
|
155
|
+
P.value && k(P.value);
|
|
156
|
+
}), h(() => {
|
|
157
|
+
B(), P.value && k.destroy(P.value);
|
|
158
|
+
for (let e of E.value) URL.revokeObjectURL(e.localUrl);
|
|
159
|
+
}), (r, d) => {
|
|
160
|
+
let p = ae, h = ce, g = se, v = oe;
|
|
161
|
+
return _(), o("div", ue, [u.dismissableNotice && Q.value ? (_(), o("div", de, [l(e, {
|
|
152
162
|
markdown: u.dismissableNotice,
|
|
153
163
|
class: "wysiwyg"
|
|
154
|
-
}, null, 8, ["markdown"]), u.dismissableNotice ? (
|
|
164
|
+
}, null, 8, ["markdown"]), u.dismissableNotice ? (_(), i(p, {
|
|
155
165
|
key: 0,
|
|
156
166
|
title: r.$t("action.close"),
|
|
157
167
|
modifiers: "action-quiet",
|
|
158
168
|
icon: "ri:close-line",
|
|
159
169
|
class: "w-18 h-18",
|
|
160
|
-
onClick:
|
|
170
|
+
onClick: ke
|
|
161
171
|
}, null, 8, ["title"])) : a("", !0)])) : a("", !0), s("form", {
|
|
162
172
|
ref_key: "formEl",
|
|
163
|
-
ref:
|
|
173
|
+
ref: L,
|
|
164
174
|
class: "pk-chatbot-input__form",
|
|
165
|
-
onSubmit:
|
|
175
|
+
onSubmit: w($, ["prevent"])
|
|
166
176
|
}, [
|
|
167
|
-
|
|
177
|
+
ne(Oe) && Z.value ? (_(), o("div", fe, [l(h, {
|
|
168
178
|
name: "ri:upload-cloud-2-line",
|
|
169
179
|
class: "pk-chatbot-input__drop-overlay-icon"
|
|
170
|
-
}), s("span", null,
|
|
171
|
-
|
|
180
|
+
}), s("span", null, b(r.$t("action.dropFile")), 1)])) : a("", !0),
|
|
181
|
+
E.value.length ? (_(), o("div", pe, [(_(!0), o(n, null, te(E.value, (e) => (_(), i(t, {
|
|
172
182
|
key: e.id,
|
|
173
183
|
"media-type": e.file.type,
|
|
174
184
|
url: e.localUrl,
|
|
@@ -176,7 +186,7 @@ var O = D, fe = { class: "pk-chatbot-input" }, pe = {
|
|
|
176
186
|
loading: e.state === "uploading",
|
|
177
187
|
error: e.state === "error" ? e.error : void 0,
|
|
178
188
|
removable: e.state !== "uploading",
|
|
179
|
-
onRemove: (t) =>
|
|
189
|
+
onRemove: (t) => De(e.id)
|
|
180
190
|
}, null, 8, [
|
|
181
191
|
"media-type",
|
|
182
192
|
"url",
|
|
@@ -186,120 +196,118 @@ var O = D, fe = { class: "pk-chatbot-input" }, pe = {
|
|
|
186
196
|
"removable",
|
|
187
197
|
"onRemove"
|
|
188
198
|
]))), 128))])) : a("", !0),
|
|
189
|
-
s("div",
|
|
190
|
-
u.fileUpload && u.fileUpload.enabled && (
|
|
199
|
+
s("div", me, [
|
|
200
|
+
u.fileUpload && u.fileUpload.enabled && (J.value || r.$slots["additional-actions"]) ? (_(), i(v, m(f({ key: 0 }, {
|
|
191
201
|
placement: "top-start",
|
|
192
202
|
modifiers: "menu",
|
|
193
203
|
flip: !0,
|
|
194
204
|
offset: 3
|
|
195
205
|
})), {
|
|
196
|
-
default:
|
|
206
|
+
default: C(({ init: e, toggle: t, aria: n }) => [s("button", f({ ref: (t) => e(t) }, n, {
|
|
197
207
|
class: "pk-chatbot-input__button",
|
|
198
208
|
type: "button",
|
|
199
209
|
title: r.$t("action.attachFile"),
|
|
200
|
-
disabled:
|
|
210
|
+
disabled: U.value,
|
|
201
211
|
onClick: t
|
|
202
212
|
}), [l(h, {
|
|
203
213
|
name: "ri:add-line",
|
|
204
214
|
class: "pk-chatbot-input__button-icon"
|
|
205
|
-
})], 16,
|
|
206
|
-
items:
|
|
207
|
-
|
|
215
|
+
})], 16, he)]),
|
|
216
|
+
items: C(() => [
|
|
217
|
+
J.value ? (_(), i(g, {
|
|
208
218
|
key: 0,
|
|
209
|
-
disabled:
|
|
210
|
-
onClick:
|
|
219
|
+
disabled: U.value,
|
|
220
|
+
onClick: Ee
|
|
211
221
|
}, {
|
|
212
|
-
default:
|
|
222
|
+
default: C(() => [l(h, {
|
|
213
223
|
name: "ri:camera-line",
|
|
214
224
|
class: "pk-chatbot-input__dropdown-icon"
|
|
215
|
-
}), c(" " +
|
|
225
|
+
}), c(" " + b(r.$t("action.takePhoto")), 1)]),
|
|
216
226
|
_: 1
|
|
217
227
|
}, 8, ["disabled"])) : a("", !0),
|
|
218
|
-
l(
|
|
219
|
-
disabled:
|
|
220
|
-
onClick:
|
|
228
|
+
l(g, {
|
|
229
|
+
disabled: U.value,
|
|
230
|
+
onClick: Y
|
|
221
231
|
}, {
|
|
222
|
-
default:
|
|
232
|
+
default: C(() => [l(h, {
|
|
223
233
|
name: "ri:attachment-line",
|
|
224
234
|
class: "pk-chatbot-input__dropdown-icon"
|
|
225
|
-
}), c(" " +
|
|
235
|
+
}), c(" " + b(r.$t("action.attachFile")), 1)]),
|
|
226
236
|
_: 1
|
|
227
237
|
}, 8, ["disabled"]),
|
|
228
|
-
|
|
238
|
+
y(r.$slots, "additional-actions")
|
|
229
239
|
]),
|
|
230
240
|
_: 3
|
|
231
|
-
}, 16)) : u.fileUpload && u.fileUpload.enabled ? (
|
|
241
|
+
}, 16)) : u.fileUpload && u.fileUpload.enabled ? (_(), o("button", {
|
|
232
242
|
key: 1,
|
|
233
243
|
class: "pk-chatbot-input__button",
|
|
234
244
|
type: "button",
|
|
235
245
|
title: r.$t("action.attachFile"),
|
|
236
|
-
disabled:
|
|
237
|
-
onClick:
|
|
246
|
+
disabled: U.value,
|
|
247
|
+
onClick: Y
|
|
238
248
|
}, [l(h, {
|
|
239
249
|
name: "ri:add-line",
|
|
240
250
|
class: "pk-chatbot-input__button-icon"
|
|
241
|
-
})], 8,
|
|
242
|
-
u.fileUpload && u.fileUpload.enabled ? (
|
|
251
|
+
})], 8, ge)) : a("", !0),
|
|
252
|
+
u.fileUpload && u.fileUpload.enabled ? (_(), o("input", {
|
|
243
253
|
key: 2,
|
|
244
254
|
ref_key: "fileInputEl",
|
|
245
|
-
ref:
|
|
255
|
+
ref: F,
|
|
246
256
|
type: "file",
|
|
247
257
|
hidden: "",
|
|
248
|
-
accept:
|
|
249
|
-
onChange:
|
|
250
|
-
}, null, 40,
|
|
251
|
-
u.fileUpload && u.fileUpload.enabled &&
|
|
258
|
+
accept: Te.value,
|
|
259
|
+
onChange: X
|
|
260
|
+
}, null, 40, _e)) : a("", !0),
|
|
261
|
+
u.fileUpload && u.fileUpload.enabled && J.value ? (_(), o("input", {
|
|
252
262
|
key: 3,
|
|
253
263
|
ref_key: "cameraInputEl",
|
|
254
|
-
ref:
|
|
264
|
+
ref: I,
|
|
255
265
|
type: "file",
|
|
256
266
|
capture: "environment",
|
|
257
267
|
hidden: "",
|
|
258
|
-
accept:
|
|
259
|
-
onChange:
|
|
260
|
-
}, null, 40,
|
|
261
|
-
s("div",
|
|
268
|
+
accept: q.value,
|
|
269
|
+
onChange: X
|
|
270
|
+
}, null, 40, ve)) : a("", !0),
|
|
271
|
+
s("div", ye, [s("textarea", {
|
|
262
272
|
ref_key: "textareaEl",
|
|
263
|
-
ref:
|
|
264
|
-
|
|
273
|
+
ref: P,
|
|
274
|
+
value: R.value,
|
|
265
275
|
class: "pk-chatbot-input__textarea",
|
|
266
276
|
name: "message",
|
|
267
277
|
rows: "1",
|
|
268
278
|
placeholder: u.placeholder,
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
}, null, 40, N), [[ie, w.value]])]),
|
|
274
|
-
u.maxMessageLength ? (g(), o("div", {
|
|
279
|
+
onInput: Se,
|
|
280
|
+
onKeydown: ie(w($, ["prevent"]), ["enter"])
|
|
281
|
+
}, null, 40, A)]),
|
|
282
|
+
u.maxMessageLength ? (_(), o("div", {
|
|
275
283
|
key: 4,
|
|
276
284
|
class: ee(["pk-chatbot-input__counter", { "pk-chatbot-input__counter--over": G.value }])
|
|
277
|
-
}, [c(
|
|
278
|
-
|
|
285
|
+
}, [c(b(r.$n(W.value, "integer")) + "/", 1), s("span", j, b(r.$n(u.maxMessageLength, "integer")), 1)], 2)) : a("", !0),
|
|
286
|
+
V.value ? (_(), o("button", {
|
|
279
287
|
key: 5,
|
|
280
288
|
class: "pk-chatbot-input__button",
|
|
281
289
|
type: "button",
|
|
282
290
|
title: r.$t("action.stop"),
|
|
283
|
-
onClick: d[
|
|
291
|
+
onClick: d[0] ||= (e) => D("stop-generation")
|
|
284
292
|
}, [l(h, {
|
|
285
293
|
name: "ri:stop-circle-line",
|
|
286
294
|
class: "pk-chatbot-input__button-icon"
|
|
287
|
-
})], 8,
|
|
295
|
+
})], 8, M)) : (_(), o("button", {
|
|
288
296
|
key: 6,
|
|
289
297
|
class: "pk-chatbot-input__button",
|
|
290
298
|
type: "submit",
|
|
291
|
-
title:
|
|
292
|
-
disabled: !
|
|
299
|
+
title: K.value ? r.$t("action.submit") : r.$t("label.disabled"),
|
|
300
|
+
disabled: !K.value
|
|
293
301
|
}, [l(h, {
|
|
294
|
-
name:
|
|
302
|
+
name: H.value ? "line-md:loading-loop" : K.value ? "ri:send-ins-fill" : "ri:send-ins-line",
|
|
295
303
|
class: "pk-chatbot-input__button-icon"
|
|
296
|
-
}, null, 8, ["name"])], 8,
|
|
304
|
+
}, null, 8, ["name"])], 8, N))
|
|
297
305
|
])
|
|
298
306
|
], 544)]);
|
|
299
307
|
};
|
|
300
308
|
}
|
|
301
309
|
});
|
|
302
310
|
//#endregion
|
|
303
|
-
export {
|
|
311
|
+
export { P as t };
|
|
304
312
|
|
|
305
|
-
//# sourceMappingURL=PkChatbotInput-
|
|
313
|
+
//# sourceMappingURL=PkChatbotInput-BbGLBVim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PkChatbotInput-BbGLBVim.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 watch,\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 // --- Models & Props ---\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 // --- Template refs ---\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 // --- Input buffering (decouples typing from reactive model propagation) ---\n\n const localValue = ref(modelValue.value ?? '')\n let syncTimer: ReturnType<typeof setTimeout> | null = null\n\n const cancelSync = () => {\n if (syncTimer !== null) {\n clearTimeout(syncTimer)\n syncTimer = null\n }\n }\n\n const flushSync = () => {\n cancelSync()\n modelValue.value = localValue.value\n }\n\n const scheduleSync = () => {\n cancelSync()\n syncTimer = setTimeout(() => {\n modelValue.value = localValue.value\n syncTimer = null\n }, 300)\n }\n\n const onTextareaInput = () => {\n localValue.value = textareaEl.value?.value ?? ''\n scheduleSync()\n }\n\n watch(modelValue, (v) => {\n if (v !== localValue.value) {\n localValue.value = v ?? ''\n nextTick(() => {\n if (textareaEl.value) {\n autosize.update(textareaEl.value)\n }\n })\n }\n })\n\n // --- Status computeds ---\n\n const isStreaming = computed(() => props.status === 'streaming')\n const isSubmitted = computed(() => props.status === 'submitted')\n const isInputDisabled = computed(\n () => isStreaming.value || isSubmitted.value,\n )\n\n // --- Validation ---\n\n const currentLength = computed(() => localValue.value.length)\n\n const isOverLimit = computed(\n () =>\n props.maxMessageLength !== undefined &&\n currentLength.value > props.maxMessageLength,\n )\n\n const isUploadingAnyFile = computed(() =>\n pendingAttachments.value.some((a) => a.state === 'uploading'),\n )\n\n const isSubmitEnabled = computed(() => {\n if (\n isInputDisabled.value ||\n isUploadingAnyFile.value ||\n isOverLimit.value\n ) {\n return false\n }\n return localValue.value.trim().length > 0\n })\n\n // --- File upload ---\n\n const hasCaptureSupport = 'capture' in document.createElement('input')\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 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 input.value = ''\n }\n\n // --- Attachments ---\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 // --- Drag & drop ---\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\n // --- Dismissable notice ---\n\n const isDismissableNoticeVisible = ref(true)\n const closeDismissableNotice = () => {\n isDismissableNoticeVisible.value = false\n }\n\n // --- Submit ---\n\n const handleSubmit = () => {\n if (!isSubmitEnabled.value) {\n return\n }\n flushSync()\n emit('submit')\n }\n\n // --- Lifecycle ---\n\n onMounted(() => {\n if (textareaEl.value) {\n autosize(textareaEl.value)\n }\n })\n\n onBeforeUnmount(() => {\n cancelSync()\n if (textareaEl.value) {\n autosize.destroy(textareaEl.value)\n }\n for (const att of pendingAttachments.value) {\n URL.revokeObjectURL(att.localUrl)\n }\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=\"isInputDisabled\"\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=\"isInputDisabled\"\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=\"isInputDisabled\"\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=\"isInputDisabled\"\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 :value=\"localValue\"\n class=\"pk-chatbot-input__textarea\"\n name=\"message\"\n rows=\"1\"\n :placeholder\n @input=\"onTextareaInput\"\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 max-height: 200px;\n color: var(--color-word-1);\n background-color: var(--color-surface);\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 watch,\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 // --- Models & Props ---\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 // --- Template refs ---\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 // --- Input buffering (decouples typing from reactive model propagation) ---\n\n const localValue = ref(modelValue.value ?? '')\n let syncTimer: ReturnType<typeof setTimeout> | null = null\n\n const cancelSync = () => {\n if (syncTimer !== null) {\n clearTimeout(syncTimer)\n syncTimer = null\n }\n }\n\n const flushSync = () => {\n cancelSync()\n modelValue.value = localValue.value\n }\n\n const scheduleSync = () => {\n cancelSync()\n syncTimer = setTimeout(() => {\n modelValue.value = localValue.value\n syncTimer = null\n }, 300)\n }\n\n const onTextareaInput = () => {\n localValue.value = textareaEl.value?.value ?? ''\n scheduleSync()\n }\n\n watch(modelValue, (v) => {\n if (v !== localValue.value) {\n localValue.value = v ?? ''\n nextTick(() => {\n if (textareaEl.value) {\n autosize.update(textareaEl.value)\n }\n })\n }\n })\n\n // --- Status computeds ---\n\n const isStreaming = computed(() => props.status === 'streaming')\n const isSubmitted = computed(() => props.status === 'submitted')\n const isInputDisabled = computed(\n () => isStreaming.value || isSubmitted.value,\n )\n\n // --- Validation ---\n\n const currentLength = computed(() => localValue.value.length)\n\n const isOverLimit = computed(\n () =>\n props.maxMessageLength !== undefined &&\n currentLength.value > props.maxMessageLength,\n )\n\n const isUploadingAnyFile = computed(() =>\n pendingAttachments.value.some((a) => a.state === 'uploading'),\n )\n\n const isSubmitEnabled = computed(() => {\n if (\n isInputDisabled.value ||\n isUploadingAnyFile.value ||\n isOverLimit.value\n ) {\n return false\n }\n return localValue.value.trim().length > 0\n })\n\n // --- File upload ---\n\n const hasCaptureSupport = 'capture' in document.createElement('input')\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 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 input.value = ''\n }\n\n // --- Attachments ---\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 // --- Drag & drop ---\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\n // --- Dismissable notice ---\n\n const isDismissableNoticeVisible = ref(true)\n const closeDismissableNotice = () => {\n isDismissableNoticeVisible.value = false\n }\n\n // --- Submit ---\n\n const handleSubmit = () => {\n if (!isSubmitEnabled.value) {\n return\n }\n flushSync()\n emit('submit')\n }\n\n // --- Lifecycle ---\n\n onMounted(() => {\n if (textareaEl.value) {\n autosize(textareaEl.value)\n }\n })\n\n onBeforeUnmount(() => {\n cancelSync()\n if (textareaEl.value) {\n autosize.destroy(textareaEl.value)\n }\n for (const att of pendingAttachments.value) {\n URL.revokeObjectURL(att.localUrl)\n }\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=\"isInputDisabled\"\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=\"isInputDisabled\"\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=\"isInputDisabled\"\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=\"isInputDisabled\"\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 :value=\"localValue\"\n class=\"pk-chatbot-input__textarea\"\n name=\"message\"\n rows=\"1\"\n :placeholder\n @input=\"onTextareaInput\"\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 max-height: 200px;\n color: var(--color-word-1);\n background-color: var(--color-surface);\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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"}
|