@knime/product-features 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/dataTransfer.css +27 -27
  3. package/dist/dataTransfer.js +32 -139
  4. package/dist/dataTransfer.js.map +1 -1
  5. package/dist/index-B3ql6hun.js +2695 -0
  6. package/dist/index-B3ql6hun.js.map +1 -0
  7. package/dist/nodes.css +119 -0
  8. package/dist/nodes.js +270 -101
  9. package/dist/nodes.js.map +1 -1
  10. package/dist/rfcErrors.css +3 -3
  11. package/dist/rfcErrors.js +2 -2
  12. package/dist/rfcErrors.js.map +1 -1
  13. package/dist/src/dataTransfer/download/ui/types.d.ts +5 -0
  14. package/dist/src/dataTransfer/download/ui/types.d.ts.map +1 -1
  15. package/dist/src/dataTransfer/shared/ui/CollapsiblePanel/CollapsiblePanel.vue.d.ts.map +1 -1
  16. package/dist/src/dataTransfer/shared/ui/CollapsiblePanel/index.d.ts +1 -1
  17. package/dist/src/dataTransfer/shared/ui/CollapsiblePanel/index.d.ts.map +1 -1
  18. package/dist/src/dataTransfer/shared/ui/CollapsiblePanel/types.d.ts +1 -1
  19. package/dist/src/dataTransfer/shared/ui/CollapsiblePanel/types.d.ts.map +1 -1
  20. package/dist/src/dataTransfer/shared/ui/ProgressItem/ProgressItem.vue.d.ts.map +1 -1
  21. package/dist/src/dataTransfer/shared/ui/ProgressItem/index.d.ts +1 -1
  22. package/dist/src/dataTransfer/shared/ui/ProgressItem/index.d.ts.map +1 -1
  23. package/dist/src/dataTransfer/shared/ui/ProgressItem/types.d.ts +1 -1
  24. package/dist/src/dataTransfer/shared/ui/ProgressItem/types.d.ts.map +1 -1
  25. package/dist/src/dataTransfer/upload/ui/types.d.ts +10 -0
  26. package/dist/src/dataTransfer/upload/ui/types.d.ts.map +1 -1
  27. package/dist/src/nodes/NodeDescriptionTabs/types.d.ts +11 -0
  28. package/dist/src/nodes/NodeDescriptionTabs/types.d.ts.map +1 -1
  29. package/dist/src/nodes/NodePreview/NodePreview.vue.d.ts +4 -0
  30. package/dist/src/nodes/NodePreview/NodePreview.vue.d.ts.map +1 -0
  31. package/dist/src/nodes/NodePreview/SVGNodeTorso.vue.d.ts +4 -0
  32. package/dist/src/nodes/NodePreview/SVGNodeTorso.vue.d.ts.map +1 -0
  33. package/dist/src/nodes/NodePreview/constants.d.ts +2 -0
  34. package/dist/src/nodes/NodePreview/constants.d.ts.map +1 -0
  35. package/dist/src/nodes/NodePreview/enums.d.ts +27 -0
  36. package/dist/src/nodes/NodePreview/enums.d.ts.map +1 -0
  37. package/dist/src/nodes/NodePreview/index.d.ts +3 -0
  38. package/dist/src/nodes/NodePreview/index.d.ts.map +1 -0
  39. package/dist/src/nodes/NodePreview/types.d.ts +68 -0
  40. package/dist/src/nodes/NodePreview/types.d.ts.map +1 -0
  41. package/dist/src/nodes/PortIcon/PortIcon.vue.d.ts.map +1 -1
  42. package/dist/src/nodes/PortIcon/SVGPortIcon.vue.d.ts +4 -0
  43. package/dist/src/nodes/PortIcon/SVGPortIcon.vue.d.ts.map +1 -0
  44. package/dist/src/nodes/PortIcon/constants.d.ts +3 -0
  45. package/dist/src/nodes/PortIcon/constants.d.ts.map +1 -0
  46. package/dist/src/nodes/index.d.ts +2 -0
  47. package/dist/src/nodes/index.d.ts.map +1 -1
  48. package/dist/src/rfcErrors/RFCErrorToastTemplate.vue.d.ts +9 -0
  49. package/dist/src/rfcErrors/RFCErrorToastTemplate.vue.d.ts.map +1 -1
  50. package/dist/src/rfcErrors/types.d.ts +5 -0
  51. package/dist/src/rfcErrors/types.d.ts.map +1 -1
  52. package/dist/src/toasts/Toast/types.d.ts +6 -0
  53. package/dist/src/toasts/Toast/types.d.ts.map +1 -1
  54. package/dist/src/toasts/ToastStack/types.d.ts +2 -0
  55. package/dist/src/toasts/ToastStack/types.d.ts.map +1 -1
  56. package/dist/src/versions/CreateVersionForm/types.d.ts +1 -0
  57. package/dist/src/versions/CreateVersionForm/types.d.ts.map +1 -1
  58. package/dist/src/versions/VersionHistory/HistoryEventFooter.vue.d.ts.map +1 -1
  59. package/dist/src/versions/VersionHistory/VersionLabel.vue.d.ts +10 -6
  60. package/dist/src/versions/VersionHistory/VersionLabel.vue.d.ts.map +1 -1
  61. package/dist/src/versions/VersionHistory/types.d.ts +36 -0
  62. package/dist/src/versions/VersionHistory/types.d.ts.map +1 -1
  63. package/dist/toasts.css +13 -13
  64. package/dist/toasts.js +7 -14
  65. package/dist/toasts.js.map +1 -1
  66. package/dist/versions.css +4 -4
  67. package/dist/versions.js +14 -11
  68. package/dist/versions.js.map +1 -1
  69. package/package.json +11 -13
  70. package/dist/format-ra_vlnN7.js +0 -238
  71. package/dist/format-ra_vlnN7.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"toasts.js","sources":["../../../node_modules/.pnpm/@knime+utils@1.11.1_consola@3.4.2/node_modules/@knime/utils/src/capitalize.ts","../../../node_modules/.pnpm/@knime+utils@1.11.1_consola@3.4.2/node_modules/@knime/utils/src/truncateString.ts","../src/toasts/Toast/enums.ts","../src/toasts/ToastStack/injectionKeys.ts","../src/toasts/Toast/ToastButton.vue","../src/toasts/Toast/Toast.vue","../src/toasts/toastService/toastService.ts","../src/toasts/ToastStack/ToastStack.vue"],"sourcesContent":["/**\n * Uppercases first letter of string\n * @param string to be capitalized first string, e.g. \"workflow\"\n * @return Capitalized String, e.g. \"Workflow\"\n */\nexport const capitalize = (input: string) =>\n input.charAt(0).toUpperCase() + input.substring(1);\n\nconst formats = {\n customFormat: (input: string, delimiter: string) =>\n capitalize(input.replace(delimiter, \" \").toLowerCase()),\n\n kebabFormat: (input: string) => formats.customFormat(input, \"-\"),\n snakeFormat: (input: string) => formats.customFormat(input, \"_\"),\n\n camelPascalCase: (input: string) =>\n capitalize(\n (input.match(/([A-Z]?[^A-Z]*)/g) ?? [])\n .slice(0, -1)\n .join(\" \")\n .toLowerCase(),\n ),\n} as const;\n\ntype CaseFormatterOptions = {\n string: string;\n delimiter?: string;\n format?: keyof typeof formats;\n};\n\nexport const caseFormatter = ({\n string,\n delimiter,\n format,\n}: CaseFormatterOptions) => {\n if (delimiter) {\n return formats.customFormat(string, delimiter);\n }\n\n if (format) {\n return formats[format](string, delimiter ?? \"\");\n }\n\n return capitalize(string);\n};\n","const defaultMaxLength = 160;\n\n// truncates a string to a given max length\nexport default (string = \"\", maxLength = defaultMaxLength) => {\n const dots = string.length > maxLength ? \"…\" : \"\";\n return `${string.substring(0, maxLength - 1)}${dots}`;\n};\n","export const toastType = {\n INFO: \"info\",\n SUCCESS: \"success\",\n WARNING: \"warning\",\n ERROR: \"error\",\n} as const;\n\nexport const toastTypes = Object.values(toastType);\n","import type { ComputedRef, InjectionKey } from \"vue\";\n\nexport const TOAST_STACK_ID: InjectionKey<ComputedRef<string>> =\n Symbol(\"toast-stack-id\");\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport {\n KdsButton,\n type KdsIconName,\n KdsLinkButton,\n} from \"@knime/kds-components\";\n\nimport type { ToastButton } from \"./types\";\n\ntype LabelAndIcon =\n | { label: string; leadingIcon?: KdsIconName; ariaLabel?: never }\n | { label?: never; leadingIcon: KdsIconName; ariaLabel: string };\n\nconst props = defineProps<ToastButton>();\n\nconst mergedTo = computed(() => {\n if (props.to) {\n return props.to;\n }\n return props.href;\n});\n\nconst target = computed(() => {\n if (props.href) {\n return \"_blank\";\n }\n return null;\n});\n\nconst callback = computed(() => {\n if (typeof props.callback === \"function\") {\n return props.callback;\n }\n return undefined;\n});\n\nconst labelAndIcon = computed<LabelAndIcon>(() =>\n props.text === undefined\n ? { leadingIcon: props.icon!, ariaLabel: props.ariaLabel }\n : { label: props.text, leadingIcon: props.icon },\n);\n</script>\n\n<template>\n <KdsLinkButton\n v-if=\"mergedTo\"\n variant=\"transparent\"\n size=\"xsmall\"\n :to=\"mergedTo\"\n :target=\"target\"\n :rel=\"target ? 'noopener noreferrer' : null\"\n v-bind=\"labelAndIcon\"\n @click=\"callback\"\n />\n\n <KdsButton\n v-else\n variant=\"transparent\"\n size=\"xsmall\"\n v-bind=\"labelAndIcon\"\n @click=\"callback\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, onMounted, ref, watch } from \"vue\";\nimport type { Ref } from \"vue\";\nimport {\n useEventBus,\n useMouseInElement,\n useRafFn,\n useWindowFocus,\n} from \"@vueuse/core\";\n\nimport {\n KdsButton,\n KdsIcon,\n type KdsIconName,\n KdsProgressBar,\n} from \"@knime/kds-components\";\nimport { capitalize, truncateString } from \"@knime/utils\";\n\nimport { TOAST_STACK_ID } from \"../ToastStack/injectionKeys\";\n\nimport ToastButton from \"./ToastButton.vue\";\nimport { toastType } from \"./enums\";\nimport type { KdsToastType, Toast } from \"./types\";\n\nconst MAX_MESSAGE_LENGTH = 160;\n\nconst {\n type = toastType.INFO,\n headline = \"\",\n message = \"\",\n component = null,\n autoRemove = true,\n active = true,\n buttons = [],\n dismissible = true,\n} = defineProps<Toast>();\n\nconst availableHeadline = computed(() => {\n return headline ? headline : capitalize(type);\n});\n\n// Supported toast types and corresponding icons\nconst iconMap: Record<string, KdsIconName> = {\n [toastType.INFO]: \"circle-info\",\n [toastType.ERROR]: \"circle-error\",\n [toastType.SUCCESS]: \"circle-success\",\n [toastType.WARNING]: \"warning\",\n};\nconst typeIndicatorIcon = computed(() => iconMap[type]);\n\n// Colors\nconst colorMap: Record<\n KdsToastType,\n Record<\"textAndIcon\" | \"background\" | \"border\", string>\n> = {\n [toastType.INFO]: {\n textAndIcon: \"var(--kds-color-text-and-icon-info)\",\n background: \"var(--kds-color-background-static-info-muted)\",\n border: \"var(--kds-border-base-info)\",\n },\n [toastType.ERROR]: {\n textAndIcon: \"var(--kds-color-text-and-icon-danger)\",\n background: \"var(--kds-color-background-static-danger-muted)\",\n border: \"var(--kds-border-base-danger)\",\n },\n [toastType.SUCCESS]: {\n textAndIcon: \"var(--kds-color-text-and-icon-success)\",\n background: \"var(--kds-color-background-static-success-muted)\",\n border: \"var(--kds-border-base-success)\",\n },\n [toastType.WARNING]: {\n textAndIcon: \"var(--kds-color-text-and-icon-warning)\",\n background: \"var(--kds-color-background-static-warning-muted)\",\n border: \"var(--kds-border-base-warning)\",\n },\n};\nconst mainColor = computed(() => colorMap[type].textAndIcon);\nconst backgroundColor = computed(() => colorMap[type].background);\nconst borderColor = computed(() => colorMap[type].border);\n\n// Emitted events\nconst emit = defineEmits<{\n remove: [];\n autoRemove: [];\n}>();\n\n// Toast ref\nconst toastRef: Ref<null | HTMLElement> = ref(null);\n\n// Window focus and mouse tracking\nconst focused = useWindowFocus();\nconst { isOutside } = useMouseInElement(toastRef);\nconst shouldPause = computed(() => !focused.value || !isOutside.value);\n\n// Auto-remove progress bar animation\nconst AUTO_REMOVE_DURATION = 7000;\nconst elapsed = ref(0);\nconst percentage = computed(() =>\n Math.max(0, 100 - (elapsed.value / AUTO_REMOVE_DURATION) * 100),\n);\nconst { pause, resume } = useRafFn(\n ({ delta }) => {\n elapsed.value += delta;\n if (elapsed.value >= AUTO_REMOVE_DURATION) {\n pause();\n emit(\"autoRemove\");\n }\n },\n { immediate: false },\n);\nconst play = resume;\nconst reset = () => {\n pause();\n elapsed.value = 0;\n};\n\n// Truncation of long messages\nconst truncatedMessage = computed(() =>\n truncateString(message, MAX_MESSAGE_LENGTH),\n);\nconst isTruncatable = truncatedMessage.value !== message;\nconst isTruncated = ref(isTruncatable);\nconst showMore = () => {\n // TODO HUB-5698: animate toast and stack height when expanding truncated text\n isTruncated.value = false;\n if (toastRef.value !== null) {\n // reset height if it has been set in animateHeightTo\n toastRef.value.style.height = \"unset\";\n }\n};\n\n// Height transformations\nconst nativeHeight: Ref<null | number> = ref(null);\nconst currentHeight: Ref<null | number> = ref(null);\n// Enables communication between toasts within the same ToastStack so they share\n// a height. Only active when this Toast is rendered inside a ToastStack — a\n// standalone Toast skips the bus entirely to avoid cross-instance chatter.\nconst stackId = inject(TOAST_STACK_ID, null);\nconst eventBus = stackId\n ? useEventBus(`new-stack-height-${stackId.value}`)\n : null;\nconst animateHeightTo = (targetHeight: number) => {\n if (toastRef.value !== null) {\n toastRef.value.style.height = `${targetHeight}px`;\n }\n currentHeight.value = targetHeight;\n};\n// Listen to height changes of other toasts and animate height accordingly\neventBus?.on((newStackHeight: unknown) => {\n if (\n typeof newStackHeight === \"number\" &&\n currentHeight.value !== newStackHeight\n ) {\n animateHeightTo(newStackHeight);\n }\n});\n\nonMounted(() => {\n if (toastRef.value !== null) {\n nativeHeight.value = toastRef.value.clientHeight;\n currentHeight.value = toastRef.value.clientHeight;\n }\n eventBus?.emit(currentHeight.value);\n\n if (autoRemove && active) {\n play();\n }\n});\n\nwatch(shouldPause, (shouldPause) => {\n if (!autoRemove || !active) {\n return;\n }\n\n if (shouldPause) {\n pause();\n } else {\n play();\n }\n});\n\nwatch(\n () => active,\n (newValue) => {\n if (newValue) {\n if (nativeHeight.value !== null) {\n animateHeightTo(nativeHeight.value);\n eventBus?.emit(currentHeight.value);\n }\n\n if (autoRemove && !shouldPause.value) {\n play();\n }\n return;\n }\n\n if (isTruncatable) {\n isTruncated.value = true;\n }\n\n if (autoRemove) {\n reset();\n }\n },\n);\n</script>\n\n<template>\n <div ref=\"toastRef\" :class=\"['toast', type, { 'auto-remove': autoRemove }]\">\n <div v-show=\"active\" class=\"container\">\n <div class=\"type-indicator\">\n <KdsIcon :name=\"typeIndicatorIcon\" />\n </div>\n\n <div class=\"content\">\n <div class=\"headline-wrapper\">\n <div class=\"headline\">{{ availableHeadline }}</div>\n\n <KdsButton\n v-if=\"dismissible\"\n data-test-id=\"dismiss\"\n variant=\"transparent\"\n size=\"xsmall\"\n title=\"Dismiss message\"\n ariaLabel=\"Dismiss message\"\n leading-icon=\"x-close\"\n @click=\"emit('remove')\"\n />\n </div>\n\n <div v-if=\"message\" class=\"message\">\n <template v-if=\"isTruncated\">\n {{ truncatedMessage }}\n </template>\n <template v-else>{{ message }}</template>\n </div>\n\n <div v-else-if=\"component\" class=\"message\">\n <component :is=\"component\" @show-more=\"showMore\" />\n </div>\n\n <div v-if=\"isTruncated || buttons.length\" class=\"buttons\">\n <KdsButton\n v-if=\"isTruncated\"\n data-test-id=\"show-more\"\n variant=\"transparent\"\n size=\"xsmall\"\n label=\"Show more\"\n @click=\"showMore\"\n />\n\n <ToastButton\n v-for=\"(button, index) in buttons\"\n v-bind=\"button\"\n :key=\"index\"\n />\n </div>\n </div>\n\n <KdsProgressBar class=\"progress-bar\" :percentage=\"percentage\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.toast {\n --main-color: v-bind(mainColor);\n --background-color: v-bind(backgroundColor);\n --border-color: v-bind(borderColor);\n\n position: relative;\n width: var(--kds-dimension-component-width-25x);\n padding: var(--kds-spacing-container-0-75x) var(--kds-spacing-container-0-75x)\n var(--kds-spacing-container-1x);\n overflow: hidden;\n background-color: var(--background-color);\n border: var(--border-color);\n border-radius: var(--kds-border-radius-container-0-37x);\n box-shadow: var(--kds-elevation-level-3);\n transition: all 0.3s;\n\n & .container {\n display: flex;\n flex-direction: row;\n gap: var(--kds-spacing-container-0-5x);\n }\n\n & .type-indicator {\n display: flex;\n flex-shrink: 0;\n flex-direction: column;\n margin-top: var(--kds-spacing-container-0-12x);\n color: var(--main-color);\n }\n\n & .content {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-5x);\n max-width: 100%;\n\n & .headline-wrapper {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: var(--kds-dimension-component-height-1-25x);\n }\n\n & .headline {\n font: var(--kds-font-base-title-small-strong);\n color: var(--kds-color-text-and-icon-neutral);\n }\n\n & .message {\n max-height: var(--kds-dimension-component-height-45x);\n font: var(--kds-font-base-body-small);\n color: var(--kds-color-text-and-icon-neutral);\n overflow-wrap: anywhere;\n white-space: break-spaces;\n }\n\n & .buttons {\n display: flex;\n flex-direction: row;\n gap: var(--kds-spacing-container-0-5x);\n }\n }\n\n & .progress-bar {\n --progress-bar-transition-duration: 0s;\n --progress-bar-foreground-color: var(--main-color);\n\n position: absolute;\n right: calc(var(--kds-spacing-container-0-12x) * -1);\n bottom: 0;\n left: calc(var(--kds-spacing-container-0-12x) * -1);\n display: none;\n width: auto;\n }\n\n &.auto-remove .progress-bar {\n display: initial;\n }\n}\n</style>\n","import type { App, Plugin, Ref } from \"vue\";\nimport { computed, getCurrentInstance, inject, provide, ref } from \"vue\";\nimport { cloneDeep } from \"es-toolkit\";\nimport { uniqueId } from \"es-toolkit/compat\";\n\nimport type { Toast, ToastWithId } from \"../Toast/types\";\n\nimport type {\n ToastService,\n ToastServiceComposableOptions,\n UseToastsOptions,\n} from \"./types\";\n\nexport const defaultToastServiceSymbol = Symbol(\"toast\");\nexport const defaultGlobalPropertyName = \"$toast\";\n\nexport class ToastServiceError extends Error {\n constructor(message?: string) {\n super(message);\n this.name = \"ToastServiceError\";\n }\n}\n\n/**\n * Each instance of the class is bound to a reactive array of toasts, with which you\n * can interface via the properties of the `ToastService` object.\n *\n * You have the following options to access the toast service:\n * - `provide` the service object to downstream components by using the `useToastService`\n * method in the `setup` of the app's root component;\n * - register the service object as a global property by getting a Plugin object via\n * the `getToastServicePlugin` method, and binding it to the app via `app.use(toastPlugin)`\n * in `main.js/ts`;\n * - get the toast service object directly via `getToastServiceObject` method.\n */\nexport class ToastServiceProvider {\n toasts: Ref<ToastWithId[]> = ref<ToastWithId[]>([]);\n\n show = (toast: Toast): string => {\n const clonedToast = cloneDeep(toast);\n if (clonedToast.deduplicationKey) {\n const previousToast = this.toasts.value.find(\n (toast) => clonedToast.deduplicationKey === toast.deduplicationKey,\n );\n if (previousToast) {\n return previousToast.id!;\n }\n }\n\n const id = uniqueId();\n clonedToast.autoRemove = clonedToast.autoRemove ?? true;\n this.toasts.value.unshift({ ...clonedToast, id });\n\n return id;\n };\n\n remove(id: string): void {\n this.toasts.value = this.toasts.value.filter((toast) => toast.id !== id);\n }\n\n removeBy = (predicate: (toast: ToastWithId) => boolean): void => {\n this.toasts.value = this.toasts.value.filter((toast) => !predicate(toast));\n };\n\n autoRemove = (): void => {\n this.toasts.value = this.toasts.value.filter((toast) => !toast.autoRemove);\n };\n\n removeAll = (): void => {\n this.toasts.value = [];\n };\n\n readonlyToasts = computed(() => this.toasts.value);\n\n toastServiceObject: ToastService = {\n toasts: this.readonlyToasts,\n show: this.show,\n remove: this.remove.bind(this),\n removeBy: this.removeBy.bind(this),\n autoRemove: this.autoRemove,\n removeAll: this.removeAll,\n };\n\n /** Methods for accessing the toast service object */\n\n /**\n * A composable to be used in the app's root component's `setup`. Provides\n * the service object to downstream components of the app via Vue's dependency\n * injection, which can then be accessed via the `useToasts` composable.\n *\n * @example\n * toastServiceProvider.useToastService({ serviceSymbol: Symbol(\"customToastService\") });\n */\n useToastService = ({\n serviceSymbol = defaultToastServiceSymbol,\n }: ToastServiceComposableOptions = {}): void => {\n provide(serviceSymbol, this.toastServiceObject);\n };\n\n /**\n * Returns an object that can be used as a plugin with the `app.use()` syntax.\n * A custom `propertyName` property can be provided to be used as the global\n * property name instead of the default \"$toast\".\n *\n * @example\n * const toastPlugin = toastServiceProvider.getToastServicePlugin();\n * app.use(toastPlugin, {\n * propertyName: \"$customPropertyName\" // \"$toast\" by default\n * })\n */\n getToastServicePlugin = (): Plugin => {\n return {\n install: (app: App, options?: { propertyName?: string }) => {\n const propertyName = options?.propertyName ?? defaultGlobalPropertyName;\n app.config.globalProperties[propertyName] = this.toastServiceObject;\n },\n };\n };\n\n /**\n * Returns the toast service object directly.\n */\n getToastServiceObject = (): ToastService => {\n return this.toastServiceObject;\n };\n}\n\nconst useToastsFromSymbol = (serviceSymbol: symbol): ToastService => {\n const toastService = inject<ToastService | null>(serviceSymbol, null);\n\n if (!toastService) {\n throw new ToastServiceError(\n `No toast service found using the symbol ${serviceSymbol.toString()}.`,\n );\n }\n\n return toastService;\n};\n\nconst useToastsFromGlobalProperty = (propertyName: string): ToastService => {\n const toastService =\n getCurrentInstance()?.appContext.config.globalProperties[propertyName];\n\n if (!toastService) {\n throw new ToastServiceError(\n `No toast service found using the global property name '${propertyName}'.`,\n );\n }\n\n return toastService;\n};\n\n/**\n * Retrieves the toast service object either from the global injection or from the app's\n * global property via the app instance. If you have multiple instances of the toast\n * service in the app, you can use different injection key symbols or global property\n * names to differentiate them.\n *\n * @example\n * import { useToasts } from \"@knime/product-features/toasts\";\n *\n * // Using default options (the app has a shared toast service between components)\n * const { show } = useToasts();\n *\n * // Using a specific symbol (multiple toast services running across the app)\n * const { show } = useToasts({ serviceSymbol: mySpecialSymbol });\n *\n * show({\n * type: \"success\",\n * message: \"I am an example toast.\"\n * });\n */\n\nexport const useToasts = ({\n serviceSymbol,\n propertyName,\n}: UseToastsOptions = {}): ToastService => {\n if (serviceSymbol && propertyName) {\n throw new ToastServiceError(\n \"Please provide either a custom injection key symbol or a custom global property name, but not both.\",\n );\n }\n\n if (!serviceSymbol && !propertyName) {\n try {\n return useToastsFromSymbol(defaultToastServiceSymbol);\n } catch (_error) {\n return useToastsFromGlobalProperty(defaultGlobalPropertyName);\n }\n }\n\n if (serviceSymbol) {\n return useToastsFromSymbol(serviceSymbol);\n }\n\n if (propertyName) {\n return useToastsFromGlobalProperty(propertyName);\n }\n\n throw new ToastServiceError(\"No toast service found.\");\n};\n","<script setup lang=\"ts\">\nimport { computed, provide } from \"vue\";\n\nimport Toast from \"../Toast/Toast.vue\";\nimport { useToasts } from \"../toastService/toastService\";\n\nimport { TOAST_STACK_ID } from \"./injectionKeys\";\nimport type { ToastStackProps } from \"./types\";\n\nconst MAX_TOAST_COUNT = 5;\nconst OFFSET = 4;\n\nconst { serviceSymbol = null, propertyName = null } =\n defineProps<ToastStackProps>();\n\nconst stackIdentifier = computed(() => {\n if (serviceSymbol) {\n return serviceSymbol.toString();\n } else if (propertyName) {\n return propertyName;\n }\n return \"default\";\n});\nprovide(TOAST_STACK_ID, stackIdentifier);\n\n// Inject the toast service (optionally bound to a custom symbol or a global property name)\nconst { toasts, remove, autoRemove } = useToasts({\n serviceSymbol,\n propertyName,\n});\n\n// Compute CSS styles for each toast based on its index in the stack\nconst style = (index: number) => {\n const factor = index < MAX_TOAST_COUNT ? OFFSET : MAX_TOAST_COUNT;\n const opacity = index < MAX_TOAST_COUNT ? null : 0;\n\n return {\n zIndex: -index,\n bottom: `${-factor * index}px`,\n right: `${-factor * index}px`,\n ...(opacity !== null && { opacity }),\n };\n};\n\n// Check if the current toast is the first in the stack (active toast)\nconst isActive = (index: number) => index === 0;\n</script>\n\n<template>\n <transition-group class=\"toast-stack\" tag=\"div\" name=\"toast-stack\">\n <Toast\n v-for=\"(toast, index) in toasts\"\n v-bind=\"toast\"\n :key=\"toast.id\"\n :active=\"isActive(index)\"\n class=\"toast\"\n :style=\"style(index)\"\n @remove=\"remove(toast.id!)\"\n @auto-remove=\"autoRemove()\"\n />\n </transition-group>\n</template>\n\n<style scoped>\n.toast-stack {\n position: fixed;\n bottom: var(--kds-spacing-container-3x);\n left: var(--kds-spacing-container-3x);\n\n & .toast {\n position: absolute;\n max-height: var(--kds-dimension-component-height-20x);\n pointer-events: none;\n\n &:first-child {\n position: relative;\n max-height: 80vh;\n pointer-events: all;\n }\n }\n}\n\n/* Vue's transition group animation behaviour configuration */\n.toast-stack-enter-active,\n.toast-stack-leave-active {\n transition: all 0.3s;\n}\n\n.toast-stack-enter-from,\n.toast-stack-leave-to {\n opacity: 0;\n transform: translateY(75px);\n}\n</style>\n"],"names":["_openBlock","_createBlock","_unref","_mergeProps","shouldPause","_createElementBlock","_normalizeClass","_withDirectives","_createElementVNode","_createVNode","_toDisplayString","_Fragment","_resolveDynamicComponent","_renderList","ToastButton","toast","_TransitionGroup"],"mappings":";;;;;;;AAKO,MAAM,UAAA,GAAa,CAAC,KAAA,KACzB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA;;ACNnD,MAAM,gBAAA,GAAmB,GAAA;AAGzB,uBAAe,CAAC,MAAA,GAAS,EAAA,EAAI,SAAA,GAAY,gBAAA,KAAqB;AAC5D,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,GAAS,SAAA,GAAY,GAAA,GAAM,EAAA;AAC/C,EAAA,OAAO,CAAA,EAAG,OAAO,SAAA,CAAU,CAAA,EAAG,YAAY,CAAC,CAAC,GAAG,IAAI,CAAA,CAAA;AACrD,CAAA;;ACNO,MAAM,SAAA,GAAY;AAAA,EACvB,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO;AACT;AAE0B,MAAA,CAAO,MAAA,CAAO,SAAS;;ACL1C,MAAM,cAAA,0BACJ,gBAAgB,CAAA;;;;;;;;;;;;;ACYzB,IAAA,MAAM,KAAA,GAAQ,OAAA;AAEd,IAAA,MAAM,QAAA,GAAW,SAAS,MAAM;AAC9B,MAAA,IAAI,MAAM,EAAA,EAAI;AACZ,QAAA,OAAO,KAAA,CAAM,EAAA;AAAA,MACf;AACA,MAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACf,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,SAAS,MAAM;AAC5B,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,OAAO,QAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,SAAS,MAAM;AAC9B,MAAA,IAAI,OAAO,KAAA,CAAM,QAAA,KAAa,UAAA,EAAY;AACxC,QAAA,OAAO,KAAA,CAAM,QAAA;AAAA,MACf;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,QAAA;AAAA,MAAuB,MAC1C,KAAA,CAAM,IAAA,KAAS,SACX,EAAE,WAAA,EAAa,MAAM,IAAA,EAAO,SAAA,EAAW,KAAA,CAAM,SAAA,KAC7C,EAAE,KAAA,EAAO,MAAM,IAAA,EAAM,WAAA,EAAa,MAAM,IAAA;AAAK,KACnD;;aAKU,QAAA,CAAA,SADRA,SAAA,EAAA,EAAAC,YASEC,KAAA,iBATFC,UAAA,CASE;AAAA;QAPA,OAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAK,QAAA;AAAA,QACJ,IAAI,QAAA,CAAA,KAAA;AAAA,QACJ,QAAQ,MAAA,CAAA,KAAA;AAAA,QACR,GAAA,EAAK,MAAA,CAAA,KAAA,GAAM,qBAAA,GAAA;AAAA,SACJ,YAAA,CAAA,KAAA,EAAY,EACnB,OAAA,EAAO,SAAA,KAAA,EAAQ,CAAA,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA,MAAA,QAAA,EAAA,KAAA,EAAA,SAAA,CAAA,CAAA,KAGlBH,SAAA,IAAAC,WAAA,CAMEC,KAAA,aANFC,UAAA,CAME;AAAA;QAJA,OAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAK;AAAA,SACG,YAAA,CAAA,KAAA,EAAY,EACnB,OAAA,EAAO,QAAA,CAAA,KAAA,EAAQ,CAAA,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA,SAAA,CAAA,CAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;ACtCpB,MAAM,kBAAA,GAAqB,GAAA;AAuE3B,MAAM,oBAAA,GAAuB,GAAA;;;;;;;;;;;;;;;;;;;;;;AA1D7B,IAAA,MAAM,iBAAA,GAAoB,SAAS,MAAM;AACvC,MAAA,OAAO,QAAA,QAAA,GAAW,OAAA,CAAA,QAAA,GAAW,UAAA,CAAW,QAAA,IAAI,CAAA;AAAA,IAC9C,CAAC,CAAA;AAGD,IAAA,MAAM,OAAA,GAAuC;AAAA,MAC3C,CAAC,SAAA,CAAU,IAAI,GAAG,aAAA;AAAA,MAClB,CAAC,SAAA,CAAU,KAAK,GAAG,cAAA;AAAA,MACnB,CAAC,SAAA,CAAU,OAAO,GAAG,gBAAA;AAAA,MACrB,CAAC,SAAA,CAAU,OAAO,GAAG;AAAA,KACvB;AACA,IAAA,MAAM,oBAAoB,QAAA,CAAS,MAAM,OAAA,CAAQ,OAAA,CAAA,IAAI,CAAC,CAAA;AAGtD,IAAA,MAAM,QAAA,GAGF;AAAA,MACF,CAAC,SAAA,CAAU,IAAI,GAAG;AAAA,QAChB,WAAA,EAAa,qCAAA;AAAA,QACb,UAAA,EAAY,+CAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,CAAC,SAAA,CAAU,KAAK,GAAG;AAAA,QACjB,WAAA,EAAa,uCAAA;AAAA,QACb,UAAA,EAAY,iDAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,CAAC,SAAA,CAAU,OAAO,GAAG;AAAA,QACnB,WAAA,EAAa,wCAAA;AAAA,QACb,UAAA,EAAY,kDAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,CAAC,SAAA,CAAU,OAAO,GAAG;AAAA,QACnB,WAAA,EAAa,wCAAA;AAAA,QACb,UAAA,EAAY,kDAAA;AAAA,QACZ,MAAA,EAAQ;AAAA;AACV,KACF;AACA,IAAA,MAAM,YAAY,QAAA,CAAS,MAAM,SAAS,OAAA,CAAA,IAAI,EAAE,WAAW,CAAA;AAC3D,IAAA,MAAM,kBAAkB,QAAA,CAAS,MAAM,SAAS,OAAA,CAAA,IAAI,EAAE,UAAU,CAAA;AAChE,IAAA,MAAM,cAAc,QAAA,CAAS,MAAM,SAAS,OAAA,CAAA,IAAI,EAAE,MAAM,CAAA;AAGxD,IAAA,MAAM,IAAA,GAAO,MAAA;AAMb,IAAA,MAAM,QAAA,GAAoC,IAAI,IAAI,CAAA;AAGlD,IAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,iBAAA,CAAkB,QAAQ,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,SAAS,MAAM,CAAC,QAAQ,KAAA,IAAS,CAAC,UAAU,KAAK,CAAA;AAIrE,IAAA,MAAM,OAAA,GAAU,IAAI,CAAC,CAAA;AACrB,IAAA,MAAM,UAAA,GAAa,QAAA;AAAA,MAAS,MAC1B,KAAK,GAAA,CAAI,CAAA,EAAG,MAAO,OAAA,CAAQ,KAAA,GAAQ,uBAAwB,GAAG;AAAA,KAChE;AACA,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,QAAA;AAAA,MACxB,CAAC,EAAE,KAAA,EAAM,KAAM;AACb,QAAA,OAAA,CAAQ,KAAA,IAAS,KAAA;AACjB,QAAA,IAAI,OAAA,CAAQ,SAAS,oBAAA,EAAsB;AACzC,UAAA,KAAA,EAAM;AACN,UAAA,IAAA,CAAK,YAAY,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAAA,MACA,EAAE,WAAW,KAAA;AAAM,KACrB;AACA,IAAA,MAAM,IAAA,GAAO,MAAA;AACb,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,KAAA,EAAM;AACN,MAAA,OAAA,CAAQ,KAAA,GAAQ,CAAA;AAAA,IAClB,CAAA;AAGA,IAAA,MAAM,gBAAA,GAAmB,QAAA;AAAA,MAAS,MAChC,cAAA,CAAe,OAAA,CAAA,OAAA,EAAS,kBAAkB;AAAA,KAC5C;AACA,IAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,KAAA,KAAU,OAAA,CAAA,OAAA;AACjD,IAAA,MAAM,WAAA,GAAc,IAAI,aAAa,CAAA;AACrC,IAAA,MAAM,WAAW,MAAM;AAErB,MAAA,WAAA,CAAY,KAAA,GAAQ,KAAA;AACpB,MAAA,IAAI,QAAA,CAAS,UAAU,IAAA,EAAM;AAE3B,QAAA,QAAA,CAAS,KAAA,CAAM,MAAM,MAAA,GAAS,OAAA;AAAA,MAChC;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,YAAA,GAAmC,IAAI,IAAI,CAAA;AACjD,IAAA,MAAM,aAAA,GAAoC,IAAI,IAAI,CAAA;AAIlD,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,cAAA,EAAgB,IAAI,CAAA;AAC3C,IAAA,MAAM,WAAW,OAAA,GACb,WAAA,CAAY,oBAAoB,OAAA,CAAQ,KAAK,EAAE,CAAA,GAC/C,IAAA;AACJ,IAAA,MAAM,eAAA,GAAkB,CAAC,YAAA,KAAyB;AAChD,MAAA,IAAI,QAAA,CAAS,UAAU,IAAA,EAAM;AAC3B,QAAA,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,YAAY,CAAA,EAAA,CAAA;AAAA,MAC/C;AACA,MAAA,aAAA,CAAc,KAAA,GAAQ,YAAA;AAAA,IACxB,CAAA;AAEA,IAAA,QAAA,EAAU,EAAA,CAAG,CAAC,cAAA,KAA4B;AACxC,MAAA,IACE,OAAO,cAAA,KAAmB,QAAA,IAC1B,aAAA,CAAc,UAAU,cAAA,EACxB;AACA,QAAA,eAAA,CAAgB,cAAc,CAAA;AAAA,MAChC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,QAAA,CAAS,UAAU,IAAA,EAAM;AAC3B,QAAA,YAAA,CAAa,KAAA,GAAQ,SAAS,KAAA,CAAM,YAAA;AACpC,QAAA,aAAA,CAAc,KAAA,GAAQ,SAAS,KAAA,CAAM,YAAA;AAAA,MACvC;AACA,MAAA,QAAA,EAAU,IAAA,CAAK,cAAc,KAAK,CAAA;AAElC,MAAA,IAAI,OAAA,CAAA,UAAA,IAAc,OAAA,CAAA,MAAA,EAAQ;AACxB,QAAA,IAAA,EAAK;AAAA,MACP;AAAA,IACF,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,WAAA,EAAa,CAACC,YAAAA,KAAgB;AAClC,MAAA,IAAI,CAAC,OAAA,CAAA,UAAA,IAAc,CAAC,QAAA,MAAA,EAAQ;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,IAAIA,YAAAA,EAAa;AACf,QAAA,KAAA,EAAM;AAAA,MACR,CAAA,MAAO;AACL,QAAA,IAAA,EAAK;AAAA,MACP;AAAA,IACF,CAAC,CAAA;AAED,IAAA,KAAA;AAAA,MACE,MAAM,OAAA,CAAA,MAAA;AAAA,MACN,CAAC,QAAA,KAAa;AACZ,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAI,YAAA,CAAa,UAAU,IAAA,EAAM;AAC/B,YAAA,eAAA,CAAgB,aAAa,KAAK,CAAA;AAClC,YAAA,QAAA,EAAU,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,UACpC;AAEA,UAAA,IAAI,OAAA,CAAA,UAAA,IAAc,CAAC,WAAA,CAAY,KAAA,EAAO;AACpC,YAAA,IAAA,EAAK;AAAA,UACP;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,WAAA,CAAY,KAAA,GAAQ,IAAA;AAAA,QACtB;AAEA,QAAA,IAAI,QAAA,UAAA,EAAY;AACd,UAAA,KAAA,EAAM;AAAA,QACR;AAAA,MACF;AAAA,KACF;;0BAIEC,kBAAA,CAqDM,KAAA,EAAA;AAAA,iBArDG,UAAA;AAAA,QAAJ,GAAA,EAAI,QAAA;AAAA,QAAY,KAAA,EAAKC,cAAA,CAAA,CAAA,OAAA,EAAY,OAAA,CAAA,IAAA,EAAI,EAAA,aAAA,EAAmB,OAAA,CAAA,UAAA,EAAU,CAAA;AAAA;QACrEC,cAAA,CAAAC,kBAAA,CAmDM,KAAA,EAnDN,UAAA,EAmDM;AAAA,UAlDJA,kBAAA,CAEM,OAFN,UAAA,EAEM;AAAA,YADJC,WAAA,CAAqCP,KAAA,CAAA,OAAA,CAAA,EAAA,EAA3B,IAAA,EAAM,iBAAA,CAAA,KAAA,EAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,MAAA,CAAA;AAAA;UAGnCM,kBAAA,CA2CM,OA3CN,UAAA,EA2CM;AAAA,YA1CJA,kBAAA,CAaM,OAbN,UAAA,EAaM;AAAA,cAZJA,mBAAmD,KAAA,EAAnD,UAAA,EAAmDE,gBAA1B,iBAAA,CAAA,KAAiB,GAAA,CAAA,CAAA;AAAA,cAGlC,QAAA,WAAA,iBADRT,WAAA,CASEC,KAAA,CAAA,SAAA,CAAA,EAAA;AAAA;gBAPA,cAAA,EAAa,SAAA;AAAA,gBACb,OAAA,EAAQ,aAAA;AAAA,gBACR,IAAA,EAAK,QAAA;AAAA,gBACL,KAAA,EAAM,iBAAA;AAAA,gBACN,SAAA,EAAU,iBAAA;AAAA,gBACV,cAAA,EAAa,SAAA;AAAA,gBACZ,OAAA,wCAAO,IAAA,CAAI,QAAA,CAAA;AAAA;;YAIL,QAAA,OAAA,IAAXF,SAAA,EAAA,EAAAK,kBAAA,CAKM,OALN,UAAA,EAKM;AAAA,cAJY,WAAA,CAAA,sBAAhBA,mBAEWM,QAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,EAAA;AAAA,gDADN,gBAAA,CAAA,KAAgB,GAAA,CAAA;AAAA,sCAErBN,mBAAyCM,QAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,EAAA;AAAA,gDAArB,OAAA,CAAA,OAAO,GAAA,CAAA;AAAA;kBAGb,OAAA,CAAA,SAAA,IAAhBX,WAAA,EAAAK,kBAAA,CAEM,OAFN,UAAA,EAEM;AAAA,eADJL,SAAA,EAAA,EAAAC,WAAA,CAAmDW,uBAAA,CAAnC,OAAA,CAAA,SAAS,CAAA,EAAA,EAAG,UAAA,EAAW,QAAA,EAAQ,EAAA,IAAA,EAAA,EAAA,CAAA;AAAA;YAGtC,WAAA,CAAA,SAAe,OAAA,CAAA,OAAA,CAAQ,UAAlCZ,SAAA,EAAA,EAAAK,kBAAA,CAeM,KAAA,EAfN,UAAA,EAeM;AAAA,cAbI,YAAA,KAAA,iBADRJ,WAAA,CAOEC,KAAA,CAAA,SAAA,CAAA,EAAA;AAAA;gBALA,cAAA,EAAa,WAAA;AAAA,gBACb,OAAA,EAAQ,aAAA;AAAA,gBACR,IAAA,EAAK,QAAA;AAAA,gBACL,KAAA,EAAM,WAAA;AAAA,gBACL,OAAA,EAAO;AAAA;eAGVF,SAAA,CAAA,IAAA,CAAA,EAAAK,kBAAA,CAIEM,QAAA,EAAA,IAAA,EAAAE,UAAA,CAH0B,OAAA,CAAA,OAAA,EAAO,CAAzB,MAAA,EAAQ,KAAA,KAAK;AADvB,gBAAA,OAAAb,WAAA,EAAAC,WAAA,CAIEa,WAAA,EAJFX,UAAA,CAIE,EAAA,OAAA,EAAA,IAAA,EAAA,EAFQ,MAAA,EAAM,EACb,GAAA,EAAK,KAAA,EAAK,CAAA,EAAA,MAAA,EAAA,CAAA;AAAA;;;UAKjBM,WAAA,CAAgEP,KAAA,CAAA,cAAA,CAAA,EAAA;AAAA,YAAhD,KAAA,EAAM,cAAA;AAAA,YAAgB,YAAY,UAAA,CAAA;AAAA;;kBAlDvC,OAAA,CAAA,MAAM;AAAA;;;;;;;;ACpMhB,MAAM,yBAAA,0BAAmC,OAAO,CAAA;AAChD,MAAM,yBAAA,GAA4B,QAAA;AAElC,MAAM,0BAA0B,KAAA,CAAM;AAAA,EAC3C,YAAY,OAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAcO,MAAM,oBAAA,CAAqB;AAAA,EAChC,MAAA,GAA6B,GAAA,CAAmB,EAAE,CAAA;AAAA,EAElD,IAAA,GAAO,CAAC,KAAA,KAAyB;AAC/B,IAAA,MAAM,WAAA,GAAc,UAAU,KAAK,CAAA;AACnC,IAAA,IAAI,YAAY,gBAAA,EAAkB;AAChC,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA;AAAA,QACtC,CAACa,MAAAA,KAAU,WAAA,CAAY,gBAAA,KAAqBA,MAAAA,CAAM;AAAA,OACpD;AACA,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,OAAO,aAAA,CAAc,EAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,MAAM,KAAK,QAAA,EAAS;AACpB,IAAA,WAAA,CAAY,UAAA,GAAa,YAAY,UAAA,IAAc,IAAA;AACnD,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,OAAA,CAAQ,EAAE,GAAG,WAAA,EAAa,IAAI,CAAA;AAEhD,IAAA,OAAO,EAAA;AAAA,EACT,CAAA;AAAA,EAEA,OAAO,EAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAC,KAAA,KAAU,KAAA,CAAM,EAAA,KAAO,EAAE,CAAA;AAAA,EACzE;AAAA,EAEA,QAAA,GAAW,CAAC,SAAA,KAAqD;AAC/D,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC3E,CAAA;AAAA,EAEA,aAAa,MAAY;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAC,KAAA,KAAU,CAAC,KAAA,CAAM,UAAU,CAAA;AAAA,EAC3E,CAAA;AAAA,EAEA,YAAY,MAAY;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,EAAC;AAAA,EACvB,CAAA;AAAA,EAEA,cAAA,GAAiB,QAAA,CAAS,MAAM,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAEjD,kBAAA,GAAmC;AAAA,IACjC,QAAQ,IAAA,CAAK,cAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IAC7B,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IACjC,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,WAAW,IAAA,CAAK;AAAA,GAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,kBAAkB,CAAC;AAAA,IACjB,aAAA,GAAgB;AAAA,GAClB,GAAmC,EAAC,KAAY;AAC9C,IAAA,OAAA,CAAQ,aAAA,EAAe,KAAK,kBAAkB,CAAA;AAAA,EAChD,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,wBAAwB,MAAc;AACpC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAC,GAAA,EAAU,OAAA,KAAwC;AAC1D,QAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,yBAAA;AAC9C,QAAA,GAAA,CAAI,MAAA,CAAO,gBAAA,CAAiB,YAAY,CAAA,GAAI,IAAA,CAAK,kBAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,MAAoB;AAC1C,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd,CAAA;AACF;AAEA,MAAM,mBAAA,GAAsB,CAAC,aAAA,KAAwC;AACnE,EAAA,MAAM,YAAA,GAAe,MAAA,CAA4B,aAAA,EAAe,IAAI,CAAA;AAEpE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,iBAAA;AAAA,MACR,CAAA,wCAAA,EAA2C,aAAA,CAAc,QAAA,EAAU,CAAA,CAAA;AAAA,KACrE;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AACT,CAAA;AAEA,MAAM,2BAAA,GAA8B,CAAC,YAAA,KAAuC;AAC1E,EAAA,MAAM,eACJ,kBAAA,EAAmB,EAAG,UAAA,CAAW,MAAA,CAAO,iBAAiB,YAAY,CAAA;AAEvE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,iBAAA;AAAA,MACR,0DAA0D,YAAY,CAAA,EAAA;AAAA,KACxE;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AACT,CAAA;AAuBO,MAAM,YAAY,CAAC;AAAA,EACxB,aAAA;AAAA,EACA;AACF,CAAA,GAAsB,EAAC,KAAoB;AACzC,EAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,IAAA,MAAM,IAAI,iBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,YAAA,EAAc;AACnC,IAAA,IAAI;AACF,MAAA,OAAO,oBAAoB,yBAAyB,CAAA;AAAA,IACtD,SAAS,MAAA,EAAQ;AACf,MAAA,OAAO,4BAA4B,yBAAyB,CAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO,oBAAoB,aAAa,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,4BAA4B,YAAY,CAAA;AAAA,EACjD;AAEA,EAAA,MAAM,IAAI,kBAAkB,yBAAyB,CAAA;AACvD;;AC/LA,MAAM,eAAA,GAAkB,CAAA;AACxB,MAAM,MAAA,GAAS,CAAA;;;;;;;;AAKf,IAAA,MAAM,eAAA,GAAkB,SAAS,MAAM;AACrC,MAAA,IAAI,QAAA,aAAA,EAAe;AACjB,QAAA,OAAO,OAAA,eAAc,QAAA,EAAS;AAAA,MAChC,CAAA,MAAA,IAAW,QAAA,YAAA,EAAc;AACvB,QAAA,OAAO,OAAA,CAAA,YAAA;AAAA,MACT;AACA,MAAA,OAAO,SAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,gBAAgB,eAAe,CAAA;AAGvC,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAA,KAAe,SAAA,CAAU;AAAA,MAC/C,eAAY,OAAA,CAAA,aAAA;AAAA,MACZ,cAAW,OAAA,CAAA;AAAA,KACZ,CAAA;AAGD,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAkB;AAC/B,MAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,eAAA,GAAkB,MAAA,GAAS,eAAA;AAClD,MAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,eAAA,GAAkB,IAAA,GAAO,CAAA;AAEjD,MAAA,OAAO;AAAA,QACL,QAAQ,CAAC,KAAA;AAAA,QACT,MAAA,EAAQ,CAAA,EAAG,CAAC,MAAA,GAAS,KAAK,CAAA,EAAA,CAAA;AAAA,QAC1B,KAAA,EAAO,CAAA,EAAG,CAAC,MAAA,GAAS,KAAK,CAAA,EAAA,CAAA;AAAA,QACzB,GAAI,OAAA,KAAY,IAAA,IAAQ,EAAE,OAAA;AAAQ,OACpC;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAkB,KAAA,KAAU,CAAA;;0BAI5Cd,WAAA,CAWmBe,eAAA,EAAA;AAAA,QAXD,KAAA,EAAM,aAAA;AAAA,QAAc,GAAA,EAAI,KAAA;AAAA,QAAM,IAAA,EAAK;AAAA;yBAEjD,MAAgC;AAAA,WADlChB,SAAA,CAAA,IAAA,CAAA,EAAAK,kBAAA,CASEM,QAAA,EAAA,IAAA,EAAAE,UAAA,CARyBX,KAAA,CAAA,MAAA,CAAA,EAAM,CAAvB,KAAA,EAAO,KAAA,KAAK;gCADtBD,WAAA,CASE,KAAA,EATFE,WASE,EAAA,OAAA,EAAA,IAAA,EAAA,EAPQ,KAAA,EAAK;AAAA,cACZ,KAAK,KAAA,CAAM,EAAA;AAAA,cACX,MAAA,EAAQ,SAAS,KAAK,CAAA;AAAA,cACvB,KAAA,EAAM,OAAA;AAAA,cACL,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,cAClB,UAAM,CAAA,MAAA,KAAED,MAAA,MAAA,CAAA,CAAO,MAAM,EAAE,CAAA;AAAA,cACvB,YAAA,wCAAaA,KAAA,CAAA,UAAA,CAAA,EAAU;AAAA;;;;;;;;;;;;;","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"toasts.js","sources":["../src/toasts/Toast/enums.ts","../src/toasts/ToastStack/injectionKeys.ts","../src/toasts/Toast/ToastButton.vue","../src/toasts/Toast/Toast.vue","../src/toasts/toastService/toastService.ts","../src/toasts/ToastStack/ToastStack.vue"],"sourcesContent":["export const toastType = {\n INFO: \"info\",\n SUCCESS: \"success\",\n WARNING: \"warning\",\n ERROR: \"error\",\n} as const;\n\nexport const toastTypes = Object.values(toastType);\n","import type { ComputedRef, InjectionKey } from \"vue\";\n\nexport const TOAST_STACK_ID: InjectionKey<ComputedRef<string>> =\n Symbol(\"toast-stack-id\");\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport {\n KdsButton,\n type KdsIconName,\n KdsLinkButton,\n} from \"@knime/kds-components\";\n\nimport type { ToastButton } from \"./types\";\n\ntype LabelAndIcon =\n | { label: string; leadingIcon?: KdsIconName; ariaLabel?: never }\n | { label?: never; leadingIcon: KdsIconName; ariaLabel: string };\n\nconst props = defineProps<ToastButton>();\n\nconst mergedTo = computed(() => {\n if (props.to) {\n return props.to;\n }\n return props.href;\n});\n\nconst target = computed(() => {\n if (props.href) {\n return \"_blank\";\n }\n return null;\n});\n\nconst callback = computed(() => {\n if (typeof props.callback === \"function\") {\n return props.callback;\n }\n return undefined;\n});\n\nconst labelAndIcon = computed<LabelAndIcon>(() =>\n props.text === undefined\n ? { leadingIcon: props.icon!, ariaLabel: props.ariaLabel }\n : { label: props.text, leadingIcon: props.icon },\n);\n</script>\n\n<template>\n <KdsLinkButton\n v-if=\"mergedTo\"\n variant=\"transparent\"\n size=\"xsmall\"\n :to=\"mergedTo\"\n :target=\"target\"\n :rel=\"target ? 'noopener noreferrer' : null\"\n v-bind=\"labelAndIcon\"\n @click=\"callback\"\n />\n\n <KdsButton\n v-else\n variant=\"transparent\"\n size=\"xsmall\"\n v-bind=\"labelAndIcon\"\n @click=\"callback\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, onMounted, ref, watch } from \"vue\";\nimport type { Ref } from \"vue\";\nimport {\n useEventBus,\n useMouseInElement,\n useRafFn,\n useWindowFocus,\n} from \"@vueuse/core\";\n\nimport {\n KdsButton,\n KdsIcon,\n type KdsIconName,\n KdsProgressBar,\n} from \"@knime/kds-components\";\nimport { capitalize, truncateString } from \"@knime/utils\";\n\nimport { TOAST_STACK_ID } from \"../ToastStack/injectionKeys\";\n\nimport ToastButton from \"./ToastButton.vue\";\nimport { toastType } from \"./enums\";\nimport type { KdsToastType, Toast } from \"./types\";\n\nconst MAX_MESSAGE_LENGTH = 160;\n\nconst {\n type = toastType.INFO,\n headline = \"\",\n message = \"\",\n component = null,\n autoRemove = true,\n active = true,\n buttons = [],\n dismissible = true,\n} = defineProps<Toast>();\n\nconst availableHeadline = computed(() => {\n return headline ? headline : capitalize(type);\n});\n\n// Supported toast types and corresponding icons\nconst iconMap: Record<string, KdsIconName> = {\n [toastType.INFO]: \"circle-info\",\n [toastType.ERROR]: \"circle-error\",\n [toastType.SUCCESS]: \"circle-success\",\n [toastType.WARNING]: \"warning\",\n};\nconst typeIndicatorIcon = computed(() => iconMap[type]);\n\n// Colors\nconst colorMap: Record<\n KdsToastType,\n Record<\"textAndIcon\" | \"background\" | \"border\", string>\n> = {\n [toastType.INFO]: {\n textAndIcon: \"var(--kds-color-text-and-icon-info)\",\n background: \"var(--kds-color-background-static-info-muted)\",\n border: \"var(--kds-border-base-info)\",\n },\n [toastType.ERROR]: {\n textAndIcon: \"var(--kds-color-text-and-icon-danger)\",\n background: \"var(--kds-color-background-static-danger-muted)\",\n border: \"var(--kds-border-base-danger)\",\n },\n [toastType.SUCCESS]: {\n textAndIcon: \"var(--kds-color-text-and-icon-success)\",\n background: \"var(--kds-color-background-static-success-muted)\",\n border: \"var(--kds-border-base-success)\",\n },\n [toastType.WARNING]: {\n textAndIcon: \"var(--kds-color-text-and-icon-warning)\",\n background: \"var(--kds-color-background-static-warning-muted)\",\n border: \"var(--kds-border-base-warning)\",\n },\n};\nconst mainColor = computed(() => colorMap[type].textAndIcon);\nconst backgroundColor = computed(() => colorMap[type].background);\nconst borderColor = computed(() => colorMap[type].border);\n\n// Emitted events\nconst emit = defineEmits<{\n remove: [];\n autoRemove: [];\n}>();\n\n// Toast ref\nconst toastRef: Ref<null | HTMLElement> = ref(null);\n\n// Window focus and mouse tracking\nconst focused = useWindowFocus();\nconst { isOutside } = useMouseInElement(toastRef);\nconst shouldPause = computed(() => !focused.value || !isOutside.value);\n\n// Auto-remove progress bar animation\nconst AUTO_REMOVE_DURATION = 7000;\nconst elapsed = ref(0);\nconst percentage = computed(() =>\n Math.max(0, 100 - (elapsed.value / AUTO_REMOVE_DURATION) * 100),\n);\nconst { pause, resume } = useRafFn(\n ({ delta }) => {\n elapsed.value += delta;\n if (elapsed.value >= AUTO_REMOVE_DURATION) {\n pause();\n emit(\"autoRemove\");\n }\n },\n { immediate: false },\n);\nconst play = resume;\nconst reset = () => {\n pause();\n elapsed.value = 0;\n};\n\n// Truncation of long messages\nconst truncatedMessage = computed(() =>\n truncateString(message, MAX_MESSAGE_LENGTH),\n);\nconst isTruncatable = truncatedMessage.value !== message;\nconst isTruncated = ref(isTruncatable);\nconst showMore = () => {\n // TODO HUB-5698: animate toast and stack height when expanding truncated text\n isTruncated.value = false;\n if (toastRef.value !== null) {\n // reset height if it has been set in animateHeightTo\n toastRef.value.style.height = \"unset\";\n }\n};\n\n// Height transformations\nconst nativeHeight: Ref<null | number> = ref(null);\nconst currentHeight: Ref<null | number> = ref(null);\n// Enables communication between toasts within the same ToastStack so they share\n// a height. Only active when this Toast is rendered inside a ToastStack — a\n// standalone Toast skips the bus entirely to avoid cross-instance chatter.\nconst stackId = inject(TOAST_STACK_ID, null);\nconst eventBus = stackId\n ? useEventBus(`new-stack-height-${stackId.value}`)\n : null;\nconst animateHeightTo = (targetHeight: number) => {\n if (toastRef.value !== null) {\n toastRef.value.style.height = `${targetHeight}px`;\n }\n currentHeight.value = targetHeight;\n};\n// Listen to height changes of other toasts and animate height accordingly\neventBus?.on((newStackHeight: unknown) => {\n if (\n typeof newStackHeight === \"number\" &&\n currentHeight.value !== newStackHeight\n ) {\n animateHeightTo(newStackHeight);\n }\n});\n\nonMounted(() => {\n if (toastRef.value !== null) {\n nativeHeight.value = toastRef.value.clientHeight;\n currentHeight.value = toastRef.value.clientHeight;\n }\n eventBus?.emit(currentHeight.value);\n\n if (autoRemove && active) {\n play();\n }\n});\n\nwatch(shouldPause, (shouldPause) => {\n if (!autoRemove || !active) {\n return;\n }\n\n if (shouldPause) {\n pause();\n } else {\n play();\n }\n});\n\nwatch(\n () => active,\n (newValue) => {\n if (newValue) {\n if (nativeHeight.value !== null) {\n animateHeightTo(nativeHeight.value);\n eventBus?.emit(currentHeight.value);\n }\n\n if (autoRemove && !shouldPause.value) {\n play();\n }\n return;\n }\n\n if (isTruncatable) {\n isTruncated.value = true;\n }\n\n if (autoRemove) {\n reset();\n }\n },\n);\n</script>\n\n<template>\n <div ref=\"toastRef\" :class=\"['toast', type, { 'auto-remove': autoRemove }]\">\n <div v-show=\"active\" class=\"container\">\n <div class=\"type-indicator\">\n <KdsIcon :name=\"typeIndicatorIcon\" />\n </div>\n\n <div class=\"content\">\n <div class=\"headline-wrapper\">\n <div class=\"headline\">{{ availableHeadline }}</div>\n\n <KdsButton\n v-if=\"dismissible\"\n data-test-id=\"dismiss\"\n variant=\"transparent\"\n size=\"xsmall\"\n tooltip=\"Dismiss message\"\n ariaLabel=\"Dismiss message\"\n leading-icon=\"x-close\"\n @click=\"emit('remove')\"\n />\n </div>\n\n <div v-if=\"message\" class=\"message\">\n <template v-if=\"isTruncated\">\n {{ truncatedMessage }}\n </template>\n <template v-else>{{ message }}</template>\n </div>\n\n <div v-else-if=\"component\" class=\"message\">\n <component :is=\"component\" @show-more=\"showMore\" />\n </div>\n\n <div v-if=\"isTruncated || buttons.length\" class=\"buttons\">\n <KdsButton\n v-if=\"isTruncated\"\n data-test-id=\"show-more\"\n variant=\"transparent\"\n size=\"xsmall\"\n label=\"Show more\"\n @click=\"showMore\"\n />\n\n <ToastButton\n v-for=\"(button, index) in buttons\"\n v-bind=\"button\"\n :key=\"index\"\n />\n </div>\n </div>\n\n <KdsProgressBar class=\"progress-bar\" :percentage=\"percentage\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.toast {\n --main-color: v-bind(mainColor);\n --background-color: v-bind(backgroundColor);\n --border-color: v-bind(borderColor);\n\n position: relative;\n width: var(--kds-dimension-component-width-25x);\n padding: var(--kds-spacing-container-0-75x) var(--kds-spacing-container-0-75x)\n var(--kds-spacing-container-1x);\n overflow: hidden;\n background-color: var(--background-color);\n border: var(--border-color);\n border-radius: var(--kds-border-radius-container-0-37x);\n box-shadow: var(--kds-elevation-level-3);\n transition: all 0.3s;\n\n & .container {\n display: flex;\n flex-direction: row;\n gap: var(--kds-spacing-container-0-5x);\n }\n\n & .type-indicator {\n display: flex;\n flex-shrink: 0;\n flex-direction: column;\n margin-top: var(--kds-spacing-container-0-12x);\n color: var(--main-color);\n }\n\n & .content {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-5x);\n max-width: 100%;\n\n & .headline-wrapper {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: var(--kds-dimension-component-height-1-25x);\n }\n\n & .headline {\n font: var(--kds-font-base-title-small-strong);\n color: var(--kds-color-text-and-icon-neutral);\n }\n\n & .message {\n max-height: var(--kds-dimension-component-height-45x);\n font: var(--kds-font-base-body-small);\n color: var(--kds-color-text-and-icon-neutral);\n overflow-wrap: anywhere;\n white-space: break-spaces;\n }\n\n & .buttons {\n display: flex;\n flex-direction: row;\n gap: var(--kds-spacing-container-0-5x);\n }\n }\n\n & .progress-bar {\n --progress-bar-transition-duration: 0s;\n --progress-bar-foreground-color: var(--main-color);\n\n position: absolute;\n right: calc(var(--kds-spacing-container-0-12x) * -1);\n bottom: 0;\n left: calc(var(--kds-spacing-container-0-12x) * -1);\n display: none;\n width: auto;\n }\n\n &.auto-remove .progress-bar {\n display: initial;\n }\n}\n</style>\n","import type { App, Plugin, Ref } from \"vue\";\nimport { computed, getCurrentInstance, inject, provide, ref } from \"vue\";\nimport { cloneDeep } from \"es-toolkit\";\nimport { uniqueId } from \"es-toolkit/compat\";\n\nimport type { Toast, ToastWithId } from \"../Toast/types\";\n\nimport type {\n ToastService,\n ToastServiceComposableOptions,\n UseToastsOptions,\n} from \"./types\";\n\nexport const defaultToastServiceSymbol = Symbol(\"toast\");\nexport const defaultGlobalPropertyName = \"$toast\";\n\nexport class ToastServiceError extends Error {\n constructor(message?: string) {\n super(message);\n this.name = \"ToastServiceError\";\n }\n}\n\n/**\n * Each instance of the class is bound to a reactive array of toasts, with which you\n * can interface via the properties of the `ToastService` object.\n *\n * You have the following options to access the toast service:\n * - `provide` the service object to downstream components by using the `useToastService`\n * method in the `setup` of the app's root component;\n * - register the service object as a global property by getting a Plugin object via\n * the `getToastServicePlugin` method, and binding it to the app via `app.use(toastPlugin)`\n * in `main.js/ts`;\n * - get the toast service object directly via `getToastServiceObject` method.\n */\nexport class ToastServiceProvider {\n toasts: Ref<ToastWithId[]> = ref<ToastWithId[]>([]);\n\n show = (toast: Toast): string => {\n const clonedToast = cloneDeep(toast);\n if (clonedToast.deduplicationKey) {\n const previousToast = this.toasts.value.find(\n (toast) => clonedToast.deduplicationKey === toast.deduplicationKey,\n );\n if (previousToast) {\n return previousToast.id!;\n }\n }\n\n const id = uniqueId();\n clonedToast.autoRemove = clonedToast.autoRemove ?? true;\n this.toasts.value.unshift({ ...clonedToast, id });\n\n return id;\n };\n\n remove(id: string): void {\n this.toasts.value = this.toasts.value.filter((toast) => toast.id !== id);\n }\n\n removeBy = (predicate: (toast: ToastWithId) => boolean): void => {\n this.toasts.value = this.toasts.value.filter((toast) => !predicate(toast));\n };\n\n autoRemove = (): void => {\n this.toasts.value = this.toasts.value.filter((toast) => !toast.autoRemove);\n };\n\n removeAll = (): void => {\n this.toasts.value = [];\n };\n\n readonlyToasts = computed(() => this.toasts.value);\n\n toastServiceObject: ToastService = {\n toasts: this.readonlyToasts,\n show: this.show,\n remove: this.remove.bind(this),\n removeBy: this.removeBy.bind(this),\n autoRemove: this.autoRemove,\n removeAll: this.removeAll,\n };\n\n /** Methods for accessing the toast service object */\n\n /**\n * A composable to be used in the app's root component's `setup`. Provides\n * the service object to downstream components of the app via Vue's dependency\n * injection, which can then be accessed via the `useToasts` composable.\n *\n * @example\n * toastServiceProvider.useToastService({ serviceSymbol: Symbol(\"customToastService\") });\n */\n useToastService = ({\n serviceSymbol = defaultToastServiceSymbol,\n }: ToastServiceComposableOptions = {}): void => {\n provide(serviceSymbol, this.toastServiceObject);\n };\n\n /**\n * Returns an object that can be used as a plugin with the `app.use()` syntax.\n * A custom `propertyName` property can be provided to be used as the global\n * property name instead of the default \"$toast\".\n *\n * @example\n * const toastPlugin = toastServiceProvider.getToastServicePlugin();\n * app.use(toastPlugin, {\n * propertyName: \"$customPropertyName\" // \"$toast\" by default\n * })\n */\n getToastServicePlugin = (): Plugin => {\n return {\n install: (app: App, options?: { propertyName?: string }) => {\n const propertyName = options?.propertyName ?? defaultGlobalPropertyName;\n app.config.globalProperties[propertyName] = this.toastServiceObject;\n },\n };\n };\n\n /**\n * Returns the toast service object directly.\n */\n getToastServiceObject = (): ToastService => {\n return this.toastServiceObject;\n };\n}\n\nconst useToastsFromSymbol = (serviceSymbol: symbol): ToastService => {\n const toastService = inject<ToastService | null>(serviceSymbol, null);\n\n if (!toastService) {\n throw new ToastServiceError(\n `No toast service found using the symbol ${serviceSymbol.toString()}.`,\n );\n }\n\n return toastService;\n};\n\nconst useToastsFromGlobalProperty = (propertyName: string): ToastService => {\n const toastService =\n getCurrentInstance()?.appContext.config.globalProperties[propertyName];\n\n if (!toastService) {\n throw new ToastServiceError(\n `No toast service found using the global property name '${propertyName}'.`,\n );\n }\n\n return toastService;\n};\n\n/**\n * Retrieves the toast service object either from the global injection or from the app's\n * global property via the app instance. If you have multiple instances of the toast\n * service in the app, you can use different injection key symbols or global property\n * names to differentiate them.\n *\n * @example\n * import { useToasts } from \"@knime/product-features/toasts\";\n *\n * // Using default options (the app has a shared toast service between components)\n * const { show } = useToasts();\n *\n * // Using a specific symbol (multiple toast services running across the app)\n * const { show } = useToasts({ serviceSymbol: mySpecialSymbol });\n *\n * show({\n * type: \"success\",\n * message: \"I am an example toast.\"\n * });\n */\n\nexport const useToasts = ({\n serviceSymbol,\n propertyName,\n}: UseToastsOptions = {}): ToastService => {\n if (serviceSymbol && propertyName) {\n throw new ToastServiceError(\n \"Please provide either a custom injection key symbol or a custom global property name, but not both.\",\n );\n }\n\n if (!serviceSymbol && !propertyName) {\n try {\n return useToastsFromSymbol(defaultToastServiceSymbol);\n } catch (_error) {\n return useToastsFromGlobalProperty(defaultGlobalPropertyName);\n }\n }\n\n if (serviceSymbol) {\n return useToastsFromSymbol(serviceSymbol);\n }\n\n if (propertyName) {\n return useToastsFromGlobalProperty(propertyName);\n }\n\n throw new ToastServiceError(\"No toast service found.\");\n};\n","<script setup lang=\"ts\">\nimport { computed, provide } from \"vue\";\n\nimport Toast from \"../Toast/Toast.vue\";\nimport { useToasts } from \"../toastService/toastService\";\n\nimport { TOAST_STACK_ID } from \"./injectionKeys\";\nimport type { ToastStackProps } from \"./types\";\n\nconst MAX_TOAST_COUNT = 5;\nconst OFFSET = 4;\n\nconst { serviceSymbol = null, propertyName = null } =\n defineProps<ToastStackProps>();\n\nconst stackIdentifier = computed(() => {\n if (serviceSymbol) {\n return serviceSymbol.toString();\n } else if (propertyName) {\n return propertyName;\n }\n return \"default\";\n});\nprovide(TOAST_STACK_ID, stackIdentifier);\n\n// Inject the toast service (optionally bound to a custom symbol or a global property name)\nconst { toasts, remove, autoRemove } = useToasts({\n serviceSymbol,\n propertyName,\n});\n\n// Compute CSS styles for each toast based on its index in the stack\nconst style = (index: number) => {\n const factor = index < MAX_TOAST_COUNT ? OFFSET : MAX_TOAST_COUNT;\n const opacity = index < MAX_TOAST_COUNT ? null : 0;\n\n return {\n zIndex: -index,\n bottom: `${-factor * index}px`,\n right: `${-factor * index}px`,\n ...(opacity !== null && { opacity }),\n };\n};\n\n// Check if the current toast is the first in the stack (active toast)\nconst isActive = (index: number) => index === 0;\n</script>\n\n<template>\n <transition-group class=\"toast-stack\" tag=\"div\" name=\"toast-stack\">\n <Toast\n v-for=\"(toast, index) in toasts\"\n v-bind=\"toast\"\n :key=\"toast.id\"\n :active=\"isActive(index)\"\n class=\"toast\"\n :style=\"style(index)\"\n @remove=\"remove(toast.id!)\"\n @auto-remove=\"autoRemove()\"\n />\n </transition-group>\n</template>\n\n<style scoped>\n.toast-stack {\n position: fixed;\n bottom: var(--kds-spacing-container-3x);\n left: var(--kds-spacing-container-3x);\n\n & .toast {\n position: absolute;\n max-height: var(--kds-dimension-component-height-20x);\n pointer-events: none;\n\n &:first-child {\n position: relative;\n max-height: 80vh;\n pointer-events: all;\n }\n }\n}\n\n/* Vue's transition group animation behaviour configuration */\n.toast-stack-enter-active,\n.toast-stack-leave-active {\n transition: all 0.3s;\n}\n\n.toast-stack-enter-from,\n.toast-stack-leave-to {\n opacity: 0;\n transform: translateY(75px);\n}\n</style>\n"],"names":["_openBlock","_createBlock","_unref","_mergeProps","shouldPause","_createElementBlock","_normalizeClass","_withDirectives","_createElementVNode","_createVNode","_toDisplayString","_Fragment","_resolveDynamicComponent","_renderList","ToastButton","toast","_TransitionGroup"],"mappings":"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"}
