@fastkit/vui-wysiwyg 8.0.0 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -1
- package/dist/pm/view.d.ts +27 -0
- package/dist/tiptap/core.d.ts +0 -27
- package/dist/vui-wysiwyg.d.ts +8 -8
- package/dist/vui-wysiwyg.mjs +19 -20
- package/dist/vui-wysiwyg.mjs.map +1 -1
- package/package.json +29 -28
package/README.md
CHANGED
|
@@ -943,7 +943,7 @@ interface WysiwygEditorTool {
|
|
|
943
943
|
icon: WysiwygEditorToolIcon // アイコン
|
|
944
944
|
active?: boolean | ((ctx: WysiwygEditorContext) => boolean) // アクティブ状態
|
|
945
945
|
disabled?: boolean | ((ctx: WysiwygEditorContext) => boolean) // 無効状態
|
|
946
|
-
onClick: (ctx: WysiwygEditorContext, ev:
|
|
946
|
+
onClick: (ctx: WysiwygEditorContext, ev: PointerEvent) => any // クリックハンドラ
|
|
947
947
|
floating?: boolean // フローティングメニュー表示
|
|
948
948
|
extensions?: Extensions // 依存拡張機能
|
|
949
949
|
}
|
|
@@ -969,15 +969,18 @@ function createWysiwygExtension<Options = any, Storage = any>(
|
|
|
969
969
|
## 組み込みツール
|
|
970
970
|
|
|
971
971
|
### テキストフォーマット
|
|
972
|
+
|
|
972
973
|
- `WysiwygFormatBoldTool` - 太字
|
|
973
974
|
- `WysiwygFormatItalicTool` - 斜体
|
|
974
975
|
- `WysiwygFormatUnderlineTool` - 下線
|
|
975
976
|
|
|
976
977
|
### リスト
|
|
978
|
+
|
|
977
979
|
- `WysiwygBulletListTool` - 箇条書きリスト
|
|
978
980
|
- `WysiwygOrderedListTool` - 番号付きリスト
|
|
979
981
|
|
|
980
982
|
### その他
|
|
983
|
+
|
|
981
984
|
- `WysiwygLinkTool` - リンク
|
|
982
985
|
- `WysiwygHistoryTool` - 元に戻す/やり直し
|
|
983
986
|
- `WysiwygColorTool` - テキスト色
|
|
@@ -987,16 +990,19 @@ function createWysiwygExtension<Options = any, Storage = any>(
|
|
|
987
990
|
## Considerations
|
|
988
991
|
|
|
989
992
|
### ブラウザ対応
|
|
993
|
+
|
|
990
994
|
- モダンブラウザのみサポート
|
|
991
995
|
- Internet Explorer非対応
|
|
992
996
|
- ProseMirrorの制約に準拠
|
|
993
997
|
|
|
994
998
|
### パフォーマンス
|
|
999
|
+
|
|
995
1000
|
- 大量のコンテンツ編集時は仮想スクロール推奨
|
|
996
1001
|
- 複雑な拡張機能は性能に影響する可能性
|
|
997
1002
|
- SSRでは初期化に注意が必要
|
|
998
1003
|
|
|
999
1004
|
### セキュリティ
|
|
1005
|
+
|
|
1000
1006
|
- HTMLコンテンツのサニタイゼーションは実装者責任
|
|
1001
1007
|
- XSS攻撃への対策が必要
|
|
1002
1008
|
- 信頼できないコンテンツの表示には注意
|
package/dist/pm/view.d.ts
CHANGED
|
@@ -1 +1,28 @@
|
|
|
1
1
|
export * from '@tiptap/pm/view';
|
|
2
|
+
import '@tiptap/pm/transform';
|
|
3
|
+
import '@tiptap/pm/trailing-node';
|
|
4
|
+
import '@tiptap/pm/tables';
|
|
5
|
+
import '@tiptap/pm/state';
|
|
6
|
+
import '@tiptap/pm/schema-list';
|
|
7
|
+
import '@tiptap/pm/schema-basic';
|
|
8
|
+
import '@tiptap/pm/model';
|
|
9
|
+
import '@tiptap/pm/menu';
|
|
10
|
+
import '@tiptap/pm/markdown';
|
|
11
|
+
import '@tiptap/pm/keymap';
|
|
12
|
+
import '@tiptap/pm/inputrules';
|
|
13
|
+
import '@tiptap/pm/history';
|
|
14
|
+
import '@tiptap/pm/gapcursor';
|
|
15
|
+
import '@tiptap/pm/dropcursor';
|
|
16
|
+
import '@tiptap/pm/commands';
|
|
17
|
+
import '@tiptap/pm/collab';
|
|
18
|
+
import '@tiptap/pm/changeset';
|
|
19
|
+
import '@tiptap/vue-3';
|
|
20
|
+
import '@tiptap/extension-underline';
|
|
21
|
+
import '@tiptap/extension-text-style';
|
|
22
|
+
import '@tiptap/extension-text-align';
|
|
23
|
+
import '@tiptap/extension-ordered-list';
|
|
24
|
+
import '@tiptap/extension-link';
|
|
25
|
+
import '@tiptap/extension-italic';
|
|
26
|
+
import '@tiptap/extension-history';
|
|
27
|
+
import '@tiptap/extension-bullet-list';
|
|
28
|
+
import '@tiptap/extension-bold';
|
package/dist/tiptap/core.d.ts
CHANGED
|
@@ -1,28 +1 @@
|
|
|
1
1
|
export * from '@tiptap/vue-3';
|
|
2
|
-
import '@tiptap/pm/view';
|
|
3
|
-
import '@tiptap/pm/transform';
|
|
4
|
-
import '@tiptap/pm/trailing-node';
|
|
5
|
-
import '@tiptap/pm/tables';
|
|
6
|
-
import '@tiptap/pm/state';
|
|
7
|
-
import '@tiptap/pm/schema-list';
|
|
8
|
-
import '@tiptap/pm/schema-basic';
|
|
9
|
-
import '@tiptap/pm/model';
|
|
10
|
-
import '@tiptap/pm/menu';
|
|
11
|
-
import '@tiptap/pm/markdown';
|
|
12
|
-
import '@tiptap/pm/keymap';
|
|
13
|
-
import '@tiptap/pm/inputrules';
|
|
14
|
-
import '@tiptap/pm/history';
|
|
15
|
-
import '@tiptap/pm/gapcursor';
|
|
16
|
-
import '@tiptap/pm/dropcursor';
|
|
17
|
-
import '@tiptap/pm/commands';
|
|
18
|
-
import '@tiptap/pm/collab';
|
|
19
|
-
import '@tiptap/pm/changeset';
|
|
20
|
-
import '@tiptap/extension-underline';
|
|
21
|
-
import '@tiptap/extension-text-style';
|
|
22
|
-
import '@tiptap/extension-text-align';
|
|
23
|
-
import '@tiptap/extension-ordered-list';
|
|
24
|
-
import '@tiptap/extension-link';
|
|
25
|
-
import '@tiptap/extension-italic';
|
|
26
|
-
import '@tiptap/extension-history';
|
|
27
|
-
import '@tiptap/extension-bullet-list';
|
|
28
|
-
import '@tiptap/extension-bold';
|
package/dist/vui-wysiwyg.d.ts
CHANGED
|
@@ -68,7 +68,7 @@ interface WysiwygEditorTool {
|
|
|
68
68
|
/** Conditions for deactivating the icon */
|
|
69
69
|
disabled?: boolean | ((ctx: WysiwygEditorContext) => boolean);
|
|
70
70
|
/** Handler when mark text is clicked */
|
|
71
|
-
onClick: (ctx: WysiwygEditorContext, ev:
|
|
71
|
+
onClick: (ctx: WysiwygEditorContext, ev: PointerEvent) => any;
|
|
72
72
|
/** Whether to display tools in floating menu or not */
|
|
73
73
|
floating?: boolean;
|
|
74
74
|
/** Extensions that the tool depends on */
|
|
@@ -260,7 +260,7 @@ interface VWysiwygEditorAPI {
|
|
|
260
260
|
readonly editor: Editor | undefined;
|
|
261
261
|
readonly control: TextableControl;
|
|
262
262
|
}
|
|
263
|
-
declare const VWysiwygEditor: vue.DefineComponent<{
|
|
263
|
+
declare const VWysiwygEditor: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
264
264
|
extensions: {
|
|
265
265
|
type: PropType<RawWysiwygExtension[]>;
|
|
266
266
|
default: () => never[];
|
|
@@ -352,7 +352,7 @@ declare const VWysiwygEditor: vue.DefineComponent<{
|
|
|
352
352
|
default: undefined;
|
|
353
353
|
};
|
|
354
354
|
detach: BooleanConstructor;
|
|
355
|
-
}
|
|
355
|
+
}>, () => vue_jsx_runtime.JSX.Element, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
|
|
356
356
|
'update:modelValue': (value: string) => boolean;
|
|
357
357
|
'update:errors': (errors: _fastkit_vue_form_control.FormNodeError[]) => boolean;
|
|
358
358
|
change: (value: string) => boolean;
|
|
@@ -450,13 +450,13 @@ declare const VWysiwygEditor: vue.DefineComponent<{
|
|
|
450
450
|
default: undefined;
|
|
451
451
|
};
|
|
452
452
|
detach: BooleanConstructor;
|
|
453
|
-
}>> & {
|
|
453
|
+
}>> & Readonly<{
|
|
454
454
|
onFocus?: ((ev: FocusEvent) => any) | undefined;
|
|
455
455
|
onBlur?: ((ev: FocusEvent) => any) | undefined;
|
|
456
|
-
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
457
456
|
onChange?: ((value: string) => any) | undefined;
|
|
457
|
+
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
458
458
|
"onUpdate:errors"?: ((errors: _fastkit_vue_form_control.FormNodeError[]) => any) | undefined;
|
|
459
|
-
}
|
|
459
|
+
}>, {
|
|
460
460
|
extensions: RawWysiwygExtension[];
|
|
461
461
|
autofocus: boolean;
|
|
462
462
|
error: boolean;
|
|
@@ -475,10 +475,10 @@ declare const VWysiwygEditor: vue.DefineComponent<{
|
|
|
475
475
|
rules: _fastkit_vue_form_control.RecursiveVerifiableRuleOrFn;
|
|
476
476
|
showOwnErrors: boolean;
|
|
477
477
|
detach: boolean;
|
|
478
|
-
tools: RawWysiwygEditorTool[];
|
|
479
478
|
floatingToolbar: boolean;
|
|
480
479
|
disabledMinHeight: boolean;
|
|
481
480
|
disabledMaxHeight: boolean;
|
|
481
|
+
tools: RawWysiwygEditorTool[];
|
|
482
482
|
removeDefaultWrapper: boolean;
|
|
483
483
|
}, _fastkit_vue_utils.DefinedSlots<{
|
|
484
484
|
[x: `error:${string}`]: (error: _fastkit_vue_form_control.FormNodeError) => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
@@ -506,6 +506,6 @@ declare const VWysiwygEditor: vue.DefineComponent<{
|
|
|
506
506
|
endAdornment?: (() => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
507
507
|
[key: string]: any;
|
|
508
508
|
}>[]) | undefined;
|
|
509
|
-
}
|
|
509
|
+
}>, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
510
510
|
|
|
511
511
|
export { type CreateWysiwygColorToolOptions, type CreatedWysiwygExtension, type RawWysiwygEditorTool, type RawWysiwygExtension, type ResolvedWysiwygEditorSettings, VUI_WYSIWYG_EDITOR_SYMBOL, VWysiwygEditor, type VWysiwygEditorAPI, WYSIWYG_TEXT_ALIGN_VALUES, WysiwygBulletListTool, WysiwygColorExtension, type WysiwygColorItem, type WysiwygColorOptions, WysiwygCustomTagExtension, type WysiwygCustomTagSettings, type WysiwygCustomTagToolSettings, type WysiwygEditorContext, type WysiwygEditorEvent, type WysiwygEditorEventsBucket, type WysiwygEditorEventsOptions, WysiwygEditorInitializeContext, type WysiwygEditorPrefixedEvent, type WysiwygEditorTool, type WysiwygEditorToolFactory, type WysiwygEditorToolIcon, type WysiwygExtensionFactory, type WysiwygExtensionSource, WysiwygFormatBoldTool, WysiwygFormatItalicTool, WysiwygFormatUnderlineTool, WysiwygHistoryTool, WysiwygLinkTool, WysiwygLinter, WysiwygLinterBadWords, WysiwygLinterHeadingLevel, type WysiwygLinterOptions, WysiwygLinterPlugin, WysiwygLinterPunctuation, WysiwygOrderedListTool, type WysiwygTextAlignOptions, WysiwygTextAlignTool, type WysiwygTextAlignValue, createWysiwygColorTool, createWysiwygCustomTagMark, createWysiwygCustomTagTool, createWysiwygExtension, resolveRawWysiwygEditorTools, resolveRawWysiwygExtensions };
|
package/dist/vui-wysiwyg.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { defineComponent, ref, computed, watch, onBeforeUnmount, createVNode, isVNode, createTextVNode } from 'vue';
|
|
2
|
-
import { Extension, useEditor, EditorContent,
|
|
2
|
+
import { Extension, useEditor, EditorContent, Mark, mergeAttributes } from '@tiptap/vue-3';
|
|
3
3
|
import { Decoration, DecorationSet } from '@tiptap/pm/view';
|
|
4
4
|
import { Plugin, PluginKey, TextSelection } from '@tiptap/pm/state';
|
|
5
|
-
import TextStyle from '@tiptap/extension-text-style';
|
|
5
|
+
import { TextStyle } from '@tiptap/extension-text-style';
|
|
6
6
|
import { BulletList } from '@tiptap/extension-bullet-list';
|
|
7
7
|
import { Bold } from '@tiptap/extension-bold';
|
|
8
8
|
import { Italic } from '@tiptap/extension-italic';
|
|
@@ -12,6 +12,7 @@ import { Link } from '@tiptap/extension-link';
|
|
|
12
12
|
import { defineSlots, createTextableEmits, createControlProps, createControlFieldProviderProps, createControlFieldProps, createFormNodeWrapperProps, createTextableProps, useVui, useControl, useControlField, TextableControl, VFormControl, withCtx, VTextCounter, VControlField, VButtonGroup, VButton, validateIf, url, VIcon } from '@fastkit/vui';
|
|
13
13
|
import { OrderedList } from '@tiptap/extension-ordered-list';
|
|
14
14
|
import { TextAlign } from '@tiptap/extension-text-align';
|
|
15
|
+
import { BubbleMenu } from '@tiptap/vue-3/menus';
|
|
15
16
|
import { StarterKit } from '@tiptap/starter-kit';
|
|
16
17
|
|
|
17
18
|
// src/schemes.ts
|
|
@@ -585,7 +586,6 @@ var WysiwygLinkTool = (vui, options) => {
|
|
|
585
586
|
key: "link",
|
|
586
587
|
icon: vui.icon("editorLink"),
|
|
587
588
|
active: ({ editor }) => editor.isActive("link"),
|
|
588
|
-
// eslint-disable-next-line no-shadow
|
|
589
589
|
onClick: async ({ vui: vui2, editor }) => {
|
|
590
590
|
const { href = "" } = editor.getAttributes("link");
|
|
591
591
|
const result = await vui2.prompt({
|
|
@@ -750,7 +750,6 @@ var WysiwygTextAlignTool = (vui, options) => {
|
|
|
750
750
|
icon: ({
|
|
751
751
|
editor
|
|
752
752
|
}) => getIcon(getCurrentAlign(editor, resolvedOptions)),
|
|
753
|
-
// eslint-disable-next-line no-shadow
|
|
754
753
|
onClick: async ({
|
|
755
754
|
vui: vui2,
|
|
756
755
|
editor
|
|
@@ -887,7 +886,7 @@ var VWysiwygEditor = defineComponent({
|
|
|
887
886
|
bold: false,
|
|
888
887
|
bulletList: false,
|
|
889
888
|
orderedList: false,
|
|
890
|
-
|
|
889
|
+
undoRedo: false,
|
|
891
890
|
italic: false
|
|
892
891
|
}), ...resolveRawWysiwygExtensions(props.extensions, initializeCtx), ...wysiwygSettings.value.extensions];
|
|
893
892
|
const updateEditable = () => {
|
|
@@ -898,7 +897,9 @@ var VWysiwygEditor = defineComponent({
|
|
|
898
897
|
watch(() => props.modelValue, (modelValue) => {
|
|
899
898
|
const $editor = editor.value;
|
|
900
899
|
if (!$editor || getOutput($editor, "html") === modelValue) return;
|
|
901
|
-
$editor.commands.setContent(modelValue == null ? "" : modelValue,
|
|
900
|
+
$editor.commands.setContent(modelValue == null ? "" : modelValue, {
|
|
901
|
+
emitUpdate: false
|
|
902
|
+
});
|
|
902
903
|
textRef.value = getOutput($editor, "text");
|
|
903
904
|
});
|
|
904
905
|
initializeCtx.on("create", ({
|
|
@@ -992,20 +993,18 @@ var VWysiwygEditor = defineComponent({
|
|
|
992
993
|
scrollIntoView: true
|
|
993
994
|
});
|
|
994
995
|
};
|
|
995
|
-
const defaultSlot = () => {
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
"
|
|
1005
|
-
},
|
|
1006
|
-
|
|
1007
|
-
})]);
|
|
1008
|
-
};
|
|
996
|
+
const defaultSlot = () => createVNode("div", {
|
|
997
|
+
"class": "v-wysiwyg-editor__body"
|
|
998
|
+
}, [createVNode(EditorContent, {
|
|
999
|
+
"class": "v-wysiwyg-editor__input__element wysiwyg",
|
|
1000
|
+
"editor": editor.value
|
|
1001
|
+
}, null), !props.floatingToolbar && !!editor.value && !inputControl.isReadonly && createVNode(BubbleMenu, {
|
|
1002
|
+
"editor": editor.value
|
|
1003
|
+
}, {
|
|
1004
|
+
default: () => [createVNode("div", {
|
|
1005
|
+
"class": "v-wysiwyg-editor__bubble-menu"
|
|
1006
|
+
}, [createTools(true)])]
|
|
1007
|
+
})]);
|
|
1009
1008
|
const formControlDefaultSlot = () => createVNode("div", {
|
|
1010
1009
|
"class": "v-wysiwyg-editor__wrapper"
|
|
1011
1010
|
}, [!inputControl.isReadonly && createTools(), createVNode(VControlField, {
|
package/dist/vui-wysiwyg.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemes.ts","../src/injections.ts","../src/extensions/linter/Linter.tsx","../src/extensions/linter/utils.ts","../src/extensions/linter/LinterPlugin.ts","../src/extensions/linter/plugins/BadWords.tsx","../src/extensions/linter/plugins/HeadingLevel.ts","../src/extensions/linter/plugins/Punctuation.ts","../src/extensions/color.ts","../src/extensions/custom-tag.ts","../src/tools/bullet-list.ts","../src/tools/format-bold.ts","../src/tools/format-italic.ts","../src/tools/format-underline.ts","../src/tools/history.ts","../src/tools/link.ts","../src/tools/ordered-list.ts","../src/tools/color.tsx","../src/tools/text-align.tsx","../src/tools/custom-tag.ts","../src/components/VWysiwygEditor/VWysiwygEditor.tsx"],"names":["_createVNode","_createTextVNode","Extension","name","vui","_isVNode","Mark","_isSlot","editor","VButtonGroup","VButton"],"mappings":"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","file":"vui-wysiwyg.mjs","sourcesContent":["import { type VuiService, type IconName } from '@fastkit/vui';\nimport {\n type Editor,\n type Extensions,\n type Node,\n type Extension,\n type Mark,\n type AnyExtension,\n type EditorOptions,\n} from '@tiptap/vue-3';\nimport { VNodeChild } from 'vue';\n\nconst EDITOR_EVENTS = [\n 'beforeCreate',\n 'create',\n 'update',\n 'selectionUpdate',\n 'transaction',\n 'focus',\n 'blur',\n 'destroy',\n] as const;\n\ntype PrefixedEventName<S extends string> = `on${Capitalize<S>}`;\n\nconst prefixedEventName = <S extends string>(source: S): PrefixedEventName<S> =>\n `on${source.charAt(0).toUpperCase()}${source.slice(1)}` as any;\n\nexport type WysiwygEditorEvent = (typeof EDITOR_EVENTS)[number];\n\nexport type WysiwygEditorPrefixedEvent = PrefixedEventName<WysiwygEditorEvent>;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface WysiwygEditorEventsOptions\n extends Partial<Pick<EditorOptions, WysiwygEditorPrefixedEvent>> {}\n\nexport type WysiwygEditorEventsBucket = {\n [EV in WysiwygEditorEvent]: NonNullable<\n WysiwygEditorEventsOptions[PrefixedEventName<EV>]\n >[];\n};\n\nexport class WysiwygEditorInitializeContext {\n readonly listeners: WysiwygEditorEventsBucket = {} as any;\n\n private readonly _vui: () => VuiService;\n\n get vui() {\n return this._vui();\n }\n\n constructor(\n vuiGetter: () => VuiService,\n opts: WysiwygEditorEventsOptions = {},\n ) {\n this._vui = vuiGetter;\n\n EDITOR_EVENTS.forEach((event) => {\n this.listeners[event] = [];\n const prefixed = prefixedEventName(event);\n const fn = opts[prefixed];\n fn && this.listeners[event].push(fn as any);\n });\n }\n\n on<EV extends WysiwygEditorEvent>(\n ev: EV,\n handler: NonNullable<WysiwygEditorEventsOptions[PrefixedEventName<EV>]>,\n ) {\n this.listeners[ev].push(handler);\n return () => this.off(ev, handler);\n }\n\n off<EV extends WysiwygEditorEvent>(\n ev: EV,\n handler: NonNullable<WysiwygEditorEventsOptions[PrefixedEventName<EV>]>,\n ) {\n this.listeners[ev] = this.listeners[ev].filter(\n (_handler) => _handler !== handler,\n ) as any;\n }\n\n editorOptions() {\n const opts: WysiwygEditorEventsOptions = {};\n\n EDITOR_EVENTS.forEach((event) => {\n const prefixed = prefixedEventName(event);\n opts[prefixed] = (props) => {\n const handlers = this.listeners[event];\n handlers.forEach((handler) => {\n handler(props as any);\n });\n };\n });\n\n return opts;\n }\n}\n\nexport interface WysiwygEditorContext {\n editor: Editor;\n vui: VuiService;\n}\n\nexport type WysiwygExtensionFactory<Options = any, Storage = any> = (\n ctx: WysiwygEditorInitializeContext,\n) =>\n | Extension<Options, Storage>\n | Node<Options, Storage>\n | Mark<Options, Storage>;\n\nexport interface CreatedWysiwygExtension<Options = any, Storage = any> {\n __isCreatedWysiwygExtension: true;\n _configs: Partial<Options>[];\n configure(\n options?: Partial<Options>,\n ): CreatedWysiwygExtension<Options, Storage>;\n raw: WysiwygExtensionSource<Options, Storage>;\n}\n\nexport type WysiwygExtensionSource<Options = any, Storage = any> =\n | Extension<Options, Storage>\n | Node<Options, Storage>\n | Mark<Options, Storage>\n | WysiwygExtensionFactory<Options, Storage>;\n\nexport type RawWysiwygExtension<Options = any, Storage = any> =\n | WysiwygExtensionSource<Options, Storage>\n | CreatedWysiwygExtension<Options, Storage>;\n\n// export function createWysiwygExtension<Options = any, Storage = any>(\n// extension: Extension<Options, Storage>,\n// ): Extension<Options, Storage>;\n// export function createWysiwygExtension<Options = any, Storage = any>(\n// node: Node<Options, Storage>,\n// ): Node<Options, Storage>;\n// export function createWysiwygExtension<Options = any, Storage = any>(\n// mark: Mark<Options, Storage>,\n// ): Mark<Options, Storage>;\n// export function createWysiwygExtension<Options = any, Storage = any>(\n// factory: WysiwygExtensionFactory<Options, Storage>,\n// ): WysiwygExtensionFactory<Options, Storage>;\n\nfunction isCreatedWysiwygExtension<Options = any, Storage = any>(\n source: unknown,\n): source is CreatedWysiwygExtension<Options, Storage> {\n return (\n !!source &&\n typeof source === 'object' &&\n (source as CreatedWysiwygExtension).__isCreatedWysiwygExtension === true\n );\n}\n\nexport function createWysiwygExtension<Options = any, Storage = any>(\n extension: WysiwygExtensionSource<Options, Storage>,\n) {\n const ext: CreatedWysiwygExtension<Options, Storage> = {\n __isCreatedWysiwygExtension: true,\n _configs: [],\n configure: (opts) => {\n opts && ext._configs.push(opts);\n return ext;\n },\n raw: extension,\n };\n return ext;\n}\n\nfunction resolveRawWysiwygExtension(\n raw: RawWysiwygExtension,\n ctx: WysiwygEditorInitializeContext,\n): AnyExtension {\n if (isCreatedWysiwygExtension(raw)) {\n const { raw: _raw, _configs } = raw;\n let ext = typeof _raw === 'function' ? _raw(ctx) : _raw;\n _configs.forEach((config) => {\n ext = ext.configure(config);\n });\n return ext;\n }\n return typeof raw === 'function' ? raw(ctx) : raw;\n}\n\nexport function resolveRawWysiwygExtensions(\n raws: RawWysiwygExtension[],\n ctx: WysiwygEditorInitializeContext,\n) {\n return raws.map((raw) => resolveRawWysiwygExtension(raw, ctx));\n}\n\nexport type WysiwygEditorToolIcon =\n | IconName\n | ((ctx: WysiwygEditorContext) => IconName | (() => VNodeChild) | undefined);\n\n/**\n * Tool Configuration\n */\nexport interface WysiwygEditorTool {\n /**\n * Tool Key\n *\n * Must be unique to identify the tool\n */\n key: string;\n /** Icons to be displayed on the toolbar */\n icon: WysiwygEditorToolIcon;\n /** Conditions for displaying the icon as active */\n active?: boolean | ((ctx: WysiwygEditorContext) => boolean);\n /** Conditions for deactivating the icon */\n disabled?: boolean | ((ctx: WysiwygEditorContext) => boolean);\n /** Handler when mark text is clicked */\n onClick: (ctx: WysiwygEditorContext, ev: MouseEvent) => any;\n /** Whether to display tools in floating menu or not */\n floating?: boolean;\n /** Extensions that the tool depends on */\n extensions?: Extensions;\n}\n\nexport type WysiwygEditorToolFactory<Options = void> = (\n vui: VuiService,\n options?: Options,\n) => WysiwygEditorTool | WysiwygEditorTool[];\n\nexport type RawWysiwygEditorTool =\n | WysiwygEditorTool\n | WysiwygEditorToolFactory<any>;\n\nfunction resolveRawWysiwygEditorTool(\n raw: RawWysiwygEditorTool,\n vui: VuiService,\n) {\n return typeof raw === 'function' ? raw(vui) : raw;\n}\n\nexport interface ResolvedWysiwygEditorSettings {\n tools: WysiwygEditorTool[];\n extensions: Extensions;\n}\n\nexport function resolveRawWysiwygEditorTools(\n rawTools: RawWysiwygEditorTool[],\n vui: VuiService,\n): ResolvedWysiwygEditorSettings {\n const tools: WysiwygEditorTool[] = [];\n const extensions: Extensions = [];\n\n rawTools.forEach((raw) => {\n let resolved = resolveRawWysiwygEditorTool(raw, vui);\n if (!Array.isArray(resolved)) {\n resolved = [resolved];\n }\n resolved.forEach((tool) => {\n tools.push(tool);\n if (tool.extensions) {\n extensions.push(...tool.extensions);\n }\n });\n });\n\n return {\n tools,\n extensions,\n };\n}\n","export const VUI_WYSIWYG_EDITOR_SYMBOL = 'vui-wysiwyg-editor';\n","import { createVNode as _createVNode } from \"vue\";\nimport './Linter.scss';\nimport { Extension } from '@tiptap/vue-3';\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\nimport { Plugin, PluginKey, TextSelection } from '@tiptap/pm/state';\nimport { createWysiwygExtension } from '../../schemes';\nconst PROBLEM_CLASS_NAME = 'v-linter__problem';\nconst ISSUE_ICON_CLASS_NAME = 'v-linter__issue-icon';\nconst ISSUE_DATASET_NAME = 'data-issue-id';\nfunction resolveWysiwygLinterFixMessage(message) {\n return typeof message === 'function' ? message() : message;\n}\nfunction renderIcon(view, issue) {\n const {\n level = 'warning'\n } = issue;\n const icon = document.createElement('div');\n const message = resolveWysiwygLinterFixMessage(issue.message);\n icon.className = `${ISSUE_ICON_CLASS_NAME} ${level}-scope`;\n icon.setAttribute(ISSUE_DATASET_NAME, issue.id);\n if (typeof message === 'string') {\n icon.title = message;\n }\n return icon;\n}\nfunction runAllLinterPlugins(doc, plugins) {\n const decorations = [];\n const issues = plugins.map(RegisteredLinterPlugin => new RegisteredLinterPlugin(doc).scan().getResults()).flat();\n issues.forEach(issue => {\n const {\n level = 'warning',\n icon\n } = issue;\n const message = resolveWysiwygLinterFixMessage(issue.message);\n decorations.push(Decoration.inline(issue.from, issue.to, {\n class: `${PROBLEM_CLASS_NAME} ${level}-scope`,\n 'data-issue-id': issue.id,\n title: typeof message === 'string' ? message : undefined\n }));\n if (icon) {\n decorations.push(Decoration.widget(issue.from, view => renderIcon(view, issue)));\n }\n });\n const decorationSet = DecorationSet.create(doc, decorations);\n return {\n issues,\n decorationSet\n };\n}\nexport const WysiwygLinter = createWysiwygExtension(ctx => {\n function showMenu(view, issue, event) {\n const message = resolveWysiwygLinterFixMessage(issue.message);\n const variant = ctx.vui.setting('containedVariant');\n const scope = ctx.vui.setting(`${issue.level}Scope`);\n return ctx.vui.menu({\n activator: event,\n content: stack => _createVNode(\"div\", {\n \"class\": \"v-linter__issue-menu__body\"\n }, [_createVNode(\"div\", {\n \"class\": ['v-linter__issue-menu__message', `${scope}-scope ${variant}`]\n }, [message]), issue.fix.length && _createVNode(\"div\", {\n \"class\": \"v-linter__issue-menu__fixers\"\n }, [issue.fix.map((fixer, index) => _createVNode(\"div\", {\n \"key\": index,\n \"class\": \"v-linter__issue-menu__fixer\"\n }, [_createVNode(\"button\", {\n \"type\": \"button\",\n \"class\": \"v-linter__issue-menu__fixer__button\",\n \"onClick\": () => {\n stack.close();\n fixer.handler(view, issue);\n }\n }, [_createVNode(\"span\", {\n \"class\": \"v-linter__issue-menu__fixer__button__message\"\n }, [resolveWysiwygLinterFixMessage(fixer.message)])])]))])])\n });\n }\n return Extension.create({\n name: 'linter',\n addOptions() {\n return {\n plugins: []\n };\n },\n addStorage() {\n return {\n issues: []\n };\n },\n addProseMirrorPlugins() {\n const {\n plugins\n } = this.options;\n const {\n storage\n } = this;\n const runAll = doc => {\n const {\n issues,\n decorationSet\n } = runAllLinterPlugins(doc, plugins);\n storage.issues = issues;\n return decorationSet;\n };\n const getIssue = id => storage.issues.find(issue => issue.id === id);\n const getIssueElementByEvent = source => {\n if (!source || !(source instanceof HTMLElement)) {\n return;\n }\n const issueId = source.getAttribute(ISSUE_DATASET_NAME);\n const issue = issueId && getIssue(issueId);\n if (!issue) return;\n return {\n issue\n };\n };\n const linterPlugin = new Plugin({\n key: new PluginKey('linter'),\n state: {\n init(_, {\n doc\n }) {\n return runAll(doc);\n },\n apply(transaction, oldState) {\n return transaction.docChanged ? runAll(transaction.doc) : oldState;\n }\n },\n props: {\n decorations(state) {\n return linterPlugin.getState(state);\n },\n handleClick(view, _, event) {\n const info = getIssueElementByEvent(event.target);\n if (!info) {\n return false;\n }\n const {\n issue\n } = info;\n const {\n from,\n to\n } = issue;\n const focus = () => view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc, from, to)).scrollIntoView());\n focus();\n showMenu(view, issue, event);\n return true;\n }\n }\n });\n return [linterPlugin];\n }\n });\n});","/* eslint-disable eqeqeq */\n/* eslint-disable no-bitwise */\nlet IDX = 256;\nlet BUFFER: any;\nconst HEX: any = [];\nwhile (IDX--) HEX[IDX] = (IDX + 256).toString(16).substring(1);\n\nexport function cheepUUID() {\n let i = 0;\n let num;\n let out = '';\n\n if (!BUFFER || IDX + 16 > 256) {\n BUFFER = Array((i = 256));\n while (i--) BUFFER[i] = (256 * Math.random()) | 0;\n // eslint-disable-next-line no-multi-assign\n i = IDX = 0;\n }\n\n for (; i < 16; i++) {\n num = BUFFER[IDX + i];\n if (i == 6) out += HEX[(num & 15) | 64];\n else if (i == 8) out += HEX[(num & 63) | 128];\n else out += HEX[num];\n\n if (i & 1 && i > 1 && i < 11) out += '-';\n }\n\n IDX++;\n return out;\n}\n","import { VNodeChild } from 'vue';\nimport { Node as ProsemirrorNode } from '@tiptap/pm/model';\nimport { EditorView } from '@tiptap/pm/view';\nimport { cheepUUID } from './utils';\n\nexport type WysiwygLinterFixFn = (\n view: EditorView,\n issue: WysiwygLinterResult,\n) => any;\n\nexport type WysiwygLinterFixMessage = string | (() => VNodeChild);\n\nexport interface WysiwygLinterFixer {\n message: WysiwygLinterFixMessage;\n handler: WysiwygLinterFixFn;\n}\n\nexport type WysiwygLinterResultLevel = 'warning' | 'error';\n\n// fixers\nexport interface WysiwygLinterResult {\n id: string;\n icon: boolean;\n level: WysiwygLinterResultLevel;\n message: WysiwygLinterFixMessage;\n from: number;\n to: number;\n fix: WysiwygLinterFixer[];\n}\n\nexport interface RawLinterResult\n extends Omit<WysiwygLinterResult, 'level' | 'fix' | 'id' | 'icon'> {\n level?: WysiwygLinterResultLevel;\n icon?: boolean;\n fix?: WysiwygLinterFixer | WysiwygLinterFixer[];\n}\n\nexport class WysiwygLinterPlugin {\n protected doc: ProsemirrorNode;\n\n private results: Array<WysiwygLinterResult> = [];\n\n constructor(doc: ProsemirrorNode) {\n this.doc = doc;\n }\n\n record(result: RawLinterResult) {\n const { fix = [], icon = false } = result;\n this.results.push({\n level: 'error',\n id: cheepUUID(),\n ...result,\n fix: Array.isArray(fix) ? fix : [fix],\n icon,\n });\n }\n\n scan() {\n return this;\n }\n\n getResults() {\n return this.results;\n }\n}\n","import { createTextVNode as _createTextVNode, createVNode as _createVNode } from \"vue\";\nimport { WysiwygLinterPlugin } from '../LinterPlugin';\nexport function WysiwygLinterBadWords(words) {\n const regex = new RegExp(`\\\\b(${words.join('|')})\\\\b`);\n\n // eslint-disable-next-line no-shadow\n return class WysiwygLinterBadWords extends WysiwygLinterPlugin {\n scan() {\n this.doc.descendants((node, position) => {\n if (!node.isText) {\n return;\n }\n const matches = regex.exec(node.text);\n if (matches) {\n const fixValue = `${matches[0]}!!!!!`;\n this.record({\n level: 'warning',\n message: `Try not to say '${matches[0]}'`,\n from: position + matches.index,\n to: position + matches.index + matches[0].length,\n fix: [{\n message: () => _createVNode(\"span\", null, [_createVNode(\"code\", null, [fixValue]), _createTextVNode(\"\\u306B\\u4FEE\\u6B63\\u3059\\u308B\\u3002\")]),\n handler: () => {\n // eslint-disable-next-line no-console\n console.log('hoge');\n }\n }, {\n message: 'どうにかする',\n handler: () => {\n // eslint-disable-next-line no-console\n console.log('hoge');\n }\n }]\n });\n }\n });\n return this;\n }\n };\n}","import { EditorView } from '@tiptap/pm/view';\nimport {\n WysiwygLinterPlugin,\n WysiwygLinterResult as Issue,\n} from '../LinterPlugin';\n\nexport class WysiwygLinterHeadingLevel extends WysiwygLinterPlugin {\n fixHeader(level: number) {\n // eslint-disable-next-line func-names\n return function ({ state, dispatch }: EditorView, issue: Issue) {\n dispatch(state.tr.setNodeMarkup(issue.from - 1, undefined, { level }));\n };\n }\n\n scan() {\n let lastHeadLevel: number | null = null;\n\n this.doc.descendants((node, position) => {\n if (node.type.name === 'heading') {\n // Check whether heading levels fit under the current level\n const { level } = node.attrs;\n\n if (lastHeadLevel != null && level > lastHeadLevel + 1) {\n this.record({\n message: `Heading too small (${level} under ${lastHeadLevel})`,\n from: position + 1,\n to: position + 1 + node.content.size,\n fix: {\n message: '修正する',\n handler: this.fixHeader(lastHeadLevel + 1),\n },\n });\n }\n lastHeadLevel = level;\n }\n });\n\n return this;\n }\n}\n","import { EditorView } from '@tiptap/pm/view';\nimport {\n WysiwygLinterPlugin,\n WysiwygLinterResult as Issue,\n} from '../LinterPlugin';\n\nexport class WysiwygLinterPunctuation extends WysiwygLinterPlugin {\n public regex = / ([,.!?:]) ?/g;\n\n fix(replacement: any) {\n // eslint-disable-next-line func-names\n return function ({ state, dispatch }: EditorView, issue: Issue) {\n dispatch(\n state.tr.replaceWith(\n issue.from,\n issue.to,\n state.schema.text(replacement),\n ),\n );\n };\n }\n\n scan() {\n this.doc.descendants((node, position) => {\n if (!node.isText) {\n return;\n }\n\n if (!node.text) {\n return;\n }\n\n const matches = this.regex.exec(node.text);\n\n if (matches) {\n this.record({\n message: 'Suspicious spacing around punctuation',\n from: position + matches.index,\n to: position + matches.index + matches[0].length,\n fix: {\n message: 'Fix it!!!',\n handler: this.fix(`${matches[1]} `),\n },\n });\n }\n });\n\n return this;\n }\n}\n","import { Extension } from '@tiptap/vue-3';\nimport '@tiptap/extension-text-style';\n\nexport type WysiwygColorOptions = {\n types: string[];\n};\n\ndeclare module '@tiptap/vue-3' {\n interface Commands<ReturnType> {\n color: {\n /**\n * Set the text color\n */\n setColor: (color: string) => ReturnType;\n /**\n * Unset the text color\n */\n unsetColor: () => ReturnType;\n };\n }\n}\n\nexport const WysiwygColorExtension = Extension.create<WysiwygColorOptions>({\n name: 'color',\n\n addOptions() {\n return {\n types: ['textStyle'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n color: {\n default: null,\n parseHTML: (element) => element.style.color.replace(/['\"]+/g, ''),\n renderHTML: (attributes) => {\n if (!attributes.color) {\n return {};\n }\n\n return {\n style: `color: ${attributes.color}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setColor:\n (color) =>\n ({ chain }) =>\n chain().setMark('textStyle', { color }).run(),\n unsetColor:\n () =>\n ({ chain }) =>\n chain()\n .setMark('textStyle', { color: null })\n .removeEmptyTextStyle()\n .run(),\n };\n },\n});\n","import { Extension, mergeAttributes, Mark } from '@tiptap/vue-3';\nimport '@tiptap/extension-text-style';\n// import '@tiptap/vue-3';\n\nexport type WysiwygCustomTagSettings = {\n /**\n * tag name\n *\n * Either the html default tag name or a custom tag name is acceptable\n *\n * @default \"span\"\n */\n tag: string;\n\n /**\n * HTML Attributes\n *\n * Attributes to be assigned to tags such as `class`, `data-xxx`, etc.\n */\n attrs?: Record<any, string>;\n};\n\ndeclare module '@tiptap/vue-3' {\n interface Commands<ReturnType> {\n customTag: {\n /**\n * Set the custom tag\n */\n setCustomTag: (markName: string) => ReturnType;\n /**\n * Toggle the custom tag\n */\n toggleCustomTag: (markName: string) => ReturnType;\n /**\n * Unset the custom tag\n */\n unsetCustomTag: (markName: string) => ReturnType;\n };\n }\n}\n\n// export type WysiwygCustomTagSettings = WysiwygCustomTagOptions & {\n// /**\n// * extension name\n// */\n// name: string;\n// };\n\nexport function createWysiwygCustomTagMark(\n name: string,\n settings: Partial<WysiwygCustomTagSettings>,\n) {\n const { tag = 'span', attrs } = settings;\n const attrEntries = attrs && Object.entries(attrs);\n // eslint-disable-next-line no-shadow\n const attrNames = attrEntries && attrEntries.map(([name]) => name);\n\n const getElementAttrs = (\n el: HTMLElement,\n ): Record<any, string> | undefined => {\n if (!attrNames) return;\n\n return (\n el\n .getAttributeNames()\n // eslint-disable-next-line no-shadow\n .reduce((acc, name) => ({ ...acc, [name]: el.getAttribute(name) }), {})\n );\n };\n\n const isMatchedElementAttrs = (elAttrs: Record<any, string>): boolean => {\n if (!attrEntries) return true;\n // eslint-disable-next-line no-shadow\n return attrEntries.every(([name, value]) => elAttrs[name] === value);\n };\n\n return Mark.create<WysiwygCustomTagSettings>({\n name,\n\n addOptions() {\n return {\n tag,\n attrs: attrs && { ...attrs },\n };\n },\n parseHTML() {\n return [\n {\n tag,\n getAttrs: (el: any) => {\n if (!attrs) return null;\n const elAttrs = getElementAttrs(el);\n if (!elAttrs) return false;\n return isMatchedElementAttrs(el) && null;\n },\n },\n ];\n },\n renderHTML({ HTMLAttributes }) {\n return [\n tag,\n attrs ? mergeAttributes(attrs, HTMLAttributes) : HTMLAttributes,\n 0,\n ];\n },\n });\n}\n\nexport const WysiwygCustomTagExtension =\n Extension.create<WysiwygCustomTagSettings>({\n name: 'custom-tag',\n addCommands() {\n return {\n setCustomTag:\n (markName) =>\n ({ chain }) =>\n chain().setMark(markName).run(),\n unsetCustomTag:\n (markName) =>\n ({ chain }) =>\n chain().unsetMark(markName).run(),\n toggleCustomTag:\n (markName) =>\n ({ chain }) =>\n chain().toggleMark(markName).run(),\n };\n },\n });\n","import { BulletList, BulletListOptions } from '@tiptap/extension-bullet-list';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygBulletListTool: WysiwygEditorToolFactory<\n BulletListOptions\n> = (vui, options) => {\n const tool: WysiwygEditorTool = {\n key: 'bulletList',\n icon: vui.icon('editorformatListBulleted'),\n active: ({ editor }) => editor.isActive('bulletList'),\n onClick: ({ editor }) => {\n editor.chain().focus().toggleBulletList().run();\n },\n floating: true,\n extensions: [BulletList.configure(options)],\n };\n return tool;\n};\n","import { Bold, BoldOptions } from '@tiptap/extension-bold';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygFormatBoldTool: WysiwygEditorToolFactory<BoldOptions> = (\n vui,\n options,\n) => {\n const tool: WysiwygEditorTool = {\n key: 'formatBold',\n icon: vui.icon('editorformatBold'),\n active: ({ editor }) => editor.isActive('bold'),\n onClick: ({ editor }) => {\n editor.chain().focus().toggleBold().run();\n },\n floating: true,\n extensions: [Bold.configure(options)],\n };\n return tool;\n};\n","import { Italic, ItalicOptions } from '@tiptap/extension-italic';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygFormatItalicTool: WysiwygEditorToolFactory<\n ItalicOptions\n> = (vui, options) => {\n const tool: WysiwygEditorTool = {\n key: 'formatItalic',\n icon: vui.icon('editorformatItalic'),\n active: ({ editor }) => editor.isActive('italic'),\n onClick: ({ editor }) => {\n editor.chain().focus().toggleItalic().run();\n },\n floating: true,\n extensions: [Italic.configure(options)],\n };\n return tool;\n};\n","import { Underline, UnderlineOptions } from '@tiptap/extension-underline';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygFormatUnderlineTool: WysiwygEditorToolFactory<\n UnderlineOptions\n> = (vui, options) => {\n const tool: WysiwygEditorTool = {\n key: 'formatUnderline',\n icon: vui.icon('editorformatUnderline'),\n active: ({ editor }) => editor.isActive('underline'),\n onClick: ({ editor }) => {\n editor.chain().focus().toggleUnderline().run();\n },\n floating: true,\n extensions: [Underline.configure(options)],\n };\n return tool;\n};\n","import { History, HistoryOptions } from '@tiptap/extension-history';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygHistoryTool: WysiwygEditorToolFactory<HistoryOptions> = (\n vui,\n options,\n) => {\n const undo: WysiwygEditorTool = {\n key: 'history-undo',\n icon: vui.icon('editorUndo'),\n disabled: ({ editor }) => !editor.can().undo(),\n onClick: ({ editor }) => {\n editor.chain().focus().undo().run();\n },\n extensions: [History.configure(options)],\n };\n const redo: WysiwygEditorTool = {\n key: 'history-redo',\n icon: vui.icon('editorRedo'),\n disabled: ({ editor }) => !editor.can().redo(),\n onClick: ({ editor }) => {\n editor.chain().focus().redo().run();\n },\n };\n return [undo, redo];\n};\n","import { Link, LinkOptions } from '@tiptap/extension-link';\nimport { validateIf, url } from '@fastkit/vui';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygLinkTool: WysiwygEditorToolFactory<LinkOptions> = (\n vui,\n options,\n) => {\n const tool: WysiwygEditorTool = {\n key: 'link',\n icon: vui.icon('editorLink'),\n active: ({ editor }) => editor.isActive('link'),\n // eslint-disable-next-line no-shadow\n onClick: async ({ vui, editor }) => {\n const { href = '' } = editor.getAttributes('link');\n const result = await vui.prompt({\n input: {\n label: 'Link URL',\n rules: [validateIf, url],\n initialValue: href,\n size: 'sm',\n autofocus: true,\n },\n });\n\n if (result === undefined || result === false) {\n return;\n }\n\n const range = editor.chain().focus().extendMarkRange('link');\n\n if (!result) {\n range.unsetLink().run();\n } else {\n range\n .setLink({\n href: result,\n })\n .run();\n }\n },\n floating: true,\n extensions: [\n Link.configure({\n openOnClick: false,\n ...options,\n }),\n ],\n };\n return tool;\n};\n","import {\n OrderedList,\n OrderedListOptions,\n} from '@tiptap/extension-ordered-list';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygOrderedListTool: WysiwygEditorToolFactory<\n OrderedListOptions\n> = (vui, options) => {\n const tool: WysiwygEditorTool = {\n key: 'orderedList',\n icon: vui.icon('editorformatListNumbered'),\n active: ({ editor }) => editor.isActive('orderedList'),\n onClick: ({ editor }) => {\n editor.chain().focus().toggleOrderedList().run();\n },\n floating: true,\n extensions: [OrderedList.configure(options)],\n };\n return tool;\n};\n","import { createVNode as _createVNode } from \"vue\";\nimport './color.scss';\nimport { VIcon } from '@fastkit/vui';\nimport TextStyle from '@tiptap/extension-text-style';\nimport { WysiwygColorExtension } from '../extensions';\nexport function createWysiwygColorTool(opts) {\n const WysiwygColorTool = vui => {\n const tool = {\n key: 'textColor',\n // active: ({ editor }) => editor.isActive('textStyle'),\n icon: ({\n editor\n }) => () => {\n const {\n color\n } = editor.getAttributes('textStyle');\n const style = {\n color\n };\n return _createVNode(\"span\", {\n \"class\": \"v-wysiwyg-color-tool__button\"\n }, [_createVNode(VIcon, {\n \"class\": \"v-wysiwyg-color-tool__button__icon\",\n \"name\": vui.icon('editorTextColor')\n }, null), _createVNode(\"span\", {\n \"class\": \"v-wysiwyg-color-tool__button__bar\",\n \"style\": style\n }, null)]);\n },\n onClick: (ctx, ev) => {\n ctx.vui.menu({\n class: 'v-wysiwyg-color-tool__menu',\n activator: ev,\n content: stack => _createVNode(\"div\", {\n \"class\": ['v-wysiwyg-color-tool__items', {\n 'v-wysiwyg-color-tool__items--with-label': opts.withLabel\n }]\n }, [opts.items.map((item, index) => _createVNode(\"button\", {\n \"key\": item.key == null ? index : item.key,\n \"class\": \"v-wysiwyg-color-tool__item\",\n \"type\": \"button\",\n \"onClick\": () => {\n const {\n color\n } = item;\n let command = ctx.editor.chain().focus();\n if (color) {\n command = command.setColor(color);\n } else {\n command = command.unsetColor();\n }\n command.run();\n stack.close();\n }\n }, [_createVNode(\"span\", {\n \"class\": \"v-wysiwyg-color-tool__item__color\",\n \"style\": item.color ? {\n color: item.color\n } : {}\n }, null), opts.withLabel && _createVNode(\"span\", {\n \"class\": \"v-wysiwyg-color-tool__item__name\"\n }, [item.name])]))])\n });\n },\n floating: true,\n extensions: [TextStyle, WysiwygColorExtension]\n };\n return tool;\n };\n return WysiwygColorTool;\n}","import { isVNode as _isVNode, createVNode as _createVNode } from \"vue\";\nimport { TextAlign } from '@tiptap/extension-text-align';\nimport { VButtonGroup, VButton } from '@fastkit/vui';\nfunction _isSlot(s) {\n return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !_isVNode(s);\n}\n/**\n * A list of available options for the text align attribute.\n * @remarks\n * `\"justify\"` has not yet been adopted because of ambiguity in browser support.\n */\nexport const WYSIWYG_TEXT_ALIGN_VALUES = ['left', 'center', 'right'\n// 'justify',\n];\n\n/** Text align value */\n\n/**\n * A list of nodes where the text align attribute should be applied to.\n */\nconst DEFAULT_TYPES = ['heading', 'paragraph'];\nconst conditions = WYSIWYG_TEXT_ALIGN_VALUES.map(value => [value, {\n textAlign: value\n}]);\nconst ICON_AT = {\n left: 'editorAlignLeft',\n center: 'editorAlignCenter',\n right: 'editorAlignRight'\n};\nfunction resolveOptions(rawOptions) {\n const types = rawOptions?.types || DEFAULT_TYPES.slice();\n const alignments = rawOptions?.alignments || WYSIWYG_TEXT_ALIGN_VALUES.slice();\n const defaultAlignment = rawOptions?.defaultAlignment || 'left';\n return {\n types,\n alignments,\n defaultAlignment\n };\n}\nfunction getCurrentAlign(editor, options) {\n for (const [align, condition] of conditions) {\n if (editor.isActive(condition)) return align;\n }\n return options.defaultAlignment;\n}\nexport const WysiwygTextAlignTool = (vui, options) => {\n const resolvedOptions = resolveOptions(options);\n const {\n alignments\n } = resolvedOptions;\n const getIcon = value => {\n const iconKey = ICON_AT[value];\n const icon = vui.icon(iconKey);\n if (icon === '$empty' || typeof icon === 'function') return;\n return icon;\n };\n const variant = vui.setting('plainVariant');\n const toolButtonActiveColor = vui.setting('primaryScope');\n const tool = {\n key: 'textAlign',\n icon: ({\n editor\n }) => getIcon(getCurrentAlign(editor, resolvedOptions)),\n // eslint-disable-next-line no-shadow\n onClick: async ({\n vui,\n editor\n }, ev) => {\n vui.menu({\n distance: 0,\n activator: ev,\n content: menu => {\n let _slot;\n return _createVNode(VButtonGroup, {\n \"variant\": variant\n }, _isSlot(_slot = alignments.map(value => {\n const isActive = editor.isActive({\n textAlign: value\n });\n return _createVNode(VButton, {\n \"tabindex\": -1,\n \"color\": isActive ? toolButtonActiveColor : undefined,\n \"key\": value,\n \"icon\": getIcon(value),\n \"onClick\": () => {\n editor.chain().focus().setTextAlign(value).run();\n }\n }, null);\n })) ? _slot : {\n default: () => [_slot]\n });\n }\n });\n },\n floating: true,\n extensions: [TextAlign.configure(resolvedOptions)]\n };\n return tool;\n};","import { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\nimport {\n createWysiwygCustomTagMark,\n WysiwygCustomTagSettings,\n WysiwygCustomTagExtension,\n} from '../extensions/custom-tag';\n\nexport interface WysiwygCustomTagToolSettings\n extends Pick<WysiwygEditorTool, 'icon' | 'floating'>,\n Partial<WysiwygCustomTagSettings> {}\n\n/**\n * Generate Custom Tag Tool\n *\n * @param markName - Mark name\n * @param settings - Tool Configuration\n * @returns Generated Tool\n */\nexport function createWysiwygCustomTagTool(\n markName: string,\n settings: WysiwygCustomTagToolSettings,\n): WysiwygEditorToolFactory {\n const Mark = createWysiwygCustomTagMark(markName, settings);\n const { icon, floating = true } = settings;\n\n return (vui) => {\n const tool: WysiwygEditorTool = {\n key: `customTag:${markName}`,\n icon,\n floating,\n active: ({ editor }) => editor.isActive(markName),\n onClick: ({ editor }) => {\n editor.chain().focus().toggleCustomTag(markName).run();\n },\n extensions: [WysiwygCustomTagExtension, Mark.configure(settings)],\n };\n return tool;\n };\n}\n","import { resolveDirective as _resolveDirective, createVNode as _createVNode, isVNode as _isVNode } from \"vue\";\nimport './VWysiwygEditor.scss';\nimport { defineComponent, computed, ref, watch, onBeforeUnmount } from 'vue';\nimport { createFormNodeWrapperProps, VFormControl, VControlField, createControlFieldProps, createTextableProps, createTextableEmits, TextableControl, createControlProps, useControl, createControlFieldProviderProps, useControlField, VTextCounter, defineSlots, useVui, VButton, VButtonGroup, withCtx } from '@fastkit/vui';\nimport { EditorContent, useEditor, BubbleMenu } from '@tiptap/vue-3';\nimport { StarterKit } from '@tiptap/starter-kit';\nimport { VUI_WYSIWYG_EDITOR_SYMBOL } from '../../injections';\nimport { resolveRawWysiwygExtensions, resolveRawWysiwygEditorTools,\n// EditorEventsOptions,\nWysiwygEditorInitializeContext } from '../../schemes';\nfunction _isSlot(s) {\n return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !_isVNode(s);\n}\nconst slots = defineSlots();\nexport const VWysiwygEditor = defineComponent({\n name: 'VWysiwygEditor',\n props: {\n ...createTextableProps(),\n ...createFormNodeWrapperProps(),\n ...createControlFieldProps(),\n ...createControlFieldProviderProps(),\n ...createControlProps(),\n ...slots(),\n extensions: {\n type: Array,\n default: () => []\n },\n tools: {\n type: Array,\n default: () => []\n },\n floatingToolbar: Boolean,\n disabledMinHeight: Boolean,\n disabledMaxHeight: Boolean,\n removeDefaultWrapper: {\n type: Boolean,\n default: true\n }\n },\n emits: {\n ...createTextableEmits()\n },\n slots,\n setup(props, ctx) {\n const vui = useVui();\n const textRef = ref('');\n const toolButtonActiveColor = vui.setting('primaryScope');\n const wysiwygSettings = computed(() => resolveRawWysiwygEditorTools(props.tools, vui));\n const control = useControl(props);\n useControlField(props);\n const classes = computed(() => ['v-wysiwyg-editor', control.classes.value, `v-wysiwyg-editor--${control.size.value}`, {\n 'v-wysiwyg-editor--disabled-min-height': props.disabledMinHeight,\n 'v-wysiwyg-editor--disabled-max-height': props.disabledMaxHeight\n }]);\n const inputControl = new TextableControl(props, ctx, {\n nodeType: VUI_WYSIWYG_EDITOR_SYMBOL,\n validationValue: () => textRef.value\n });\n const getOutput = (editor, type) => {\n if (props.removeDefaultWrapper && editor.isEmpty) return '';\n if (type === 'html') return editor.getHTML();\n if (type === 'text') return editor.getText();\n return '';\n };\n const initializeCtx = new WysiwygEditorInitializeContext(() => vui, {\n onCreate: ({\n editor\n }) => {\n textRef.value = getOutput(editor, 'text');\n updateEditable();\n },\n onFocus: ({\n event\n }) => {\n inputControl.focusHandler(event);\n },\n onBlur: ({\n event\n }) => {\n inputControl.blurHandler(event);\n },\n onUpdate: ({\n editor\n }) => {\n inputControl.value = getOutput(editor, 'html');\n textRef.value = getOutput(editor, 'text');\n }\n });\n const extensions = [StarterKit.configure({\n bold: false,\n bulletList: false,\n orderedList: false,\n history: false,\n italic: false\n }), ...resolveRawWysiwygExtensions(props.extensions, initializeCtx), ...wysiwygSettings.value.extensions];\n const updateEditable = () => {\n if (!editor.value) return;\n editor.value.setEditable(inputControl.canOperation);\n };\n watch(() => inputControl.canOperation, updateEditable);\n watch(() => props.modelValue, modelValue => {\n const $editor = editor.value;\n if (!$editor || getOutput($editor, 'html') === modelValue) return;\n $editor.commands.setContent(modelValue == null ? '' : modelValue, false);\n textRef.value = getOutput($editor, 'text');\n });\n initializeCtx.on('create', ({\n editor\n }) => {\n textRef.value = getOutput(editor, 'text');\n updateEditable();\n });\n const editor = useEditor({\n ...initializeCtx.editorOptions(),\n autofocus: props.autofocus,\n content: props.modelValue,\n extensions,\n editorProps: {\n attributes: {\n class: 'v-wysiwyg-editor__input__prose'\n }\n }\n });\n const focus = (position, options) => editor.value?.chain().focus(position, options);\n const wysiwygContext = computed(() => ({\n vui,\n editor: editor.value\n }));\n const createTools = (bubbleMenu = false) => {\n let _slot;\n const {\n value: settings\n } = wysiwygSettings;\n const {\n value: context\n } = wysiwygContext;\n const tools = bubbleMenu ? settings.tools.filter(t => !!t.floating) : settings.tools;\n const _editor = editor.value;\n const variant = vui.setting(bubbleMenu ? 'containedVariant' : 'plainVariant');\n return _createVNode(VButtonGroup, {\n \"class\": ['v-wysiwyg-editor__toolbar', {\n 'v-wysiwyg-editor__floating-toolbar': props.floatingToolbar\n }],\n \"variant\": variant\n }, _isSlot(_slot = tools.map(({\n key,\n icon,\n onClick,\n disabled,\n active\n }) => {\n const isActive = !!_editor && resolveContextualValue(context, active);\n const isDisabled = !inputControl.canOperation || !!_editor && resolveContextualValue(context, disabled);\n let iconName;\n let child;\n if (typeof icon === 'function') {\n if (_editor) {\n const _child = icon(context);\n if (typeof _child === 'function') {\n child = _child();\n } else {\n iconName = _child;\n }\n }\n } else {\n iconName = icon;\n }\n if (!iconName && child == null) return;\n return _createVNode(VButton, {\n \"tabindex\": -1,\n \"key\": key,\n \"icon\": iconName,\n \"onClick\": ev => onClick(context, ev),\n \"color\": isActive ? toolButtonActiveColor : undefined,\n \"disabled\": isDisabled\n }, _isSlot(child) ? child : {\n default: () => [child]\n });\n })) ? _slot : {\n default: () => [_slot]\n });\n };\n onBeforeUnmount(() => {\n editor.value?.destroy();\n });\n const api = {\n get editor() {\n return editor.value;\n },\n control: inputControl\n };\n ctx.expose(api);\n const handleClickLabel = ev => {\n focus('start', {\n scrollIntoView: true\n });\n };\n const defaultSlot = () => {\n let _slot2;\n return _createVNode(\"div\", {\n \"class\": \"v-wysiwyg-editor__body\"\n }, [_createVNode(EditorContent, {\n \"class\": \"v-wysiwyg-editor__input__element wysiwyg\",\n \"editor\": editor.value\n }, null), !props.floatingToolbar && !!editor.value && !inputControl.isReadonly && _createVNode(BubbleMenu, {\n \"class\": \"v-wysiwyg-editor__bubble-menu\",\n \"editor\": editor.value\n }, _isSlot(_slot2 = createTools(true)) ? _slot2 : {\n default: () => [_slot2]\n })]);\n };\n const formControlDefaultSlot = () => _createVNode(\"div\", {\n \"class\": \"v-wysiwyg-editor__wrapper\"\n }, [!inputControl.isReadonly && createTools(), _createVNode(VControlField, {\n \"class\": \"v-wysiwyg-editor__input\",\n \"autoHeight\": true,\n \"startAdornment\": props.startAdornment,\n \"endAdornment\": props.endAdornment,\n \"size\": control.size.value\n }, {\n ...ctx.slots,\n default: withCtx(defaultSlot)\n })]);\n const infoAppendsSlot = () => {\n const {\n counterResult\n } = inputControl;\n if (!counterResult) return;\n return _createVNode(VTextCounter, counterResult, null);\n };\n return () => _createVNode(VFormControl, {\n \"nodeControl\": inputControl,\n \"class\": classes.value,\n \"label\": props.label,\n \"hint\": props.hint,\n \"hinttip\": props.hinttip,\n \"hiddenInfo\": props.hiddenInfo,\n \"requiredChip\": props.requiredChip,\n \"onClickLabel\": handleClickLabel\n }, {\n ...ctx.slots,\n default: withCtx(formControlDefaultSlot),\n infoAppends: withCtx(infoAppendsSlot)\n });\n }\n});\nfunction resolveContextualValue(ctx,\n// eslint-disable-next-line no-shadow\nsource) {\n return typeof source === 'function' ? source(ctx) : source;\n}"]}
|
|
1
|
+
{"version":3,"sources":["../src/schemes.ts","../src/injections.ts","../src/extensions/linter/Linter.tsx","../src/extensions/linter/utils.ts","../src/extensions/linter/LinterPlugin.ts","../src/extensions/linter/plugins/BadWords.tsx","../src/extensions/linter/plugins/HeadingLevel.ts","../src/extensions/linter/plugins/Punctuation.ts","../src/extensions/color.ts","../src/extensions/custom-tag.ts","../src/tools/bullet-list.ts","../src/tools/format-bold.ts","../src/tools/format-italic.ts","../src/tools/format-underline.ts","../src/tools/history.ts","../src/tools/link.ts","../src/tools/ordered-list.ts","../src/tools/color.tsx","../src/tools/text-align.tsx","../src/tools/custom-tag.ts","../src/components/VWysiwygEditor/VWysiwygEditor.tsx"],"names":["_createVNode","_createTextVNode","Extension","name","vui","_isVNode","Mark","_isSlot","editor","VButtonGroup","VButton"],"mappings":"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","file":"vui-wysiwyg.mjs","sourcesContent":["import { type VuiService, type IconName } from '@fastkit/vui';\nimport {\n type Editor,\n type Extensions,\n type Node,\n type Extension,\n type Mark,\n type AnyExtension,\n type EditorOptions,\n} from '@tiptap/vue-3';\nimport { VNodeChild } from 'vue';\n\nconst EDITOR_EVENTS = [\n 'beforeCreate',\n 'create',\n 'update',\n 'selectionUpdate',\n 'transaction',\n 'focus',\n 'blur',\n 'destroy',\n] as const;\n\ntype PrefixedEventName<S extends string> = `on${Capitalize<S>}`;\n\nconst prefixedEventName = <S extends string>(source: S): PrefixedEventName<S> =>\n `on${source.charAt(0).toUpperCase()}${source.slice(1)}` as any;\n\nexport type WysiwygEditorEvent = (typeof EDITOR_EVENTS)[number];\n\nexport type WysiwygEditorPrefixedEvent = PrefixedEventName<WysiwygEditorEvent>;\n\nexport interface WysiwygEditorEventsOptions\n extends Partial<Pick<EditorOptions, WysiwygEditorPrefixedEvent>> {}\n\nexport type WysiwygEditorEventsBucket = {\n [EV in WysiwygEditorEvent]: NonNullable<\n WysiwygEditorEventsOptions[PrefixedEventName<EV>]\n >[];\n};\n\nexport class WysiwygEditorInitializeContext {\n readonly listeners: WysiwygEditorEventsBucket = {} as any;\n\n private readonly _vui: () => VuiService;\n\n get vui() {\n return this._vui();\n }\n\n constructor(\n vuiGetter: () => VuiService,\n opts: WysiwygEditorEventsOptions = {},\n ) {\n this._vui = vuiGetter;\n\n EDITOR_EVENTS.forEach((event) => {\n this.listeners[event] = [];\n const prefixed = prefixedEventName(event);\n const fn = opts[prefixed];\n fn && this.listeners[event].push(fn as any);\n });\n }\n\n on<EV extends WysiwygEditorEvent>(\n ev: EV,\n handler: NonNullable<WysiwygEditorEventsOptions[PrefixedEventName<EV>]>,\n ) {\n this.listeners[ev].push(handler);\n return () => this.off(ev, handler);\n }\n\n off<EV extends WysiwygEditorEvent>(\n ev: EV,\n handler: NonNullable<WysiwygEditorEventsOptions[PrefixedEventName<EV>]>,\n ) {\n this.listeners[ev] = this.listeners[ev].filter(\n (_handler) => _handler !== handler,\n ) as any;\n }\n\n editorOptions() {\n const opts: WysiwygEditorEventsOptions = {};\n\n EDITOR_EVENTS.forEach((event) => {\n const prefixed = prefixedEventName(event);\n opts[prefixed] = (props) => {\n const handlers = this.listeners[event];\n handlers.forEach((handler) => {\n handler(props as any);\n });\n };\n });\n\n return opts;\n }\n}\n\nexport interface WysiwygEditorContext {\n editor: Editor;\n vui: VuiService;\n}\n\nexport type WysiwygExtensionFactory<Options = any, Storage = any> = (\n ctx: WysiwygEditorInitializeContext,\n) =>\n | Extension<Options, Storage>\n | Node<Options, Storage>\n | Mark<Options, Storage>;\n\nexport interface CreatedWysiwygExtension<Options = any, Storage = any> {\n __isCreatedWysiwygExtension: true;\n _configs: Partial<Options>[];\n configure(\n options?: Partial<Options>,\n ): CreatedWysiwygExtension<Options, Storage>;\n raw: WysiwygExtensionSource<Options, Storage>;\n}\n\nexport type WysiwygExtensionSource<Options = any, Storage = any> =\n | Extension<Options, Storage>\n | Node<Options, Storage>\n | Mark<Options, Storage>\n | WysiwygExtensionFactory<Options, Storage>;\n\nexport type RawWysiwygExtension<Options = any, Storage = any> =\n | WysiwygExtensionSource<Options, Storage>\n | CreatedWysiwygExtension<Options, Storage>;\n\n// export function createWysiwygExtension<Options = any, Storage = any>(\n// extension: Extension<Options, Storage>,\n// ): Extension<Options, Storage>;\n// export function createWysiwygExtension<Options = any, Storage = any>(\n// node: Node<Options, Storage>,\n// ): Node<Options, Storage>;\n// export function createWysiwygExtension<Options = any, Storage = any>(\n// mark: Mark<Options, Storage>,\n// ): Mark<Options, Storage>;\n// export function createWysiwygExtension<Options = any, Storage = any>(\n// factory: WysiwygExtensionFactory<Options, Storage>,\n// ): WysiwygExtensionFactory<Options, Storage>;\n\nfunction isCreatedWysiwygExtension<Options = any, Storage = any>(\n source: unknown,\n): source is CreatedWysiwygExtension<Options, Storage> {\n return (\n !!source &&\n typeof source === 'object' &&\n (source as CreatedWysiwygExtension).__isCreatedWysiwygExtension === true\n );\n}\n\nexport function createWysiwygExtension<Options = any, Storage = any>(\n extension: WysiwygExtensionSource<Options, Storage>,\n) {\n const ext: CreatedWysiwygExtension<Options, Storage> = {\n __isCreatedWysiwygExtension: true,\n _configs: [],\n configure: (opts) => {\n opts && ext._configs.push(opts);\n return ext;\n },\n raw: extension,\n };\n return ext;\n}\n\nfunction resolveRawWysiwygExtension(\n raw: RawWysiwygExtension,\n ctx: WysiwygEditorInitializeContext,\n): AnyExtension {\n if (isCreatedWysiwygExtension(raw)) {\n const { raw: _raw, _configs } = raw;\n let ext = typeof _raw === 'function' ? _raw(ctx) : _raw;\n _configs.forEach((config) => {\n ext = ext.configure(config);\n });\n return ext;\n }\n return typeof raw === 'function' ? raw(ctx) : raw;\n}\n\nexport function resolveRawWysiwygExtensions(\n raws: RawWysiwygExtension[],\n ctx: WysiwygEditorInitializeContext,\n) {\n return raws.map((raw) => resolveRawWysiwygExtension(raw, ctx));\n}\n\nexport type WysiwygEditorToolIcon =\n | IconName\n | ((ctx: WysiwygEditorContext) => IconName | (() => VNodeChild) | undefined);\n\n/**\n * Tool Configuration\n */\nexport interface WysiwygEditorTool {\n /**\n * Tool Key\n *\n * Must be unique to identify the tool\n */\n key: string;\n /** Icons to be displayed on the toolbar */\n icon: WysiwygEditorToolIcon;\n /** Conditions for displaying the icon as active */\n active?: boolean | ((ctx: WysiwygEditorContext) => boolean);\n /** Conditions for deactivating the icon */\n disabled?: boolean | ((ctx: WysiwygEditorContext) => boolean);\n /** Handler when mark text is clicked */\n onClick: (ctx: WysiwygEditorContext, ev: PointerEvent) => any;\n /** Whether to display tools in floating menu or not */\n floating?: boolean;\n /** Extensions that the tool depends on */\n extensions?: Extensions;\n}\n\nexport type WysiwygEditorToolFactory<Options = void> = (\n vui: VuiService,\n options?: Options,\n) => WysiwygEditorTool | WysiwygEditorTool[];\n\nexport type RawWysiwygEditorTool =\n | WysiwygEditorTool\n | WysiwygEditorToolFactory<any>;\n\nfunction resolveRawWysiwygEditorTool(\n raw: RawWysiwygEditorTool,\n vui: VuiService,\n) {\n return typeof raw === 'function' ? raw(vui) : raw;\n}\n\nexport interface ResolvedWysiwygEditorSettings {\n tools: WysiwygEditorTool[];\n extensions: Extensions;\n}\n\nexport function resolveRawWysiwygEditorTools(\n rawTools: RawWysiwygEditorTool[],\n vui: VuiService,\n): ResolvedWysiwygEditorSettings {\n const tools: WysiwygEditorTool[] = [];\n const extensions: Extensions = [];\n\n rawTools.forEach((raw) => {\n let resolved = resolveRawWysiwygEditorTool(raw, vui);\n if (!Array.isArray(resolved)) {\n resolved = [resolved];\n }\n resolved.forEach((tool) => {\n tools.push(tool);\n if (tool.extensions) {\n extensions.push(...tool.extensions);\n }\n });\n });\n\n return {\n tools,\n extensions,\n };\n}\n","export const VUI_WYSIWYG_EDITOR_SYMBOL = 'vui-wysiwyg-editor';\n","import { createVNode as _createVNode } from \"vue\";\nimport './Linter.scss';\nimport { Extension } from '@tiptap/vue-3';\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\nimport { Plugin, PluginKey, TextSelection } from '@tiptap/pm/state';\nimport { createWysiwygExtension } from '../../schemes';\nconst PROBLEM_CLASS_NAME = 'v-linter__problem';\nconst ISSUE_ICON_CLASS_NAME = 'v-linter__issue-icon';\nconst ISSUE_DATASET_NAME = 'data-issue-id';\nfunction resolveWysiwygLinterFixMessage(message) {\n return typeof message === 'function' ? message() : message;\n}\nfunction renderIcon(view, issue) {\n const {\n level = 'warning'\n } = issue;\n const icon = document.createElement('div');\n const message = resolveWysiwygLinterFixMessage(issue.message);\n icon.className = `${ISSUE_ICON_CLASS_NAME} ${level}-scope`;\n icon.setAttribute(ISSUE_DATASET_NAME, issue.id);\n if (typeof message === 'string') {\n icon.title = message;\n }\n return icon;\n}\nfunction runAllLinterPlugins(doc, plugins) {\n const decorations = [];\n const issues = plugins.map(RegisteredLinterPlugin => new RegisteredLinterPlugin(doc).scan().getResults()).flat();\n issues.forEach(issue => {\n const {\n level = 'warning',\n icon\n } = issue;\n const message = resolveWysiwygLinterFixMessage(issue.message);\n decorations.push(Decoration.inline(issue.from, issue.to, {\n class: `${PROBLEM_CLASS_NAME} ${level}-scope`,\n 'data-issue-id': issue.id,\n title: typeof message === 'string' ? message : undefined\n }));\n if (icon) {\n decorations.push(Decoration.widget(issue.from, view => renderIcon(view, issue)));\n }\n });\n const decorationSet = DecorationSet.create(doc, decorations);\n return {\n issues,\n decorationSet\n };\n}\nexport const WysiwygLinter = createWysiwygExtension(ctx => {\n function showMenu(view, issue, event) {\n const message = resolveWysiwygLinterFixMessage(issue.message);\n const variant = ctx.vui.setting('containedVariant');\n const scope = ctx.vui.setting(`${issue.level}Scope`);\n return ctx.vui.menu({\n activator: event,\n content: stack => _createVNode(\"div\", {\n \"class\": \"v-linter__issue-menu__body\"\n }, [_createVNode(\"div\", {\n \"class\": ['v-linter__issue-menu__message', `${scope}-scope ${variant}`]\n }, [message]), issue.fix.length && _createVNode(\"div\", {\n \"class\": \"v-linter__issue-menu__fixers\"\n }, [issue.fix.map((fixer, index) => _createVNode(\"div\", {\n \"key\": index,\n \"class\": \"v-linter__issue-menu__fixer\"\n }, [_createVNode(\"button\", {\n \"type\": \"button\",\n \"class\": \"v-linter__issue-menu__fixer__button\",\n \"onClick\": () => {\n stack.close();\n fixer.handler(view, issue);\n }\n }, [_createVNode(\"span\", {\n \"class\": \"v-linter__issue-menu__fixer__button__message\"\n }, [resolveWysiwygLinterFixMessage(fixer.message)])])]))])])\n });\n }\n return Extension.create({\n name: 'linter',\n addOptions() {\n return {\n plugins: []\n };\n },\n addStorage() {\n return {\n issues: []\n };\n },\n addProseMirrorPlugins() {\n const {\n plugins\n } = this.options;\n const {\n storage\n } = this;\n const runAll = doc => {\n const {\n issues,\n decorationSet\n } = runAllLinterPlugins(doc, plugins);\n storage.issues = issues;\n return decorationSet;\n };\n const getIssue = id => storage.issues.find(issue => issue.id === id);\n const getIssueElementByEvent = source => {\n if (!source || !(source instanceof HTMLElement)) {\n return;\n }\n const issueId = source.getAttribute(ISSUE_DATASET_NAME);\n const issue = issueId && getIssue(issueId);\n if (!issue) return;\n return {\n issue\n };\n };\n const linterPlugin = new Plugin({\n key: new PluginKey('linter'),\n state: {\n init(_, {\n doc\n }) {\n return runAll(doc);\n },\n apply(transaction, oldState) {\n return transaction.docChanged ? runAll(transaction.doc) : oldState;\n }\n },\n props: {\n decorations(state) {\n return linterPlugin.getState(state);\n },\n handleClick(view, _, event) {\n const info = getIssueElementByEvent(event.target);\n if (!info) {\n return false;\n }\n const {\n issue\n } = info;\n const {\n from,\n to\n } = issue;\n const focus = () => view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc, from, to)).scrollIntoView());\n focus();\n showMenu(view, issue, event);\n return true;\n }\n }\n });\n return [linterPlugin];\n }\n });\n});","let IDX = 256;\nlet BUFFER: any;\nconst HEX: any = [];\nwhile (IDX--) HEX[IDX] = (IDX + 256).toString(16).substring(1);\n\nexport function cheepUUID() {\n let i = 0;\n let num;\n let out = '';\n\n if (!BUFFER || IDX + 16 > 256) {\n BUFFER = Array((i = 256));\n while (i--) BUFFER[i] = (256 * Math.random()) | 0;\n\n i = IDX = 0;\n }\n\n for (; i < 16; i++) {\n num = BUFFER[IDX + i];\n if (i == 6) out += HEX[(num & 15) | 64];\n else if (i == 8) out += HEX[(num & 63) | 128];\n else out += HEX[num];\n\n if (i & 1 && i > 1 && i < 11) out += '-';\n }\n\n IDX++;\n return out;\n}\n","import { VNodeChild } from 'vue';\nimport { Node as ProsemirrorNode } from '@tiptap/pm/model';\nimport { EditorView } from '@tiptap/pm/view';\nimport { cheepUUID } from './utils';\n\nexport type WysiwygLinterFixFn = (\n view: EditorView,\n issue: WysiwygLinterResult,\n) => any;\n\nexport type WysiwygLinterFixMessage = string | (() => VNodeChild);\n\nexport interface WysiwygLinterFixer {\n message: WysiwygLinterFixMessage;\n handler: WysiwygLinterFixFn;\n}\n\nexport type WysiwygLinterResultLevel = 'warning' | 'error';\n\n// fixers\nexport interface WysiwygLinterResult {\n id: string;\n icon: boolean;\n level: WysiwygLinterResultLevel;\n message: WysiwygLinterFixMessage;\n from: number;\n to: number;\n fix: WysiwygLinterFixer[];\n}\n\nexport interface RawLinterResult\n extends Omit<WysiwygLinterResult, 'level' | 'fix' | 'id' | 'icon'> {\n level?: WysiwygLinterResultLevel;\n icon?: boolean;\n fix?: WysiwygLinterFixer | WysiwygLinterFixer[];\n}\n\nexport class WysiwygLinterPlugin {\n protected doc: ProsemirrorNode;\n\n private results: Array<WysiwygLinterResult> = [];\n\n constructor(doc: ProsemirrorNode) {\n this.doc = doc;\n }\n\n record(result: RawLinterResult) {\n const { fix = [], icon = false } = result;\n this.results.push({\n level: 'error',\n id: cheepUUID(),\n ...result,\n fix: Array.isArray(fix) ? fix : [fix],\n icon,\n });\n }\n\n scan() {\n return this;\n }\n\n getResults() {\n return this.results;\n }\n}\n","import { createVNode as _createVNode, createTextVNode as _createTextVNode } from \"vue\";\nimport { WysiwygLinterPlugin } from '../LinterPlugin';\nexport function WysiwygLinterBadWords(words) {\n const regex = new RegExp(`\\\\b(${words.join('|')})\\\\b`);\n return class WysiwygLinterBadWords extends WysiwygLinterPlugin {\n scan() {\n this.doc.descendants((node, position) => {\n if (!node.isText) {\n return;\n }\n const matches = regex.exec(node.text);\n if (matches) {\n const fixValue = `${matches[0]}!!!!!`;\n this.record({\n level: 'warning',\n message: `Try not to say '${matches[0]}'`,\n from: position + matches.index,\n to: position + matches.index + matches[0].length,\n fix: [{\n message: () => _createVNode(\"span\", null, [_createVNode(\"code\", null, [fixValue]), _createTextVNode(\"\\u306B\\u4FEE\\u6B63\\u3059\\u308B\\u3002\")]),\n handler: () => {\n // eslint-disable-next-line no-console\n console.log('hoge');\n }\n }, {\n message: 'どうにかする',\n handler: () => {\n // eslint-disable-next-line no-console\n console.log('hoge');\n }\n }]\n });\n }\n });\n return this;\n }\n };\n}","import { EditorView } from '@tiptap/pm/view';\nimport {\n WysiwygLinterPlugin,\n WysiwygLinterResult as Issue,\n} from '../LinterPlugin';\n\nexport class WysiwygLinterHeadingLevel extends WysiwygLinterPlugin {\n fixHeader(level: number) {\n return function ({ state, dispatch }: EditorView, issue: Issue) {\n dispatch(state.tr.setNodeMarkup(issue.from - 1, undefined, { level }));\n };\n }\n\n scan() {\n let lastHeadLevel: number | null = null;\n\n this.doc.descendants((node, position) => {\n if (node.type.name === 'heading') {\n // Check whether heading levels fit under the current level\n const { level } = node.attrs;\n\n if (lastHeadLevel != null && level > lastHeadLevel + 1) {\n this.record({\n message: `Heading too small (${level} under ${lastHeadLevel})`,\n from: position + 1,\n to: position + 1 + node.content.size,\n fix: {\n message: '修正する',\n handler: this.fixHeader(lastHeadLevel + 1),\n },\n });\n }\n lastHeadLevel = level;\n }\n });\n\n return this;\n }\n}\n","import { EditorView } from '@tiptap/pm/view';\nimport {\n WysiwygLinterPlugin,\n WysiwygLinterResult as Issue,\n} from '../LinterPlugin';\n\nexport class WysiwygLinterPunctuation extends WysiwygLinterPlugin {\n public regex = / ([,.!?:]) ?/g;\n\n fix(replacement: any) {\n return function ({ state, dispatch }: EditorView, issue: Issue) {\n dispatch(\n state.tr.replaceWith(\n issue.from,\n issue.to,\n state.schema.text(replacement),\n ),\n );\n };\n }\n\n scan() {\n this.doc.descendants((node, position) => {\n if (!node.isText) {\n return;\n }\n\n if (!node.text) {\n return;\n }\n\n const matches = this.regex.exec(node.text);\n\n if (matches) {\n this.record({\n message: 'Suspicious spacing around punctuation',\n from: position + matches.index,\n to: position + matches.index + matches[0].length,\n fix: {\n message: 'Fix it!!!',\n handler: this.fix(`${matches[1]} `),\n },\n });\n }\n });\n\n return this;\n }\n}\n","import { Extension } from '@tiptap/vue-3';\nimport '@tiptap/extension-text-style';\n\nexport type WysiwygColorOptions = {\n types: string[];\n};\n\ndeclare module '@tiptap/vue-3' {\n interface Commands<ReturnType> {\n color: {\n /**\n * Set the text color\n */\n setColor: (color: string) => ReturnType;\n /**\n * Unset the text color\n */\n unsetColor: () => ReturnType;\n };\n }\n}\n\nexport const WysiwygColorExtension = Extension.create<WysiwygColorOptions>({\n name: 'color',\n\n addOptions() {\n return {\n types: ['textStyle'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n color: {\n default: null,\n parseHTML: (element) => element.style.color.replace(/['\"]+/g, ''),\n renderHTML: (attributes) => {\n if (!attributes.color) {\n return {};\n }\n\n return {\n style: `color: ${attributes.color}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setColor:\n (color) =>\n ({ chain }) =>\n chain().setMark('textStyle', { color }).run(),\n unsetColor:\n () =>\n ({ chain }) =>\n chain()\n .setMark('textStyle', { color: null })\n .removeEmptyTextStyle()\n .run(),\n };\n },\n});\n","import { Extension, mergeAttributes, Mark } from '@tiptap/vue-3';\nimport '@tiptap/extension-text-style';\n// import '@tiptap/vue-3';\n\nexport type WysiwygCustomTagSettings = {\n /**\n * tag name\n *\n * Either the html default tag name or a custom tag name is acceptable\n *\n * @default \"span\"\n */\n tag: string;\n\n /**\n * HTML Attributes\n *\n * Attributes to be assigned to tags such as `class`, `data-xxx`, etc.\n */\n attrs?: Record<any, string>;\n};\n\ndeclare module '@tiptap/vue-3' {\n interface Commands<ReturnType> {\n customTag: {\n /**\n * Set the custom tag\n */\n setCustomTag: (markName: string) => ReturnType;\n /**\n * Toggle the custom tag\n */\n toggleCustomTag: (markName: string) => ReturnType;\n /**\n * Unset the custom tag\n */\n unsetCustomTag: (markName: string) => ReturnType;\n };\n }\n}\n\n// export type WysiwygCustomTagSettings = WysiwygCustomTagOptions & {\n// /**\n// * extension name\n// */\n// name: string;\n// };\n\nexport function createWysiwygCustomTagMark(\n name: string,\n settings: Partial<WysiwygCustomTagSettings>,\n) {\n const { tag = 'span', attrs } = settings;\n const attrEntries = attrs && Object.entries(attrs);\n const attrNames = attrEntries && attrEntries.map(([name]) => name);\n\n const getElementAttrs = (\n el: HTMLElement,\n ): Record<any, string> | undefined => {\n if (!attrNames) return;\n\n return el\n .getAttributeNames()\n\n .reduce((acc, name) => ({ ...acc, [name]: el.getAttribute(name) }), {});\n };\n\n const isMatchedElementAttrs = (elAttrs: Record<any, string>): boolean => {\n if (!attrEntries) return true;\n\n return attrEntries.every(([name, value]) => elAttrs[name] === value);\n };\n\n return Mark.create<WysiwygCustomTagSettings>({\n name,\n\n addOptions() {\n return {\n tag,\n attrs: attrs && { ...attrs },\n };\n },\n parseHTML() {\n return [\n {\n tag,\n getAttrs: (el: any) => {\n if (!attrs) return null;\n const elAttrs = getElementAttrs(el);\n if (!elAttrs) return false;\n return isMatchedElementAttrs(el) && null;\n },\n },\n ];\n },\n renderHTML({ HTMLAttributes }) {\n return [\n tag,\n attrs ? mergeAttributes(attrs, HTMLAttributes) : HTMLAttributes,\n 0,\n ];\n },\n });\n}\n\nexport const WysiwygCustomTagExtension =\n Extension.create<WysiwygCustomTagSettings>({\n name: 'custom-tag',\n addCommands() {\n return {\n setCustomTag:\n (markName) =>\n ({ chain }) =>\n chain().setMark(markName).run(),\n unsetCustomTag:\n (markName) =>\n ({ chain }) =>\n chain().unsetMark(markName).run(),\n toggleCustomTag:\n (markName) =>\n ({ chain }) =>\n chain().toggleMark(markName).run(),\n };\n },\n });\n","import { BulletList, BulletListOptions } from '@tiptap/extension-bullet-list';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygBulletListTool: WysiwygEditorToolFactory<\n BulletListOptions\n> = (vui, options) => {\n const tool: WysiwygEditorTool = {\n key: 'bulletList',\n icon: vui.icon('editorformatListBulleted'),\n active: ({ editor }) => editor.isActive('bulletList'),\n onClick: ({ editor }) => {\n editor.chain().focus().toggleBulletList().run();\n },\n floating: true,\n extensions: [BulletList.configure(options)],\n };\n return tool;\n};\n","import { Bold, BoldOptions } from '@tiptap/extension-bold';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygFormatBoldTool: WysiwygEditorToolFactory<BoldOptions> = (\n vui,\n options,\n) => {\n const tool: WysiwygEditorTool = {\n key: 'formatBold',\n icon: vui.icon('editorformatBold'),\n active: ({ editor }) => editor.isActive('bold'),\n onClick: ({ editor }) => {\n editor.chain().focus().toggleBold().run();\n },\n floating: true,\n extensions: [Bold.configure(options)],\n };\n return tool;\n};\n","import { Italic, ItalicOptions } from '@tiptap/extension-italic';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygFormatItalicTool: WysiwygEditorToolFactory<\n ItalicOptions\n> = (vui, options) => {\n const tool: WysiwygEditorTool = {\n key: 'formatItalic',\n icon: vui.icon('editorformatItalic'),\n active: ({ editor }) => editor.isActive('italic'),\n onClick: ({ editor }) => {\n editor.chain().focus().toggleItalic().run();\n },\n floating: true,\n extensions: [Italic.configure(options)],\n };\n return tool;\n};\n","import { Underline, UnderlineOptions } from '@tiptap/extension-underline';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygFormatUnderlineTool: WysiwygEditorToolFactory<\n UnderlineOptions\n> = (vui, options) => {\n const tool: WysiwygEditorTool = {\n key: 'formatUnderline',\n icon: vui.icon('editorformatUnderline'),\n active: ({ editor }) => editor.isActive('underline'),\n onClick: ({ editor }) => {\n editor.chain().focus().toggleUnderline().run();\n },\n floating: true,\n extensions: [Underline.configure(options)],\n };\n return tool;\n};\n","import { History, HistoryOptions } from '@tiptap/extension-history';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygHistoryTool: WysiwygEditorToolFactory<HistoryOptions> = (\n vui,\n options,\n) => {\n const undo: WysiwygEditorTool = {\n key: 'history-undo',\n icon: vui.icon('editorUndo'),\n disabled: ({ editor }) => !editor.can().undo(),\n onClick: ({ editor }) => {\n editor.chain().focus().undo().run();\n },\n extensions: [History.configure(options)],\n };\n const redo: WysiwygEditorTool = {\n key: 'history-redo',\n icon: vui.icon('editorRedo'),\n disabled: ({ editor }) => !editor.can().redo(),\n onClick: ({ editor }) => {\n editor.chain().focus().redo().run();\n },\n };\n return [undo, redo];\n};\n","import { Link, LinkOptions } from '@tiptap/extension-link';\nimport { validateIf, url } from '@fastkit/vui';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygLinkTool: WysiwygEditorToolFactory<LinkOptions> = (\n vui,\n options,\n) => {\n const tool: WysiwygEditorTool = {\n key: 'link',\n icon: vui.icon('editorLink'),\n active: ({ editor }) => editor.isActive('link'),\n onClick: async ({ vui, editor }) => {\n const { href = '' } = editor.getAttributes('link');\n const result = await vui.prompt({\n input: {\n label: 'Link URL',\n rules: [validateIf, url],\n initialValue: href,\n size: 'sm',\n autofocus: true,\n },\n });\n\n if (result === undefined || result === false) {\n return;\n }\n\n const range = editor.chain().focus().extendMarkRange('link');\n\n if (!result) {\n range.unsetLink().run();\n } else {\n range\n .setLink({\n href: result,\n })\n .run();\n }\n },\n floating: true,\n extensions: [\n Link.configure({\n openOnClick: false,\n ...options,\n }),\n ],\n };\n return tool;\n};\n","import {\n OrderedList,\n OrderedListOptions,\n} from '@tiptap/extension-ordered-list';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport const WysiwygOrderedListTool: WysiwygEditorToolFactory<\n OrderedListOptions\n> = (vui, options) => {\n const tool: WysiwygEditorTool = {\n key: 'orderedList',\n icon: vui.icon('editorformatListNumbered'),\n active: ({ editor }) => editor.isActive('orderedList'),\n onClick: ({ editor }) => {\n editor.chain().focus().toggleOrderedList().run();\n },\n floating: true,\n extensions: [OrderedList.configure(options)],\n };\n return tool;\n};\n","import { createVNode as _createVNode } from \"vue\";\nimport './color.scss';\nimport { VIcon } from '@fastkit/vui';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport { WysiwygColorExtension } from '../extensions';\nexport function createWysiwygColorTool(opts) {\n const WysiwygColorTool = vui => {\n const tool = {\n key: 'textColor',\n // active: ({ editor }) => editor.isActive('textStyle'),\n icon: ({\n editor\n }) => () => {\n const {\n color\n } = editor.getAttributes('textStyle');\n const style = {\n color\n };\n return _createVNode(\"span\", {\n \"class\": \"v-wysiwyg-color-tool__button\"\n }, [_createVNode(VIcon, {\n \"class\": \"v-wysiwyg-color-tool__button__icon\",\n \"name\": vui.icon('editorTextColor')\n }, null), _createVNode(\"span\", {\n \"class\": \"v-wysiwyg-color-tool__button__bar\",\n \"style\": style\n }, null)]);\n },\n onClick: (ctx, ev) => {\n ctx.vui.menu({\n class: 'v-wysiwyg-color-tool__menu',\n activator: ev,\n content: stack => _createVNode(\"div\", {\n \"class\": ['v-wysiwyg-color-tool__items', {\n 'v-wysiwyg-color-tool__items--with-label': opts.withLabel\n }]\n }, [opts.items.map((item, index) => _createVNode(\"button\", {\n \"key\": item.key == null ? index : item.key,\n \"class\": \"v-wysiwyg-color-tool__item\",\n \"type\": \"button\",\n \"onClick\": () => {\n const {\n color\n } = item;\n let command = ctx.editor.chain().focus();\n if (color) {\n command = command.setColor(color);\n } else {\n command = command.unsetColor();\n }\n command.run();\n stack.close();\n }\n }, [_createVNode(\"span\", {\n \"class\": \"v-wysiwyg-color-tool__item__color\",\n \"style\": item.color ? {\n color: item.color\n } : {}\n }, null), opts.withLabel && _createVNode(\"span\", {\n \"class\": \"v-wysiwyg-color-tool__item__name\"\n }, [item.name])]))])\n });\n },\n floating: true,\n extensions: [TextStyle, WysiwygColorExtension]\n };\n return tool;\n };\n return WysiwygColorTool;\n}","import { createVNode as _createVNode, isVNode as _isVNode } from \"vue\";\nimport { TextAlign } from '@tiptap/extension-text-align';\nimport { VButtonGroup, VButton } from '@fastkit/vui';\nfunction _isSlot(s) {\n return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !_isVNode(s);\n}\n/**\n * A list of available options for the text align attribute.\n * @remarks\n * `\"justify\"` has not yet been adopted because of ambiguity in browser support.\n */\nexport const WYSIWYG_TEXT_ALIGN_VALUES = ['left', 'center', 'right'\n// 'justify',\n];\n\n/** Text align value */\n\n/**\n * A list of nodes where the text align attribute should be applied to.\n */\nconst DEFAULT_TYPES = ['heading', 'paragraph'];\nconst conditions = WYSIWYG_TEXT_ALIGN_VALUES.map(value => [value, {\n textAlign: value\n}]);\nconst ICON_AT = {\n left: 'editorAlignLeft',\n center: 'editorAlignCenter',\n right: 'editorAlignRight'\n};\nfunction resolveOptions(rawOptions) {\n const types = rawOptions?.types || DEFAULT_TYPES.slice();\n const alignments = rawOptions?.alignments || WYSIWYG_TEXT_ALIGN_VALUES.slice();\n const defaultAlignment = rawOptions?.defaultAlignment || 'left';\n return {\n types,\n alignments,\n defaultAlignment\n };\n}\nfunction getCurrentAlign(editor, options) {\n for (const [align, condition] of conditions) {\n if (editor.isActive(condition)) return align;\n }\n return options.defaultAlignment;\n}\nexport const WysiwygTextAlignTool = (vui, options) => {\n const resolvedOptions = resolveOptions(options);\n const {\n alignments\n } = resolvedOptions;\n const getIcon = value => {\n const iconKey = ICON_AT[value];\n const icon = vui.icon(iconKey);\n if (icon === '$empty' || typeof icon === 'function') return;\n return icon;\n };\n const variant = vui.setting('plainVariant');\n const toolButtonActiveColor = vui.setting('primaryScope');\n const tool = {\n key: 'textAlign',\n icon: ({\n editor\n }) => getIcon(getCurrentAlign(editor, resolvedOptions)),\n onClick: async ({\n vui,\n editor\n }, ev) => {\n vui.menu({\n distance: 0,\n activator: ev,\n content: menu => {\n let _slot;\n return _createVNode(VButtonGroup, {\n \"variant\": variant\n }, _isSlot(_slot = alignments.map(value => {\n const isActive = editor.isActive({\n textAlign: value\n });\n return _createVNode(VButton, {\n \"tabindex\": -1,\n \"color\": isActive ? toolButtonActiveColor : undefined,\n \"key\": value,\n \"icon\": getIcon(value),\n \"onClick\": () => {\n editor.chain().focus().setTextAlign(value).run();\n }\n }, null);\n })) ? _slot : {\n default: () => [_slot]\n });\n }\n });\n },\n floating: true,\n extensions: [TextAlign.configure(resolvedOptions)]\n };\n return tool;\n};","import { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\nimport {\n createWysiwygCustomTagMark,\n WysiwygCustomTagSettings,\n WysiwygCustomTagExtension,\n} from '../extensions/custom-tag';\n\nexport interface WysiwygCustomTagToolSettings\n extends Pick<WysiwygEditorTool, 'icon' | 'floating'>,\n Partial<WysiwygCustomTagSettings> {}\n\n/**\n * Generate Custom Tag Tool\n *\n * @param markName - Mark name\n * @param settings - Tool Configuration\n * @returns Generated Tool\n */\nexport function createWysiwygCustomTagTool(\n markName: string,\n settings: WysiwygCustomTagToolSettings,\n): WysiwygEditorToolFactory {\n const Mark = createWysiwygCustomTagMark(markName, settings);\n const { icon, floating = true } = settings;\n\n return (vui) => {\n const tool: WysiwygEditorTool = {\n key: `customTag:${markName}`,\n icon,\n floating,\n active: ({ editor }) => editor.isActive(markName),\n onClick: ({ editor }) => {\n editor.chain().focus().toggleCustomTag(markName).run();\n },\n extensions: [WysiwygCustomTagExtension, Mark.configure(settings)],\n };\n return tool;\n };\n}\n","import { isVNode as _isVNode, createVNode as _createVNode } from \"vue\";\nimport './VWysiwygEditor.scss';\nimport { defineComponent, computed, ref, watch, onBeforeUnmount } from 'vue';\nimport { createFormNodeWrapperProps, VFormControl, VControlField, createControlFieldProps, createTextableProps, createTextableEmits, TextableControl, createControlProps, useControl, createControlFieldProviderProps, useControlField, VTextCounter, defineSlots, useVui, VButton, VButtonGroup, withCtx } from '@fastkit/vui';\nimport { EditorContent, useEditor } from '@tiptap/vue-3';\nimport { BubbleMenu } from '@tiptap/vue-3/menus';\nimport { StarterKit } from '@tiptap/starter-kit';\nimport { VUI_WYSIWYG_EDITOR_SYMBOL } from '../../injections';\nimport { resolveRawWysiwygExtensions, resolveRawWysiwygEditorTools,\n// EditorEventsOptions,\nWysiwygEditorInitializeContext } from '../../schemes';\nfunction _isSlot(s) {\n return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !_isVNode(s);\n}\nconst slots = defineSlots();\nexport const VWysiwygEditor = defineComponent({\n name: 'VWysiwygEditor',\n props: {\n ...createTextableProps(),\n ...createFormNodeWrapperProps(),\n ...createControlFieldProps(),\n ...createControlFieldProviderProps(),\n ...createControlProps(),\n ...slots(),\n extensions: {\n type: Array,\n default: () => []\n },\n tools: {\n type: Array,\n default: () => []\n },\n floatingToolbar: Boolean,\n disabledMinHeight: Boolean,\n disabledMaxHeight: Boolean,\n removeDefaultWrapper: {\n type: Boolean,\n default: true\n }\n },\n emits: {\n ...createTextableEmits()\n },\n slots,\n setup(props, ctx) {\n const vui = useVui();\n const textRef = ref('');\n const toolButtonActiveColor = vui.setting('primaryScope');\n const wysiwygSettings = computed(() => resolveRawWysiwygEditorTools(props.tools, vui));\n const control = useControl(props);\n useControlField(props);\n const classes = computed(() => ['v-wysiwyg-editor', control.classes.value, `v-wysiwyg-editor--${control.size.value}`, {\n 'v-wysiwyg-editor--disabled-min-height': props.disabledMinHeight,\n 'v-wysiwyg-editor--disabled-max-height': props.disabledMaxHeight\n }]);\n const inputControl = new TextableControl(props, ctx, {\n nodeType: VUI_WYSIWYG_EDITOR_SYMBOL,\n validationValue: () => textRef.value\n });\n const getOutput = (editor, type) => {\n if (props.removeDefaultWrapper && editor.isEmpty) return '';\n if (type === 'html') return editor.getHTML();\n if (type === 'text') return editor.getText();\n return '';\n };\n const initializeCtx = new WysiwygEditorInitializeContext(() => vui, {\n onCreate: ({\n editor\n }) => {\n textRef.value = getOutput(editor, 'text');\n updateEditable();\n },\n onFocus: ({\n event\n }) => {\n inputControl.focusHandler(event);\n },\n onBlur: ({\n event\n }) => {\n inputControl.blurHandler(event);\n },\n onUpdate: ({\n editor\n }) => {\n inputControl.value = getOutput(editor, 'html');\n textRef.value = getOutput(editor, 'text');\n }\n });\n const extensions = [StarterKit.configure({\n bold: false,\n bulletList: false,\n orderedList: false,\n undoRedo: false,\n italic: false\n }), ...resolveRawWysiwygExtensions(props.extensions, initializeCtx), ...wysiwygSettings.value.extensions];\n const updateEditable = () => {\n if (!editor.value) return;\n editor.value.setEditable(inputControl.canOperation);\n };\n watch(() => inputControl.canOperation, updateEditable);\n watch(() => props.modelValue, modelValue => {\n const $editor = editor.value;\n if (!$editor || getOutput($editor, 'html') === modelValue) return;\n $editor.commands.setContent(modelValue == null ? '' : modelValue, {\n emitUpdate: false\n });\n textRef.value = getOutput($editor, 'text');\n });\n initializeCtx.on('create', ({\n editor\n }) => {\n textRef.value = getOutput(editor, 'text');\n updateEditable();\n });\n const editor = useEditor({\n ...initializeCtx.editorOptions(),\n autofocus: props.autofocus,\n content: props.modelValue,\n extensions,\n editorProps: {\n attributes: {\n class: 'v-wysiwyg-editor__input__prose'\n }\n }\n });\n const focus = (position, options) => editor.value?.chain().focus(position, options);\n const wysiwygContext = computed(() => ({\n vui,\n editor: editor.value\n }));\n const createTools = (bubbleMenu = false) => {\n let _slot;\n const {\n value: settings\n } = wysiwygSettings;\n const {\n value: context\n } = wysiwygContext;\n const tools = bubbleMenu ? settings.tools.filter(t => !!t.floating) : settings.tools;\n const _editor = editor.value;\n const variant = vui.setting(bubbleMenu ? 'containedVariant' : 'plainVariant');\n return _createVNode(VButtonGroup, {\n \"class\": ['v-wysiwyg-editor__toolbar', {\n 'v-wysiwyg-editor__floating-toolbar': props.floatingToolbar\n }],\n \"variant\": variant\n }, _isSlot(_slot = tools.map(({\n key,\n icon,\n onClick,\n disabled,\n active\n }) => {\n const isActive = !!_editor && resolveContextualValue(context, active);\n const isDisabled = !inputControl.canOperation || !!_editor && resolveContextualValue(context, disabled);\n let iconName;\n let child;\n if (typeof icon === 'function') {\n if (_editor) {\n const _child = icon(context);\n if (typeof _child === 'function') {\n child = _child();\n } else {\n iconName = _child;\n }\n }\n } else {\n iconName = icon;\n }\n if (!iconName && child == null) return;\n return _createVNode(VButton, {\n \"tabindex\": -1,\n \"key\": key,\n \"icon\": iconName,\n \"onClick\": ev => onClick(context, ev),\n \"color\": isActive ? toolButtonActiveColor : undefined,\n \"disabled\": isDisabled\n }, _isSlot(child) ? child : {\n default: () => [child]\n });\n })) ? _slot : {\n default: () => [_slot]\n });\n };\n onBeforeUnmount(() => {\n editor.value?.destroy();\n });\n const api = {\n get editor() {\n return editor.value;\n },\n control: inputControl\n };\n ctx.expose(api);\n const handleClickLabel = ev => {\n focus('start', {\n scrollIntoView: true\n });\n };\n const defaultSlot = () => _createVNode(\"div\", {\n \"class\": \"v-wysiwyg-editor__body\"\n }, [_createVNode(EditorContent, {\n \"class\": \"v-wysiwyg-editor__input__element wysiwyg\",\n \"editor\": editor.value\n }, null), !props.floatingToolbar && !!editor.value && !inputControl.isReadonly && _createVNode(BubbleMenu, {\n \"editor\": editor.value\n }, {\n default: () => [_createVNode(\"div\", {\n \"class\": \"v-wysiwyg-editor__bubble-menu\"\n }, [createTools(true)])]\n })]);\n const formControlDefaultSlot = () => _createVNode(\"div\", {\n \"class\": \"v-wysiwyg-editor__wrapper\"\n }, [!inputControl.isReadonly && createTools(), _createVNode(VControlField, {\n \"class\": \"v-wysiwyg-editor__input\",\n \"autoHeight\": true,\n \"startAdornment\": props.startAdornment,\n \"endAdornment\": props.endAdornment,\n \"size\": control.size.value\n }, {\n ...ctx.slots,\n default: withCtx(defaultSlot)\n })]);\n const infoAppendsSlot = () => {\n const {\n counterResult\n } = inputControl;\n if (!counterResult) return;\n return _createVNode(VTextCounter, counterResult, null);\n };\n return () => _createVNode(VFormControl, {\n \"nodeControl\": inputControl,\n \"class\": classes.value,\n \"label\": props.label,\n \"hint\": props.hint,\n \"hinttip\": props.hinttip,\n \"hiddenInfo\": props.hiddenInfo,\n \"requiredChip\": props.requiredChip,\n \"onClickLabel\": handleClickLabel\n }, {\n ...ctx.slots,\n default: withCtx(formControlDefaultSlot),\n infoAppends: withCtx(infoAppendsSlot)\n });\n }\n});\nfunction resolveContextualValue(ctx, source) {\n return typeof source === 'function' ? source(ctx) : source;\n}"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fastkit/vui-wysiwyg",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.2.0",
|
|
4
4
|
"description": "vui-wysiwyg",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"repository": {
|
|
@@ -19,12 +19,6 @@
|
|
|
19
19
|
"default": "./dist/vui-wysiwyg.mjs"
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
|
-
"./tiptap/core": {
|
|
23
|
-
"types": "./dist/tiptap/core.d.ts",
|
|
24
|
-
"import": {
|
|
25
|
-
"default": "./dist/tiptap/core.mjs"
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
22
|
"./pm/view": {
|
|
29
23
|
"types": "./dist/pm/view.d.ts",
|
|
30
24
|
"import": {
|
|
@@ -133,6 +127,12 @@
|
|
|
133
127
|
"default": "./dist/pm/changeset.mjs"
|
|
134
128
|
}
|
|
135
129
|
},
|
|
130
|
+
"./tiptap/core": {
|
|
131
|
+
"types": "./dist/tiptap/core.d.ts",
|
|
132
|
+
"import": {
|
|
133
|
+
"default": "./dist/tiptap/core.mjs"
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
136
|
"./tiptap/extensions/underline": {
|
|
137
137
|
"types": "./dist/tiptap/extensions/underline.d.ts",
|
|
138
138
|
"import": {
|
|
@@ -196,9 +196,6 @@
|
|
|
196
196
|
".": [
|
|
197
197
|
"./dist/vui-wysiwyg.d.ts"
|
|
198
198
|
],
|
|
199
|
-
"tiptap/core": [
|
|
200
|
-
"./dist/tiptap/core.d.ts"
|
|
201
|
-
],
|
|
202
199
|
"pm/view": [
|
|
203
200
|
"./dist/pm/view.d.ts"
|
|
204
201
|
],
|
|
@@ -253,6 +250,9 @@
|
|
|
253
250
|
"pm/changeset": [
|
|
254
251
|
"./dist/pm/changeset.d.ts"
|
|
255
252
|
],
|
|
253
|
+
"tiptap/core": [
|
|
254
|
+
"./dist/tiptap/core.d.ts"
|
|
255
|
+
],
|
|
256
256
|
"tiptap/extensions/underline": [
|
|
257
257
|
"./dist/tiptap/extensions/underline.d.ts"
|
|
258
258
|
],
|
|
@@ -286,32 +286,33 @@
|
|
|
286
286
|
"dist"
|
|
287
287
|
],
|
|
288
288
|
"dependencies": {
|
|
289
|
-
"@tiptap/extension-bold": "^
|
|
290
|
-
"@tiptap/extension-bullet-list": "^
|
|
291
|
-
"@tiptap/extension-history": "^
|
|
292
|
-
"@tiptap/extension-italic": "^
|
|
293
|
-
"@tiptap/extension-link": "^
|
|
294
|
-
"@tiptap/extension-ordered-list": "^
|
|
295
|
-
"@tiptap/extension-text-align": "^
|
|
296
|
-
"@tiptap/extension-text-style": "^
|
|
297
|
-
"@tiptap/extension-underline": "^
|
|
298
|
-
"@tiptap/pm": "^
|
|
299
|
-
"@tiptap/starter-kit": "^
|
|
300
|
-
"@tiptap/vue-3": "^
|
|
301
|
-
"@types/markdown-it": "^14.1.
|
|
289
|
+
"@tiptap/extension-bold": "^3.6.5",
|
|
290
|
+
"@tiptap/extension-bullet-list": "^3.6.5",
|
|
291
|
+
"@tiptap/extension-history": "^3.6.5",
|
|
292
|
+
"@tiptap/extension-italic": "^3.6.5",
|
|
293
|
+
"@tiptap/extension-link": "^3.6.5",
|
|
294
|
+
"@tiptap/extension-ordered-list": "^3.6.5",
|
|
295
|
+
"@tiptap/extension-text-align": "^3.6.5",
|
|
296
|
+
"@tiptap/extension-text-style": "^3.6.5",
|
|
297
|
+
"@tiptap/extension-underline": "^3.6.5",
|
|
298
|
+
"@tiptap/pm": "^3.6.5",
|
|
299
|
+
"@tiptap/starter-kit": "^3.6.5",
|
|
300
|
+
"@tiptap/vue-3": "^3.6.5",
|
|
301
|
+
"@types/markdown-it": "^14.1.2"
|
|
302
302
|
},
|
|
303
303
|
"devDependencies": {
|
|
304
|
-
"
|
|
304
|
+
"vue": "^3.5.22",
|
|
305
|
+
"@fastkit/vui": "^1.2.0"
|
|
305
306
|
},
|
|
306
307
|
"peerDependencies": {
|
|
307
|
-
"vue": "^3.
|
|
308
|
-
"@fastkit/vui": "^1.
|
|
308
|
+
"vue": "^3.5.0",
|
|
309
|
+
"@fastkit/vui": "^1.2.0"
|
|
309
310
|
},
|
|
310
311
|
"scripts": {
|
|
311
312
|
"build": "plugboy build",
|
|
312
313
|
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
|
|
313
|
-
"eslint": "eslint .
|
|
314
|
-
"eslint:fix": "eslint . --
|
|
314
|
+
"eslint": "eslint .",
|
|
315
|
+
"eslint:fix": "eslint . --fix",
|
|
315
316
|
"format": "pnpm run \"/^(eslint:fix|stylelint:fix)$/\"",
|
|
316
317
|
"lint": "pnpm run \"/^(eslint|stylelint)$/\"",
|
|
317
318
|
"stub": "plugboy stub",
|