@knime/product-features 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_plugin-vue_export-helper-BLJdeqtw.js +15264 -0
- package/dist/_plugin-vue_export-helper-BLJdeqtw.js.map +1 -0
- package/dist/_plugin-vue_export-helper.css +4544 -0
- package/dist/ai.css +197 -0
- package/dist/ai.js +195 -0
- package/dist/ai.js.map +1 -0
- package/dist/nodes.css +0 -4529
- package/dist/nodes.js +3 -11252
- package/dist/nodes.js.map +1 -1
- package/dist/src/ai/KdsPromptInput/InlineStatusBanner.vue.d.ts +11 -0
- package/dist/src/ai/KdsPromptInput/InlineStatusBanner.vue.d.ts.map +1 -0
- package/dist/src/ai/KdsPromptInput/KdsPromptInput.vue.d.ts +22 -0
- package/dist/src/ai/KdsPromptInput/KdsPromptInput.vue.d.ts.map +1 -0
- package/dist/src/ai/KdsPromptInput/enums.d.ts +6 -0
- package/dist/src/ai/KdsPromptInput/enums.d.ts.map +1 -0
- package/dist/src/ai/KdsPromptInput/index.d.ts +4 -0
- package/dist/src/ai/KdsPromptInput/index.d.ts.map +1 -0
- package/dist/src/ai/KdsPromptInput/types.d.ts +59 -0
- package/dist/src/ai/KdsPromptInput/types.d.ts.map +1 -0
- package/dist/src/ai/index.d.ts +3 -0
- package/dist/src/ai/index.d.ts.map +1 -0
- package/dist/src/versions/CreateVersionForm/CreateVersionForm.vue.d.ts +16 -0
- package/dist/src/versions/CreateVersionForm/CreateVersionForm.vue.d.ts.map +1 -0
- package/dist/src/versions/CreateVersionForm/index.d.ts +3 -0
- package/dist/src/versions/CreateVersionForm/index.d.ts.map +1 -0
- package/dist/src/versions/CreateVersionForm/types.d.ts +4 -0
- package/dist/src/versions/CreateVersionForm/types.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/CurrentState.vue.d.ts +20 -0
- package/dist/src/versions/VersionHistory/CurrentState.vue.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/HistoryEvent.vue.d.ts +23 -0
- package/dist/src/versions/VersionHistory/HistoryEvent.vue.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/HistoryEventAuthor.vue.d.ts +7 -0
- package/dist/src/versions/VersionHistory/HistoryEventAuthor.vue.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/HistoryEventFooter.vue.d.ts +8 -0
- package/dist/src/versions/VersionHistory/HistoryEventFooter.vue.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/VersionHistory.vue.d.ts +20 -0
- package/dist/src/versions/VersionHistory/VersionHistory.vue.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/VersionItem.vue.d.ts +20 -0
- package/dist/src/versions/VersionHistory/VersionItem.vue.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/VersionLabel.vue.d.ts +144 -0
- package/dist/src/versions/VersionHistory/VersionLabel.vue.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/VersionLimitInfo.vue.d.ts +9 -0
- package/dist/src/versions/VersionHistory/VersionLimitInfo.vue.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/constants.d.ts +4 -0
- package/dist/src/versions/VersionHistory/constants.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/index.d.ts +4 -0
- package/dist/src/versions/VersionHistory/index.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/mock-data/index.d.ts +11 -0
- package/dist/src/versions/VersionHistory/mock-data/index.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/mock-data/savepoints.d.ts +5 -0
- package/dist/src/versions/VersionHistory/mock-data/savepoints.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/mock-data/versionHistory.d.ts +7 -0
- package/dist/src/versions/VersionHistory/mock-data/versionHistory.d.ts.map +1 -0
- package/dist/src/versions/VersionHistory/types.d.ts +63 -0
- package/dist/src/versions/VersionHistory/types.d.ts.map +1 -0
- package/dist/src/versions/index.d.ts +5 -0
- package/dist/src/versions/index.d.ts.map +1 -0
- package/dist/versions.css +114 -0
- package/dist/versions.js +630 -0
- package/dist/versions.js.map +1 -0
- package/package.json +11 -3
package/dist/ai.css
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
|
|
2
|
+
.inline-status-banner {
|
|
3
|
+
&[data-v-506380c6] {
|
|
4
|
+
display: flex;
|
|
5
|
+
gap: var(--kds-spacing-container-0-37x);
|
|
6
|
+
align-items: center;
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* The banner extends 0.25x behind the input below so the input's
|
|
10
|
+
* rounded top corners carve out of the banner's bottom edge.
|
|
11
|
+
* The extra 0.25x of bottom padding keeps the
|
|
12
|
+
* content visually centered against the visible portion of the box.
|
|
13
|
+
* Top and horizontal padding subtract the border width so the box
|
|
14
|
+
* matches Figma (where the border is drawn outside the layout box).
|
|
15
|
+
* Bottom has no border, so no subtraction is needed there.
|
|
16
|
+
*/
|
|
17
|
+
padding: calc(
|
|
18
|
+
var(--kds-spacing-container-0-5x) - var(--kds-core-border-width-xs)
|
|
19
|
+
)
|
|
20
|
+
calc(var(--kds-spacing-container-0-5x) - var(--kds-core-border-width-xs))
|
|
21
|
+
calc(var(--kds-spacing-container-0-5x) + var(--kds-spacing-container-0-25x));
|
|
22
|
+
margin-bottom: calc(-1 * var(--kds-spacing-container-0-25x));
|
|
23
|
+
font: var(--kds-font-base-body-small);
|
|
24
|
+
color: var(--kds-color-text-and-icon-neutral);
|
|
25
|
+
border-style: solid;
|
|
26
|
+
border-width: var(--kds-core-border-width-xs);
|
|
27
|
+
border-bottom: none;
|
|
28
|
+
border-top-left-radius: var(--kds-border-radius-container-0-50x);
|
|
29
|
+
border-top-right-radius: var(--kds-border-radius-container-0-50x);
|
|
30
|
+
}
|
|
31
|
+
.icon[data-v-506380c6],
|
|
32
|
+
.action[data-v-506380c6] {
|
|
33
|
+
flex-shrink: 0;
|
|
34
|
+
}
|
|
35
|
+
&.error {
|
|
36
|
+
&[data-v-506380c6] {
|
|
37
|
+
background-color: var(--kds-color-background-static-danger-muted);
|
|
38
|
+
border: var(--kds-border-base-danger);
|
|
39
|
+
border-bottom: none;
|
|
40
|
+
}
|
|
41
|
+
.icon[data-v-506380c6] {
|
|
42
|
+
color: var(--kds-color-text-and-icon-danger);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
&.note {
|
|
46
|
+
&[data-v-506380c6] {
|
|
47
|
+
background-color: var(--kds-color-background-static-info-muted);
|
|
48
|
+
border: var(--kds-border-base-info);
|
|
49
|
+
border-bottom: none;
|
|
50
|
+
}
|
|
51
|
+
.icon[data-v-506380c6] {
|
|
52
|
+
color: var(--kds-color-text-and-icon-info);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
.text {
|
|
57
|
+
&[data-v-506380c6] {
|
|
58
|
+
flex: 1 0 0;
|
|
59
|
+
min-width: 0;
|
|
60
|
+
|
|
61
|
+
/* Allow up to 2 lines, scroll beyond that. */
|
|
62
|
+
max-height: calc(2 * 1lh);
|
|
63
|
+
overflow-y: auto;
|
|
64
|
+
overflow-wrap: anywhere;
|
|
65
|
+
scrollbar-width: thin;
|
|
66
|
+
}
|
|
67
|
+
&[data-v-506380c6]:focus-visible {
|
|
68
|
+
outline: var(--kds-border-action-focused);
|
|
69
|
+
outline-offset: var(--kds-spacing-offset-focus);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.prompt-input[data-v-bd237a7d] {
|
|
74
|
+
display: flex;
|
|
75
|
+
flex-direction: column;
|
|
76
|
+
width: 100%;
|
|
77
|
+
}
|
|
78
|
+
.input-container {
|
|
79
|
+
&[data-v-bd237a7d] {
|
|
80
|
+
position: relative;
|
|
81
|
+
display: flex;
|
|
82
|
+
gap: var(--kds-spacing-container-0-5x);
|
|
83
|
+
align-items: flex-end;
|
|
84
|
+
padding: calc(
|
|
85
|
+
var(--kds-spacing-container-0-37x) - var(--kds-core-border-width-xs)
|
|
86
|
+
);
|
|
87
|
+
overflow: hidden;
|
|
88
|
+
cursor: text;
|
|
89
|
+
background: var(--kds-color-background-input-initial);
|
|
90
|
+
border: var(--kds-border-action-input);
|
|
91
|
+
border-radius: var(--kds-border-radius-container-0-37x);
|
|
92
|
+
}
|
|
93
|
+
&[data-v-bd237a7d]:has(textarea:focus:not(:disabled)) {
|
|
94
|
+
outline: var(--kds-border-action-focused);
|
|
95
|
+
outline-offset: var(--kds-spacing-offset-focus);
|
|
96
|
+
}
|
|
97
|
+
&[data-v-bd237a7d]:has(textarea:hover:not(:disabled, :focus)) {
|
|
98
|
+
background: var(--kds-color-background-input-hover);
|
|
99
|
+
}
|
|
100
|
+
&.disabled[data-v-bd237a7d] {
|
|
101
|
+
cursor: default;
|
|
102
|
+
border: var(--kds-border-action-disabled);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
.text-input-wrapper[data-v-bd237a7d] {
|
|
106
|
+
display: flex;
|
|
107
|
+
flex: 1 0 0;
|
|
108
|
+
align-items: center;
|
|
109
|
+
min-width: 0;
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
* Match the Send/Stop button height so a single-line textarea sits
|
|
113
|
+
* vertically centered against the button.
|
|
114
|
+
*/
|
|
115
|
+
min-height: var(--kds-dimension-component-height-1-75x);
|
|
116
|
+
padding-left: var(--kds-spacing-container-0-37x);
|
|
117
|
+
}
|
|
118
|
+
.text-input {
|
|
119
|
+
&[data-v-bd237a7d] {
|
|
120
|
+
width: 100%;
|
|
121
|
+
min-width: 0;
|
|
122
|
+
|
|
123
|
+
/* Cap textarea growth at 4 lines, scroll beyond that. */
|
|
124
|
+
max-height: calc(4 * 1lh);
|
|
125
|
+
padding: 0;
|
|
126
|
+
overflow-y: auto;
|
|
127
|
+
font: var(--kds-font-base-body-small);
|
|
128
|
+
color: var(--kds-color-text-and-icon-neutral);
|
|
129
|
+
resize: none;
|
|
130
|
+
outline: none;
|
|
131
|
+
scrollbar-width: none;
|
|
132
|
+
background: transparent;
|
|
133
|
+
border: none;
|
|
134
|
+
}
|
|
135
|
+
&[data-v-bd237a7d]::placeholder {
|
|
136
|
+
color: var(--kds-color-text-and-icon-subtle);
|
|
137
|
+
}
|
|
138
|
+
&:disabled {
|
|
139
|
+
&[data-v-bd237a7d] {
|
|
140
|
+
color: var(--kds-color-text-and-icon-disabled);
|
|
141
|
+
cursor: default;
|
|
142
|
+
}
|
|
143
|
+
&[data-v-bd237a7d]::placeholder {
|
|
144
|
+
color: var(--kds-color-text-and-icon-disabled);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
&[data-v-bd237a7d]::-webkit-scrollbar {
|
|
148
|
+
display: none;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
.action[data-v-bd237a7d] {
|
|
152
|
+
display: flex;
|
|
153
|
+
flex-shrink: 0;
|
|
154
|
+
align-items: flex-end;
|
|
155
|
+
}
|
|
156
|
+
.progress-bar[data-v-bd237a7d] {
|
|
157
|
+
position: absolute;
|
|
158
|
+
inset: -1px 0 auto;
|
|
159
|
+
}
|
|
160
|
+
.subtext[data-v-bd237a7d] {
|
|
161
|
+
display: flex;
|
|
162
|
+
flex-wrap: wrap;
|
|
163
|
+
gap: var(--kds-spacing-container-0-25x) var(--kds-spacing-container-0-5x);
|
|
164
|
+
align-items: center;
|
|
165
|
+
padding: var(--kds-spacing-container-0-25x) var(--kds-spacing-container-0-25x)
|
|
166
|
+
0;
|
|
167
|
+
font: var(--kds-font-base-body-small);
|
|
168
|
+
color: var(--kds-color-text-and-icon-neutral);
|
|
169
|
+
}
|
|
170
|
+
.subtext-left[data-v-bd237a7d] {
|
|
171
|
+
/*
|
|
172
|
+
* Take all remaining inline space so the right block is pushed to the
|
|
173
|
+
* end. `min-width: 0` lets the ellipsis kick in when the right block
|
|
174
|
+
* grows past the container width.
|
|
175
|
+
*/
|
|
176
|
+
flex: 1 1 0;
|
|
177
|
+
min-width: 0;
|
|
178
|
+
overflow: hidden;
|
|
179
|
+
text-overflow: ellipsis;
|
|
180
|
+
white-space: nowrap;
|
|
181
|
+
}
|
|
182
|
+
.subtext-right[data-v-bd237a7d] {
|
|
183
|
+
/*
|
|
184
|
+
* On row 1 (alongside .subtext-left) the right block stays at its
|
|
185
|
+
* intrinsic width — line-breaking in flex layout is decided from
|
|
186
|
+
* `flex-basis`, so it wraps onto its own row as soon as the container
|
|
187
|
+
* is narrower than that intrinsic width. On row 2 (its own row) the
|
|
188
|
+
* default `flex-shrink: 1` plus `min-width: 0` lets it shrink to the
|
|
189
|
+
* container width and wrap its own content (text + link).
|
|
190
|
+
*/
|
|
191
|
+
display: flex;
|
|
192
|
+
flex-wrap: wrap;
|
|
193
|
+
gap: var(--kds-spacing-container-0-25x);
|
|
194
|
+
align-items: center;
|
|
195
|
+
min-width: 0;
|
|
196
|
+
margin-left: auto;
|
|
197
|
+
}
|
package/dist/ai.js
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
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 { d as KdsIcon, e as _sfc_main$1s, _ as _export_sfc, f as KdsProgressBar, g as KdsLink } from './_plugin-vue_export-helper-BLJdeqtw.js';
|
|
4
|
+
|
|
5
|
+
import './ai.css';const _hoisted_1$1 = ["role"];
|
|
6
|
+
const _hoisted_2$1 = {
|
|
7
|
+
class: "text",
|
|
8
|
+
tabindex: "0"
|
|
9
|
+
};
|
|
10
|
+
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
11
|
+
__name: "InlineStatusBanner",
|
|
12
|
+
props: {
|
|
13
|
+
status: {}
|
|
14
|
+
},
|
|
15
|
+
emits: ["buttonClick"],
|
|
16
|
+
setup(__props, { emit: __emit }) {
|
|
17
|
+
const emit = __emit;
|
|
18
|
+
return (_ctx, _cache) => {
|
|
19
|
+
return openBlock(), createElementBlock("div", {
|
|
20
|
+
class: normalizeClass(["inline-status-banner", __props.status.type]),
|
|
21
|
+
role: __props.status.type === "error" ? "alert" : "status"
|
|
22
|
+
}, [
|
|
23
|
+
createVNode(unref(KdsIcon), {
|
|
24
|
+
name: __props.status.type === "error" ? "circle-error" : "circle-info",
|
|
25
|
+
size: "small",
|
|
26
|
+
class: "icon"
|
|
27
|
+
}, null, 8, ["name"]),
|
|
28
|
+
createElementVNode("span", _hoisted_2$1, toDisplayString(__props.status.message), 1),
|
|
29
|
+
__props.status.buttonLabel ? (openBlock(), createBlock(unref(_sfc_main$1s), {
|
|
30
|
+
key: 0,
|
|
31
|
+
class: "action",
|
|
32
|
+
size: "small",
|
|
33
|
+
variant: "filled",
|
|
34
|
+
label: __props.status.buttonLabel,
|
|
35
|
+
onClick: _cache[0] || (_cache[0] = ($event) => emit("buttonClick"))
|
|
36
|
+
}, null, 8, ["label"])) : createCommentVNode("", true)
|
|
37
|
+
], 10, _hoisted_1$1);
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const InlineStatusBanner = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-506380c6"]]);
|
|
43
|
+
|
|
44
|
+
const _hoisted_1 = { class: "prompt-input" };
|
|
45
|
+
const _hoisted_2 = { class: "text-input-wrapper" };
|
|
46
|
+
const _hoisted_3 = ["placeholder", "disabled", "aria-label"];
|
|
47
|
+
const _hoisted_4 = { class: "action" };
|
|
48
|
+
const _hoisted_5 = {
|
|
49
|
+
key: 1,
|
|
50
|
+
class: "subtext"
|
|
51
|
+
};
|
|
52
|
+
const _hoisted_6 = {
|
|
53
|
+
key: 0,
|
|
54
|
+
class: "subtext-left"
|
|
55
|
+
};
|
|
56
|
+
const _hoisted_7 = {
|
|
57
|
+
key: 1,
|
|
58
|
+
class: "subtext-right"
|
|
59
|
+
};
|
|
60
|
+
const _hoisted_8 = { key: 0 };
|
|
61
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
62
|
+
__name: "KdsPromptInput",
|
|
63
|
+
props: /* @__PURE__ */ mergeModels({
|
|
64
|
+
placeholder: { default: "" },
|
|
65
|
+
disabled: { type: Boolean, default: false },
|
|
66
|
+
loading: { type: Boolean, default: false },
|
|
67
|
+
status: { default: () => void 0 },
|
|
68
|
+
ariaLabel: { default: "Prompt" },
|
|
69
|
+
leftSubtext: { default: () => void 0 },
|
|
70
|
+
rightSubtext: { default: () => void 0 },
|
|
71
|
+
link: { default: () => void 0 }
|
|
72
|
+
}, {
|
|
73
|
+
"modelValue": { default: "" },
|
|
74
|
+
"modelModifiers": {}
|
|
75
|
+
}),
|
|
76
|
+
emits: /* @__PURE__ */ mergeModels(["submit", "stop", "statusButtonClick"], ["update:modelValue"]),
|
|
77
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
78
|
+
const emit = __emit;
|
|
79
|
+
const modelValue = useModel(__props, "modelValue");
|
|
80
|
+
const textareaRef = useTemplateRef("textareaRef");
|
|
81
|
+
const canSubmit = computed(
|
|
82
|
+
() => !__props.disabled && !__props.loading && modelValue.value.trim().length > 0
|
|
83
|
+
);
|
|
84
|
+
function resizeTextarea() {
|
|
85
|
+
const el = textareaRef.value;
|
|
86
|
+
if (!el) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
requestAnimationFrame(() => {
|
|
90
|
+
if (!textareaRef.value) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
el.style.height = "auto";
|
|
94
|
+
const scrollHeight = el.scrollHeight;
|
|
95
|
+
if (scrollHeight <= el.offsetHeight) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
el.style.height = `${scrollHeight}px`;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
useResizeObserver(textareaRef, resizeTextarea);
|
|
102
|
+
watch(modelValue, resizeTextarea, { immediate: true });
|
|
103
|
+
function onSubmit() {
|
|
104
|
+
if (!canSubmit.value) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
emit("submit", modelValue.value.trim());
|
|
108
|
+
}
|
|
109
|
+
function onKeydown(event) {
|
|
110
|
+
if (event.key === "Enter" && !event.shiftKey && !event.isComposing) {
|
|
111
|
+
event.preventDefault();
|
|
112
|
+
onSubmit();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
__expose({
|
|
116
|
+
focus: () => textareaRef.value?.focus()
|
|
117
|
+
});
|
|
118
|
+
return (_ctx, _cache) => {
|
|
119
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
120
|
+
__props.status ? (openBlock(), createBlock(InlineStatusBanner, {
|
|
121
|
+
key: 0,
|
|
122
|
+
status: __props.status,
|
|
123
|
+
onButtonClick: _cache[0] || (_cache[0] = ($event) => emit("statusButtonClick"))
|
|
124
|
+
}, null, 8, ["status"])) : createCommentVNode("", true),
|
|
125
|
+
createElementVNode("div", {
|
|
126
|
+
class: normalizeClass(["input-container", { disabled: __props.disabled }]),
|
|
127
|
+
onClick: _cache[3] || (_cache[3] = ($event) => textareaRef.value?.focus())
|
|
128
|
+
}, [
|
|
129
|
+
__props.loading ? (openBlock(), createBlock(unref(KdsProgressBar), {
|
|
130
|
+
key: 0,
|
|
131
|
+
class: "progress-bar",
|
|
132
|
+
indeterminate: ""
|
|
133
|
+
})) : createCommentVNode("", true),
|
|
134
|
+
createElementVNode("div", _hoisted_2, [
|
|
135
|
+
withDirectives(createElementVNode("textarea", {
|
|
136
|
+
ref_key: "textareaRef",
|
|
137
|
+
ref: textareaRef,
|
|
138
|
+
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => modelValue.value = $event),
|
|
139
|
+
class: "text-input",
|
|
140
|
+
rows: "1",
|
|
141
|
+
placeholder: __props.placeholder,
|
|
142
|
+
disabled: __props.disabled,
|
|
143
|
+
"aria-label": __props.ariaLabel,
|
|
144
|
+
onKeydown
|
|
145
|
+
}, null, 40, _hoisted_3), [
|
|
146
|
+
[vModelText, modelValue.value]
|
|
147
|
+
])
|
|
148
|
+
]),
|
|
149
|
+
createElementVNode("div", _hoisted_4, [
|
|
150
|
+
__props.loading ? (openBlock(), createBlock(unref(_sfc_main$1s), {
|
|
151
|
+
key: 0,
|
|
152
|
+
variant: "outlined",
|
|
153
|
+
"leading-icon": "stop",
|
|
154
|
+
size: "medium",
|
|
155
|
+
ariaLabel: "Stop",
|
|
156
|
+
onClick: _cache[2] || (_cache[2] = withModifiers(($event) => emit("stop"), ["stop"]))
|
|
157
|
+
})) : (openBlock(), createBlock(unref(_sfc_main$1s), {
|
|
158
|
+
key: 1,
|
|
159
|
+
variant: "filled",
|
|
160
|
+
"leading-icon": "send",
|
|
161
|
+
size: "medium",
|
|
162
|
+
ariaLabel: "Send",
|
|
163
|
+
disabled: !canSubmit.value,
|
|
164
|
+
onClick: withModifiers(onSubmit, ["stop"])
|
|
165
|
+
}, null, 8, ["disabled"]))
|
|
166
|
+
])
|
|
167
|
+
], 2),
|
|
168
|
+
__props.leftSubtext || __props.rightSubtext || __props.link ? (openBlock(), createElementBlock("div", _hoisted_5, [
|
|
169
|
+
__props.leftSubtext ? (openBlock(), createElementBlock("div", _hoisted_6, toDisplayString(__props.leftSubtext), 1)) : createCommentVNode("", true),
|
|
170
|
+
__props.rightSubtext || __props.link ? (openBlock(), createElementBlock("div", _hoisted_7, [
|
|
171
|
+
__props.rightSubtext ? (openBlock(), createElementBlock("span", _hoisted_8, toDisplayString(__props.rightSubtext), 1)) : createCommentVNode("", true),
|
|
172
|
+
__props.link ? (openBlock(), createBlock(unref(KdsLink), {
|
|
173
|
+
key: 1,
|
|
174
|
+
label: __props.link.label,
|
|
175
|
+
to: __props.link.to
|
|
176
|
+
}, null, 8, ["label", "to"])) : createCommentVNode("", true)
|
|
177
|
+
])) : createCommentVNode("", true)
|
|
178
|
+
])) : createCommentVNode("", true)
|
|
179
|
+
]);
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
const KdsPromptInput = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-bd237a7d"]]);
|
|
185
|
+
|
|
186
|
+
const kdsPromptInputStatusType = {
|
|
187
|
+
ERROR: "error",
|
|
188
|
+
NOTE: "note"
|
|
189
|
+
};
|
|
190
|
+
const kdsPromptInputStatusTypes = Object.values(
|
|
191
|
+
kdsPromptInputStatusType
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
export { KdsPromptInput, kdsPromptInputStatusType, kdsPromptInputStatusTypes };
|
|
195
|
+
//# sourceMappingURL=ai.js.map
|
package/dist/ai.js.map
ADDED
|
@@ -0,0 +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\" />\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-body-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","KdsButton","_useModel","_openBlock"],"mappings":"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"}
|