@8wave/ai-elements 0.74.0 → 0.77.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 (159) hide show
  1. package/dist/_chunks/{PkStreamingMarkdown-orhL2kzD.js → PkStreamingMarkdown-COZApJzT.js} +22 -22
  2. package/dist/_chunks/PkStreamingMarkdown-COZApJzT.js.map +1 -0
  3. package/dist/_chunks/{PkToolShowArtifact-c_vCWUpQ.js → PkToolShowArtifact-BZQixk9z.js} +7 -7
  4. package/dist/_chunks/{PkToolShowArtifact-c_vCWUpQ.js.map → PkToolShowArtifact-BZQixk9z.js.map} +1 -1
  5. package/dist/_chunks/{PkToolShowCalendarEvent-D2VHu1V3.js → PkToolShowCalendarEvent-BEqn5iEb.js} +12 -12
  6. package/dist/_chunks/{PkToolShowCalendarEvent-D2VHu1V3.js.map → PkToolShowCalendarEvent-BEqn5iEb.js.map} +1 -1
  7. package/dist/_chunks/{PkToolShowComparison-C2ZUH0w4.js → PkToolShowComparison-p34r0Hhd.js} +7 -7
  8. package/dist/_chunks/{PkToolShowComparison-C2ZUH0w4.js.map → PkToolShowComparison-p34r0Hhd.js.map} +1 -1
  9. package/dist/_chunks/PkToolShowContactForm-thS7c8iL.js +1658 -0
  10. package/dist/_chunks/PkToolShowContactForm-thS7c8iL.js.map +1 -0
  11. package/dist/_chunks/{PkToolShowEmail-BuyCHUU5.js → PkToolShowEmail-Be8FvWjw.js} +11 -11
  12. package/dist/_chunks/{PkToolShowEmail-BuyCHUU5.js.map → PkToolShowEmail-Be8FvWjw.js.map} +1 -1
  13. package/dist/_chunks/{PkToolShowImageGallery-ByldZ0nj.js → PkToolShowImageGallery-DmJztS-Z.js} +5 -5
  14. package/dist/_chunks/{PkToolShowImageGallery-ByldZ0nj.js.map → PkToolShowImageGallery-DmJztS-Z.js.map} +1 -1
  15. package/dist/_chunks/{PkToolShowLocation-BCFnC5c7.js → PkToolShowLocation-DOoLCHzS.js} +9 -9
  16. package/dist/_chunks/{PkToolShowLocation-BCFnC5c7.js.map → PkToolShowLocation-DOoLCHzS.js.map} +1 -1
  17. package/dist/_chunks/{PkToolShowMessage-6Bsfi3BC.js → PkToolShowMessage-DgeULbdQ.js} +10 -10
  18. package/dist/_chunks/{PkToolShowMessage-6Bsfi3BC.js.map → PkToolShowMessage-DgeULbdQ.js.map} +1 -1
  19. package/dist/_chunks/{PkToolShowMultipleChoice-BLNTD2lK.js → PkToolShowMultipleChoice-CpGyn_bZ.js} +3 -3
  20. package/dist/_chunks/{PkToolShowMultipleChoice-BLNTD2lK.js.map → PkToolShowMultipleChoice-CpGyn_bZ.js.map} +1 -1
  21. package/dist/_chunks/{PkToolShowProductList-B4S5_m-f.js → PkToolShowProductList-DEo7XogW.js} +4 -4
  22. package/dist/_chunks/{PkToolShowProductList-B4S5_m-f.js.map → PkToolShowProductList-DEo7XogW.js.map} +1 -1
  23. package/dist/_chunks/{PkToolShowQrCode-BVZlzYDq.js → PkToolShowQrCode-UE4uSyvJ.js} +7 -7
  24. package/dist/_chunks/{PkToolShowQrCode-BVZlzYDq.js.map → PkToolShowQrCode-UE4uSyvJ.js.map} +1 -1
  25. package/dist/_chunks/{PkToolShowSources-BQo5DRwt.js → PkToolShowSources-BMXftK6O.js} +10 -9
  26. package/dist/_chunks/PkToolShowSources-BMXftK6O.js.map +1 -0
  27. package/dist/_chunks/{PkToolShowSuggestedReply-BxDI6yp_.js → PkToolShowSuggestedReply-CPAnHI0c.js} +3 -3
  28. package/dist/_chunks/{PkToolShowSuggestedReply-BxDI6yp_.js.map → PkToolShowSuggestedReply-CPAnHI0c.js.map} +1 -1
  29. package/dist/_chunks/{PkToolShowWeather-DR6egBIP.js → PkToolShowWeather-DcSUbzx0.js} +4 -4
  30. package/dist/_chunks/{PkToolShowWeather-DR6egBIP.js.map → PkToolShowWeather-DcSUbzx0.js.map} +1 -1
  31. package/dist/_chunks/{PkToolShowWebPages-D8RngE-F.js → PkToolShowWebPages-aH_GarEV.js} +5 -5
  32. package/dist/_chunks/{PkToolShowWebPages-D8RngE-F.js.map → PkToolShowWebPages-aH_GarEV.js.map} +1 -1
  33. package/dist/_chunks/{PkUrl-CI17WkYu.js → PkUrl-BHD0_pal.js} +2 -2
  34. package/dist/_chunks/{PkUrl-CI17WkYu.js.map → PkUrl-BHD0_pal.js.map} +1 -1
  35. package/dist/_chunks/{VvCheckbox.es-kmMsWlkU.js → VvCheckbox.es-ohF87NOe.js} +3 -3
  36. package/dist/_chunks/{VvCheckbox.es-kmMsWlkU.js.map → VvCheckbox.es-ohF87NOe.js.map} +1 -1
  37. package/dist/_chunks/{VvCheckboxGroup.es-BRRmuO9h.js → VvCheckboxGroup.es-DZCbyLN0.js} +109 -109
  38. package/dist/_chunks/{VvCheckboxGroup.es-BRRmuO9h.js.map → VvCheckboxGroup.es-DZCbyLN0.js.map} +1 -1
  39. package/dist/_chunks/{VvCombobox.es-pTM53Z4B.js → VvCombobox.es-YLPD7MpO.js} +256 -256
  40. package/dist/_chunks/{VvCombobox.es-pTM53Z4B.js.map → VvCombobox.es-YLPD7MpO.js.map} +1 -1
  41. package/dist/_chunks/{VvInputText.es-DO39OSWk.js → VvInputText.es-DAnAXfBO.js} +190 -190
  42. package/dist/_chunks/{VvInputText.es-DO39OSWk.js.map → VvInputText.es-DAnAXfBO.js.map} +1 -1
  43. package/dist/_chunks/{VvRadio.es-BpQAJbon.js → VvRadio.es-Do9oyNtV.js} +3 -3
  44. package/dist/_chunks/{VvRadio.es-BpQAJbon.js.map → VvRadio.es-Do9oyNtV.js.map} +1 -1
  45. package/dist/_chunks/{VvRadioGroup.es-BSBrmx9w.js → VvRadioGroup.es-BHcqcJFC.js} +11 -11
  46. package/dist/_chunks/{VvRadioGroup.es-BSBrmx9w.js.map → VvRadioGroup.es-BHcqcJFC.js.map} +1 -1
  47. package/dist/_chunks/{VvSelect.es-DALpUK5j.js → VvSelect.es-CP_y02fy.js} +8 -8
  48. package/dist/_chunks/{VvSelect.es-DALpUK5j.js.map → VvSelect.es-CP_y02fy.js.map} +1 -1
  49. package/dist/_chunks/{VvTextarea.es-C9dwYLOG.js → VvTextarea.es-DetA_2DM.js} +250 -250
  50. package/dist/_chunks/{VvTextarea.es-C9dwYLOG.js.map → VvTextarea.es-DetA_2DM.js.map} +1 -1
  51. package/dist/_chunks/{dist-DtF6poRc.js → dist-yqV26MWM.js} +132 -120
  52. package/dist/_chunks/dist-yqV26MWM.js.map +1 -0
  53. package/dist/_chunks/{esm-0nyRYwmP.js → esm-DLxNpT06.js} +7 -7
  54. package/dist/_chunks/{esm-0nyRYwmP.js.map → esm-DLxNpT06.js.map} +1 -1
  55. package/dist/_chunks/{floating-ui.vue-B5ZV-j8C.js → floating-ui.vue-tVPpNXUc.js} +3 -3
  56. package/dist/_chunks/{floating-ui.vue-B5ZV-j8C.js.map → floating-ui.vue-tVPpNXUc.js.map} +1 -1
  57. package/dist/_chunks/{iconify-C1EOwL90.js → iconify-y0w2FIJH.js} +3 -3
  58. package/dist/_chunks/{iconify-C1EOwL90.js.map → iconify-y0w2FIJH.js.map} +1 -1
  59. package/dist/_chunks/{index.es-BGFmj59S.js → index.es-7fUi-rc0.js} +452 -452
  60. package/dist/_chunks/{index.es-BGFmj59S.js.map → index.es-7fUi-rc0.js.map} +1 -1
  61. package/dist/_chunks/{schemas-Bp3a8tYV.js → schemas-aPiXCaCc.js} +1309 -945
  62. package/dist/_chunks/schemas-aPiXCaCc.js.map +1 -0
  63. package/dist/_chunks/{src-C_wl-KYN.js → src-BfoQF6Z3.js} +2 -2
  64. package/dist/_chunks/{src-C_wl-KYN.js.map → src-BfoQF6Z3.js.map} +1 -1
  65. package/dist/_chunks/{useLightbox-CH1KeVqr.js → useLightbox-DL_oVBep.js} +3 -3
  66. package/dist/_chunks/{useLightbox-CH1KeVqr.js.map → useLightbox-DL_oVBep.js.map} +1 -1
  67. package/dist/_chunks/{vue-i18n-KvYvoek4.js → vue-i18n-DAH6nDTN.js} +3 -3
  68. package/dist/_chunks/{vue-i18n-KvYvoek4.js.map → vue-i18n-DAH6nDTN.js.map} +1 -1
  69. package/dist/_chunks/{vue.runtime.esm-bundler-BmggS4HU.js → vue.runtime.esm-bundler-Dq29dQrz.js} +16 -10
  70. package/dist/_chunks/vue.runtime.esm-bundler-Dq29dQrz.js.map +1 -0
  71. package/dist/ai-elements.es.js +4637 -3428
  72. package/dist/ai-elements.es.js.map +1 -1
  73. package/dist-vue/PkChatbot.js +1 -1
  74. package/dist-vue/PkChatbotFeedbackForm.js +1 -1
  75. package/dist-vue/PkChatbotInput.js +1 -1
  76. package/dist-vue/PkChatbotMessages.js +1 -1
  77. package/dist-vue/PkChatbotViewChat.js +1 -1
  78. package/dist-vue/PkChatbotViewConversations.js +1 -1
  79. package/dist-vue/PkChatbotViewProfile.js +1 -1
  80. package/dist-vue/_chunks/{Media-Bic_vfSX.js → Media-kK7BnZGr.js} +4 -4
  81. package/dist-vue/_chunks/Media-kK7BnZGr.js.map +1 -0
  82. package/dist-vue/_chunks/{PkChatbot-woRkjgP5.js → PkChatbot-B9RSkQmJ.js} +7 -7
  83. package/dist-vue/_chunks/{PkChatbot-woRkjgP5.js.map → PkChatbot-B9RSkQmJ.js.map} +1 -1
  84. package/dist-vue/_chunks/{PkChatbotFeedbackForm-D-lx1URv.js → PkChatbotFeedbackForm-lj9CHdhn.js} +3 -3
  85. package/dist-vue/_chunks/{PkChatbotFeedbackForm-D-lx1URv.js.map → PkChatbotFeedbackForm-lj9CHdhn.js.map} +1 -1
  86. package/dist-vue/_chunks/{PkChatbotInput-LHE0HZ9z.js → PkChatbotInput-C5QSmt21.js} +2 -2
  87. package/dist-vue/_chunks/{PkChatbotInput-LHE0HZ9z.js.map → PkChatbotInput-C5QSmt21.js.map} +1 -1
  88. package/dist-vue/_chunks/{PkChatbotMessages-BxTeEm3j.js → PkChatbotMessages-DOeUT6YL.js} +7 -7
  89. package/dist-vue/_chunks/PkChatbotMessages-DOeUT6YL.js.map +1 -0
  90. package/dist-vue/_chunks/{PkChatbotViewChat-BoEfZeco.js → PkChatbotViewChat-C2FuDayB.js} +6 -6
  91. package/dist-vue/_chunks/{PkChatbotViewChat-BoEfZeco.js.map → PkChatbotViewChat-C2FuDayB.js.map} +1 -1
  92. package/dist-vue/_chunks/{PkChatbotViewConversations-DvVc1arX.js → PkChatbotViewConversations-2xc0o-fO.js} +2 -2
  93. package/dist-vue/_chunks/{PkChatbotViewConversations-DvVc1arX.js.map → PkChatbotViewConversations-2xc0o-fO.js.map} +1 -1
  94. package/dist-vue/_chunks/{PkChatbotViewProfile-Dev_6pki.js → PkChatbotViewProfile-CoT1JnMk.js} +2 -2
  95. package/dist-vue/_chunks/{PkChatbotViewProfile-Dev_6pki.js.map → PkChatbotViewProfile-CoT1JnMk.js.map} +1 -1
  96. package/dist-vue/_chunks/{PkStreamingMarkdown-B4gnJ4hk.js → PkStreamingMarkdown-BAhC3uGK.js} +20 -20
  97. package/dist-vue/_chunks/PkStreamingMarkdown-BAhC3uGK.js.map +1 -0
  98. package/dist-vue/_chunks/{PkToolShowArtifact-EvbUZSOf.js → PkToolShowArtifact-RzrDPcEQ.js} +2 -2
  99. package/dist-vue/_chunks/{PkToolShowArtifact-EvbUZSOf.js.map → PkToolShowArtifact-RzrDPcEQ.js.map} +1 -1
  100. package/dist-vue/_chunks/{PkToolShowContactForm-CsDOqSJK.js → PkToolShowContactForm-5H4jfq1F.js} +4 -4
  101. package/dist-vue/_chunks/{PkToolShowContactForm-CsDOqSJK.js.map → PkToolShowContactForm-5H4jfq1F.js.map} +1 -1
  102. package/dist-vue/_chunks/{PkToolShowSources-ZtXFkIHt.js → PkToolShowSources-Dv0uuvqS.js} +5 -4
  103. package/dist-vue/_chunks/PkToolShowSources-Dv0uuvqS.js.map +1 -0
  104. package/dist-vue/_chunks/{ZodError-Ca0wCsGp.js → ZodError-C_est8SY.js} +2 -2
  105. package/dist-vue/_chunks/{ZodError-Ca0wCsGp.js.map → ZodError-C_est8SY.js.map} +1 -1
  106. package/dist-vue/_chunks/{createChatbotApiClient-YJegM3ni.js → createChatbotApiClient-CvDRMmDa.js} +3 -3
  107. package/dist-vue/_chunks/createChatbotApiClient-CvDRMmDa.js.map +1 -0
  108. package/dist-vue/_chunks/{index.es-CrPSzhoZ.js → index.es-Dk_HaA08.js} +4 -4
  109. package/dist-vue/_chunks/{index.es-CrPSzhoZ.js.map → index.es-Dk_HaA08.js.map} +1 -1
  110. package/dist-vue/_chunks/{schemas-sa2dDEGb.js → schemas-Clx4oKCB.js} +1309 -945
  111. package/dist-vue/_chunks/schemas-Clx4oKCB.js.map +1 -0
  112. package/dist-vue/_chunks/{useChatbotStore-DGL81KJa.js → useChatbotStore-DMDbzuub.js} +1061 -1000
  113. package/dist-vue/_chunks/useChatbotStore-DMDbzuub.js.map +1 -0
  114. package/dist-vue/api.js +1 -1
  115. package/dist-vue/apps/web-component/src/composables/useChatbotAgent.d.ts +6 -6
  116. package/dist-vue/apps/web-component/src/composables/useChatbotAuth.d.ts +8 -8
  117. package/dist-vue/apps/web-component/src/lib.d.ts +29 -0
  118. package/dist-vue/apps/web-component/src/main.d.ts +0 -0
  119. package/dist-vue/apps/web-component/src/modules/applicationInsights.d.ts +38 -0
  120. package/dist-vue/composables.js +2 -2
  121. package/dist-vue/index.js +2852 -2876
  122. package/dist-vue/index.js.map +1 -1
  123. package/dist-vue/packages/auth/src/add-member-to-organization.d.ts +5 -0
  124. package/dist-vue/packages/auth/src/anonymous-reauth-plugin.d.ts +11 -0
  125. package/dist-vue/packages/auth/src/external-auth-plugin.d.ts +2 -0
  126. package/dist-vue/packages/auth/src/index.d.ts +3477 -8
  127. package/dist-vue/packages/auth/src/media-helpers.d.ts +13 -0
  128. package/dist-vue/packages/auth/src/organization-auto-join.d.ts +1 -0
  129. package/dist-vue/packages/components/src/PkEditorMarkdown.d.ts +1 -1
  130. package/dist-vue/packages/components/src/PkEditorRepeater.d.ts +2 -2
  131. package/dist-vue/packages/components/src/PkEditorWyswyg.d.ts +1 -1
  132. package/dist-vue/packages/components/src/PkFieldset.d.ts +3 -3
  133. package/dist-vue/packages/components/src/composables/index.d.ts +3 -0
  134. package/dist-vue/packages/components/src/composables/useChatbotError.d.ts +11 -11
  135. package/dist-vue/packages/composable/src/constants.d.ts +5 -0
  136. package/dist-vue/packages/composable/src/useDialog.d.ts +3 -3
  137. package/dist-vue/packages/composable/src/useSettingsStore.d.ts +4 -5
  138. package/dist-vue/packages/models/src/schema/Agent.d.ts +27 -27
  139. package/dist-vue/packages/models/src/schema/AgentEndpoint.d.ts +1 -1
  140. package/dist-vue/packages/models/src/schema/Document.d.ts +2 -0
  141. package/dist-vue/packages/models/src/schema/ReasoningChat.d.ts +5 -5
  142. package/dist-vue/packages/models/src/schema/SubAgent.d.ts +10 -10
  143. package/dist-vue/packages/models/src/schema/constants.d.ts +3 -1
  144. package/package.json +4 -4
  145. package/dist/_chunks/PkStreamingMarkdown-orhL2kzD.js.map +0 -1
  146. package/dist/_chunks/PkToolShowContactForm-6C4uWDtf.js +0 -1103
  147. package/dist/_chunks/PkToolShowContactForm-6C4uWDtf.js.map +0 -1
  148. package/dist/_chunks/PkToolShowSources-BQo5DRwt.js.map +0 -1
  149. package/dist/_chunks/dist-DtF6poRc.js.map +0 -1
  150. package/dist/_chunks/schemas-Bp3a8tYV.js.map +0 -1
  151. package/dist/_chunks/vue.runtime.esm-bundler-BmggS4HU.js.map +0 -1
  152. package/dist-vue/_chunks/Media-Bic_vfSX.js.map +0 -1
  153. package/dist-vue/_chunks/PkChatbotMessages-BxTeEm3j.js.map +0 -1
  154. package/dist-vue/_chunks/PkStreamingMarkdown-B4gnJ4hk.js.map +0 -1
  155. package/dist-vue/_chunks/PkToolShowSources-ZtXFkIHt.js.map +0 -1
  156. package/dist-vue/_chunks/createChatbotApiClient-YJegM3ni.js.map +0 -1
  157. package/dist-vue/_chunks/schemas-sa2dDEGb.js.map +0 -1
  158. package/dist-vue/_chunks/useChatbotStore-DGL81KJa.js.map +0 -1
  159. package/dist-vue/packages/composable/src/chatbot/useChatbotStore.d.ts +0 -6
