@knime/kds-rich-text-editor 0.31.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @knime/kds-rich-text-editor
2
2
 
3
+ ## 1.0.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [8f7a331]
8
+ - Updated dependencies [a05b472]
9
+ - @knime/kds-components@1.0.0
10
+ - @knime/kds-styles@1.0.0
11
+
12
+ ## 0.31.4
13
+
14
+ ### Patch Changes
15
+
16
+ - ee5945e: Remove toolbar animation from rich text editor, fix minor font styling issues
17
+ - Updated dependencies [53459fd]
18
+ - @knime/kds-components@0.31.4
19
+ - @knime/kds-styles@0.31.4
20
+
3
21
  ## 0.31.3
4
22
 
5
23
  ### Patch Changes
package/dist/index.css CHANGED
@@ -27,11 +27,10 @@
27
27
  }
28
28
 
29
29
  .editor-wrapper {
30
- &[data-v-656edd08] {
30
+ &[data-v-819d979a] {
31
31
  /* Fixed 44px toolbar height per the design (28px content + 8px padding on
32
- * each side). Defined explicitly so the toolbar expand/collapse transition
33
- * has a concrete target height; the small toolbar buttons (24px) center
34
- * within the content area. */
32
+ * each side); the small toolbar buttons (24px) center within the content
33
+ * area. */
35
34
  --toolbar-height: calc(
36
35
  var(--kds-dimension-component-height-1-75x) +
37
36
  var(--kds-spacing-container-0-5x) * 2
@@ -40,16 +39,16 @@
40
39
  position: relative;
41
40
  isolation: isolate;
42
41
  }
43
- &.disabled[data-v-656edd08] {
42
+ &.disabled[data-v-819d979a] {
44
43
  color: var(--kds-color-text-and-icon-disabled);
45
44
  }
46
45
  }
47
46
 
48
47
  /* stylelint-disable selector-class-pattern */
49
48
  .rich-text-editor {
50
- &[data-v-656edd08] {
49
+ &[data-v-819d979a] {
51
50
  height: 100%;
52
- max-height: var(--c8f7b19c);
51
+ max-height: var(--v7f4eb7a6);
53
52
  padding: var(--kds-spacing-container-0-5x);
54
53
  overflow-y: auto;
55
54
 
@@ -57,16 +56,17 @@
57
56
  /* stylelint-enable selector-class-pattern */
58
57
  }
59
58
  &.editable {
60
- &[data-v-656edd08] {
59
+ &[data-v-819d979a] {
61
60
  cursor: text;
62
61
  background: var(--kds-color-background-input-initial);
63
62
  }
64
- &[data-v-656edd08] .ProseMirror {
65
- min-height: var(--v7aa834f8);
63
+ &[data-v-819d979a] .ProseMirror {
64
+ min-height: var(--b3131410);
66
65
  }
67
66
  }
68
- &[data-v-656edd08] .ProseMirror {
67
+ &[data-v-819d979a] .ProseMirror {
69
68
  height: 100%;
69
+ font: var(--kds-font-base-body-small);
70
70
 
71
71
  /* The following rich text styles are kept in sync with KdsDescription. */
72
72
  p {
@@ -175,7 +175,7 @@ a {
175
175
  margin-left: var(--kds-spacing-container-0-12x);
176
176
  content: "";
177
177
  background-color: var(--link-color);
178
- mask-image: var(--v8d1d5f60);
178
+ mask-image: var(--v78652478);
179
179
  mask-repeat: no-repeat;
180
180
  mask-size: contain;
181
181
  }
@@ -224,34 +224,34 @@ td {
224
224
  }
225
225
  }
226
226
  }
227
- &[data-v-656edd08] .ProseMirror:focus-visible,
228
- &[data-v-656edd08] .ProseMirror:focus {
227
+ &[data-v-819d979a] .ProseMirror:focus-visible,
228
+ &[data-v-819d979a] .ProseMirror:focus {
229
229
  outline: transparent;
230
230
  }
231
231
  }
232
232
  .editor-wrapper.with-border {
233
- &[data-v-656edd08] {
233
+ &[data-v-819d979a] {
234
234
  border: var(--kds-border-action-input);
235
235
  border-radius: var(--kds-border-radius-container-0-37x);
236
236
  }
237
- &.disabled[data-v-656edd08] {
237
+ &.disabled[data-v-819d979a] {
238
238
  border: var(--kds-border-action-disabled);
239
239
  }
240
- & .toolbar-wrapper[data-v-656edd08] {
240
+ & .toolbar-wrapper[data-v-819d979a] {
241
241
  border-top-left-radius: var(--kds-border-radius-container-0-37x);
242
242
  border-top-right-radius: var(--kds-border-radius-container-0-37x);
243
243
  }
244
- & .rich-text-editor[data-v-656edd08] {
244
+ & .rich-text-editor[data-v-819d979a] {
245
245
  border-bottom-right-radius: var(--kds-border-radius-container-0-37x);
246
246
  border-bottom-left-radius: var(--kds-border-radius-container-0-37x);
247
247
  }
248
248
  }
249
- .editor-wrapper.show-focus-ring[data-v-656edd08] {
249
+ .editor-wrapper.show-focus-ring[data-v-819d979a] {
250
250
  outline: var(--kds-border-action-focused);
251
251
  outline-offset: var(--kds-spacing-offset-focus);
252
252
  }
253
253
  .embedded-toolbar {
254
- &[data-v-656edd08] {
254
+ &[data-v-819d979a] {
255
255
  height: var(--toolbar-height);
256
256
  padding: var(--kds-spacing-container-0-5x);
257
257
  overflow-x: auto;
@@ -262,24 +262,10 @@ td {
262
262
  border-bottom: var(--kds-border-base-muted);
263
263
  -ms-overflow-style: none; /* needed to hide scroll bar in edge */
264
264
  }
265
- &[data-v-656edd08]::-webkit-scrollbar {
265
+ &[data-v-819d979a]::-webkit-scrollbar {
266
266
  display: none;
267
267
  }
268
268
  }
269
- .expand-enter-active[data-v-656edd08],
270
- .expand-leave-active[data-v-656edd08] {
271
- transition: all 0.15s ease;
272
- }
273
- .expand-enter-from[data-v-656edd08],
274
- .expand-leave-to[data-v-656edd08] {
275
- height: 0;
276
- opacity: 0;
277
- }
278
- .expand-enter-to[data-v-656edd08],
279
- .expand-leave-from[data-v-656edd08] {
280
- height: var(--toolbar-height);
281
- opacity: 1;
282
- }
283
269
 
284
270
  .kds-rich-text-input[data-v-134ca24c] {
285
271
  display: flex;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { defineComponent, ref, watch, nextTick, computed, openBlock, createBlock, unref, withCtx, createElementVNode, normalizeClass, createVNode, createCommentVNode, onMounted, onUnmounted, createElementBlock, Fragment, renderSlot, renderList, withModifiers, withKeys, useCssVars, useSlots, useModel, useId, Transition, mergeProps, toHandlers, mergeModels, createPropsRestProxy, useTemplateRef } from 'vue';
1
+ import { defineComponent, ref, watch, nextTick, computed, openBlock, createBlock, unref, withCtx, createElementVNode, normalizeClass, createVNode, createCommentVNode, onMounted, onUnmounted, createElementBlock, Fragment, renderSlot, renderList, withModifiers, withKeys, useCssVars, useSlots, useModel, useId, mergeProps, toHandlers, mergeModels, createPropsRestProxy, useTemplateRef } from 'vue';
2
2
  import CharacterCount from '@tiptap/extension-character-count';
3
3
  import StarterKit from '@tiptap/starter-kit';
4
4
  import { Extension, useEditor, EditorContent } from '@tiptap/vue-3';
@@ -741,9 +741,9 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
741
741
  emits: /* @__PURE__ */ mergeModels(["blur"], ["update:modelValue"]),
742
742
  setup(__props, { expose: __expose, emit: __emit }) {
743
743
  useCssVars((_ctx) => ({
744
- "c8f7b19c": maxHeightStyle.value,
745
- "v7aa834f8": minHeightStyle.value,
746
- "v8d1d5f60": externalIcon
744
+ "v7f4eb7a6": maxHeightStyle.value,
745
+ "b3131410": minHeightStyle.value,
746
+ "v78652478": externalIcon
747
747
  }));
748
748
  const hardCharacterLimit = Math.max(
749
749
  __props.characterLimit.maxCharacters ?? 1e3,
@@ -906,46 +906,34 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
906
906
  }
907
907
  ])
908
908
  }, [
909
- hasTools.value ? (openBlock(), createBlock(Transition, {
909
+ hasTools.value && unref(editor) && __props.editable && !__props.disabled ? (openBlock(), createElementBlock("div", {
910
910
  key: 0,
911
- name: "expand",
912
- css: !unref(hasCustomToolbar)
913
- }, {
914
- default: withCtx(() => [
915
- unref(editor) && __props.editable && !__props.disabled ? (openBlock(), createElementBlock("div", {
916
- key: 0,
917
- class: normalizeClass([
918
- "toolbar-wrapper",
919
- { "embedded-toolbar": !unref(hasCustomToolbar) }
920
- ])
921
- }, [
922
- createVNode(_sfc_main$3, {
911
+ class: normalizeClass(["toolbar-wrapper", { "embedded-toolbar": !unref(hasCustomToolbar) }])
912
+ }, [
913
+ createVNode(_sfc_main$3, {
914
+ editor: unref(editor),
915
+ "base-extensions": __props.baseExtensions,
916
+ "link-tool-options": __props.linkToolOptions
917
+ }, {
918
+ default: withCtx(({ tools }) => [
919
+ renderSlot(_ctx.$slots, "customToolbar", {
923
920
  editor: unref(editor),
924
- "base-extensions": __props.baseExtensions,
925
- "link-tool-options": __props.linkToolOptions
926
- }, {
927
- default: withCtx(({ tools }) => [
928
- renderSlot(_ctx.$slots, "customToolbar", {
929
- editor: unref(editor),
930
- tools,
931
- hotkeyFormatter: __props.hotkeyFormatter
932
- }, () => [
933
- createVNode(RichTextEditorToolbar, {
934
- editor: unref(editor),
935
- tools,
936
- "hotkey-formatter": __props.hotkeyFormatter
937
- }, null, 8, ["editor", "tools", "hotkey-formatter"])
938
- ], true)
939
- ]),
940
- linkModal: withCtx(({ linkTool }) => [
941
- isToolEnabled("link") && linkTool ? (openBlock(), createBlock(KdsCreateLinkModal, mergeProps({ key: 0 }, linkTool.props, toHandlers(linkTool.events)), null, 16)) : createCommentVNode("", true)
942
- ]),
943
- _: 3
944
- }, 8, ["editor", "base-extensions", "link-tool-options"])
945
- ], 2)) : createCommentVNode("", true)
946
- ]),
947
- _: 3
948
- }, 8, ["css"])) : createCommentVNode("", true),
921
+ tools,
922
+ hotkeyFormatter: __props.hotkeyFormatter
923
+ }, () => [
924
+ createVNode(RichTextEditorToolbar, {
925
+ editor: unref(editor),
926
+ tools,
927
+ "hotkey-formatter": __props.hotkeyFormatter
928
+ }, null, 8, ["editor", "tools", "hotkey-formatter"])
929
+ ], true)
930
+ ]),
931
+ linkModal: withCtx(({ linkTool }) => [
932
+ isToolEnabled("link") && linkTool ? (openBlock(), createBlock(KdsCreateLinkModal, mergeProps({ key: 0 }, linkTool.props, toHandlers(linkTool.events)), null, 16)) : createCommentVNode("", true)
933
+ ]),
934
+ _: 3
935
+ }, 8, ["editor", "base-extensions", "link-tool-options"])
936
+ ], 2)) : createCommentVNode("", true),
949
937
  createVNode(unref(EditorContent), {
950
938
  class: normalizeClass(["rich-text-editor", { editable: __props.editable && !__props.disabled }]),
951
939
  editor: unref(editor),
@@ -964,7 +952,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
964
952
  }
965
953
  });
966
954
 
967
- const KdsRichTextEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-656edd08"]]);
955
+ const KdsRichTextEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-819d979a"]]);
968
956
 
969
957
  const _sfc_main = /* @__PURE__ */ defineComponent({
970
958
  __name: "KdsRichTextInput",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../node_modules/.pnpm/@knime+utils@1.11.0_consola@3.4.2/node_modules/@knime/utils/src/navigator.ts","../../../node_modules/.pnpm/@knime+utils@1.11.0_consola@3.4.2/node_modules/@knime/utils/src/hotkeys.ts","../../styles/dist/img/icons/external-link.svg?url","../src/enums.ts","../src/toolbar/KdsCreateLinkModal.vue","../src/utils/paragraphTextStyle/index.ts","../src/toolbar/useLinkTool.ts","../src/toolbar/RichTextEditorBaseToolbar.vue","../src/toolbar/RichTextEditorToolbar.vue","../src/utils/custom-escape.ts","../src/utils/custom-hard-break.ts","../src/utils/custom-link.ts","../src/utils/custom-text-align.ts","../src/utils/paragraphTextStyle/extension.ts","../src/KdsRichTextEditor.vue","../src/KdsRichTextInput.vue"],"sourcesContent":["/**\n *\n * @returns true if the platform of the user is Mac\n */\nexport const isMac = (): boolean =>\n navigator?.userAgent?.toLowerCase()?.includes(\"mac\");\n\n/**\n *\n * @returns true if the platform of the user is Windows\n */\nexport const isWindows = (): boolean =>\n navigator?.userAgent?.toLowerCase()?.includes(\"windows\");\n","import { navigatorUtils } from \"@knime/utils\";\n\n/**\n * Checks if any modifier key (Ctrl, Meta, Alt, or Shift) is pressed.\n * @param {KeyboardEvent} event - The keyboard event to check.\n * @returns {boolean} True if a modifier key is pressed, otherwise false.\n */\nexport const isModifierKeyPressed = (event: KeyboardEvent): boolean => {\n return event.ctrlKey || event.metaKey || event.altKey || event.shiftKey;\n};\n\n/**\n * Checks if a specific key (or keys) were pressed without any modifier keys.\n * @param {KeyboardEvent} event - The keyboard event to check.\n * @param {string | string[]} keys - The key or keys to check for.\n * @returns {boolean} True if the specified key(s) were pressed without modifiers, otherwise false.\n */\nexport const isKeyWithoutModifiers = (\n event: KeyboardEvent,\n keys: string | string[],\n): boolean => {\n const keyList = Array.isArray(keys) ? keys : [keys];\n return keyList.includes(event.key) && !isModifierKeyPressed(event);\n};\n\n/**\n *\n * @returns name of the primary modifier key for the current platform\n */\nexport const getMetaOrCtrlKey = (): \"ctrlKey\" | \"metaKey\" => {\n return navigatorUtils.isMac() ? \"metaKey\" : \"ctrlKey\";\n};\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20stroke='currentColor'%20stroke-linecap='round'%20stroke-linejoin='round'%20viewBox='0%200%2012%2012'%3e%3cpath%20d='M5.5%201.5h-3a1%201%200%200%200-1%201v7a1%201%200%200%200%201%201h7a1%201%200%200%200%201-1v-3m0-5L6%205.892M10.5%201.5v2.75m0-2.75H7.75'%20vector-effect='non-scaling-stroke'/%3e%3c/svg%3e\"","export const kdsCharacterCountDisplay = {\n NEVER: \"never\",\n ALWAYS: \"always\",\n AT_LIMIT: \"atLimit\",\n} as const;\n\nexport const kdsCharacterCountDisplays = Object.values(\n kdsCharacterCountDisplay,\n);\n","<script setup lang=\"ts\">\nimport { type Ref, computed, nextTick, ref, watch } from \"vue\";\n\nimport { KdsButton, KdsModal, KdsTextInput } from \"@knime/kds-components\";\n\ntype Props = {\n text: Ref<string>;\n url: Ref<string>;\n isActive: Ref<boolean>;\n isEdit: Ref<boolean>;\n urlValidator: (url: string) => boolean;\n};\n\nconst props = defineProps<Props>();\n\nconst inputRef = ref<HTMLInputElement | null>(null);\n\nconst editedText = ref(props.text.value);\nconst editedUrl = ref(props.url.value);\n\nwatch(\n () => props.isActive.value,\n async (isOpen: boolean) => {\n if (!isOpen) {\n return;\n }\n editedText.value = props.text.value;\n editedUrl.value = props.url.value;\n\n // Wait a tick as KdsModal internally also waits for the DOM to update before calling showModal()\n await nextTick();\n\n // Focus first input field, requestAnimationFrame ensures the browser has un-hidden the modal\n requestAnimationFrame(() => {\n inputRef.value?.focus();\n });\n },\n);\n\nconst emit = defineEmits<{\n addLink: [text: string, url: string];\n removeLink: [];\n cancelAddLink: [];\n}>();\n\nconst closeModal = () => {\n emit(\"cancelAddLink\");\n};\n\nconst onSubmit = () => {\n emit(\"addLink\", editedText.value, editedUrl.value);\n};\n\nconst validateUrl = () => {\n const validScheme = props.urlValidator(editedUrl.value);\n\n return !editedUrl.value || validScheme;\n};\n\nconst isValid = computed(() => {\n const textChanged = editedText.value !== props.text.value;\n const urlChanged = editedUrl.value !== props.url.value;\n const urlNotEmpty = editedUrl.value !== \"\";\n\n return (textChanged || urlChanged) && validateUrl() && urlNotEmpty;\n});\n\nconst onkeyup = (keyupEvent: KeyboardEvent) => {\n if (keyupEvent.key === \"Enter\" && isValid.value) {\n onSubmit();\n }\n};\n</script>\n\n<template>\n <KdsModal\n :active=\"isActive.value\"\n :headline=\"isEdit.value ? 'Edit link' : 'Insert link'\"\n class=\"modal\"\n @close=\"closeModal\"\n >\n <template #body>\n <KdsTextInput\n ref=\"inputRef\"\n v-model=\"editedText\"\n label=\"Link text\"\n type=\"text\"\n @keyup=\"onkeyup\"\n />\n\n <KdsTextInput\n v-model=\"editedUrl\"\n label=\"URL\"\n :sub-text=\"\n !validateUrl() ? 'Enter a valid URL (e.g. https://example.com)' : ''\n \"\n :error=\"!validateUrl()\"\n :preserve-sub-text-space=\"true\"\n @keyup=\"onkeyup\"\n />\n </template>\n\n <template #footer>\n <div class=\"modal-footer\" :class=\"{ 'spread-buttons': isEdit.value }\">\n <KdsButton\n :variant=\"isEdit.value ? 'transparent' : 'outlined'\"\n size=\"small\"\n label=\"Cancel\"\n @click=\"closeModal\"\n />\n <div class=\"controls-apply-group\">\n <KdsButton\n v-if=\"isEdit.value\"\n variant=\"outlined\"\n size=\"small\"\n label=\"Remove URL\"\n @click=\"emit('removeLink')\"\n />\n <KdsButton\n variant=\"filled\"\n size=\"small\"\n :label=\"isEdit.value ? 'Apply' : 'Insert link'\"\n :disabled=\"!isValid\"\n @click=\"onSubmit\"\n />\n </div>\n </div>\n </template>\n </KdsModal>\n</template>\n\n<style scoped>\n.modal {\n --modal-width: var(--kds-dimension-component-width-32x);\n}\n\n.modal-footer {\n display: flex;\n gap: var(--kds-spacing-container-0-5x);\n align-items: center;\n justify-content: flex-end;\n width: 100%;\n\n &.spread-buttons {\n justify-content: space-between;\n }\n}\n\n.controls-apply-group {\n display: flex;\n gap: var(--kds-spacing-container-0-5x);\n}\n</style>\n","import type { Level } from \"@tiptap/extension-heading\";\nimport type { Editor } from \"@tiptap/vue-3\";\n\nimport type {\n EditorToolSecondaryItem,\n EditorToolSecondaryItemChild,\n} from \"../../toolbar/types\";\n\nconst clearHeading = (editor: Editor) => {\n const maxLevel = 6;\n for (let i = 1; i <= maxLevel; i++) {\n if (editor.isActive(\"heading\", { level: i })) {\n editor\n .chain()\n .focus()\n .toggleHeading({ level: i as Level })\n .run();\n break;\n }\n }\n};\n\nconst getHeadingOptionChild = (level: Level, getEditor: () => Editor) =>\n ({\n id: `${level}`,\n text: `Heading ${level}`,\n hotkey: [\"Ctrl\", \"Alt\", `${level}`],\n active: () => getEditor().isActive(\"heading\", { level }),\n handler: () => {\n const editor = getEditor();\n editor.chain().focus().toggleHeading({ level }).run();\n },\n }) satisfies EditorToolSecondaryItemChild;\n\nexport const getParagraphTextStyleTool = (\n getEditor: () => Editor,\n): EditorToolSecondaryItem => {\n return {\n id: \"paragraphTextStyle\",\n type: \"secondary\",\n icon: \"textstyles\",\n text: \"Text style\",\n children: [\n {\n id: \"standard\",\n text: \"Standard\",\n hotkey: [\"Ctrl\", \"Alt\", \"0\"],\n handler: () => {\n const editor = getEditor();\n clearHeading(editor);\n editor.chain().focus().unsetSmallText().run();\n },\n },\n {\n id: \"small\",\n text: \"Small text\",\n hotkey: [\"Ctrl\", \"Alt\", \"−\"], // this is a wider minus character for aesthetic reasons\n active: () => getEditor().isActive({ smallText: true }),\n handler: () => {\n const editor = getEditor();\n clearHeading(editor);\n editor.chain().focus().setSmallText().run();\n },\n },\n ...Array.from({ length: 6 }, (_, i) =>\n getHeadingOptionChild((i + 1) as Level, getEditor),\n ),\n ],\n };\n};\n","import { computed, onMounted, onUnmounted, ref } from \"vue\";\nimport type { Editor } from \"@tiptap/vue-3\";\n\nimport { getMetaOrCtrlKey } from \"@knime/utils\";\n\nimport type { KdsLinkToolOptions } from \"../utils/custom-link\";\n\nexport const useLinkTool = ({\n editor,\n isRegistered,\n linkToolOptions,\n}: {\n editor: Editor;\n isRegistered: boolean;\n linkToolOptions: KdsLinkToolOptions;\n}) => {\n if (!isRegistered) {\n return null;\n }\n\n const isActive = ref(false);\n const text = ref(\"\");\n const url = ref(\"\");\n const isEdit = computed(() => url.value !== \"\");\n const isReplacingText = ref(false);\n\n const onLinkToolClick = () => {\n const { view, state } = editor;\n const { from, to } = view.state.selection;\n\n const currentLink = editor.getAttributes(\"link\").href;\n url.value = currentLink || \"\";\n\n if (currentLink) {\n const hasSelection = from !== to;\n if (hasSelection) {\n // manually update the cursor position to get the entire link text\n const newCursorPosition = from + Math.floor((to - from) / 2);\n editor.chain().focus().setTextSelection(newCursorPosition).run();\n }\n\n const textBefore =\n view.state.selection.$from.nodeBefore?.textContent ?? \"\";\n const textAfter = view.state.selection.$to.nodeAfter?.textContent ?? \"\";\n\n text.value = textBefore + textAfter;\n } else {\n text.value = state.doc.textBetween(from, to, \"\");\n }\n\n isReplacingText.value = Boolean(currentLink || text.value);\n isActive.value = true;\n };\n\n const onRemoveLink = () => {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n\n isActive.value = false;\n isReplacingText.value = false;\n };\n\n const addCustomLink = ({\n isEditing,\n url,\n urlText,\n text,\n }: {\n isEditing: boolean;\n url: string;\n urlText: string;\n text: string;\n }) => {\n if (isEditing) {\n editor\n .chain()\n .focus()\n .setLink({ href: url })\n .command(({ tr }) => {\n tr.insertText(text || urlText);\n return true;\n })\n .run();\n } else {\n // TODO replace this rather complicated way to add a link once the tiptap bug is fixed\n const { view } = editor;\n const { from: startIndex } = view.state.selection;\n\n // escape link with space when creating a new link\n editor\n .chain()\n .focus()\n .insertContent([{ type: \"text\", text: \" \" }])\n .run();\n editor\n .chain()\n .focus()\n .insertContentAt(startIndex, [{ type: \"text\", text: text || urlText }])\n .run();\n\n const { from: endIndex } = view.state.selection;\n\n editor.commands.setTextSelection({\n from: startIndex,\n to: endIndex,\n });\n\n editor.chain().focus().setLink({ href: url }).run();\n }\n };\n\n const onAddLink = (text: string, urlText: string) => {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n\n if (urlText) {\n const url = linkToolOptions.sanitizeUrlText?.(urlText) ?? urlText;\n\n addCustomLink({\n isEditing: isReplacingText.value,\n urlText,\n url,\n text,\n });\n }\n\n isActive.value = false;\n isReplacingText.value = false;\n };\n\n const onCancelAddLink = () => {\n isActive.value = false;\n isReplacingText.value = false;\n };\n\n /**\n * Handle custom hotkeys for link tool that are not supported by tiptap.\n */\n const onKeyDown = (event: KeyboardEvent) => {\n if (!editor?.isFocused) {\n return;\n }\n const ctrlPressed = event[getMetaOrCtrlKey()];\n if (ctrlPressed && event.key === \"k\") {\n event.preventDefault();\n onLinkToolClick();\n }\n };\n onMounted(() => {\n window.addEventListener(\"keydown\", onKeyDown);\n });\n\n onUnmounted(() => {\n window.removeEventListener(\"keydown\", onKeyDown);\n });\n\n return {\n onLinkToolClick,\n props: {\n url,\n text,\n isActive,\n isEdit,\n urlValidator: linkToolOptions.urlValidator,\n },\n events: {\n addLink: onAddLink,\n removeLink: onRemoveLink,\n cancelAddLink: onCancelAddLink,\n },\n };\n};\n","<script setup lang=\"ts\">\nimport type { Editor } from \"@tiptap/vue-3\";\n\nimport type { KdsBaseExtensionsConfig } from \"../types\";\nimport type { KdsLinkToolOptions } from \"../utils/custom-link\";\nimport { getParagraphTextStyleTool } from \"../utils/paragraphTextStyle\";\n\nimport type { EditorToolItem, EditorTools } from \"./types\";\nimport { useLinkTool } from \"./useLinkTool\";\n\ntype Props = {\n editor: Editor;\n baseExtensions: KdsBaseExtensionsConfig | { all: true };\n linkToolOptions: KdsLinkToolOptions;\n};\n\nconst props = defineProps<Props>();\n\nconst registerTool = (\n toolName: keyof KdsBaseExtensionsConfig,\n tool: EditorToolItem,\n) => {\n if (\"all\" in props.baseExtensions) {\n return [tool];\n }\n\n return props.baseExtensions[toolName] ? [tool] : [];\n};\n\nconst isToolRegistered = (toolName: keyof KdsBaseExtensionsConfig) => {\n if (\"all\" in props.baseExtensions) {\n return true;\n }\n\n return Boolean(props.baseExtensions[toolName]);\n};\n\nconst isListActive = () =>\n props.editor.isActive(\"orderedList\") || props.editor.isActive(\"bulletList\");\n\nconst linkTool = useLinkTool({\n editor: props.editor,\n isRegistered: isToolRegistered(\"link\"),\n linkToolOptions: props.linkToolOptions,\n});\n\nconst editorTools: EditorTools = [\n ...registerTool(\"bold\", {\n id: \"bold\",\n type: \"primary\",\n text: \"Bold\",\n hotkey: [\"Ctrl\", \"B\"],\n icon: \"bold\",\n active: () => props.editor.isActive(\"bold\"),\n handler: () => props.editor.chain().focus().toggleBold().run(),\n }),\n\n ...registerTool(\"italic\", {\n id: \"italic\",\n type: \"primary\",\n text: \"Italic\",\n icon: \"italic\",\n hotkey: [\"Ctrl\", \"I\"],\n active: () => props.editor.isActive(\"italic\"),\n handler: () => props.editor.chain().focus().toggleItalic().run(),\n }),\n\n ...registerTool(\"underline\", {\n id: \"underline\",\n type: \"primary\",\n text: \"Underline\",\n icon: \"underline\",\n hotkey: [\"Ctrl\", \"U\"],\n active: () => props.editor.isActive(\"underline\"),\n handler: () => props.editor.chain().focus().toggleUnderline().run(),\n }),\n\n ...registerTool(\"bulletList\", {\n id: \"bulletList\",\n type: \"primary\",\n text: \"Bullet list\",\n icon: \"list-bulletpoint\",\n hotkey: [\"Ctrl\", \"Shift\", \"8\"],\n active: () => props.editor.isActive(\"bulletList\"),\n handler: () => {\n const commandChain = props.editor.chain().focus();\n if (isToolRegistered(\"textAlign\")) {\n commandChain.setTextAlign(\"left\");\n }\n\n commandChain.toggleBulletList().run();\n },\n }),\n\n ...registerTool(\"orderedList\", {\n id: \"orderedList\",\n type: \"primary\",\n text: \"Ordered list\",\n icon: \"list-number\",\n hotkey: [\"Ctrl\", \"Shift\", \"7\"],\n active: () => props.editor.isActive(\"orderedList\"),\n handler: () => {\n const commandChain = props.editor.chain().focus();\n if (isToolRegistered(\"textAlign\")) {\n commandChain.setTextAlign(\"left\");\n }\n\n commandChain.toggleOrderedList().run();\n },\n }),\n\n ...registerTool(\"textAlign\", {\n id: \"align-left\",\n type: \"primary\",\n icon: \"left-aligned\",\n text: \"Align left\",\n hotkey: [\"Ctrl\", \"Shift\", \"L\"],\n active: () =>\n !isListActive() && props.editor.isActive({ textAlign: \"left\" }),\n handler: () => props.editor.chain().focus().setTextAlign(\"left\").run(),\n disabled: () => isListActive(),\n }),\n\n ...registerTool(\"textAlign\", {\n id: \"align-center\",\n type: \"primary\",\n icon: \"center-aligned\",\n text: \"Align center\",\n hotkey: [\"Ctrl\", \"Shift\", \"E\"],\n active: () =>\n !isListActive() && props.editor.isActive({ textAlign: \"center\" }),\n handler: () => props.editor.chain().focus().setTextAlign(\"center\").run(),\n disabled: () => isListActive(),\n }),\n\n ...registerTool(\"textAlign\", {\n id: \"align-right\",\n type: \"primary\",\n icon: \"right-aligned\",\n text: \"Align right\",\n hotkey: [\"Ctrl\", \"Shift\", \"R\"],\n active: () =>\n !isListActive() && props.editor.isActive({ textAlign: \"right\" }),\n handler: () => props.editor.chain().focus().setTextAlign(\"right\").run(),\n disabled: () => isListActive(),\n }),\n\n ...registerTool(\"link\", {\n id: \"link\",\n type: \"primary\",\n icon: \"link\",\n text: \"Link\",\n hotkey: [\"Ctrl\", \"K\"],\n active: () => props.editor.isActive(\"link\"),\n handler: () => linkTool?.onLinkToolClick(),\n }),\n\n ...registerTool(\n \"paragraphTextStyle\",\n getParagraphTextStyleTool(() => props.editor),\n ),\n\n ...registerTool(\"blockquote\", {\n id: \"blockquote\",\n type: \"secondary\",\n icon: \"quote\",\n text: \"Blockquote\",\n active: () => props.editor.isActive(\"blockquote\"),\n handler: () => props.editor.chain().focus().toggleBlockquote().run(),\n }),\n\n ...registerTool(\"codeBlock\", {\n id: \"codeBlock\",\n type: \"secondary\",\n icon: \"code-block\",\n text: \"Code block\",\n hotkey: [\"Ctrl\", \"Alt\", \"C\"],\n active: () => props.editor.isActive(\"codeBlock\"),\n handler: () => props.editor.chain().focus().toggleCodeBlock().run(),\n }),\n\n ...registerTool(\"strike\", {\n id: \"strikethrough\",\n type: \"secondary\",\n icon: \"strikethrough\",\n text: \"Strikethrough\",\n hotkey: [\"Ctrl\", \"Shift\", \"X\"],\n active: () => props.editor.isActive(\"strike\"),\n handler: () => props.editor.chain().focus().toggleStrike().run(),\n }),\n\n ...registerTool(\"horizontalRule\", {\n id: \"horizontalRule\",\n type: \"secondary\",\n icon: \"divider\",\n text: \"Divider\",\n active: () => false,\n handler: () => props.editor.chain().focus().setHorizontalRule().run(),\n }),\n];\n</script>\n\n<template>\n <slot :tools=\"editorTools\" />\n <slot :link-tool=\"linkTool\" name=\"linkModal\" />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport type { Editor } from \"@tiptap/vue-3\";\n\nimport {\n KdsMenuButton,\n type KdsMenuItem,\n KdsToggleButton,\n} from \"@knime/kds-components\";\n\nimport type {\n EditorToolPrimaryItem,\n EditorToolSecondaryItem,\n EditorTools,\n} from \"./types\";\n\ntype Props = {\n editor: Editor;\n tools: EditorTools;\n hotkeyFormatter: (hotkey: Array<string>) => string;\n};\n\nconst props = defineProps<Props>();\n\nconst baseTools = computed(\n () =>\n props.tools.filter(\n ({ type }) => type === \"primary\",\n ) as EditorToolPrimaryItem[],\n);\n\nconst secondaryTools = computed(\n () =>\n props.tools.filter(\n ({ type }) => type === \"secondary\",\n ) as EditorToolSecondaryItem[],\n);\n\nconst secondaryToolsMenuItems = computed<KdsMenuItem[]>(() => {\n const tools = secondaryTools.value.map((tool) => {\n const base = {\n id: tool.id,\n text: tool.text,\n disabled: tool.disabled?.(),\n shortcut: props.hotkeyFormatter(tool.hotkey ?? []),\n accessory: {\n type: \"icon\",\n name: tool.icon,\n },\n } satisfies KdsMenuItem;\n\n if (tool.children) {\n return {\n ...base,\n children: tool.children.map((toolChild) => {\n return {\n id: toolChild.id,\n text: toolChild.text,\n shortcut: props.hotkeyFormatter(toolChild.hotkey ?? []),\n handler: () => toolChild.handler(toolChild.id),\n };\n }),\n } satisfies KdsMenuItem;\n }\n\n return {\n ...base,\n handler: () => tool.handler(tool.id),\n } satisfies KdsMenuItem;\n });\n\n return tools;\n});\n</script>\n\n<template>\n <div class=\"tools\">\n <KdsToggleButton\n v-for=\"tool of baseTools\"\n :key=\"tool.id\"\n class=\"tool\"\n :ariaLabel=\"tool.text\"\n :data-testid=\"tool.id\"\n :disabled=\"tool.disabled?.()\"\n :toggled=\"tool.active?.()\"\n :leading-icon=\"tool.icon\"\n :title=\"hotkeyFormatter(tool.hotkey ?? [])\"\n variant=\"transparent\"\n size=\"small\"\n @keydown.enter.prevent=\"tool.handler?.(tool.id)\"\n @click.stop=\"tool.handler?.(tool.id)\"\n />\n\n <KdsMenuButton\n v-if=\"secondaryTools.length > 0\"\n :items=\"secondaryToolsMenuItems\"\n leading-icon=\"more-actions\"\n ariaLabel=\"More actions\"\n variant=\"transparent\"\n size=\"small\"\n />\n </div>\n</template>\n\n<style scoped>\n.tools {\n display: flex;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n height: 100%;\n}\n</style>\n","import { Extension } from \"@tiptap/vue-3\";\n\n/**\n * TODO UIEXT-1461 Remove and resolve properly with https://knime-com.atlassian.net/browse/UIEXT-1461-\n */\ntype CustomEscapeExtensionOptions = {\n handler: () => boolean;\n};\n\ndeclare module \"@tiptap/core\" {\n interface ExtensionOptions {\n customEscape: CustomEscapeExtensionOptions;\n }\n}\n\nexport const CustomEscape = Extension.create<CustomEscapeExtensionOptions>({\n name: \"OverrideEscape\",\n\n addOptions() {\n return {\n handler: () => false,\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Escape: this.options.handler,\n };\n },\n});\n","import HardBreak from \"@tiptap/extension-hard-break\";\n\nexport const CustomHardBreak = HardBreak.extend({\n addKeyboardShortcuts() {\n return {\n \"Shift-Enter\": () => this.editor.commands.setHardBreak(),\n };\n },\n});\n","import { getAttributes } from \"@tiptap/core\";\nimport Link from \"@tiptap/extension-link\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\n\nimport { getMetaOrCtrlKey, navigatorUtils } from \"@knime/utils\";\n\nconst buildUrlRegex = () => {\n const httpPrefixCheck = \"(http://www\\\\.|https://www\\\\.|http://|https://)\";\n\n const urlCheck =\n \"[a-z0-9]+([-.]{1}[a-z0-9]+)*\\\\.[a-z]{2,5}(:[0-9]{1,5})?(/.*)?\";\n\n return new RegExp(`^${httpPrefixCheck}?${urlCheck}$`);\n};\n\nconst URL_REGEX = buildUrlRegex();\n\nexport const validateURL = (href: string) => URL_REGEX.test(href);\n\nexport type KdsLinkToolOptions = {\n /**\n * Custom function that can be supplied to validate urls added with the link tool\n * @param url The url of the link to be added\n */\n urlValidator: (url: string) => boolean;\n /**\n * Custom function that can, e.g., be used to append a protocol like https:// to a url if not present\n * @param url The url of the link to be added\n */\n sanitizeUrlText: (url: string) => string;\n};\n\nexport const kdsDefaultLinkToolOptions: KdsLinkToolOptions = {\n urlValidator: validateURL,\n sanitizeUrlText: (urlText: string) => {\n const containsHttp = [\"http://\", \"https://\"].some((protocol) =>\n urlText.includes(protocol),\n );\n return containsHttp ? urlText : `https://${urlText}`;\n },\n};\n\nexport const CustomLink = Link.extend({\n addAttributes() {\n const modifier = navigatorUtils.isMac() ? \"⌘\" : \"Ctrl +\";\n\n return {\n ...this.parent?.(),\n\n draggable: {\n default: \"false\",\n },\n\n title: {\n default: `Use \"${modifier} click\" to follow link`,\n },\n\n rel: {\n default: \"ugc noopener noreferrer nofollow\",\n },\n };\n },\n\n addProseMirrorPlugins() {\n const plugins: Plugin[] = this.parent?.() || [];\n\n const ctrlClickHandler = new Plugin({\n key: new PluginKey(\"handleControlClick\"),\n props: {\n handleClick(view, _pos, event) {\n const attrs = getAttributes(view.state, \"link\");\n const link = (event.target as HTMLElement)?.closest(\"a\");\n\n const metaOrCtrlKeyPressed = event[getMetaOrCtrlKey()];\n\n if (metaOrCtrlKeyPressed && link && attrs.href) {\n window.open(attrs.href, attrs.target);\n }\n // always return true, otherwise the cursor disappears, which causes some unexpected bugs\n // see: https://knime-com.atlassian.net/browse/HUB-8669\n return true;\n },\n },\n });\n\n plugins.push(ctrlClickHandler);\n\n return plugins;\n },\n});\n","import TextAlign from \"@tiptap/extension-text-align\";\n\nexport const CustomTextAlign = TextAlign.extend({\n addKeyboardShortcuts() {\n const canActivate = () => {\n return !(\n this.editor.isActive(\"bulletList\") ||\n this.editor.isActive(\"orderedList\")\n );\n };\n\n return {\n \"Mod-Shift-l\": () =>\n canActivate() && this.editor.commands.setTextAlign(\"left\"),\n \"Mod-Shift-e\": () =>\n canActivate() && this.editor.commands.setTextAlign(\"center\"),\n \"Mod-Shift-r\": () =>\n canActivate() && this.editor.commands.setTextAlign(\"right\"),\n };\n },\n});\n","import Paragraph from \"@tiptap/extension-paragraph\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n fontSize: {\n /**\n * Sets a custom class on the paragraph which is used to set a small font size\n */\n setSmallText: () => ReturnType;\n /**\n * Reverts setSmallText\n */\n unsetSmallText: () => ReturnType;\n };\n }\n}\n\nconst SmallText = Paragraph.extend({\n addAttributes() {\n const smallTextClass = \"small-text\";\n return {\n ...this.parent?.(),\n smallText: {\n default: false,\n parseHTML: (element) => element.className === smallTextClass,\n renderHTML: (attributes) => {\n return attributes.smallText\n ? {\n class: smallTextClass,\n }\n : {};\n },\n },\n };\n },\n\n addCommands() {\n return {\n ...this.parent?.(),\n setSmallText:\n () =>\n ({ commands }) => {\n return commands.toggleNode(this.name, \"paragraph\", {\n smallText: true,\n });\n },\n unsetSmallText:\n () =>\n ({ chain }) => {\n return chain()\n .updateAttributes(this.name, { smallText: false })\n .run();\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n ...this.parent?.(),\n \"Mod-Alt--\": () => this.editor.commands.setSmallText(),\n };\n },\n});\n\nexport { SmallText };\n","<script setup lang=\"ts\">\nimport {\n computed,\n nextTick,\n onMounted,\n ref,\n useId,\n useSlots,\n watch,\n} from \"vue\";\nimport CharacterCount from \"@tiptap/extension-character-count\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport { type AnyExtension, EditorContent, useEditor } from \"@tiptap/vue-3\";\n\nimport { KdsSubText } from \"@knime/kds-components\";\nimport { navigatorUtils } from \"@knime/utils\";\n\nimport ExternalLinkIconUrl from \"../node_modules/@knime/kds-styles/dist/img/icons/external-link.svg?url\";\n\nimport { kdsCharacterCountDisplay } from \"./enums\";\nimport KdsCreateLinkModal from \"./toolbar/KdsCreateLinkModal.vue\";\nimport RichTextEditorBaseToolbar from \"./toolbar/RichTextEditorBaseToolbar.vue\";\nimport RichTextEditorToolbar from \"./toolbar/RichTextEditorToolbar.vue\";\nimport type { KdsBaseExtensionsConfig, KdsRichTextEditorProps } from \"./types\";\nimport { CustomEscape } from \"./utils/custom-escape.ts\";\nimport { CustomHardBreak } from \"./utils/custom-hard-break\";\nimport {\n CustomLink,\n kdsDefaultLinkToolOptions,\n validateURL,\n} from \"./utils/custom-link\";\nimport { CustomTextAlign } from \"./utils/custom-text-align\";\nimport { SmallText } from \"./utils/paragraphTextStyle/extension\";\n\nconst {\n editable = true,\n minHeight = null,\n maxHeight = null,\n baseExtensions = {} as KdsBaseExtensionsConfig,\n hotkeyFormatter = (hotkey: string[]) => {\n const MacOSkeyMap: Record<string, string> = {\n Shift: \"⇧\",\n Ctrl: \"⌘\",\n Alt: \"⌥\",\n };\n\n const mapSymbols = (key: string) => MacOSkeyMap[key] || key;\n const identityFn = (value: unknown) => value;\n\n return (\n hotkey\n // map only for mac the symbols that should be displayed differently\n .map(navigatorUtils.isMac() ? mapSymbols : identityFn)\n .join(\" \")\n );\n },\n customExtensions = [] as Array<AnyExtension>,\n autofocus = false,\n withBorder = true,\n disabled = false,\n linkToolOptions = kdsDefaultLinkToolOptions,\n characterLimit = {},\n subText = undefined,\n error = false,\n validating = false,\n preserveSubTextSpace = false,\n customEscapeHandler = undefined,\n ariaLabel = undefined,\n ariaLabelledby = undefined,\n wrapperFocusRing = false,\n} = defineProps<KdsRichTextEditorProps>();\n\n// we need to define a minimum amount for a character limit so that we\n// can make static calculations for the character counter and show it\n// only when the user has 100 chars or less left\nconst MIN_CHARACTER_LIMIT = 200;\n// number of remaining characters at or below which the counter is surfaced\n// when `display` is set to `atLimit`\nconst AT_LIMIT_THRESHOLD = 100;\n\nconst hardCharacterLimit = Math.max(\n characterLimit.maxCharacters ?? 1000,\n MIN_CHARACTER_LIMIT,\n);\nconst characterCountDisplay =\n characterLimit.display ?? kdsCharacterCountDisplay.NEVER;\n\nconst slots = useSlots();\n\n// this assumes a svg without any double quotes\nconst externalIcon = `url(\"${ExternalLinkIconUrl}\")`;\n\nconst modelValue = defineModel<string>();\n\nconst emit = defineEmits<{\n blur: [];\n}>();\n\nconst isToolEnabled = (extensionName: keyof KdsBaseExtensionsConfig) => {\n if (\"all\" in baseExtensions) {\n return true;\n }\n\n return Boolean(baseExtensions[extensionName]);\n};\n\nconst getStarterKitExtensionConfig = (\n extensionName: keyof KdsBaseExtensionsConfig,\n): false | undefined | Partial<unknown> => {\n return isToolEnabled(extensionName) ? undefined : false;\n};\n\nconst extensions = [\n StarterKit.configure({\n bold: getStarterKitExtensionConfig(\"bold\"),\n italic: getStarterKitExtensionConfig(\"italic\"),\n bulletList: getStarterKitExtensionConfig(\"bulletList\"),\n orderedList: getStarterKitExtensionConfig(\"orderedList\"),\n heading: getStarterKitExtensionConfig(\"heading\"),\n blockquote: getStarterKitExtensionConfig(\"blockquote\"),\n code: getStarterKitExtensionConfig(\"code\"),\n codeBlock: getStarterKitExtensionConfig(\"codeBlock\"),\n horizontalRule: getStarterKitExtensionConfig(\"horizontalRule\"),\n strike: getStarterKitExtensionConfig(\"strike\"),\n underline: getStarterKitExtensionConfig(\"underline\"),\n ...(isToolEnabled(\"paragraphTextStyle\") && { paragraph: false }),\n hardBreak: false,\n // StarterKit v3 bundles a link extension, but we register our own\n // CustomLink (opt-in via baseExtensions) for the custom validation,\n // attributes and ctrl/cmd-click handling, so the bundled one is disabled\n // to avoid a duplicate-extension conflict.\n link: false,\n }),\n\n ...(isToolEnabled(\"paragraphTextStyle\") ? [SmallText] : []),\n ...(isToolEnabled(\"textAlign\")\n ? [\n CustomTextAlign.configure({\n types: [\n isToolEnabled(\"heading\") ? \"heading\" : \"\",\n \"paragraph\",\n ].filter(Boolean),\n\n alignments: [\"left\", \"right\", \"center\"],\n }),\n ]\n : []),\n\n ...(isToolEnabled(\"link\")\n ? [CustomLink.configure({ validate: validateURL, openOnClick: false })]\n : []),\n\n CustomHardBreak,\n CharacterCount.configure({\n limit: hardCharacterLimit,\n }),\n\n ...(customEscapeHandler\n ? [CustomEscape.configure({ handler: customEscapeHandler })]\n : []),\n\n ...customExtensions,\n];\n\nconst subTextId = useId();\n\n// Tracks focus of the editing area itself (not the toolbar). Used to draw the\n// `wrapperFocusRing` only while the user is editing — focusing a toolbar button\n// fires the editor's blur, so the ring correctly disappears.\nconst isEditorFocused = ref(false);\n\nconst editor = useEditor({\n content: modelValue.value,\n editable: editable && !disabled,\n autofocus,\n extensions,\n editorProps: {\n attributes: {\n ...(ariaLabel ? { \"aria-label\": ariaLabel } : {}),\n ...(ariaLabelledby ? { \"aria-labelledby\": ariaLabelledby } : {}),\n \"aria-describedby\": subTextId,\n },\n },\n onUpdate: () => {\n modelValue.value = editor.value?.getHTML() ?? \"\";\n },\n onFocus: () => {\n isEditorFocused.value = true;\n },\n onBlur: () => {\n isEditorFocused.value = false;\n emit(\"blur\");\n },\n});\n\nconst minHeightStyle = computed(() =>\n minHeight ? `${minHeight}px` : \"initial\",\n);\n\nconst focus = () => {\n editor.value?.commands?.focus?.();\n};\n\ndefineExpose({ focus });\n\nconst maxHeightStyle = computed(() =>\n maxHeight ? `${maxHeight}px` : \"initial\",\n);\n\nwatch(modelValue, (newValue) => {\n if (!editor.value) {\n return;\n }\n if (editor.value.getHTML() === newValue) {\n return;\n }\n\n editor.value.commands.setContent(newValue ?? \"\");\n});\n\nwatch(\n [() => editable, () => disabled],\n ([newEditable, newDisabled], [oldEditable, oldDisabled]) => {\n if (!editor.value) {\n return;\n }\n\n const oldValue = oldEditable && !oldDisabled;\n const newValue = newEditable && !newDisabled;\n if (oldValue === newValue) {\n return;\n }\n\n editor.value.setEditable(newValue);\n\n if (autofocus) {\n focus();\n }\n },\n);\n\nonMounted(async () => {\n if (editable && autofocus) {\n await nextTick();\n focus();\n }\n});\n\nconst hasCustomToolbar = slots.customToolbar;\nconst hasTools = computed(() => Object.keys(baseExtensions).length);\n\nconst characterCount = computed(\n () => editor.value?.storage.characterCount.characters() ?? 0,\n);\n\nconst showCharacterCount = computed(() => {\n if (!editor.value || !editable) {\n return false;\n }\n\n switch (characterCountDisplay) {\n case kdsCharacterCountDisplay.ALWAYS:\n return true;\n case kdsCharacterCountDisplay.AT_LIMIT:\n return hardCharacterLimit - characterCount.value <= AT_LIMIT_THRESHOLD;\n default:\n return false;\n }\n});\n\n// A provided `subText` (e.g. a validation message) takes precedence over the\n// character count display.\nconst hasSubTextOverride = computed(() => Boolean(subText));\n\nconst subTextValue = computed(() => {\n if (hasSubTextOverride.value) {\n return subText;\n }\n return showCharacterCount.value\n ? `${characterCount.value} / ${hardCharacterLimit} characters`\n : undefined;\n});\n</script>\n\n<template>\n <div>\n <div\n :class=\"[\n 'editor-wrapper',\n {\n 'with-border': withBorder,\n disabled,\n 'show-focus-ring': wrapperFocusRing && isEditorFocused,\n },\n ]\"\n >\n <Transition v-if=\"hasTools\" name=\"expand\" :css=\"!hasCustomToolbar\">\n <div\n v-if=\"editor && editable && !disabled\"\n :class=\"[\n 'toolbar-wrapper',\n { 'embedded-toolbar': !hasCustomToolbar },\n ]\"\n >\n <RichTextEditorBaseToolbar\n :editor=\"editor\"\n :base-extensions=\"baseExtensions\"\n :link-tool-options=\"linkToolOptions\"\n >\n <template #default=\"{ tools }\">\n <slot\n name=\"customToolbar\"\n :editor=\"editor\"\n :tools=\"tools\"\n :hotkey-formatter=\"hotkeyFormatter\"\n >\n <RichTextEditorToolbar\n :editor=\"editor\"\n :tools=\"tools\"\n :hotkey-formatter=\"hotkeyFormatter\"\n />\n </slot>\n </template>\n <template #linkModal=\"{ linkTool }\">\n <KdsCreateLinkModal\n v-if=\"isToolEnabled('link') && linkTool\"\n v-bind=\"linkTool.props\"\n v-on=\"linkTool.events\"\n />\n </template>\n </RichTextEditorBaseToolbar>\n </div>\n </Transition>\n\n <EditorContent\n class=\"rich-text-editor\"\n :editor=\"editor\"\n :class=\"{ editable: editable && !disabled }\"\n :aria-disabled=\"disabled || undefined\"\n />\n </div>\n\n <KdsSubText\n :id=\"subTextId\"\n :sub-text=\"subTextValue\"\n :error=\"hasSubTextOverride && error\"\n :validating=\"hasSubTextOverride && validating\"\n :preserve-sub-text-space=\"preserveSubTextSpace\"\n />\n </div>\n</template>\n\n<style scoped>\n.editor-wrapper {\n /* Fixed 44px toolbar height per the design (28px content + 8px padding on\n * each side). Defined explicitly so the toolbar expand/collapse transition\n * has a concrete target height; the small toolbar buttons (24px) center\n * within the content area. */\n --toolbar-height: calc(\n var(--kds-dimension-component-height-1-75x) +\n var(--kds-spacing-container-0-5x) * 2\n );\n\n position: relative;\n isolation: isolate;\n\n &.disabled {\n color: var(--kds-color-text-and-icon-disabled);\n }\n}\n\n/* stylelint-disable selector-class-pattern */\n.rich-text-editor {\n height: 100%;\n max-height: v-bind(\"maxHeightStyle\");\n padding: var(--kds-spacing-container-0-5x);\n overflow-y: auto;\n\n &.editable {\n cursor: text;\n background: var(--kds-color-background-input-initial);\n\n & :deep(.ProseMirror) {\n min-height: v-bind(\"minHeightStyle\");\n }\n }\n\n /* stylelint-disable knime/no-deep-nesting */\n & :deep(.ProseMirror) {\n height: 100%;\n\n /* The following rich text styles are kept in sync with KdsDescription. */\n p {\n padding: 0;\n margin: 0 0 var(--kds-spacing-container-0-37x);\n font: var(--kds-font-base-body-small);\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n p.small-text {\n font: var(--kds-font-base-subtext-xsmall);\n }\n\n strong,\n b {\n font-weight: var(--kds-core-font-weight-strong);\n }\n\n i,\n em {\n font-style: italic;\n }\n\n h3 {\n margin: 0;\n font: var(--kds-font-base-body-medium-strong);\n }\n\n h4 {\n margin: 0;\n font: var(--kds-font-base-body-small-strong);\n }\n\n pre {\n width: fit-content;\n padding: var(--kds-spacing-container-0-75x);\n font: var(--kds-font-base-code-xsmall);\n background: var(--kds-color-surface-subtle);\n border-radius: var(--kds-border-radius-container-0-25x);\n\n & > code {\n padding: 0;\n background: none;\n }\n }\n\n & :not(pre) > code {\n padding: var(--kds-spacing-container-0-12x)\n var(--kds-spacing-container-0-25x);\n font: var(--kds-font-base-code-xsmall);\n background: var(--kds-color-surface-subtle);\n box-decoration-break: clone;\n border-radius: var(--kds-border-radius-container-0-12x);\n }\n\n /** keep in sync with KdsLink */\n a {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: fit-content;\n max-width: 100%;\n padding: var(--kds-spacing-container-none)\n var(--kds-spacing-container-0-10x);\n font: var(--kds-font-base-body-small);\n color: var(--kds-color-text-and-icon-neutral);\n white-space: nowrap;\n text-decoration-line: underline;\n cursor: pointer;\n border-radius: var(--kds-border-radius-container-0-12x);\n\n &:focus-visible {\n outline: var(--kds-border-action-focused);\n outline-offset: var(--kds-spacing-container-none);\n }\n\n /** internal links */\n &[href^=\"http\"] {\n --link-color: var(--kds-color-text-and-icon-selected);\n\n color: var(--link-color);\n\n &:visited {\n --link-color: var(--kds-color-text-and-icon-info);\n\n color: var(--link-color);\n }\n\n &:hover {\n --link-color: var(--kds-color-text-and-icon-primary-inverted);\n\n color: var(--link-color);\n background-color: var(--kds-color-background-primary-bold-hover);\n }\n\n &:active {\n --link-color: var(--kds-color-text-and-icon-selected-inverted);\n\n color: var(--link-color);\n background-color: var(--kds-color-background-primary-bold-active);\n }\n\n &::after {\n display: block;\n width: var(--kds-dimension-icon-0-56x);\n height: var(--kds-dimension-icon-0-56x);\n margin-left: var(--kds-spacing-container-0-12x);\n content: \"\";\n background-color: var(--link-color);\n mask-image: v-bind(\"externalIcon\");\n mask-repeat: no-repeat;\n mask-size: contain;\n }\n }\n\n /** external links */\n &:not([href^=\"http\"]) {\n color: var(--kds-color-text-and-icon-neutral);\n\n &:visited {\n color: var(--kds-color-text-and-icon-info);\n }\n\n &:hover {\n background-color: var(--kds-color-background-neutral-hover);\n }\n\n &:active {\n background-color: var(--kds-color-background-neutral-active);\n }\n }\n }\n\n ol,\n ul {\n padding-left: var(--kds-spacing-container-2x);\n }\n\n dd {\n margin-left: var(--kds-spacing-container-1x);\n }\n\n table {\n border-spacing: var(--kds-spacing-container-0-25x) 0;\n border-collapse: separate;\n\n td,\n th {\n padding: var(--kds-spacing-container-0-25x);\n }\n\n th {\n font: var(--kds-font-base-body-small-strong);\n text-align: left;\n border-bottom: var(--kds-border-width-icon-stroke-l) solid\n var(--kds-color-border-neutral);\n }\n\n td {\n font: var(--kds-font-base-body-small);\n border-bottom: var(--kds-border-width-icon-stroke-s) solid\n var(--kds-color-border-neutral);\n }\n }\n }\n\n & :deep(.ProseMirror:focus-visible),\n & :deep(.ProseMirror:focus) {\n outline: transparent;\n }\n /* stylelint-enable selector-class-pattern */\n}\n\n.editor-wrapper.with-border {\n border: var(--kds-border-action-input);\n border-radius: var(--kds-border-radius-container-0-37x);\n\n &.disabled {\n border: var(--kds-border-action-disabled);\n }\n\n & .toolbar-wrapper {\n border-top-left-radius: var(--kds-border-radius-container-0-37x);\n border-top-right-radius: var(--kds-border-radius-container-0-37x);\n }\n\n & .rich-text-editor {\n border-bottom-right-radius: var(--kds-border-radius-container-0-37x);\n border-bottom-left-radius: var(--kds-border-radius-container-0-37x);\n }\n}\n\n.editor-wrapper.show-focus-ring {\n outline: var(--kds-border-action-focused);\n outline-offset: var(--kds-spacing-offset-focus);\n}\n\n.embedded-toolbar {\n height: var(--toolbar-height);\n padding: var(--kds-spacing-container-0-5x);\n overflow-x: auto;\n overscroll-behavior: contain;\n white-space: pre;\n scrollbar-width: none; /* for firefox */\n background: var(--kds-color-background-input-initial);\n border-bottom: var(--kds-border-base-muted);\n -ms-overflow-style: none; /* needed to hide scroll bar in edge */\n &::-webkit-scrollbar {\n display: none;\n }\n}\n\n.expand-enter-active,\n.expand-leave-active {\n transition: all 0.15s ease;\n}\n\n.expand-enter-from,\n.expand-leave-to {\n height: 0;\n opacity: 0;\n}\n\n.expand-enter-to,\n.expand-leave-from {\n height: var(--toolbar-height);\n opacity: 1;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, useId, useTemplateRef } from \"vue\";\n\nimport { KdsLabel } from \"@knime/kds-components\";\nimport type { KdsFormFieldExpose } from \"@knime/kds-components\";\n\nimport KdsRichTextEditor from \"./KdsRichTextEditor.vue\";\nimport type { KdsRichTextInputProps } from \"./types\";\n\nconst {\n id = undefined,\n label = undefined,\n ariaLabel = undefined,\n description = undefined,\n ...editorProps\n} = defineProps<KdsRichTextInputProps>();\n\nconst modelValue = defineModel<string>();\n\nconst emit = defineEmits<{\n blur: [];\n}>();\n\nconst fallbackId = useId();\nconst inputId = computed(() => id?.trim() || fallbackId);\nconst labelId = computed(() => `${inputId.value}-label`);\n\nconst isHovered = ref(false);\n\nconst editorRef =\n useTemplateRef<InstanceType<typeof KdsRichTextEditor>>(\"editor\");\n\ndefineExpose<KdsFormFieldExpose>({\n focus: () => editorRef.value?.focus(),\n});\n</script>\n\n<template>\n <div\n class=\"kds-rich-text-input\"\n @mouseenter=\"isHovered = true\"\n @mouseleave=\"isHovered = false\"\n >\n <KdsLabel\n v-if=\"label\"\n :id=\"labelId\"\n :label=\"label\"\n :description=\"description\"\n :show-description-button=\"isHovered\"\n />\n <KdsRichTextEditor\n ref=\"editor\"\n v-bind=\"editorProps\"\n v-model=\"modelValue\"\n with-border\n wrapper-focus-ring\n :aria-label=\"label ? undefined : ariaLabel\"\n :aria-labelledby=\"label ? labelId : undefined\"\n @blur=\"emit('blur')\"\n />\n </div>\n</template>\n\n<style scoped>\n.kds-rich-text-input {\n display: flex;\n flex-direction: column;\n}\n</style>\n"],"names":["navigatorUtils.isMac","_createBlock","_unref","_createVNode","_createElementVNode","_normalizeClass","_hoisted_1","url","text","_renderSlot","_openBlock","_createElementBlock","_Fragment","_renderList","_useModel","_Transition","RichTextEditorBaseToolbar","_withCtx","_mergeProps","_toHandlers","_createPropsRestProxy"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"index.js","sources":["../../../node_modules/.pnpm/@knime+utils@1.11.0_consola@3.4.2/node_modules/@knime/utils/src/navigator.ts","../../../node_modules/.pnpm/@knime+utils@1.11.0_consola@3.4.2/node_modules/@knime/utils/src/hotkeys.ts","../../styles/dist/img/icons/external-link.svg?url","../src/enums.ts","../src/toolbar/KdsCreateLinkModal.vue","../src/utils/paragraphTextStyle/index.ts","../src/toolbar/useLinkTool.ts","../src/toolbar/RichTextEditorBaseToolbar.vue","../src/toolbar/RichTextEditorToolbar.vue","../src/utils/custom-escape.ts","../src/utils/custom-hard-break.ts","../src/utils/custom-link.ts","../src/utils/custom-text-align.ts","../src/utils/paragraphTextStyle/extension.ts","../src/KdsRichTextEditor.vue","../src/KdsRichTextInput.vue"],"sourcesContent":["/**\n *\n * @returns true if the platform of the user is Mac\n */\nexport const isMac = (): boolean =>\n navigator?.userAgent?.toLowerCase()?.includes(\"mac\");\n\n/**\n *\n * @returns true if the platform of the user is Windows\n */\nexport const isWindows = (): boolean =>\n navigator?.userAgent?.toLowerCase()?.includes(\"windows\");\n","import { navigatorUtils } from \"@knime/utils\";\n\n/**\n * Checks if any modifier key (Ctrl, Meta, Alt, or Shift) is pressed.\n * @param {KeyboardEvent} event - The keyboard event to check.\n * @returns {boolean} True if a modifier key is pressed, otherwise false.\n */\nexport const isModifierKeyPressed = (event: KeyboardEvent): boolean => {\n return event.ctrlKey || event.metaKey || event.altKey || event.shiftKey;\n};\n\n/**\n * Checks if a specific key (or keys) were pressed without any modifier keys.\n * @param {KeyboardEvent} event - The keyboard event to check.\n * @param {string | string[]} keys - The key or keys to check for.\n * @returns {boolean} True if the specified key(s) were pressed without modifiers, otherwise false.\n */\nexport const isKeyWithoutModifiers = (\n event: KeyboardEvent,\n keys: string | string[],\n): boolean => {\n const keyList = Array.isArray(keys) ? keys : [keys];\n return keyList.includes(event.key) && !isModifierKeyPressed(event);\n};\n\n/**\n *\n * @returns name of the primary modifier key for the current platform\n */\nexport const getMetaOrCtrlKey = (): \"ctrlKey\" | \"metaKey\" => {\n return navigatorUtils.isMac() ? \"metaKey\" : \"ctrlKey\";\n};\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20stroke='currentColor'%20stroke-linecap='round'%20stroke-linejoin='round'%20viewBox='0%200%2012%2012'%3e%3cpath%20d='M5.5%201.5h-3a1%201%200%200%200-1%201v7a1%201%200%200%200%201%201h7a1%201%200%200%200%201-1v-3m0-5L6%205.892M10.5%201.5v2.75m0-2.75H7.75'%20vector-effect='non-scaling-stroke'/%3e%3c/svg%3e\"","export const kdsCharacterCountDisplay = {\n NEVER: \"never\",\n ALWAYS: \"always\",\n AT_LIMIT: \"atLimit\",\n} as const;\n\nexport const kdsCharacterCountDisplays = Object.values(\n kdsCharacterCountDisplay,\n);\n","<script setup lang=\"ts\">\nimport { type Ref, computed, nextTick, ref, watch } from \"vue\";\n\nimport { KdsButton, KdsModal, KdsTextInput } from \"@knime/kds-components\";\n\ntype Props = {\n text: Ref<string>;\n url: Ref<string>;\n isActive: Ref<boolean>;\n isEdit: Ref<boolean>;\n urlValidator: (url: string) => boolean;\n};\n\nconst props = defineProps<Props>();\n\nconst inputRef = ref<HTMLInputElement | null>(null);\n\nconst editedText = ref(props.text.value);\nconst editedUrl = ref(props.url.value);\n\nwatch(\n () => props.isActive.value,\n async (isOpen: boolean) => {\n if (!isOpen) {\n return;\n }\n editedText.value = props.text.value;\n editedUrl.value = props.url.value;\n\n // Wait a tick as KdsModal internally also waits for the DOM to update before calling showModal()\n await nextTick();\n\n // Focus first input field, requestAnimationFrame ensures the browser has un-hidden the modal\n requestAnimationFrame(() => {\n inputRef.value?.focus();\n });\n },\n);\n\nconst emit = defineEmits<{\n addLink: [text: string, url: string];\n removeLink: [];\n cancelAddLink: [];\n}>();\n\nconst closeModal = () => {\n emit(\"cancelAddLink\");\n};\n\nconst onSubmit = () => {\n emit(\"addLink\", editedText.value, editedUrl.value);\n};\n\nconst validateUrl = () => {\n const validScheme = props.urlValidator(editedUrl.value);\n\n return !editedUrl.value || validScheme;\n};\n\nconst isValid = computed(() => {\n const textChanged = editedText.value !== props.text.value;\n const urlChanged = editedUrl.value !== props.url.value;\n const urlNotEmpty = editedUrl.value !== \"\";\n\n return (textChanged || urlChanged) && validateUrl() && urlNotEmpty;\n});\n\nconst onkeyup = (keyupEvent: KeyboardEvent) => {\n if (keyupEvent.key === \"Enter\" && isValid.value) {\n onSubmit();\n }\n};\n</script>\n\n<template>\n <KdsModal\n :active=\"isActive.value\"\n :headline=\"isEdit.value ? 'Edit link' : 'Insert link'\"\n class=\"modal\"\n @close=\"closeModal\"\n >\n <template #body>\n <KdsTextInput\n ref=\"inputRef\"\n v-model=\"editedText\"\n label=\"Link text\"\n type=\"text\"\n @keyup=\"onkeyup\"\n />\n\n <KdsTextInput\n v-model=\"editedUrl\"\n label=\"URL\"\n :sub-text=\"\n !validateUrl() ? 'Enter a valid URL (e.g. https://example.com)' : ''\n \"\n :error=\"!validateUrl()\"\n :preserve-sub-text-space=\"true\"\n @keyup=\"onkeyup\"\n />\n </template>\n\n <template #footer>\n <div class=\"modal-footer\" :class=\"{ 'spread-buttons': isEdit.value }\">\n <KdsButton\n :variant=\"isEdit.value ? 'transparent' : 'outlined'\"\n size=\"small\"\n label=\"Cancel\"\n @click=\"closeModal\"\n />\n <div class=\"controls-apply-group\">\n <KdsButton\n v-if=\"isEdit.value\"\n variant=\"outlined\"\n size=\"small\"\n label=\"Remove URL\"\n @click=\"emit('removeLink')\"\n />\n <KdsButton\n variant=\"filled\"\n size=\"small\"\n :label=\"isEdit.value ? 'Apply' : 'Insert link'\"\n :disabled=\"!isValid\"\n @click=\"onSubmit\"\n />\n </div>\n </div>\n </template>\n </KdsModal>\n</template>\n\n<style scoped>\n.modal {\n --modal-width: var(--kds-dimension-component-width-32x);\n}\n\n.modal-footer {\n display: flex;\n gap: var(--kds-spacing-container-0-5x);\n align-items: center;\n justify-content: flex-end;\n width: 100%;\n\n &.spread-buttons {\n justify-content: space-between;\n }\n}\n\n.controls-apply-group {\n display: flex;\n gap: var(--kds-spacing-container-0-5x);\n}\n</style>\n","import type { Level } from \"@tiptap/extension-heading\";\nimport type { Editor } from \"@tiptap/vue-3\";\n\nimport type {\n EditorToolSecondaryItem,\n EditorToolSecondaryItemChild,\n} from \"../../toolbar/types\";\n\nconst clearHeading = (editor: Editor) => {\n const maxLevel = 6;\n for (let i = 1; i <= maxLevel; i++) {\n if (editor.isActive(\"heading\", { level: i })) {\n editor\n .chain()\n .focus()\n .toggleHeading({ level: i as Level })\n .run();\n break;\n }\n }\n};\n\nconst getHeadingOptionChild = (level: Level, getEditor: () => Editor) =>\n ({\n id: `${level}`,\n text: `Heading ${level}`,\n hotkey: [\"Ctrl\", \"Alt\", `${level}`],\n active: () => getEditor().isActive(\"heading\", { level }),\n handler: () => {\n const editor = getEditor();\n editor.chain().focus().toggleHeading({ level }).run();\n },\n }) satisfies EditorToolSecondaryItemChild;\n\nexport const getParagraphTextStyleTool = (\n getEditor: () => Editor,\n): EditorToolSecondaryItem => {\n return {\n id: \"paragraphTextStyle\",\n type: \"secondary\",\n icon: \"textstyles\",\n text: \"Text style\",\n children: [\n {\n id: \"standard\",\n text: \"Standard\",\n hotkey: [\"Ctrl\", \"Alt\", \"0\"],\n handler: () => {\n const editor = getEditor();\n clearHeading(editor);\n editor.chain().focus().unsetSmallText().run();\n },\n },\n {\n id: \"small\",\n text: \"Small text\",\n hotkey: [\"Ctrl\", \"Alt\", \"−\"], // this is a wider minus character for aesthetic reasons\n active: () => getEditor().isActive({ smallText: true }),\n handler: () => {\n const editor = getEditor();\n clearHeading(editor);\n editor.chain().focus().setSmallText().run();\n },\n },\n ...Array.from({ length: 6 }, (_, i) =>\n getHeadingOptionChild((i + 1) as Level, getEditor),\n ),\n ],\n };\n};\n","import { computed, onMounted, onUnmounted, ref } from \"vue\";\nimport type { Editor } from \"@tiptap/vue-3\";\n\nimport { getMetaOrCtrlKey } from \"@knime/utils\";\n\nimport type { KdsLinkToolOptions } from \"../utils/custom-link\";\n\nexport const useLinkTool = ({\n editor,\n isRegistered,\n linkToolOptions,\n}: {\n editor: Editor;\n isRegistered: boolean;\n linkToolOptions: KdsLinkToolOptions;\n}) => {\n if (!isRegistered) {\n return null;\n }\n\n const isActive = ref(false);\n const text = ref(\"\");\n const url = ref(\"\");\n const isEdit = computed(() => url.value !== \"\");\n const isReplacingText = ref(false);\n\n const onLinkToolClick = () => {\n const { view, state } = editor;\n const { from, to } = view.state.selection;\n\n const currentLink = editor.getAttributes(\"link\").href;\n url.value = currentLink || \"\";\n\n if (currentLink) {\n const hasSelection = from !== to;\n if (hasSelection) {\n // manually update the cursor position to get the entire link text\n const newCursorPosition = from + Math.floor((to - from) / 2);\n editor.chain().focus().setTextSelection(newCursorPosition).run();\n }\n\n const textBefore =\n view.state.selection.$from.nodeBefore?.textContent ?? \"\";\n const textAfter = view.state.selection.$to.nodeAfter?.textContent ?? \"\";\n\n text.value = textBefore + textAfter;\n } else {\n text.value = state.doc.textBetween(from, to, \"\");\n }\n\n isReplacingText.value = Boolean(currentLink || text.value);\n isActive.value = true;\n };\n\n const onRemoveLink = () => {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n\n isActive.value = false;\n isReplacingText.value = false;\n };\n\n const addCustomLink = ({\n isEditing,\n url,\n urlText,\n text,\n }: {\n isEditing: boolean;\n url: string;\n urlText: string;\n text: string;\n }) => {\n if (isEditing) {\n editor\n .chain()\n .focus()\n .setLink({ href: url })\n .command(({ tr }) => {\n tr.insertText(text || urlText);\n return true;\n })\n .run();\n } else {\n // TODO replace this rather complicated way to add a link once the tiptap bug is fixed\n const { view } = editor;\n const { from: startIndex } = view.state.selection;\n\n // escape link with space when creating a new link\n editor\n .chain()\n .focus()\n .insertContent([{ type: \"text\", text: \" \" }])\n .run();\n editor\n .chain()\n .focus()\n .insertContentAt(startIndex, [{ type: \"text\", text: text || urlText }])\n .run();\n\n const { from: endIndex } = view.state.selection;\n\n editor.commands.setTextSelection({\n from: startIndex,\n to: endIndex,\n });\n\n editor.chain().focus().setLink({ href: url }).run();\n }\n };\n\n const onAddLink = (text: string, urlText: string) => {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n\n if (urlText) {\n const url = linkToolOptions.sanitizeUrlText?.(urlText) ?? urlText;\n\n addCustomLink({\n isEditing: isReplacingText.value,\n urlText,\n url,\n text,\n });\n }\n\n isActive.value = false;\n isReplacingText.value = false;\n };\n\n const onCancelAddLink = () => {\n isActive.value = false;\n isReplacingText.value = false;\n };\n\n /**\n * Handle custom hotkeys for link tool that are not supported by tiptap.\n */\n const onKeyDown = (event: KeyboardEvent) => {\n if (!editor?.isFocused) {\n return;\n }\n const ctrlPressed = event[getMetaOrCtrlKey()];\n if (ctrlPressed && event.key === \"k\") {\n event.preventDefault();\n onLinkToolClick();\n }\n };\n onMounted(() => {\n window.addEventListener(\"keydown\", onKeyDown);\n });\n\n onUnmounted(() => {\n window.removeEventListener(\"keydown\", onKeyDown);\n });\n\n return {\n onLinkToolClick,\n props: {\n url,\n text,\n isActive,\n isEdit,\n urlValidator: linkToolOptions.urlValidator,\n },\n events: {\n addLink: onAddLink,\n removeLink: onRemoveLink,\n cancelAddLink: onCancelAddLink,\n },\n };\n};\n","<script setup lang=\"ts\">\nimport type { Editor } from \"@tiptap/vue-3\";\n\nimport type { KdsBaseExtensionsConfig } from \"../types\";\nimport type { KdsLinkToolOptions } from \"../utils/custom-link\";\nimport { getParagraphTextStyleTool } from \"../utils/paragraphTextStyle\";\n\nimport type { EditorToolItem, EditorTools } from \"./types\";\nimport { useLinkTool } from \"./useLinkTool\";\n\ntype Props = {\n editor: Editor;\n baseExtensions: KdsBaseExtensionsConfig | { all: true };\n linkToolOptions: KdsLinkToolOptions;\n};\n\nconst props = defineProps<Props>();\n\nconst registerTool = (\n toolName: keyof KdsBaseExtensionsConfig,\n tool: EditorToolItem,\n) => {\n if (\"all\" in props.baseExtensions) {\n return [tool];\n }\n\n return props.baseExtensions[toolName] ? [tool] : [];\n};\n\nconst isToolRegistered = (toolName: keyof KdsBaseExtensionsConfig) => {\n if (\"all\" in props.baseExtensions) {\n return true;\n }\n\n return Boolean(props.baseExtensions[toolName]);\n};\n\nconst isListActive = () =>\n props.editor.isActive(\"orderedList\") || props.editor.isActive(\"bulletList\");\n\nconst linkTool = useLinkTool({\n editor: props.editor,\n isRegistered: isToolRegistered(\"link\"),\n linkToolOptions: props.linkToolOptions,\n});\n\nconst editorTools: EditorTools = [\n ...registerTool(\"bold\", {\n id: \"bold\",\n type: \"primary\",\n text: \"Bold\",\n hotkey: [\"Ctrl\", \"B\"],\n icon: \"bold\",\n active: () => props.editor.isActive(\"bold\"),\n handler: () => props.editor.chain().focus().toggleBold().run(),\n }),\n\n ...registerTool(\"italic\", {\n id: \"italic\",\n type: \"primary\",\n text: \"Italic\",\n icon: \"italic\",\n hotkey: [\"Ctrl\", \"I\"],\n active: () => props.editor.isActive(\"italic\"),\n handler: () => props.editor.chain().focus().toggleItalic().run(),\n }),\n\n ...registerTool(\"underline\", {\n id: \"underline\",\n type: \"primary\",\n text: \"Underline\",\n icon: \"underline\",\n hotkey: [\"Ctrl\", \"U\"],\n active: () => props.editor.isActive(\"underline\"),\n handler: () => props.editor.chain().focus().toggleUnderline().run(),\n }),\n\n ...registerTool(\"bulletList\", {\n id: \"bulletList\",\n type: \"primary\",\n text: \"Bullet list\",\n icon: \"list-bulletpoint\",\n hotkey: [\"Ctrl\", \"Shift\", \"8\"],\n active: () => props.editor.isActive(\"bulletList\"),\n handler: () => {\n const commandChain = props.editor.chain().focus();\n if (isToolRegistered(\"textAlign\")) {\n commandChain.setTextAlign(\"left\");\n }\n\n commandChain.toggleBulletList().run();\n },\n }),\n\n ...registerTool(\"orderedList\", {\n id: \"orderedList\",\n type: \"primary\",\n text: \"Ordered list\",\n icon: \"list-number\",\n hotkey: [\"Ctrl\", \"Shift\", \"7\"],\n active: () => props.editor.isActive(\"orderedList\"),\n handler: () => {\n const commandChain = props.editor.chain().focus();\n if (isToolRegistered(\"textAlign\")) {\n commandChain.setTextAlign(\"left\");\n }\n\n commandChain.toggleOrderedList().run();\n },\n }),\n\n ...registerTool(\"textAlign\", {\n id: \"align-left\",\n type: \"primary\",\n icon: \"left-aligned\",\n text: \"Align left\",\n hotkey: [\"Ctrl\", \"Shift\", \"L\"],\n active: () =>\n !isListActive() && props.editor.isActive({ textAlign: \"left\" }),\n handler: () => props.editor.chain().focus().setTextAlign(\"left\").run(),\n disabled: () => isListActive(),\n }),\n\n ...registerTool(\"textAlign\", {\n id: \"align-center\",\n type: \"primary\",\n icon: \"center-aligned\",\n text: \"Align center\",\n hotkey: [\"Ctrl\", \"Shift\", \"E\"],\n active: () =>\n !isListActive() && props.editor.isActive({ textAlign: \"center\" }),\n handler: () => props.editor.chain().focus().setTextAlign(\"center\").run(),\n disabled: () => isListActive(),\n }),\n\n ...registerTool(\"textAlign\", {\n id: \"align-right\",\n type: \"primary\",\n icon: \"right-aligned\",\n text: \"Align right\",\n hotkey: [\"Ctrl\", \"Shift\", \"R\"],\n active: () =>\n !isListActive() && props.editor.isActive({ textAlign: \"right\" }),\n handler: () => props.editor.chain().focus().setTextAlign(\"right\").run(),\n disabled: () => isListActive(),\n }),\n\n ...registerTool(\"link\", {\n id: \"link\",\n type: \"primary\",\n icon: \"link\",\n text: \"Link\",\n hotkey: [\"Ctrl\", \"K\"],\n active: () => props.editor.isActive(\"link\"),\n handler: () => linkTool?.onLinkToolClick(),\n }),\n\n ...registerTool(\n \"paragraphTextStyle\",\n getParagraphTextStyleTool(() => props.editor),\n ),\n\n ...registerTool(\"blockquote\", {\n id: \"blockquote\",\n type: \"secondary\",\n icon: \"quote\",\n text: \"Blockquote\",\n active: () => props.editor.isActive(\"blockquote\"),\n handler: () => props.editor.chain().focus().toggleBlockquote().run(),\n }),\n\n ...registerTool(\"codeBlock\", {\n id: \"codeBlock\",\n type: \"secondary\",\n icon: \"code-block\",\n text: \"Code block\",\n hotkey: [\"Ctrl\", \"Alt\", \"C\"],\n active: () => props.editor.isActive(\"codeBlock\"),\n handler: () => props.editor.chain().focus().toggleCodeBlock().run(),\n }),\n\n ...registerTool(\"strike\", {\n id: \"strikethrough\",\n type: \"secondary\",\n icon: \"strikethrough\",\n text: \"Strikethrough\",\n hotkey: [\"Ctrl\", \"Shift\", \"X\"],\n active: () => props.editor.isActive(\"strike\"),\n handler: () => props.editor.chain().focus().toggleStrike().run(),\n }),\n\n ...registerTool(\"horizontalRule\", {\n id: \"horizontalRule\",\n type: \"secondary\",\n icon: \"divider\",\n text: \"Divider\",\n active: () => false,\n handler: () => props.editor.chain().focus().setHorizontalRule().run(),\n }),\n];\n</script>\n\n<template>\n <slot :tools=\"editorTools\" />\n <slot :link-tool=\"linkTool\" name=\"linkModal\" />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport type { Editor } from \"@tiptap/vue-3\";\n\nimport {\n KdsMenuButton,\n type KdsMenuItem,\n KdsToggleButton,\n} from \"@knime/kds-components\";\n\nimport type {\n EditorToolPrimaryItem,\n EditorToolSecondaryItem,\n EditorTools,\n} from \"./types\";\n\ntype Props = {\n editor: Editor;\n tools: EditorTools;\n hotkeyFormatter: (hotkey: Array<string>) => string;\n};\n\nconst props = defineProps<Props>();\n\nconst baseTools = computed(\n () =>\n props.tools.filter(\n ({ type }) => type === \"primary\",\n ) as EditorToolPrimaryItem[],\n);\n\nconst secondaryTools = computed(\n () =>\n props.tools.filter(\n ({ type }) => type === \"secondary\",\n ) as EditorToolSecondaryItem[],\n);\n\nconst secondaryToolsMenuItems = computed<KdsMenuItem[]>(() => {\n const tools = secondaryTools.value.map((tool) => {\n const base = {\n id: tool.id,\n text: tool.text,\n disabled: tool.disabled?.(),\n shortcut: props.hotkeyFormatter(tool.hotkey ?? []),\n accessory: {\n type: \"icon\",\n name: tool.icon,\n },\n } satisfies KdsMenuItem;\n\n if (tool.children) {\n return {\n ...base,\n children: tool.children.map((toolChild) => {\n return {\n id: toolChild.id,\n text: toolChild.text,\n shortcut: props.hotkeyFormatter(toolChild.hotkey ?? []),\n handler: () => toolChild.handler(toolChild.id),\n };\n }),\n } satisfies KdsMenuItem;\n }\n\n return {\n ...base,\n handler: () => tool.handler(tool.id),\n } satisfies KdsMenuItem;\n });\n\n return tools;\n});\n</script>\n\n<template>\n <div class=\"tools\">\n <KdsToggleButton\n v-for=\"tool of baseTools\"\n :key=\"tool.id\"\n class=\"tool\"\n :ariaLabel=\"tool.text\"\n :data-testid=\"tool.id\"\n :disabled=\"tool.disabled?.()\"\n :toggled=\"tool.active?.()\"\n :leading-icon=\"tool.icon\"\n :title=\"hotkeyFormatter(tool.hotkey ?? [])\"\n variant=\"transparent\"\n size=\"small\"\n @keydown.enter.prevent=\"tool.handler?.(tool.id)\"\n @click.stop=\"tool.handler?.(tool.id)\"\n />\n\n <KdsMenuButton\n v-if=\"secondaryTools.length > 0\"\n :items=\"secondaryToolsMenuItems\"\n leading-icon=\"more-actions\"\n ariaLabel=\"More actions\"\n variant=\"transparent\"\n size=\"small\"\n />\n </div>\n</template>\n\n<style scoped>\n.tools {\n display: flex;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n height: 100%;\n}\n</style>\n","import { Extension } from \"@tiptap/vue-3\";\n\n/**\n * TODO UIEXT-1461 Remove and resolve properly with https://knime-com.atlassian.net/browse/UIEXT-1461-\n */\ntype CustomEscapeExtensionOptions = {\n handler: () => boolean;\n};\n\ndeclare module \"@tiptap/core\" {\n interface ExtensionOptions {\n customEscape: CustomEscapeExtensionOptions;\n }\n}\n\nexport const CustomEscape = Extension.create<CustomEscapeExtensionOptions>({\n name: \"OverrideEscape\",\n\n addOptions() {\n return {\n handler: () => false,\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Escape: this.options.handler,\n };\n },\n});\n","import HardBreak from \"@tiptap/extension-hard-break\";\n\nexport const CustomHardBreak = HardBreak.extend({\n addKeyboardShortcuts() {\n return {\n \"Shift-Enter\": () => this.editor.commands.setHardBreak(),\n };\n },\n});\n","import { getAttributes } from \"@tiptap/core\";\nimport Link from \"@tiptap/extension-link\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\n\nimport { getMetaOrCtrlKey, navigatorUtils } from \"@knime/utils\";\n\nconst buildUrlRegex = () => {\n const httpPrefixCheck = \"(http://www\\\\.|https://www\\\\.|http://|https://)\";\n\n const urlCheck =\n \"[a-z0-9]+([-.]{1}[a-z0-9]+)*\\\\.[a-z]{2,5}(:[0-9]{1,5})?(/.*)?\";\n\n return new RegExp(`^${httpPrefixCheck}?${urlCheck}$`);\n};\n\nconst URL_REGEX = buildUrlRegex();\n\nexport const validateURL = (href: string) => URL_REGEX.test(href);\n\nexport type KdsLinkToolOptions = {\n /**\n * Custom function that can be supplied to validate urls added with the link tool\n * @param url The url of the link to be added\n */\n urlValidator: (url: string) => boolean;\n /**\n * Custom function that can, e.g., be used to append a protocol like https:// to a url if not present\n * @param url The url of the link to be added\n */\n sanitizeUrlText: (url: string) => string;\n};\n\nexport const kdsDefaultLinkToolOptions: KdsLinkToolOptions = {\n urlValidator: validateURL,\n sanitizeUrlText: (urlText: string) => {\n const containsHttp = [\"http://\", \"https://\"].some((protocol) =>\n urlText.includes(protocol),\n );\n return containsHttp ? urlText : `https://${urlText}`;\n },\n};\n\nexport const CustomLink = Link.extend({\n addAttributes() {\n const modifier = navigatorUtils.isMac() ? \"⌘\" : \"Ctrl +\";\n\n return {\n ...this.parent?.(),\n\n draggable: {\n default: \"false\",\n },\n\n title: {\n default: `Use \"${modifier} click\" to follow link`,\n },\n\n rel: {\n default: \"ugc noopener noreferrer nofollow\",\n },\n };\n },\n\n addProseMirrorPlugins() {\n const plugins: Plugin[] = this.parent?.() || [];\n\n const ctrlClickHandler = new Plugin({\n key: new PluginKey(\"handleControlClick\"),\n props: {\n handleClick(view, _pos, event) {\n const attrs = getAttributes(view.state, \"link\");\n const link = (event.target as HTMLElement)?.closest(\"a\");\n\n const metaOrCtrlKeyPressed = event[getMetaOrCtrlKey()];\n\n if (metaOrCtrlKeyPressed && link && attrs.href) {\n window.open(attrs.href, attrs.target);\n }\n // always return true, otherwise the cursor disappears, which causes some unexpected bugs\n // see: https://knime-com.atlassian.net/browse/HUB-8669\n return true;\n },\n },\n });\n\n plugins.push(ctrlClickHandler);\n\n return plugins;\n },\n});\n","import TextAlign from \"@tiptap/extension-text-align\";\n\nexport const CustomTextAlign = TextAlign.extend({\n addKeyboardShortcuts() {\n const canActivate = () => {\n return !(\n this.editor.isActive(\"bulletList\") ||\n this.editor.isActive(\"orderedList\")\n );\n };\n\n return {\n \"Mod-Shift-l\": () =>\n canActivate() && this.editor.commands.setTextAlign(\"left\"),\n \"Mod-Shift-e\": () =>\n canActivate() && this.editor.commands.setTextAlign(\"center\"),\n \"Mod-Shift-r\": () =>\n canActivate() && this.editor.commands.setTextAlign(\"right\"),\n };\n },\n});\n","import Paragraph from \"@tiptap/extension-paragraph\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n fontSize: {\n /**\n * Sets a custom class on the paragraph which is used to set a small font size\n */\n setSmallText: () => ReturnType;\n /**\n * Reverts setSmallText\n */\n unsetSmallText: () => ReturnType;\n };\n }\n}\n\nconst SmallText = Paragraph.extend({\n addAttributes() {\n const smallTextClass = \"small-text\";\n return {\n ...this.parent?.(),\n smallText: {\n default: false,\n parseHTML: (element) => element.className === smallTextClass,\n renderHTML: (attributes) => {\n return attributes.smallText\n ? {\n class: smallTextClass,\n }\n : {};\n },\n },\n };\n },\n\n addCommands() {\n return {\n ...this.parent?.(),\n setSmallText:\n () =>\n ({ commands }) => {\n return commands.toggleNode(this.name, \"paragraph\", {\n smallText: true,\n });\n },\n unsetSmallText:\n () =>\n ({ chain }) => {\n return chain()\n .updateAttributes(this.name, { smallText: false })\n .run();\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n ...this.parent?.(),\n \"Mod-Alt--\": () => this.editor.commands.setSmallText(),\n };\n },\n});\n\nexport { SmallText };\n","<script setup lang=\"ts\">\nimport {\n computed,\n nextTick,\n onMounted,\n ref,\n useId,\n useSlots,\n watch,\n} from \"vue\";\nimport CharacterCount from \"@tiptap/extension-character-count\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport { type AnyExtension, EditorContent, useEditor } from \"@tiptap/vue-3\";\n\nimport { KdsSubText } from \"@knime/kds-components\";\nimport { navigatorUtils } from \"@knime/utils\";\n\nimport ExternalLinkIconUrl from \"../node_modules/@knime/kds-styles/dist/img/icons/external-link.svg?url\";\n\nimport { kdsCharacterCountDisplay } from \"./enums\";\nimport KdsCreateLinkModal from \"./toolbar/KdsCreateLinkModal.vue\";\nimport RichTextEditorBaseToolbar from \"./toolbar/RichTextEditorBaseToolbar.vue\";\nimport RichTextEditorToolbar from \"./toolbar/RichTextEditorToolbar.vue\";\nimport type { KdsBaseExtensionsConfig, KdsRichTextEditorProps } from \"./types\";\nimport { CustomEscape } from \"./utils/custom-escape.ts\";\nimport { CustomHardBreak } from \"./utils/custom-hard-break\";\nimport {\n CustomLink,\n kdsDefaultLinkToolOptions,\n validateURL,\n} from \"./utils/custom-link\";\nimport { CustomTextAlign } from \"./utils/custom-text-align\";\nimport { SmallText } from \"./utils/paragraphTextStyle/extension\";\n\nconst {\n editable = true,\n minHeight = null,\n maxHeight = null,\n baseExtensions = {} as KdsBaseExtensionsConfig,\n hotkeyFormatter = (hotkey: string[]) => {\n const MacOSkeyMap: Record<string, string> = {\n Shift: \"⇧\",\n Ctrl: \"⌘\",\n Alt: \"⌥\",\n };\n\n const mapSymbols = (key: string) => MacOSkeyMap[key] || key;\n const identityFn = (value: unknown) => value;\n\n return (\n hotkey\n // map only for mac the symbols that should be displayed differently\n .map(navigatorUtils.isMac() ? mapSymbols : identityFn)\n .join(\" \")\n );\n },\n customExtensions = [] as Array<AnyExtension>,\n autofocus = false,\n withBorder = true,\n disabled = false,\n linkToolOptions = kdsDefaultLinkToolOptions,\n characterLimit = {},\n subText = undefined,\n error = false,\n validating = false,\n preserveSubTextSpace = false,\n customEscapeHandler = undefined,\n ariaLabel = undefined,\n ariaLabelledby = undefined,\n wrapperFocusRing = false,\n} = defineProps<KdsRichTextEditorProps>();\n\n// we need to define a minimum amount for a character limit so that we\n// can make static calculations for the character counter and show it\n// only when the user has 100 chars or less left\nconst MIN_CHARACTER_LIMIT = 200;\n// number of remaining characters at or below which the counter is surfaced\n// when `display` is set to `atLimit`\nconst AT_LIMIT_THRESHOLD = 100;\n\nconst hardCharacterLimit = Math.max(\n characterLimit.maxCharacters ?? 1000,\n MIN_CHARACTER_LIMIT,\n);\nconst characterCountDisplay =\n characterLimit.display ?? kdsCharacterCountDisplay.NEVER;\n\nconst slots = useSlots();\n\n// this assumes a svg without any double quotes\nconst externalIcon = `url(\"${ExternalLinkIconUrl}\")`;\n\nconst modelValue = defineModel<string>();\n\nconst emit = defineEmits<{\n blur: [];\n}>();\n\nconst isToolEnabled = (extensionName: keyof KdsBaseExtensionsConfig) => {\n if (\"all\" in baseExtensions) {\n return true;\n }\n\n return Boolean(baseExtensions[extensionName]);\n};\n\nconst getStarterKitExtensionConfig = (\n extensionName: keyof KdsBaseExtensionsConfig,\n): false | undefined | Partial<unknown> => {\n return isToolEnabled(extensionName) ? undefined : false;\n};\n\nconst extensions = [\n StarterKit.configure({\n bold: getStarterKitExtensionConfig(\"bold\"),\n italic: getStarterKitExtensionConfig(\"italic\"),\n bulletList: getStarterKitExtensionConfig(\"bulletList\"),\n orderedList: getStarterKitExtensionConfig(\"orderedList\"),\n heading: getStarterKitExtensionConfig(\"heading\"),\n blockquote: getStarterKitExtensionConfig(\"blockquote\"),\n code: getStarterKitExtensionConfig(\"code\"),\n codeBlock: getStarterKitExtensionConfig(\"codeBlock\"),\n horizontalRule: getStarterKitExtensionConfig(\"horizontalRule\"),\n strike: getStarterKitExtensionConfig(\"strike\"),\n underline: getStarterKitExtensionConfig(\"underline\"),\n ...(isToolEnabled(\"paragraphTextStyle\") && { paragraph: false }),\n hardBreak: false,\n // StarterKit v3 bundles a link extension, but we register our own\n // CustomLink (opt-in via baseExtensions) for the custom validation,\n // attributes and ctrl/cmd-click handling, so the bundled one is disabled\n // to avoid a duplicate-extension conflict.\n link: false,\n }),\n\n ...(isToolEnabled(\"paragraphTextStyle\") ? [SmallText] : []),\n ...(isToolEnabled(\"textAlign\")\n ? [\n CustomTextAlign.configure({\n types: [\n isToolEnabled(\"heading\") ? \"heading\" : \"\",\n \"paragraph\",\n ].filter(Boolean),\n\n alignments: [\"left\", \"right\", \"center\"],\n }),\n ]\n : []),\n\n ...(isToolEnabled(\"link\")\n ? [CustomLink.configure({ validate: validateURL, openOnClick: false })]\n : []),\n\n CustomHardBreak,\n CharacterCount.configure({\n limit: hardCharacterLimit,\n }),\n\n ...(customEscapeHandler\n ? [CustomEscape.configure({ handler: customEscapeHandler })]\n : []),\n\n ...customExtensions,\n];\n\nconst subTextId = useId();\n\n// Tracks focus of the editing area itself (not the toolbar). Used to draw the\n// `wrapperFocusRing` only while the user is editing — focusing a toolbar button\n// fires the editor's blur, so the ring correctly disappears.\nconst isEditorFocused = ref(false);\n\nconst editor = useEditor({\n content: modelValue.value,\n editable: editable && !disabled,\n autofocus,\n extensions,\n editorProps: {\n attributes: {\n ...(ariaLabel ? { \"aria-label\": ariaLabel } : {}),\n ...(ariaLabelledby ? { \"aria-labelledby\": ariaLabelledby } : {}),\n \"aria-describedby\": subTextId,\n },\n },\n onUpdate: () => {\n modelValue.value = editor.value?.getHTML() ?? \"\";\n },\n onFocus: () => {\n isEditorFocused.value = true;\n },\n onBlur: () => {\n isEditorFocused.value = false;\n emit(\"blur\");\n },\n});\n\nconst minHeightStyle = computed(() =>\n minHeight ? `${minHeight}px` : \"initial\",\n);\n\nconst focus = () => {\n editor.value?.commands?.focus?.();\n};\n\ndefineExpose({ focus });\n\nconst maxHeightStyle = computed(() =>\n maxHeight ? `${maxHeight}px` : \"initial\",\n);\n\nwatch(modelValue, (newValue) => {\n if (!editor.value) {\n return;\n }\n if (editor.value.getHTML() === newValue) {\n return;\n }\n\n editor.value.commands.setContent(newValue ?? \"\");\n});\n\nwatch(\n [() => editable, () => disabled],\n ([newEditable, newDisabled], [oldEditable, oldDisabled]) => {\n if (!editor.value) {\n return;\n }\n\n const oldValue = oldEditable && !oldDisabled;\n const newValue = newEditable && !newDisabled;\n if (oldValue === newValue) {\n return;\n }\n\n editor.value.setEditable(newValue);\n\n if (autofocus) {\n focus();\n }\n },\n);\n\nonMounted(async () => {\n if (editable && autofocus) {\n await nextTick();\n focus();\n }\n});\n\nconst hasCustomToolbar = slots.customToolbar;\nconst hasTools = computed(() => Object.keys(baseExtensions).length);\n\nconst characterCount = computed(\n () => editor.value?.storage.characterCount.characters() ?? 0,\n);\n\nconst showCharacterCount = computed(() => {\n if (!editor.value || !editable) {\n return false;\n }\n\n switch (characterCountDisplay) {\n case kdsCharacterCountDisplay.ALWAYS:\n return true;\n case kdsCharacterCountDisplay.AT_LIMIT:\n return hardCharacterLimit - characterCount.value <= AT_LIMIT_THRESHOLD;\n default:\n return false;\n }\n});\n\n// A provided `subText` (e.g. a validation message) takes precedence over the\n// character count display.\nconst hasSubTextOverride = computed(() => Boolean(subText));\n\nconst subTextValue = computed(() => {\n if (hasSubTextOverride.value) {\n return subText;\n }\n return showCharacterCount.value\n ? `${characterCount.value} / ${hardCharacterLimit} characters`\n : undefined;\n});\n</script>\n\n<template>\n <div>\n <div\n :class=\"[\n 'editor-wrapper',\n {\n 'with-border': withBorder,\n disabled,\n 'show-focus-ring': wrapperFocusRing && isEditorFocused,\n },\n ]\"\n >\n <div\n v-if=\"hasTools && editor && editable && !disabled\"\n :class=\"['toolbar-wrapper', { 'embedded-toolbar': !hasCustomToolbar }]\"\n >\n <RichTextEditorBaseToolbar\n :editor=\"editor\"\n :base-extensions=\"baseExtensions\"\n :link-tool-options=\"linkToolOptions\"\n >\n <template #default=\"{ tools }\">\n <slot\n name=\"customToolbar\"\n :editor=\"editor\"\n :tools=\"tools\"\n :hotkey-formatter=\"hotkeyFormatter\"\n >\n <RichTextEditorToolbar\n :editor=\"editor\"\n :tools=\"tools\"\n :hotkey-formatter=\"hotkeyFormatter\"\n />\n </slot>\n </template>\n <template #linkModal=\"{ linkTool }\">\n <KdsCreateLinkModal\n v-if=\"isToolEnabled('link') && linkTool\"\n v-bind=\"linkTool.props\"\n v-on=\"linkTool.events\"\n />\n </template>\n </RichTextEditorBaseToolbar>\n </div>\n\n <EditorContent\n class=\"rich-text-editor\"\n :editor=\"editor\"\n :class=\"{ editable: editable && !disabled }\"\n :aria-disabled=\"disabled || undefined\"\n />\n </div>\n\n <KdsSubText\n :id=\"subTextId\"\n :sub-text=\"subTextValue\"\n :error=\"hasSubTextOverride && error\"\n :validating=\"hasSubTextOverride && validating\"\n :preserve-sub-text-space=\"preserveSubTextSpace\"\n />\n </div>\n</template>\n\n<style scoped>\n.editor-wrapper {\n /* Fixed 44px toolbar height per the design (28px content + 8px padding on\n * each side); the small toolbar buttons (24px) center within the content\n * area. */\n --toolbar-height: calc(\n var(--kds-dimension-component-height-1-75x) +\n var(--kds-spacing-container-0-5x) * 2\n );\n\n position: relative;\n isolation: isolate;\n\n &.disabled {\n color: var(--kds-color-text-and-icon-disabled);\n }\n}\n\n/* stylelint-disable selector-class-pattern */\n.rich-text-editor {\n height: 100%;\n max-height: v-bind(\"maxHeightStyle\");\n padding: var(--kds-spacing-container-0-5x);\n overflow-y: auto;\n\n &.editable {\n cursor: text;\n background: var(--kds-color-background-input-initial);\n\n & :deep(.ProseMirror) {\n min-height: v-bind(\"minHeightStyle\");\n }\n }\n\n /* stylelint-disable knime/no-deep-nesting */\n & :deep(.ProseMirror) {\n height: 100%;\n font: var(--kds-font-base-body-small);\n\n /* The following rich text styles are kept in sync with KdsDescription. */\n p {\n padding: 0;\n margin: 0 0 var(--kds-spacing-container-0-37x);\n font: var(--kds-font-base-body-small);\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n p.small-text {\n font: var(--kds-font-base-subtext-xsmall);\n }\n\n strong,\n b {\n font-weight: var(--kds-core-font-weight-strong);\n }\n\n i,\n em {\n font-style: italic;\n }\n\n h3 {\n margin: 0;\n font: var(--kds-font-base-body-medium-strong);\n }\n\n h4 {\n margin: 0;\n font: var(--kds-font-base-body-small-strong);\n }\n\n pre {\n width: fit-content;\n padding: var(--kds-spacing-container-0-75x);\n font: var(--kds-font-base-code-xsmall);\n background: var(--kds-color-surface-subtle);\n border-radius: var(--kds-border-radius-container-0-25x);\n\n & > code {\n padding: 0;\n background: none;\n }\n }\n\n & :not(pre) > code {\n padding: var(--kds-spacing-container-0-12x)\n var(--kds-spacing-container-0-25x);\n font: var(--kds-font-base-code-xsmall);\n background: var(--kds-color-surface-subtle);\n box-decoration-break: clone;\n border-radius: var(--kds-border-radius-container-0-12x);\n }\n\n /** keep in sync with KdsLink */\n a {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: fit-content;\n max-width: 100%;\n padding: var(--kds-spacing-container-none)\n var(--kds-spacing-container-0-10x);\n font: var(--kds-font-base-body-small);\n color: var(--kds-color-text-and-icon-neutral);\n white-space: nowrap;\n text-decoration-line: underline;\n cursor: pointer;\n border-radius: var(--kds-border-radius-container-0-12x);\n\n &:focus-visible {\n outline: var(--kds-border-action-focused);\n outline-offset: var(--kds-spacing-container-none);\n }\n\n /** internal links */\n &[href^=\"http\"] {\n --link-color: var(--kds-color-text-and-icon-selected);\n\n color: var(--link-color);\n\n &:visited {\n --link-color: var(--kds-color-text-and-icon-info);\n\n color: var(--link-color);\n }\n\n &:hover {\n --link-color: var(--kds-color-text-and-icon-primary-inverted);\n\n color: var(--link-color);\n background-color: var(--kds-color-background-primary-bold-hover);\n }\n\n &:active {\n --link-color: var(--kds-color-text-and-icon-selected-inverted);\n\n color: var(--link-color);\n background-color: var(--kds-color-background-primary-bold-active);\n }\n\n &::after {\n display: block;\n width: var(--kds-dimension-icon-0-56x);\n height: var(--kds-dimension-icon-0-56x);\n margin-left: var(--kds-spacing-container-0-12x);\n content: \"\";\n background-color: var(--link-color);\n mask-image: v-bind(\"externalIcon\");\n mask-repeat: no-repeat;\n mask-size: contain;\n }\n }\n\n /** external links */\n &:not([href^=\"http\"]) {\n color: var(--kds-color-text-and-icon-neutral);\n\n &:visited {\n color: var(--kds-color-text-and-icon-info);\n }\n\n &:hover {\n background-color: var(--kds-color-background-neutral-hover);\n }\n\n &:active {\n background-color: var(--kds-color-background-neutral-active);\n }\n }\n }\n\n ol,\n ul {\n padding-left: var(--kds-spacing-container-2x);\n }\n\n dd {\n margin-left: var(--kds-spacing-container-1x);\n }\n\n table {\n border-spacing: var(--kds-spacing-container-0-25x) 0;\n border-collapse: separate;\n\n td,\n th {\n padding: var(--kds-spacing-container-0-25x);\n }\n\n th {\n font: var(--kds-font-base-body-small-strong);\n text-align: left;\n border-bottom: var(--kds-border-width-icon-stroke-l) solid\n var(--kds-color-border-neutral);\n }\n\n td {\n font: var(--kds-font-base-body-small);\n border-bottom: var(--kds-border-width-icon-stroke-s) solid\n var(--kds-color-border-neutral);\n }\n }\n }\n\n & :deep(.ProseMirror:focus-visible),\n & :deep(.ProseMirror:focus) {\n outline: transparent;\n }\n /* stylelint-enable selector-class-pattern */\n}\n\n.editor-wrapper.with-border {\n border: var(--kds-border-action-input);\n border-radius: var(--kds-border-radius-container-0-37x);\n\n &.disabled {\n border: var(--kds-border-action-disabled);\n }\n\n & .toolbar-wrapper {\n border-top-left-radius: var(--kds-border-radius-container-0-37x);\n border-top-right-radius: var(--kds-border-radius-container-0-37x);\n }\n\n & .rich-text-editor {\n border-bottom-right-radius: var(--kds-border-radius-container-0-37x);\n border-bottom-left-radius: var(--kds-border-radius-container-0-37x);\n }\n}\n\n.editor-wrapper.show-focus-ring {\n outline: var(--kds-border-action-focused);\n outline-offset: var(--kds-spacing-offset-focus);\n}\n\n.embedded-toolbar {\n height: var(--toolbar-height);\n padding: var(--kds-spacing-container-0-5x);\n overflow-x: auto;\n overscroll-behavior: contain;\n white-space: pre;\n scrollbar-width: none; /* for firefox */\n background: var(--kds-color-background-input-initial);\n border-bottom: var(--kds-border-base-muted);\n -ms-overflow-style: none; /* needed to hide scroll bar in edge */\n &::-webkit-scrollbar {\n display: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, useId, useTemplateRef } from \"vue\";\n\nimport { KdsLabel } from \"@knime/kds-components\";\nimport type { KdsFormFieldExpose } from \"@knime/kds-components\";\n\nimport KdsRichTextEditor from \"./KdsRichTextEditor.vue\";\nimport type { KdsRichTextInputProps } from \"./types\";\n\nconst {\n id = undefined,\n label = undefined,\n ariaLabel = undefined,\n description = undefined,\n ...editorProps\n} = defineProps<KdsRichTextInputProps>();\n\nconst modelValue = defineModel<string>();\n\nconst emit = defineEmits<{\n blur: [];\n}>();\n\nconst fallbackId = useId();\nconst inputId = computed(() => id?.trim() || fallbackId);\nconst labelId = computed(() => `${inputId.value}-label`);\n\nconst isHovered = ref(false);\n\nconst editorRef =\n useTemplateRef<InstanceType<typeof KdsRichTextEditor>>(\"editor\");\n\ndefineExpose<KdsFormFieldExpose>({\n focus: () => editorRef.value?.focus(),\n});\n</script>\n\n<template>\n <div\n class=\"kds-rich-text-input\"\n @mouseenter=\"isHovered = true\"\n @mouseleave=\"isHovered = false\"\n >\n <KdsLabel\n v-if=\"label\"\n :id=\"labelId\"\n :label=\"label\"\n :description=\"description\"\n :show-description-button=\"isHovered\"\n />\n <KdsRichTextEditor\n ref=\"editor\"\n v-bind=\"editorProps\"\n v-model=\"modelValue\"\n with-border\n wrapper-focus-ring\n :aria-label=\"label ? undefined : ariaLabel\"\n :aria-labelledby=\"label ? labelId : undefined\"\n @blur=\"emit('blur')\"\n />\n </div>\n</template>\n\n<style scoped>\n.kds-rich-text-input {\n display: flex;\n flex-direction: column;\n}\n</style>\n"],"names":["navigatorUtils.isMac","_createBlock","_unref","_createVNode","_createElementVNode","_normalizeClass","_hoisted_1","url","text","_renderSlot","_openBlock","_createElementBlock","_Fragment","_renderList","_useModel","RichTextEditorBaseToolbar","_withCtx","_mergeProps","_toHandlers","_createPropsRestProxy"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -1 +1 @@
1
- {"version":3,"file":"KdsRichTextEditor.vue.d.ts","sourceRoot":"","sources":["../../src/KdsRichTextEditor.vue"],"names":[],"mappings":"AAsoBA,OAAO,KAAK,EAA2B,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAW/E,KAAK,WAAW,GAAG,sBAAsB,CAAC;AAgQ1C,KAAK,iBAAiB,GAAG;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,WAAW,CAAC;AAKhB,iBAAS,cAAc;WAqKT,OAAO,IAA6B;;;;;;YAVd,GAAG;;;;EAetC;AAyBD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;;;;6FASnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAQpG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"KdsRichTextEditor.vue.d.ts","sourceRoot":"","sources":["../../src/KdsRichTextEditor.vue"],"names":[],"mappings":"AAgnBA,OAAO,KAAK,EAA2B,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAW/E,KAAK,WAAW,GAAG,sBAAsB,CAAC;AAgQ1C,KAAK,iBAAiB,GAAG;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,WAAW,CAAC;AAKhB,iBAAS,cAAc;WA6IT,OAAO,IAA6B;;;;;;YAVf,GAAG;;;;EAerC;AAyBD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;;;;6FASnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAQpG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knime/kds-rich-text-editor",
3
- "version": "0.31.3",
3
+ "version": "1.0.0",
4
4
  "description": "Package containing the RichTextEditor component which follows the KNIME Design System",
5
5
  "repository": {
6
6
  "type": "git",
@@ -33,7 +33,7 @@
33
33
  ],
34
34
  "peerDependencies": {
35
35
  "vue": "~3.5.0",
36
- "@knime/kds-components": "^0.31.3"
36
+ "@knime/kds-components": "^1.0.0"
37
37
  },
38
38
  "dependencies": {
39
39
  "@knime/utils": "^1.11.0",
@@ -48,7 +48,7 @@
48
48
  "@tiptap/pm": "^3.25.0",
49
49
  "@tiptap/starter-kit": "^3.25.0",
50
50
  "@tiptap/vue-3": "^3.25.0",
51
- "@knime/kds-styles": "^0.31.3"
51
+ "@knime/kds-styles": "^1.0.0"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@storybook/vue3-vite": "^10.4.3",
@@ -63,7 +63,7 @@
63
63
  "vite-svg-loader": "^5.1.1",
64
64
  "vue": "3.5.32",
65
65
  "vue-tsc": "^3.3.4",
66
- "@knime/kds-components": "^0.31.3"
66
+ "@knime/kds-components": "^1.0.0"
67
67
  },
68
68
  "engines": {
69
69
  "node": "24.10.0",