@knime/product-features 1.2.2 → 1.2.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 (93) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/_plugin-vue_export-helper-BOaGB7Aw.js +8 -0
  3. package/dist/ai.js +180 -191
  4. package/dist/ai.js.map +1 -1
  5. package/dist/dataTransfer.js +1158 -1104
  6. package/dist/dataTransfer.js.map +1 -1
  7. package/dist/dist-BrNh9vG-.js +2560 -0
  8. package/dist/dist-BrNh9vG-.js.map +1 -0
  9. package/dist/nodes.css +35 -26
  10. package/dist/nodes.js +656 -613
  11. package/dist/nodes.js.map +1 -1
  12. package/dist/rfcErrors-Dw7NLSDp.js +172 -0
  13. package/dist/rfcErrors-Dw7NLSDp.js.map +1 -0
  14. package/dist/rfcErrors.js +1 -222
  15. package/dist/src/ai/KdsPromptInput/InlineStatusBanner.vue.d.ts +3 -2
  16. package/dist/src/ai/KdsPromptInput/InlineStatusBanner.vue.d.ts.map +1 -1
  17. package/dist/src/ai/KdsPromptInput/KdsPromptInput.vue.d.ts +6 -6
  18. package/dist/src/ai/KdsPromptInput/KdsPromptInput.vue.d.ts.map +1 -1
  19. package/dist/src/dataTransfer/download/ui/DownloadProgressPanel.vue.d.ts +6 -4
  20. package/dist/src/dataTransfer/download/ui/DownloadProgressPanel.vue.d.ts.map +1 -1
  21. package/dist/src/dataTransfer/download/ui/DownloadProgressPanelItem.vue.d.ts +3 -2
  22. package/dist/src/dataTransfer/download/ui/DownloadProgressPanelItem.vue.d.ts.map +1 -1
  23. package/dist/src/dataTransfer/shared/ui/CollapsiblePanel/CollapsiblePanel.vue.d.ts +11 -14
  24. package/dist/src/dataTransfer/shared/ui/CollapsiblePanel/CollapsiblePanel.vue.d.ts.map +1 -1
  25. package/dist/src/dataTransfer/shared/ui/ProgressItem/ProgressItem.vue.d.ts +2 -1
  26. package/dist/src/dataTransfer/shared/ui/ProgressItem/ProgressItem.vue.d.ts.map +1 -1
  27. package/dist/src/dataTransfer/shared/ui/ProgressList/ProgressList.vue.d.ts +7 -11
  28. package/dist/src/dataTransfer/shared/ui/ProgressList/ProgressList.vue.d.ts.map +1 -1
  29. package/dist/src/dataTransfer/upload/ui/UploadProgressPanel.vue.d.ts +6 -4
  30. package/dist/src/dataTransfer/upload/ui/UploadProgressPanel.vue.d.ts.map +1 -1
  31. package/dist/src/dataTransfer/upload/ui/UploadProgressPanelItem.vue.d.ts +3 -2
  32. package/dist/src/dataTransfer/upload/ui/UploadProgressPanelItem.vue.d.ts.map +1 -1
  33. package/dist/src/nodes/NodeDescriptionTabs/NodeDescriptionTabs.vue.d.ts +2 -1
  34. package/dist/src/nodes/NodeDescriptionTabs/NodeDescriptionTabs.vue.d.ts.map +1 -1
  35. package/dist/src/nodes/NodeDescriptionTabs/OptionsTab.vue.d.ts +2 -1
  36. package/dist/src/nodes/NodeDescriptionTabs/OptionsTab.vue.d.ts.map +1 -1
  37. package/dist/src/nodes/NodeDescriptionTabs/PortGroup.vue.d.ts +2 -1
  38. package/dist/src/nodes/NodeDescriptionTabs/PortGroup.vue.d.ts.map +1 -1
  39. package/dist/src/nodes/NodeDescriptionTabs/PortTemplateInfo.vue.d.ts +2 -1
  40. package/dist/src/nodes/NodeDescriptionTabs/PortTemplateInfo.vue.d.ts.map +1 -1
  41. package/dist/src/nodes/NodeDescriptionTabs/PortsTab.vue.d.ts +2 -1
  42. package/dist/src/nodes/NodeDescriptionTabs/PortsTab.vue.d.ts.map +1 -1
  43. package/dist/src/nodes/NodeDescriptionTabs/ViewsTab.vue.d.ts +2 -1
  44. package/dist/src/nodes/NodeDescriptionTabs/ViewsTab.vue.d.ts.map +1 -1
  45. package/dist/src/nodes/NodePreview/NodePreview.vue.d.ts +2 -1
  46. package/dist/src/nodes/NodePreview/NodePreview.vue.d.ts.map +1 -1
  47. package/dist/src/nodes/NodePreview/SVGNodeTorso.vue.d.ts +2 -1
  48. package/dist/src/nodes/NodePreview/SVGNodeTorso.vue.d.ts.map +1 -1
  49. package/dist/src/nodes/NodePreview/enums.d.ts +2 -1
  50. package/dist/src/nodes/NodePreview/enums.d.ts.map +1 -1
  51. package/dist/src/nodes/NodePreview/types.d.ts +1 -1
  52. package/dist/src/nodes/NodePreview/types.d.ts.map +1 -1
  53. package/dist/src/nodes/PortIcon/PortIcon.vue.d.ts +2 -1
  54. package/dist/src/nodes/PortIcon/PortIcon.vue.d.ts.map +1 -1
  55. package/dist/src/nodes/PortIcon/SVGPortIcon.vue.d.ts +2 -1
  56. package/dist/src/nodes/PortIcon/SVGPortIcon.vue.d.ts.map +1 -1
  57. package/dist/src/rfcErrors/RFCErrorToastTemplate.vue.d.ts +3 -2
  58. package/dist/src/rfcErrors/RFCErrorToastTemplate.vue.d.ts.map +1 -1
  59. package/dist/src/toasts/Toast/Toast.vue.d.ts +3 -4
  60. package/dist/src/toasts/Toast/Toast.vue.d.ts.map +1 -1
  61. package/dist/src/toasts/Toast/ToastButton.vue.d.ts +2 -1
  62. package/dist/src/toasts/Toast/ToastButton.vue.d.ts.map +1 -1
  63. package/dist/src/toasts/ToastStack/ToastStack.vue.d.ts +2 -1
  64. package/dist/src/toasts/ToastStack/ToastStack.vue.d.ts.map +1 -1
  65. package/dist/src/versions/CreateVersionForm/CreateVersionForm.vue.d.ts +3 -2
  66. package/dist/src/versions/CreateVersionForm/CreateVersionForm.vue.d.ts.map +1 -1
  67. package/dist/src/versions/VersionHistory/CurrentState.vue.d.ts +3 -2
  68. package/dist/src/versions/VersionHistory/CurrentState.vue.d.ts.map +1 -1
  69. package/dist/src/versions/VersionHistory/HistoryEvent.vue.d.ts +7 -11
  70. package/dist/src/versions/VersionHistory/HistoryEvent.vue.d.ts.map +1 -1
  71. package/dist/src/versions/VersionHistory/HistoryEventAuthor.vue.d.ts +2 -1
  72. package/dist/src/versions/VersionHistory/HistoryEventAuthor.vue.d.ts.map +1 -1
  73. package/dist/src/versions/VersionHistory/HistoryEventFooter.vue.d.ts +2 -1
  74. package/dist/src/versions/VersionHistory/HistoryEventFooter.vue.d.ts.map +1 -1
  75. package/dist/src/versions/VersionHistory/VersionHistory.vue.d.ts +3 -2
  76. package/dist/src/versions/VersionHistory/VersionHistory.vue.d.ts.map +1 -1
  77. package/dist/src/versions/VersionHistory/VersionItem.vue.d.ts +3 -2
  78. package/dist/src/versions/VersionHistory/VersionItem.vue.d.ts.map +1 -1
  79. package/dist/src/versions/VersionHistory/VersionLabel.vue.d.ts +6 -141
  80. package/dist/src/versions/VersionHistory/VersionLabel.vue.d.ts.map +1 -1
  81. package/dist/src/versions/VersionHistory/VersionLimitInfo.vue.d.ts +2 -1
  82. package/dist/src/versions/VersionHistory/VersionLimitInfo.vue.d.ts.map +1 -1
  83. package/dist/toasts.css +13 -13
  84. package/dist/toasts.js +4700 -475
  85. package/dist/toasts.js.map +1 -1
  86. package/dist/versions.js +583 -597
  87. package/dist/versions.js.map +1 -1
  88. package/package.json +5 -5
  89. package/dist/_plugin-vue_export-helper-pcqpp-6-.js +0 -10
  90. package/dist/_plugin-vue_export-helper-pcqpp-6-.js.map +0 -1
  91. package/dist/index-B3ql6hun.js +0 -2695
  92. package/dist/index-B3ql6hun.js.map +0 -1
  93. package/dist/rfcErrors.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @knime/product-features