@@ -1,8 +1,8 @@
1
- import { $ as e, C as t, E as n, Gt as r, O as i, Vt as a, _ as o, b as s, v as c, w as l, x as u, yt as d, z as f } from "./vue.runtime.esm-bundler-BmggS4HU.js";
2
- import { n as p } from "./vue-i18n-KvYvoek4.js";
3
- import { i as m } from "./dist-DtF6poRc.js";
4
- import { c as h, n as g, o as _, r as v, s as y } from "./index.es-BGFmj59S.js";
5
- import { n as b } from "./src-C_wl-KYN.js";
1
+ import { $ as e, C as t, E as n, Gt as r, O as i, Vt as a, _ as o, b as s, v as c, w as l, x as u, yt as d, z as f } from "./vue.runtime.esm-bundler-Dq29dQrz.js";
2
+ import { n as p } from "./vue-i18n-DAH6nDTN.js";
3
+ import { c as m, n as h, o as g, r as _, s as v } from "./index.es-7fUi-rc0.js";
4
+ import { n as y } from "./src-BfoQF6Z3.js";
5
+ import { i as b } from "./dist-yqV26MWM.js";
6
6
  //#region ../../packages/components/src/chat/PkToolShowCalendarEvent.vue?vue&type=script&setup=true&lang.ts
