@8wave/ai-elements 0.106.0-beta.2 → 0.106.0-beta.4

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 (81) hide show
  1. package/dist/_chunks/{PkLazyImg-BoH1s5ni.js → PkLazyImg-Beug40gC.js} +2 -2
  2. package/dist/_chunks/{PkLazyImg-BoH1s5ni.js.map → PkLazyImg-Beug40gC.js.map} +1 -1
  3. package/dist/_chunks/{PkToolRequestGeolocation-CNAtslfG.js → PkToolRequestGeolocation-DUHzWOSe.js} +2 -2
  4. package/dist/_chunks/{PkToolRequestGeolocation-CNAtslfG.js.map → PkToolRequestGeolocation-DUHzWOSe.js.map} +1 -1
  5. package/dist/_chunks/{PkToolRequestOAuthConnection-DNZHj2Kx.js → PkToolRequestOAuthConnection-CdtnIiy6.js} +2 -2
  6. package/dist/_chunks/{PkToolRequestOAuthConnection-DNZHj2Kx.js.map → PkToolRequestOAuthConnection-CdtnIiy6.js.map} +1 -1
  7. package/dist/_chunks/{PkToolShowArtifact-Kfm50DPr.js → PkToolShowArtifact-B0gZZGvT.js} +3 -3
  8. package/dist/_chunks/{PkToolShowArtifact-Kfm50DPr.js.map → PkToolShowArtifact-B0gZZGvT.js.map} +1 -1
  9. package/dist/_chunks/{PkToolShowCalendarEvent-KJXNC-E_.js → PkToolShowCalendarEvent-DpEWSENB.js} +3 -3
  10. package/dist/_chunks/{PkToolShowCalendarEvent-KJXNC-E_.js.map → PkToolShowCalendarEvent-DpEWSENB.js.map} +1 -1
  11. package/dist/_chunks/{PkToolShowComparison-C1GPvcNH.js → PkToolShowComparison-DkHRpM8n.js} +3 -3
  12. package/dist/_chunks/{PkToolShowComparison-C1GPvcNH.js.map → PkToolShowComparison-DkHRpM8n.js.map} +1 -1
  13. package/dist/_chunks/{PkToolShowContactForm-Ws8DysdD.js → PkToolShowContactForm-B8YI2e0B.js} +3 -3
  14. package/dist/_chunks/{PkToolShowContactForm-Ws8DysdD.js.map → PkToolShowContactForm-B8YI2e0B.js.map} +1 -1
  15. package/dist/_chunks/{PkToolShowDiagram-CMuKde1V.js → PkToolShowDiagram-vmSzw6s0.js} +3 -3
  16. package/dist/_chunks/{PkToolShowDiagram-CMuKde1V.js.map → PkToolShowDiagram-vmSzw6s0.js.map} +1 -1
  17. package/dist/_chunks/{PkToolShowEmail-DvA69GLP.js → PkToolShowEmail-BtntDg5l.js} +3 -3
  18. package/dist/_chunks/{PkToolShowEmail-DvA69GLP.js.map → PkToolShowEmail-BtntDg5l.js.map} +1 -1
  19. package/dist/_chunks/{PkToolShowForm-CadrjzZx.js → PkToolShowForm-gD0MfOjQ.js} +104 -104
  20. package/dist/_chunks/PkToolShowForm-gD0MfOjQ.js.map +1 -0
  21. package/dist/_chunks/{PkToolShowImageGallery-CosOsHSh.js → PkToolShowImageGallery-DL-bFOKl.js} +2 -2
  22. package/dist/_chunks/{PkToolShowImageGallery-CosOsHSh.js.map → PkToolShowImageGallery-DL-bFOKl.js.map} +1 -1
  23. package/dist/_chunks/{PkToolShowLocation-BLSkytqC.js → PkToolShowLocation-DXPAEQCf.js} +3 -3
  24. package/dist/_chunks/{PkToolShowLocation-BLSkytqC.js.map → PkToolShowLocation-DXPAEQCf.js.map} +1 -1
  25. package/dist/_chunks/{PkToolShowMessage-Bb1fhAcX.js → PkToolShowMessage-WendSuVW.js} +3 -3
  26. package/dist/_chunks/{PkToolShowMessage-Bb1fhAcX.js.map → PkToolShowMessage-WendSuVW.js.map} +1 -1
  27. package/dist/_chunks/{PkToolShowProductList-DkaEOhxY.js → PkToolShowProductList-_ULcSOL_.js} +3 -3
  28. package/dist/_chunks/{PkToolShowProductList-DkaEOhxY.js.map → PkToolShowProductList-_ULcSOL_.js.map} +1 -1
  29. package/dist/_chunks/{PkToolShowQrCode-GaZJBhqE.js → PkToolShowQrCode-BIhYJSTf.js} +3 -3
  30. package/dist/_chunks/{PkToolShowQrCode-GaZJBhqE.js.map → PkToolShowQrCode-BIhYJSTf.js.map} +1 -1
  31. package/dist/_chunks/{PkToolShowSources-BcxmwOsZ.js → PkToolShowSources-BprUew-i.js} +2 -2
  32. package/dist/_chunks/{PkToolShowSources-BcxmwOsZ.js.map → PkToolShowSources-BprUew-i.js.map} +1 -1
  33. package/dist/_chunks/{PkToolShowSuggestedReply-4S7VvK7s.js → PkToolShowSuggestedReply-FJMsf1Ft.js} +2 -2
  34. package/dist/_chunks/{PkToolShowSuggestedReply-4S7VvK7s.js.map → PkToolShowSuggestedReply-FJMsf1Ft.js.map} +1 -1
  35. package/dist/_chunks/{PkToolShowVideo-CbSNJlH1.js → PkToolShowVideo-DXQo_Frk.js} +2 -2
  36. package/dist/_chunks/{PkToolShowVideo-CbSNJlH1.js.map → PkToolShowVideo-DXQo_Frk.js.map} +1 -1
  37. package/dist/_chunks/{PkToolShowWeather-Cr3NJEMI.js → PkToolShowWeather-Ca-ZrKx3.js} +2 -2
  38. package/dist/_chunks/{PkToolShowWeather-Cr3NJEMI.js.map → PkToolShowWeather-Ca-ZrKx3.js.map} +1 -1
  39. package/dist/_chunks/{PkToolShowWebPages-DLpd7Kg0.js → PkToolShowWebPages-DxxqCOav.js} +3 -3
  40. package/dist/_chunks/{PkToolShowWebPages-DLpd7Kg0.js.map → PkToolShowWebPages-DxxqCOav.js.map} +1 -1
  41. package/dist/_chunks/{VvCheckboxGroup.es-DLgx43U_.js → VvCheckboxGroup.es-6rXZzFDs.js} +2 -2
  42. package/dist/_chunks/{VvCheckboxGroup.es-DLgx43U_.js.map → VvCheckboxGroup.es-6rXZzFDs.js.map} +1 -1
  43. package/dist/_chunks/{VvCombobox.es-D5zLGtOy.js → VvCombobox.es-DgB4YbSj.js} +409 -409
  44. package/dist/_chunks/{VvCombobox.es-D5zLGtOy.js.map → VvCombobox.es-DgB4YbSj.js.map} +1 -1
  45. package/dist/_chunks/{VvInputText.es-DWwDzlwZ.js → VvInputText.es-UTEISDKU.js} +181 -181
  46. package/dist/_chunks/{VvInputText.es-DWwDzlwZ.js.map → VvInputText.es-UTEISDKU.js.map} +1 -1
  47. package/dist/_chunks/{VvRadioGroup.es-BZdnaITO.js → VvRadioGroup.es-CqMnxRGR.js} +2 -2
  48. package/dist/_chunks/{VvRadioGroup.es-BZdnaITO.js.map → VvRadioGroup.es-CqMnxRGR.js.map} +1 -1
  49. package/dist/_chunks/{VvSelect.es-BP6Gn5BZ.js → VvSelect.es-BLNrNcIi.js} +6 -6
  50. package/dist/_chunks/{VvSelect.es-BP6Gn5BZ.js.map → VvSelect.es-BLNrNcIi.js.map} +1 -1
  51. package/dist/_chunks/{VvTextarea.es-BuLyBuYz.js → VvTextarea.es-ChkbZSw6.js} +296 -296
  52. package/dist/_chunks/{VvTextarea.es-BuLyBuYz.js.map → VvTextarea.es-ChkbZSw6.js.map} +1 -1
  53. package/dist/_chunks/{dist-vbhhaYbZ.js → dist-Dhop5_et.js} +91 -28
  54. package/dist/_chunks/{dist-vbhhaYbZ.js.map → dist-Dhop5_et.js.map} +1 -1
  55. package/dist/_chunks/{index.es-DFq55nZZ.js → index.es-CNKCTfCu.js} +93 -93
  56. package/dist/_chunks/{index.es-DFq55nZZ.js.map → index.es-CNKCTfCu.js.map} +1 -1
  57. package/dist/_chunks/{index.es-DhjFGu5c.js → index.es-DB9_sQvG.js} +16 -16
  58. package/dist/_chunks/{index.es-DhjFGu5c.js.map → index.es-DB9_sQvG.js.map} +1 -1
  59. package/dist/ai-elements.es.js +2334 -2327
  60. package/dist/ai-elements.es.js.map +1 -1
  61. package/dist-vue/PkChatbot.js +1 -1
  62. package/dist-vue/PkChatbotMessages.js +1 -1
  63. package/dist-vue/PkChatbotViewChat.js +1 -1
  64. package/dist-vue/_chunks/{PkChatbot-a8Wh4tN4.js → PkChatbot-i_07-rvf.js} +76 -68
  65. package/dist-vue/_chunks/PkChatbot-i_07-rvf.js.map +1 -0
  66. package/dist-vue/_chunks/PkChatbotEmptyState-C7W0QgqW.js.map +1 -1
  67. package/dist-vue/_chunks/{PkChatbotMessages-D6rNh6PF.js → PkChatbotMessages-CZLj_OeK.js} +4 -4
  68. package/dist-vue/_chunks/PkChatbotMessages-CZLj_OeK.js.map +1 -0
  69. package/dist-vue/_chunks/{PkChatbotViewChat-DUn7M4SL.js → PkChatbotViewChat-B6MfjQIa.js} +3 -3
  70. package/dist-vue/_chunks/{PkChatbotViewChat-DUn7M4SL.js.map → PkChatbotViewChat-B6MfjQIa.js.map} +1 -1
  71. package/dist-vue/_chunks/{PkToolShowDiagram-Bbqo6jm8.js → PkToolShowDiagram-D7jh-yIc.js} +2 -2
  72. package/dist-vue/_chunks/{PkToolShowDiagram-Bbqo6jm8.js.map → PkToolShowDiagram-D7jh-yIc.js.map} +1 -1
  73. package/dist-vue/_chunks/{PkToolShowForm-CJtmt5yd.js → PkToolShowForm-BGp_gbtr.js} +54 -54
  74. package/dist-vue/_chunks/PkToolShowForm-BGp_gbtr.js.map +1 -0
  75. package/dist-vue/index.js +8 -8
  76. package/dist-vue/style.css +1 -1
  77. package/package.json +1 -1
  78. package/dist/_chunks/PkToolShowForm-CadrjzZx.js.map +0 -1
  79. package/dist-vue/_chunks/PkChatbot-a8Wh4tN4.js.map +0 -1
  80. package/dist-vue/_chunks/PkChatbotMessages-D6rNh6PF.js.map +0 -1
  81. package/dist-vue/_chunks/PkToolShowForm-CJtmt5yd.js.map +0 -1