2
2
 
3
+ ## 1.2.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 4dbca83: Add missing support for Widget types in `NodePreview`
8
+ - Updated dependencies [8e4ebf0]
9
+ - @knime/kds-styles@2.5.1
10
+ - @knime/kds-components@2.5.1
11
+
12
+ ## 1.2.3
13
+
14
+ ### Patch Changes
15
+
16
+ - 6fc7124: KDS-582: NodePreview: use zoom instead of transform: scale that also changes the layout box
17
+ - Updated dependencies [0fd468c]
18
+ - @knime/kds-components@2.3.0
19
+ - @knime/kds-styles@2.3.0
20
+
3
21
  ## 1.2.2
4
22
 
5
23
  ### Patch Changes
@@ -0,0 +1,8 @@
1
+ //#region \0plugin-vue:export-helper
2
+ var _plugin_vue_export_helper_default = (sfc, props) => {
3
+ const target = sfc.__vccOpts || sfc;
4
+ for (const [key, val] of props) target[key] = val;
5
+ return target;
6
+ };
7
+ //#endregion
8
+ export { _plugin_vue_export_helper_default as t };
package/dist/ai.js CHANGED
@@ -1,197 +1,186 @@
1
- import { defineComponent, openBlock, createElementBlock, normalizeClass, createVNode, unref, createElementVNode, toDisplayString, createBlock, createCommentVNode, useModel, useTemplateRef, computed, watch, withDirectives, vModelText, withModifiers, mergeModels } from 'vue';
2
- import { useResizeObserver } from '@vueuse/core';
3
- import { KdsIcon, KdsButton, KdsProgressBar, KdsLink } from '@knime/kds-components';
4
- import { _ as _export_sfc } from './_plugin-vue_export-helper-pcqpp-6-.js';
5
-
6
- import './ai.css';const _hoisted_1$1 = ["role"];
7
- const _hoisted_2$1 = {
8
- class: "text",
9
- tabindex: "0"
1
+ import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BOaGB7Aw.js";
2
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeModels, normalizeClass, openBlock, toDisplayString, unref, useModel, useTemplateRef, vModelText, watch, withDirectives, withModifiers } from "vue";
3
+ import { useResizeObserver } from "@vueuse/core";
4
+ import { KdsButton, KdsIcon, KdsLink, KdsProgressBar } from "@knime/kds-components";
5
+ import './ai.css';//#region src/ai/KdsPromptInput/InlineStatusBanner.vue?vue&type=script&setup=true&lang.ts
6
+ var _hoisted_1$1 = ["role"];
7
+ var _hoisted_2$1 = {
8
+ class: "text",
9
+ tabindex: "0"
10
10
  };
11
- const _sfc_main$1 = /* @__PURE__ */ defineComponent({
12
- __name: "InlineStatusBanner",
13
- props: {
14
- status: {}
15
- },
16
- emits: ["buttonClick"],
17
- setup(__props, { emit: __emit }) {
18
- const emit = __emit;
19
- return (_ctx, _cache) => {
20
- return openBlock(), createElementBlock("div", {
21
- class: normalizeClass(["inline-status-banner", __props.status.type]),
22
- role: __props.status.type === "error" ? "alert" : "status"
23
- }, [
24
- createVNode(unref(KdsIcon), {
25
- name: __props.status.type === "error" ? "circle-error" : "circle-info",
26
- size: "small",
27
- class: "icon"
28
- }, null, 8, ["name"]),
29
- createElementVNode("span", _hoisted_2$1, toDisplayString(__props.status.message), 1),
30
- __props.status.buttonLabel ? (openBlock(), createBlock(unref(KdsButton), {
31
- key: 0,
32
- class: "action",
33
- size: "small",
34
- variant: "filled",
35
- label: __props.status.buttonLabel,
36
- onClick: _cache[0] || (_cache[0] = ($event) => emit("buttonClick"))
37
- }, null, 8, ["label"])) : createCommentVNode("", true)
38
- ], 10, _hoisted_1$1);
39
- };
40
- }
41
- });
42
-
43
- const InlineStatusBanner = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-506380c6"]]);
44
-
45
- const _hoisted_1 = { class: "prompt-input" };
46
- const _hoisted_2 = { class: "text-input-wrapper" };
47
- const _hoisted_3 = ["placeholder", "disabled", "aria-label"];
48
- const _hoisted_4 = { class: "action" };
49
- const _hoisted_5 = {
50
- key: 1,
51
- class: "subtext"
11
+ //#endregion
12
+ //#region src/ai/KdsPromptInput/InlineStatusBanner.vue
13
+ var InlineStatusBanner_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
14
+ __name: "InlineStatusBanner",
15
+ props: { status: {} },
16
+ emits: ["buttonClick"],
17
+ setup(__props, { emit: __emit }) {
18
+ const emit = __emit;
19
+ return (_ctx, _cache) => {
20
+ return openBlock(), createElementBlock("div", {
21
+ class: normalizeClass(["inline-status-banner", __props.status.type]),
22
+ role: __props.status.type === "error" ? "alert" : "status"
23
+ }, [
24
+ createVNode(unref(KdsIcon), {
25
+ name: __props.status.type === "error" ? "circle-error" : "circle-info",
26
+ size: "small",
27
+ class: "icon"
28
+ }, null, 8, ["name"]),
29
+ createElementVNode("span", _hoisted_2$1, toDisplayString(__props.status.message), 1),
30
+ __props.status.buttonLabel ? (openBlock(), createBlock(unref(KdsButton), {
31
+ key: 0,
32
+ class: "action",
33
+ size: "small",
34
+ variant: "filled",
35
+ label: __props.status.buttonLabel,
36
+ onClick: _cache[0] || (_cache[0] = ($event) => emit("buttonClick"))
37
+ }, null, 8, ["label"])) : createCommentVNode("", true)
38
+ ], 10, _hoisted_1$1);
39
+ };
40
+ }
41
+ }), [["__scopeId", "data-v-506380c6"]]);
42
+ //#endregion
43
+ //#region src/ai/KdsPromptInput/KdsPromptInput.vue?vue&type=script&setup=true&lang.ts
44
+ var _hoisted_1 = { class: "prompt-input" };
45
+ var _hoisted_2 = { class: "text-input-wrapper" };
46
+ var _hoisted_3 = [
47
+ "placeholder",
48
+ "disabled",
49
+ "aria-label"
50
+ ];
51
+ var _hoisted_4 = { class: "action" };
52
+ var _hoisted_5 = {
53
+ key: 1,
54
+ class: "subtext"
52
55
  };