7
7
  var x = {
8
8
  key: 0,
@@ -21,7 +21,7 @@ var x = {
21
21
  __name: "PkToolShowCalendarEvent",
22
22
  props: { part: { type: null } },
23
23
  setup(n) {
24
- let I = n, { copy: L, copied: R } = m(), { d: z } = p(), B = o(() => I.part), V = o(() => {
24
+ let I = n, { copy: L, copied: R } = b(), { d: z } = p(), B = o(() => I.part), V = o(() => {
25
25
  let e = B.value.input;
26
26
  if (!e) return "";
27
27
  let { startDate: t, endDate: n, allDay: r } = e, i = new Date(t), a = new Date(n), o = t.slice(0, 10), s = n.slice(0, 10);
@@ -70,7 +70,7 @@ var x = {
70
70
  e.location && t.push(e.location), e.additionalInfo && t.push(e.additionalInfo), L(t.join("\n"));
71
71
  };
72
72
  return (n, o) => {
73
- let p = _, m = h, I = v, L = y, z = g;
73
+ let p = g, b = m, I = _, L = v, z = h;
74
74
  return B.value?.input ? (f(), u("div", x, [c("div", S, [
75
75
  l(p, {
76
76
  name: "ri:calendar-event-line",
@@ -81,7 +81,7 @@ var x = {
81
81
  modifiers: "compact",
82
82
  class: "ml-auto shrink-0"
83
83
  }, {
84
- default: e(() => [l(m, {
84
+ default: e(() => [l(b, {
85
85
  modifiers: "action-quiet-small",
86
86
  icon: d(R) ? "ri:check-line" : "ri:file-copy-line",
87
87
  label: d(R) ? n.$t("action.copied") : n.$t("action.copy"),
@@ -106,7 +106,7 @@ var x = {
106
106
  _: 1
107
107
  })
108
108
  ]),
109
- default: e(() => [l(m, {
109
+ default: e(() => [l(b, {
110
110
  icon: "ri:calendar-line",
111
111
  modifiers: "action-quiet-small",
112
112
  label: n.$t("action.addToCalendar")
@@ -127,8 +127,8 @@ var x = {
127
127
  }), B.value.input.location.startsWith("http") ? (f(), u("a", {
128
128
  key: 0,
129
129
  href: B.value.input.location,
130
- target: d(b)(B.value.input.location) ? void 0 : "_blank",
131
- rel: d(b)(B.value.input.location) ? void 0 : "noopener noreferrer",
130
+ target: d(y)(B.value.input.location) ? void 0 : "_blank",
131
+ rel: d(y)(B.value.input.location) ? void 0 : "noopener noreferrer",
132
132
  class: "underline truncate"
133
133
  }, r(B.value.input.location), 9, N)) : (f(), u("span", P, r(B.value.input.location), 1))])) : s("", !0),
134
134
  B.value.input.additionalInfo ? (f(), u("div", F, [l(p, {
@@ -142,4 +142,4 @@ var x = {
142
142
  //#endregion
143
143
  export { I as default };
144
144
 
145
- //# sourceMappingURL=PkToolShowCalendarEvent-D2VHu1V3.js.map
145
+ //# sourceMappingURL=PkToolShowCalendarEvent-BEqn5iEb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PkToolShowCalendarEvent-D2VHu1V3.js","names":["$t"],"sources":["../../../../packages/components/src/chat/PkToolShowCalendarEvent.vue","../../../../packages/components/src/chat/PkToolShowCalendarEvent.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useClipboard } from '@vueuse/core'\n import { isSameSite } from 'utils'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n const { d } = useI18n()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title: string\n startDate: string\n endDate: string\n location?: string\n additionalInfo?: string\n allDay?: boolean\n }\n }\n return part\n })\n\n const dateDisplay = computed(() => {\n const input = toolPart.value.input\n if (!input) {\n return ''\n }\n const { startDate, endDate, allDay } = input\n const start = new Date(startDate)\n const end = new Date(endDate)\n const startDay = startDate.slice(0, 10)\n const endDay = endDate.slice(0, 10)\n if (allDay) {\n if (startDay === endDay) {\n return d(start, 'date-medium')\n }\n return `${d(start, 'date-medium')} - ${d(end, 'date-medium')}`\n }\n if (startDay === endDay) {\n return `${d(start, 'date-time-medium')} - ${d(end, 'time')}`\n }\n return `${d(start, 'date-time-medium')} - ${d(end, 'date-time-medium')}`\n })\n\n const calendarStart = computed(() =>\n toolPart.value.input ? new Date(toolPart.value.input.startDate) : null,\n )\n\n const calendarDay = computed(\n () => calendarStart.value?.getDate().toString() ?? '',\n )\n\n const calendarMonth = computed(() =>\n calendarStart.value ? d(calendarStart.value, 'month-short') : '',\n )\n\n // Floating time: remove dashes/colons without converting to UTC\n const toIcsDateTime = (iso: string) =>\n iso.replace(/[-:]/g, '').replace(/\\.\\d{3}$/, '')\n\n const escapeIcs = (str: string) =>\n str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/;/g, '\\\\;')\n .replace(/,/g, '\\\\,')\n .replace(/\\n/g, '\\\\n')\n\n const generateIcs = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const ics = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//8wave//8bot//EN',\n 'BEGIN:VEVENT',\n `DTSTART:${toIcsDateTime(startDate)}`,\n `DTEND:${toIcsDateTime(endDate)}`,\n `SUMMARY:${escapeIcs(title)}`,\n location ? `LOCATION:${escapeIcs(location)}` : '',\n additionalInfo ? `DESCRIPTION:${escapeIcs(additionalInfo)}` : '',\n `DTSTAMP:${new Date()\n .toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\.\\d{3}/, '')}`,\n `UID:${crypto.randomUUID()}@8bot.ai`,\n 'END:VEVENT',\n 'END:VCALENDAR',\n ]\n .filter(Boolean)\n .join('\\r\\n')\n\n const blob = new Blob([ics], { type: 'text/calendar;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${title.replace(/[^a-zA-Z0-9\\s-]/g, '')}.ics`\n a.click()\n URL.revokeObjectURL(url)\n }\n\n const openGoogleCalendar = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const start = toIcsDateTime(startDate)\n const end = toIcsDateTime(endDate)\n const params = new URLSearchParams({\n action: 'TEMPLATE',\n text: title,\n dates: `${start}/${end}`,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('details', additionalInfo)\n }\n window.open(\n `https://calendar.google.com/calendar/render?${params.toString()}`,\n '_blank',\n )\n }\n\n const openOutlook = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const params = new URLSearchParams({\n subject: title,\n startdt: startDate,\n enddt: endDate,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('body', additionalInfo)\n }\n window.open(\n `https://outlook.office.com/calendar/0/action/compose?${params.toString()}`,\n '_blank',\n )\n }\n\n const copyEvent = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const lines = [input.title, dateDisplay.value]\n if (input.location) {\n lines.push(input.location)\n }\n if (input.additionalInfo) {\n lines.push(input.additionalInfo)\n }\n copy(lines.join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8\">\n <VvIcon name=\"ri:calendar-event-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{ $t('label.calendarEvent') }}</strong>\n <VvButtonGroup modifiers=\"compact\" class=\"ml-auto shrink-0\">\n <VvButton\n modifiers=\"action-quiet-small\"\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n @click=\"copyEvent\" />\n <VvDropdown\n v-bind=\"{\n placement: 'bottom-end',\n modifiers: 'menu',\n flip: true,\n offset: 3,\n }\">\n <VvButton\n icon=\"ri:calendar-line\"\n modifiers=\"action-quiet-small\"\n :label=\"$t('action.addToCalendar')\" />\n <template #items>\n <VvDropdownAction @click=\"openGoogleCalendar\">\n <VvIcon name=\"ri:google-line\" />\n Google Calendar\n </VvDropdownAction>\n <VvDropdownAction @click=\"openOutlook\">\n <VvIcon name=\"ri:microsoft-line\" />\n Outlook\n </VvDropdownAction>\n <VvDropdownAction @click=\"generateIcs\">\n <VvIcon name=\"ri:download-line\" />\n {{ $t('action.downloadIcs') }}\n </VvDropdownAction>\n </template>\n </VvDropdown>\n </VvButtonGroup>\n </div>\n <div class=\"p-sm flex gap-sm items-start\">\n <div\n class=\"shrink-0 w-44 rounded-lg overflow-hidden border border-surface-3 text-center select-none\">\n <div\n class=\"bg-brand px-8 py-2 text-white text-10 font-bold uppercase tracking-wide\">\n {{ calendarMonth }}\n </div>\n <div\n class=\"bg-surface-1 py-4 text-word-1 text-24 font-bold leading-none\">\n {{ calendarDay }}\n </div>\n </div>\n <div class=\"flex flex-col gap-4 min-w-0\">\n <p class=\"font-semibold text-word-1 text-14\">\n {{ toolPart.input.title }}\n </p>\n <div class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:time-line\" class=\"text-14 shrink-0\" />\n <time :datetime=\"toolPart.input.startDate\">{{\n dateDisplay\n }}</time>\n </div>\n <div\n v-if=\"toolPart.input.location\"\n class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:map-pin-line\" class=\"text-14 shrink-0\" />\n <a\n v-if=\"toolPart.input.location.startsWith('http')\"\n :href=\"toolPart.input.location\"\n :target=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : '_blank'\n \"\n :rel=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : 'noopener noreferrer'\n \"\n class=\"underline truncate\">\n {{ toolPart.input.location }}\n </a>\n <span v-else>{{ toolPart.input.location }}</span>\n </div>\n <div\n v-if=\"toolPart.input.additionalInfo\"\n class=\"flex items-start gap-8 text-12 text-word-3\">\n <VvIcon\n name=\"ri:sticky-note-line\"\n class=\"text-14 shrink-0 mt-1\" />\n <span>{{ toolPart.input.additionalInfo }}</span>\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useClipboard } from '@vueuse/core'\n import { isSameSite } from 'utils'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n const { d } = useI18n()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title: string\n startDate: string\n endDate: string\n location?: string\n additionalInfo?: string\n allDay?: boolean\n }\n }\n return part\n })\n\n const dateDisplay = computed(() => {\n const input = toolPart.value.input\n if (!input) {\n return ''\n }\n const { startDate, endDate, allDay } = input\n const start = new Date(startDate)\n const end = new Date(endDate)\n const startDay = startDate.slice(0, 10)\n const endDay = endDate.slice(0, 10)\n if (allDay) {\n if (startDay === endDay) {\n return d(start, 'date-medium')\n }\n return `${d(start, 'date-medium')} - ${d(end, 'date-medium')}`\n }\n if (startDay === endDay) {\n return `${d(start, 'date-time-medium')} - ${d(end, 'time')}`\n }\n return `${d(start, 'date-time-medium')} - ${d(end, 'date-time-medium')}`\n })\n\n const calendarStart = computed(() =>\n toolPart.value.input ? new Date(toolPart.value.input.startDate) : null,\n )\n\n const calendarDay = computed(\n () => calendarStart.value?.getDate().toString() ?? '',\n )\n\n const calendarMonth = computed(() =>\n calendarStart.value ? d(calendarStart.value, 'month-short') : '',\n )\n\n // Floating time: remove dashes/colons without converting to UTC\n const toIcsDateTime = (iso: string) =>\n iso.replace(/[-:]/g, '').replace(/\\.\\d{3}$/, '')\n\n const escapeIcs = (str: string) =>\n str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/;/g, '\\\\;')\n .replace(/,/g, '\\\\,')\n .replace(/\\n/g, '\\\\n')\n\n const generateIcs = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const ics = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//8wave//8bot//EN',\n 'BEGIN:VEVENT',\n `DTSTART:${toIcsDateTime(startDate)}`,\n `DTEND:${toIcsDateTime(endDate)}`,\n `SUMMARY:${escapeIcs(title)}`,\n location ? `LOCATION:${escapeIcs(location)}` : '',\n additionalInfo ? `DESCRIPTION:${escapeIcs(additionalInfo)}` : '',\n `DTSTAMP:${new Date()\n .toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\.\\d{3}/, '')}`,\n `UID:${crypto.randomUUID()}@8bot.ai`,\n 'END:VEVENT',\n 'END:VCALENDAR',\n ]\n .filter(Boolean)\n .join('\\r\\n')\n\n const blob = new Blob([ics], { type: 'text/calendar;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${title.replace(/[^a-zA-Z0-9\\s-]/g, '')}.ics`\n a.click()\n URL.revokeObjectURL(url)\n }\n\n const openGoogleCalendar = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const start = toIcsDateTime(startDate)\n const end = toIcsDateTime(endDate)\n const params = new URLSearchParams({\n action: 'TEMPLATE',\n text: title,\n dates: `${start}/${end}`,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('details', additionalInfo)\n }\n window.open(\n `https://calendar.google.com/calendar/render?${params.toString()}`,\n '_blank',\n )\n }\n\n const openOutlook = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const params = new URLSearchParams({\n subject: title,\n startdt: startDate,\n enddt: endDate,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('body', additionalInfo)\n }\n window.open(\n `https://outlook.office.com/calendar/0/action/compose?${params.toString()}`,\n '_blank',\n )\n }\n\n const copyEvent = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const lines = [input.title, dateDisplay.value]\n if (input.location) {\n lines.push(input.location)\n }\n if (input.additionalInfo) {\n lines.push(input.additionalInfo)\n }\n copy(lines.join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8\">\n <VvIcon name=\"ri:calendar-event-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{ $t('label.calendarEvent') }}</strong>\n <VvButtonGroup modifiers=\"compact\" class=\"ml-auto shrink-0\">\n <VvButton\n modifiers=\"action-quiet-small\"\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n @click=\"copyEvent\" />\n <VvDropdown\n v-bind=\"{\n placement: 'bottom-end',\n modifiers: 'menu',\n flip: true,\n offset: 3,\n }\">\n <VvButton\n icon=\"ri:calendar-line\"\n modifiers=\"action-quiet-small\"\n :label=\"$t('action.addToCalendar')\" />\n <template #items>\n <VvDropdownAction @click=\"openGoogleCalendar\">\n <VvIcon name=\"ri:google-line\" />\n Google Calendar\n </VvDropdownAction>\n <VvDropdownAction @click=\"openOutlook\">\n <VvIcon name=\"ri:microsoft-line\" />\n Outlook\n </VvDropdownAction>\n <VvDropdownAction @click=\"generateIcs\">\n <VvIcon name=\"ri:download-line\" />\n {{ $t('action.downloadIcs') }}\n </VvDropdownAction>\n </template>\n </VvDropdown>\n </VvButtonGroup>\n </div>\n <div class=\"p-sm flex gap-sm items-start\">\n <div\n class=\"shrink-0 w-44 rounded-lg overflow-hidden border border-surface-3 text-center select-none\">\n <div\n class=\"bg-brand px-8 py-2 text-white text-10 font-bold uppercase tracking-wide\">\n {{ calendarMonth }}\n </div>\n <div\n class=\"bg-surface-1 py-4 text-word-1 text-24 font-bold leading-none\">\n {{ calendarDay }}\n </div>\n </div>\n <div class=\"flex flex-col gap-4 min-w-0\">\n <p class=\"font-semibold text-word-1 text-14\">\n {{ toolPart.input.title }}\n </p>\n <div class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:time-line\" class=\"text-14 shrink-0\" />\n <time :datetime=\"toolPart.input.startDate\">{{\n dateDisplay\n }}</time>\n </div>\n <div\n v-if=\"toolPart.input.location\"\n class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:map-pin-line\" class=\"text-14 shrink-0\" />\n <a\n v-if=\"toolPart.input.location.startsWith('http')\"\n :href=\"toolPart.input.location\"\n :target=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : '_blank'\n \"\n :rel=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : 'noopener noreferrer'\n \"\n class=\"underline truncate\">\n {{ toolPart.input.location }}\n </a>\n <span v-else>{{ toolPart.input.location }}</span>\n </div>\n <div\n v-if=\"toolPart.input.additionalInfo\"\n class=\"flex items-start gap-8 text-12 text-word-3\">\n <VvIcon\n name=\"ri:sticky-note-line\"\n class=\"text-14 shrink-0 mt-1\" />\n <span>{{ toolPart.input.additionalInfo }}</span>\n </div>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"PkToolShowCalendarEvent-BEqn5iEb.js","names":["$t"],"sources":["../../../../packages/components/src/chat/PkToolShowCalendarEvent.vue","../../../../packages/components/src/chat/PkToolShowCalendarEvent.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useClipboard } from '@vueuse/core'\n import { isSameSite } from 'utils'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n const { d } = useI18n()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title: string\n startDate: string\n endDate: string\n location?: string\n additionalInfo?: string\n allDay?: boolean\n }\n }\n return part\n })\n\n const dateDisplay = computed(() => {\n const input = toolPart.value.input\n if (!input) {\n return ''\n }\n const { startDate, endDate, allDay } = input\n const start = new Date(startDate)\n const end = new Date(endDate)\n const startDay = startDate.slice(0, 10)\n const endDay = endDate.slice(0, 10)\n if (allDay) {\n if (startDay === endDay) {\n return d(start, 'date-medium')\n }\n return `${d(start, 'date-medium')} - ${d(end, 'date-medium')}`\n }\n if (startDay === endDay) {\n return `${d(start, 'date-time-medium')} - ${d(end, 'time')}`\n }\n return `${d(start, 'date-time-medium')} - ${d(end, 'date-time-medium')}`\n })\n\n const calendarStart = computed(() =>\n toolPart.value.input ? new Date(toolPart.value.input.startDate) : null,\n )\n\n const calendarDay = computed(\n () => calendarStart.value?.getDate().toString() ?? '',\n )\n\n const calendarMonth = computed(() =>\n calendarStart.value ? d(calendarStart.value, 'month-short') : '',\n )\n\n // Floating time: remove dashes/colons without converting to UTC\n const toIcsDateTime = (iso: string) =>\n iso.replace(/[-:]/g, '').replace(/\\.\\d{3}$/, '')\n\n const escapeIcs = (str: string) =>\n str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/;/g, '\\\\;')\n .replace(/,/g, '\\\\,')\n .replace(/\\n/g, '\\\\n')\n\n const generateIcs = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const ics = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//8wave//8bot//EN',\n 'BEGIN:VEVENT',\n `DTSTART:${toIcsDateTime(startDate)}`,\n `DTEND:${toIcsDateTime(endDate)}`,\n `SUMMARY:${escapeIcs(title)}`,\n location ? `LOCATION:${escapeIcs(location)}` : '',\n additionalInfo ? `DESCRIPTION:${escapeIcs(additionalInfo)}` : '',\n `DTSTAMP:${new Date()\n .toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\.\\d{3}/, '')}`,\n `UID:${crypto.randomUUID()}@8bot.ai`,\n 'END:VEVENT',\n 'END:VCALENDAR',\n ]\n .filter(Boolean)\n .join('\\r\\n')\n\n const blob = new Blob([ics], { type: 'text/calendar;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${title.replace(/[^a-zA-Z0-9\\s-]/g, '')}.ics`\n a.click()\n URL.revokeObjectURL(url)\n }\n\n const openGoogleCalendar = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const start = toIcsDateTime(startDate)\n const end = toIcsDateTime(endDate)\n const params = new URLSearchParams({\n action: 'TEMPLATE',\n text: title,\n dates: `${start}/${end}`,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('details', additionalInfo)\n }\n window.open(\n `https://calendar.google.com/calendar/render?${params.toString()}`,\n '_blank',\n )\n }\n\n const openOutlook = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const params = new URLSearchParams({\n subject: title,\n startdt: startDate,\n enddt: endDate,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('body', additionalInfo)\n }\n window.open(\n `https://outlook.office.com/calendar/0/action/compose?${params.toString()}`,\n '_blank',\n )\n }\n\n const copyEvent = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const lines = [input.title, dateDisplay.value]\n if (input.location) {\n lines.push(input.location)\n }\n if (input.additionalInfo) {\n lines.push(input.additionalInfo)\n }\n copy(lines.join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8\">\n <VvIcon name=\"ri:calendar-event-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{ $t('label.calendarEvent') }}</strong>\n <VvButtonGroup modifiers=\"compact\" class=\"ml-auto shrink-0\">\n <VvButton\n modifiers=\"action-quiet-small\"\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n @click=\"copyEvent\" />\n <VvDropdown\n v-bind=\"{\n placement: 'bottom-end',\n modifiers: 'menu',\n flip: true,\n offset: 3,\n }\">\n <VvButton\n icon=\"ri:calendar-line\"\n modifiers=\"action-quiet-small\"\n :label=\"$t('action.addToCalendar')\" />\n <template #items>\n <VvDropdownAction @click=\"openGoogleCalendar\">\n <VvIcon name=\"ri:google-line\" />\n Google Calendar\n </VvDropdownAction>\n <VvDropdownAction @click=\"openOutlook\">\n <VvIcon name=\"ri:microsoft-line\" />\n Outlook\n </VvDropdownAction>\n <VvDropdownAction @click=\"generateIcs\">\n <VvIcon name=\"ri:download-line\" />\n {{ $t('action.downloadIcs') }}\n </VvDropdownAction>\n </template>\n </VvDropdown>\n </VvButtonGroup>\n </div>\n <div class=\"p-sm flex gap-sm items-start\">\n <div\n class=\"shrink-0 w-44 rounded-lg overflow-hidden border border-surface-3 text-center select-none\">\n <div\n class=\"bg-brand px-8 py-2 text-white text-10 font-bold uppercase tracking-wide\">\n {{ calendarMonth }}\n </div>\n <div\n class=\"bg-surface-1 py-4 text-word-1 text-24 font-bold leading-none\">\n {{ calendarDay }}\n </div>\n </div>\n <div class=\"flex flex-col gap-4 min-w-0\">\n <p class=\"font-semibold text-word-1 text-14\">\n {{ toolPart.input.title }}\n </p>\n <div class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:time-line\" class=\"text-14 shrink-0\" />\n <time :datetime=\"toolPart.input.startDate\">{{\n dateDisplay\n }}</time>\n </div>\n <div\n v-if=\"toolPart.input.location\"\n class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:map-pin-line\" class=\"text-14 shrink-0\" />\n <a\n v-if=\"toolPart.input.location.startsWith('http')\"\n :href=\"toolPart.input.location\"\n :target=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : '_blank'\n \"\n :rel=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : 'noopener noreferrer'\n \"\n class=\"underline truncate\">\n {{ toolPart.input.location }}\n </a>\n <span v-else>{{ toolPart.input.location }}</span>\n </div>\n <div\n v-if=\"toolPart.input.additionalInfo\"\n class=\"flex items-start gap-8 text-12 text-word-3\">\n <VvIcon\n name=\"ri:sticky-note-line\"\n class=\"text-14 shrink-0 mt-1\" />\n <span>{{ toolPart.input.additionalInfo }}</span>\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useClipboard } from '@vueuse/core'\n import { isSameSite } from 'utils'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n const { d } = useI18n()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title: string\n startDate: string\n endDate: string\n location?: string\n additionalInfo?: string\n allDay?: boolean\n }\n }\n return part\n })\n\n const dateDisplay = computed(() => {\n const input = toolPart.value.input\n if (!input) {\n return ''\n }\n const { startDate, endDate, allDay } = input\n const start = new Date(startDate)\n const end = new Date(endDate)\n const startDay = startDate.slice(0, 10)\n const endDay = endDate.slice(0, 10)\n if (allDay) {\n if (startDay === endDay) {\n return d(start, 'date-medium')\n }\n return `${d(start, 'date-medium')} - ${d(end, 'date-medium')}`\n }\n if (startDay === endDay) {\n return `${d(start, 'date-time-medium')} - ${d(end, 'time')}`\n }\n return `${d(start, 'date-time-medium')} - ${d(end, 'date-time-medium')}`\n })\n\n const calendarStart = computed(() =>\n toolPart.value.input ? new Date(toolPart.value.input.startDate) : null,\n )\n\n const calendarDay = computed(\n () => calendarStart.value?.getDate().toString() ?? '',\n )\n\n const calendarMonth = computed(() =>\n calendarStart.value ? d(calendarStart.value, 'month-short') : '',\n )\n\n // Floating time: remove dashes/colons without converting to UTC\n const toIcsDateTime = (iso: string) =>\n iso.replace(/[-:]/g, '').replace(/\\.\\d{3}$/, '')\n\n const escapeIcs = (str: string) =>\n str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/;/g, '\\\\;')\n .replace(/,/g, '\\\\,')\n .replace(/\\n/g, '\\\\n')\n\n const generateIcs = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const ics = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//8wave//8bot//EN',\n 'BEGIN:VEVENT',\n `DTSTART:${toIcsDateTime(startDate)}`,\n `DTEND:${toIcsDateTime(endDate)}`,\n `SUMMARY:${escapeIcs(title)}`,\n location ? `LOCATION:${escapeIcs(location)}` : '',\n additionalInfo ? `DESCRIPTION:${escapeIcs(additionalInfo)}` : '',\n `DTSTAMP:${new Date()\n .toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\.\\d{3}/, '')}`,\n `UID:${crypto.randomUUID()}@8bot.ai`,\n 'END:VEVENT',\n 'END:VCALENDAR',\n ]\n .filter(Boolean)\n .join('\\r\\n')\n\n const blob = new Blob([ics], { type: 'text/calendar;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${title.replace(/[^a-zA-Z0-9\\s-]/g, '')}.ics`\n a.click()\n URL.revokeObjectURL(url)\n }\n\n const openGoogleCalendar = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const start = toIcsDateTime(startDate)\n const end = toIcsDateTime(endDate)\n const params = new URLSearchParams({\n action: 'TEMPLATE',\n text: title,\n dates: `${start}/${end}`,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('details', additionalInfo)\n }\n window.open(\n `https://calendar.google.com/calendar/render?${params.toString()}`,\n '_blank',\n )\n }\n\n const openOutlook = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const params = new URLSearchParams({\n subject: title,\n startdt: startDate,\n enddt: endDate,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('body', additionalInfo)\n }\n window.open(\n `https://outlook.office.com/calendar/0/action/compose?${params.toString()}`,\n '_blank',\n )\n }\n\n const copyEvent = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const lines = [input.title, dateDisplay.value]\n if (input.location) {\n lines.push(input.location)\n }\n if (input.additionalInfo) {\n lines.push(input.additionalInfo)\n }\n copy(lines.join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8\">\n <VvIcon name=\"ri:calendar-event-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{ $t('label.calendarEvent') }}</strong>\n <VvButtonGroup modifiers=\"compact\" class=\"ml-auto shrink-0\">\n <VvButton\n modifiers=\"action-quiet-small\"\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n @click=\"copyEvent\" />\n <VvDropdown\n v-bind=\"{\n placement: 'bottom-end',\n modifiers: 'menu',\n flip: true,\n offset: 3,\n }\">\n <VvButton\n icon=\"ri:calendar-line\"\n modifiers=\"action-quiet-small\"\n :label=\"$t('action.addToCalendar')\" />\n <template #items>\n <VvDropdownAction @click=\"openGoogleCalendar\">\n <VvIcon name=\"ri:google-line\" />\n Google Calendar\n </VvDropdownAction>\n <VvDropdownAction @click=\"openOutlook\">\n <VvIcon name=\"ri:microsoft-line\" />\n Outlook\n </VvDropdownAction>\n <VvDropdownAction @click=\"generateIcs\">\n <VvIcon name=\"ri:download-line\" />\n {{ $t('action.downloadIcs') }}\n </VvDropdownAction>\n </template>\n </VvDropdown>\n </VvButtonGroup>\n </div>\n <div class=\"p-sm flex gap-sm items-start\">\n <div\n class=\"shrink-0 w-44 rounded-lg overflow-hidden border border-surface-3 text-center select-none\">\n <div\n class=\"bg-brand px-8 py-2 text-white text-10 font-bold uppercase tracking-wide\">\n {{ calendarMonth }}\n </div>\n <div\n class=\"bg-surface-1 py-4 text-word-1 text-24 font-bold leading-none\">\n {{ calendarDay }}\n </div>\n </div>\n <div class=\"flex flex-col gap-4 min-w-0\">\n <p class=\"font-semibold text-word-1 text-14\">\n {{ toolPart.input.title }}\n </p>\n <div class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:time-line\" class=\"text-14 shrink-0\" />\n <time :datetime=\"toolPart.input.startDate\">{{\n dateDisplay\n }}</time>\n </div>\n <div\n v-if=\"toolPart.input.location\"\n class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:map-pin-line\" class=\"text-14 shrink-0\" />\n <a\n v-if=\"toolPart.input.location.startsWith('http')\"\n :href=\"toolPart.input.location\"\n :target=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : '_blank'\n \"\n :rel=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : 'noopener noreferrer'\n \"\n class=\"underline truncate\">\n {{ toolPart.input.location }}\n </a>\n <span v-else>{{ toolPart.input.location }}</span>\n </div>\n <div\n v-if=\"toolPart.input.additionalInfo\"\n class=\"flex items-start gap-8 text-12 text-word-3\">\n <VvIcon\n name=\"ri:sticky-note-line\"\n class=\"text-14 shrink-0 mt-1\" />\n <span>{{ toolPart.input.additionalInfo }}</span>\n </div>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;EAMI,IAAM,IAAQ,GAIR,EAAE,SAAM,cAAW,GAAa,EAChC,EAAE,SAAM,GAAQ,EAEhB,IAAW,QACA,EAAM,KAWtB,EAEK,IAAc,QAAe;GAC/B,IAAM,IAAQ,EAAS,MAAM;AAC7B,OAAI,CAAC,EACD,QAAO;GAEX,IAAM,EAAE,cAAW,YAAS,cAAW,GACjC,IAAQ,IAAI,KAAK,EAAS,EAC1B,IAAM,IAAI,KAAK,EAAO,EACtB,IAAW,EAAU,MAAM,GAAG,GAAE,EAChC,IAAS,EAAQ,MAAM,GAAG,GAAE;AAUlC,UATI,IACI,MAAa,IACN,EAAE,GAAO,cAAa,GAE1B,GAAG,EAAE,GAAO,cAAc,CAAC,KAAK,EAAE,GAAK,cAAc,KAE5D,MAAa,IACN,GAAG,EAAE,GAAO,mBAAmB,CAAC,KAAK,EAAE,GAAK,OAAO,KAEvD,GAAG,EAAE,GAAO,mBAAmB,CAAC,KAAK,EAAE,GAAK,mBAAmB;IACzE,EAEK,IAAgB,QAClB,EAAS,MAAM,QAAQ,IAAI,KAAK,EAAS,MAAM,MAAM,UAAU,GAAG,KACtE,EAEM,IAAc,QACV,EAAc,OAAO,SAAS,CAAC,UAAU,IAAI,GACvD,EAEM,IAAgB,QAClB,EAAc,QAAQ,EAAE,EAAc,OAAO,cAAc,GAAG,GAClE,EAGM,KAAiB,MACnB,EAAI,QAAQ,SAAS,GAAG,CAAC,QAAQ,YAAY,GAAE,EAE7C,KAAa,MACf,EACK,QAAQ,OAAO,OAAM,CACrB,QAAQ,MAAM,MAAK,CACnB,QAAQ,MAAM,MAAK,CACnB,QAAQ,OAAO,MAAK,EAEvB,UAAoB;GACtB,IAAM,IAAQ,EAAS,MAAM;AAC7B,OAAI,CAAC,EACD;GAEJ,IAAM,EAAE,UAAO,cAAW,YAAS,aAAU,sBAAmB,GAC1D,IAAM;IACR;IACA;IACA;IACA;IACA,WAAW,EAAc,EAAU;IACnC,SAAS,EAAc,EAAQ;IAC/B,WAAW,EAAU,EAAM;IAC3B,IAAW,YAAY,EAAU,EAAS,KAAK;IAC/C,IAAiB,eAAe,EAAU,EAAe,KAAK;IAC9D,4BAAW,IAAI,MAAK,EACf,aAAY,CACZ,QAAQ,SAAS,GAAE,CACnB,QAAQ,WAAW,GAAG;IAC3B,OAAO,OAAO,YAAY,CAAC;IAC3B;IACA;IACJ,CACK,OAAO,QAAO,CACd,KAAK,OAAM,EAEV,IAAO,IAAI,KAAK,CAAC,EAAI,EAAE,EAAE,MAAM,+BAA+B,CAAA,EAC9D,IAAM,IAAI,gBAAgB,EAAI,EAC9B,IAAI,SAAS,cAAc,IAAG;AAIpC,GAHA,EAAE,OAAO,GACT,EAAE,WAAW,GAAG,EAAM,QAAQ,oBAAoB,GAAG,CAAC,OACtD,EAAE,OAAM,EACR,IAAI,gBAAgB,EAAG;KAGrB,UAA2B;GAC7B,IAAM,IAAQ,EAAS,MAAM;AAC7B,OAAI,CAAC,EACD;GAEJ,IAAM,EAAE,UAAO,cAAW,YAAS,aAAU,sBAAmB,GAC1D,IAAQ,EAAc,EAAS,EAC/B,IAAM,EAAc,EAAO,EAC3B,IAAS,IAAI,gBAAgB;IAC/B,QAAQ;IACR,MAAM;IACN,OAAO,GAAG,EAAM,GAAG;IACtB,CAAA;AAOD,GANI,KACA,EAAO,IAAI,YAAY,EAAQ,EAE/B,KACA,EAAO,IAAI,WAAW,EAAc,EAExC,OAAO,KACH,+CAA+C,EAAO,UAAU,IAChE,SACJ;KAGE,UAAoB;GACtB,IAAM,IAAQ,EAAS,MAAM;AAC7B,OAAI,CAAC,EACD;GAEJ,IAAM,EAAE,UAAO,cAAW,YAAS,aAAU,sBAAmB,GAC1D,IAAS,IAAI,gBAAgB;IAC/B,SAAS;IACT,SAAS;IACT,OAAO;IACV,CAAA;AAOD,GANI,KACA,EAAO,IAAI,YAAY,EAAQ,EAE/B,KACA,EAAO,IAAI,QAAQ,EAAc,EAErC,OAAO,KACH,wDAAwD,EAAO,UAAU,IACzE,SACJ;KAGE,UAAkB;GACpB,IAAM,IAAQ,EAAS,MAAM;AAC7B,OAAI,CAAC,EACD;GAEJ,IAAM,IAAQ,CAAC,EAAM,OAAO,EAAY,MAAK;AAO7C,GANI,EAAM,YACN,EAAM,KAAK,EAAM,SAAQ,EAEzB,EAAM,kBACN,EAAM,KAAK,EAAM,eAAc,EAEnC,EAAK,EAAM,KAAK,KAAK,CAAA;;;;UAMf,EAAA,OAAU,SAAA,GAAA,EADpB,EA+FM,OA/FN,GA+FM,CA5FF,EAqCM,OArCN,GAqCM;IAnCF,EAAwD,GAAA;KAAhD,MAAK;KAAyB,OAAM;;IAC5C,EAAkE,UAAlE,GAAkE,EAArCA,EAAAA,GAAE,sBAAA,CAAA,EAAA,EAAA;IAC/B,EAgCgB,GAAA;KAhCD,WAAU;KAAU,OAAM;;sBAKZ,CAJzB,EAIyB,GAAA;MAHrB,WAAU;MACT,MAAM,EAAA,EAAM,GAAA,kBAAA;MACZ,OAAO,EAAA,EAAM,GAAGA,EAAAA,GAAE,gBAAA,GAAoBA,EAAAA,GAAE,cAAA;MACxC,SAAO;qCACZ,EAyBa,GAAA,EAAA,EAxBD;;;;;MAKP,CAAA,CAAA,EAAA;MAKU,OAAK,QAIO;OAHnB,EAGmB,GAAA,EAHA,SAAO,GAAkB,EAAA;yBACR,CAAhC,EAAgC,GAAA,EAAxB,MAAK,kBAAgB,CAAA,EAAA,AAAA,EAAA,OAAA,EAAG,qBAEpC,GAAA,CAAA,CAAA;;;OACA,EAGmB,GAAA,EAHA,SAAO,GAAW,EAAA;yBACE,CAAnC,EAAmC,GAAA,EAA3B,MAAK,qBAAmB,CAAA,EAAA,AAAA,EAAA,OAAA,EAAG,aAEvC,GAAA,CAAA,CAAA;;;OACA,EAGmB,GAAA,EAHA,SAAO,GAAW,EAAA;yBACC,CAAlC,EAAkC,GAAA,EAA1B,MAAK,oBAAkB,CAAA,EAAA,EAAG,MAClC,EAAGA,EAAAA,GAAE,qBAAA,CAAA,EAAA,EAAA,CAAA,CAAA;;;;uBAZ6B,CAH1C,EAG0C,GAAA;OAFtC,MAAK;OACL,WAAU;OACT,OAAOA,EAAAA,GAAE,uBAAA;;;;;;OAkB1B,EAqDM,OArDN,GAqDM,CApDF,EAUM,OAVN,GAUM,CARF,EAGM,OAHN,GAGM,EADC,EAAA,MAAa,EAAA,EAAA,EAEpB,EAGM,OAHN,GAGM,EADC,EAAA,MAAW,EAAA,EAAA,CAAA,CAAA,EAGtB,EAwCM,OAxCN,GAwCM;IAvCF,EAEI,KAFJ,GAEI,EADG,EAAA,MAAS,MAAM,MAAK,EAAA,EAAA;IAE3B,EAKM,OALN,GAKM,CAJF,EAAuD,GAAA;KAA/C,MAAK;KAAe,OAAM;QAClC,EAES,QAAA,EAFF,UAAU,EAAA,MAAS,MAAM,WAAA,EAAA,EAC5B,EAAA,MAAW,EAAA,GAAA,EAAA,CAAA,CAAA;IAIT,EAAA,MAAS,MAAM,YAAA,GAAA,EADzB,EAqBM,OArBN,GAqBM,CAlBF,EAA0D,GAAA;KAAlD,MAAK;KAAkB,OAAM;QAE3B,EAAA,MAAS,MAAM,SAAS,WAAU,OAAA,IAAA,GAAA,EAD5C,EAeI,KAAA;;KAbC,MAAM,EAAA,MAAS,MAAM;KACrB,QAAqC,EAAA,EAAU,CAAC,EAAA,MAAS,MAAM,SAAQ,GAAoC,KAAA,IAAA;KAK3G,KAAkC,EAAA,EAAU,CAAC,EAAA,MAAS,MAAM,SAAQ,GAAoC,KAAA,IAAA;KAKzG,OAAM;SACH,EAAA,MAAS,MAAM,SAAQ,EAAA,GAAA,EAAA,KAAA,GAAA,EAE9B,EAAiD,QAAA,GAAA,EAAjC,EAAA,MAAS,MAAM,SAAQ,EAAA,EAAA,EAAA,CAAA,IAAA,EAAA,IAAA,GAAA;IAGjC,EAAA,MAAS,MAAM,kBAAA,GAAA,EADzB,EAOM,OAPN,GAOM,CAJF,EAEoC,GAAA;KADhC,MAAK;KACL,OAAM;QACV,EAAgD,QAAA,MAAA,EAAvC,EAAA,MAAS,MAAM,eAAc,EAAA,EAAA,CAAA,CAAA,IAAA,EAAA,IAAA,GAAA"}
@@ -1,6 +1,6 @@
1
- import { $ as e, Bt as t, C as n, E as r, Gt as i, V as a, _ as o, b as s, h as c, v as l, w as u, x as d, yt as f, z as p } from "./vue.runtime.esm-bundler-BmggS4HU.js";
2
- import { i as m } from "./dist-DtF6poRc.js";
3
- import { c as h, n as g, o as _ } from "./index.es-BGFmj59S.js";
1
+ import { $ as e, Bt as t, C as n, E as r, Gt as i, V as a, _ as o, b as s, h as c, v as l, w as u, x as d, yt as f, z as p } from "./vue.runtime.esm-bundler-Dq29dQrz.js";
2
+ import { c as m, n as h, o as g } from "./index.es-7fUi-rc0.js";
3
+ import { i as _ } from "./dist-yqV26MWM.js";
4
4
  //#region ../../packages/components/src/chat/PkToolShowComparison.vue?vue&type=script&setup=true&lang.ts
5
5
  var v = {
6
6
  key: 0,
@@ -12,7 +12,7 @@ var v = {
12
12
  __name: "PkToolShowComparison",
13
13
  props: { part: { type: null } },
14
14
  setup(r) {
15
- let w = r, { copy: T, copied: E } = m(), D = o(() => w.part), O = o(() => {
15
+ let w = r, { copy: T, copied: E } = _(), D = o(() => w.part), O = o(() => {
16
16
  let e = D.value.input?.items;
17
17
  return !e || e.length === 0 ? [] : Object.keys(e[0].values);
18
18
  }), k = () => {
@@ -20,9 +20,9 @@ var v = {
20
20
  e && T([["", ...e.map((e) => e.name)].join(" "), ...O.value.map((t) => [t.replace(/_/g, " "), ...e.map((e) => e.values[t] ?? "")].join(" "))].join("\n"));
21
21
  };
22
22
  return (r, o) => {
23
- let m = _, w = h, T = g;
23
+ let _ = g, w = m, T = h;
24
24
  return D.value?.input?.items?.length ? (p(), d("div", v, [l("div", y, [
25
- u(m, {
25
+ u(_, {
26
26
  name: "ri:scales-line",
27
27
  class: "text-16"
28
28
  }),
@@ -61,4 +61,4 @@ var v = {
61
61
  //#endregion
62
62
  export { w as default };
63
63
 
64
- //# sourceMappingURL=PkToolShowComparison-C2ZUH0w4.js.map
64
+ //# sourceMappingURL=PkToolShowComparison-p34r0Hhd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PkToolShowComparison-C2ZUH0w4.js","names":["$t"],"sources":["../../../../packages/components/src/chat/PkToolShowComparison.vue","../../../../packages/components/src/chat/PkToolShowComparison.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useClipboard } from '@vueuse/core'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title?: string\n items: Array<{\n name: string\n values: Record<string, string>\n highlighted?: boolean\n }>\n }\n }\n return part\n })\n\n const features = computed(() => {\n const items = toolPart.value.input?.items\n if (!items || items.length === 0) {\n return []\n }\n return Object.keys(items[0].values)\n })\n\n const copyTable = () => {\n const items = toolPart.value.input?.items\n if (!items) {\n return\n }\n const header = ['', ...items.map((i) => i.name)].join('\\t')\n const rows = features.value.map((f) =>\n [f.replace(/_/g, ' '), ...items.map((i) => i.values[f] ?? '')].join(\n '\\t',\n ),\n )\n copy([header, ...rows].join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input?.items?.length\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8\">\n <VvIcon name=\"ri:scales-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{\n toolPart.input.title ?? $t('label.comparison')\n }}</strong>\n <VvButtonGroup modifiers=\"compact\" class=\"ml-auto shrink-0\">\n <VvButton\n modifiers=\"action-quiet-small\"\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n @click=\"copyTable\" />\n </VvButtonGroup>\n </div>\n <div class=\"overflow-x-auto\">\n <table class=\"w-full text-12 border-collapse\">\n <thead>\n <tr>\n <th\n class=\"text-left text-word-3 font-medium p-8 border-b border-surface-3 min-w-32\"></th>\n <th\n v-for=\"item in toolPart.input.items\"\n :key=\"item.name\"\n class=\"text-center font-semibold text-word-1 p-8 border-b border-surface-3 min-w-24\"\n :class=\"\n item.highlighted\n ? 'bg-primary/5 border-primary/20'\n : ''\n \">\n {{ item.name }}\n <span v-if=\"item.highlighted\" class=\"ml-4\">⭐</span>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n v-for=\"(feature, fIdx) in features\"\n :key=\"feature\"\n :class=\"{ 'bg-surface-1': fIdx % 2 !== 0 }\">\n <td\n class=\"text-word-3 font-medium p-8 whitespace-nowrap\"\n :class=\"{\n 'border-b border-surface-3':\n fIdx !== features.length - 1,\n }\">\n {{ feature.replace(/_/g, ' ') }}\n </td>\n <td\n v-for=\"item in toolPart.input.items\"\n :key=\"item.name\"\n class=\"text-center p-8\"\n :class=\"{\n 'border-b border-surface-3':\n fIdx !== features.length - 1,\n 'bg-surface-info': item.highlighted,\n 'text-success': item.values[feature] === '✓',\n 'text-danger':\n item.values[feature] === '\\u2717',\n 'text-word-2':\n item.values[feature] !== '✓' &&\n item.values[feature] !== '\\u2717',\n }\">\n {{ item.values[feature] ?? '—' }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useClipboard } from '@vueuse/core'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title?: string\n items: Array<{\n name: string\n values: Record<string, string>\n highlighted?: boolean\n }>\n }\n }\n return part\n })\n\n const features = computed(() => {\n const items = toolPart.value.input?.items\n if (!items || items.length === 0) {\n return []\n }\n return Object.keys(items[0].values)\n })\n\n const copyTable = () => {\n const items = toolPart.value.input?.items\n if (!items) {\n return\n }\n const header = ['', ...items.map((i) => i.name)].join('\\t')\n const rows = features.value.map((f) =>\n [f.replace(/_/g, ' '), ...items.map((i) => i.values[f] ?? '')].join(\n '\\t',\n ),\n )\n copy([header, ...rows].join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input?.items?.length\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8\">\n <VvIcon name=\"ri:scales-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{\n toolPart.input.title ?? $t('label.comparison')\n }}</strong>\n <VvButtonGroup modifiers=\"compact\" class=\"ml-auto shrink-0\">\n <VvButton\n modifiers=\"action-quiet-small\"\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n @click=\"copyTable\" />\n </VvButtonGroup>\n </div>\n <div class=\"overflow-x-auto\">\n <table class=\"w-full text-12 border-collapse\">\n <thead>\n <tr>\n <th\n class=\"text-left text-word-3 font-medium p-8 border-b border-surface-3 min-w-32\"></th>\n <th\n v-for=\"item in toolPart.input.items\"\n :key=\"item.name\"\n class=\"text-center font-semibold text-word-1 p-8 border-b border-surface-3 min-w-24\"\n :class=\"\n item.highlighted\n ? 'bg-primary/5 border-primary/20'\n : ''\n \">\n {{ item.name }}\n <span v-if=\"item.highlighted\" class=\"ml-4\">⭐</span>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n v-for=\"(feature, fIdx) in features\"\n :key=\"feature\"\n :class=\"{ 'bg-surface-1': fIdx % 2 !== 0 }\">\n <td\n class=\"text-word-3 font-medium p-8 whitespace-nowrap\"\n :class=\"{\n 'border-b border-surface-3':\n fIdx !== features.length - 1,\n }\">\n {{ feature.replace(/_/g, ' ') }}\n </td>\n <td\n v-for=\"item in toolPart.input.items\"\n :key=\"item.name\"\n class=\"text-center p-8\"\n :class=\"{\n 'border-b border-surface-3':\n fIdx !== features.length - 1,\n 'bg-surface-info': item.highlighted,\n 'text-success': item.values[feature] === '✓',\n 'text-danger':\n item.values[feature] === '\\u2717',\n 'text-word-2':\n item.values[feature] !== '✓' &&\n item.values[feature] !== '\\u2717',\n }\">\n {{ item.values[feature] ?? '—' }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAII,IAAM,IAAQ,GAIR,EAAE,SAAM,cAAW,GAAa,EAEhC,IAAW,QACA,EAAM,KAWtB,EAEK,IAAW,QAAe;GAC5B,IAAM,IAAQ,EAAS,MAAM,OAAO;AAIpC,UAHI,CAAC,KAAS,EAAM,WAAW,IACpB,EAAC,GAEL,OAAO,KAAK,EAAM,GAAG,OAAM;IACrC,EAEK,UAAkB;GACpB,IAAM,IAAQ,EAAS,MAAM,OAAO;AAC/B,QASL,EAAK,CANU,CAAC,IAAI,GAAG,EAAM,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,KAAK,IAMhD,EAAQ,GALD,EAAS,MAAM,KAAK,MAC7B,CAAC,EAAE,QAAQ,MAAM,IAAI,EAAE,GAAG,EAAM,KAAK,MAAM,EAAE,OAAO,MAAM,GAAG,CAAC,CAAC,KAC3D,IACH,CAEY,CAAK,CAAC,KAAK,KAAK,CAAA;;;;UAM3B,EAAA,OAAU,OAAO,OAAO,UAAA,GAAA,EADlC,EAuEM,OAvEN,GAuEM,CApEF,EAaM,OAbN,GAaM;IAXF,EAAgD,GAAA;KAAxC,MAAK;KAAiB,OAAM;;IACpC,EAEW,UAFX,GAEW,EADP,EAAA,MAAS,MAAM,SAASA,EAAAA,GAAE,mBAAA,CAAA,EAAA,EAAA;IAE9B,EAMgB,GAAA;KAND,WAAU;KAAU,OAAM;;sBAKZ,CAJzB,EAIyB,GAAA;MAHrB,WAAU;MACT,MAAM,EAAA,EAAM,GAAA,kBAAA;MACZ,OAAO,EAAA,EAAM,GAAGA,EAAAA,GAAE,gBAAA,GAAoBA,EAAAA,GAAE,cAAA;MACxC,SAAO;;;;OAGpB,EAqDM,OArDN,GAqDM,CApDF,EAmDQ,SAnDR,GAmDQ,CAlDJ,EAiBQ,SAAA,MAAA,CAhBJ,EAeK,MAAA,MAAA,CAAA,AAAA,EAAA,OAdD,EAC0F,MAAA,EAAtF,OAAM,4EAA0E,EAAA,MAAA,GAAA,GAAA,EAAA,GAAA,EACpF,EAWK,GAAA,MAAA,EAVc,EAAA,MAAS,MAAM,QAAvB,YADX,EAWK,MAAA;IATA,KAAK,EAAK;IACX,OAAK,EAAA,CAAC,gFACmC,EAAK,cAAA,mCAAA,GAAA,CAAA;WAK3C,EAAK,KAAI,GAAG,KACf,EAAA,EAAY,EAAK,eAAA,GAAA,EAAjB,EAAmD,QAAnD,GAA2C,IAAC,IAAA,EAAA,IAAA,GAAA,CAAA,EAAA,EAAA,eAIxD,EA+BQ,SAAA,MAAA,EAAA,EAAA,GAAA,EA9BJ,EA6BK,GAAA,MAAA,EA5ByB,EAAA,QAAlB,GAAS,YADrB,EA6BK,MAAA;IA3BA,KAAK;IACL,OAAK,EAAA,EAAA,gBAAoB,IAAI,KAAA,GAAA,CAAA;OAC9B,EAOK,MAAA,EAND,OAAK,EAAA,CAAC,iDAA+C,EAAA,6BACsD,MAAS,EAAA,MAAS,SAAM,GAAA,CAAA,CAAA,EAAA,EAAA,EAIhI,EAAQ,QAAO,MAAA,IAAA,CAAA,EAAA,EAAA,GAAA,EAAA,GAAA,EAEtB,EAgBK,GAAA,MAAA,EAfc,EAAA,MAAS,MAAM,QAAvB,YADX,EAgBK,MAAA;IAdA,KAAK,EAAK;IACX,OAAK,EAAA,CAAC,mBAAiB;kCACoF,MAAS,EAAA,MAAS,SAAM;wBAAyD,EAAK;qBAA6D,EAAK,OAAO,OAAO;oBAA8F,EAAK,OAAO,OAAO;oBAAmG,EAAK,OAAO,OAAO,OAAiD,EAAK,OAAO,OAAO;;QAWzjB,EAAK,OAAO,MAAO,IAAA,EAAA,EAAA"}
1
+ {"version":3,"file":"PkToolShowComparison-p34r0Hhd.js","names":["$t"],"sources":["../../../../packages/components/src/chat/PkToolShowComparison.vue","../../../../packages/components/src/chat/PkToolShowComparison.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useClipboard } from '@vueuse/core'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title?: string\n items: Array<{\n name: string\n values: Record<string, string>\n highlighted?: boolean\n }>\n }\n }\n return part\n })\n\n const features = computed(() => {\n const items = toolPart.value.input?.items\n if (!items || items.length === 0) {\n return []\n }\n return Object.keys(items[0].values)\n })\n\n const copyTable = () => {\n const items = toolPart.value.input?.items\n if (!items) {\n return\n }\n const header = ['', ...items.map((i) => i.name)].join('\\t')\n const rows = features.value.map((f) =>\n [f.replace(/_/g, ' '), ...items.map((i) => i.values[f] ?? '')].join(\n '\\t',\n ),\n )\n copy([header, ...rows].join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input?.items?.length\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8\">\n <VvIcon name=\"ri:scales-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{\n toolPart.input.title ?? $t('label.comparison')\n }}</strong>\n <VvButtonGroup modifiers=\"compact\" class=\"ml-auto shrink-0\">\n <VvButton\n modifiers=\"action-quiet-small\"\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n @click=\"copyTable\" />\n </VvButtonGroup>\n </div>\n <div class=\"overflow-x-auto\">\n <table class=\"w-full text-12 border-collapse\">\n <thead>\n <tr>\n <th\n class=\"text-left text-word-3 font-medium p-8 border-b border-surface-3 min-w-32\"></th>\n <th\n v-for=\"item in toolPart.input.items\"\n :key=\"item.name\"\n class=\"text-center font-semibold text-word-1 p-8 border-b border-surface-3 min-w-24\"\n :class=\"\n item.highlighted\n ? 'bg-primary/5 border-primary/20'\n : ''\n \">\n {{ item.name }}\n <span v-if=\"item.highlighted\" class=\"ml-4\">⭐</span>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n v-for=\"(feature, fIdx) in features\"\n :key=\"feature\"\n :class=\"{ 'bg-surface-1': fIdx % 2 !== 0 }\">\n <td\n class=\"text-word-3 font-medium p-8 whitespace-nowrap\"\n :class=\"{\n 'border-b border-surface-3':\n fIdx !== features.length - 1,\n }\">\n {{ feature.replace(/_/g, ' ') }}\n </td>\n <td\n v-for=\"item in toolPart.input.items\"\n :key=\"item.name\"\n class=\"text-center p-8\"\n :class=\"{\n 'border-b border-surface-3':\n fIdx !== features.length - 1,\n 'bg-surface-info': item.highlighted,\n 'text-success': item.values[feature] === '✓',\n 'text-danger':\n item.values[feature] === '\\u2717',\n 'text-word-2':\n item.values[feature] !== '✓' &&\n item.values[feature] !== '\\u2717',\n }\">\n {{ item.values[feature] ?? '—' }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useClipboard } from '@vueuse/core'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title?: string\n items: Array<{\n name: string\n values: Record<string, string>\n highlighted?: boolean\n }>\n }\n }\n return part\n })\n\n const features = computed(() => {\n const items = toolPart.value.input?.items\n if (!items || items.length === 0) {\n return []\n }\n return Object.keys(items[0].values)\n })\n\n const copyTable = () => {\n const items = toolPart.value.input?.items\n if (!items) {\n return\n }\n const header = ['', ...items.map((i) => i.name)].join('\\t')\n const rows = features.value.map((f) =>\n [f.replace(/_/g, ' '), ...items.map((i) => i.values[f] ?? '')].join(\n '\\t',\n ),\n )\n copy([header, ...rows].join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input?.items?.length\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8\">\n <VvIcon name=\"ri:scales-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{\n toolPart.input.title ?? $t('label.comparison')\n }}</strong>\n <VvButtonGroup modifiers=\"compact\" class=\"ml-auto shrink-0\">\n <VvButton\n modifiers=\"action-quiet-small\"\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n @click=\"copyTable\" />\n </VvButtonGroup>\n </div>\n <div class=\"overflow-x-auto\">\n <table class=\"w-full text-12 border-collapse\">\n <thead>\n <tr>\n <th\n class=\"text-left text-word-3 font-medium p-8 border-b border-surface-3 min-w-32\"></th>\n <th\n v-for=\"item in toolPart.input.items\"\n :key=\"item.name\"\n class=\"text-center font-semibold text-word-1 p-8 border-b border-surface-3 min-w-24\"\n :class=\"\n item.highlighted\n ? 'bg-primary/5 border-primary/20'\n : ''\n \">\n {{ item.name }}\n <span v-if=\"item.highlighted\" class=\"ml-4\">⭐</span>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n v-for=\"(feature, fIdx) in features\"\n :key=\"feature\"\n :class=\"{ 'bg-surface-1': fIdx % 2 !== 0 }\">\n <td\n class=\"text-word-3 font-medium p-8 whitespace-nowrap\"\n :class=\"{\n 'border-b border-surface-3':\n fIdx !== features.length - 1,\n }\">\n {{ feature.replace(/_/g, ' ') }}\n </td>\n <td\n v-for=\"item in toolPart.input.items\"\n :key=\"item.name\"\n class=\"text-center p-8\"\n :class=\"{\n 'border-b border-surface-3':\n fIdx !== features.length - 1,\n 'bg-surface-info': item.highlighted,\n 'text-success': item.values[feature] === '✓',\n 'text-danger':\n item.values[feature] === '\\u2717',\n 'text-word-2':\n item.values[feature] !== '✓' &&\n item.values[feature] !== '\\u2717',\n }\">\n {{ item.values[feature] ?? '—' }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAII,IAAM,IAAQ,GAIR,EAAE,SAAM,cAAW,GAAa,EAEhC,IAAW,QACA,EAAM,KAWtB,EAEK,IAAW,QAAe;GAC5B,IAAM,IAAQ,EAAS,MAAM,OAAO;AAIpC,UAHI,CAAC,KAAS,EAAM,WAAW,IACpB,EAAC,GAEL,OAAO,KAAK,EAAM,GAAG,OAAM;IACrC,EAEK,UAAkB;GACpB,IAAM,IAAQ,EAAS,MAAM,OAAO;AAC/B,QASL,EAAK,CANU,CAAC,IAAI,GAAG,EAAM,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,KAAK,IAMhD,EAAQ,GALD,EAAS,MAAM,KAAK,MAC7B,CAAC,EAAE,QAAQ,MAAM,IAAI,EAAE,GAAG,EAAM,KAAK,MAAM,EAAE,OAAO,MAAM,GAAG,CAAC,CAAC,KAC3D,IACH,CAEY,CAAK,CAAC,KAAK,KAAK,CAAA;;;;UAM3B,EAAA,OAAU,OAAO,OAAO,UAAA,GAAA,EADlC,EAuEM,OAvEN,GAuEM,CApEF,EAaM,OAbN,GAaM;IAXF,EAAgD,GAAA;KAAxC,MAAK;KAAiB,OAAM;;IACpC,EAEW,UAFX,GAEW,EADP,EAAA,MAAS,MAAM,SAASA,EAAAA,GAAE,mBAAA,CAAA,EAAA,EAAA;IAE9B,EAMgB,GAAA;KAND,WAAU;KAAU,OAAM;;sBAKZ,CAJzB,EAIyB,GAAA;MAHrB,WAAU;MACT,MAAM,EAAA,EAAM,GAAA,kBAAA;MACZ,OAAO,EAAA,EAAM,GAAGA,EAAAA,GAAE,gBAAA,GAAoBA,EAAAA,GAAE,cAAA;MACxC,SAAO;;;;OAGpB,EAqDM,OArDN,GAqDM,CApDF,EAmDQ,SAnDR,GAmDQ,CAlDJ,EAiBQ,SAAA,MAAA,CAhBJ,EAeK,MAAA,MAAA,CAAA,AAAA,EAAA,OAdD,EAC0F,MAAA,EAAtF,OAAM,4EAA0E,EAAA,MAAA,GAAA,GAAA,EAAA,GAAA,EACpF,EAWK,GAAA,MAAA,EAVc,EAAA,MAAS,MAAM,QAAvB,YADX,EAWK,MAAA;IATA,KAAK,EAAK;IACX,OAAK,EAAA,CAAC,gFACmC,EAAK,cAAA,mCAAA,GAAA,CAAA;WAK3C,EAAK,KAAI,GAAG,KACf,EAAA,EAAY,EAAK,eAAA,GAAA,EAAjB,EAAmD,QAAnD,GAA2C,IAAC,IAAA,EAAA,IAAA,GAAA,CAAA,EAAA,EAAA,eAIxD,EA+BQ,SAAA,MAAA,EAAA,EAAA,GAAA,EA9BJ,EA6BK,GAAA,MAAA,EA5ByB,EAAA,QAAlB,GAAS,YADrB,EA6BK,MAAA;IA3BA,KAAK;IACL,OAAK,EAAA,EAAA,gBAAoB,IAAI,KAAA,GAAA,CAAA;OAC9B,EAOK,MAAA,EAND,OAAK,EAAA,CAAC,iDAA+C,EAAA,6BACsD,MAAS,EAAA,MAAS,SAAM,GAAA,CAAA,CAAA,EAAA,EAAA,EAIhI,EAAQ,QAAO,MAAA,IAAA,CAAA,EAAA,EAAA,GAAA,EAAA,GAAA,EAEtB,EAgBK,GAAA,MAAA,EAfc,EAAA,MAAS,MAAM,QAAvB,YADX,EAgBK,MAAA;IAdA,KAAK,EAAK;IACX,OAAK,EAAA,CAAC,mBAAiB;kCACoF,MAAS,EAAA,MAAS,SAAM;wBAAyD,EAAK;qBAA6D,EAAK,OAAO,OAAO;oBAA8F,EAAK,OAAO,OAAO;oBAAmG,EAAK,OAAO,OAAO,OAAiD,EAAK,OAAO,OAAO;;QAWzjB,EAAK,OAAO,MAAO,IAAA,EAAA,EAAA"}