@knime/kds-rich-text-editor 0.30.4 → 0.31.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,26 @@
1
1
  # @knime/kds-rich-text-editor
2
2
 
3
+ ## 0.31.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 696b520: `KdsRichTextEditor`: replaced the `characterLimit` (number) and `showCharacterCount` (boolean) props with a single `characterLimit` object prop (`{ maxCharacters?: number; display?: "never" | "always" | "atLimit" }`). `maxCharacters` defaults to 1000 (clamped to a minimum of 200) and `display` defaults to `"never"`. The new `"atLimit"` display mode only surfaces the counter once the user is within 100 characters of the limit. Added `subText`, `error`, `validating` and `preserveSubTextSpace` props; a provided `subText` takes precedence over the character count display.
8
+
9
+ `KdsRichTextInput`: new component that wraps `KdsRichTextEditor` as a form field, adding a label (with optional info-popover `description`) and a subtext line for helper or error text.
10
+
11
+ ### Patch Changes
12
+
13
+ - @knime/kds-components@0.31.0
14
+ - @knime/kds-styles@0.31.0
15
+
16
+ ## 0.30.5
17
+
18
+ ### Patch Changes
19
+
20
+ - Updated dependencies [a63a3b8]
21
+ - @knime/kds-styles@0.30.5
22
+ - @knime/kds-components@0.30.5
23
+
3
24
  ## 0.30.4
4
25
 
5
26
  ### Patch Changes
package/dist/index.css CHANGED
@@ -27,7 +27,7 @@
27
27
  }
28
28
 