53
- const _hoisted_6 = {
54
- key: 0,
55
- class: "subtext-left"
56
+ var _hoisted_6 = {
57
+ key: 0,
58
+ class: "subtext-left"
56
59
  };
57
- const _hoisted_7 = {
58
- key: 1,
59
- class: "subtext-right"
60
+ var _hoisted_7 = {
61
+ key: 1,
62
+ class: "subtext-right"
60
63
  };
61
- const _hoisted_8 = { key: 0 };
62
- const _sfc_main = /* @__PURE__ */ defineComponent({
63
- __name: "KdsPromptInput",
64
- props: /* @__PURE__ */ mergeModels({
65
- placeholder: { default: "" },
66
- disabled: { type: Boolean, default: false },
67
- loading: { type: Boolean, default: false },
68
- status: { default: () => void 0 },
69
- ariaLabel: { default: "Prompt" },
70
- leftSubtext: { default: () => void 0 },
71
- rightSubtext: { default: () => void 0 },
72
- link: { default: () => void 0 }
73
- }, {
74
- "modelValue": { default: "" },
75
- "modelModifiers": {}
76
- }),
77
- emits: /* @__PURE__ */ mergeModels(["submit", "stop", "statusButtonClick"], ["update:modelValue"]),
78
- setup(__props, { expose: __expose, emit: __emit }) {
79
- const emit = __emit;
80
- const modelValue = useModel(__props, "modelValue");
81
- const textareaRef = useTemplateRef("textareaRef");
82
- const canSubmit = computed(
83
- () => !__props.disabled && !__props.loading && modelValue.value.trim().length > 0
84
- );
85
- function resizeTextarea() {
86
- const el = textareaRef.value;
87
- if (!el) {
88
- return;
89
- }
90
- requestAnimationFrame(() => {
91
- if (!textareaRef.value) {
92
- return;
93
- }
94
- el.style.height = "auto";
95
- const scrollHeight = el.scrollHeight;
96
- if (scrollHeight <= el.offsetHeight) {
97
- return;
98
- }
99
- el.style.height = `${scrollHeight}px`;
100
- });
101
- }
102
- useResizeObserver(textareaRef, resizeTextarea);
103
- watch(modelValue, resizeTextarea, { immediate: true });
104
- function onSubmit() {
105
- if (!canSubmit.value) {
106
- return;
107
- }
108
- emit("submit", modelValue.value.trim());
109
- }
110
- function onKeydown(event) {
111
- if (event.key === "Enter" && !event.shiftKey && !event.isComposing) {
112
- event.preventDefault();
113
- onSubmit();
114
- }
115
- }
116
- __expose({
117
- focus: () => textareaRef.value?.focus()
118
- });
119
- return (_ctx, _cache) => {
120
- return openBlock(), createElementBlock("div", _hoisted_1, [
121
- __props.status ? (openBlock(), createBlock(InlineStatusBanner, {
122
- key: 0,
123
- status: __props.status,
124
- onButtonClick: _cache[0] || (_cache[0] = ($event) => emit("statusButtonClick"))
125
- }, null, 8, ["status"])) : createCommentVNode("", true),
126
- createElementVNode("div", {
127
- class: normalizeClass(["input-container", { disabled: __props.disabled }]),
128
- onClick: _cache[3] || (_cache[3] = ($event) => textareaRef.value?.focus())
129
- }, [
130
- __props.loading ? (openBlock(), createBlock(unref(KdsProgressBar), {
131
- key: 0,
132
- class: "progress-bar",
133
- indeterminate: ""
134
- })) : createCommentVNode("", true),
135
- createElementVNode("div", _hoisted_2, [
136
- withDirectives(createElementVNode("textarea", {
137
- ref_key: "textareaRef",
138
- ref: textareaRef,
139
- "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => modelValue.value = $event),
140
- class: "text-input",
141
- rows: "1",
142
- placeholder: __props.placeholder,
143
- disabled: __props.disabled,
144
- "aria-label": __props.ariaLabel,
145
- onKeydown
146
- }, null, 40, _hoisted_3), [
147
- [vModelText, modelValue.value]
148
- ])
149
- ]),
150
- createElementVNode("div", _hoisted_4, [
151
- __props.loading ? (openBlock(), createBlock(unref(KdsButton), {
152
- key: 0,
153
- variant: "outlined",
154
- "leading-icon": "stop",
155
- size: "medium",
156
- ariaLabel: "Stop",
157
- onClick: _cache[2] || (_cache[2] = withModifiers(($event) => emit("stop"), ["stop"]))
158
- })) : (openBlock(), createBlock(unref(KdsButton), {
159
- key: 1,
160
- variant: "filled",
161
- "leading-icon": "send",
162
- size: "medium",
163
- ariaLabel: "Send",
164
- disabled: !canSubmit.value,
165
- onClick: withModifiers(onSubmit, ["stop"])
166
- }, null, 8, ["disabled"]))
167
- ])
168
- ], 2),
169
- __props.leftSubtext || __props.rightSubtext || __props.link ? (openBlock(), createElementBlock("div", _hoisted_5, [
170
- __props.leftSubtext ? (openBlock(), createElementBlock("div", _hoisted_6, toDisplayString(__props.leftSubtext), 1)) : createCommentVNode("", true),
171
- __props.rightSubtext || __props.link ? (openBlock(), createElementBlock("div", _hoisted_7, [
172
- __props.rightSubtext ? (openBlock(), createElementBlock("span", _hoisted_8, toDisplayString(__props.rightSubtext), 1)) : createCommentVNode("", true),
173
- __props.link ? (openBlock(), createBlock(unref(KdsLink), {
174
- key: 1,
175
- label: __props.link.label,
176
- to: __props.link.to,
177
- size: "small"
178
- }, null, 8, ["label", "to"])) : createCommentVNode("", true)
179
- ])) : createCommentVNode("", true)
180
- ])) : createCommentVNode("", true)
181
- ]);
182
- };
183
- }
184
- });
185
-
186
- const KdsPromptInput = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-e6b41a78"]]);
187
-
188
- const kdsPromptInputStatusType = {
189
- ERROR: "error",
190
- NOTE: "note"
64
+ var _hoisted_8 = { key: 0 };
65
+ //#endregion
66
+ //#region src/ai/KdsPromptInput/KdsPromptInput.vue
67
+ var KdsPromptInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
68
+ __name: "KdsPromptInput",
69
+ props: /*@__PURE__*/ mergeModels({
70
+ placeholder: { default: "" },
71
+ disabled: {
72
+ type: Boolean,
73
+ default: false
74
+ },
75
+ loading: {
76
+ type: Boolean,
77
+ default: false
78
+ },
79
+ status: { default: () => void 0 },
80
+ ariaLabel: { default: "Prompt" },
81
+ leftSubtext: { default: () => void 0 },
82
+ rightSubtext: { default: () => void 0 },
83
+ link: { default: () => void 0 }
84
+ }, {
85
+ "modelValue": { default: "" },
86
+ "modelModifiers": {}
87
+ }),
88
+ emits: /*@__PURE__*/ mergeModels([
89
+ "submit",
90
+ "stop",
91
+ "statusButtonClick"
92
+ ], ["update:modelValue"]),
93
+ setup(__props, { expose: __expose, emit: __emit }) {
94
+ const emit = __emit;
95
+ const modelValue = useModel(__props, "modelValue");
96
+ const textareaRef = useTemplateRef("textareaRef");
97
+ const canSubmit = computed(() => !__props.disabled && !__props.loading && modelValue.value.trim().length > 0);
98
+ function resizeTextarea() {
99
+ const el = textareaRef.value;
100
+ if (!el) return;
101
+ requestAnimationFrame(() => {
102
+ if (!textareaRef.value) return;
103
+ el.style.height = "auto";
104
+ const scrollHeight = el.scrollHeight;
105
+ if (scrollHeight <= el.offsetHeight) return;
106
+ el.style.height = `${scrollHeight}px`;
107
+ });
108
+ }
109
+ useResizeObserver(textareaRef, resizeTextarea);
110
+ watch(modelValue, resizeTextarea, { immediate: true });
111
+ function onSubmit() {
112
+ if (!canSubmit.value) return;
113
+ emit("submit", modelValue.value.trim());
114
+ }
115
+ function onKeydown(event) {
116
+ if (event.key === "Enter" && !event.shiftKey && !event.isComposing) {
117
+ event.preventDefault();
118
+ onSubmit();
119
+ }
120
+ }
121
+ __expose({ focus: () => textareaRef.value?.focus() });
122
+ return (_ctx, _cache) => {
123
+ return openBlock(), createElementBlock("div", _hoisted_1, [
124
+ __props.status ? (openBlock(), createBlock(InlineStatusBanner_default, {
125
+ key: 0,
126
+ status: __props.status,
127
+ onButtonClick: _cache[0] || (_cache[0] = ($event) => emit("statusButtonClick"))
128
+ }, null, 8, ["status"])) : createCommentVNode("", true),
129
+ createElementVNode("div", {
130
+ class: normalizeClass(["input-container", { disabled: __props.disabled }]),
131
+ onClick: _cache[3] || (_cache[3] = ($event) => textareaRef.value?.focus())
132
+ }, [
133
+ __props.loading ? (openBlock(), createBlock(unref(KdsProgressBar), {
134
+ key: 0,
135
+ class: "progress-bar",
136
+ indeterminate: ""
137
+ })) : createCommentVNode("", true),
138
+ createElementVNode("div", _hoisted_2, [withDirectives(createElementVNode("textarea", {
139
+ ref_key: "textareaRef",
140
+ ref: textareaRef,
141
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => modelValue.value = $event),
142
+ class: "text-input",
143
+ rows: "1",
144
+ placeholder: __props.placeholder,
145
+ disabled: __props.disabled,
146
+ "aria-label": __props.ariaLabel,
147
+ onKeydown
148
+ }, null, 40, _hoisted_3), [[vModelText, modelValue.value]])]),
149
+ createElementVNode("div", _hoisted_4, [__props.loading ? (openBlock(), createBlock(unref(KdsButton), {
150
+ key: 0,
151
+ variant: "outlined",
152
+ "leading-icon": "stop",
153
+ size: "medium",
154
+ ariaLabel: "Stop",
155
+ onClick: _cache[2] || (_cache[2] = withModifiers(($event) => emit("stop"), ["stop"]))
156
+ })) : (openBlock(), createBlock(unref(KdsButton), {
157
+ key: 1,
158
+ variant: "filled",
159
+ "leading-icon": "send",
160
+ size: "medium",
161
+ ariaLabel: "Send",
162
+ disabled: !canSubmit.value,
163
+ onClick: withModifiers(onSubmit, ["stop"])
164
+ }, null, 8, ["disabled"]))])
165
+ ], 2),
166
+ __props.leftSubtext || __props.rightSubtext || __props.link ? (openBlock(), createElementBlock("div", _hoisted_5, [__props.leftSubtext ? (openBlock(), createElementBlock("div", _hoisted_6, toDisplayString(__props.leftSubtext), 1)) : createCommentVNode("", true), __props.rightSubtext || __props.link ? (openBlock(), createElementBlock("div", _hoisted_7, [__props.rightSubtext ? (openBlock(), createElementBlock("span", _hoisted_8, toDisplayString(__props.rightSubtext), 1)) : createCommentVNode("", true), __props.link ? (openBlock(), createBlock(unref(KdsLink), {
167
+ key: 1,
168
+ label: __props.link.label,
169
+ to: __props.link.to,
170
+ size: "small"
171
+ }, null, 8, ["label", "to"])) : createCommentVNode("", true)])) : createCommentVNode("", true)])) : createCommentVNode("", true)
172
+ ]);
173
+ };
174
+ }
175
+ }), [["__scopeId", "data-v-e6b41a78"]]);
176
+ //#endregion
177
+ //#region src/ai/KdsPromptInput/enums.ts
178
+ var kdsPromptInputStatusType = {
179
+ ERROR: "error",
180
+ NOTE: "note"
191
181
  };
