@knime/product-features 1.1.1 → 1.1.3

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 (45) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/ai.css +17 -17
  3. package/dist/ai.js +3 -2
  4. package/dist/ai.js.map +1 -1
  5. package/dist/dataTransfer.css +27 -27
  6. package/dist/dataTransfer.js +24 -23
  7. package/dist/dataTransfer.js.map +1 -1
  8. package/dist/rfcErrors.css +3 -3
  9. package/dist/rfcErrors.js +1 -1
  10. package/dist/rfcErrors.js.map +1 -1
  11. package/dist/src/ai/KdsPromptInput/KdsPromptInput.vue.d.ts.map +1 -1
  12. package/dist/src/dataTransfer/download/ui/types.d.ts +5 -0
  13. package/dist/src/dataTransfer/download/ui/types.d.ts.map +1 -1
  14. package/dist/src/dataTransfer/shared/ui/CollapsiblePanel/CollapsiblePanel.vue.d.ts.map +1 -1
  15. package/dist/src/dataTransfer/shared/ui/CollapsiblePanel/types.d.ts +1 -1
  16. package/dist/src/dataTransfer/shared/ui/CollapsiblePanel/types.d.ts.map +1 -1
  17. package/dist/src/dataTransfer/shared/ui/ProgressItem/ProgressItem.vue.d.ts.map +1 -1
  18. package/dist/src/dataTransfer/shared/ui/ProgressItem/types.d.ts +1 -1
  19. package/dist/src/dataTransfer/shared/ui/ProgressItem/types.d.ts.map +1 -1
  20. package/dist/src/dataTransfer/upload/ui/types.d.ts +10 -0
  21. package/dist/src/dataTransfer/upload/ui/types.d.ts.map +1 -1
  22. package/dist/src/nodes/NodeDescriptionTabs/types.d.ts +11 -0
  23. package/dist/src/nodes/NodeDescriptionTabs/types.d.ts.map +1 -1
  24. package/dist/src/rfcErrors/RFCErrorToastTemplate.vue.d.ts +9 -0
  25. package/dist/src/rfcErrors/RFCErrorToastTemplate.vue.d.ts.map +1 -1
  26. package/dist/src/rfcErrors/types.d.ts +5 -0
  27. package/dist/src/rfcErrors/types.d.ts.map +1 -1
  28. package/dist/src/toasts/Toast/types.d.ts +6 -0
  29. package/dist/src/toasts/Toast/types.d.ts.map +1 -1
  30. package/dist/src/toasts/ToastStack/types.d.ts +2 -0
  31. package/dist/src/toasts/ToastStack/types.d.ts.map +1 -1
  32. package/dist/src/versions/CreateVersionForm/types.d.ts +1 -0
  33. package/dist/src/versions/CreateVersionForm/types.d.ts.map +1 -1
  34. package/dist/src/versions/VersionHistory/HistoryEventFooter.vue.d.ts.map +1 -1
  35. package/dist/src/versions/VersionHistory/VersionLabel.vue.d.ts +8 -2
  36. package/dist/src/versions/VersionHistory/VersionLabel.vue.d.ts.map +1 -1
  37. package/dist/src/versions/VersionHistory/types.d.ts +36 -0
  38. package/dist/src/versions/VersionHistory/types.d.ts.map +1 -1
  39. package/dist/toasts.css +13 -13
  40. package/dist/toasts.js +5 -5
  41. package/dist/toasts.js.map +1 -1
  42. package/dist/versions.css +4 -4
  43. package/dist/versions.js +13 -10
  44. package/dist/versions.js.map +1 -1
  45. package/package.json +6 -8
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @knime/product-features
2
2
 
3
+ ## 1.1.3
4
+
5
+ ### Patch Changes
6
+
7
+ - bc85a76: Migrate native `title` attribute usages to the accessible `v-kds-tooltip` directive across product-feature components.
8
+ - Updated dependencies [bc85a76]
9
+ - @knime/kds-components@1.2.0
10
+ - @knime/kds-styles@1.2.0
11
+
12
+ ## 1.1.2
13
+
14
+ ### Patch Changes
15
+
16
+ - d9ec8c2: KDS-920: `KdsPromptInput`: reduced subtext font size and use small `KdsLink`
17
+ - Updated dependencies [faeb10c]
18
+ - @knime/kds-components@1.1.3
19
+ - @knime/kds-styles@1.1.3
20
+
3
21
  ## 1.1.1