package/dist/versions.css CHANGED
@@ -39,21 +39,21 @@
39
39
  min-width: 0;
40
40
  }
41
41
 
42
- .avatar-and-name-wrapper[data-v-168fd828] {
42
+ .avatar-and-name-wrapper[data-v-1a7632f7] {
43
43
  display: flex;
44
44
  gap: var(--kds-spacing-container-0-25x);
45
45
  align-items: center;
46
46
  }
47
- .author-name[data-v-168fd828] {
47
+ .author-name[data-v-1a7632f7] {
48
48
  font: var(--kds-font-base-subtext-small);
49
49
  color: var(--kds-color-text-and-icon-neutral);
50
50
  }
51
51
 
52
- .history-event-footer[data-v-8a0eddd7] {
52
+ .history-event-footer[data-v-3db3e01b] {
53
53
  font: var(--kds-font-base-subtext-small);
54
54
  color: var(--kds-color-text-and-icon-subtle);
55
55
  }
56
- .hidden[data-v-8a0eddd7] {
56
+ .hidden[data-v-3db3e01b] {
57
57
  visibility: hidden;
58
58
  }
59
59
 
package/dist/versions.js CHANGED
@@ -1,7 +1,7 @@
1
- import { defineComponent, openBlock, createElementBlock, createElementVNode, createCommentVNode, createVNode, unref, renderSlot, toDisplayString, ref, computed, onMounted, createTextVNode, normalizeClass, Fragment, createBlock, withCtx, createSlots, withModifiers, useModel, useTemplateRef, normalizeStyle, mergeModels, renderList, nextTick } from 'vue';
2
- import { KdsIcon, KdsAvatar, KdsSelectableCard, KdsMenuButton, KdsButton, KdsToggleButton, KdsPopover, KdsDescription, KdsCard, KdsLinkButton, KdsPanel, KdsTextInput, KdsTextarea } from '@knime/kds-components';
1
+ import { defineComponent, openBlock, createElementBlock, createElementVNode, createCommentVNode, createVNode, unref, renderSlot, toDisplayString, ref, computed, onMounted, createTextVNode, withDirectives, normalizeClass, Fragment, createBlock, withCtx, createSlots, withModifiers, useModel, useTemplateRef, normalizeStyle, mergeModels, renderList, nextTick } from 'vue';
2
+ import { KdsIcon, KdsAvatar, vKdsTooltip, KdsSelectableCard, KdsMenuButton, KdsButton, KdsToggleButton, KdsPopover, KdsDescription, KdsCard, KdsLinkButton, KdsPanel, KdsTextInput, KdsTextarea } from '@knime/kds-components';
3
3
  import { _ as _export_sfc } from './_plugin-vue_export-helper-pcqpp-6-.js';
4
- import { b as formatLocalDateTimeString, a as formatDateTimeString } from './format-ra_vlnN7.js';
4
+ import { d as formatLocalDateTimeString, b as formatDateTimeString } from './index-B3ql6hun.js';
5
5
 
6
6
  import './versions.css';const _hoisted_1$8 = { class: "history-event-wrapper" };
7
7
  const _hoisted_2$4 = { class: "history-event-decorator" };
@@ -57,19 +57,19 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
57
57
  return openBlock(), createElementBlock("div", _hoisted_1$7, [
58
58
  createVNode(unref(KdsAvatar), {
59
59
  src: __props.avatar.src,
60
- title: __props.author,
60
+ tooltip: __props.author,
61
61
  initials: nameInitials(__props.author)
62
- }, null, 8, ["src", "title", "initials"]),
62
+ }, null, 8, ["src", "tooltip", "initials"]),
63
63
  createElementVNode("span", _hoisted_2$3, toDisplayString(__props.author), 1)
64
64
  ]);
65
65
  };
66
66
  }