192
- const kdsPromptInputStatusTypes = Object.values(
193
- kdsPromptInputStatusType
194
- );
182
+ var kdsPromptInputStatusTypes = Object.values(kdsPromptInputStatusType);
183
+ //#endregion
184
+ export { KdsPromptInput_default as KdsPromptInput, kdsPromptInputStatusType, kdsPromptInputStatusTypes };
195
185
 
196
- export { KdsPromptInput, kdsPromptInputStatusType, kdsPromptInputStatusTypes };
197
- //# sourceMappingURL=ai.js.map
186
+ //# sourceMappingURL=ai.js.map
package/dist/ai.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","sources":["../src/ai/KdsPromptInput/InlineStatusBanner.vue","../src/ai/KdsPromptInput/KdsPromptInput.vue","../src/ai/KdsPromptInput/enums.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { KdsButton, KdsIcon } from \"@knime/kds-components\";\n\nimport type { KdsPromptInputStatus } from \"./types\";\n\nconst { status } = defineProps<{\n status: KdsPromptInputStatus;\n}>();\n\nconst emit = defineEmits<{\n buttonClick: [];\n}>();\n</script>\n\n<template>\n <div\n :class=\"['inline-status-banner', status.type]\"\n :role=\"status.type === 'error' ? 'alert' : 'status'\"\n >\n <KdsIcon\n :name=\"status.type === 'error' ? 'circle-error' : 'circle-info'\"\n size=\"small\"\n class=\"icon\"\n />\n <!--\n tabindex=\"0\" so keyboard users can scroll the message when it\n overflows the 2-line cap (axe rule: scrollable-region-focusable).\n -->\n <span class=\"text\" tabindex=\"0\">{{ status.message }}</span>\n <KdsButton\n v-if=\"status.buttonLabel\"\n class=\"action\"\n size=\"small\"\n variant=\"filled\"\n :label=\"status.buttonLabel\"\n @click=\"emit('buttonClick')\"\n />\n </div>\n</template>\n\n<style scoped>\n.inline-status-banner {\n display: flex;\n gap: var(--kds-spacing-container-0-37x);\n align-items: center;\n\n /*\n * The banner extends 0.25x behind the input below so the input's\n * rounded top corners carve out of the banner's bottom edge.\n * The extra 0.25x of bottom padding keeps the\n * content visually centered against the visible portion of the box.\n * Top and horizontal padding subtract the border width so the box\n * matches Figma (where the border is drawn outside the layout box).\n * Bottom has no border, so no subtraction is needed there.\n */\n padding: calc(\n var(--kds-spacing-container-0-5x) - var(--kds-core-border-width-xs)\n )\n calc(var(--kds-spacing-container-0-5x) - var(--kds-core-border-width-xs))\n calc(var(--kds-spacing-container-0-5x) + var(--kds-spacing-container-0-25x));\n margin-bottom: calc(-1 * var(--kds-spacing-container-0-25x));\n font: var(--kds-font-base-body-small);\n color: var(--kds-color-text-and-icon-neutral);\n border-style: solid;\n border-width: var(--kds-core-border-width-xs);\n border-bottom: none;\n border-top-left-radius: var(--kds-border-radius-container-0-50x);\n border-top-right-radius: var(--kds-border-radius-container-0-50x);\n\n .icon,\n .action {\n flex-shrink: 0;\n }\n\n &.error {\n background-color: var(--kds-color-background-static-danger-muted);\n border: var(--kds-border-base-danger);\n border-bottom: none;\n\n .icon {\n color: var(--kds-color-text-and-icon-danger);\n }\n }\n\n &.note {\n background-color: var(--kds-color-background-static-info-muted);\n border: var(--kds-border-base-info);\n border-bottom: none;\n\n .icon {\n color: var(--kds-color-text-and-icon-info);\n }\n }\n}\n\n.text {\n flex: 1 0 0;\n min-width: 0;\n\n /* Allow up to 2 lines, scroll beyond that. */\n max-height: calc(2 * 1lh);\n overflow-y: auto;\n overflow-wrap: anywhere;\n scrollbar-width: thin;\n\n &:focus-visible {\n outline: var(--kds-border-action-focused);\n outline-offset: var(--kds-spacing-offset-focus);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useTemplateRef, watch } from \"vue\";\nimport { useResizeObserver } from \"@vueuse/core\";\n\nimport { KdsButton, KdsLink, KdsProgressBar } from \"@knime/kds-components\";\n\nimport InlineStatusBanner from \"./InlineStatusBanner.vue\";\nimport type { KdsPromptInputProps } from \"./types\";\n\nconst {\n placeholder = \"\",\n disabled = false,\n loading = false,\n status = undefined,\n ariaLabel = \"Prompt\",\n leftSubtext = undefined,\n rightSubtext = undefined,\n link = undefined,\n} = defineProps<KdsPromptInputProps>();\n\nconst emit = defineEmits<{\n /** User submitted the prompt (Enter or send button). */\n submit: [value: string];\n /** User clicked the stop button while loading. */\n stop: [];\n /** User clicked the action button inside the inline status banner. */\n statusButtonClick: [];\n}>();\n\nconst modelValue = defineModel<string>({ default: \"\" });\n\nconst textareaRef = useTemplateRef<HTMLTextAreaElement>(\"textareaRef\");\n\nconst canSubmit = computed(\n () => !disabled && !loading && modelValue.value.trim().length > 0,\n);\n\nfunction resizeTextarea() {\n const el = textareaRef.value;\n if (!el) {\n return;\n }\n // Defer style writes to the next animation frame so they don't run inside\n // the ResizeObserver callback (which would otherwise trigger the\n // \"ResizeObserver loop completed with undelivered notifications\" warning).\n requestAnimationFrame(() => {\n if (!textareaRef.value) {\n return;\n }\n el.style.height = \"auto\";\n const scrollHeight = el.scrollHeight;\n if (scrollHeight <= el.offsetHeight) {\n return;\n }\n el.style.height = `${scrollHeight}px`;\n });\n}\n\nuseResizeObserver(textareaRef, resizeTextarea);\nwatch(modelValue, resizeTextarea, { immediate: true });\n\nfunction onSubmit() {\n if (!canSubmit.value) {\n return;\n }\n emit(\"submit\", modelValue.value.trim());\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n // Enter submits, Shift+Enter inserts a newline. Ignore Enter while an IME\n // composition session is in progress.\n if (event.key === \"Enter\" && !event.shiftKey && !event.isComposing) {\n event.preventDefault();\n onSubmit();\n }\n}\n\ndefineExpose({\n focus: () => textareaRef.value?.focus(),\n});\n</script>\n\n<template>\n <div class=\"prompt-input\">\n <InlineStatusBanner\n v-if=\"status\"\n :status=\"status\"\n @button-click=\"emit('statusButtonClick')\"\n />\n\n <div\n :class=\"['input-container', { disabled }]\"\n @click=\"textareaRef?.focus()\"\n >\n <KdsProgressBar v-if=\"loading\" class=\"progress-bar\" indeterminate />\n\n <div class=\"text-input-wrapper\">\n <textarea\n ref=\"textareaRef\"\n v-model=\"modelValue\"\n class=\"text-input\"\n rows=\"1\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n @keydown=\"onKeydown\"\n />\n </div>\n\n <div class=\"action\">\n <KdsButton\n v-if=\"loading\"\n variant=\"outlined\"\n leading-icon=\"stop\"\n size=\"medium\"\n ariaLabel=\"Stop\"\n @click.stop=\"emit('stop')\"\n />\n <KdsButton\n v-else\n variant=\"filled\"\n leading-icon=\"send\"\n size=\"medium\"\n ariaLabel=\"Send\"\n :disabled=\"!canSubmit\"\n @click.stop=\"onSubmit\"\n />\n </div>\n </div>\n\n <div v-if=\"leftSubtext || rightSubtext || link\" class=\"subtext\">\n <div v-if=\"leftSubtext\" class=\"subtext-left\">{{ leftSubtext }}</div>\n <div v-if=\"rightSubtext || link\" class=\"subtext-right\">\n <span v-if=\"rightSubtext\">{{ rightSubtext }}</span>\n <KdsLink v-if=\"link\" :label=\"link.label\" :to=\"link.to\" size=\"small\" />\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.prompt-input {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.input-container {\n position: relative;\n display: flex;\n gap: var(--kds-spacing-container-0-5x);\n align-items: flex-end;\n padding: calc(\n var(--kds-spacing-container-0-37x) - var(--kds-core-border-width-xs)\n );\n overflow: hidden;\n cursor: text;\n background: var(--kds-color-background-input-initial);\n border: var(--kds-border-action-input);\n border-radius: var(--kds-border-radius-container-0-37x);\n\n &:has(textarea:focus:not(:disabled)) {\n outline: var(--kds-border-action-focused);\n outline-offset: var(--kds-spacing-offset-focus);\n }\n\n &:has(textarea:hover:not(:disabled, :focus)) {\n background: var(--kds-color-background-input-hover);\n }\n\n &.disabled {\n cursor: default;\n border: var(--kds-border-action-disabled);\n }\n}\n\n.text-input-wrapper {\n display: flex;\n flex: 1 0 0;\n align-items: center;\n min-width: 0;\n\n /*\n * Match the Send/Stop button height so a single-line textarea sits\n * vertically centered against the button.\n */\n min-height: var(--kds-dimension-component-height-1-75x);\n padding-left: var(--kds-spacing-container-0-37x);\n}\n\n.text-input {\n width: 100%;\n min-width: 0;\n\n /* Cap textarea growth at 4 lines, scroll beyond that. */\n max-height: calc(4 * 1lh);\n padding: 0;\n overflow-y: auto;\n font: var(--kds-font-base-body-small);\n color: var(--kds-color-text-and-icon-neutral);\n resize: none;\n outline: none;\n scrollbar-width: none;\n background: transparent;\n border: none;\n\n &::placeholder {\n color: var(--kds-color-text-and-icon-subtle);\n }\n\n &:disabled {\n color: var(--kds-color-text-and-icon-disabled);\n cursor: default;\n\n &::placeholder {\n color: var(--kds-color-text-and-icon-disabled);\n }\n }\n\n &::-webkit-scrollbar {\n display: none;\n }\n}\n\n.action {\n display: flex;\n flex-shrink: 0;\n align-items: flex-end;\n}\n\n.progress-bar {\n position: absolute;\n inset: -1px 0 auto;\n}\n\n.subtext {\n display: flex;\n flex-wrap: wrap;\n gap: var(--kds-spacing-container-0-25x) var(--kds-spacing-container-0-5x);\n align-items: center;\n padding: var(--kds-spacing-container-0-25x) var(--kds-spacing-container-0-25x)\n 0;\n font: var(--kds-font-base-subtext-small);\n color: var(--kds-color-text-and-icon-neutral);\n}\n\n.subtext-left {\n /*\n * Take all remaining inline space so the right block is pushed to the\n * end. `min-width: 0` lets the ellipsis kick in when the right block\n * grows past the container width.\n */\n flex: 1 1 0;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.subtext-right {\n /*\n * On row 1 (alongside .subtext-left) the right block stays at its\n * intrinsic width — line-breaking in flex layout is decided from\n * `flex-basis`, so it wraps onto its own row as soon as the container\n * is narrower than that intrinsic width. On row 2 (its own row) the\n * default `flex-shrink: 1` plus `min-width: 0` lets it shrink to the\n * container width and wrap its own content (text + link).\n */\n display: flex;\n flex-wrap: wrap;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n min-width: 0;\n margin-left: auto;\n}\n</style>\n","export const kdsPromptInputStatusType = {\n ERROR: \"error\",\n NOTE: \"note\",\n} as const;\n\nexport const kdsPromptInputStatusTypes = Object.values(\n kdsPromptInputStatusType,\n);\n"],"names":["_createElementBlock","_normalizeClass","_createVNode","_unref","_createElementVNode","_hoisted_2","_toDisplayString","_createBlock","_useModel","_openBlock"],"mappings":"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"}
1
+ {"version":3,"file":"ai.js","names":[],"sources":["../src/ai/KdsPromptInput/InlineStatusBanner.vue","../src/ai/KdsPromptInput/InlineStatusBanner.vue","../src/ai/KdsPromptInput/KdsPromptInput.vue","../src/ai/KdsPromptInput/KdsPromptInput.vue","../src/ai/KdsPromptInput/enums.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { KdsButton, KdsIcon } from \"@knime/kds-components\";\n\nimport type { KdsPromptInputStatus } from \"./types\";\n\nconst { status } = defineProps<{\n status: KdsPromptInputStatus;\n}>();\n\nconst emit = defineEmits<{\n buttonClick: [];\n}>();\n</script>\n\n<template>\n <div\n :class=\"['inline-status-banner', status.type]\"\n :role=\"status.type === 'error' ? 'alert' : 'status'\"\n >\n <KdsIcon\n :name=\"status.type === 'error' ? 'circle-error' : 'circle-info'\"\n size=\"small\"\n class=\"icon\"\n />\n <!--\n tabindex=\"0\" so keyboard users can scroll the message when it\n overflows the 2-line cap (axe rule: scrollable-region-focusable).\n -->\n <span class=\"text\" tabindex=\"0\">{{ status.message }}</span>\n <KdsButton\n v-if=\"status.buttonLabel\"\n class=\"action\"\n size=\"small\"\n variant=\"filled\"\n :label=\"status.buttonLabel\"\n @click=\"emit('buttonClick')\"\n />\n </div>\n</template>\n\n<style scoped>\n.inline-status-banner {\n display: flex;\n gap: var(--kds-spacing-container-0-37x);\n align-items: center;\n\n /*\n * The banner extends 0.25x behind the input below so the input's\n * rounded top corners carve out of the banner's bottom edge.\n * The extra 0.25x of bottom padding keeps the\n * content visually centered against the visible portion of the box.\n * Top and horizontal padding subtract the border width so the box\n * matches Figma (where the border is drawn outside the layout box).\n * Bottom has no border, so no subtraction is needed there.\n */\n padding: calc(\n var(--kds-spacing-container-0-5x) - var(--kds-core-border-width-xs)\n )\n calc(var(--kds-spacing-container-0-5x) - var(--kds-core-border-width-xs))\n calc(var(--kds-spacing-container-0-5x) + var(--kds-spacing-container-0-25x));\n margin-bottom: calc(-1 * var(--kds-spacing-container-0-25x));\n font: var(--kds-font-base-body-small);\n color: var(--kds-color-text-and-icon-neutral);\n border-style: solid;\n border-width: var(--kds-core-border-width-xs);\n border-bottom: none;\n border-top-left-radius: var(--kds-border-radius-container-0-50x);\n border-top-right-radius: var(--kds-border-radius-container-0-50x);\n\n .icon,\n .action {\n flex-shrink: 0;\n }\n\n &.error {\n background-color: var(--kds-color-background-static-danger-muted);\n border: var(--kds-border-base-danger);\n border-bottom: none;\n\n .icon {\n color: var(--kds-color-text-and-icon-danger);\n }\n }\n\n &.note {\n background-color: var(--kds-color-background-static-info-muted);\n border: var(--kds-border-base-info);\n border-bottom: none;\n\n .icon {\n color: var(--kds-color-text-and-icon-info);\n }\n }\n}\n\n.text {\n flex: 1 0 0;\n min-width: 0;\n\n /* Allow up to 2 lines, scroll beyond that. */\n max-height: calc(2 * 1lh);\n overflow-y: auto;\n overflow-wrap: anywhere;\n scrollbar-width: thin;\n\n &:focus-visible {\n outline: var(--kds-border-action-focused);\n outline-offset: var(--kds-spacing-offset-focus);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { KdsButton, KdsIcon } from \"@knime/kds-components\";\n\nimport type { KdsPromptInputStatus } from \"./types\";\n\nconst { status } = defineProps<{\n status: KdsPromptInputStatus;\n}>();\n\nconst emit = defineEmits<{\n buttonClick: [];\n}>();\n</script>\n\n<template>\n <div\n :class=\"['inline-status-banner', status.type]\"\n :role=\"status.type === 'error' ? 'alert' : 'status'\"\n >\n <KdsIcon\n :name=\"status.type === 'error' ? 'circle-error' : 'circle-info'\"\n size=\"small\"\n class=\"icon\"\n />\n <!--\n tabindex=\"0\" so keyboard users can scroll the message when it\n overflows the 2-line cap (axe rule: scrollable-region-focusable).\n -->\n <span class=\"text\" tabindex=\"0\">{{ status.message }}</span>\n <KdsButton\n v-if=\"status.buttonLabel\"\n class=\"action\"\n size=\"small\"\n variant=\"filled\"\n :label=\"status.buttonLabel\"\n @click=\"emit('buttonClick')\"\n />\n </div>\n</template>\n\n<style scoped>\n.inline-status-banner {\n display: flex;\n gap: var(--kds-spacing-container-0-37x);\n align-items: center;\n\n /*\n * The banner extends 0.25x behind the input below so the input's\n * rounded top corners carve out of the banner's bottom edge.\n * The extra 0.25x of bottom padding keeps the\n * content visually centered against the visible portion of the box.\n * Top and horizontal padding subtract the border width so the box\n * matches Figma (where the border is drawn outside the layout box).\n * Bottom has no border, so no subtraction is needed there.\n */\n padding: calc(\n var(--kds-spacing-container-0-5x) - var(--kds-core-border-width-xs)\n )\n calc(var(--kds-spacing-container-0-5x) - var(--kds-core-border-width-xs))\n calc(var(--kds-spacing-container-0-5x) + var(--kds-spacing-container-0-25x));\n margin-bottom: calc(-1 * var(--kds-spacing-container-0-25x));\n font: var(--kds-font-base-body-small);\n color: var(--kds-color-text-and-icon-neutral);\n border-style: solid;\n border-width: var(--kds-core-border-width-xs);\n border-bottom: none;\n border-top-left-radius: var(--kds-border-radius-container-0-50x);\n border-top-right-radius: var(--kds-border-radius-container-0-50x);\n\n .icon,\n .action {\n flex-shrink: 0;\n }\n\n &.error {\n background-color: var(--kds-color-background-static-danger-muted);\n border: var(--kds-border-base-danger);\n border-bottom: none;\n\n .icon {\n color: var(--kds-color-text-and-icon-danger);\n }\n }\n\n &.note {\n background-color: var(--kds-color-background-static-info-muted);\n border: var(--kds-border-base-info);\n border-bottom: none;\n\n .icon {\n color: var(--kds-color-text-and-icon-info);\n }\n }\n}\n\n.text {\n flex: 1 0 0;\n min-width: 0;\n\n /* Allow up to 2 lines, scroll beyond that. */\n max-height: calc(2 * 1lh);\n overflow-y: auto;\n overflow-wrap: anywhere;\n scrollbar-width: thin;\n\n &:focus-visible {\n outline: var(--kds-border-action-focused);\n outline-offset: var(--kds-spacing-offset-focus);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useTemplateRef, watch } from \"vue\";\nimport { useResizeObserver } from \"@vueuse/core\";\n\nimport { KdsButton, KdsLink, KdsProgressBar } from \"@knime/kds-components\";\n\nimport InlineStatusBanner from \"./InlineStatusBanner.vue\";\nimport type { KdsPromptInputProps } from \"./types\";\n\nconst {\n placeholder = \"\",\n disabled = false,\n loading = false,\n status = undefined,\n ariaLabel = \"Prompt\",\n leftSubtext = undefined,\n rightSubtext = undefined,\n link = undefined,\n} = defineProps<KdsPromptInputProps>();\n\nconst emit = defineEmits<{\n /** User submitted the prompt (Enter or send button). */\n submit: [value: string];\n /** User clicked the stop button while loading. */\n stop: [];\n /** User clicked the action button inside the inline status banner. */\n statusButtonClick: [];\n}>();\n\nconst modelValue = defineModel<string>({ default: \"\" });\n\nconst textareaRef = useTemplateRef<HTMLTextAreaElement>(\"textareaRef\");\n\nconst canSubmit = computed(\n () => !disabled && !loading && modelValue.value.trim().length > 0,\n);\n\nfunction resizeTextarea() {\n const el = textareaRef.value;\n if (!el) {\n return;\n }\n // Defer style writes to the next animation frame so they don't run inside\n // the ResizeObserver callback (which would otherwise trigger the\n // \"ResizeObserver loop completed with undelivered notifications\" warning).\n requestAnimationFrame(() => {\n if (!textareaRef.value) {\n return;\n }\n el.style.height = \"auto\";\n const scrollHeight = el.scrollHeight;\n if (scrollHeight <= el.offsetHeight) {\n return;\n }\n el.style.height = `${scrollHeight}px`;\n });\n}\n\nuseResizeObserver(textareaRef, resizeTextarea);\nwatch(modelValue, resizeTextarea, { immediate: true });\n\nfunction onSubmit() {\n if (!canSubmit.value) {\n return;\n }\n emit(\"submit\", modelValue.value.trim());\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n // Enter submits, Shift+Enter inserts a newline. Ignore Enter while an IME\n // composition session is in progress.\n if (event.key === \"Enter\" && !event.shiftKey && !event.isComposing) {\n event.preventDefault();\n onSubmit();\n }\n}\n\ndefineExpose({\n focus: () => textareaRef.value?.focus(),\n});\n</script>\n\n<template>\n <div class=\"prompt-input\">\n <InlineStatusBanner\n v-if=\"status\"\n :status=\"status\"\n @button-click=\"emit('statusButtonClick')\"\n />\n\n <div\n :class=\"['input-container', { disabled }]\"\n @click=\"textareaRef?.focus()\"\n >\n <KdsProgressBar v-if=\"loading\" class=\"progress-bar\" indeterminate />\n\n <div class=\"text-input-wrapper\">\n <textarea\n ref=\"textareaRef\"\n v-model=\"modelValue\"\n class=\"text-input\"\n rows=\"1\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n @keydown=\"onKeydown\"\n />\n </div>\n\n <div class=\"action\">\n <KdsButton\n v-if=\"loading\"\n variant=\"outlined\"\n leading-icon=\"stop\"\n size=\"medium\"\n ariaLabel=\"Stop\"\n @click.stop=\"emit('stop')\"\n />\n <KdsButton\n v-else\n variant=\"filled\"\n leading-icon=\"send\"\n size=\"medium\"\n ariaLabel=\"Send\"\n :disabled=\"!canSubmit\"\n @click.stop=\"onSubmit\"\n />\n </div>\n </div>\n\n <div v-if=\"leftSubtext || rightSubtext || link\" class=\"subtext\">\n <div v-if=\"leftSubtext\" class=\"subtext-left\">{{ leftSubtext }}</div>\n <div v-if=\"rightSubtext || link\" class=\"subtext-right\">\n <span v-if=\"rightSubtext\">{{ rightSubtext }}</span>\n <KdsLink v-if=\"link\" :label=\"link.label\" :to=\"link.to\" size=\"small\" />\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.prompt-input {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.input-container {\n position: relative;\n display: flex;\n gap: var(--kds-spacing-container-0-5x);\n align-items: flex-end;\n padding: calc(\n var(--kds-spacing-container-0-37x) - var(--kds-core-border-width-xs)\n );\n overflow: hidden;\n cursor: text;\n background: var(--kds-color-background-input-initial);\n border: var(--kds-border-action-input);\n border-radius: var(--kds-border-radius-container-0-37x);\n\n &:has(textarea:focus:not(:disabled)) {\n outline: var(--kds-border-action-focused);\n outline-offset: var(--kds-spacing-offset-focus);\n }\n\n &:has(textarea:hover:not(:disabled, :focus)) {\n background: var(--kds-color-background-input-hover);\n }\n\n &.disabled {\n cursor: default;\n border: var(--kds-border-action-disabled);\n }\n}\n\n.text-input-wrapper {\n display: flex;\n flex: 1 0 0;\n align-items: center;\n min-width: 0;\n\n /*\n * Match the Send/Stop button height so a single-line textarea sits\n * vertically centered against the button.\n */\n min-height: var(--kds-dimension-component-height-1-75x);\n padding-left: var(--kds-spacing-container-0-37x);\n}\n\n.text-input {\n width: 100%;\n min-width: 0;\n\n /* Cap textarea growth at 4 lines, scroll beyond that. */\n max-height: calc(4 * 1lh);\n padding: 0;\n overflow-y: auto;\n font: var(--kds-font-base-body-small);\n color: var(--kds-color-text-and-icon-neutral);\n resize: none;\n outline: none;\n scrollbar-width: none;\n background: transparent;\n border: none;\n\n &::placeholder {\n color: var(--kds-color-text-and-icon-subtle);\n }\n\n &:disabled {\n color: var(--kds-color-text-and-icon-disabled);\n cursor: default;\n\n &::placeholder {\n color: var(--kds-color-text-and-icon-disabled);\n }\n }\n\n &::-webkit-scrollbar {\n display: none;\n }\n}\n\n.action {\n display: flex;\n flex-shrink: 0;\n align-items: flex-end;\n}\n\n.progress-bar {\n position: absolute;\n inset: -1px 0 auto;\n}\n\n.subtext {\n display: flex;\n flex-wrap: wrap;\n gap: var(--kds-spacing-container-0-25x) var(--kds-spacing-container-0-5x);\n align-items: center;\n padding: var(--kds-spacing-container-0-25x) var(--kds-spacing-container-0-25x)\n 0;\n font: var(--kds-font-base-subtext-small);\n color: var(--kds-color-text-and-icon-neutral);\n}\n\n.subtext-left {\n /*\n * Take all remaining inline space so the right block is pushed to the\n * end. `min-width: 0` lets the ellipsis kick in when the right block\n * grows past the container width.\n */\n flex: 1 1 0;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.subtext-right {\n /*\n * On row 1 (alongside .subtext-left) the right block stays at its\n * intrinsic width — line-breaking in flex layout is decided from\n * `flex-basis`, so it wraps onto its own row as soon as the container\n * is narrower than that intrinsic width. On row 2 (its own row) the\n * default `flex-shrink: 1` plus `min-width: 0` lets it shrink to the\n * container width and wrap its own content (text + link).\n */\n display: flex;\n flex-wrap: wrap;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n min-width: 0;\n margin-left: auto;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useTemplateRef, watch } from \"vue\";\nimport { useResizeObserver } from \"@vueuse/core\";\n\nimport { KdsButton, KdsLink, KdsProgressBar } from \"@knime/kds-components\";\n\nimport InlineStatusBanner from \"./InlineStatusBanner.vue\";\nimport type { KdsPromptInputProps } from \"./types\";\n\nconst {\n placeholder = \"\",\n disabled = false,\n loading = false,\n status = undefined,\n ariaLabel = \"Prompt\",\n leftSubtext = undefined,\n rightSubtext = undefined,\n link = undefined,\n} = defineProps<KdsPromptInputProps>();\n\nconst emit = defineEmits<{\n /** User submitted the prompt (Enter or send button). */\n submit: [value: string];\n /** User clicked the stop button while loading. */\n stop: [];\n /** User clicked the action button inside the inline status banner. */\n statusButtonClick: [];\n}>();\n\nconst modelValue = defineModel<string>({ default: \"\" });\n\nconst textareaRef = useTemplateRef<HTMLTextAreaElement>(\"textareaRef\");\n\nconst canSubmit = computed(\n () => !disabled && !loading && modelValue.value.trim().length > 0,\n);\n\nfunction resizeTextarea() {\n const el = textareaRef.value;\n if (!el) {\n return;\n }\n // Defer style writes to the next animation frame so they don't run inside\n // the ResizeObserver callback (which would otherwise trigger the\n // \"ResizeObserver loop completed with undelivered notifications\" warning).\n requestAnimationFrame(() => {\n if (!textareaRef.value) {\n return;\n }\n el.style.height = \"auto\";\n const scrollHeight = el.scrollHeight;\n if (scrollHeight <= el.offsetHeight) {\n return;\n }\n el.style.height = `${scrollHeight}px`;\n });\n}\n\nuseResizeObserver(textareaRef, resizeTextarea);\nwatch(modelValue, resizeTextarea, { immediate: true });\n\nfunction onSubmit() {\n if (!canSubmit.value) {\n return;\n }\n emit(\"submit\", modelValue.value.trim());\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n // Enter submits, Shift+Enter inserts a newline. Ignore Enter while an IME\n // composition session is in progress.\n if (event.key === \"Enter\" && !event.shiftKey && !event.isComposing) {\n event.preventDefault();\n onSubmit();\n }\n}\n\ndefineExpose({\n focus: () => textareaRef.value?.focus(),\n});\n</script>\n\n<template>\n <div class=\"prompt-input\">\n <InlineStatusBanner\n v-if=\"status\"\n :status=\"status\"\n @button-click=\"emit('statusButtonClick')\"\n />\n\n <div\n :class=\"['input-container', { disabled }]\"\n @click=\"textareaRef?.focus()\"\n >\n <KdsProgressBar v-if=\"loading\" class=\"progress-bar\" indeterminate />\n\n <div class=\"text-input-wrapper\">\n <textarea\n ref=\"textareaRef\"\n v-model=\"modelValue\"\n class=\"text-input\"\n rows=\"1\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n @keydown=\"onKeydown\"\n />\n </div>\n\n <div class=\"action\">\n <KdsButton\n v-if=\"loading\"\n variant=\"outlined\"\n leading-icon=\"stop\"\n size=\"medium\"\n ariaLabel=\"Stop\"\n @click.stop=\"emit('stop')\"\n />\n <KdsButton\n v-else\n variant=\"filled\"\n leading-icon=\"send\"\n size=\"medium\"\n ariaLabel=\"Send\"\n :disabled=\"!canSubmit\"\n @click.stop=\"onSubmit\"\n />\n </div>\n </div>\n\n <div v-if=\"leftSubtext || rightSubtext || link\" class=\"subtext\">\n <div v-if=\"leftSubtext\" class=\"subtext-left\">{{ leftSubtext }}</div>\n <div v-if=\"rightSubtext || link\" class=\"subtext-right\">\n <span v-if=\"rightSubtext\">{{ rightSubtext }}</span>\n <KdsLink v-if=\"link\" :label=\"link.label\" :to=\"link.to\" size=\"small\" />\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.prompt-input {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.input-container {\n position: relative;\n display: flex;\n gap: var(--kds-spacing-container-0-5x);\n align-items: flex-end;\n padding: calc(\n var(--kds-spacing-container-0-37x) - var(--kds-core-border-width-xs)\n );\n overflow: hidden;\n cursor: text;\n background: var(--kds-color-background-input-initial);\n border: var(--kds-border-action-input);\n border-radius: var(--kds-border-radius-container-0-37x);\n\n &:has(textarea:focus:not(:disabled)) {\n outline: var(--kds-border-action-focused);\n outline-offset: var(--kds-spacing-offset-focus);\n }\n\n &:has(textarea:hover:not(:disabled, :focus)) {\n background: var(--kds-color-background-input-hover);\n }\n\n &.disabled {\n cursor: default;\n border: var(--kds-border-action-disabled);\n }\n}\n\n.text-input-wrapper {\n display: flex;\n flex: 1 0 0;\n align-items: center;\n min-width: 0;\n\n /*\n * Match the Send/Stop button height so a single-line textarea sits\n * vertically centered against the button.\n */\n min-height: var(--kds-dimension-component-height-1-75x);\n padding-left: var(--kds-spacing-container-0-37x);\n}\n\n.text-input {\n width: 100%;\n min-width: 0;\n\n /* Cap textarea growth at 4 lines, scroll beyond that. */\n max-height: calc(4 * 1lh);\n padding: 0;\n overflow-y: auto;\n font: var(--kds-font-base-body-small);\n color: var(--kds-color-text-and-icon-neutral);\n resize: none;\n outline: none;\n scrollbar-width: none;\n background: transparent;\n border: none;\n\n &::placeholder {\n color: var(--kds-color-text-and-icon-subtle);\n }\n\n &:disabled {\n color: var(--kds-color-text-and-icon-disabled);\n cursor: default;\n\n &::placeholder {\n color: var(--kds-color-text-and-icon-disabled);\n }\n }\n\n &::-webkit-scrollbar {\n display: none;\n }\n}\n\n.action {\n display: flex;\n flex-shrink: 0;\n align-items: flex-end;\n}\n\n.progress-bar {\n position: absolute;\n inset: -1px 0 auto;\n}\n\n.subtext {\n display: flex;\n flex-wrap: wrap;\n gap: var(--kds-spacing-container-0-25x) var(--kds-spacing-container-0-5x);\n align-items: center;\n padding: var(--kds-spacing-container-0-25x) var(--kds-spacing-container-0-25x)\n 0;\n font: var(--kds-font-base-subtext-small);\n color: var(--kds-color-text-and-icon-neutral);\n}\n\n.subtext-left {\n /*\n * Take all remaining inline space so the right block is pushed to the\n * end. `min-width: 0` lets the ellipsis kick in when the right block\n * grows past the container width.\n */\n flex: 1 1 0;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.subtext-right {\n /*\n * On row 1 (alongside .subtext-left) the right block stays at its\n * intrinsic width — line-breaking in flex layout is decided from\n * `flex-basis`, so it wraps onto its own row as soon as the container\n * is narrower than that intrinsic width. On row 2 (its own row) the\n * default `flex-shrink: 1` plus `min-width: 0` lets it shrink to the\n * container width and wrap its own content (text + link).\n */\n display: flex;\n flex-wrap: wrap;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n min-width: 0;\n margin-left: auto;\n}\n</style>\n","export const kdsPromptInputStatusType = {\n ERROR: \"error\",\n NOTE: \"note\",\n} as const;\n\nexport const kdsPromptInputStatusTypes = Object.values(\n kdsPromptInputStatusType,\n);\n"],"mappings":";;;;;;;;;;;;;;;;;EASA,MAAM,OAAO;;uBAMX,mBAsBM,OAAA;IArBH,OAAK,eAAA,CAAA,wBAA2B,QAAA,OAAO,IAAI,CAAA;IAC3C,MAAM,QAAA,OAAO,SAAI,UAAA,UAAA;;IAElB,YAIE,MAAA,OAAA,GAAA;KAHC,MAAM,QAAA,OAAO,SAAI,UAAA,iBAAA;KAClB,MAAK;KACL,OAAM;;IAMR,mBAA2D,QAA3D,cAA2D,gBAAxB,QAAA,OAAO,OAAO,GAAA,CAAA;IAEzC,QAAA,OAAO,eAAA,UAAA,GADf,YAOE,MAAA,SAAA,GAAA;;KALA,OAAM;KACN,MAAK;KACL,SAAQ;KACP,OAAO,QAAA,OAAO;KACd,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEflB,MAAM,OAAO;EASb,MAAM,aAAa,SAAmB,SAAA,YAAgB;EAEtD,MAAM,cAAc,eAAoC,aAAa;EAErE,MAAM,YAAY,eACV,CAAC,QAAA,YAAY,CAAC,QAAA,WAAW,WAAW,MAAM,KAAK,CAAC,CAAC,SAAS,CAClE;EAEA,SAAS,iBAAiB;GACxB,MAAM,KAAK,YAAY;GACvB,IAAI,CAAC,IACH;GAKF,4BAA4B;IAC1B,IAAI,CAAC,YAAY,OACf;IAEF,GAAG,MAAM,SAAS;IAClB,MAAM,eAAe,GAAG;IACxB,IAAI,gBAAgB,GAAG,cACrB;IAEF,GAAG,MAAM,SAAS,GAAG,aAAa;GACpC,CAAC;EACH;EAEA,kBAAkB,aAAa,cAAc;EAC7C,MAAM,YAAY,gBAAgB,EAAE,WAAW,KAAK,CAAC;EAErD,SAAS,WAAW;GAClB,IAAI,CAAC,UAAU,OACb;GAEF,KAAK,UAAU,WAAW,MAAM,KAAK,CAAC;EACxC;EAEA,SAAS,UAAU,OAAsB;GAGvC,IAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,YAAY,CAAC,MAAM,aAAa;IAClE,MAAM,eAAe;IACrB,SAAS;GACX;EACF;EAEA,SAAa,EACX,aAAa,YAAY,OAAO,MAAM,EACxC,CAAC;;uBAIC,mBAsDM,OAtDN,YAsDM;IApDI,QAAA,UAAA,UAAA,GADR,YAIE,4BAAA;;KAFC,QAAQ,QAAA;KACR,eAAY,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,mBAAA;;IAGrB,mBAsCM,OAAA;KArCH,OAAK,eAAA,CAAA,mBAAA,EAAA,UAAwB,QAAA,SAAQ,CAAA,CAAA;KACrC,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,YAAA,OAAa,MAAK;;KAEJ,QAAA,WAAA,UAAA,GAAtB,YAAoE,MAAA,cAAA,GAAA;;MAArC,OAAM;MAAe,eAAA;;KAEpD,mBAWM,OAXN,YAWM,CAAA,eAVJ,mBASE,YAAA;eARI;MAAJ,KAAI;8EACe,QAAA;MACnB,OAAM;MACN,MAAK;MACJ,aAAa,QAAA;MACb,UAAU,QAAA;MACV,cAAY,QAAA;MACH;6CAND,WAAA,KAAU,CAAA,CAAA,CAAA,CAAA;KAUvB,mBAkBM,OAlBN,YAkBM,CAhBI,QAAA,WAAA,UAAA,GADR,YAOE,MAAA,SAAA,GAAA;;MALA,SAAQ;MACR,gBAAa;MACb,MAAK;MACL,WAAU;MACT,SAAK,OAAA,OAAA,OAAA,KAAA,eAAA,WAAO,KAAI,MAAA,GAAA,CAAA,MAAA,CAAA;yBAEnB,YAQE,MAAA,SAAA,GAAA;;MANA,SAAQ;MACR,gBAAa;MACb,MAAK;MACL,WAAU;MACT,UAAQ,CAAG,UAAA;MACX,SAAK,cAAO,UAAQ,CAAA,MAAA,CAAA;;;IAKhB,QAAA,eAAe,QAAA,gBAAgB,QAAA,QAAA,UAAA,GAA1C,mBAMM,OANN,YAMM,CALO,QAAA,eAAA,UAAA,GAAX,mBAAoE,OAApE,YAAoE,gBAApB,QAAA,WAAW,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,GAChD,QAAA,gBAAgB,QAAA,QAAA,UAAA,GAA3B,mBAGM,OAHN,YAGM,CAFQ,QAAA,gBAAA,UAAA,GAAZ,mBAAmD,QAAA,YAAA,gBAAtB,QAAA,YAAY,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,GAC1B,QAAA,QAAA,UAAA,GAAf,YAAsE,MAAA,OAAA,GAAA;;KAAhD,OAAO,QAAA,KAAK;KAAQ,IAAI,QAAA,KAAK;KAAI,MAAK;;;;;;;;AEtIpE,IAAa,2BAA2B;CACtC,OAAO;CACP,MAAM;AACR;AAEA,IAAa,4BAA4B,OAAO,OAC9C,wBACF"}