29
29
  .editor-wrapper {
30
- &[data-v-06a9c7b9] {
30
+ &[data-v-de71d3af] {
31
31
  /* Fixed 44px toolbar height per the design (28px content + 8px padding on
32
32
  * each side). Defined explicitly so the toolbar expand/collapse transition
33
33
  * has a concrete target height; the small toolbar buttons (24px) center
@@ -40,16 +40,16 @@
40
40
  position: relative;
41
41
  isolation: isolate;
42
42
  }
43
- &.disabled[data-v-06a9c7b9] {
43
+ &.disabled[data-v-de71d3af] {
44
44
  color: var(--kds-color-text-and-icon-disabled);
45
45
  }
46
46
  }
47
47
 
48
48
  /* stylelint-disable selector-class-pattern */
49
49
  .rich-text-editor {
50
- &[data-v-06a9c7b9] {
50
+ &[data-v-de71d3af] {
51
51
  height: 100%;
52
- max-height: var(--f4686d76);
52
+ max-height: var(--v2714c44b);
53
53
  padding: var(--kds-spacing-container-0-5x);
54
54
  overflow-y: auto;
55
55
 
@@ -57,15 +57,15 @@
57
57
  /* stylelint-enable selector-class-pattern */
58
58
  }
59
59
  &.editable {
60
- &[data-v-06a9c7b9] {
60
+ &[data-v-de71d3af] {
61
61
  cursor: text;
62
62
  background: var(--kds-color-background-input-initial);
63
63
  }
64
- &[data-v-06a9c7b9] .ProseMirror {
65
- min-height: var(--a618f0d2);
64
+ &[data-v-de71d3af] .ProseMirror {
65
+ min-height: var(--v4e3c829d);
66
66
  }
67
67
  }
68
- &[data-v-06a9c7b9] .ProseMirror {
68
+ &[data-v-de71d3af] .ProseMirror {
69
69
  height: 100%;
70
70
 
71
71
  /* The following rich text styles are kept in sync with KdsDescription. */
@@ -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(--c15f49ba);
178
+ mask-image: var(--v2e885fa9);
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-06a9c7b9] :has(:deep(.ProseMirror:focus)) {
227
+ &[data-v-de71d3af] :has(:deep(.ProseMirror:focus)) {
228
228
  outline: var(--kds-border-action-focused);
229
229
  outline-offset: var(--kds-spacing-offset-focus);
230
230
  }
231
- &[data-v-06a9c7b9] .ProseMirror:focus-visible,
232
- &[data-v-06a9c7b9] .ProseMirror:focus {
231
+ &[data-v-de71d3af] .ProseMirror:focus-visible,
232
+ &[data-v-de71d3af] .ProseMirror:focus {
233
233
  outline: transparent;
234
234
  }
235
235
  }
236
236
  .editor-wrapper.with-border {
237
- &[data-v-06a9c7b9] {
237
+ &[data-v-de71d3af] {
238
238
  border: var(--kds-border-action-input);
239
239
  border-radius: var(--kds-border-radius-container-0-37x);
240
240
  }
241
- &.disabled[data-v-06a9c7b9] {
241
+ &.disabled[data-v-de71d3af] {
242
242
  border: var(--kds-border-action-disabled);
243
243
  }
244
- & .toolbar-wrapper[data-v-06a9c7b9] {
244
+ & .toolbar-wrapper[data-v-de71d3af] {
245
245
  border-top-left-radius: var(--kds-border-radius-container-0-37x);
246
246
  border-top-right-radius: var(--kds-border-radius-container-0-37x);
247
247
  }
248
- & .rich-text-editor[data-v-06a9c7b9] {
248
+ & .rich-text-editor[data-v-de71d3af] {
249
249
  border-bottom-right-radius: var(--kds-border-radius-container-0-37x);
250
250
  border-bottom-left-radius: var(--kds-border-radius-container-0-37x);
251
251
  }
252
252
  }
253
253
  .embedded-toolbar {
254
- &[data-v-06a9c7b9] {
254
+ &[data-v-de71d3af] {
255
255
  height: var(--toolbar-height);
256
256
  padding: var(--kds-spacing-container-0-5x);
257
257
  overflow-x: auto;
@@ -262,21 +262,26 @@ 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-06a9c7b9]::-webkit-scrollbar {
265
+ &[data-v-de71d3af]::-webkit-scrollbar {
266
266
  display: none;
267
267
  }
268
268
  }
269
- .expand-enter-active[data-v-06a9c7b9],
270
- .expand-leave-active[data-v-06a9c7b9] {
269
+ .expand-enter-active[data-v-de71d3af],
270
+ .expand-leave-active[data-v-de71d3af] {
271
271
  transition: all 0.15s ease;
272
272
  }
273
- .expand-enter-from[data-v-06a9c7b9],
274
- .expand-leave-to[data-v-06a9c7b9] {
273
+ .expand-enter-from[data-v-de71d3af],
274
+ .expand-leave-to[data-v-de71d3af] {
275
275
  height: 0;
276
276
  opacity: 0;
277
277
  }
278
- .expand-enter-to[data-v-06a9c7b9],
279
- .expand-leave-from[data-v-06a9c7b9] {
278
+ .expand-enter-to[data-v-de71d3af],
279
+ .expand-leave-from[data-v-de71d3af] {
280
280
  height: var(--toolbar-height);
281
281
  opacity: 1;
282
282
  }
283
+
284
+ .kds-rich-text-input[data-v-dde2bc1a] {
285
+ display: flex;
286
+ flex-direction: column;
287
+ }
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
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 } 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, Transition, 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';
5
- import { KdsModal, KdsButton, KdsTextInput, KdsToggleButton, KdsMenuButton, KdsSubText } from '@knime/kds-components';
5
+ import { KdsModal, KdsButton, KdsTextInput, KdsToggleButton, KdsMenuButton, KdsSubText, KdsLabel } from '@knime/kds-components';
6
6
  import HardBreak from '@tiptap/extension-hard-break';
7
7
  import { getAttributes } from '@tiptap/core';
8
8
  import Link from '@tiptap/extension-link';
@@ -18,8 +18,17 @@ const getMetaOrCtrlKey = () => {
18
18
 
19
19
  const ExternalLinkIconUrl = "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";
20
20
 
21
- const _hoisted_1$2 = { class: "controls-apply-group" };
22
- const _sfc_main$3 = /* @__PURE__ */ defineComponent({
21
+ const kdsCharacterCountDisplay = {
22
+ NEVER: "never",
23
+ ALWAYS: "always",
24
+ AT_LIMIT: "atLimit"
25
+ };
26
+ const kdsCharacterCountDisplays = Object.values(
27
+ kdsCharacterCountDisplay
28
+ );
29
+
30
+ const _hoisted_1$1 = { class: "controls-apply-group" };
31
+ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
23
32
  __name: "KdsCreateLinkModal",
24
33
  props: {
25
34
  text: {},
@@ -107,7 +116,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
107
116
  label: "Cancel",
108
117
  onClick: closeModal
109
118
  }, null, 8, ["variant"]),
110
- createElementVNode("div", _hoisted_1$2, [
119
+ createElementVNode("div", _hoisted_1$1, [
111
120
  __props.isEdit.value ? (openBlock(), createBlock(unref(KdsButton), {
112
121
  key: 0,
113
122
  variant: "outlined",
@@ -139,7 +148,7 @@ const _export_sfc = (sfc, props) => {
139
148
  return target;
140
149
  };
141
150
 
142
- const KdsCreateLinkModal = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-5b224eb0"]]);
151
+ const KdsCreateLinkModal = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-5b224eb0"]]);
143
152
 
144
153
  const clearHeading = (editor) => {
145
154
  const maxLevel = 6;
@@ -310,7 +319,7 @@ const useLinkTool = ({
310
319
  };
311
320
  };
312
321
 
313
- const _sfc_main$2 = /* @__PURE__ */ defineComponent({
322
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
314
323
  __name: "RichTextEditorBaseToolbar",
315
324
  props: {
316
325
  editor: {},
@@ -482,8 +491,8 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
482
491
  }
483
492
  });
484
493
 
485
- const _hoisted_1$1 = { class: "tools" };
486
- const _sfc_main$1 = /* @__PURE__ */ defineComponent({
494
+ const _hoisted_1 = { class: "tools" };
495
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
487
496
  __name: "RichTextEditorToolbar",
488
497
  props: {
489
498
  editor: {},
@@ -535,7 +544,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
535
544
  return tools;
536
545
  });
537
546
  return (_ctx, _cache) => {
538
- return openBlock(), createElementBlock("div", _hoisted_1$1, [
547
+ return openBlock(), createElementBlock("div", _hoisted_1, [
539
548
  (openBlock(true), createElementBlock(Fragment, null, renderList(baseTools.value, (tool) => {
540
549
  return openBlock(), createBlock(unref(KdsToggleButton), {
541
550
  key: tool.id,
@@ -565,7 +574,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
565
574
  }
566
575
  });
567
576
 
568
- const RichTextEditorToolbar = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-f4d33607"]]);
577
+ const RichTextEditorToolbar = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-f4d33607"]]);
569
578
 
570
579
  const CustomEscape = Extension.create({
571
580
  name: "OverrideEscape",
@@ -692,9 +701,9 @@ const SmallText = Paragraph.extend({
692
701
  }
693
702
  });
694
703
 
695
- const _hoisted_1 = { key: 0 };
696
704
  const MIN_CHARACTER_LIMIT = 200;
697
- const _sfc_main = /* @__PURE__ */ defineComponent({
705
+ const AT_LIMIT_THRESHOLD = 100;
706
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
698
707
  __name: "KdsRichTextEditor",
699
708
  props: /* @__PURE__ */ mergeModels({
700
709
  editable: { type: Boolean, default: true },
@@ -716,8 +725,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
716
725
  withBorder: { type: Boolean, default: true },
717
726
  disabled: { type: Boolean, default: false },
718
727
  linkToolOptions: { default: () => kdsDefaultLinkToolOptions },
719
- characterLimit: { default: 1e3 },
720
- showCharacterCount: { type: Boolean, default: false },
728
+ characterLimit: { default: () => ({}) },
729
+ subText: { default: () => void 0 },
730
+ error: { type: Boolean, default: false },
731
+ validating: { type: Boolean, default: false },
732
+ preserveSubTextSpace: { type: Boolean, default: false },
721
733
  customEscapeHandler: { type: Function, default: void 0 },
722
734
  ariaLabel: { default: () => void 0 },
723
735
  ariaLabelledby: { default: () => void 0 }
@@ -728,11 +740,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
728
740
  emits: /* @__PURE__ */ mergeModels(["blur"], ["update:modelValue"]),
729
741
  setup(__props, { expose: __expose, emit: __emit }) {
730
742
  useCssVars((_ctx) => ({
731
- "f4686d76": maxHeightStyle.value,
732
- "a618f0d2": minHeightStyle.value,
733
- "c15f49ba": externalIcon
743
+ "v2714c44b": maxHeightStyle.value,
744
+ "v4e3c829d": minHeightStyle.value,
745
+ "v2e885fa9": externalIcon
734
746
  }));
735
- const hardCharacterLimit = Math.max(__props.characterLimit, MIN_CHARACTER_LIMIT);
747
+ const hardCharacterLimit = Math.max(
748
+ __props.characterLimit.maxCharacters ?? 1e3,
749
+ MIN_CHARACTER_LIMIT
750
+ );
751
+ const characterCountDisplay = __props.characterLimit.display ?? kdsCharacterCountDisplay.NEVER;
736
752
  const slots = useSlots();
737
753
  const externalIcon = `url("${ExternalLinkIconUrl}")`;
738
754
  const modelValue = useModel(__props, "modelValue");
@@ -785,6 +801,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
785
801
  ...__props.customEscapeHandler ? [CustomEscape.configure({ handler: __props.customEscapeHandler })] : [],
786
802
  ...__props.customExtensions
787
803
  ];
804
+ const subTextId = useId();
788
805
  const editor = useEditor({
789
806
  content: modelValue.value,
790
807
  editable: __props.editable && !__props.disabled,
@@ -793,7 +810,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
793
810
  editorProps: {
794
811
  attributes: {
795
812
  ...__props.ariaLabel ? { "aria-label": __props.ariaLabel } : {},
796
- ...__props.ariaLabelledby ? { "aria-labelledby": __props.ariaLabelledby } : {}
813
+ ...__props.ariaLabelledby ? { "aria-labelledby": __props.ariaLabelledby } : {},
814
+ "aria-describedby": subTextId
797
815
  }
798
816
  },
799
817
  onUpdate: () => {
@@ -845,7 +863,29 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
845
863
  });
846
864
  const hasCustomToolbar = slots.customToolbar;
847
865
  const hasTools = computed(() => Object.keys(__props.baseExtensions).length);
848
- const characterCountId = useId();
866
+ const characterCount = computed(
867
+ () => editor.value?.storage.characterCount.characters() ?? 0
868
+ );
869
+ const showCharacterCount = computed(() => {
870
+ if (!editor.value || !__props.editable) {
871
+ return false;
872
+ }
873
+ switch (characterCountDisplay) {
874
+ case kdsCharacterCountDisplay.ALWAYS:
875
+ return true;
876
+ case kdsCharacterCountDisplay.AT_LIMIT:
877
+ return hardCharacterLimit - characterCount.value <= AT_LIMIT_THRESHOLD;
878
+ default:
879
+ return false;
880
+ }
881
+ });
882
+ const hasSubTextOverride = computed(() => Boolean(__props.subText));
883
+ const subTextValue = computed(() => {
884
+ if (hasSubTextOverride.value) {
885
+ return __props.subText;
886
+ }
887
+ return showCharacterCount.value ? `${characterCount.value} / ${hardCharacterLimit} characters` : void 0;
888
+ });
849
889
  return (_ctx, _cache) => {
850
890
  return openBlock(), createElementBlock("div", null, [
851
891
  createElementVNode("div", {
@@ -864,7 +904,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
864
904
  { "embedded-toolbar": !unref(hasCustomToolbar) }
865
905
  ])
866
906
  }, [
867
- createVNode(_sfc_main$2, {
907
+ createVNode(_sfc_main$3, {
868
908
  editor: unref(editor),
869
909
  "base-extensions": __props.baseExtensions,
870
910
  "link-tool-options": __props.linkToolOptions
@@ -897,21 +937,86 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
897
937
  "aria-disabled": __props.disabled || void 0
898
938
  }, null, 8, ["editor", "class", "aria-disabled"])
899
939
  ], 2),
900
- unref(editor) && __props.editable && __props.showCharacterCount ? (openBlock(), createElementBlock("div", _hoisted_1, [
901
- createVNode(unref(KdsSubText), {
902
- id: unref(characterCountId),
903
- "sub-text": `${unref(editor).storage.characterCount.characters()} / ${unref(hardCharacterLimit)} characters`,
904
- error: false,
905
- validating: false,
906
- "preserve-sub-text-space": true
907
- }, null, 8, ["id", "sub-text"])
908
- ])) : createCommentVNode("", true)
940
+ createVNode(unref(KdsSubText), {
941
+ id: unref(subTextId),
942
+ "sub-text": subTextValue.value,
943
+ error: hasSubTextOverride.value && __props.error,
944
+ validating: hasSubTextOverride.value && __props.validating,
945
+ "preserve-sub-text-space": __props.preserveSubTextSpace
946
+ }, null, 8, ["id", "sub-text", "error", "validating", "preserve-sub-text-space"])
909
947
  ]);
910
948
  };
911
949
  }
912
950
  });
913
951
 
914
- const KdsRichTextEditor = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-06a9c7b9"]]);
952
+ const KdsRichTextEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-de71d3af"]]);
953
+
954
+ const _sfc_main = /* @__PURE__ */ defineComponent({
955
+ __name: "KdsRichTextInput",
956
+ props: /* @__PURE__ */ mergeModels({
957
+ id: { default: () => void 0 },
958
+ label: { default: () => void 0 },
959
+ ariaLabel: { default: () => void 0 },
960
+ description: { default: () => void 0 },
961
+ editable: { type: Boolean },
962
+ minHeight: {},
963
+ maxHeight: {},
964
+ baseExtensions: {},
965
+ hotkeyFormatter: { type: Function },
966
+ customExtensions: {},
967
+ autofocus: { type: Boolean },
968
+ withBorder: { type: Boolean },
969
+ disabled: { type: Boolean },
970
+ linkToolOptions: {},
971
+ characterLimit: {},
972
+ subText: {},
973
+ error: { type: Boolean },
974
+ validating: { type: Boolean },
975
+ preserveSubTextSpace: { type: Boolean },
976
+ customEscapeHandler: { type: Function }
977
+ }, {
978
+ "modelValue": {},
979
+ "modelModifiers": {}
980
+ }),
981
+ emits: /* @__PURE__ */ mergeModels(["blur"], ["update:modelValue"]),
982
+ setup(__props, { expose: __expose, emit: __emit }) {
983
+ const editorProps = createPropsRestProxy(__props, ["id", "label", "ariaLabel", "description"]);
984
+ const modelValue = useModel(__props, "modelValue");
985
+ const emit = __emit;
986
+ const fallbackId = useId();
987
+ const inputId = computed(() => __props.id?.trim() || fallbackId);
988
+ const labelId = computed(() => `${inputId.value}-label`);
989
+ const isHovered = ref(false);
990
+ const editorRef = useTemplateRef("editor");
991
+ __expose({
992
+ focus: () => editorRef.value?.focus()
993
+ });
994
+ return (_ctx, _cache) => {
995
+ return openBlock(), createElementBlock("div", {
996
+ class: "kds-rich-text-input",
997
+ onMouseenter: _cache[2] || (_cache[2] = ($event) => isHovered.value = true),
998
+ onMouseleave: _cache[3] || (_cache[3] = ($event) => isHovered.value = false)
999
+ }, [
1000
+ __props.label ? (openBlock(), createBlock(unref(KdsLabel), {
1001
+ key: 0,
1002
+ id: labelId.value,
1003
+ label: __props.label,
1004
+ description: __props.description,
1005
+ "show-description-button": isHovered.value
1006
+ }, null, 8, ["id", "label", "description", "show-description-button"])) : createCommentVNode("", true),
1007
+ createVNode(KdsRichTextEditor, mergeProps({ ref: "editor" }, editorProps, {
1008
+ modelValue: modelValue.value,
1009
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event),
1010
+ "aria-label": __props.label ? void 0 : __props.ariaLabel,
1011
+ "aria-labelledby": __props.label ? labelId.value : void 0,
1012
+ onBlur: _cache[1] || (_cache[1] = ($event) => emit("blur"))
1013
+ }), null, 16, ["modelValue", "aria-label", "aria-labelledby"])
1014
+ ], 32);
1015
+ };
1016
+ }
1017
+ });
1018
+
1019
+ const KdsRichTextInput = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-dde2bc1a"]]);
915
1020
 
916
- export { KdsCreateLinkModal, KdsRichTextEditor, kdsDefaultLinkToolOptions };
1021
+ export { KdsCreateLinkModal, KdsRichTextEditor, KdsRichTextInput, kdsCharacterCountDisplay, kdsCharacterCountDisplays, kdsDefaultLinkToolOptions };
917
1022
  //# sourceMappingURL=index.js.map
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/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"],"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\"","<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 { computed, nextTick, onMounted, useId, useSlots, watch } 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 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 = 1000,\n showCharacterCount = false,\n customEscapeHandler = undefined,\n ariaLabel = undefined,\n ariaLabelledby = undefined,\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;\nconst hardCharacterLimit = Math.max(characterLimit, MIN_CHARACTER_LIMIT);\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 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 },\n },\n onUpdate: () => {\n modelValue.value = editor.value?.getHTML() ?? \"\";\n },\n onBlur: () => emit(\"blur\"),\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);\nconst characterCountId = useId();\n</script>\n\n<template>\n <div>\n <div :class=\"['editor-wrapper', { 'with-border': withBorder, disabled }]\">\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 <div v-if=\"editor && editable && showCharacterCount\">\n <KdsSubText\n :id=\"characterCountId\"\n :sub-text=\"`${editor.storage.characterCount.characters()} / ${hardCharacterLimit} characters`\"\n :error=\"false\"\n :validating=\"false\"\n :preserve-sub-text-space=\"true\"\n />\n </div>\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 & :has(:deep(.ProseMirror:focus)) {\n outline: var(--kds-border-action-focused);\n outline-offset: var(--kds-spacing-offset-focus);\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.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"],"names":["navigatorUtils.isMac","_createBlock","_unref","_createVNode","_createElementVNode","_normalizeClass","_hoisted_1","url","text","_renderSlot","_openBlock","_createElementBlock","_Fragment","_renderList","_useModel","_Transition","RichTextEditorBaseToolbar","_withCtx","_mergeProps","_toHandlers"],"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 { computed, nextTick, onMounted, useId, useSlots, watch } 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} = 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\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 onBlur: () => emit(\"blur\"),\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 :class=\"['editor-wrapper', { 'with-border': withBorder, disabled }]\">\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 & :has(:deep(.ProseMirror:focus)) {\n outline: var(--kds-border-action-focused);\n outline-offset: var(--kds-spacing-offset-focus);\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.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 :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 +1 @@
1
- {"version":3,"file":"KdsRichTextEditor.vue.d.ts","sourceRoot":"","sources":["../../src/KdsRichTextEditor.vue"],"names":[],"mappings":"AAmjBA,OAAO,KAAK,EAA2B,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAW/E,KAAK,WAAW,GAAG,sBAAsB,CAAC;AAsM1C,KAAK,iBAAiB,GAAG;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,WAAW,CAAC;AAKhB,iBAAS,cAAc;WAiKT,OAAO,IAA6B;;;;;;YAVd,GAAG;;;;EAetC;AAuBD,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":"AAimBA,OAAO,KAAK,EAA2B,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAW/E,KAAK,WAAW,GAAG,sBAAsB,CAAC;AAoP1C,KAAK,iBAAiB,GAAG;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,WAAW,CAAC;AAKhB,iBAAS,cAAc;WA6JT,OAAO,IAA6B;;;;;;YAVd,GAAG;;;;EAetC;AAwBD,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"}
@@ -0,0 +1,118 @@
1
+ import { KdsRichTextInputProps } from './types';
2
+ type __VLS_Props = KdsRichTextInputProps;
3
+ type __VLS_PublicProps = {
4
+ modelValue?: string;
5
+ } & __VLS_Props;
6
+ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {
7
+ focus: (options?: FocusOptions) => void;
8
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
9
+ "update:modelValue": (value: string) => any;
10
+ blur: () => any;
11
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
12
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
13
+ onBlur?: (() => any) | undefined;
14
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
15
+ editor: ({
16
+ $: import('vue').ComponentInternalInstance;
17
+ $data: {};
18
+ $props: {
19
+ readonly modelValue?: string | undefined;
20
+ readonly editable?: boolean | undefined;
21
+ readonly minHeight?: number | null | undefined;
22
+ readonly maxHeight?: number | null | undefined;
23
+ readonly baseExtensions?: (import('./types').KdsBaseExtensionsConfig | ({
24
+ bold?: undefined;
25
+ italic?: undefined;
26
+ underline?: undefined;
27
+ textAlign?: undefined;
28
+ bulletList?: undefined;
29
+ orderedList?: undefined;
30
+ heading?: undefined;
31
+ paragraphTextStyle?: undefined;
32
+ blockquote?: undefined;
33
+ code?: undefined;
34
+ codeBlock?: undefined;
35
+ horizontalRule?: undefined;
36
+ strike?: undefined;
37
+ link?: undefined;
38
+ } & {
39
+ all: boolean;
40
+ })) | undefined;
41
+ readonly hotkeyFormatter?: ((hotkey: Array<string>) => string) | undefined;
42
+ readonly customExtensions?: Array<import('@tiptap/core').AnyExtension> | undefined;
43
+ readonly autofocus?: boolean | undefined;
44
+ readonly withBorder?: boolean | undefined;
45
+ readonly disabled?: boolean | undefined;
46
+ readonly linkToolOptions?: import('.').KdsLinkToolOptions | undefined;
47
+ readonly characterLimit?: import('./types').KdsCharacterLimit | undefined;
48
+ readonly subText?: string | undefined;
49
+ readonly error?: boolean | undefined;
50
+ readonly validating?: boolean | undefined;
51
+ readonly preserveSubTextSpace?: boolean | undefined;
52
+ readonly customEscapeHandler?: (() => boolean) | undefined;
53
+ readonly ariaLabel?: string | undefined;
54
+ readonly ariaLabelledby?: string | undefined;
55
+ readonly "onUpdate:modelValue"?: ((value: string) => any) | undefined;
56
+ readonly onBlur?: (() => any) | undefined;
57
+ } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
58
+ $attrs: import('vue').Attrs;
59
+ $refs: {
60
+ [x: string]: unknown;
61
+ };
62
+ $slots: Readonly<{
63
+ [name: string]: import('vue').Slot<any> | undefined;
64
+ }>;
65
+ $root: import('vue').ComponentPublicInstance | null;
66
+ $parent: import('vue').ComponentPublicInstance | null;
67
+ $host: Element | null;
68
+ $emit: ((event: "update:modelValue", value: string) => void) & ((event: "blur") => void);
69
+ $el: HTMLDivElement;
70
+ $options: import('vue').ComponentOptionsBase<Readonly<{
71
+ modelValue?: string;
72
+ } & import('./types').KdsRichTextEditorProps> & Readonly<{
73
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
74
+ onBlur?: (() => any) | undefined;
75
+ }>, {
76
+ focus: () => void;
77
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
78
+ "update:modelValue": (value: string) => any;
79
+ blur: () => any;
80
+ }, string, {}, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
81
+ beforeCreate?: (() => void) | (() => void)[];
82
+ created?: (() => void) | (() => void)[];
83
+ beforeMount?: (() => void) | (() => void)[];
84
+ mounted?: (() => void) | (() => void)[];
85
+ beforeUpdate?: (() => void) | (() => void)[];
86
+ updated?: (() => void) | (() => void)[];
87
+ activated?: (() => void) | (() => void)[];
88
+ deactivated?: (() => void) | (() => void)[];
89
+ beforeDestroy?: (() => void) | (() => void)[];
90
+ beforeUnmount?: (() => void) | (() => void)[];
91
+ destroyed?: (() => void) | (() => void)[];
92
+ unmounted?: (() => void) | (() => void)[];
93
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
94
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
95
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
96
+ };
97
+ $forceUpdate: () => void;
98
+ $nextTick: typeof import('vue').nextTick;
99
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
100
+ } & Readonly<{}> & Omit<Readonly<{
101
+ modelValue?: string;
102
+ } & import('./types').KdsRichTextEditorProps> & Readonly<{
103
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
104
+ onBlur?: (() => any) | undefined;
105
+ }>, "focus"> & {
106
+ focus: () => void;
107
+ } & {} & import('vue').ComponentCustomProperties & {} & {
108
+ $slots: {
109
+ customToolbar?(_: {
110
+ editor: import('@tiptap/vue-3').Editor;
111
+ tools: import('./toolbar/types').EditorTools;
112
+ hotkeyFormatter: (hotkey: Array<string>) => string;
113
+ }): any;
114
+ };
115
+ }) | null;
116
+ }, HTMLDivElement>;
117
+ export default _default;
118
+ //# sourceMappingURL=KdsRichTextInput.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KdsRichTextInput.vue.d.ts","sourceRoot":"","sources":["../../src/KdsRichTextInput.vue"],"names":[],"mappings":"AA2EA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErD,KAAK,WAAW,GAAG,qBAAqB,CAAC;AAkCzC,KAAK,iBAAiB,GAAG;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,WAAW,CAAC;;mBALuE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCA+HoxmB,GAAG,8CAA8C,GAAG,yBAAyB,GAAG,6DAAmC,GAAG;;;;;;;;;;;;;;;;;;AAlBl+mB,wBAUG"}
@@ -0,0 +1,7 @@
1
+ export declare const kdsCharacterCountDisplay: {
2
+ readonly NEVER: "never";
3
+ readonly ALWAYS: "always";
4
+ readonly AT_LIMIT: "atLimit";
5
+ };
6
+ export declare const kdsCharacterCountDisplays: ("never" | "always" | "atLimit")[];
7
+ //# sourceMappingURL=enums.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enums.d.ts","sourceRoot":"","sources":["../../src/enums.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB;;;;CAI3B,CAAC;AAEX,eAAO,MAAM,yBAAyB,oCAErC,CAAC"}
@@ -1,5 +1,7 @@
1
1
  export { default as KdsRichTextEditor } from './KdsRichTextEditor.vue';
2
+ export { default as KdsRichTextInput } from './KdsRichTextInput.vue';
2
3
  export { default as KdsCreateLinkModal } from './toolbar/KdsCreateLinkModal.vue';
4
+ export { kdsCharacterCountDisplay, kdsCharacterCountDisplays } from './enums';
3
5
  export { kdsDefaultLinkToolOptions } from './utils/custom-link';
4
6
  export type { KdsLinkToolOptions } from './utils/custom-link';
5
7
  export type * from './types';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,mBAAmB,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEjF,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,mBAAmB,SAAS,CAAC"}
@@ -1,5 +1,27 @@
1
1
  import { AnyExtension } from '@tiptap/core';
2
+ import { kdsCharacterCountDisplay } from './enums';
2
3
  import { KdsLinkToolOptions } from './utils/custom-link';
4
+ export type KdsCharacterCountDisplay = (typeof kdsCharacterCountDisplay)[keyof typeof kdsCharacterCountDisplay];
5
+ export type KdsCharacterLimit = {
6
+ /**
7
+ * Max number of allowed characters in the editor.
8
+ *
9
+ * Notes:
10
+ * - Defaults to 1000 and cannot be under 200
11
+ * - When a number less than 200 is supplied, the editor will fallback to 200
12
+ */
13
+ maxCharacters?: number;
14
+ /**
15
+ * When the character counter (`x / limit characters`) is shown below the
16
+ * editor. The limit is always enforced regardless of this value.
17
+ *
18
+ * - `"never"` — the counter is never shown (default)
19
+ * - `"always"` — the counter is always shown while the editor is editable
20
+ * - `"atLimit"` — the counter is only shown once the user is approaching the
21
+ * limit (100 characters or less left)
22
+ */
23
+ display?: KdsCharacterCountDisplay;
24
+ };
3
25
  export type KdsBaseExtensionsConfig = {
4
26
  bold?: true;
5
27
  italic?: true;
@@ -71,27 +93,38 @@ export type KdsRichTextEditorProps = {
71
93
  */
72
94
  linkToolOptions?: KdsLinkToolOptions;
73
95
  /**
74
- * Max number of allowed characters in the editor. When the user has 100 characters
75
- * or less left, then a visual counter will be displayed to the user.
96
+ * Configures the character limit of the editor and the visibility of its
97
+ * counter. Accepts `maxCharacters` (defaults to 1000, cannot be under 200)
98
+ * and `display` (one of `"never"`, `"always"`, `"atLimit"`, defaults to
99
+ * `"never"`).
76
100
  *
77
- * Notes:
78
- * - Defaults to 1000 and cannot be under 200
79
- * - When a number less than 200 is supplied, the editor will fallback to 200
80
- * - This prop is *intentionally* **not** reactive. This is because this acts
81
- * as a configuration that is given to the editor upon usage rather than a
82
- * dynamic value. Having an increasingly changing value defeats
83
- * the purpose of having a limit
101
+ * Note: This prop is *intentionally* **not** reactive with respect to
102
+ * `maxCharacters`. This is because it acts as a configuration that is given
103
+ * to the editor upon usage rather than a dynamic value. Having an
104
+ * increasingly changing value defeats the purpose of having a limit.
84
105
  */
85
- characterLimit?: number;
106
+ characterLimit?: KdsCharacterLimit;
86
107
  /**
87
- * Whether the character counter (`x / limit characters`) is shown below the
88
- * editor. The `characterLimit` is still enforced when hidden — this only
89
- * controls the visibility of the counter, e.g. when the limit is high enough
90
- * that surfacing it would only add noise.
91
- *
92
- * Defaults to `false`.
108
+ * Helper or error text shown below the editor. When set, it takes precedence
109
+ * over the character count display (the character limit itself is still
110
+ * enforced). Used by `KdsRichTextInput` to surface validation messages.
93
111
  */
94
- showCharacterCount?: boolean;
112
+ subText?: string;
113
+ /**
114
+ * When true, applies error styling to `subText` and shows the error icon.
115
+ * Only has an effect while `subText` is set.
116
+ */
117
+ error?: boolean;
118
+ /**
119
+ * When true, shows a loading spinner next to `subText`. Only has an effect
120
+ * while `subText` is set.
121
+ */
122
+ validating?: boolean;
123
+ /**
124
+ * Reserve space for the subtext line to prevent layout shifts when helper
125
+ * text or errors appear.
126
+ */
127
+ preserveSubTextSpace?: boolean;
95
128
  /**
96
129
  * Custom handler when pressing `Esc` in the keyboard.
97
130
  * @returns whether the shortcut command is handled or not
@@ -108,5 +141,26 @@ export type KdsRichTextEditorProps = {
108
141
  */
109
142
  ariaLabelledby?: string;
110
143
  };
144
+ export type KdsRichTextInputProps = {
145
+ /**
146
+ * Id used to link the label and subtext to the editor. A stable id is
147
+ * generated when omitted.
148
+ */
149
+ id?: string;
150
+ /**
151
+ * Visible label rendered above the editor. When set, the editor is labelled
152
+ * via `aria-labelledby`; otherwise provide `ariaLabel`.
153
+ */
154
+ label?: string;
155
+ /**
156
+ * Accessible label used when no visible `label` is rendered.
157
+ */
158
+ ariaLabel?: string;
159
+ /**
160
+ * Optional description displayed in an info popover next to the label. The
161
+ * info toggle button is only visible when hovering the field.
162
+ */
163
+ description?: string;
164
+ } & Omit<KdsRichTextEditorProps, "ariaLabel" | "ariaLabelledby">;
111
165
  export {};
112
166
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,kBAAkB,CAAC,EAAE,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,CAAC;AAEF,KAAK,cAAc,GACf,uBAAuB,GACvB,CAAC;KAAG,GAAG,IAAI,MAAM,uBAAuB,GAAG,KAAK;CAAE,GAAG;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAE3E,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;IACpD;;OAEG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC;IACpC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knime/kds-rich-text-editor",
3
- "version": "0.30.4",
3
+ "version": "0.31.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.30.4"
36
+ "@knime/kds-components": "^0.31.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.30.4"
51
+ "@knime/kds-styles": "^0.31.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.30.4"
66
+ "@knime/kds-components": "^0.31.0"
67
67
  },
68
68
  "engines": {
69
69
  "node": "24.10.0",