67
67
  });
68
68
 
69
- const HistoryEventAuthor = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-168fd828"]]);
69
+ const HistoryEventAuthor = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-1a7632f7"]]);
70
70
 
71
71
  const _hoisted_1$6 = { class: "history-event-footer" };
72
- const _hoisted_2$2 = ["title", "datetime"];
72
+ const _hoisted_2$2 = ["datetime"];
73
73
  const _sfc_main$6 = /* @__PURE__ */ defineComponent({
74
74
  __name: "HistoryEventFooter",
75
75
  props: {
@@ -87,11 +87,14 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
87
87
  return (_ctx, _cache) => {
88
88
  return openBlock(), createElementBlock("span", _hoisted_1$6, [
89
89
  _cache[0] || (_cache[0] = createTextVNode(" Created on ", -1)),
90
- createElementVNode("time", {
91
- title: __props.date,
90
+ withDirectives((openBlock(), createElementBlock("time", {
92
91
  datetime: __props.date,
93
92
  class: normalizeClass({ hidden: !isMounted.value })
94
- }, toDisplayString(localDateTime.value), 11, _hoisted_2$2),
93
+ }, [
94
+ createTextVNode(toDisplayString(localDateTime.value), 1)
95
+ ], 10, _hoisted_2$2)), [
96
+ [unref(vKdsTooltip), __props.date]
97
+ ]),
95
98
  __props.version ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
96
99
  createTextVNode("– Version " + toDisplayString(__props.version), 1)
97
100
  ], 64)) : createCommentVNode("", true)
@@ -100,7 +103,7 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
100
103
  }
101
104
  });