@@ -1,15 +1,15 @@
1
- import { $ as e, B as t, C as n, K as r, L as i, M as a, O as o, St as s, Tt as c, X as l, _ as u, b as d, bt as f, d as p, dt as ee, g as m, h, it as g, j as _, l as te, m as v, pt as y, r as b, u as x, v as S, wt as ne, x as C, xt as w, y as T, z as E } from "./vue.runtime.esm-bundler-D6KKITU0.js";
2
- import { r as re } from "./vue-i18n-C3J36GV4.js";
3
- import { t as ie } from "./PkStreamingMarkdown-B4x5oryz.js";
4
- import { a as ae, i as oe } from "./utils-Dv0qtyqm.js";
5
- import { u as D } from "./Agent-VhugusRf.js";
6
- import { a as se, c as O, d as k, f as A, n as ce, s as j, u as le } from "./index.es-DFq55nZZ.js";
7
- o(), w();
1
+ import { $ as e, B as t, C as n, G as r, K as i, L as a, M as o, O as s, St as c, Tt as l, X as u, _ as d, b as f, bt as p, d as m, dt as ee, g as h, h as g, it as _, j as v, l as te, m as y, pt as b, r as x, u as S, v as C, wt as ne, x as w, xt as T, y as E, z as D } from "./vue.runtime.esm-bundler-D6KKITU0.js";
2
+ import { r as O } from "./vue-i18n-C3J36GV4.js";
3
+ import { t as re } from "./PkStreamingMarkdown-B4x5oryz.js";
4
+ import { a as ie, i as ae } from "./utils-Dv0qtyqm.js";
5
+ import { u as k } from "./Agent-VhugusRf.js";
6
+ import { a as oe, c as A, d as j, f as M, n as se, s as N, u as ce } from "./index.es-CNKCTfCu.js";
7
+ s(), T();
8
8
  //#endregion
9
9
  //#region ../../packages/components/src/PkEditorRadioButtons.vue
