@fastkit/vui-wysiwyg 8.3.3 → 8.3.4

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.
@@ -1,8 +1,105 @@
1
- :root{
2
- --v-wysiwyg-color-tool:30px;
3
- }
4
-
5
1
  @layer vui{
2
+ .v-linter__problem{
3
+ margin-bottom:-1px;
4
+ cursor:help;
5
+ background:var(--deep-color);
6
+ border-bottom:1px solid var(--main-color);
7
+ }
8
+ .v-linter__issue-icon{
9
+ position:absolute;
10
+ right:2px;
11
+ display:inline-flex;
12
+ align-items:center;
13
+ justify-content:center;
14
+ width:1.2em;
15
+ height:1.2em;
16
+ margin-top:.2em;
17
+ font-family:times,georgia,serif;
18
+ font-size:15px;
19
+ font-weight:700;
20
+ line-height:1;
21
+ color:var(--text-color);
22
+ text-align:center;
23
+ cursor:pointer;
24
+ background:var(--main-color);
25
+ border-radius:100px;
26
+ }
27
+ .v-linter__issue-icon:before{
28
+ content:"!";
29
+ }
30
+ .v-linter__issue-menu-wrapper{
31
+ position:relative;
32
+ display:inline-block;
33
+ width:0;
34
+ height:1em;
35
+ overflow:visible;
36
+ }
37
+ .v-linter__issue-menu{
38
+ font-size:87.5%;
39
+ line-height:1.5;
40
+ }
41
+ .v-linter__issue-menu .v-dialog__body{
42
+ padding:0;
43
+ font-size:inherit;
44
+ }
45
+ .v-linter__issue-menu__message{
46
+ padding:8px;
47
+ }
48
+ .v-linter__issue-menu__fixers{
49
+ position:relative;
50
+ padding:4px 0;
51
+ }
52
+ .v-linter__issue-menu__fixers:before{
53
+ position:absolute;
54
+ top:0;
55
+ right:0;
56
+ left:0;
57
+ display:block;
58
+ height:1px;
59
+ content:"";
60
+ background:currentColor;
61
+ opacity:.5;
62
+ }
63
+ .v-linter__issue-menu__fixer__button{
64
+ position:relative;
65
+ display:block;
66
+ width:100%;
67
+ padding:8px;
68
+ font:inherit;
69
+ font-size:12px;
70
+ text-align:left;
71
+ appearance:none;
72
+ cursor:pointer;
73
+ outline:0;
74
+ background:transparent;
75
+ border:0;
76
+ }
77
+ .v-linter__issue-menu__fixer__button:before{
78
+ position:absolute;
79
+ inset:0;
80
+ display:block;
81
+ content:"";
82
+ background:currentColor;
83
+ opacity:0;
84
+ transition:.15s;
85
+ }
86
+ .v-linter__issue-menu__fixer__button:focus:before,.v-linter__issue-menu__fixer__button:hover:before{
87
+ opacity:.1;
88
+ }
89
+ .v-linter__issue-menu__fixer__button__message{
90
+ position:relative;
91
+ }
92
+ .v-linter__issue-menu__fix{
93
+ display:inline;
94
+ margin-top:8px;
95
+ color:var(--palette-link);
96
+ text-decoration:underline;
97
+ appearance:none;
98
+ cursor:pointer;
99
+ outline:0;
100
+ background:transparent;
101
+ border:0;
102
+ }
6
103
  .v-wysiwyg-color-tool__button{
7
104
  position:relative;
8
105
  display:inline-flex;
@@ -151,105 +248,6 @@
151
248
  .v-wysiwyg-editor--disabled-max-height .v-wysiwyg-editor__body{
152
249
  max-height:none;
153
250
  }
154
- .v-linter__problem{
155
- margin-bottom:-1px;
156
- cursor:help;
157
- background:var(--deep-color);
158
- border-bottom:1px solid var(--main-color);
159
- }
160
- .v-linter__issue-icon{
161
- position:absolute;
162
- right:2px;
163
- display:inline-flex;
164
- align-items:center;
165
- justify-content:center;
166
- width:1.2em;
167
- height:1.2em;
168
- margin-top:.2em;
169
- font-family:times,georgia,serif;
170
- font-size:15px;
171
- font-weight:700;
172
- line-height:1;
173
- color:var(--text-color);
174
- text-align:center;
175
- cursor:pointer;
176
- background:var(--main-color);
177
- border-radius:100px;
178
- }
179
- .v-linter__issue-icon:before{
180
- content:"!";
181
- }
182
- .v-linter__issue-menu-wrapper{
183
- position:relative;
184
- display:inline-block;
185
- width:0;
186
- height:1em;
187
- overflow:visible;
188
- }
189
- .v-linter__issue-menu{
190
- font-size:87.5%;
191
- line-height:1.5;
192
- }
193
- .v-linter__issue-menu .v-dialog__body{
194
- padding:0;
195
- font-size:inherit;
196
- }
197
- .v-linter__issue-menu__message{
198
- padding:8px;
199
- }
200
- .v-linter__issue-menu__fixers{
201
- position:relative;
202
- padding:4px 0;
203
- }
204
- .v-linter__issue-menu__fixers:before{
205
- position:absolute;
206
- top:0;
207
- right:0;
208
- left:0;
209
- display:block;
210
- height:1px;
211
- content:"";
212
- background:currentColor;
213
- opacity:.5;
214
- }
215
- .v-linter__issue-menu__fixer__button{
216
- position:relative;
217
- display:block;
218
- width:100%;
219
- padding:8px;
220
- font:inherit;
221
- font-size:12px;
222
- text-align:left;
223
- appearance:none;
224
- cursor:pointer;
225
- outline:0;
226
- background:transparent;
227
- border:0;
228
- }
229
- .v-linter__issue-menu__fixer__button:before{
230
- position:absolute;
231
- inset:0;
232
- display:block;
233
- content:"";
234
- background:currentColor;
235
- opacity:0;
236
- transition:.15s;
237
- }
238
- .v-linter__issue-menu__fixer__button:focus:before,.v-linter__issue-menu__fixer__button:hover:before{
239
- opacity:.1;
240
- }
241
- .v-linter__issue-menu__fixer__button__message{
242
- position:relative;
243
- }
244
- .v-linter__issue-menu__fix{
245
- display:inline;
246
- margin-top:8px;
247
- color:var(--palette-link);
248
- text-decoration:underline;
249
- appearance:none;
250
- cursor:pointer;
251
- outline:0;
252
- background:transparent;
253
- border:0;
254
- }
251
+ }:root{
252
+ --v-wysiwyg-color-tool:30px;
255
253
  }
@@ -1,6 +1,7 @@
1
1
  import { PropType, VNodeChild } from "vue";
2
2
  import { AnyExtension, Editor, EditorOptions, Extension, Extensions, Mark, Node } from "@tiptap/vue-3";
3
3
  import { EditorView } from "@tiptap/pm/view";
4
+ import "@tiptap/extension-text-style";
4
5
  import { BulletListOptions } from "@tiptap/extension-bullet-list";
5
6
  import { BoldOptions } from "@tiptap/extension-bold";
6
7
  import { ItalicOptions } from "@tiptap/extension-italic";
@@ -11,14 +12,13 @@ import { IconName, TextableControl, VuiService } from "@fastkit/vui";
11
12
  import { OrderedListOptions } from "@tiptap/extension-ordered-list";
12
13
  import { TextAlignOptions } from "@tiptap/extension-text-align";
13
14
  import { Node as Node$1 } from "@tiptap/pm/model";
14
-
15
15
  //#region src/schemes.d.ts
16
16
  declare const EDITOR_EVENTS: readonly ["beforeCreate", "create", "update", "selectionUpdate", "transaction", "focus", "blur", "destroy"];
17
17
  type PrefixedEventName<S extends string> = `on${Capitalize<S>}`;
18
18
  type WysiwygEditorEvent = (typeof EDITOR_EVENTS)[number];
19
19
  type WysiwygEditorPrefixedEvent = PrefixedEventName<WysiwygEditorEvent>;
20
20
  interface WysiwygEditorEventsOptions extends Partial<Pick<EditorOptions, WysiwygEditorPrefixedEvent>> {}
21
- type WysiwygEditorEventsBucket = { [EV in WysiwygEditorEvent]: NonNullable<WysiwygEditorEventsOptions[PrefixedEventName<EV>]>[] };
21
+ type WysiwygEditorEventsBucket = { [EV in WysiwygEditorEvent]: NonNullable<WysiwygEditorEventsOptions[PrefixedEventName<EV>]>[]; };
22
22
  declare class WysiwygEditorInitializeContext {
23
23
  readonly listeners: WysiwygEditorEventsBucket;
24
24
  private readonly _vui;
@@ -123,20 +123,14 @@ declare function WysiwygLinterBadWords(words: string[]): typeof WysiwygLinterPlu
123
123
  //#endregion
124
124
  //#region src/extensions/linter/plugins/HeadingLevel.d.ts
125
125
  declare class WysiwygLinterHeadingLevel extends WysiwygLinterPlugin {
126
- fixHeader(level: number): ({
127
- state,
128
- dispatch
129
- }: EditorView, issue: WysiwygLinterResult) => void;
126
+ fixHeader(level: number): ({ state, dispatch }: EditorView, issue: WysiwygLinterResult) => void;
130
127
  scan(): this;
131
128
  }
132
129
  //#endregion
133
130
  //#region src/extensions/linter/plugins/Punctuation.d.ts
134
131
  declare class WysiwygLinterPunctuation extends WysiwygLinterPlugin {
135
132
  regex: RegExp;
136
- fix(replacement: any): ({
137
- state,
138
- dispatch
139
- }: EditorView, issue: WysiwygLinterResult) => void;
133
+ fix(replacement: any): ({ state, dispatch }: EditorView, issue: WysiwygLinterResult) => void;
140
134
  scan(): this;
141
135
  }
142
136
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"vui-wysiwyg.mjs","names":[],"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"],"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 extends Partial<\n Pick<EditorOptions, WysiwygEditorPrefixedEvent>\n> {}\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> | Node<Options, Storage> | 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 | 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 './Linter.scss';\n\nimport { Extension } from '@tiptap/vue-3';\nimport { Decoration, DecorationSet, EditorView } from '@tiptap/pm/view';\nimport { Plugin, PluginKey, TextSelection } from '@tiptap/pm/state';\nimport { Node as ProsemirrorNode } from '@tiptap/pm/model';\nimport {\n WysiwygLinterPlugin,\n WysiwygLinterResult as Issue,\n WysiwygLinterFixMessage,\n} from './LinterPlugin';\nimport { createWysiwygExtension } from '../../schemes';\n\nconst PROBLEM_CLASS_NAME = 'v-linter__problem';\nconst ISSUE_ICON_CLASS_NAME = 'v-linter__issue-icon';\nconst ISSUE_DATASET_NAME = 'data-issue-id';\n\nfunction resolveWysiwygLinterFixMessage(message: WysiwygLinterFixMessage) {\n return typeof message === 'function' ? message() : message;\n}\n\nfunction renderIcon(view: EditorView, issue: Issue) {\n const { level = 'warning' } = issue;\n const icon = document.createElement('div');\n const message = resolveWysiwygLinterFixMessage(issue.message);\n\n icon.className = `${ISSUE_ICON_CLASS_NAME} ${level}-scope`;\n icon.setAttribute(ISSUE_DATASET_NAME, issue.id);\n\n if (typeof message === 'string') {\n icon.title = message;\n }\n\n return icon;\n}\n\nfunction runAllLinterPlugins(\n doc: ProsemirrorNode,\n plugins: Array<typeof WysiwygLinterPlugin>,\n) {\n const decorations: [any?] = [];\n\n const issues = plugins\n .map((RegisteredLinterPlugin) =>\n new RegisteredLinterPlugin(doc).scan().getResults(),\n )\n .flat();\n\n issues.forEach((issue) => {\n const { level = 'warning', icon } = issue;\n const message = resolveWysiwygLinterFixMessage(issue.message);\n decorations.push(\n 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 );\n if (icon) {\n decorations.push(\n Decoration.widget(issue.from, (view) => renderIcon(view, issue)),\n );\n }\n });\n\n const decorationSet = DecorationSet.create(doc, decorations);\n\n return {\n issues,\n decorationSet,\n };\n}\n\nexport interface WysiwygLinterOptions {\n plugins: Array<typeof WysiwygLinterPlugin>;\n}\n\nexport interface WysiwygLinterStorage {\n issues: Issue[];\n}\n\nexport const WysiwygLinter = createWysiwygExtension((ctx) => {\n function showMenu(view: EditorView, issue: Issue, event: Event) {\n const message = resolveWysiwygLinterFixMessage(issue.message);\n const variant = ctx.vui.setting('containedVariant');\n const scope = ctx.vui.setting(`${issue.level}Scope`);\n\n return ctx.vui.menu({\n activator: event,\n content: (stack) => (\n <div class=\"v-linter__issue-menu__body\">\n <div\n class={[\n 'v-linter__issue-menu__message',\n `${scope}-scope ${variant}`,\n ]}>\n {message}\n </div>\n {issue.fix.length && (\n <div class=\"v-linter__issue-menu__fixers\">\n {issue.fix.map((fixer, index) => (\n <div key={index} class=\"v-linter__issue-menu__fixer\">\n <button\n type=\"button\"\n class=\"v-linter__issue-menu__fixer__button\"\n onClick={() => {\n stack.close();\n fixer.handler(view, issue);\n }}>\n <span class=\"v-linter__issue-menu__fixer__button__message\">\n {resolveWysiwygLinterFixMessage(fixer.message)}\n </span>\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n ),\n });\n }\n\n return Extension.create<WysiwygLinterOptions, WysiwygLinterStorage>({\n name: 'linter',\n\n addOptions() {\n return {\n plugins: [],\n };\n },\n addStorage() {\n return {\n issues: [],\n };\n },\n addProseMirrorPlugins() {\n const { plugins } = this.options;\n const { storage } = this;\n\n const runAll = (doc: ProsemirrorNode) => {\n const { issues, decorationSet } = runAllLinterPlugins(doc, plugins);\n storage.issues = issues;\n return decorationSet;\n };\n\n const getIssue = (id: string) =>\n storage.issues.find((issue) => issue.id === id);\n\n const getIssueElementByEvent = (\n source: EventTarget | null,\n ):\n | {\n issue: Issue;\n }\n | undefined => {\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\n return {\n issue,\n };\n };\n\n const linterPlugin: Plugin<any> = new Plugin({\n key: new PluginKey('linter'),\n state: {\n init(_, { doc }) {\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\n const { issue } = info;\n const { from, to } = issue;\n\n const focus = () =>\n view.dispatch(\n view.state.tr\n .setSelection(TextSelection.create(view.state.doc, from, to))\n .scrollIntoView(),\n );\n\n focus();\n\n showMenu(view, issue, event);\n return true;\n },\n },\n });\n\n return [linterPlugin];\n },\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 extends Omit<\n WysiwygLinterResult,\n 'level' | 'fix' | 'id' | 'icon'\n> {\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 { WysiwygLinterPlugin } from '../LinterPlugin';\n\nexport function WysiwygLinterBadWords(\n words: string[],\n): typeof WysiwygLinterPlugin {\n const regex = new RegExp(`\\\\b(${words.join('|')})\\\\b`);\n\n return class WysiwygLinterBadWords extends WysiwygLinterPlugin {\n scan() {\n this.doc.descendants((node: any, position: number) => {\n if (!node.isText) {\n return;\n }\n\n const matches = regex.exec(node.text);\n\n if (matches) {\n const fixValue = `${matches[0]}!!!!!`;\n\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 {\n message: () => (\n <span>\n <code>{fixValue}</code>に修正する。\n </span>\n ),\n handler: () => {\n // eslint-disable-next-line no-console\n console.log('hoge');\n },\n },\n {\n message: 'どうにかする',\n handler: () => {\n // eslint-disable-next-line no-console\n console.log('hoge');\n },\n },\n ],\n });\n }\n });\n\n return this;\n }\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 './color.scss';\n\nimport { VNodeChild } from 'vue';\nimport { type VuiService, VIcon } from '@fastkit/vui';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport { WysiwygColorExtension } from '../extensions';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport interface WysiwygColorItem {\n key?: string | number;\n name?: VNodeChild | ((vui: VuiService) => VNodeChild);\n color: string | null;\n}\n\nexport interface CreateWysiwygColorToolOptions {\n items: WysiwygColorItem[];\n withLabel?: boolean;\n}\n\nexport function createWysiwygColorTool(opts: CreateWysiwygColorToolOptions) {\n const WysiwygColorTool: WysiwygEditorToolFactory = (vui) => {\n const tool: WysiwygEditorTool = {\n key: 'textColor',\n // active: ({ editor }) => editor.isActive('textStyle'),\n icon:\n ({ editor }) =>\n () => {\n const { color } = editor.getAttributes('textStyle');\n const style = { color };\n return (\n <span class=\"v-wysiwyg-color-tool__button\">\n <VIcon\n class=\"v-wysiwyg-color-tool__button__icon\"\n name={vui.icon('editorTextColor')}\n />\n <span class=\"v-wysiwyg-color-tool__button__bar\" style={style} />\n </span>\n );\n },\n onClick: (ctx, ev) => {\n ctx.vui.menu({\n class: 'v-wysiwyg-color-tool__menu',\n activator: ev,\n content: (stack) => (\n <div\n class={[\n 'v-wysiwyg-color-tool__items',\n { 'v-wysiwyg-color-tool__items--with-label': opts.withLabel },\n ]}>\n {opts.items.map((item, index) => (\n <button\n key={item.key == null ? index : item.key}\n class=\"v-wysiwyg-color-tool__item\"\n type=\"button\"\n onClick={() => {\n const { color } = 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 <span\n class=\"v-wysiwyg-color-tool__item__color\"\n style={item.color ? { color: item.color } : {}}\n />\n {opts.withLabel && (\n <span class=\"v-wysiwyg-color-tool__item__name\">\n {item.name}\n </span>\n )}\n </button>\n ))}\n </div>\n ),\n });\n },\n floating: true,\n extensions: [TextStyle, WysiwygColorExtension],\n };\n return tool;\n };\n\n return WysiwygColorTool;\n}\n","import { TextAlign, TextAlignOptions } from '@tiptap/extension-text-align';\nimport { type Editor } from '@tiptap/vue-3';\nimport { VuiServiceIconSettings, VButtonGroup, VButton } from '@fastkit/vui';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\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 = [\n 'left',\n 'center',\n 'right',\n // 'justify',\n] as const;\n\n/** Text align value */\nexport type WysiwygTextAlignValue = (typeof WYSIWYG_TEXT_ALIGN_VALUES)[number];\n\n/**\n * A list of nodes where the text align attribute should be applied to.\n */\nconst DEFAULT_TYPES = ['heading', 'paragraph'] as const;\n\nexport interface WysiwygTextAlignOptions {\n /**\n * A list of nodes where the text align attribute should be applied to. Usually something like `['heading', 'paragraph']`\n * @default DEFAULT_TYPES\n * @see {@link DEFAULT_TYPES}\n */\n types?: TextAlignOptions['types'];\n /**\n * A list of available options for the text align attribute.\n * @default WYSIWYG_TEXT_ALIGN_VALUES\n * @see {@link WYSIWYG_TEXT_ALIGN_VALUES}\n */\n alignments?: WysiwygTextAlignValue[];\n /**\n * The default text align.\n * @default left\n */\n defaultAlignment: WysiwygTextAlignValue;\n}\n\nconst conditions = WYSIWYG_TEXT_ALIGN_VALUES.map<\n [WysiwygTextAlignValue, { textAlign: WysiwygTextAlignValue }]\n>((value) => [value, { textAlign: value }]);\n\nconst ICON_AT: Record<WysiwygTextAlignValue, keyof VuiServiceIconSettings> = {\n left: 'editorAlignLeft',\n center: 'editorAlignCenter',\n right: 'editorAlignRight',\n};\n\nfunction resolveOptions(\n rawOptions: Partial<WysiwygTextAlignOptions> | undefined,\n): Required<WysiwygTextAlignOptions> {\n const types = rawOptions?.types || DEFAULT_TYPES.slice();\n const alignments =\n rawOptions?.alignments || WYSIWYG_TEXT_ALIGN_VALUES.slice();\n const defaultAlignment = rawOptions?.defaultAlignment || 'left';\n\n return {\n types,\n alignments,\n defaultAlignment,\n };\n}\nfunction getCurrentAlign(\n editor: Editor,\n options: WysiwygTextAlignOptions,\n): WysiwygTextAlignValue {\n for (const [align, condition] of conditions) {\n if (editor.isActive(condition)) return align;\n }\n return options.defaultAlignment;\n}\n\nexport const WysiwygTextAlignTool: WysiwygEditorToolFactory<\n WysiwygTextAlignOptions\n> = (vui, options) => {\n const resolvedOptions = resolveOptions(options);\n const { alignments } = resolvedOptions;\n\n const getIcon = (value: WysiwygTextAlignValue) => {\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\n const variant = vui.setting('plainVariant');\n const toolButtonActiveColor = vui.setting('primaryScope');\n\n const tool: WysiwygEditorTool = {\n key: 'textAlign',\n icon: ({ editor }) => getIcon(getCurrentAlign(editor, resolvedOptions)),\n onClick: async ({ vui, editor }, ev) => {\n vui.menu({\n distance: 0,\n activator: ev,\n content: (menu) => (\n <VButtonGroup variant={variant}>\n {alignments.map((value) => {\n const isActive = editor.isActive({ textAlign: value });\n return (\n <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 />\n );\n })}\n </VButtonGroup>\n ),\n });\n },\n floating: true,\n extensions: [TextAlign.configure(resolvedOptions)],\n };\n return tool;\n};\n","import { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\nimport {\n createWysiwygCustomTagMark,\n WysiwygCustomTagSettings,\n WysiwygCustomTagExtension,\n} from '../extensions/custom-tag';\n\nexport interface WysiwygCustomTagToolSettings\n extends\n 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 './VWysiwygEditor.scss';\nimport {\n defineComponent,\n PropType,\n computed,\n ref,\n watch,\n onBeforeUnmount,\n VNodeChild,\n} from 'vue';\nimport {\n createFormNodeWrapperProps,\n FormNodeWrapperSlots,\n VFormControl,\n VControlField,\n createControlFieldProps,\n InputBoxSlots,\n IconName,\n createTextableProps,\n createTextableEmits,\n TextableControl,\n createControlProps,\n useControl,\n createControlFieldProviderProps,\n useControlField,\n VTextCounter,\n defineSlots,\n useVui,\n VButton,\n VButtonGroup,\n withCtx,\n} from '@fastkit/vui';\nimport {\n EditorContent,\n useEditor,\n FocusPosition,\n type Editor,\n} 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 {\n RawWysiwygExtension,\n resolveRawWysiwygExtensions,\n RawWysiwygEditorTool,\n resolveRawWysiwygEditorTools,\n WysiwygEditorContext,\n // EditorEventsOptions,\n WysiwygEditorInitializeContext,\n} from '../../schemes';\n\nconst slots = defineSlots<FormNodeWrapperSlots & InputBoxSlots>();\n\nexport interface VWysiwygEditorAPI {\n readonly editor: Editor | undefined;\n readonly control: TextableControl;\n}\n\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 as PropType<RawWysiwygExtension[]>,\n default: () => [],\n },\n tools: {\n type: Array as PropType<RawWysiwygEditorTool[]>,\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\n const textRef = ref('');\n const toolButtonActiveColor = vui.setting('primaryScope');\n\n const wysiwygSettings = computed(() =>\n resolveRawWysiwygEditorTools(props.tools, vui),\n );\n\n const control = useControl(props);\n useControlField(props);\n\n const classes = computed(() => [\n 'v-wysiwyg-editor',\n control.classes.value,\n `v-wysiwyg-editor--${control.size.value}`,\n {\n 'v-wysiwyg-editor--disabled-min-height': props.disabledMinHeight,\n 'v-wysiwyg-editor--disabled-max-height': props.disabledMaxHeight,\n },\n ]);\n\n const inputControl = new TextableControl(props, ctx as any, {\n nodeType: VUI_WYSIWYG_EDITOR_SYMBOL,\n validationValue: () => textRef.value,\n });\n\n const getOutput = (\n editor: Pick<Editor, 'isEmpty' | 'getHTML' | 'getText'>,\n type: 'text' | 'html',\n ) => {\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\n const initializeCtx = new WysiwygEditorInitializeContext(() => vui, {\n onCreate: ({ editor }) => {\n textRef.value = getOutput(editor, 'text');\n updateEditable();\n },\n onFocus: ({ event }) => {\n inputControl.focusHandler(event);\n },\n onBlur: ({ event }) => {\n inputControl.blurHandler(event);\n },\n onUpdate: ({ editor }) => {\n inputControl.value = getOutput(editor, 'html');\n textRef.value = getOutput(editor, 'text');\n },\n });\n\n const extensions = [\n StarterKit.configure({\n bold: false,\n bulletList: false,\n orderedList: false,\n undoRedo: false,\n italic: false,\n }),\n ...resolveRawWysiwygExtensions(props.extensions, initializeCtx),\n ...wysiwygSettings.value.extensions,\n ];\n\n const updateEditable = () => {\n if (!editor.value) return;\n editor.value.setEditable(inputControl.canOperation);\n };\n\n watch(() => inputControl.canOperation, updateEditable);\n\n watch(\n () => props.modelValue,\n (modelValue) => {\n const $editor = editor.value;\n if (!$editor || getOutput($editor, 'html') === modelValue) return;\n\n $editor.commands.setContent(modelValue == null ? '' : modelValue, {\n emitUpdate: false,\n });\n textRef.value = getOutput($editor, 'text');\n },\n );\n\n initializeCtx.on('create', ({ editor }) => {\n textRef.value = getOutput(editor, 'text');\n updateEditable();\n });\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\n const focus = (\n position?: FocusPosition,\n options?: {\n scrollIntoView?: boolean | undefined;\n },\n ) => editor.value?.chain().focus(position, options);\n\n const wysiwygContext = computed<WysiwygEditorContext>(() => ({\n vui,\n editor: editor.value!,\n }));\n\n const createTools = (bubbleMenu = false) => {\n const { value: settings } = wysiwygSettings;\n const { value: context } = wysiwygContext;\n const tools = bubbleMenu\n ? settings.tools.filter((t) => !!t.floating)\n : settings.tools;\n const _editor = editor.value;\n const variant = vui.setting(\n bubbleMenu ? 'containedVariant' : 'plainVariant',\n );\n\n return (\n <VButtonGroup\n class={[\n 'v-wysiwyg-editor__toolbar',\n {\n 'v-wysiwyg-editor__floating-toolbar': props.floatingToolbar,\n },\n ]}\n variant={variant}>\n {tools.map(({ key, icon, onClick, disabled, active }) => {\n const isActive =\n !!_editor && resolveContextualValue(context, active);\n const isDisabled =\n !inputControl.canOperation ||\n (!!_editor && resolveContextualValue(context, disabled));\n let iconName: IconName | undefined;\n let child: VNodeChild;\n\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 as any;\n }\n }\n } else {\n iconName = icon;\n }\n\n if (!iconName && child == null) return;\n\n return (\n <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 {child}\n </VButton>\n );\n })}\n </VButtonGroup>\n );\n };\n\n onBeforeUnmount(() => {\n editor.value?.destroy();\n });\n\n const api: VWysiwygEditorAPI = {\n get editor() {\n return editor.value;\n },\n control: inputControl,\n };\n\n ctx.expose(api);\n\n const handleClickLabel = (ev: PointerEvent) => {\n focus('start', { scrollIntoView: true });\n };\n\n const defaultSlot = () => (\n <div class=\"v-wysiwyg-editor__body\">\n <EditorContent\n class=\"v-wysiwyg-editor__input__element wysiwyg\"\n editor={editor.value}\n />\n {!props.floatingToolbar &&\n !!editor.value &&\n !inputControl.isReadonly && (\n <BubbleMenu editor={editor.value}>\n <div class=\"v-wysiwyg-editor__bubble-menu\">\n {createTools(true)}\n </div>\n </BubbleMenu>\n )}\n </div>\n );\n\n const formControlDefaultSlot = () => (\n <div class=\"v-wysiwyg-editor__wrapper\">\n {!inputControl.isReadonly && createTools()}\n <VControlField\n class=\"v-wysiwyg-editor__input\"\n autoHeight\n startAdornment={props.startAdornment}\n endAdornment={props.endAdornment}\n size={control.size.value}\n v-slots={{\n ...ctx.slots,\n default: withCtx(defaultSlot),\n }}\n />\n </div>\n );\n\n const infoAppendsSlot = () => {\n const { counterResult } = inputControl;\n if (!counterResult) return;\n return <VTextCounter {...counterResult} />;\n };\n\n return () => (\n <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 v-slots={{\n ...ctx.slots,\n default: withCtx(formControlDefaultSlot),\n infoAppends: withCtx(infoAppendsSlot),\n }}\n />\n );\n },\n});\n\nfunction resolveContextualValue(\n ctx: WysiwygEditorContext,\n source?: boolean | ((ctx: WysiwygEditorContext) => boolean),\n) {\n return typeof source === 'function' ? source(ctx) : source;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"vui-wysiwyg.mjs","names":[],"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"],"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 extends Partial<\n Pick<EditorOptions, WysiwygEditorPrefixedEvent>\n> {}\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> | Node<Options, Storage> | 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 | 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 './Linter.scss';\n\nimport { Extension } from '@tiptap/vue-3';\nimport { Decoration, DecorationSet, EditorView } from '@tiptap/pm/view';\nimport { Plugin, PluginKey, TextSelection } from '@tiptap/pm/state';\nimport { Node as ProsemirrorNode } from '@tiptap/pm/model';\nimport {\n WysiwygLinterPlugin,\n WysiwygLinterResult as Issue,\n WysiwygLinterFixMessage,\n} from './LinterPlugin';\nimport { createWysiwygExtension } from '../../schemes';\n\nconst PROBLEM_CLASS_NAME = 'v-linter__problem';\nconst ISSUE_ICON_CLASS_NAME = 'v-linter__issue-icon';\nconst ISSUE_DATASET_NAME = 'data-issue-id';\n\nfunction resolveWysiwygLinterFixMessage(message: WysiwygLinterFixMessage) {\n return typeof message === 'function' ? message() : message;\n}\n\nfunction renderIcon(view: EditorView, issue: Issue) {\n const { level = 'warning' } = issue;\n const icon = document.createElement('div');\n const message = resolveWysiwygLinterFixMessage(issue.message);\n\n icon.className = `${ISSUE_ICON_CLASS_NAME} ${level}-scope`;\n icon.setAttribute(ISSUE_DATASET_NAME, issue.id);\n\n if (typeof message === 'string') {\n icon.title = message;\n }\n\n return icon;\n}\n\nfunction runAllLinterPlugins(\n doc: ProsemirrorNode,\n plugins: Array<typeof WysiwygLinterPlugin>,\n) {\n const decorations: [any?] = [];\n\n const issues = plugins\n .map((RegisteredLinterPlugin) =>\n new RegisteredLinterPlugin(doc).scan().getResults(),\n )\n .flat();\n\n issues.forEach((issue) => {\n const { level = 'warning', icon } = issue;\n const message = resolveWysiwygLinterFixMessage(issue.message);\n decorations.push(\n 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 );\n if (icon) {\n decorations.push(\n Decoration.widget(issue.from, (view) => renderIcon(view, issue)),\n );\n }\n });\n\n const decorationSet = DecorationSet.create(doc, decorations);\n\n return {\n issues,\n decorationSet,\n };\n}\n\nexport interface WysiwygLinterOptions {\n plugins: Array<typeof WysiwygLinterPlugin>;\n}\n\nexport interface WysiwygLinterStorage {\n issues: Issue[];\n}\n\nexport const WysiwygLinter = createWysiwygExtension((ctx) => {\n function showMenu(view: EditorView, issue: Issue, event: Event) {\n const message = resolveWysiwygLinterFixMessage(issue.message);\n const variant = ctx.vui.setting('containedVariant');\n const scope = ctx.vui.setting(`${issue.level}Scope`);\n\n return ctx.vui.menu({\n activator: event,\n content: (stack) => (\n <div class=\"v-linter__issue-menu__body\">\n <div\n class={[\n 'v-linter__issue-menu__message',\n `${scope}-scope ${variant}`,\n ]}>\n {message}\n </div>\n {issue.fix.length && (\n <div class=\"v-linter__issue-menu__fixers\">\n {issue.fix.map((fixer, index) => (\n <div key={index} class=\"v-linter__issue-menu__fixer\">\n <button\n type=\"button\"\n class=\"v-linter__issue-menu__fixer__button\"\n onClick={() => {\n stack.close();\n fixer.handler(view, issue);\n }}>\n <span class=\"v-linter__issue-menu__fixer__button__message\">\n {resolveWysiwygLinterFixMessage(fixer.message)}\n </span>\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n ),\n });\n }\n\n return Extension.create<WysiwygLinterOptions, WysiwygLinterStorage>({\n name: 'linter',\n\n addOptions() {\n return {\n plugins: [],\n };\n },\n addStorage() {\n return {\n issues: [],\n };\n },\n addProseMirrorPlugins() {\n const { plugins } = this.options;\n const { storage } = this;\n\n const runAll = (doc: ProsemirrorNode) => {\n const { issues, decorationSet } = runAllLinterPlugins(doc, plugins);\n storage.issues = issues;\n return decorationSet;\n };\n\n const getIssue = (id: string) =>\n storage.issues.find((issue) => issue.id === id);\n\n const getIssueElementByEvent = (\n source: EventTarget | null,\n ):\n | {\n issue: Issue;\n }\n | undefined => {\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\n return {\n issue,\n };\n };\n\n const linterPlugin: Plugin<any> = new Plugin({\n key: new PluginKey('linter'),\n state: {\n init(_, { doc }) {\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\n const { issue } = info;\n const { from, to } = issue;\n\n const focus = () =>\n view.dispatch(\n view.state.tr\n .setSelection(TextSelection.create(view.state.doc, from, to))\n .scrollIntoView(),\n );\n\n focus();\n\n showMenu(view, issue, event);\n return true;\n },\n },\n });\n\n return [linterPlugin];\n },\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 extends Omit<\n WysiwygLinterResult,\n 'level' | 'fix' | 'id' | 'icon'\n> {\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 { WysiwygLinterPlugin } from '../LinterPlugin';\n\nexport function WysiwygLinterBadWords(\n words: string[],\n): typeof WysiwygLinterPlugin {\n const regex = new RegExp(`\\\\b(${words.join('|')})\\\\b`);\n\n return class WysiwygLinterBadWords extends WysiwygLinterPlugin {\n scan() {\n this.doc.descendants((node: any, position: number) => {\n if (!node.isText) {\n return;\n }\n\n const matches = regex.exec(node.text);\n\n if (matches) {\n const fixValue = `${matches[0]}!!!!!`;\n\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 {\n message: () => (\n <span>\n <code>{fixValue}</code>に修正する。\n </span>\n ),\n handler: () => {\n // eslint-disable-next-line no-console\n console.log('hoge');\n },\n },\n {\n message: 'どうにかする',\n handler: () => {\n // eslint-disable-next-line no-console\n console.log('hoge');\n },\n },\n ],\n });\n }\n });\n\n return this;\n }\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 './color.scss';\n\nimport { VNodeChild } from 'vue';\nimport { type VuiService, VIcon } from '@fastkit/vui';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport { WysiwygColorExtension } from '../extensions';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\n\nexport interface WysiwygColorItem {\n key?: string | number;\n name?: VNodeChild | ((vui: VuiService) => VNodeChild);\n color: string | null;\n}\n\nexport interface CreateWysiwygColorToolOptions {\n items: WysiwygColorItem[];\n withLabel?: boolean;\n}\n\nexport function createWysiwygColorTool(opts: CreateWysiwygColorToolOptions) {\n const WysiwygColorTool: WysiwygEditorToolFactory = (vui) => {\n const tool: WysiwygEditorTool = {\n key: 'textColor',\n // active: ({ editor }) => editor.isActive('textStyle'),\n icon:\n ({ editor }) =>\n () => {\n const { color } = editor.getAttributes('textStyle');\n const style = { color };\n return (\n <span class=\"v-wysiwyg-color-tool__button\">\n <VIcon\n class=\"v-wysiwyg-color-tool__button__icon\"\n name={vui.icon('editorTextColor')}\n />\n <span class=\"v-wysiwyg-color-tool__button__bar\" style={style} />\n </span>\n );\n },\n onClick: (ctx, ev) => {\n ctx.vui.menu({\n class: 'v-wysiwyg-color-tool__menu',\n activator: ev,\n content: (stack) => (\n <div\n class={[\n 'v-wysiwyg-color-tool__items',\n { 'v-wysiwyg-color-tool__items--with-label': opts.withLabel },\n ]}>\n {opts.items.map((item, index) => (\n <button\n key={item.key == null ? index : item.key}\n class=\"v-wysiwyg-color-tool__item\"\n type=\"button\"\n onClick={() => {\n const { color } = 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 <span\n class=\"v-wysiwyg-color-tool__item__color\"\n style={item.color ? { color: item.color } : {}}\n />\n {opts.withLabel && (\n <span class=\"v-wysiwyg-color-tool__item__name\">\n {item.name}\n </span>\n )}\n </button>\n ))}\n </div>\n ),\n });\n },\n floating: true,\n extensions: [TextStyle, WysiwygColorExtension],\n };\n return tool;\n };\n\n return WysiwygColorTool;\n}\n","import { TextAlign, TextAlignOptions } from '@tiptap/extension-text-align';\nimport { type Editor } from '@tiptap/vue-3';\nimport { VuiServiceIconSettings, VButtonGroup, VButton } from '@fastkit/vui';\nimport { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\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 = [\n 'left',\n 'center',\n 'right',\n // 'justify',\n] as const;\n\n/** Text align value */\nexport type WysiwygTextAlignValue = (typeof WYSIWYG_TEXT_ALIGN_VALUES)[number];\n\n/**\n * A list of nodes where the text align attribute should be applied to.\n */\nconst DEFAULT_TYPES = ['heading', 'paragraph'] as const;\n\nexport interface WysiwygTextAlignOptions {\n /**\n * A list of nodes where the text align attribute should be applied to. Usually something like `['heading', 'paragraph']`\n * @default DEFAULT_TYPES\n * @see {@link DEFAULT_TYPES}\n */\n types?: TextAlignOptions['types'];\n /**\n * A list of available options for the text align attribute.\n * @default WYSIWYG_TEXT_ALIGN_VALUES\n * @see {@link WYSIWYG_TEXT_ALIGN_VALUES}\n */\n alignments?: WysiwygTextAlignValue[];\n /**\n * The default text align.\n * @default left\n */\n defaultAlignment: WysiwygTextAlignValue;\n}\n\nconst conditions = WYSIWYG_TEXT_ALIGN_VALUES.map<\n [WysiwygTextAlignValue, { textAlign: WysiwygTextAlignValue }]\n>((value) => [value, { textAlign: value }]);\n\nconst ICON_AT: Record<WysiwygTextAlignValue, keyof VuiServiceIconSettings> = {\n left: 'editorAlignLeft',\n center: 'editorAlignCenter',\n right: 'editorAlignRight',\n};\n\nfunction resolveOptions(\n rawOptions: Partial<WysiwygTextAlignOptions> | undefined,\n): Required<WysiwygTextAlignOptions> {\n const types = rawOptions?.types || DEFAULT_TYPES.slice();\n const alignments =\n rawOptions?.alignments || WYSIWYG_TEXT_ALIGN_VALUES.slice();\n const defaultAlignment = rawOptions?.defaultAlignment || 'left';\n\n return {\n types,\n alignments,\n defaultAlignment,\n };\n}\nfunction getCurrentAlign(\n editor: Editor,\n options: WysiwygTextAlignOptions,\n): WysiwygTextAlignValue {\n for (const [align, condition] of conditions) {\n if (editor.isActive(condition)) return align;\n }\n return options.defaultAlignment;\n}\n\nexport const WysiwygTextAlignTool: WysiwygEditorToolFactory<\n WysiwygTextAlignOptions\n> = (vui, options) => {\n const resolvedOptions = resolveOptions(options);\n const { alignments } = resolvedOptions;\n\n const getIcon = (value: WysiwygTextAlignValue) => {\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\n const variant = vui.setting('plainVariant');\n const toolButtonActiveColor = vui.setting('primaryScope');\n\n const tool: WysiwygEditorTool = {\n key: 'textAlign',\n icon: ({ editor }) => getIcon(getCurrentAlign(editor, resolvedOptions)),\n onClick: async ({ vui, editor }, ev) => {\n vui.menu({\n distance: 0,\n activator: ev,\n content: (menu) => (\n <VButtonGroup variant={variant}>\n {alignments.map((value) => {\n const isActive = editor.isActive({ textAlign: value });\n return (\n <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 />\n );\n })}\n </VButtonGroup>\n ),\n });\n },\n floating: true,\n extensions: [TextAlign.configure(resolvedOptions)],\n };\n return tool;\n};\n","import { WysiwygEditorToolFactory, WysiwygEditorTool } from '../schemes';\nimport {\n createWysiwygCustomTagMark,\n WysiwygCustomTagSettings,\n WysiwygCustomTagExtension,\n} from '../extensions/custom-tag';\n\nexport interface WysiwygCustomTagToolSettings\n extends\n 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 './VWysiwygEditor.scss';\nimport {\n defineComponent,\n PropType,\n computed,\n ref,\n watch,\n onBeforeUnmount,\n VNodeChild,\n} from 'vue';\nimport {\n createFormNodeWrapperProps,\n FormNodeWrapperSlots,\n VFormControl,\n VControlField,\n createControlFieldProps,\n InputBoxSlots,\n IconName,\n createTextableProps,\n createTextableEmits,\n TextableControl,\n createControlProps,\n useControl,\n createControlFieldProviderProps,\n useControlField,\n VTextCounter,\n defineSlots,\n useVui,\n VButton,\n VButtonGroup,\n withCtx,\n} from '@fastkit/vui';\nimport {\n EditorContent,\n useEditor,\n FocusPosition,\n type Editor,\n} 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 {\n RawWysiwygExtension,\n resolveRawWysiwygExtensions,\n RawWysiwygEditorTool,\n resolveRawWysiwygEditorTools,\n WysiwygEditorContext,\n // EditorEventsOptions,\n WysiwygEditorInitializeContext,\n} from '../../schemes';\n\nconst slots = defineSlots<FormNodeWrapperSlots & InputBoxSlots>();\n\nexport interface VWysiwygEditorAPI {\n readonly editor: Editor | undefined;\n readonly control: TextableControl;\n}\n\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 as PropType<RawWysiwygExtension[]>,\n default: () => [],\n },\n tools: {\n type: Array as PropType<RawWysiwygEditorTool[]>,\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\n const textRef = ref('');\n const toolButtonActiveColor = vui.setting('primaryScope');\n\n const wysiwygSettings = computed(() =>\n resolveRawWysiwygEditorTools(props.tools, vui),\n );\n\n const control = useControl(props);\n useControlField(props);\n\n const classes = computed(() => [\n 'v-wysiwyg-editor',\n control.classes.value,\n `v-wysiwyg-editor--${control.size.value}`,\n {\n 'v-wysiwyg-editor--disabled-min-height': props.disabledMinHeight,\n 'v-wysiwyg-editor--disabled-max-height': props.disabledMaxHeight,\n },\n ]);\n\n const inputControl = new TextableControl(props, ctx as any, {\n nodeType: VUI_WYSIWYG_EDITOR_SYMBOL,\n validationValue: () => textRef.value,\n });\n\n const getOutput = (\n editor: Pick<Editor, 'isEmpty' | 'getHTML' | 'getText'>,\n type: 'text' | 'html',\n ) => {\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\n const initializeCtx = new WysiwygEditorInitializeContext(() => vui, {\n onCreate: ({ editor }) => {\n textRef.value = getOutput(editor, 'text');\n updateEditable();\n },\n onFocus: ({ event }) => {\n inputControl.focusHandler(event);\n },\n onBlur: ({ event }) => {\n inputControl.blurHandler(event);\n },\n onUpdate: ({ editor }) => {\n inputControl.value = getOutput(editor, 'html');\n textRef.value = getOutput(editor, 'text');\n },\n });\n\n const extensions = [\n StarterKit.configure({\n bold: false,\n bulletList: false,\n orderedList: false,\n undoRedo: false,\n italic: false,\n }),\n ...resolveRawWysiwygExtensions(props.extensions, initializeCtx),\n ...wysiwygSettings.value.extensions,\n ];\n\n const updateEditable = () => {\n if (!editor.value) return;\n editor.value.setEditable(inputControl.canOperation);\n };\n\n watch(() => inputControl.canOperation, updateEditable);\n\n watch(\n () => props.modelValue,\n (modelValue) => {\n const $editor = editor.value;\n if (!$editor || getOutput($editor, 'html') === modelValue) return;\n\n $editor.commands.setContent(modelValue == null ? '' : modelValue, {\n emitUpdate: false,\n });\n textRef.value = getOutput($editor, 'text');\n },\n );\n\n initializeCtx.on('create', ({ editor }) => {\n textRef.value = getOutput(editor, 'text');\n updateEditable();\n });\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\n const focus = (\n position?: FocusPosition,\n options?: {\n scrollIntoView?: boolean | undefined;\n },\n ) => editor.value?.chain().focus(position, options);\n\n const wysiwygContext = computed<WysiwygEditorContext>(() => ({\n vui,\n editor: editor.value!,\n }));\n\n const createTools = (bubbleMenu = false) => {\n const { value: settings } = wysiwygSettings;\n const { value: context } = wysiwygContext;\n const tools = bubbleMenu\n ? settings.tools.filter((t) => !!t.floating)\n : settings.tools;\n const _editor = editor.value;\n const variant = vui.setting(\n bubbleMenu ? 'containedVariant' : 'plainVariant',\n );\n\n return (\n <VButtonGroup\n class={[\n 'v-wysiwyg-editor__toolbar',\n {\n 'v-wysiwyg-editor__floating-toolbar': props.floatingToolbar,\n },\n ]}\n variant={variant}>\n {tools.map(({ key, icon, onClick, disabled, active }) => {\n const isActive =\n !!_editor && resolveContextualValue(context, active);\n const isDisabled =\n !inputControl.canOperation ||\n (!!_editor && resolveContextualValue(context, disabled));\n let iconName: IconName | undefined;\n let child: VNodeChild;\n\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 as any;\n }\n }\n } else {\n iconName = icon;\n }\n\n if (!iconName && child == null) return;\n\n return (\n <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 {child}\n </VButton>\n );\n })}\n </VButtonGroup>\n );\n };\n\n onBeforeUnmount(() => {\n editor.value?.destroy();\n });\n\n const api: VWysiwygEditorAPI = {\n get editor() {\n return editor.value;\n },\n control: inputControl,\n };\n\n ctx.expose(api);\n\n const handleClickLabel = (ev: PointerEvent) => {\n focus('start', { scrollIntoView: true });\n };\n\n const defaultSlot = () => (\n <div class=\"v-wysiwyg-editor__body\">\n <EditorContent\n class=\"v-wysiwyg-editor__input__element wysiwyg\"\n editor={editor.value}\n />\n {!props.floatingToolbar &&\n !!editor.value &&\n !inputControl.isReadonly && (\n <BubbleMenu editor={editor.value}>\n <div class=\"v-wysiwyg-editor__bubble-menu\">\n {createTools(true)}\n </div>\n </BubbleMenu>\n )}\n </div>\n );\n\n const formControlDefaultSlot = () => (\n <div class=\"v-wysiwyg-editor__wrapper\">\n {!inputControl.isReadonly && createTools()}\n <VControlField\n class=\"v-wysiwyg-editor__input\"\n autoHeight\n startAdornment={props.startAdornment}\n endAdornment={props.endAdornment}\n size={control.size.value}\n v-slots={{\n ...ctx.slots,\n default: withCtx(defaultSlot),\n }}\n />\n </div>\n );\n\n const infoAppendsSlot = () => {\n const { counterResult } = inputControl;\n if (!counterResult) return;\n return <VTextCounter {...counterResult} />;\n };\n\n return () => (\n <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 v-slots={{\n ...ctx.slots,\n default: withCtx(formControlDefaultSlot),\n infoAppends: withCtx(infoAppendsSlot),\n }}\n />\n );\n },\n});\n\nfunction resolveContextualValue(\n ctx: WysiwygEditorContext,\n source?: boolean | ((ctx: WysiwygEditorContext) => boolean),\n) {\n return typeof source === 'function' ? source(ctx) : source;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fastkit/vui-wysiwyg",
3
- "version": "8.3.3",
3
+ "version": "8.3.4",
4
4
  "description": "vui-wysiwyg",
5
5
  "keywords": [],
6
6
  "repository": {
@@ -19,46 +19,40 @@
19
19
  "default": "./dist/vui-wysiwyg.mjs"
20
20
  }
21
21
  },
22
- "./tiptap/core": {
23
- "types": "./dist/tiptap/core.d.mts",
24
- "import": {
25
- "default": "./dist/tiptap/core.mjs"
26
- }
27
- },
28
- "./pm/view": {
29
- "types": "./dist/pm/view.d.mts",
22
+ "./pm/changeset": {
23
+ "types": "./dist/pm/changeset.d.mts",
30
24
  "import": {
31
- "default": "./dist/pm/view.mjs"
25
+ "default": "./dist/pm/changeset.mjs"
32
26
  }
33
27
  },
34
- "./pm/transform": {
35
- "types": "./dist/pm/transform.d.mts",
28
+ "./pm/commands": {
29
+ "types": "./dist/pm/commands.d.mts",
36
30
  "import": {
37
- "default": "./dist/pm/transform.mjs"
31
+ "default": "./dist/pm/commands.mjs"
38
32
  }
39
33
  },
40
- "./pm/tables": {
41
- "types": "./dist/pm/tables.d.mts",
34
+ "./pm/dropcursor": {
35
+ "types": "./dist/pm/dropcursor.d.mts",
42
36
  "import": {
43
- "default": "./dist/pm/tables.mjs"
37
+ "default": "./dist/pm/dropcursor.mjs"
44
38
  }
45
39
  },
46
- "./pm/state": {
47
- "types": "./dist/pm/state.d.mts",
40
+ "./pm/gapcursor": {
41
+ "types": "./dist/pm/gapcursor.d.mts",
48
42
  "import": {
49
- "default": "./dist/pm/state.mjs"
43
+ "default": "./dist/pm/gapcursor.mjs"
50
44
  }
51
45
  },
52
- "./pm/schema-list": {
53
- "types": "./dist/pm/schema-list.d.mts",
46
+ "./pm/history": {
47
+ "types": "./dist/pm/history.d.mts",
54
48
  "import": {
55
- "default": "./dist/pm/schema-list.mjs"
49
+ "default": "./dist/pm/history.mjs"
56
50
  }
57
51
  },
58
- "./pm/model": {
59
- "types": "./dist/pm/model.d.mts",
52
+ "./pm/inputrules": {
53
+ "types": "./dist/pm/inputrules.d.mts",
60
54
  "import": {
61
- "default": "./dist/pm/model.mjs"
55
+ "default": "./dist/pm/inputrules.mjs"
62
56
  }
63
57
  },
64
58
  "./pm/keymap": {
@@ -67,64 +61,70 @@
67
61
  "default": "./dist/pm/keymap.mjs"
68
62
  }
69
63
  },
70
- "./pm/inputrules": {
71
- "types": "./dist/pm/inputrules.d.mts",
64
+ "./pm/model": {
65
+ "types": "./dist/pm/model.d.mts",
72
66
  "import": {
73
- "default": "./dist/pm/inputrules.mjs"
67
+ "default": "./dist/pm/model.mjs"
74
68
  }
75
69
  },
76
- "./pm/history": {
77
- "types": "./dist/pm/history.d.mts",
70
+ "./pm/schema-list": {
71
+ "types": "./dist/pm/schema-list.d.mts",
78
72
  "import": {
79
- "default": "./dist/pm/history.mjs"
73
+ "default": "./dist/pm/schema-list.mjs"
80
74
  }
81
75
  },
82
- "./pm/gapcursor": {
83
- "types": "./dist/pm/gapcursor.d.mts",
76
+ "./pm/state": {
77
+ "types": "./dist/pm/state.d.mts",
84
78
  "import": {
85
- "default": "./dist/pm/gapcursor.mjs"
79
+ "default": "./dist/pm/state.mjs"
86
80
  }
87
81
  },
88
- "./pm/dropcursor": {
89
- "types": "./dist/pm/dropcursor.d.mts",
82
+ "./pm/tables": {
83
+ "types": "./dist/pm/tables.d.mts",
90
84
  "import": {
91
- "default": "./dist/pm/dropcursor.mjs"
85
+ "default": "./dist/pm/tables.mjs"
92
86
  }
93
87
  },
94
- "./pm/commands": {
95
- "types": "./dist/pm/commands.d.mts",
88
+ "./pm/transform": {
89
+ "types": "./dist/pm/transform.d.mts",
96
90
  "import": {
97
- "default": "./dist/pm/commands.mjs"
91
+ "default": "./dist/pm/transform.mjs"
98
92
  }
99
93
  },
100
- "./pm/changeset": {
101
- "types": "./dist/pm/changeset.d.mts",
94
+ "./pm/view": {
95
+ "types": "./dist/pm/view.d.mts",
102
96
  "import": {
103
- "default": "./dist/pm/changeset.mjs"
97
+ "default": "./dist/pm/view.mjs"
104
98
  }
105
99
  },
106
- "./tiptap/extensions/underline": {
107
- "types": "./dist/tiptap/extensions/underline.d.mts",
100
+ "./tiptap/core": {
101
+ "types": "./dist/tiptap/core.d.mts",
108
102
  "import": {
109
- "default": "./dist/tiptap/extensions/underline.mjs"
103
+ "default": "./dist/tiptap/core.mjs"
110
104
  }
111
105
  },
112
- "./tiptap/extensions/text-style": {
113
- "types": "./dist/tiptap/extensions/text-style.d.mts",
106
+ "./tiptap/extensions/bold": {
107
+ "types": "./dist/tiptap/extensions/bold.d.mts",
114
108
  "import": {
115
- "default": "./dist/tiptap/extensions/text-style.mjs"
109
+ "default": "./dist/tiptap/extensions/bold.mjs"
116
110
  }
117
111
  },
118
- "./tiptap/extensions/text-align": {
119
- "types": "./dist/tiptap/extensions/text-align.d.mts",
112
+ "./tiptap/extensions/bullet-list": {
113
+ "types": "./dist/tiptap/extensions/bullet-list.d.mts",
120
114
  "import": {
121
- "default": "./dist/tiptap/extensions/text-align.mjs"
115
+ "default": "./dist/tiptap/extensions/bullet-list.mjs"
122
116
  }
123
117
  },
124
- "./tiptap/extensions/ordered-list": {
125
- "types": "./dist/tiptap/extensions/ordered-list.d.mts",
118
+ "./tiptap/extensions/history": {
119
+ "types": "./dist/tiptap/extensions/history.d.mts",
126
120
  "import": {
127
- "default": "./dist/tiptap/extensions/ordered-list.mjs"
121
+ "default": "./dist/tiptap/extensions/history.mjs"
122
+ }
123
+ },
124
+ "./tiptap/extensions/italic": {
125
+ "types": "./dist/tiptap/extensions/italic.d.mts",
126
+ "import": {
127
+ "default": "./dist/tiptap/extensions/italic.mjs"
128
128
  }
129
129
  },
130
130
  "./tiptap/extensions/link": {
@@ -133,28 +133,28 @@
133
133
  "default": "./dist/tiptap/extensions/link.mjs"
134
134
  }
135
135
  },
136
- "./tiptap/extensions/italic": {
137
- "types": "./dist/tiptap/extensions/italic.d.mts",
136
+ "./tiptap/extensions/ordered-list": {
137
+ "types": "./dist/tiptap/extensions/ordered-list.d.mts",
138
138
  "import": {
139
- "default": "./dist/tiptap/extensions/italic.mjs"
139
+ "default": "./dist/tiptap/extensions/ordered-list.mjs"
140
140
  }
141
141
  },
142
- "./tiptap/extensions/history": {
143
- "types": "./dist/tiptap/extensions/history.d.mts",
142
+ "./tiptap/extensions/text-align": {
143
+ "types": "./dist/tiptap/extensions/text-align.d.mts",
144
144
  "import": {
145
- "default": "./dist/tiptap/extensions/history.mjs"
145
+ "default": "./dist/tiptap/extensions/text-align.mjs"
146
146
  }
147
147
  },
148
- "./tiptap/extensions/bullet-list": {
149
- "types": "./dist/tiptap/extensions/bullet-list.d.mts",
148
+ "./tiptap/extensions/text-style": {
149
+ "types": "./dist/tiptap/extensions/text-style.d.mts",
150
150
  "import": {
151
- "default": "./dist/tiptap/extensions/bullet-list.mjs"
151
+ "default": "./dist/tiptap/extensions/text-style.mjs"
152
152
  }
153
153
  },
154
- "./tiptap/extensions/bold": {
155
- "types": "./dist/tiptap/extensions/bold.d.mts",
154
+ "./tiptap/extensions/underline": {
155
+ "types": "./dist/tiptap/extensions/underline.d.mts",
156
156
  "import": {
157
- "default": "./dist/tiptap/extensions/bold.mjs"
157
+ "default": "./dist/tiptap/extensions/underline.mjs"
158
158
  }
159
159
  },
160
160
  "./*": "./dist/*"
@@ -166,74 +166,74 @@
166
166
  ".": [
167
167
  "./dist/vui-wysiwyg.d.mts"
168
168
  ],
169
- "tiptap/core": [
170
- "./dist/tiptap/core.d.mts"
171
- ],
172
- "pm/view": [
173
- "./dist/pm/view.d.mts"
169
+ "pm/changeset": [
170
+ "./dist/pm/changeset.d.mts"
174
171
  ],
175
- "pm/transform": [
176
- "./dist/pm/transform.d.mts"
172
+ "pm/commands": [
173
+ "./dist/pm/commands.d.mts"
177
174
  ],
178
- "pm/tables": [
179
- "./dist/pm/tables.d.mts"
175
+ "pm/dropcursor": [
176
+ "./dist/pm/dropcursor.d.mts"
180
177
  ],
181
- "pm/state": [
182
- "./dist/pm/state.d.mts"
178
+ "pm/gapcursor": [
179
+ "./dist/pm/gapcursor.d.mts"
183
180
  ],
184
- "pm/schema-list": [
185
- "./dist/pm/schema-list.d.mts"
181
+ "pm/history": [
182
+ "./dist/pm/history.d.mts"
186
183
  ],
187
- "pm/model": [
188
- "./dist/pm/model.d.mts"
184
+ "pm/inputrules": [
185
+ "./dist/pm/inputrules.d.mts"
189
186
  ],
190
187
  "pm/keymap": [
191
188
  "./dist/pm/keymap.d.mts"
192
189
  ],
193
- "pm/inputrules": [
194
- "./dist/pm/inputrules.d.mts"
190
+ "pm/model": [
191
+ "./dist/pm/model.d.mts"
195
192
  ],
196
- "pm/history": [
197
- "./dist/pm/history.d.mts"
193
+ "pm/schema-list": [
194
+ "./dist/pm/schema-list.d.mts"
198
195
  ],
199
- "pm/gapcursor": [
200
- "./dist/pm/gapcursor.d.mts"
196
+ "pm/state": [
197
+ "./dist/pm/state.d.mts"
201
198
  ],
202
- "pm/dropcursor": [
203
- "./dist/pm/dropcursor.d.mts"
199
+ "pm/tables": [
200
+ "./dist/pm/tables.d.mts"
204
201
  ],
205
- "pm/commands": [
206
- "./dist/pm/commands.d.mts"
202
+ "pm/transform": [
203
+ "./dist/pm/transform.d.mts"
207
204
  ],
208
- "pm/changeset": [
209
- "./dist/pm/changeset.d.mts"
205
+ "pm/view": [
206
+ "./dist/pm/view.d.mts"
210
207
  ],
211
- "tiptap/extensions/underline": [
212
- "./dist/tiptap/extensions/underline.d.mts"
208
+ "tiptap/core": [
209
+ "./dist/tiptap/core.d.mts"
213
210
  ],
214
- "tiptap/extensions/text-style": [
215
- "./dist/tiptap/extensions/text-style.d.mts"
211
+ "tiptap/extensions/bold": [
212
+ "./dist/tiptap/extensions/bold.d.mts"
216
213
  ],
217
- "tiptap/extensions/text-align": [
218
- "./dist/tiptap/extensions/text-align.d.mts"
214
+ "tiptap/extensions/bullet-list": [
215
+ "./dist/tiptap/extensions/bullet-list.d.mts"
219
216
  ],
220
- "tiptap/extensions/ordered-list": [
221
- "./dist/tiptap/extensions/ordered-list.d.mts"
217
+ "tiptap/extensions/history": [
218
+ "./dist/tiptap/extensions/history.d.mts"
219
+ ],
220
+ "tiptap/extensions/italic": [
221
+ "./dist/tiptap/extensions/italic.d.mts"
222
222
  ],
223
223
  "tiptap/extensions/link": [
224
224
  "./dist/tiptap/extensions/link.d.mts"
225
225
  ],
226
- "tiptap/extensions/italic": [
227
- "./dist/tiptap/extensions/italic.d.mts"
226
+ "tiptap/extensions/ordered-list": [
227
+ "./dist/tiptap/extensions/ordered-list.d.mts"
228
228
  ],
229
- "tiptap/extensions/history": [
230
- "./dist/tiptap/extensions/history.d.mts"
229
+ "tiptap/extensions/text-align": [
230
+ "./dist/tiptap/extensions/text-align.d.mts"
231
231
  ],
232
- "tiptap/extensions/bullet-list": [
233
- "./dist/tiptap/extensions/bullet-list.d.mts"
232
+ "tiptap/extensions/text-style": [
233
+ "./dist/tiptap/extensions/text-style.d.mts"
234
234
  ],
235
- "tiptap/extensions/bold": [
236
- "./dist/tiptap/extensions/bold.d.mts"
235
+ "tiptap/extensions/underline": [
236
+ "./dist/tiptap/extensions/underline.d.mts"
237
237
  ]
238
238
  }
239
239
  },
@@ -241,28 +241,28 @@
241
241
  "dist"
242
242
  ],
243
243
  "dependencies": {
244
- "@tiptap/extension-bold": "^3.27.1",
245
- "@tiptap/extension-bullet-list": "^3.27.1",
246
- "@tiptap/extension-history": "^3.27.1",
247
- "@tiptap/extension-italic": "^3.27.1",
248
- "@tiptap/extension-link": "^3.27.1",
249
- "@tiptap/extension-ordered-list": "^3.27.1",
250
- "@tiptap/extension-text-align": "^3.27.1",
251
- "@tiptap/extension-text-style": "^3.27.1",
252
- "@tiptap/extension-underline": "^3.27.1",
253
- "@tiptap/pm": "^3.27.1",
254
- "@tiptap/starter-kit": "^3.27.1",
255
- "@tiptap/vue-3": "^3.27.1"
244
+ "@tiptap/extension-bold": "^3.29.0",
245
+ "@tiptap/extension-bullet-list": "^3.29.0",
246
+ "@tiptap/extension-history": "^3.29.0",
247
+ "@tiptap/extension-italic": "^3.29.0",
248
+ "@tiptap/extension-link": "^3.29.0",
249
+ "@tiptap/extension-ordered-list": "^3.29.0",
250
+ "@tiptap/extension-text-align": "^3.29.0",
251
+ "@tiptap/extension-text-style": "^3.29.0",
252
+ "@tiptap/extension-underline": "^3.29.0",
253
+ "@tiptap/pm": "^3.29.0",
254
+ "@tiptap/starter-kit": "^3.29.0",
255
+ "@tiptap/vue-3": "^3.29.0"
256
256
  },
257
257
  "devDependencies": {
258
- "vue": "^3.5.38",
259
- "vue-router": "^5.1.0",
260
- "@fastkit/vui": "^1.5.0"
258
+ "vue": "^3.5.40",
259
+ "vue-router": "^5.2.0",
260
+ "@fastkit/vui": "^1.5.1"
261
261
  },
262
262
  "peerDependencies": {
263
263
  "vue": "^3.5.0",
264
264
  "vue-router": "^4.4.0 || ^5.0.0",
265
- "@fastkit/vui": "^1.5.0"
265
+ "@fastkit/vui": "^1.5.1"
266
266
  },
267
267
  "scripts": {
268
268
  "build": "plugboy build",