102
105
 
103
- const HistoryEventFooter = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-8a0eddd7"]]);
106
+ const HistoryEventFooter = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-3db3e01b"]]);
104
107
 
105
108
  const _hoisted_1$5 = { class: "content-wrapper" };
106
109
  const _sfc_main$5 = /* @__PURE__ */ defineComponent({
@@ -1 +1 @@
1
- {"version":3,"file":"versions.js","sources":["../src/versions/VersionHistory/HistoryEvent.vue","../src/versions/VersionHistory/HistoryEventAuthor.vue","../src/versions/VersionHistory/HistoryEventFooter.vue","../src/versions/VersionHistory/CurrentState.vue","../src/versions/VersionHistory/VersionLabel.vue","../src/versions/VersionHistory/VersionItem.vue","../src/versions/VersionHistory/VersionLimitInfo.vue","../src/versions/VersionHistory/constants.ts","../src/versions/VersionHistory/VersionHistory.vue","../src/versions/CreateVersionForm/CreateVersionForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { KdsIcon } from \"@knime/kds-components\";\n\ntype Props = {\n isSelected: boolean;\n isFirstItem: boolean;\n isLastItem: boolean;\n};\n\ndefineProps<Props>();\n</script>\n\n<template>\n <div class=\"history-event-wrapper\">\n <div class=\"history-event-decorator\">\n <div v-if=\"!isFirstItem\" class=\"history-event-line-top\" />\n <KdsIcon\n class=\"history-event-icon\"\n :name=\"isSelected ? 'circle-success' : 'circle-unchecked'\"\n size=\"small\"\n />\n <div v-if=\"!isLastItem\" class=\"history-event-line-bottom\" />\n </div>\n\n <div class=\"card-wrapper\">\n <slot />\n </div>\n </div>\n</template>\n\n<style scoped>\n.history-event-wrapper {\n display: flex;\n}\n\n.history-event-decorator {\n position: relative;\n display: flex;\n flex-shrink: 0;\n justify-content: center;\n width: var(--kds-dimension-component-width-0-75x);\n margin: 0 var(--kds-spacing-container-0-75x);\n}\n\n.history-event-line-top {\n position: absolute;\n top: calc(var(--kds-spacing-container-0-37x) * -1);\n height: calc(\n var(--kds-spacing-container-1x) + var(--kds-spacing-container-0-37x)\n );\n border-left: var(--kds-border-base-subtle);\n}\n\n.history-event-line-bottom {\n position: absolute;\n top: calc(\n var(--kds-spacing-container-1x) + var(--kds-spacing-container-0-37x) +\n var(--kds-spacing-container-0-37x)\n );\n bottom: calc(var(--kds-spacing-container-0-37x) * -1);\n border-left: var(--kds-border-base-subtle);\n}\n\n.history-event-icon {\n position: absolute;\n top: var(--kds-spacing-container-1x);\n}\n\n.card-wrapper {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-37x);\n min-width: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { KdsAvatar } from \"@knime/kds-components\";\n\nimport type { WithAvatar } from \"./types\";\n\ntype Props = WithAvatar & {\n author: string;\n};\n\ndefineProps<Props>();\n\nconst nameInitials = (name: string) =>\n name\n .split(/[., _-]/, 2)\n .map((part) => part.charAt(0).toUpperCase())\n .join(\"\");\n</script>\n\n<template>\n <div class=\"avatar-and-name-wrapper\">\n <KdsAvatar\n :src=\"avatar.src\"\n :title=\"author\"\n :initials=\"nameInitials(author)\"\n />\n <span class=\"author-name\">{{ author }}</span>\n </div>\n</template>\n\n<style scoped>\n.avatar-and-name-wrapper {\n display: flex;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n}\n\n.author-name {\n font: var(--kds-font-base-subtext-small);\n color: var(--kds-color-text-and-icon-neutral);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from \"vue\";\n\nimport { formatDateTimeString, formatLocalDateTimeString } from \"@knime/utils\";\n\nimport type { NamedItemVersion } from \"./types\";\n\ntype Props = {\n date: string;\n version?: NamedItemVersion[\"version\"];\n};\n\nconst { version, date } = defineProps<Props>();\n\n// Render the hidden non-local format on the server / first paint to reserve the\n// space and avoid content jumping once the localized value swaps in after mount\nconst isMounted = ref(false);\nconst localDateTime = computed(() =>\n isMounted.value\n ? formatLocalDateTimeString(date, true)\n : formatDateTimeString(date, true),\n);\n\nonMounted(() => {\n isMounted.value = true;\n});\n</script>\n\n<template>\n <span class=\"history-event-footer\">\n Created on\n <time :title=\"date\" :datetime=\"date\" :class=\"{ hidden: !isMounted }\">{{\n localDateTime\n }}</time>\n <template v-if=\"version\">– Version {{ version }}</template>\n </span>\n</template>\n\n<style scoped>\n.history-event-footer {\n font: var(--kds-font-base-subtext-small);\n color: var(--kds-color-text-and-icon-subtle);\n}\n\n.hidden {\n visibility: hidden;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport {\n KdsButton,\n type KdsMenuActionItem,\n KdsMenuButton,\n KdsSelectableCard,\n} from \"@knime/kds-components\";\n\nimport HistoryEvent from \"./HistoryEvent.vue\";\nimport HistoryEventAuthor from \"./HistoryEventAuthor.vue\";\nimport HistoryEventFooter from \"./HistoryEventFooter.vue\";\nimport type { ItemSavepoint, WithAvatar, WithLabels } from \"./types\";\n\ntype Props = {\n currentSavepoint: ItemSavepoint & WithAvatar & WithLabels;\n isSelected: boolean;\n hasEditCapability: boolean;\n hasPreviousVersion: boolean;\n hasVersionLimit: boolean;\n isVersionLimitExceeded?: boolean;\n};\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n createVersion: [];\n discard: [];\n select: [];\n}>();\n\nconst menuItems = computed<KdsMenuActionItem[]>(() =>\n props.hasEditCapability && props.hasPreviousVersion\n ? [\n {\n id: \"discard\",\n text: \"Discard\",\n handler: () => emit(\"discard\"),\n },\n ]\n : [],\n);\n</script>\n\n<template>\n <HistoryEvent\n :is-selected\n is-first-item\n :is-last-item=\"!hasPreviousVersion && !hasVersionLimit\"\n >\n <KdsSelectableCard\n :model-value=\"isSelected\"\n headline=\"Draft\"\n ariaLabel=\"Savepoint history event\"\n @update:model-value=\"!isSelected && $emit('select')\"\n >\n <template v-if=\"menuItems.length\" #header-actions>\n <KdsMenuButton\n :items=\"menuItems\"\n variant=\"transparent\"\n leading-icon=\"more-actions\"\n ariaLabel=\"More actions\"\n />\n </template>\n\n <div class=\"content-wrapper\">\n <HistoryEventAuthor\n :author=\"currentSavepoint.author\"\n :avatar=\"currentSavepoint.avatar\"\n />\n\n <HistoryEventFooter :date=\"currentSavepoint.lastEditedOn\" />\n </div>\n </KdsSelectableCard>\n\n <KdsButton\n v-if=\"hasEditCapability && !isVersionLimitExceeded\"\n label=\"Create version\"\n @click.stop=\"$emit('createVersion')\"\n />\n </HistoryEvent>\n</template>\n\n<style scoped>\n.content-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-37x);\n padding: 0 var(--kds-spacing-container-1x) var(--kds-spacing-container-1x);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useTemplateRef } from \"vue\";\n\nimport {\n KdsDescription,\n KdsPopover,\n type KdsPopoverExpose,\n KdsToggleButton,\n} from \"@knime/kds-components\";\n\nimport type { AssignedLabel } from \"./types\";\n\ntype Props = {\n label: AssignedLabel;\n};\n\ndefineProps<Props>();\n\nconst isPopoverOpen = defineModel<boolean>({ default: false });\nconst popoverEl = useTemplateRef<KdsPopoverExpose>(\"popover\");\n</script>\n\n<template>\n <KdsToggleButton\n v-model=\"isPopoverOpen\"\n data-kds-card-secondary-action\n :label=\"label.label.name\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"isPopoverOpen\"\n :aria-controls=\"popoverEl?.popoverId\"\n size=\"xsmall\"\n :style=\"popoverEl?.anchorStyle\"\n />\n\n <KdsPopover\n ref=\"popover\"\n v-model=\"isPopoverOpen\"\n placement=\"bottom-left\"\n role=\"dialog\"\n aria-label=\"Label details\"\n >\n <div class=\"label-popover-container\">\n <div class=\"label-title\">{{ label.label.name }}</div>\n <KdsDescription :text=\"label.label.description\" />\n <KdsDescription v-if=\"label.message\" :text=\"label.message\" />\n </div>\n </KdsPopover>\n</template>\n\n<style scoped>\n.label-popover-container {\n display: flex;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-5x);\n align-items: flex-start;\n max-width: var(--kds-dimension-component-width-20x);\n max-height: var(--kds-dimension-component-height-20x);\n padding: var(--kds-spacing-container-0-75x) var(--kds-spacing-container-1x);\n overflow-y: auto;\n background-color: var(--kds-color-surface-default);\n border-radius: var(--kds-border-radius-container-0-50x);\n box-shadow: var(--kds-elevation-level-3);\n}\n\n.label-title {\n font: var(--kds-font-base-body-small-strong);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport {\n KdsDescription,\n type KdsMenuActionItem,\n KdsMenuButton,\n KdsSelectableCard,\n} from \"@knime/kds-components\";\n\nimport HistoryEvent from \"./HistoryEvent.vue\";\nimport HistoryEventAuthor from \"./HistoryEventAuthor.vue\";\nimport HistoryEventFooter from \"./HistoryEventFooter.vue\";\nimport VersionLabel from \"./VersionLabel.vue\";\nimport type { NamedItemVersion, WithAvatar, WithLabels } from \"./types\";\n\ntype Props = {\n version: NamedItemVersion & WithAvatar & WithLabels;\n isSelected: boolean;\n hasAdminRights: boolean;\n hasEditCapability: boolean;\n isFirstItem: boolean;\n isLastItem: boolean;\n};\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n select: [selectionStatus: boolean];\n delete: [];\n restore: [];\n}>();\n\nconst toggleVersionSelection = () => {\n emit(\"select\", !props.isSelected);\n};\n\nconst menuItems = computed<KdsMenuActionItem[]>(() =>\n [\n props.hasEditCapability && {\n id: \"show\",\n text: props.isSelected ? \"Deselect this version\" : \"Show this version\",\n handler: toggleVersionSelection,\n },\n props.hasEditCapability && {\n id: \"restore\",\n text: \"Restore this version\",\n handler: () => emit(\"restore\"),\n },\n props.hasAdminRights && {\n id: \"delete\",\n text: \"Delete this version\",\n handler: () => emit(\"delete\"),\n },\n ].filter((i) => i !== false),\n);\n</script>\n\n<template>\n <HistoryEvent :is-selected :is-first-item :is-last-item>\n <KdsSelectableCard\n :model-value=\"isSelected\"\n :headline=\"version.title\"\n ariaLabel=\"Version history event\"\n @update:model-value=\"toggleVersionSelection\"\n >\n <template v-if=\"menuItems.length\" #header-actions>\n <KdsMenuButton\n :items=\"menuItems\"\n variant=\"transparent\"\n leading-icon=\"more-actions\"\n ariaLabel=\"More actions\"\n />\n </template>\n\n <div class=\"content-wrapper\">\n <HistoryEventAuthor :author=\"version.author\" :avatar=\"version.avatar\" />\n\n <KdsDescription\n v-if=\"version.description\"\n :text=\"version.description\"\n />\n\n <div class=\"labels-wrapper\">\n <VersionLabel\n v-for=\"label in version.labels\"\n :key=\"label.labelId\"\n :label=\"label\"\n />\n </div>\n\n <HistoryEventFooter\n :version=\"version.version\"\n :date=\"version.createdOn\"\n />\n </div>\n </KdsSelectableCard>\n </HistoryEvent>\n</template>\n\n<style scoped>\n.content-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-37x);\n padding: 0 var(--kds-spacing-container-1x) var(--kds-spacing-container-1x);\n}\n\n.labels-wrapper {\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}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { KdsCard, KdsDescription, KdsLinkButton } from \"@knime/kds-components\";\n\nimport HistoryEvent from \"./HistoryEvent.vue\";\nimport type { VersionLimit } from \"./types\";\n\nconst {\n versionLimit,\n upgradeUrl = undefined,\n isPrivate = false,\n} = defineProps<{\n versionLimit: Required<VersionLimit>;\n upgradeUrl?: string;\n isPrivate?: boolean;\n}>();\n\nconst isLimitReached = computed(\n () => versionLimit.currentUsage >= versionLimit.limit,\n);\n\nconst headline = computed(() => {\n if (isLimitReached.value) {\n return `You've reached the maximum of ${versionLimit.limit} versions.`;\n } else {\n return `Using ${versionLimit.currentUsage} of ${versionLimit.limit} versions.`;\n }\n});\n</script>\n\n<template>\n <HistoryEvent :is-selected=\"false\" :is-first-item=\"false\" is-last-item>\n <KdsCard variant=\"filled\" :headline=\"headline\">\n <template v-if=\"upgradeUrl\" #header-actions>\n <KdsLinkButton label=\"Upgrade\" :to=\"upgradeUrl\" />\n </template>\n\n <div class=\"content-wrapper\">\n <KdsDescription\n :text=\"`Upgrade to use unlimited versions${isPrivate ? ' for private items.' : '.'}`\"\n />\n </div>\n </KdsCard>\n </HistoryEvent>\n</template>\n\n<style scoped>\n.content-wrapper {\n padding: 0 var(--kds-spacing-container-1x) var(--kds-spacing-container-1x);\n}\n</style>\n","export const VERSION_DEFAULT_LIMIT = 10;\nexport const CURRENT_STATE_VERSION = \"current-state\";\nexport const MOST_RECENT_VERSION = \"most-recent\";\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport {\n KdsButton,\n KdsPanel,\n type KdsPanelHeadlineTrailingAction,\n} from \"@knime/kds-components\";\n\nimport CurrentState from \"./CurrentState.vue\";\nimport VersionItem from \"./VersionItem.vue\";\nimport VersionLimitInfo from \"./VersionLimitInfo.vue\";\nimport { CURRENT_STATE_VERSION } from \"./constants\";\nimport type { NamedItemVersion, VersionHistoryProps } from \"./types\";\n\nconst props = defineProps<VersionHistoryProps>();\n\nconst emit = defineEmits<{\n close: [];\n loadAll: [];\n create: [];\n delete: [version: NamedItemVersion[\"version\"]];\n restore: [version: NamedItemVersion[\"version\"]];\n select: [version: NamedItemVersion[\"version\"]];\n discardCurrentState: [];\n}>();\n\nconst isVersionLimitExceeded = computed(() => {\n return (\n props.versionLimit?.limit !== undefined &&\n props.versionLimit.currentUsage >= props.versionLimit.limit\n );\n});\n\nconst headlineTrailingActions = computed<KdsPanelHeadlineTrailingAction[]>(\n () => [\n {\n type: \"button\",\n props: {\n leadingIcon: \"x-close\",\n ariaLabel: \"Close\",\n variant: \"transparent\",\n },\n onClick: () => emit(\"close\"),\n },\n ],\n);\n</script>\n\n<template>\n <KdsPanel\n headline=\"Version history\"\n :headline-trailing-actions=\"headlineTrailingActions\"\n >\n <div class=\"version-history-wrapper\">\n <CurrentState\n v-if=\"unversionedSavepoint\"\n :current-savepoint=\"unversionedSavepoint\"\n :is-selected=\"currentVersion === CURRENT_STATE_VERSION\"\n :has-edit-capability=\"hasEditCapability\"\n :has-previous-version=\"versionHistory.length > 0\"\n :has-version-limit=\"versionLimit?.limit !== undefined\"\n :is-version-limit-exceeded=\"isVersionLimitExceeded\"\n @select=\"$emit('select', CURRENT_STATE_VERSION)\"\n @create-version=\"$emit('create')\"\n @discard=\"$emit('discardCurrentState')\"\n />\n\n <VersionItem\n v-for=\"(historyEvent, index) in versionHistory\"\n :key=\"historyEvent.version\"\n :version=\"historyEvent\"\n :is-selected=\"historyEvent.version === currentVersion\"\n :has-admin-rights=\"hasAdminRights\"\n :has-edit-capability=\"hasEditCapability\"\n :is-first-item=\"!unversionedSavepoint && index === 0\"\n :is-last-item=\"\n index === versionHistory.length - 1 &&\n versionLimit?.limit === undefined\n \"\n @delete=\"$emit('delete', historyEvent.version)\"\n @restore=\"$emit('restore', historyEvent.version)\"\n @select=\"\n $emit('select', $event ? historyEvent.version : CURRENT_STATE_VERSION)\n \"\n />\n\n <VersionLimitInfo\n v-if=\"versionLimit?.limit !== undefined\"\n class=\"version-limit-info\"\n :version-limit=\"{\n limit: versionLimit.limit,\n currentUsage: versionLimit.currentUsage,\n }\"\n :upgrade-url\n :is-private\n />\n\n <KdsButton\n v-if=\"!hasLoadedAllVersions\"\n variant=\"transparent\"\n :disabled=\"loading\"\n :label=\"loading ? 'Loading...' : 'Load all'\"\n class=\"load-more-button\"\n @click=\"$emit('loadAll')\"\n />\n </div>\n </KdsPanel>\n</template>\n\n<style scoped>\n.version-history-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-75x);\n}\n\n.load-more-button {\n margin: 0 auto;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from \"vue\";\n\nimport {\n KdsDescription,\n KdsPanel,\n type KdsPanelButtonAction,\n type KdsPanelHeadlineTrailingAction,\n KdsTextInput,\n KdsTextarea,\n} from \"@knime/kds-components\";\n\nimport type { CreateVersionFormProps } from \"./types\";\n\nconst { isCreationPending = false } = defineProps<CreateVersionFormProps>();\n\nconst emit = defineEmits<{\n create: [{ name: string; description: string }];\n cancel: [hasUnsavedChanges: boolean];\n}>();\n\nconst versionName = ref(\"\");\nconst versionDescription = ref(\"\");\n\nconst doValidate = ref(false);\n\nconst isVersionNameInvalid = computed(() => {\n return doValidate.value && versionName.value.trim().length <= 0;\n});\n\nconst hasUnsavedChanges = computed(() => {\n return versionName.value !== \"\" || versionDescription.value !== \"\";\n});\n\nconst onCreate = async () => {\n doValidate.value = true;\n await nextTick();\n\n if (!isVersionNameInvalid.value) {\n emit(\"create\", {\n name: versionName.value.trim(),\n description: versionDescription.value,\n });\n }\n};\n\nconst headlineTrailingActions = computed<KdsPanelHeadlineTrailingAction[]>(\n () => [\n {\n type: \"button\",\n props: {\n leadingIcon: \"x-close\",\n ariaLabel: \"Close\",\n variant: \"transparent\",\n },\n onClick: () => emit(\"cancel\", hasUnsavedChanges.value),\n },\n ],\n);\n\nconst footerLeadingActions = computed<KdsPanelButtonAction[]>(() => [\n {\n type: \"button\",\n props: {\n label: \"Cancel\",\n variant: \"outlined\",\n },\n onClick: () => emit(\"cancel\", hasUnsavedChanges.value),\n },\n]);\n\nconst footerTrailingActions = computed<KdsPanelButtonAction[]>(() => [\n {\n type: \"button\",\n props: {\n label: \"Create\",\n variant: \"filled\",\n disabled: isVersionNameInvalid.value || isCreationPending,\n },\n onClick: onCreate,\n },\n]);\n</script>\n\n<template>\n <KdsPanel\n headline=\"Create version\"\n :headline-trailing-actions=\"headlineTrailingActions\"\n :footer-leading-actions=\"footerLeadingActions\"\n :footer-trailing-actions=\"footerTrailingActions\"\n >\n <div class=\"create-version-form-wrapper\">\n <KdsDescription\n text=\"Give your version a name and description. Versions can be used to create a deployment.\"\n class=\"create-version-form-description\"\n />\n\n <KdsTextInput\n v-model=\"versionName\"\n label=\"Version name\"\n type=\"text\"\n :error=\"isVersionNameInvalid\"\n :sub-text=\"\n isVersionNameInvalid\n ? 'Please enter at least 1 character.'\n : undefined\n \"\n />\n\n <KdsTextarea\n v-model=\"versionDescription\"\n label=\"Description\"\n class=\"description\"\n />\n </div>\n </KdsPanel>\n</template>\n\n<style scoped>\n.create-version-form-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--kds-spacing-container-1x);\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_createVNode","_unref","_renderSlot","_toDisplayString","_Fragment","_createTextVNode","_createBlock","$emit","_useModel","_normalizeStyle","_renderList"],"mappings":"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"}
1
+ {"version":3,"file":"versions.js","sources":["../src/versions/VersionHistory/HistoryEvent.vue","../src/versions/VersionHistory/HistoryEventAuthor.vue","../src/versions/VersionHistory/HistoryEventFooter.vue","../src/versions/VersionHistory/CurrentState.vue","../src/versions/VersionHistory/VersionLabel.vue","../src/versions/VersionHistory/VersionItem.vue","../src/versions/VersionHistory/VersionLimitInfo.vue","../src/versions/VersionHistory/constants.ts","../src/versions/VersionHistory/VersionHistory.vue","../src/versions/CreateVersionForm/CreateVersionForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { KdsIcon } from \"@knime/kds-components\";\n\ntype Props = {\n isSelected: boolean;\n isFirstItem: boolean;\n isLastItem: boolean;\n};\n\ndefineProps<Props>();\n</script>\n\n<template>\n <div class=\"history-event-wrapper\">\n <div class=\"history-event-decorator\">\n <div v-if=\"!isFirstItem\" class=\"history-event-line-top\" />\n <KdsIcon\n class=\"history-event-icon\"\n :name=\"isSelected ? 'circle-success' : 'circle-unchecked'\"\n size=\"small\"\n />\n <div v-if=\"!isLastItem\" class=\"history-event-line-bottom\" />\n </div>\n\n <div class=\"card-wrapper\">\n <slot />\n </div>\n </div>\n</template>\n\n<style scoped>\n.history-event-wrapper {\n display: flex;\n}\n\n.history-event-decorator {\n position: relative;\n display: flex;\n flex-shrink: 0;\n justify-content: center;\n width: var(--kds-dimension-component-width-0-75x);\n margin: 0 var(--kds-spacing-container-0-75x);\n}\n\n.history-event-line-top {\n position: absolute;\n top: calc(var(--kds-spacing-container-0-37x) * -1);\n height: calc(\n var(--kds-spacing-container-1x) + var(--kds-spacing-container-0-37x)\n );\n border-left: var(--kds-border-base-subtle);\n}\n\n.history-event-line-bottom {\n position: absolute;\n top: calc(\n var(--kds-spacing-container-1x) + var(--kds-spacing-container-0-37x) +\n var(--kds-spacing-container-0-37x)\n );\n bottom: calc(var(--kds-spacing-container-0-37x) * -1);\n border-left: var(--kds-border-base-subtle);\n}\n\n.history-event-icon {\n position: absolute;\n top: var(--kds-spacing-container-1x);\n}\n\n.card-wrapper {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-37x);\n min-width: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { KdsAvatar } from \"@knime/kds-components\";\n\nimport type { WithAvatar } from \"./types\";\n\ntype Props = WithAvatar & {\n author: string;\n};\n\ndefineProps<Props>();\n\nconst nameInitials = (name: string) =>\n name\n .split(/[., _-]/, 2)\n .map((part) => part.charAt(0).toUpperCase())\n .join(\"\");\n</script>\n\n<template>\n <div class=\"avatar-and-name-wrapper\">\n <KdsAvatar\n :src=\"avatar.src\"\n :tooltip=\"author\"\n :initials=\"nameInitials(author)\"\n />\n <span class=\"author-name\">{{ author }}</span>\n </div>\n</template>\n\n<style scoped>\n.avatar-and-name-wrapper {\n display: flex;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n}\n\n.author-name {\n font: var(--kds-font-base-subtext-small);\n color: var(--kds-color-text-and-icon-neutral);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from \"vue\";\n\nimport { vKdsTooltip } from \"@knime/kds-components\";\nimport { formatDateTimeString, formatLocalDateTimeString } from \"@knime/utils\";\n\nimport type { NamedItemVersion } from \"./types\";\n\ntype Props = {\n date: string;\n version?: NamedItemVersion[\"version\"];\n};\n\nconst { version, date } = defineProps<Props>();\n\n// Render the hidden non-local format on the server / first paint to reserve the\n// space and avoid content jumping once the localized value swaps in after mount\nconst isMounted = ref(false);\nconst localDateTime = computed(() =>\n isMounted.value\n ? formatLocalDateTimeString(date, true)\n : formatDateTimeString(date, true),\n);\n\nonMounted(() => {\n isMounted.value = true;\n});\n</script>\n\n<template>\n <span class=\"history-event-footer\">\n Created on\n <time\n v-kds-tooltip=\"date\"\n :datetime=\"date\"\n :class=\"{ hidden: !isMounted }\"\n >{{ localDateTime }}</time\n >\n <template v-if=\"version\">– Version {{ version }}</template>\n </span>\n</template>\n\n<style scoped>\n.history-event-footer {\n font: var(--kds-font-base-subtext-small);\n color: var(--kds-color-text-and-icon-subtle);\n}\n\n.hidden {\n visibility: hidden;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport {\n KdsButton,\n type KdsMenuActionItem,\n KdsMenuButton,\n KdsSelectableCard,\n} from \"@knime/kds-components\";\n\nimport HistoryEvent from \"./HistoryEvent.vue\";\nimport HistoryEventAuthor from \"./HistoryEventAuthor.vue\";\nimport HistoryEventFooter from \"./HistoryEventFooter.vue\";\nimport type { ItemSavepoint, WithAvatar, WithLabels } from \"./types\";\n\ntype Props = {\n currentSavepoint: ItemSavepoint & WithAvatar & WithLabels;\n isSelected: boolean;\n hasEditCapability: boolean;\n hasPreviousVersion: boolean;\n hasVersionLimit: boolean;\n isVersionLimitExceeded?: boolean;\n};\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n createVersion: [];\n discard: [];\n select: [];\n}>();\n\nconst menuItems = computed<KdsMenuActionItem[]>(() =>\n props.hasEditCapability && props.hasPreviousVersion\n ? [\n {\n id: \"discard\",\n text: \"Discard\",\n handler: () => emit(\"discard\"),\n },\n ]\n : [],\n);\n</script>\n\n<template>\n <HistoryEvent\n :is-selected\n is-first-item\n :is-last-item=\"!hasPreviousVersion && !hasVersionLimit\"\n >\n <KdsSelectableCard\n :model-value=\"isSelected\"\n headline=\"Draft\"\n ariaLabel=\"Savepoint history event\"\n @update:model-value=\"!isSelected && $emit('select')\"\n >\n <template v-if=\"menuItems.length\" #header-actions>\n <KdsMenuButton\n :items=\"menuItems\"\n variant=\"transparent\"\n leading-icon=\"more-actions\"\n ariaLabel=\"More actions\"\n />\n </template>\n\n <div class=\"content-wrapper\">\n <HistoryEventAuthor\n :author=\"currentSavepoint.author\"\n :avatar=\"currentSavepoint.avatar\"\n />\n\n <HistoryEventFooter :date=\"currentSavepoint.lastEditedOn\" />\n </div>\n </KdsSelectableCard>\n\n <KdsButton\n v-if=\"hasEditCapability && !isVersionLimitExceeded\"\n label=\"Create version\"\n @click.stop=\"$emit('createVersion')\"\n />\n </HistoryEvent>\n</template>\n\n<style scoped>\n.content-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-37x);\n padding: 0 var(--kds-spacing-container-1x) var(--kds-spacing-container-1x);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useTemplateRef } from \"vue\";\n\nimport {\n KdsDescription,\n KdsPopover,\n type KdsPopoverExpose,\n KdsToggleButton,\n} from \"@knime/kds-components\";\n\nimport type { AssignedLabel } from \"./types\";\n\ntype Props = {\n label: AssignedLabel;\n};\n\ndefineProps<Props>();\n\nconst isPopoverOpen = defineModel<boolean>({ default: false });\nconst popoverEl = useTemplateRef<KdsPopoverExpose>(\"popover\");\n</script>\n\n<template>\n <KdsToggleButton\n v-model=\"isPopoverOpen\"\n data-kds-card-secondary-action\n :label=\"label.label.name\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"isPopoverOpen\"\n :aria-controls=\"popoverEl?.popoverId\"\n size=\"xsmall\"\n :style=\"popoverEl?.anchorStyle\"\n />\n\n <KdsPopover\n ref=\"popover\"\n v-model=\"isPopoverOpen\"\n placement=\"bottom-left\"\n role=\"dialog\"\n aria-label=\"Label details\"\n >\n <div class=\"label-popover-container\">\n <div class=\"label-title\">{{ label.label.name }}</div>\n <KdsDescription :text=\"label.label.description\" />\n <KdsDescription v-if=\"label.message\" :text=\"label.message\" />\n </div>\n </KdsPopover>\n</template>\n\n<style scoped>\n.label-popover-container {\n display: flex;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-5x);\n align-items: flex-start;\n max-width: var(--kds-dimension-component-width-20x);\n max-height: var(--kds-dimension-component-height-20x);\n padding: var(--kds-spacing-container-0-75x) var(--kds-spacing-container-1x);\n overflow-y: auto;\n background-color: var(--kds-color-surface-default);\n border-radius: var(--kds-border-radius-container-0-50x);\n box-shadow: var(--kds-elevation-level-3);\n}\n\n.label-title {\n font: var(--kds-font-base-body-small-strong);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport {\n KdsDescription,\n type KdsMenuActionItem,\n KdsMenuButton,\n KdsSelectableCard,\n} from \"@knime/kds-components\";\n\nimport HistoryEvent from \"./HistoryEvent.vue\";\nimport HistoryEventAuthor from \"./HistoryEventAuthor.vue\";\nimport HistoryEventFooter from \"./HistoryEventFooter.vue\";\nimport VersionLabel from \"./VersionLabel.vue\";\nimport type { NamedItemVersion, WithAvatar, WithLabels } from \"./types\";\n\ntype Props = {\n version: NamedItemVersion & WithAvatar & WithLabels;\n isSelected: boolean;\n hasAdminRights: boolean;\n hasEditCapability: boolean;\n isFirstItem: boolean;\n isLastItem: boolean;\n};\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n select: [selectionStatus: boolean];\n delete: [];\n restore: [];\n}>();\n\nconst toggleVersionSelection = () => {\n emit(\"select\", !props.isSelected);\n};\n\nconst menuItems = computed<KdsMenuActionItem[]>(() =>\n [\n props.hasEditCapability && {\n id: \"show\",\n text: props.isSelected ? \"Deselect this version\" : \"Show this version\",\n handler: toggleVersionSelection,\n },\n props.hasEditCapability && {\n id: \"restore\",\n text: \"Restore this version\",\n handler: () => emit(\"restore\"),\n },\n props.hasAdminRights && {\n id: \"delete\",\n text: \"Delete this version\",\n handler: () => emit(\"delete\"),\n },\n ].filter((i) => i !== false),\n);\n</script>\n\n<template>\n <HistoryEvent :is-selected :is-first-item :is-last-item>\n <KdsSelectableCard\n :model-value=\"isSelected\"\n :headline=\"version.title\"\n ariaLabel=\"Version history event\"\n @update:model-value=\"toggleVersionSelection\"\n >\n <template v-if=\"menuItems.length\" #header-actions>\n <KdsMenuButton\n :items=\"menuItems\"\n variant=\"transparent\"\n leading-icon=\"more-actions\"\n ariaLabel=\"More actions\"\n />\n </template>\n\n <div class=\"content-wrapper\">\n <HistoryEventAuthor :author=\"version.author\" :avatar=\"version.avatar\" />\n\n <KdsDescription\n v-if=\"version.description\"\n :text=\"version.description\"\n />\n\n <div class=\"labels-wrapper\">\n <VersionLabel\n v-for=\"label in version.labels\"\n :key=\"label.labelId\"\n :label=\"label\"\n />\n </div>\n\n <HistoryEventFooter\n :version=\"version.version\"\n :date=\"version.createdOn\"\n />\n </div>\n </KdsSelectableCard>\n </HistoryEvent>\n</template>\n\n<style scoped>\n.content-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-37x);\n padding: 0 var(--kds-spacing-container-1x) var(--kds-spacing-container-1x);\n}\n\n.labels-wrapper {\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}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { KdsCard, KdsDescription, KdsLinkButton } from \"@knime/kds-components\";\n\nimport HistoryEvent from \"./HistoryEvent.vue\";\nimport type { VersionLimit } from \"./types\";\n\nconst {\n versionLimit,\n upgradeUrl = undefined,\n isPrivate = false,\n} = defineProps<{\n versionLimit: Required<VersionLimit>;\n upgradeUrl?: string;\n isPrivate?: boolean;\n}>();\n\nconst isLimitReached = computed(\n () => versionLimit.currentUsage >= versionLimit.limit,\n);\n\nconst headline = computed(() => {\n if (isLimitReached.value) {\n return `You've reached the maximum of ${versionLimit.limit} versions.`;\n } else {\n return `Using ${versionLimit.currentUsage} of ${versionLimit.limit} versions.`;\n }\n});\n</script>\n\n<template>\n <HistoryEvent :is-selected=\"false\" :is-first-item=\"false\" is-last-item>\n <KdsCard variant=\"filled\" :headline=\"headline\">\n <template v-if=\"upgradeUrl\" #header-actions>\n <KdsLinkButton label=\"Upgrade\" :to=\"upgradeUrl\" />\n </template>\n\n <div class=\"content-wrapper\">\n <KdsDescription\n :text=\"`Upgrade to use unlimited versions${isPrivate ? ' for private items.' : '.'}`\"\n />\n </div>\n </KdsCard>\n </HistoryEvent>\n</template>\n\n<style scoped>\n.content-wrapper {\n padding: 0 var(--kds-spacing-container-1x) var(--kds-spacing-container-1x);\n}\n</style>\n","export const VERSION_DEFAULT_LIMIT = 10;\nexport const CURRENT_STATE_VERSION = \"current-state\";\nexport const MOST_RECENT_VERSION = \"most-recent\";\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport {\n KdsButton,\n KdsPanel,\n type KdsPanelHeadlineTrailingAction,\n} from \"@knime/kds-components\";\n\nimport CurrentState from \"./CurrentState.vue\";\nimport VersionItem from \"./VersionItem.vue\";\nimport VersionLimitInfo from \"./VersionLimitInfo.vue\";\nimport { CURRENT_STATE_VERSION } from \"./constants\";\nimport type { NamedItemVersion, VersionHistoryProps } from \"./types\";\n\nconst props = defineProps<VersionHistoryProps>();\n\nconst emit = defineEmits<{\n close: [];\n loadAll: [];\n create: [];\n delete: [version: NamedItemVersion[\"version\"]];\n restore: [version: NamedItemVersion[\"version\"]];\n select: [version: NamedItemVersion[\"version\"]];\n discardCurrentState: [];\n}>();\n\nconst isVersionLimitExceeded = computed(() => {\n return (\n props.versionLimit?.limit !== undefined &&\n props.versionLimit.currentUsage >= props.versionLimit.limit\n );\n});\n\nconst headlineTrailingActions = computed<KdsPanelHeadlineTrailingAction[]>(\n () => [\n {\n type: \"button\",\n props: {\n leadingIcon: \"x-close\",\n ariaLabel: \"Close\",\n variant: \"transparent\",\n },\n onClick: () => emit(\"close\"),\n },\n ],\n);\n</script>\n\n<template>\n <KdsPanel\n headline=\"Version history\"\n :headline-trailing-actions=\"headlineTrailingActions\"\n >\n <div class=\"version-history-wrapper\">\n <CurrentState\n v-if=\"unversionedSavepoint\"\n :current-savepoint=\"unversionedSavepoint\"\n :is-selected=\"currentVersion === CURRENT_STATE_VERSION\"\n :has-edit-capability=\"hasEditCapability\"\n :has-previous-version=\"versionHistory.length > 0\"\n :has-version-limit=\"versionLimit?.limit !== undefined\"\n :is-version-limit-exceeded=\"isVersionLimitExceeded\"\n @select=\"$emit('select', CURRENT_STATE_VERSION)\"\n @create-version=\"$emit('create')\"\n @discard=\"$emit('discardCurrentState')\"\n />\n\n <VersionItem\n v-for=\"(historyEvent, index) in versionHistory\"\n :key=\"historyEvent.version\"\n :version=\"historyEvent\"\n :is-selected=\"historyEvent.version === currentVersion\"\n :has-admin-rights=\"hasAdminRights\"\n :has-edit-capability=\"hasEditCapability\"\n :is-first-item=\"!unversionedSavepoint && index === 0\"\n :is-last-item=\"\n index === versionHistory.length - 1 &&\n versionLimit?.limit === undefined\n \"\n @delete=\"$emit('delete', historyEvent.version)\"\n @restore=\"$emit('restore', historyEvent.version)\"\n @select=\"\n $emit('select', $event ? historyEvent.version : CURRENT_STATE_VERSION)\n \"\n />\n\n <VersionLimitInfo\n v-if=\"versionLimit?.limit !== undefined\"\n class=\"version-limit-info\"\n :version-limit=\"{\n limit: versionLimit.limit,\n currentUsage: versionLimit.currentUsage,\n }\"\n :upgrade-url\n :is-private\n />\n\n <KdsButton\n v-if=\"!hasLoadedAllVersions\"\n variant=\"transparent\"\n :disabled=\"loading\"\n :label=\"loading ? 'Loading...' : 'Load all'\"\n class=\"load-more-button\"\n @click=\"$emit('loadAll')\"\n />\n </div>\n </KdsPanel>\n</template>\n\n<style scoped>\n.version-history-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-75x);\n}\n\n.load-more-button {\n margin: 0 auto;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from \"vue\";\n\nimport {\n KdsDescription,\n KdsPanel,\n type KdsPanelButtonAction,\n type KdsPanelHeadlineTrailingAction,\n KdsTextInput,\n KdsTextarea,\n} from \"@knime/kds-components\";\n\nimport type { CreateVersionFormProps } from \"./types\";\n\nconst { isCreationPending = false } = defineProps<CreateVersionFormProps>();\n\nconst emit = defineEmits<{\n create: [{ name: string; description: string }];\n cancel: [hasUnsavedChanges: boolean];\n}>();\n\nconst versionName = ref(\"\");\nconst versionDescription = ref(\"\");\n\nconst doValidate = ref(false);\n\nconst isVersionNameInvalid = computed(() => {\n return doValidate.value && versionName.value.trim().length <= 0;\n});\n\nconst hasUnsavedChanges = computed(() => {\n return versionName.value !== \"\" || versionDescription.value !== \"\";\n});\n\nconst onCreate = async () => {\n doValidate.value = true;\n await nextTick();\n\n if (!isVersionNameInvalid.value) {\n emit(\"create\", {\n name: versionName.value.trim(),\n description: versionDescription.value,\n });\n }\n};\n\nconst headlineTrailingActions = computed<KdsPanelHeadlineTrailingAction[]>(\n () => [\n {\n type: \"button\",\n props: {\n leadingIcon: \"x-close\",\n ariaLabel: \"Close\",\n variant: \"transparent\",\n },\n onClick: () => emit(\"cancel\", hasUnsavedChanges.value),\n },\n ],\n);\n\nconst footerLeadingActions = computed<KdsPanelButtonAction[]>(() => [\n {\n type: \"button\",\n props: {\n label: \"Cancel\",\n variant: \"outlined\",\n },\n onClick: () => emit(\"cancel\", hasUnsavedChanges.value),\n },\n]);\n\nconst footerTrailingActions = computed<KdsPanelButtonAction[]>(() => [\n {\n type: \"button\",\n props: {\n label: \"Create\",\n variant: \"filled\",\n disabled: isVersionNameInvalid.value || isCreationPending,\n },\n onClick: onCreate,\n },\n]);\n</script>\n\n<template>\n <KdsPanel\n headline=\"Create version\"\n :headline-trailing-actions=\"headlineTrailingActions\"\n :footer-leading-actions=\"footerLeadingActions\"\n :footer-trailing-actions=\"footerTrailingActions\"\n >\n <div class=\"create-version-form-wrapper\">\n <KdsDescription\n text=\"Give your version a name and description. Versions can be used to create a deployment.\"\n class=\"create-version-form-description\"\n />\n\n <KdsTextInput\n v-model=\"versionName\"\n label=\"Version name\"\n type=\"text\"\n :error=\"isVersionNameInvalid\"\n :sub-text=\"\n isVersionNameInvalid\n ? 'Please enter at least 1 character.'\n : undefined\n \"\n />\n\n <KdsTextarea\n v-model=\"versionDescription\"\n label=\"Description\"\n class=\"description\"\n />\n </div>\n </KdsPanel>\n</template>\n\n<style scoped>\n.create-version-form-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--kds-spacing-container-1x);\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_createVNode","_unref","_renderSlot","_toDisplayString","_Fragment","_createTextVNode","_createBlock","$emit","_useModel","_normalizeStyle","_renderList"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knime/product-features",
3
- "version": "1.1.2",
3
+ "version": "1.2.0",
4
4
  "description": "Package containing composition patterns of KDS Components and KNIME business logic",
5
5
  "repository": {
6
6
  "type": "git",
@@ -48,15 +48,15 @@
48
48
  ],
49
49
  "peerDependencies": {
50
50
  "@vueuse/core": "~13.8.0",
51
- "es-toolkit": "^1.47.1",
51
+ "es-toolkit": "^1.49.0",
52
52
  "ofetch": "^1.5.1",
53
- "vue": "~3.5.0",
54
- "@knime/kds-components": "^1.1.3",
55
- "@knime/kds-styles": "^1.1.3"
53
+ "vue": "~3.5.0"
56
54
  },
57
55
  "dependencies": {
58
- "@knime/utils": "^1.11.1",
59
- "consola": "^3.4.2"
56
+ "consola": "^3.4.2",
57
+ "@knime/kds-components": "^2.0.0",
58
+ "@knime/kds-styles": "^2.0.0",
59
+ "@knime/utils": "^1.12.0"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@storybook/addon-docs": "^10.4.6",
@@ -65,11 +65,11 @@
65
65
  "@vue/test-utils": "^2.4.11",
66
66
  "@vue/tsconfig": "^0.9.1",
67
67
  "@vueuse/core": "~14.3.0",
68
- "es-toolkit": "^1.47.1",
68
+ "es-toolkit": "^1.49.0",
69
69
  "flush-promises": "^1.0.2",
70
70
  "mock-xmlhttprequest": "^8.4.1",
71
71
  "ofetch": "^1.5.1",
72
- "prettier": "3.8.4",
72
+ "prettier": "3.8.5",
73
73
  "prettier-plugin-vue": "^1.1.6",
74
74
  "storybook": "^10.4.6",
75
75
  "ts-morph": "^28.0.0",
@@ -77,10 +77,8 @@
77
77
  "vite-plugin-dts": "^4.5.4",
78
78
  "vite-plugin-lib-inject-css": "^2.2.2",
79
79
  "vite-svg-loader": "^5.1.1",
80
- "vue": "3.5.38",
81
- "vue-tsc": "^3.3.4",
82
- "@knime/kds-components": "^1.1.3",
83
- "@knime/kds-styles": "^1.1.3"
80
+ "vue": "3.5.39",
81
+ "vue-tsc": "^3.3.4"
84
82
  },
85
83
  "engines": {
86
84
  "node": "24.10.0",