4
22
 
5
23
  ### Patch Changes
package/dist/ai.css CHANGED
@@ -70,13 +70,13 @@
70
70
  }
71
71
  }
72
72
 
73
- .prompt-input[data-v-bd237a7d] {
73
+ .prompt-input[data-v-e6b41a78] {
74
74
  display: flex;
75
75
  flex-direction: column;
76
76
  width: 100%;
77
77
  }
78
78
  .input-container {
79
- &[data-v-bd237a7d] {
79
+ &[data-v-e6b41a78] {
80
80
  position: relative;
81
81
  display: flex;
82
82
  gap: var(--kds-spacing-container-0-5x);
@@ -90,19 +90,19 @@
90
90
  border: var(--kds-border-action-input);
91
91
  border-radius: var(--kds-border-radius-container-0-37x);
92
92
  }
93
- &[data-v-bd237a7d]:has(textarea:focus:not(:disabled)) {
93
+ &[data-v-e6b41a78]:has(textarea:focus:not(:disabled)) {
94
94
  outline: var(--kds-border-action-focused);
95
95
  outline-offset: var(--kds-spacing-offset-focus);
96
96
  }
97
- &[data-v-bd237a7d]:has(textarea:hover:not(:disabled, :focus)) {
97
+ &[data-v-e6b41a78]:has(textarea:hover:not(:disabled, :focus)) {
98
98
  background: var(--kds-color-background-input-hover);
99
99
  }
100
- &.disabled[data-v-bd237a7d] {
100
+ &.disabled[data-v-e6b41a78] {
101
101
  cursor: default;
102
102
  border: var(--kds-border-action-disabled);
103
103
  }
104
104
  }
105
- .text-input-wrapper[data-v-bd237a7d] {
105
+ .text-input-wrapper[data-v-e6b41a78] {
106
106
  display: flex;
107
107
  flex: 1 0 0;
108
108
  align-items: center;
@@ -116,7 +116,7 @@
116
116
  padding-left: var(--kds-spacing-container-0-37x);
117
117
  }
118
118
  .text-input {
119
- &[data-v-bd237a7d] {
119
+ &[data-v-e6b41a78] {
120
120
  width: 100%;
121
121
  min-width: 0;
122
122
 
@@ -132,42 +132,42 @@
132
132
  background: transparent;
133
133
  border: none;
134
134
  }
135
- &[data-v-bd237a7d]::placeholder {
135
+ &[data-v-e6b41a78]::placeholder {
136
136
  color: var(--kds-color-text-and-icon-subtle);
137
137
  }
138
138
  &:disabled {
139
- &[data-v-bd237a7d] {
139
+ &[data-v-e6b41a78] {
140
140
  color: var(--kds-color-text-and-icon-disabled);
141
141
  cursor: default;
142
142
  }
143
- &[data-v-bd237a7d]::placeholder {
143
+ &[data-v-e6b41a78]::placeholder {
144
144
  color: var(--kds-color-text-and-icon-disabled);
145
145
  }
146
146
  }
147
- &[data-v-bd237a7d]::-webkit-scrollbar {
147
+ &[data-v-e6b41a78]::-webkit-scrollbar {
148
148
  display: none;
149
149
  }
150
150
  }
151
- .action[data-v-bd237a7d] {
151
+ .action[data-v-e6b41a78] {
152
152
  display: flex;
153
153
  flex-shrink: 0;
154
154
  align-items: flex-end;
155
155
  }
156
- .progress-bar[data-v-bd237a7d] {
156
+ .progress-bar[data-v-e6b41a78] {
157
157
  position: absolute;
158
158
  inset: -1px 0 auto;
159
159
  }
160
- .subtext[data-v-bd237a7d] {
160
+ .subtext[data-v-e6b41a78] {
161
161
  display: flex;
162
162
  flex-wrap: wrap;
163
163
  gap: var(--kds-spacing-container-0-25x) var(--kds-spacing-container-0-5x);
164
164
  align-items: center;
165
165
  padding: var(--kds-spacing-container-0-25x) var(--kds-spacing-container-0-25x)
166
166
  0;
167
- font: var(--kds-font-base-body-small);
167
+ font: var(--kds-font-base-subtext-small);
168
168
  color: var(--kds-color-text-and-icon-neutral);
169
169
  }
170
- .subtext-left[data-v-bd237a7d] {
170
+ .subtext-left[data-v-e6b41a78] {
171
171
  /*
172
172
  * Take all remaining inline space so the right block is pushed to the
173
173
  * end. `min-width: 0` lets the ellipsis kick in when the right block
@@ -179,7 +179,7 @@
179
179
  text-overflow: ellipsis;
180
180
  white-space: nowrap;
181
181
  }
182
- .subtext-right[data-v-bd237a7d] {
182
+ .subtext-right[data-v-e6b41a78] {
183
183
  /*
184
184
  * On row 1 (alongside .subtext-left) the right block stays at its
185
185
  * intrinsic width — line-breaking in flex layout is decided from
package/dist/ai.js CHANGED
@@ -173,7 +173,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
173
173
  __props.link ? (openBlock(), createBlock(unref(KdsLink), {
174
174
  key: 1,
175
175
  label: __props.link.label,
176
- to: __props.link.to
176
+ to: __props.link.to,
177
+ size: "small"
177
178
  }, null, 8, ["label", "to"])) : createCommentVNode("", true)
178
179
  ])) : createCommentVNode("", true)
179
180
  ])) : createCommentVNode("", true)
@@ -182,7 +183,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
182
183
  }
183
184
  });
184
185
 
185
- const KdsPromptInput = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-bd237a7d"]]);
186
+ const KdsPromptInput = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-e6b41a78"]]);
186
187
 
187
188
  const kdsPromptInputStatusType = {
188
189
  ERROR: "error",
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\" />\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","_useModel","_openBlock"],"mappings":"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"}
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,12 +1,12 @@
1
1
 
2
2
  .collapsible-panel {
3
- &[data-v-3fdfcc1c] {
3
+ &[data-v-59d71b0b] {
4
4
  background: var(--kds-color-surface-default);
5
5
  border-radius: var(--kds-spacing-container-0-25x);
6
6
  box-shadow: var(--kds-elevation-level-3);
7
7
  }
8
8
  & .title-bar {
9
- &[data-v-3fdfcc1c] {
9
+ &[data-v-59d71b0b] {
10
10
  display: flex;
11
11
  align-items: center;
12
12
  height: var(--kds-dimension-component-height-2-5x);
@@ -15,7 +15,7 @@
15
15
  font: var(--kds-font-base-title-small-strong);
16
16
  color: var(--kds-color-text-and-icon-neutral);
17
17
  }
18
- & .actions[data-v-3fdfcc1c] {
18
+ & .actions[data-v-59d71b0b] {
19
19
  display: flex;
20
20
  gap: var(--kds-spacing-container-0-25x);
21
21
  align-items: center;
@@ -23,37 +23,37 @@
23
23
  }
24
24
  }
25
25
  &:not(.collapsed) {
26
- & .title-bar[data-v-3fdfcc1c] {
26
+ & .title-bar[data-v-59d71b0b] {
27
27
  border-bottom: var(--kds-border-base-subtle);
28
28
  }
29
29
  }
30
30
  }
31
- .panel-content[data-v-3fdfcc1c] {
31
+ .panel-content[data-v-59d71b0b] {
32
32
  overflow: hidden;
33
33
  }
34
- .expand-enter-active[data-v-3fdfcc1c],
35
- .expand-leave-active[data-v-3fdfcc1c] {
34
+ .expand-enter-active[data-v-59d71b0b],
35
+ .expand-leave-active[data-v-59d71b0b] {
36
36
  display: grid;
37
37
  overflow: hidden;
38
38
  transition:
39
39
  grid-template-rows 0.2s ease-in-out,
40
40
  opacity 0.2s ease-in-out;
41
41
  }
42
- .expand-enter-from[data-v-3fdfcc1c],
43
- .expand-leave-to[data-v-3fdfcc1c] {
42
+ .expand-enter-from[data-v-59d71b0b],
43
+ .expand-leave-to[data-v-59d71b0b] {
44
44
  grid-template-rows: 0fr;
45
45
  opacity: 0;
46
46
  }
47
- .expand-enter-to[data-v-3fdfcc1c],
48
- .expand-leave-from[data-v-3fdfcc1c] {
47
+ .expand-enter-to[data-v-59d71b0b],
48
+ .expand-leave-from[data-v-59d71b0b] {
49
49
  grid-template-rows: 1fr;
50
50
  opacity: 1;
51
51
  }
52
- .panel-content[data-v-3fdfcc1c] > * {
52
+ .panel-content[data-v-59d71b0b] > * {
53
53
  min-height: 0;
54
54
  }
55
55
 
56
- .progress-wrapper[data-v-80e5d197] {
56
+ .progress-wrapper[data-v-902ce8bb] {
57
57
  --base-padding: var(--kds-spacing-container-1x);
58
58
  --progress-bar-height: var(--kds-dimension-component-height-0-25x);
59
59
  --progress-bar-distance: var(--kds-spacing-container-0-25x);
@@ -65,7 +65,7 @@
65
65
  padding: var(--base-padding);
66
66
  }
67
67
  .progress-item {
68
- &[data-v-80e5d197] {
68
+ &[data-v-902ce8bb] {
69
69
  display: flex;
70
70
  align-items: center;
71
71
  width: 100%;
@@ -73,24 +73,24 @@
73
73
 
74
74
  /* add extra margin to prevent content jump when a progress bars appears/disappears */
75
75
  }
76
- &.padded[data-v-80e5d197] {
76
+ &.padded[data-v-902ce8bb] {
77
77
  margin-bottom: calc(
78
78
  var(--progress-bar-height) + var(--progress-bar-distance)
79
79
  );
80
80
  }
81
81
  }
82
- .progress[data-v-80e5d197] {
82
+ .progress[data-v-902ce8bb] {
83
83
  min-height: var(--progress-bar-height);
84
84
  }
85
85
  .item-info {
86
- &[data-v-80e5d197] {
86
+ &[data-v-902ce8bb] {
87
87
  display: flex;
88
88
  flex-grow: 1;
89
89
  gap: var(--kds-spacing-container-0-25x);
90
90
  overflow: hidden;
91
91
  }
92
92
  & .item-name {
93
- &[data-v-80e5d197] {
93
+ &[data-v-902ce8bb] {
94
94
  display: flex;
95
95
  flex-grow: 1;
96
96
  flex-direction: column;
@@ -99,19 +99,19 @@
99
99
  overflow: hidden;
100
100
  color: var(--kds-color-text-and-icon-neutral);
101
101
  }
102
- & .title[data-v-80e5d197] {
102
+ & .title[data-v-902ce8bb] {
103
103
  max-width: 100%;
104
104
  overflow: hidden;
105
105
  text-overflow: ellipsis;
106
106
  font: var(--kds-font-base-interactive-small);
107
107
  white-space: nowrap;
108
108
  }
109
- & .subtitle[data-v-80e5d197] {
109
+ & .subtitle[data-v-902ce8bb] {
110
110
  font: var(--kds-font-base-subtext-small);
111
111
  }
112
112
  }
113
113
  }
114
- .item-action[data-v-80e5d197] {
114
+ .item-action[data-v-902ce8bb] {
115
115
  display: flex;
116
116
  flex-shrink: 0;
117
117
  gap: var(--kds-spacing-container-0-25x);
@@ -128,15 +128,15 @@
128
128
  }
129
129
  }
130
130
 
131
- .upload-panel[data-v-3c6568f7] {
131
+ .upload-panel[data-v-15b3eb7d] {
132
132
  width: var(--kds-dimension-component-width-20x);
133
133
  max-width: var(--kds-dimension-component-width-20x);
134
134
  }
135
- .upload-panel-content[data-v-3c6568f7] {
135
+ .upload-panel-content[data-v-15b3eb7d] {
136
136
  max-height: var(--kds-dimension-component-height-20x);
137
137
  }
138
138
  .skeleton-container {
139
- &[data-v-3c6568f7] {
139
+ &[data-v-15b3eb7d] {
140
140
  display: grid;
141
141
  grid-template-columns: min-content 1fr;
142
142
  gap: var(--kds-spacing-container-0-25x);
@@ -145,17 +145,17 @@
145
145
  padding: 0 var(--kds-spacing-container-1x);
146
146
  border-top: var(--kds-border-base-subtle);
147
147
  }
148
- & .skeleton-text-content[data-v-3c6568f7] {
148
+ & .skeleton-text-content[data-v-15b3eb7d] {
149
149
  display: flex;
150
150
  flex-direction: column;
151
151
  gap: var(--kds-spacing-container-0-25x);
152
152
  }
153
153
  }
154
154
 
155
- .download-panel[data-v-cbf5d3c0] {
155
+ .download-panel[data-v-53e10d80] {
156
156
  width: var(--kds-dimension-component-width-20x);
157
157
  max-width: var(--kds-dimension-component-width-20x);
158
158
  }
159
- .download-panel-content[data-v-cbf5d3c0] {
159
+ .download-panel-content[data-v-53e10d80] {
160
160
  max-height: var(--kds-dimension-component-height-20x);
161
161
  }
@@ -1,5 +1,5 @@
1
1
  import { computed, defineComponent, useModel, useId, openBlock, createElementBlock, normalizeClass, createElementVNode, createTextVNode, toDisplayString, createVNode, unref, normalizeStyle, createBlock, createCommentVNode, Transition, withCtx, withDirectives, renderSlot, vShow, mergeModels, Fragment, renderList, watch, ref, reactive, readonly } from 'vue';
2
- import { KdsButton, KdsIcon, KdsBadge, KdsProgressBar, KdsLoadingSkeleton } from '@knime/kds-components';
2
+ import { KdsButton, KdsIcon, vKdsTooltip, KdsBadge, KdsProgressBar, KdsLoadingSkeleton } from '@knime/kds-components';
3
3
  import { _ as _export_sfc } from './_plugin-vue_export-helper-pcqpp-6-.js';
4
4
  import { f as formatFileSize } from './format-ra_vlnN7.js';
5
5
  import { rfcErrors } from './rfcErrors.js';
@@ -26,7 +26,7 @@ const _hoisted_3$1 = ["id"];
26
26
  const _sfc_main$6 = /* @__PURE__ */ defineComponent({
27
27
  __name: "CollapsiblePanel",
28
28
  props: /* @__PURE__ */ mergeModels({
29
- title: {},
29
+ headline: {},
30
30
  canBeDismissed: { type: Boolean, default: false }
31
31
  }, {
32
32
  "modelValue": { type: Boolean, ...{ default: true } },
@@ -46,7 +46,7 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
46
46
  class: normalizeClass(["collapsible-panel", { collapsed: !modelValue.value }])
47
47
  }, [
48
48
  createElementVNode("div", _hoisted_1$4, [
49
- createTextVNode(toDisplayString(__props.title) + " ", 1),
49
+ createTextVNode(toDisplayString(__props.headline) + " ", 1),
50
50
  createElementVNode("div", _hoisted_2$2, [
51
51
  createVNode(unref(KdsButton), {
52
52
  size: "small",
@@ -86,12 +86,12 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
86
86
  }
87
87
  });
88
88
 
89
- const CollapsiblePanel = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-3fdfcc1c"]]);
89
+ const CollapsiblePanel = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-59d71b0b"]]);
90
90
 
91
91
  const _hoisted_1$3 = { class: "progress-wrapper" };
92
92
  const _hoisted_2$1 = { class: "item-info" };
93
93
  const _hoisted_3 = { class: "item-name" };
94
- const _hoisted_4 = ["title"];
94
+ const _hoisted_4 = { class: "title" };
95
95
  const _hoisted_5 = {
96
96
  key: 0,
97
97
  class: "subtitle"
@@ -105,7 +105,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
105
105
  __name: "ProgressItem",
106
106
  props: {
107
107
  id: {},
108
- title: {},
108
+ headline: {},
109
109
  icon: {},
110
110
  actions: {},
111
111
  subtitle: {},
@@ -121,10 +121,11 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
121
121
  createElementVNode("div", _hoisted_2$1, [
122
122
  createVNode(unref(KdsIcon), { name: __props.icon }, null, 8, ["name"]),
123
123
  createElementVNode("div", _hoisted_3, [
124
- createElementVNode("div", {
125
- class: "title",
126
- title: __props.title
127
- }, toDisplayString(__props.title), 9, _hoisted_4),
124
+ withDirectives((openBlock(), createElementBlock("div", _hoisted_4, [
125
+ createTextVNode(toDisplayString(__props.headline), 1)
126
+ ])), [
127
+ [unref(vKdsTooltip), __props.headline, "truncated"]
128
+ ]),
128
129
  __props.subtitle ? (openBlock(), createElementBlock("span", _hoisted_5, toDisplayString(__props.subtitle), 1)) : createCommentVNode("", true)
129
130
  ])
130
131
  ]),
@@ -158,7 +159,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
158
159
  }
159
160
  });
160
161
 
161
- const ProgressItem = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-80e5d197"]]);
162
+ const ProgressItem = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-902ce8bb"]]);
162
163
 
163
164
  const _sfc_main$4 = { };
164
165
 
@@ -342,13 +343,13 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
342
343
  return (_ctx, _cache) => {
343
344
  return openBlock(), createBlock(unref(ProgressItem), {
344
345
  id: __props.item.id,
345
- title: __props.item.name,
346
+ headline: __props.item.name,
346
347
  subtitle: subtitle.value,
347
348
  icon: itemIcon.value,
348
349
  progress: hasProgress(__props.item) ? __props.item.progress : void 0,
349
350
  badge: badge.value,
350
351
  actions: actions.value
351
- }, null, 8, ["id", "title", "subtitle", "icon", "progress", "badge", "actions"]);
352
+ }, null, 8, ["id", "headline", "subtitle", "icon", "progress", "badge", "actions"]);
352
353
  };
353
354
  }
354
355
  });
@@ -374,7 +375,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
374
375
  const uploadedItems = computed(
375
376
  () => __props.items.filter(({ status }) => status === "complete").length
376
377
  );
377
- const title = computed(() => {
378
+ const headline = computed(() => {
378
379
  const suffix = `file${totalItems.value > 1 ? "s" : ""}`;
379
380
  return `Uploaded ${uploadedItems.value} of ${totalItems.value} ${suffix}`;
380
381
  });
@@ -387,7 +388,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
387
388
  return openBlock(), createBlock(unref(CollapsiblePanel), {
388
389
  modelValue: expanded.value,
389
390
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => expanded.value = $event),
390
- title: title.value,
391
+ headline: headline.value,
391
392
  class: "upload-panel",
392
393
  "can-be-dismissed": !hasSomeItemInProgress.value,
393
394
  onClose: _cache[1] || (_cache[1] = ($event) => emit("close"))
@@ -422,12 +423,12 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
422
423
  ])
423
424
  ]),
424
425
  _: 1
425
- }, 8, ["modelValue", "title", "can-be-dismissed"]);
426
+ }, 8, ["modelValue", "headline", "can-be-dismissed"]);
426
427
  };
427
428
  }
428
429
  });
429
430
 
430
- const UploadProgressPanel = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-3c6568f7"]]);
431
+ const UploadProgressPanel = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-15b3eb7d"]]);
431
432
 
432
433
  const _sfc_main$1 = /* @__PURE__ */ defineComponent({
433
434
  __name: "DownloadProgressPanelItem",
@@ -478,10 +479,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
478
479
  return openBlock(), createBlock(unref(ProgressItem), {
479
480
  id: __props.item.downloadId,
480
481
  icon: "file",
481
- title: __props.item.name,
482
+ headline: __props.item.name,
482
483
  badge: badge.value,
483
484
  actions: actions.value
484
- }, null, 8, ["id", "title", "badge", "actions"]);
485
+ }, null, 8, ["id", "headline", "badge", "actions"]);
485
486
  };
486
487
  }
487
488
  });
@@ -504,7 +505,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
504
505
  const totalDownloadedItems = computed(
505
506
  () => props.items.filter(({ status }) => status === "READY").length
506
507
  );
507
- const title = computed(() => {
508
+ const headline = computed(() => {
508
509
  const suffix = `file${totalItems.value > 1 ? "s" : ""}`;
509
510
  return `Downloaded ${totalDownloadedItems.value} of ${totalItems.value} ${suffix}`;
510
511
  });
@@ -523,7 +524,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
523
524
  return openBlock(), createBlock(unref(CollapsiblePanel), {
524
525
  modelValue: expanded.value,
525
526
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => expanded.value = $event),
526
- title: title.value,
527
+ headline: headline.value,
527
528
  class: "download-panel",
528
529
  "can-be-dismissed": !hasItemsInProgress.value,
529
530
  onClose: _cache[1] || (_cache[1] = ($event) => emit("close"))
@@ -546,12 +547,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
546
547
  ])
547
548
  ]),
548
549
  _: 1
549
- }, 8, ["modelValue", "title", "can-be-dismissed"]);
550
+ }, 8, ["modelValue", "headline", "can-be-dismissed"]);
550
551
  };
551
552
  }
552
553
  });
553
554
 
554
- const DownloadProgressPanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-cbf5d3c0"]]);
555
+ const DownloadProgressPanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-53e10d80"]]);
555
556
 
556
557
  //#region src/predicate/isPlainObject.ts
557
558
  /**