10
- var ue = /* @__PURE__ */ n({
10
+ var le = /* @__PURE__ */ n({
11
11
  __name: "PkEditorRadioButtons",
12
- props: /*@__PURE__*/ _({
12
+ props: /*@__PURE__*/ v({
13
13
  name: { type: String },
14
14
  label: { type: String },
15
15
  hintLabel: { type: String },
@@ -36,29 +36,29 @@ var ue = /* @__PURE__ */ n({
36
36
  }),
37
37
  emits: ["update:modelValue"],
38
38
  setup(n) {
39
- let o = n, s = r(n, "modelValue"), l = v(() => [...o.modifiers ? Array.isArray(o.modifiers) ? o.modifiers : [o.modifiers] : [], o.segmented ? "segment" : "button"]);
40
- return (r, o) => {
41
- let u = A, f = k;
42
- return i(), m(f, {
43
- modelValue: s.value,
44
- "onUpdate:modelValue": o[0] ||= (e) => s.value = e,
45
- name: n.name,
39
+ let s = n, c = i(n, "modelValue"), u = r(), d = y(() => `${s.name}-${u}`), p = y(() => [...s.modifiers ? Array.isArray(s.modifiers) ? s.modifiers : [s.modifiers] : [], s.segmented ? "segment" : "button"]);
40
+ return (r, i) => {
41
+ let s = M, u = j;
42
+ return a(), h(u, {
43
+ modelValue: c.value,
44
+ "onUpdate:modelValue": i[0] ||= (e) => c.value = e,
45
+ name: d.value,
46
46
  label: n.label,
47
47
  "hint-label": n.hintLabel,
48
48
  invalid: n.invalid,
49
49
  "invalid-label": n.invalidLabel,
50
50
  modifiers: n.segmented ? "segmented" : "buttons"
51
51
  }, {
52
- default: e(() => [(i(!0), S(p, null, E(n.options, (o, s) => (i(), m(u, {
53
- key: s,
54
- name: n.name,
52
+ default: e(() => [(a(!0), C(m, null, D(n.options, (i, c) => (a(), h(s, {
53
+ key: c,
54
+ name: d.value,
55
55
  required: n.required,
56
56
  readonly: n.readonly,
57
57
  disabled: n.disabled,
58
- value: o.value,
59
- modifiers: l.value
58
+ value: i.value,
59
+ modifiers: p.value
60
60
  }, {
61
- default: e(() => [t(r.$slots, o.value, a({ ref_for: !0 }, { option: o }), () => [d(c(o.label), 1)])]),
61
+ default: e(() => [t(r.$slots, i.value, o({ ref_for: !0 }, { option: i }), () => [f(l(i.label), 1)])]),
62
62
  _: 2
63
63
  }, 1032, [
64
64
  "name",
@@ -81,12 +81,12 @@ var ue = /* @__PURE__ */ n({
81
81
  };
82
82
  }
83
83
  });
84
- o(), w();
84
+ s(), T();
85
85
  //#endregion
86
86
  //#region ../../packages/components/src/PkEditorCheckboxButtons.vue
87
- var de = /* @__PURE__ */ n({
87
+ var ue = /* @__PURE__ */ n({
88
88
  __name: "PkEditorCheckboxButtons",
89
- props: /*@__PURE__*/ _({
89
+ props: /*@__PURE__*/ v({
90
90
  name: { type: String },
91
91
  required: { type: Boolean },
92
92
  options: { type: Array },
@@ -98,25 +98,25 @@ var de = /* @__PURE__ */ n({
98
98
  }),
99
99
  emits: ["update:modelValue"],
100
100
  setup(n) {
101
- let o = r(n, "modelValue");
102
- return (r, s) => {
103
- let l = O, u = j;
104
- return i(), m(u, {
105
- modelValue: o.value,
106
- "onUpdate:modelValue": s[0] ||= (e) => o.value = e,
101
+ let r = i(n, "modelValue");
102
+ return (i, s) => {
103
+ let c = A, u = N;
104
+ return a(), h(u, {
105
+ modelValue: r.value,
106
+ "onUpdate:modelValue": s[0] ||= (e) => r.value = e,
107
107
  name: n.name,
108
108
  modifiers: "buttons"
109
109
  }, {
110
- default: e(() => [(i(!0), S(p, null, E(n.options, (o, s) => (i(), m(l, {
110
+ default: e(() => [(a(!0), C(m, null, D(n.options, (r, s) => (a(), h(c, {
111
111
  key: s,
112
112
  name: n.name,
113
113
  required: n.required,
114
114
  readonly: n.readonly,
115
115
  disabled: n.disabled,
116
- value: o.value,
116
+ value: r.value,
117
117
  modifiers: "button"
118
118
  }, {
119
- default: e(() => [t(r.$slots, String(o.value), a({ ref_for: !0 }, { option: o }), () => [d(c(o.label), 1)])]),
119
+ default: e(() => [t(i.$slots, String(r.value), o({ ref_for: !0 }, { option: r }), () => [f(l(r.label), 1)])]),
120
120
  _: 2
121
121
  }, 1032, [
122
122
  "name",
@@ -130,35 +130,35 @@ var de = /* @__PURE__ */ n({
130
130
  };
131
131
  }
132
132
  });
133
- o(), g(), w(), b();
134
- var fe = {
133
+ s(), _(), T(), x();
134
+ var de = {
135
135
  key: 0,
136
136
  class: "text-12 text-danger flex items-center gap-6 py-8"
137
- }, pe = {
137
+ }, fe = {
138
138
  key: 1,
139
139
  class: "border border-surface-3 rounded-xl w-full overflow-hidden flex flex-col bg-surface"
140
- }, me = {
140
+ }, pe = {
141
141
  key: 0,
142
142
  class: "text-12 border-b border-surface-3 text-word-3 bg-surface-1"
143
- }, he = {
143
+ }, P = {
144
144
  key: 1,
145
145
  class: "flex flex-col gap-4 p-sm"
146
- }, M = { class: "flex justify-between text-10 text-word-3" }, N = { class: "h-4 bg-surface-3 rounded-full overflow-hidden" }, P = { class: "px-sm py-16 flex flex-col gap-12" }, F = { class: "leading-normal text-12" }, I = { class: "font-semibold" }, L = { class: "text-12" }, R = { class: "font-semibold" }, ge = {
146
+ }, F = { class: "flex justify-between text-10 text-word-3" }, I = { class: "h-4 bg-surface-3 rounded-full overflow-hidden" }, L = { class: "px-sm py-16 flex flex-col gap-12" }, R = { class: "leading-normal text-12" }, z = { class: "font-semibold" }, B = { class: "text-12" }, me = { class: "font-semibold" }, he = {
147
147
  key: 0,
148
148
  class: "text-word-3"
149
- }, _e = { class: "text-12" }, ve = { class: "font-semibold" }, ye = {
149
+ }, ge = { class: "text-12" }, _e = { class: "font-semibold" }, ve = {
150
150
  key: 0,
151
151
  class: "text-word-3"
152
- }, be = {
152
+ }, ye = {
153
153
  key: 2,
154
154
  class: "flex flex-col gap-6 w-full"
155
- }, xe = {
155
+ }, be = {
156
156
  key: 0,
157
157
  class: "px-sm pb-sm border-t border-surface-3"
158
- }, z = {
158
+ }, xe = {
159
159
  key: 1,
160
160
  class: "px-sm py-10 bg-surface border-t border-surface-3 flex justify-between gap-12"
161
- }, Se = { key: 1 }, Ce = { class: "px-sm py-12 bg-surface space-y-10" }, we = { class: "flex flex-col gap-8" }, Te = { class: "text-12 text-word-3" }, Ee = { class: "text-12 text-word-2 font-semibold" }, De = { class: "px-sm py-12 bg-surface border-t border-surface-3 flex items-center gap-10" }, Oe = { class: "w-20 h-20 rounded-full border border-success text-success flex items-center justify-center" }, ke = { class: "flex flex-col" }, Ae = { class: "font-semibold text-12 text-word-1 leading-tight" }, B = /* @__PURE__ */ n({
161
+ }, Se = { key: 1 }, Ce = { class: "px-sm py-12 bg-surface space-y-10" }, we = { class: "flex flex-col gap-8" }, Te = { class: "text-12 text-word-3" }, Ee = { class: "text-12 text-word-2 font-semibold" }, De = { class: "px-sm py-12 bg-surface border-t border-surface-3 flex items-center gap-10" }, Oe = { class: "w-20 h-20 rounded-full border border-success text-success flex items-center justify-center" }, ke = { class: "flex flex-col" }, Ae = { class: "font-semibold text-12 text-word-1 leading-tight" }, V = /* @__PURE__ */ n({
162
162
  __name: "PkToolShowForm",
163
163
  props: {
164
164
  part: { type: null },
@@ -167,21 +167,21 @@ var fe = {
167
167
  },
168
168
  emits: ["select"],
169
169
  setup(t, { emit: n }) {
170
- let r = t, a = n, { t: o, d } = re({ useScope: "global" }), g = v(() => JSON.parse(JSON.stringify(r.part))), _ = v(() => g.value.toolName === "showMultipleChoice" || g.value.type === "tool-showMultipleChoice"), b = v(() => D(g.value.output)), w = v(() => !r.answered && (g.value.state === "input-available" || b.value)), O = v(() => {
170
+ let r = t, i = n, { t: o, d: s } = O({ useScope: "global" }), f = y(() => JSON.parse(JSON.stringify(r.part))), _ = y(() => f.value.toolName === "showMultipleChoice" || f.value.type === "tool-showMultipleChoice"), v = y(() => k(f.value.output)), x = y(() => !r.answered && (f.value.state === "input-available" || v.value)), T = y(() => {
171
171
  let e = H.value;
172
- return e ? j.value.length === 1 && !e.allowFreeformInput && !r.allowCustomAnswer : !1;
173
- }), k = v(() => _.value && j.value.length === 1 && !H.value?.multiSelect), A = v(() => !!H.value?.options && !H.value?.multiSelect && (O.value || k.value)), j = v(() => {
174
- let e = g.value.input;
172
+ return e ? M.value.length === 1 && !e.allowFreeformInput && !r.allowCustomAnswer : !1;
173
+ }), A = y(() => _.value && M.value.length === 1 && !H.value?.multiSelect), j = y(() => !!H.value?.options && !H.value?.multiSelect && (T.value || A.value)), M = y(() => {
174
+ let e = f.value.input;
175
175
  return e?.steps?.length ? e.steps : e?.question && e?.options ? [{
176
176
  id: "legacy",
177
177
  question: e.question,
178
178
  options: e.options.map((e) => typeof e == "string" ? { label: e } : e)
179
179
  }] : [];
180
- }), B = v(() => g.value.state === "output-error" && !j.value.length), V = y(0), H = v(() => j.value[V.value]), U = v(() => V.value > 0), W = v(() => V.value < j.value.length - 1), je = v(() => j.value.length > 1), G = v(() => je.value ? Math.round((V.value + 1) / j.value.length * 100) : null), K = ee({}), q = y("");
181
- l(V, () => {
180
+ }), N = y(() => f.value.state === "output-error" && !M.value.length), V = b(0), H = y(() => M.value[V.value]), U = y(() => V.value > 0), W = y(() => V.value < M.value.length - 1), je = y(() => M.value.length > 1), G = y(() => je.value ? Math.round((V.value + 1) / M.value.length * 100) : null), K = ee({}), q = b("");
181
+ u(V, () => {
182
182
  q.value = "";
183
183
  });
184
- let J = v({
184
+ let J = y({
185
185
  get: () => {
186
186
  let e = H.value ? K[V.value] : void 0;
187
187
  if (!(e == null || Array.isArray(e))) return e;
@@ -189,7 +189,7 @@ var fe = {
189
189
  set: (e) => {
190
190
  H.value && (K[V.value] = e ?? null);
191
191
  }
192
- }), Y = v({
192
+ }), Y = y({
193
193
  get: () => {
194
194
  let e = H.value ? K[V.value] : void 0;
195
195
  return Array.isArray(e) ? e : [];
@@ -203,12 +203,12 @@ var fe = {
203
203
  let t = e.answers;
204
204
  return Array.isArray(t) ? t : void 0;
205
205
  }
206
- l(() => g.value.output, (e) => {
207
- !e || D(e) || Object.assign(K, oe(j.value, e));
206
+ u(() => f.value.output, (e) => {
207
+ !e || k(e) || Object.assign(K, ae(M.value, e));
208
208
  }, { immediate: !0 });
209
- let Ne = v(() => {
210
- let e = g.value.output;
211
- if (!e || D(e)) return;
209
+ let Ne = y(() => {
210
+ let e = f.value.output;
211
+ if (!e || k(e)) return;
212
212
  if (typeof e == "string") return e;
213
213
  let t = Me(e);
214
214
  if (t?.length === 1) {
@@ -216,10 +216,10 @@ var fe = {
216
216
  return Array.isArray(e) ? e.join(", ") : String(e);
217
217
  }
218
218
  });
219
- l(Ne, (e) => {
219
+ u(Ne, (e) => {
220
220
  !e || !H.value || (H.value.options ?? []).map((e) => e.label).includes(e) || (q.value = e);
221
221
  }, { immediate: !0 });
222
- let X = v(() => ae(H.value));
222
+ let X = y(() => ie(H.value));
223
223
  function Z() {
224
224
  if (q.value.trim()) {
225
225
  $();
@@ -231,87 +231,87 @@ var fe = {
231
231
  U.value && V.value--;
232
232
  }
233
233
  function Q() {
234
- if (!w.value) return;
235
- let e = j.value.map((e, t) => ({
234
+ if (!x.value) return;
235
+ let e = M.value.map((e, t) => ({
236
236
  id: e.id,
237
237
  value: K[t] ?? null
238
238
  }));
239
- if (k.value && !H.value?.allowFreeformInput) {
239
+ if (A.value && !H.value?.allowFreeformInput) {
240
240
  let t = e[0].value;
241
- a("select", Array.isArray(t) ? t[0] : t);
242
- } else a("select", { answers: e });
241
+ i("select", Array.isArray(t) ? t[0] : t);
242
+ } else i("select", { answers: e });
243
243
  }
244
244
  function $() {
245
245
  let e = q.value.trim();
246
- e && (K[V.value] = e, q.value = "", j.value.length === 1 ? Q() : Z());
246
+ e && (K[V.value] = e, q.value = "", M.value.length === 1 ? Q() : Z());
247
247
  }
248
248
  function Fe() {
249
- w.value && (O.value || k.value) && Q();
249
+ x.value && (T.value || A.value) && Q();
250
250
  }
251
251
  function Ie(e, t) {
252
252
  let n = K[t];
253
- return n == null ? "—" : Array.isArray(n) ? n.join(", ") : e.type === "date" ? d(new Date(n), "short") : n;
253
+ return n == null ? "—" : Array.isArray(n) ? n.join(", ") : e.type === "date" ? s(new Date(n), "short") : n;
254
254
  }
255
255
  return (t, n) => {
256
- let r = le, a = se, l = ce;
257
- return B.value ? (i(), S("div", fe, [n[4] ||= h("span", { class: "i-vv-alert-circle text-16 shrink-0" }, null, -1), h("span", null, c(f(o)("message.formRenderError")), 1)])) : j.value.length ? (i(), S("div", pe, [g.value.input?.title || w.value && j.value.length > 1 ? (i(), S("div", me, [g.value.input?.title ? (i(), S("div", {
256
+ let r = ce, i = oe, s = se;
257
+ return N.value ? (a(), C("div", de, [n[4] ||= g("span", { class: "i-vv-alert-circle text-16 shrink-0" }, null, -1), g("span", null, l(p(o)("message.formRenderError")), 1)])) : M.value.length ? (a(), C("div", fe, [f.value.input?.title || x.value && M.value.length > 1 ? (a(), C("div", pe, [f.value.input?.title ? (a(), C("div", {
258
258
  key: 0,
259
- class: s(["px-sm py-10 font-bold", { "border-b border-surface-3": w.value && j.value.length > 1 }])
260
- }, c(g.value.input?.title), 3)) : u("", !0), w.value && j.value.length > 1 ? (i(), S("div", he, [h("div", M, [h("span", null, c(f(o)("showForm.step", {
259
+ class: c(["px-sm py-10 font-bold", { "border-b border-surface-3": x.value && M.value.length > 1 }])
260
+ }, l(f.value.input?.title), 3)) : d("", !0), x.value && M.value.length > 1 ? (a(), C("div", P, [g("div", F, [g("span", null, l(p(o)("showForm.step", {
261
261
  current: V.value + 1,
262
- total: j.value.length
263
- })), 1), h("span", null, c(G.value) + "%", 1)]), h("div", N, [h("div", {
262
+ total: M.value.length
263
+ })), 1), g("span", null, l(G.value) + "%", 1)]), g("div", I, [g("div", {
264
264
  class: "h-full bg-word-4 transition-all duration-300",
265
265
  style: ne({ width: `${G.value}%` })
266
- }, null, 4)])])) : u("", !0)])) : u("", !0), w.value ? (i(), S(p, { key: 1 }, [
267
- h("div", P, [h("div", F, [h("strong", I, c(H.value.question), 1), H.value.message ? (i(), m(ie, {
266
+ }, null, 4)])])) : d("", !0)])) : d("", !0), x.value ? (a(), C(m, { key: 1 }, [
267
+ g("div", L, [g("div", R, [g("strong", z, l(H.value.question), 1), H.value.message ? (a(), h(re, {
268
268
  key: 0,
269
269
  markdown: H.value.message,
270
270
  class: "text-word-2 mt-4"
271
- }, null, 8, ["markdown"])) : u("", !0)]), H.value.options && H.value.multiSelect ? (i(), m(de, {
271
+ }, null, 8, ["markdown"])) : d("", !0)]), H.value.options && H.value.multiSelect ? (a(), h(ue, {
272
272
  key: 0,
273
273
  modelValue: Y.value,
274
274
  "onUpdate:modelValue": n[0] ||= (e) => Y.value = e,
275
275
  name: H.value.id,
276
276
  options: X.value,
277
- readonly: !w.value,
277
+ readonly: !x.value,
278
278
  class: "mb-0",
279
279
  vertical: ""
280
- }, T({ _: 2 }, [E(X.value, (t) => ({
280
+ }, E({ _: 2 }, [D(X.value, (t) => ({
281
281
  name: t.value,
282
- fn: e(() => [h("div", L, [h("div", R, c(t.label), 1), t.description ? (i(), S("div", ge, c(t.description), 1)) : u("", !0)])])
282
+ fn: e(() => [g("div", B, [g("div", me, l(t.label), 1), t.description ? (a(), C("div", he, l(t.description), 1)) : d("", !0)])])
283
283
  }))]), 1032, [
284
284
  "modelValue",
285
285
  "name",
286
286
  "options",
287
287
  "readonly"
288
- ])) : H.value.options && !H.value.multiSelect ? (i(), m(ue, {
288
+ ])) : H.value.options && !H.value.multiSelect ? (a(), h(le, {
289
289
  key: 1,
290
290
  modelValue: J.value,
291
291
  "onUpdate:modelValue": [n[1] ||= (e) => J.value = e, Fe],
292
292
  name: H.value.id,
293
293
  options: X.value,
294
- readonly: !w.value,
294
+ readonly: !x.value,
295
295
  vertical: "",
296
296
  class: "mb-0"
297
- }, T({ _: 2 }, [E(X.value, (t) => ({
297
+ }, E({ _: 2 }, [D(X.value, (t) => ({
298
298
  name: t.value,
299
- fn: e(() => [h("div", _e, [h("div", ve, c(t.label), 1), t.description ? (i(), S("div", ye, c(t.description), 1)) : u("", !0)])])
299
+ fn: e(() => [g("div", ge, [g("div", _e, l(t.label), 1), t.description ? (a(), C("div", ve, l(t.description), 1)) : d("", !0)])])
300
300
  }))]), 1032, [
301
301
  "modelValue",
302
302
  "name",
303
303
  "options",
304
304
  "readonly"
305
- ])) : H.value.options ? u("", !0) : (i(), S("div", be, [(i(), m(r, {
305
+ ])) : H.value.options ? d("", !0) : (a(), C("div", ye, [(a(), h(r, {
306
306
  key: H.value.id,
307
307
  modelValue: J.value,
308
308
  "onUpdate:modelValue": n[2] ||= (e) => J.value = e,
309
- placeholder: H.value.placeholder || f(o)("placeholder.insert"),
309
+ placeholder: H.value.placeholder || p(o)("placeholder.insert"),
310
310
  type: H.value.type,
311
311
  class: "w-full",
312
312
  name: H.value.id,
313
313
  modifiers: "compact",
314
- disabled: !w.value,
314
+ disabled: !x.value,
315
315
  onKeyup: te(Z, ["enter"])
316
316
  }, null, 8, [
317
317
  "modelValue",
@@ -320,52 +320,52 @@ var fe = {
320
320
  "name",
321
321
  "disabled"
322
322
  ]))]))]),
323
- H.value.allowFreeformInput && H.value.options ? (i(), S("div", xe, [h("form", {
323
+ H.value.allowFreeformInput && H.value.options ? (a(), C("div", be, [g("form", {
324
324
  class: "flex gap-xs pt-sm",
325
- onSubmit: x($, ["prevent"])
326
- }, [(i(), m(r, {
325
+ onSubmit: S($, ["prevent"])
326
+ }, [(a(), h(r, {
327
327
  key: `${H.value.id}-custom`,
328
328
  modelValue: q.value,
329
329
  "onUpdate:modelValue": n[3] ||= (e) => q.value = e,
330
330
  class: "flex-1",
331
331
  name: `${H.value.id}-custom`,
332
332
  modifiers: "compact",
333
- disabled: !w.value,
334
- placeholder: H.value.placeholder || f(o)("showForm.otherPlaceholder")
333
+ disabled: !x.value,
334
+ placeholder: H.value.placeholder || p(o)("showForm.otherPlaceholder")
335
335
  }, null, 8, [
336
336
  "modelValue",
337
337
  "name",
338
338
  "disabled",
339
339
  "placeholder"
340
- ]))], 32)])) : u("", !0),
341
- A.value ? u("", !0) : (i(), S("div", z, [U.value ? (i(), m(a, {
340
+ ]))], 32)])) : d("", !0),
341
+ j.value ? d("", !0) : (a(), C("div", xe, [U.value ? (a(), h(i, {
342
342
  key: 0,
343
343
  modifiers: "action-quiet",
344
344
  icon: "ri:arrow-left-s-line",
345
- label: f(o)("action.back"),
346
- onClick: x(Pe, ["stop"])
347
- }, null, 8, ["label"])) : (i(), S("div", Se)), C(a, {
345
+ label: p(o)("action.back"),
346
+ onClick: S(Pe, ["stop"])
347
+ }, null, 8, ["label"])) : (a(), C("div", Se)), w(i, {
348
348
  modifiers: W.value ? "action-quiet" : "action-primary",
349
349
  icon: W.value ? "ri:arrow-right-s-line" : "ri:send-plane-2-line",
350
350
  "icon-position": "right",
351
- label: W.value ? f(o)("action.next") : f(o)("action.submit"),
352
- onClick: x(Z, ["stop"])
351
+ label: W.value ? p(o)("action.next") : p(o)("action.submit"),
352
+ onClick: S(Z, ["stop"])
353
353
  }, null, 8, [
354
354
  "modifiers",
355
355
  "icon",
356
356
  "label"
357
357
  ])]))
358
- ], 64)) : (i(), S(p, { key: 2 }, [h("div", Ce, [h("ul", we, [(i(!0), S(p, null, E(j.value, (e, t) => (i(), S("li", {
358
+ ], 64)) : (a(), C(m, { key: 2 }, [g("div", Ce, [g("ul", we, [(a(!0), C(m, null, D(M.value, (e, t) => (a(), C("li", {
359
359
  key: t,
360
360
  class: "leading-normal"
361
- }, [h("div", Te, c(e.question), 1), h("span", Ee, c(Ie(e, t)), 1)]))), 128))])]), h("div", De, [h("div", Oe, [C(l, {
361
+ }, [g("div", Te, l(e.question), 1), g("span", Ee, l(Ie(e, t)), 1)]))), 128))])]), g("div", De, [g("div", Oe, [w(s, {
362
362
  name: "ri:check-line",
363
363
  class: "text-12"
364
- })]), h("div", ke, [h("span", Ae, c(f(o)("showForm.completed")), 1)])])], 64))])) : u("", !0);
364
+ })]), g("div", ke, [g("span", Ae, l(p(o)("showForm.completed")), 1)])])], 64))])) : d("", !0);
365
365
  };
366
366
  }
367
367
  });
368
368
  //#endregion
369
- export { B as default };
369
+ export { V as default };
370
370
 
371
- //# sourceMappingURL=PkToolShowForm-CadrjzZx.js.map
371
+ //# sourceMappingURL=PkToolShowForm-gD0MfOjQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PkToolShowForm-gD0MfOjQ.js","names":[],"sources":["../../../../packages/components/src/PkEditorRadioButtons.vue","../../../../packages/components/src/PkEditorRadioButtons.vue","../../../../packages/components/src/PkEditorCheckboxButtons.vue","../../../../packages/components/src/PkEditorCheckboxButtons.vue","../../../../packages/components/src/chat/PkToolShowForm.vue","../../../../packages/components/src/chat/PkToolShowForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import type { Option } from '@volverjs/ui-vue'\n import { computed, useId } from 'vue'\n\n const props = defineProps<{\n name: string\n label?: string\n hintLabel?: string\n invalid?: boolean\n invalidLabel?: string | string[]\n required?: boolean\n options: Option[]\n readonly?: boolean\n disabled?: boolean\n modifiers?: string | string[]\n /**\n * Render the options as one segmented control (a recessed track with\n * the chosen option raised) instead of a row of boxed cards. Suits a\n * choice between a few short named states, such as a level or a mode.\n */\n segmented?: boolean\n }>()\n\n const modelValue = defineModel<\n string | number | boolean | symbol | unknown[] | undefined\n >({ default: undefined })\n\n // Native radios group by their name attribute across the whole document, so\n // two instances sharing one name become a single group: the browser unchecks\n // the other instance's inputs and Vue never puts them back, because its own\n // model did not change. It happened with \"theme\", offered by the profile\n // menu and the agent settings panel at the same time, and it can happen to\n // any two tool forms with the same step id. Scope the name to the instance.\n const uid = useId()\n const groupName = computed(() => `${props.name}-${uid}`)\n\n const radioModifiers = computed(() => {\n const toReturn = props.modifiers\n ? Array.isArray(props.modifiers)\n ? props.modifiers\n : [props.modifiers]\n : []\n return [...toReturn, props.segmented ? 'segment' : 'button']\n })\n</script>\n\n<template>\n <VvRadioGroup\n v-model=\"modelValue\"\n :name=\"groupName\"\n :label\n :hint-label=\"hintLabel\"\n :invalid\n :invalid-label=\"invalidLabel\"\n :modifiers=\"segmented ? 'segmented' : 'buttons'\">\n <VvRadio\n v-for=\"(option, key) in options\"\n :key\n :name=\"groupName\"\n :required\n :readonly\n :disabled\n :value=\"option.value\"\n :modifiers=\"radioModifiers\">\n <slot :name=\"option.value\" v-bind=\"{ option }\">\n {{ option.label }}\n </slot>\n </VvRadio>\n </VvRadioGroup>\n</template>\n","<script setup lang=\"ts\">\n import type { Option } from '@volverjs/ui-vue'\n import { computed, useId } from 'vue'\n\n const props = defineProps<{\n name: string\n label?: string\n hintLabel?: string\n invalid?: boolean\n invalidLabel?: string | string[]\n required?: boolean\n options: Option[]\n readonly?: boolean\n disabled?: boolean\n modifiers?: string | string[]\n /**\n * Render the options as one segmented control (a recessed track with\n * the chosen option raised) instead of a row of boxed cards. Suits a\n * choice between a few short named states, such as a level or a mode.\n */\n segmented?: boolean\n }>()\n\n const modelValue = defineModel<\n string | number | boolean | symbol | unknown[] | undefined\n >({ default: undefined })\n\n // Native radios group by their name attribute across the whole document, so\n // two instances sharing one name become a single group: the browser unchecks\n // the other instance's inputs and Vue never puts them back, because its own\n // model did not change. It happened with \"theme\", offered by the profile\n // menu and the agent settings panel at the same time, and it can happen to\n // any two tool forms with the same step id. Scope the name to the instance.\n const uid = useId()\n const groupName = computed(() => `${props.name}-${uid}`)\n\n const radioModifiers = computed(() => {\n const toReturn = props.modifiers\n ? Array.isArray(props.modifiers)\n ? props.modifiers\n : [props.modifiers]\n : []\n return [...toReturn, props.segmented ? 'segment' : 'button']\n })\n</script>\n\n<template>\n <VvRadioGroup\n v-model=\"modelValue\"\n :name=\"groupName\"\n :label\n :hint-label=\"hintLabel\"\n :invalid\n :invalid-label=\"invalidLabel\"\n :modifiers=\"segmented ? 'segmented' : 'buttons'\">\n <VvRadio\n v-for=\"(option, key) in options\"\n :key\n :name=\"groupName\"\n :required\n :readonly\n :disabled\n :value=\"option.value\"\n :modifiers=\"radioModifiers\">\n <slot :name=\"option.value\" v-bind=\"{ option }\">\n {{ option.label }}\n </slot>\n </VvRadio>\n </VvRadioGroup>\n</template>\n","<script setup lang=\"ts\">\n import type { Option } from '@volverjs/ui-vue'\n\n defineProps<{\n name: string\n required?: boolean\n options: Option[]\n readonly?: boolean\n disabled?: boolean\n }>()\n\n const modelValue = defineModel<unknown[] | undefined>({\n default: undefined,\n })\n</script>\n\n<template>\n <VvCheckboxGroup v-model=\"modelValue\" :name modifiers=\"buttons\">\n <VvCheckbox\n v-for=\"(option, key) in options\"\n :key\n :name\n :required\n :readonly\n :disabled\n :value=\"option.value\"\n modifiers=\"button\">\n <slot :name=\"String(option.value)\" v-bind=\"{ option }\">\n {{ option.label }}\n </slot>\n </VvCheckbox>\n </VvCheckboxGroup>\n</template>\n","<script setup lang=\"ts\">\n import type { Option } from '@volverjs/ui-vue'\n\n defineProps<{\n name: string\n required?: boolean\n options: Option[]\n readonly?: boolean\n disabled?: boolean\n }>()\n\n const modelValue = defineModel<unknown[] | undefined>({\n default: undefined,\n })\n</script>\n\n<template>\n <VvCheckboxGroup v-model=\"modelValue\" :name modifiers=\"buttons\">\n <VvCheckbox\n v-for=\"(option, key) in options\"\n :key\n :name\n :required\n :readonly\n :disabled\n :value=\"option.value\"\n modifiers=\"button\">\n <slot :name=\"String(option.value)\" v-bind=\"{ option }\">\n {{ option.label }}\n </slot>\n </VvCheckbox>\n </VvCheckboxGroup>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref, reactive, watch } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { isVoiceRenderAck } from 'models'\n import { formAnswerSlots, formStepOptions } from './utils'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n import PkEditorRadioButtons from '../PkEditorRadioButtons.vue'\n import PkEditorCheckboxButtons from '../PkEditorCheckboxButtons.vue'\n\n // --- Types ---\n\n interface FormOption {\n label: string\n description?: string\n }\n\n interface FormStep {\n id: string\n question: string\n message?: string\n type?: 'text' | 'number' | 'date'\n options?: FormOption[]\n multiSelect?: boolean\n allowFreeformInput?: boolean\n placeholder?: string\n }\n\n interface FormAnswer {\n id: string\n value: string | string[] | number | null\n }\n\n interface ToolPartShape {\n state?: 'input-available' | 'output-available' | 'output-error'\n toolCallId?: string\n // AI SDK v5 encodes the tool name in `type` (e.g. 'tool-showMultipleChoice').\n // `toolName` is kept for backward compatibility but is normally absent.\n type?: string\n toolName?: string\n input?: {\n title?: string\n steps?: FormStep[]\n // Legacy showMultipleChoice fields\n question?: string\n options?: (string | FormOption)[]\n }\n // The web card submits `{ answers: [...] }`; the platform channels\n // (Teams modal) submit a flat record keyed by step id.\n output?: string | { answers: FormAnswer[] } | Record<string, unknown>\n }\n\n type AnswerValue = string | string[] | number | null\n\n // --- Props & Emits ---\n\n const props = defineProps<{\n part: unknown\n allowCustomAnswer?: boolean\n /**\n * Answered during a call. Nothing in the part says so (the answer went\n * to the agent as speech, not to the tool call), so the surface that\n * sent it is the only one that knows, and without it the same form\n * could be submitted again and again.\n */\n answered?: boolean\n }>()\n\n const emit = defineEmits<{\n select: [answer: string | { answers: FormAnswer[] }]\n }>()\n\n const { t: $t, d: $d } = useI18n({ useScope: 'global' })\n\n // --- Parsed tool part ---\n\n const toolPart = computed(\n () => JSON.parse(JSON.stringify(props.part)) as ToolPartShape,\n )\n\n const isLegacy = computed(\n () =>\n toolPart.value.toolName === 'showMultipleChoice' ||\n toolPart.value.type === 'tool-showMultipleChoice',\n )\n\n /**\n * A form drawn during a CALL is already \"answered\" as far as the tool loop\n * is concerned: the turn could not wait for it, so the backend closed it\n * with a note saying the widget was drawn (see `isVoiceRenderAck`). That\n * note is not an answer, and the caller still has to give one.\n */\n const isRenderAck = computed(() => isVoiceRenderAck(toolPart.value.output))\n\n const isInteractive = computed(\n () =>\n !props.answered &&\n (toolPart.value.state === 'input-available' || isRenderAck.value),\n )\n\n /** Single-step with no custom-answer and no freeform → auto-submit on option pick */\n const isAutoSubmitStep = computed(() => {\n const step = currentStep.value\n if (!step) return false\n return (\n steps.value.length === 1 &&\n !step.allowFreeformInput &&\n !props.allowCustomAnswer\n )\n })\n\n /** Legacy tool should auto-submit on option pick regardless of allowCustomAnswer */\n const isLegacyAutoSubmit = computed(\n () =>\n isLegacy.value &&\n steps.value.length === 1 &&\n !currentStep.value?.multiSelect,\n )\n\n /**\n * True only for the steps that send themselves as soon as an option is\n * picked: the single case where the footer button would be redundant.\n * Every other shape needs it, single-step forms included: with\n * `allowFreeformInput` (or `allowCustomAnswer`) the radio pick no longer\n * auto-submits, so without the footer the user was left with a chosen\n * option and no way to send it.\n */\n const isSelfSubmitting = computed(\n () =>\n Boolean(currentStep.value?.options) &&\n !currentStep.value?.multiSelect &&\n (isAutoSubmitStep.value || isLegacyAutoSubmit.value),\n )\n\n // --- Steps ---\n\n const steps = computed<FormStep[]>(() => {\n const input = toolPart.value.input\n if (input?.steps?.length) {\n return input.steps\n }\n // Legacy showMultipleChoice → normalize into a single step\n if (input?.question && input?.options) {\n return [\n {\n id: 'legacy',\n question: input.question,\n options: input.options.map((o) =>\n typeof o === 'string' ? { label: o } : o,\n ),\n },\n ]\n }\n return []\n })\n\n /**\n * The reason the card has nothing to draw. A call the SDK rejected keeps\n * `state: 'output-error'` and moves the arguments it could not validate to\n * `rawInput`, so `input` is empty and there are no steps: without this the\n * component rendered NOTHING, and the user was left with a question that\n * had been announced and never appeared.\n */\n const hasFailed = computed(\n () => toolPart.value.state === 'output-error' && !steps.value.length,\n )\n\n // --- Navigation state ---\n\n const currentStepIndex = ref(0)\n const currentStep = computed(() => steps.value[currentStepIndex.value])\n const canGoBack = computed(() => currentStepIndex.value > 0)\n const canGoNext = computed(\n () => currentStepIndex.value < steps.value.length - 1,\n )\n const isMultiStep = computed(() => steps.value.length > 1)\n\n const progress = computed(() => {\n if (!isMultiStep.value) return null\n return Math.round(\n ((currentStepIndex.value + 1) / steps.value.length) * 100,\n )\n })\n\n // --- Answers ---\n\n /**\n * One slot PER STEP, keyed by position and not by step id: the ids come\n * from the model and nothing enforces they are unique, and keyed by id two\n * steps sharing one collapsed onto a single answer. See `formAnswerSlots`.\n */\n const answers = reactive<Record<number, AnswerValue>>({})\n const customAnswer = ref('')\n\n // The freeform field belongs to the step showing it: text left behind\n // (unsubmitted, or arriving from a late input update) must not follow the\n // user to the next or previous question.\n watch(currentStepIndex, () => {\n customAnswer.value = ''\n })\n\n // Single scalar answer shared by radio buttons and freeform text/number/date inputs.\n const scalarValue = computed<string | number | undefined>({\n get: () => {\n const val = currentStep.value\n ? answers[currentStepIndex.value]\n : undefined\n if (val == null || Array.isArray(val)) return undefined\n return val\n },\n set: (val) => {\n if (currentStep.value) {\n answers[currentStepIndex.value] = val ?? null\n }\n },\n })\n\n const activeCheckboxValue = computed<unknown[] | undefined>({\n get: () => {\n const val = currentStep.value\n ? answers[currentStepIndex.value]\n : undefined\n return Array.isArray(val) ? val : []\n },\n set: (val) => {\n if (currentStep.value) {\n answers[currentStepIndex.value] = (val as string[]) ?? []\n }\n },\n })\n\n // --- Initialize answers from existing output ---\n\n /** The `{ answers: [...] }` list, when the output carries one. */\n function outputAnswers(output: ToolPartShape['output']) {\n if (!output || typeof output === 'string') return undefined\n const list = (output as { answers?: unknown }).answers\n return Array.isArray(list) ? (list as FormAnswer[]) : undefined\n }\n\n watch(\n () => toolPart.value.output,\n (output) => {\n if (!output || isVoiceRenderAck(output)) return\n // Every shape an answered form comes back in (the web card's list,\n // a legacy plain string, the flat record a platform channel posts)\n // lands on the same per-position slots: see `formAnswerSlots`.\n Object.assign(\n answers,\n formAnswerSlots(steps.value, output) as Record<\n number,\n AnswerValue\n >,\n )\n },\n { immediate: true },\n )\n\n // --- Restore custom answer from output when it doesn't match any option ---\n\n const normalizedOutput = computed(() => {\n const out = toolPart.value.output\n if (!out || isVoiceRenderAck(out)) return undefined\n if (typeof out === 'string') return out\n const list = outputAnswers(out)\n if (list?.length === 1) {\n const val = list[0].value\n return Array.isArray(val) ? val.join(', ') : String(val)\n }\n return undefined\n })\n\n watch(\n normalizedOutput,\n (value) => {\n if (!value || !currentStep.value) return\n const optionLabels = (currentStep.value.options ?? []).map(\n (o) => o.label,\n )\n if (!optionLabels.includes(value)) {\n customAnswer.value = value\n }\n },\n { immediate: true },\n )\n\n // --- Option mapping for radio/checkbox components ---\n\n const radioOptions = computed(() => formStepOptions(currentStep.value))\n\n // --- Navigation & Submission ---\n\n /** Footer button, and Enter on a pure freeform step. */\n function goNext() {\n // A typed freeform answer wins over the picked option: it is the more\n // recent intent, and the footer button is now the visible way to send\n // it (the freeform field only submits on Enter).\n if (customAnswer.value.trim()) {\n submitCustomAnswer()\n return\n }\n if (canGoNext.value) {\n currentStepIndex.value++\n } else {\n submitForm()\n }\n }\n\n function goBack() {\n if (canGoBack.value) {\n currentStepIndex.value--\n }\n }\n\n function submitForm() {\n if (!isInteractive.value) return\n\n const finalAnswers: FormAnswer[] = steps.value.map((step, index) => ({\n id: step.id,\n value: answers[index] ?? null,\n }))\n\n // Legacy backward compatibility: single-step, single-select → return plain string\n if (\n isLegacyAutoSubmit.value &&\n !currentStep.value?.allowFreeformInput\n ) {\n const val = finalAnswers[0].value\n emit('select', Array.isArray(val) ? val[0] : (val as string))\n } else {\n emit('select', { answers: finalAnswers })\n }\n }\n\n /** Enter inside the freeform field shown alongside the options. */\n function submitCustomAnswer() {\n const value = customAnswer.value.trim()\n if (!value) return\n\n answers[currentStepIndex.value] = value\n // Cleared before navigating: `goNext()` reads it back to route a typed\n // answer here, so leaving it set would recurse.\n customAnswer.value = ''\n if (steps.value.length === 1) {\n submitForm()\n } else {\n goNext()\n }\n }\n\n function onRadioChange() {\n if (!isInteractive.value) return\n if (isAutoSubmitStep.value || isLegacyAutoSubmit.value) {\n submitForm()\n }\n }\n\n // --- Summary helpers ---\n\n function getSummaryValue(step: FormStep, index: number) {\n const val = answers[index]\n if (val == null) return '—'\n if (Array.isArray(val)) return val.join(', ')\n if (step.type === 'date') return $d(new Date(val), 'short')\n return val\n }\n</script>\n\n<template>\n <div\n v-if=\"hasFailed\"\n class=\"text-12 text-danger flex items-center gap-6 py-8\">\n <span class=\"i-vv-alert-circle text-16 shrink-0\" />\n <span>{{ $t('message.formRenderError') }}</span>\n </div>\n <div\n v-else-if=\"steps.length\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden flex flex-col bg-surface\">\n <!-- Header -->\n <div\n v-if=\"toolPart.input?.title || (isInteractive && steps.length > 1)\"\n class=\"text-12 border-b border-surface-3 text-word-3 bg-surface-1\">\n <div\n v-if=\"toolPart.input?.title\"\n class=\"px-sm py-10 font-bold\"\n :class=\"{\n 'border-b border-surface-3':\n isInteractive && steps.length > 1,\n }\">\n {{ toolPart.input?.title }}\n </div>\n <!-- Progress for multi-step -->\n <div\n v-if=\"isInteractive && steps.length > 1\"\n class=\"flex flex-col gap-4 p-sm\">\n <div class=\"flex justify-between text-10 text-word-3\">\n <span>\n {{\n $t('showForm.step', {\n current: currentStepIndex + 1,\n total: steps.length,\n })\n }}\n </span>\n <span>{{ progress }}%</span>\n </div>\n <div class=\"h-4 bg-surface-3 rounded-full overflow-hidden\">\n <div\n class=\"h-full bg-word-4 transition-all duration-300\"\n :style=\"{ width: `${progress}%` }\"></div>\n </div>\n </div>\n </div>\n\n <!-- Input Available State -->\n <template v-if=\"isInteractive\">\n <!-- Current Step Content -->\n <div class=\"px-sm py-16 flex flex-col gap-12\">\n <div class=\"leading-normal text-12\">\n <strong class=\"font-semibold\">\n {{ currentStep.question }}\n </strong>\n <PkStreamingMarkdown\n v-if=\"currentStep.message\"\n :markdown=\"currentStep.message\"\n class=\"text-word-2 mt-4\" />\n </div>\n\n <!-- Checkbox list for multi-select -->\n <PkEditorCheckboxButtons\n v-if=\"currentStep.options && currentStep.multiSelect\"\n v-model=\"activeCheckboxValue\"\n :name=\"currentStep.id\"\n :options=\"radioOptions\"\n :readonly=\"!isInteractive\"\n class=\"mb-0\"\n vertical>\n <template\n v-for=\"option in radioOptions\"\n :key=\"option.value\"\n #[option.value]>\n <!-- Shared option layout: label + optional description -->\n <div class=\"text-12\">\n <div class=\"font-semibold\">{{ option.label }}</div>\n <div v-if=\"option.description\" class=\"text-word-3\">\n {{ option.description }}\n </div>\n </div>\n </template>\n </PkEditorCheckboxButtons>\n\n <!-- Radio buttons for single-select -->\n <PkEditorRadioButtons\n v-else-if=\"currentStep.options && !currentStep.multiSelect\"\n v-model=\"scalarValue\"\n :name=\"currentStep.id\"\n :options=\"radioOptions\"\n :readonly=\"!isInteractive\"\n vertical\n class=\"mb-0\"\n @update:model-value=\"onRadioChange\">\n <template\n v-for=\"option in radioOptions\"\n :key=\"option.value\"\n #[option.value]>\n <!-- Shared option layout: label + optional description -->\n <div class=\"text-12\">\n <div class=\"font-semibold\">{{ option.label }}</div>\n <div v-if=\"option.description\" class=\"text-word-3\">\n {{ option.description }}\n </div>\n </div>\n </template>\n </PkEditorRadioButtons>\n\n <!-- Pure Freeform Input (text, number, date) -->\n <div\n v-else-if=\"!currentStep.options\"\n class=\"flex flex-col gap-6 w-full\">\n <VvInputText\n :key=\"currentStep.id\"\n v-model=\"scalarValue\"\n :placeholder=\"\n currentStep.placeholder || $t('placeholder.insert')\n \"\n :type=\"currentStep.type\"\n class=\"w-full\"\n :name=\"currentStep.id\"\n modifiers=\"compact\"\n :disabled=\"!isInteractive\"\n @keyup.enter=\"goNext\" />\n </div>\n </div>\n\n <!-- Custom footer freeform input (shown alongside options when allowFreeformInput) -->\n <div\n v-if=\"currentStep.allowFreeformInput && currentStep.options\"\n class=\"px-sm pb-sm border-t border-surface-3\">\n <form\n class=\"flex gap-xs pt-sm\"\n @submit.prevent=\"submitCustomAnswer\">\n <VvInputText\n :key=\"`${currentStep.id}-custom`\"\n v-model=\"customAnswer\"\n class=\"flex-1\"\n :name=\"`${currentStep.id}-custom`\"\n modifiers=\"compact\"\n :disabled=\"!isInteractive\"\n :placeholder=\"\n currentStep.placeholder ||\n $t('showForm.otherPlaceholder')\n \" />\n </form>\n </div>\n\n <!-- Footer navigation: shown for every step that does not submit\n itself on option pick (see `isSelfSubmitting`). -->\n <div\n v-if=\"!isSelfSubmitting\"\n class=\"px-sm py-10 bg-surface border-t border-surface-3 flex justify-between gap-12\">\n <VvButton\n v-if=\"canGoBack\"\n modifiers=\"action-quiet\"\n icon=\"ri:arrow-left-s-line\"\n :label=\"$t('action.back')\"\n @click.stop=\"goBack\" />\n <div v-else></div>\n\n <VvButton\n :modifiers=\"canGoNext ? 'action-quiet' : 'action-primary'\"\n :icon=\"\n canGoNext\n ? 'ri:arrow-right-s-line'\n : 'ri:send-plane-2-line'\n \"\n icon-position=\"right\"\n :label=\"canGoNext ? $t('action.next') : $t('action.submit')\"\n @click.stop=\"goNext\" />\n </div>\n </template>\n\n <!-- Output Available State (Multi-step Summary) -->\n <template v-else>\n <div class=\"px-sm py-12 bg-surface space-y-10\">\n <ul class=\"flex flex-col gap-8\">\n <li\n v-for=\"(step, index) in steps\"\n :key=\"index\"\n class=\"leading-normal\">\n <div class=\"text-12 text-word-3\">\n {{ step.question }}\n </div>\n <span class=\"text-12 text-word-2 font-semibold\">\n {{ getSummaryValue(step, index) }}\n </span>\n </li>\n </ul>\n </div>\n <div\n class=\"px-sm py-12 bg-surface border-t border-surface-3 flex items-center gap-10\">\n <div\n class=\"w-20 h-20 rounded-full border border-success text-success flex items-center justify-center\">\n <VvIcon name=\"ri:check-line\" class=\"text-12\" />\n </div>\n <div class=\"flex flex-col\">\n <span\n class=\"font-semibold text-12 text-word-1 leading-tight\">\n {{ $t('showForm.completed') }}\n </span>\n </div>\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref, reactive, watch } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { isVoiceRenderAck } from 'models'\n import { formAnswerSlots, formStepOptions } from './utils'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n import PkEditorRadioButtons from '../PkEditorRadioButtons.vue'\n import PkEditorCheckboxButtons from '../PkEditorCheckboxButtons.vue'\n\n // --- Types ---\n\n interface FormOption {\n label: string\n description?: string\n }\n\n interface FormStep {\n id: string\n question: string\n message?: string\n type?: 'text' | 'number' | 'date'\n options?: FormOption[]\n multiSelect?: boolean\n allowFreeformInput?: boolean\n placeholder?: string\n }\n\n interface FormAnswer {\n id: string\n value: string | string[] | number | null\n }\n\n interface ToolPartShape {\n state?: 'input-available' | 'output-available' | 'output-error'\n toolCallId?: string\n // AI SDK v5 encodes the tool name in `type` (e.g. 'tool-showMultipleChoice').\n // `toolName` is kept for backward compatibility but is normally absent.\n type?: string\n toolName?: string\n input?: {\n title?: string\n steps?: FormStep[]\n // Legacy showMultipleChoice fields\n question?: string\n options?: (string | FormOption)[]\n }\n // The web card submits `{ answers: [...] }`; the platform channels\n // (Teams modal) submit a flat record keyed by step id.\n output?: string | { answers: FormAnswer[] } | Record<string, unknown>\n }\n\n type AnswerValue = string | string[] | number | null\n\n // --- Props & Emits ---\n\n const props = defineProps<{\n part: unknown\n allowCustomAnswer?: boolean\n /**\n * Answered during a call. Nothing in the part says so (the answer went\n * to the agent as speech, not to the tool call), so the surface that\n * sent it is the only one that knows, and without it the same form\n * could be submitted again and again.\n */\n answered?: boolean\n }>()\n\n const emit = defineEmits<{\n select: [answer: string | { answers: FormAnswer[] }]\n }>()\n\n const { t: $t, d: $d } = useI18n({ useScope: 'global' })\n\n // --- Parsed tool part ---\n\n const toolPart = computed(\n () => JSON.parse(JSON.stringify(props.part)) as ToolPartShape,\n )\n\n const isLegacy = computed(\n () =>\n toolPart.value.toolName === 'showMultipleChoice' ||\n toolPart.value.type === 'tool-showMultipleChoice',\n )\n\n /**\n * A form drawn during a CALL is already \"answered\" as far as the tool loop\n * is concerned: the turn could not wait for it, so the backend closed it\n * with a note saying the widget was drawn (see `isVoiceRenderAck`). That\n * note is not an answer, and the caller still has to give one.\n */\n const isRenderAck = computed(() => isVoiceRenderAck(toolPart.value.output))\n\n const isInteractive = computed(\n () =>\n !props.answered &&\n (toolPart.value.state === 'input-available' || isRenderAck.value),\n )\n\n /** Single-step with no custom-answer and no freeform → auto-submit on option pick */\n const isAutoSubmitStep = computed(() => {\n const step = currentStep.value\n if (!step) return false\n return (\n steps.value.length === 1 &&\n !step.allowFreeformInput &&\n !props.allowCustomAnswer\n )\n })\n\n /** Legacy tool should auto-submit on option pick regardless of allowCustomAnswer */\n const isLegacyAutoSubmit = computed(\n () =>\n isLegacy.value &&\n steps.value.length === 1 &&\n !currentStep.value?.multiSelect,\n )\n\n /**\n * True only for the steps that send themselves as soon as an option is\n * picked: the single case where the footer button would be redundant.\n * Every other shape needs it, single-step forms included: with\n * `allowFreeformInput` (or `allowCustomAnswer`) the radio pick no longer\n * auto-submits, so without the footer the user was left with a chosen\n * option and no way to send it.\n */\n const isSelfSubmitting = computed(\n () =>\n Boolean(currentStep.value?.options) &&\n !currentStep.value?.multiSelect &&\n (isAutoSubmitStep.value || isLegacyAutoSubmit.value),\n )\n\n // --- Steps ---\n\n const steps = computed<FormStep[]>(() => {\n const input = toolPart.value.input\n if (input?.steps?.length) {\n return input.steps\n }\n // Legacy showMultipleChoice → normalize into a single step\n if (input?.question && input?.options) {\n return [\n {\n id: 'legacy',\n question: input.question,\n options: input.options.map((o) =>\n typeof o === 'string' ? { label: o } : o,\n ),\n },\n ]\n }\n return []\n })\n\n /**\n * The reason the card has nothing to draw. A call the SDK rejected keeps\n * `state: 'output-error'` and moves the arguments it could not validate to\n * `rawInput`, so `input` is empty and there are no steps: without this the\n * component rendered NOTHING, and the user was left with a question that\n * had been announced and never appeared.\n */\n const hasFailed = computed(\n () => toolPart.value.state === 'output-error' && !steps.value.length,\n )\n\n // --- Navigation state ---\n\n const currentStepIndex = ref(0)\n const currentStep = computed(() => steps.value[currentStepIndex.value])\n const canGoBack = computed(() => currentStepIndex.value > 0)\n const canGoNext = computed(\n () => currentStepIndex.value < steps.value.length - 1,\n )\n const isMultiStep = computed(() => steps.value.length > 1)\n\n const progress = computed(() => {\n if (!isMultiStep.value) return null\n return Math.round(\n ((currentStepIndex.value + 1) / steps.value.length) * 100,\n )\n })\n\n // --- Answers ---\n\n /**\n * One slot PER STEP, keyed by position and not by step id: the ids come\n * from the model and nothing enforces they are unique, and keyed by id two\n * steps sharing one collapsed onto a single answer. See `formAnswerSlots`.\n */\n const answers = reactive<Record<number, AnswerValue>>({})\n const customAnswer = ref('')\n\n // The freeform field belongs to the step showing it: text left behind\n // (unsubmitted, or arriving from a late input update) must not follow the\n // user to the next or previous question.\n watch(currentStepIndex, () => {\n customAnswer.value = ''\n })\n\n // Single scalar answer shared by radio buttons and freeform text/number/date inputs.\n const scalarValue = computed<string | number | undefined>({\n get: () => {\n const val = currentStep.value\n ? answers[currentStepIndex.value]\n : undefined\n if (val == null || Array.isArray(val)) return undefined\n return val\n },\n set: (val) => {\n if (currentStep.value) {\n answers[currentStepIndex.value] = val ?? null\n }\n },\n })\n\n const activeCheckboxValue = computed<unknown[] | undefined>({\n get: () => {\n const val = currentStep.value\n ? answers[currentStepIndex.value]\n : undefined\n return Array.isArray(val) ? val : []\n },\n set: (val) => {\n if (currentStep.value) {\n answers[currentStepIndex.value] = (val as string[]) ?? []\n }\n },\n })\n\n // --- Initialize answers from existing output ---\n\n /** The `{ answers: [...] }` list, when the output carries one. */\n function outputAnswers(output: ToolPartShape['output']) {\n if (!output || typeof output === 'string') return undefined\n const list = (output as { answers?: unknown }).answers\n return Array.isArray(list) ? (list as FormAnswer[]) : undefined\n }\n\n watch(\n () => toolPart.value.output,\n (output) => {\n if (!output || isVoiceRenderAck(output)) return\n // Every shape an answered form comes back in (the web card's list,\n // a legacy plain string, the flat record a platform channel posts)\n // lands on the same per-position slots: see `formAnswerSlots`.\n Object.assign(\n answers,\n formAnswerSlots(steps.value, output) as Record<\n number,\n AnswerValue\n >,\n )\n },\n { immediate: true },\n )\n\n // --- Restore custom answer from output when it doesn't match any option ---\n\n const normalizedOutput = computed(() => {\n const out = toolPart.value.output\n if (!out || isVoiceRenderAck(out)) return undefined\n if (typeof out === 'string') return out\n const list = outputAnswers(out)\n if (list?.length === 1) {\n const val = list[0].value\n return Array.isArray(val) ? val.join(', ') : String(val)\n }\n return undefined\n })\n\n watch(\n normalizedOutput,\n (value) => {\n if (!value || !currentStep.value) return\n const optionLabels = (currentStep.value.options ?? []).map(\n (o) => o.label,\n )\n if (!optionLabels.includes(value)) {\n customAnswer.value = value\n }\n },\n { immediate: true },\n )\n\n // --- Option mapping for radio/checkbox components ---\n\n const radioOptions = computed(() => formStepOptions(currentStep.value))\n\n // --- Navigation & Submission ---\n\n /** Footer button, and Enter on a pure freeform step. */\n function goNext() {\n // A typed freeform answer wins over the picked option: it is the more\n // recent intent, and the footer button is now the visible way to send\n // it (the freeform field only submits on Enter).\n if (customAnswer.value.trim()) {\n submitCustomAnswer()\n return\n }\n if (canGoNext.value) {\n currentStepIndex.value++\n } else {\n submitForm()\n }\n }\n\n function goBack() {\n if (canGoBack.value) {\n currentStepIndex.value--\n }\n }\n\n function submitForm() {\n if (!isInteractive.value) return\n\n const finalAnswers: FormAnswer[] = steps.value.map((step, index) => ({\n id: step.id,\n value: answers[index] ?? null,\n }))\n\n // Legacy backward compatibility: single-step, single-select → return plain string\n if (\n isLegacyAutoSubmit.value &&\n !currentStep.value?.allowFreeformInput\n ) {\n const val = finalAnswers[0].value\n emit('select', Array.isArray(val) ? val[0] : (val as string))\n } else {\n emit('select', { answers: finalAnswers })\n }\n }\n\n /** Enter inside the freeform field shown alongside the options. */\n function submitCustomAnswer() {\n const value = customAnswer.value.trim()\n if (!value) return\n\n answers[currentStepIndex.value] = value\n // Cleared before navigating: `goNext()` reads it back to route a typed\n // answer here, so leaving it set would recurse.\n customAnswer.value = ''\n if (steps.value.length === 1) {\n submitForm()\n } else {\n goNext()\n }\n }\n\n function onRadioChange() {\n if (!isInteractive.value) return\n if (isAutoSubmitStep.value || isLegacyAutoSubmit.value) {\n submitForm()\n }\n }\n\n // --- Summary helpers ---\n\n function getSummaryValue(step: FormStep, index: number) {\n const val = answers[index]\n if (val == null) return '—'\n if (Array.isArray(val)) return val.join(', ')\n if (step.type === 'date') return $d(new Date(val), 'short')\n return val\n }\n</script>\n\n<template>\n <div\n v-if=\"hasFailed\"\n class=\"text-12 text-danger flex items-center gap-6 py-8\">\n <span class=\"i-vv-alert-circle text-16 shrink-0\" />\n <span>{{ $t('message.formRenderError') }}</span>\n </div>\n <div\n v-else-if=\"steps.length\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden flex flex-col bg-surface\">\n <!-- Header -->\n <div\n v-if=\"toolPart.input?.title || (isInteractive && steps.length > 1)\"\n class=\"text-12 border-b border-surface-3 text-word-3 bg-surface-1\">\n <div\n v-if=\"toolPart.input?.title\"\n class=\"px-sm py-10 font-bold\"\n :class=\"{\n 'border-b border-surface-3':\n isInteractive && steps.length > 1,\n }\">\n {{ toolPart.input?.title }}\n </div>\n <!-- Progress for multi-step -->\n <div\n v-if=\"isInteractive && steps.length > 1\"\n class=\"flex flex-col gap-4 p-sm\">\n <div class=\"flex justify-between text-10 text-word-3\">\n <span>\n {{\n $t('showForm.step', {\n current: currentStepIndex + 1,\n total: steps.length,\n })\n }}\n </span>\n <span>{{ progress }}%</span>\n </div>\n <div class=\"h-4 bg-surface-3 rounded-full overflow-hidden\">\n <div\n class=\"h-full bg-word-4 transition-all duration-300\"\n :style=\"{ width: `${progress}%` }\"></div>\n </div>\n </div>\n </div>\n\n <!-- Input Available State -->\n <template v-if=\"isInteractive\">\n <!-- Current Step Content -->\n <div class=\"px-sm py-16 flex flex-col gap-12\">\n <div class=\"leading-normal text-12\">\n <strong class=\"font-semibold\">\n {{ currentStep.question }}\n </strong>\n <PkStreamingMarkdown\n v-if=\"currentStep.message\"\n :markdown=\"currentStep.message\"\n class=\"text-word-2 mt-4\" />\n </div>\n\n <!-- Checkbox list for multi-select -->\n <PkEditorCheckboxButtons\n v-if=\"currentStep.options && currentStep.multiSelect\"\n v-model=\"activeCheckboxValue\"\n :name=\"currentStep.id\"\n :options=\"radioOptions\"\n :readonly=\"!isInteractive\"\n class=\"mb-0\"\n vertical>\n <template\n v-for=\"option in radioOptions\"\n :key=\"option.value\"\n #[option.value]>\n <!-- Shared option layout: label + optional description -->\n <div class=\"text-12\">\n <div class=\"font-semibold\">{{ option.label }}</div>\n <div v-if=\"option.description\" class=\"text-word-3\">\n {{ option.description }}\n </div>\n </div>\n </template>\n </PkEditorCheckboxButtons>\n\n <!-- Radio buttons for single-select -->\n <PkEditorRadioButtons\n v-else-if=\"currentStep.options && !currentStep.multiSelect\"\n v-model=\"scalarValue\"\n :name=\"currentStep.id\"\n :options=\"radioOptions\"\n :readonly=\"!isInteractive\"\n vertical\n class=\"mb-0\"\n @update:model-value=\"onRadioChange\">\n <template\n v-for=\"option in radioOptions\"\n :key=\"option.value\"\n #[option.value]>\n <!-- Shared option layout: label + optional description -->\n <div class=\"text-12\">\n <div class=\"font-semibold\">{{ option.label }}</div>\n <div v-if=\"option.description\" class=\"text-word-3\">\n {{ option.description }}\n </div>\n </div>\n </template>\n </PkEditorRadioButtons>\n\n <!-- Pure Freeform Input (text, number, date) -->\n <div\n v-else-if=\"!currentStep.options\"\n class=\"flex flex-col gap-6 w-full\">\n <VvInputText\n :key=\"currentStep.id\"\n v-model=\"scalarValue\"\n :placeholder=\"\n currentStep.placeholder || $t('placeholder.insert')\n \"\n :type=\"currentStep.type\"\n class=\"w-full\"\n :name=\"currentStep.id\"\n modifiers=\"compact\"\n :disabled=\"!isInteractive\"\n @keyup.enter=\"goNext\" />\n </div>\n </div>\n\n <!-- Custom footer freeform input (shown alongside options when allowFreeformInput) -->\n <div\n v-if=\"currentStep.allowFreeformInput && currentStep.options\"\n class=\"px-sm pb-sm border-t border-surface-3\">\n <form\n class=\"flex gap-xs pt-sm\"\n @submit.prevent=\"submitCustomAnswer\">\n <VvInputText\n :key=\"`${currentStep.id}-custom`\"\n v-model=\"customAnswer\"\n class=\"flex-1\"\n :name=\"`${currentStep.id}-custom`\"\n modifiers=\"compact\"\n :disabled=\"!isInteractive\"\n :placeholder=\"\n currentStep.placeholder ||\n $t('showForm.otherPlaceholder')\n \" />\n </form>\n </div>\n\n <!-- Footer navigation: shown for every step that does not submit\n itself on option pick (see `isSelfSubmitting`). -->\n <div\n v-if=\"!isSelfSubmitting\"\n class=\"px-sm py-10 bg-surface border-t border-surface-3 flex justify-between gap-12\">\n <VvButton\n v-if=\"canGoBack\"\n modifiers=\"action-quiet\"\n icon=\"ri:arrow-left-s-line\"\n :label=\"$t('action.back')\"\n @click.stop=\"goBack\" />\n <div v-else></div>\n\n <VvButton\n :modifiers=\"canGoNext ? 'action-quiet' : 'action-primary'\"\n :icon=\"\n canGoNext\n ? 'ri:arrow-right-s-line'\n : 'ri:send-plane-2-line'\n \"\n icon-position=\"right\"\n :label=\"canGoNext ? $t('action.next') : $t('action.submit')\"\n @click.stop=\"goNext\" />\n </div>\n </template>\n\n <!-- Output Available State (Multi-step Summary) -->\n <template v-else>\n <div class=\"px-sm py-12 bg-surface space-y-10\">\n <ul class=\"flex flex-col gap-8\">\n <li\n v-for=\"(step, index) in steps\"\n :key=\"index\"\n class=\"leading-normal\">\n <div class=\"text-12 text-word-3\">\n {{ step.question }}\n </div>\n <span class=\"text-12 text-word-2 font-semibold\">\n {{ getSummaryValue(step, index) }}\n </span>\n </li>\n </ul>\n </div>\n <div\n class=\"px-sm py-12 bg-surface border-t border-surface-3 flex items-center gap-10\">\n <div\n class=\"w-20 h-20 rounded-full border border-success text-success flex items-center justify-center\">\n <VvIcon name=\"ri:check-line\" class=\"text-12\" />\n </div>\n <div class=\"flex flex-col\">\n <span\n class=\"font-semibold text-12 text-word-1 leading-tight\">\n {{ $t('showForm.completed') }}\n </span>\n </div>\n </div>\n </template>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { C as e, F as t, L as n, O as r, St as i, Tt as a, _ as o, bt as s, d as c, h as l, it as u, m as d, pt as f, v as p, x as m, xt as h, z as g } from "./vue.runtime.esm-bundler-D6KKITU0.js";
2
2
  import "./src-CS32P2Dg.js";
3
3
  import { n as _ } from "./url-validation-uLMZ5-AU.js";
4
- import { n as v } from "./index.es-DFq55nZZ.js";
4
+ import { n as v } from "./index.es-CNKCTfCu.js";
5
5
  import { t as y } from "./useImageFallback-qVPEHvyG.js";
6
6
  import { n as b, t as x } from "./useLightbox-DzMzDOb8.js";
7
7
  r(), h(), u();
@@ -71,4 +71,4 @@ var S = {
71
71
  //#endregion
72
72
  export { A as default };
73
73
 
74
- //# sourceMappingURL=PkToolShowImageGallery-CosOsHSh.js.map
74
+ //# sourceMappingURL=PkToolShowImageGallery-DL-bFOKl.js.map