@verbb/plugin-kit-tiptap-core 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/LICENSE.md +21 -0
- package/README.md +36 -0
- package/dist/extensions/create-extensions.d.ts +13 -0
- package/dist/extensions/create-extensions.d.ts.map +1 -0
- package/dist/extensions/create-extensions.js +92 -0
- package/dist/extensions/create-extensions.js.map +1 -0
- package/dist/extensions/index.d.ts +6 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +4 -0
- package/dist/extensions/one-liner-document.d.ts +2 -0
- package/dist/extensions/one-liner-document.d.ts.map +1 -0
- package/dist/extensions/one-liner-document.js +7 -0
- package/dist/extensions/one-liner-document.js.map +1 -0
- package/dist/extensions/variable-tag.d.ts +7 -0
- package/dist/extensions/variable-tag.d.ts.map +1 -0
- package/dist/extensions/variable-tag.js +156 -0
- package/dist/extensions/variable-tag.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/links/commands.d.ts +9 -0
- package/dist/links/commands.d.ts.map +1 -0
- package/dist/links/commands.js +63 -0
- package/dist/links/commands.js.map +1 -0
- package/dist/links/craft-element.d.ts +28 -0
- package/dist/links/craft-element.d.ts.map +1 -0
- package/dist/links/craft-element.js +80 -0
- package/dist/links/craft-element.js.map +1 -0
- package/dist/links/extension.d.ts +3 -0
- package/dist/links/extension.d.ts.map +1 -0
- package/dist/links/extension.js +17 -0
- package/dist/links/extension.js.map +1 -0
- package/dist/links/index.d.ts +5 -0
- package/dist/links/index.d.ts.map +1 -0
- package/dist/links/index.js +4 -0
- package/dist/links/types.d.ts +62 -0
- package/dist/links/types.d.ts.map +1 -0
- package/dist/links/types.js +0 -0
- package/dist/serialization/editor.d.ts +9 -0
- package/dist/serialization/editor.d.ts.map +1 -0
- package/dist/serialization/editor.js +112 -0
- package/dist/serialization/editor.js.map +1 -0
- package/dist/serialization/input.d.ts +55 -0
- package/dist/serialization/input.d.ts.map +1 -0
- package/dist/serialization/input.js +293 -0
- package/dist/serialization/input.js.map +1 -0
- package/dist/toolbar/button-registry.d.ts +14 -0
- package/dist/toolbar/button-registry.d.ts.map +1 -0
- package/dist/toolbar/button-registry.js +114 -0
- package/dist/toolbar/button-registry.js.map +1 -0
- package/dist/toolbar/index.d.ts +3 -0
- package/dist/toolbar/index.d.ts.map +1 -0
- package/dist/toolbar/index.js +3 -0
- package/dist/toolbar/toolbar-schema.d.ts +66 -0
- package/dist/toolbar/toolbar-schema.d.ts.map +1 -0
- package/dist/toolbar/toolbar-schema.js +340 -0
- package/dist/toolbar/toolbar-schema.js.map +1 -0
- package/dist/types/variable-option.d.ts +10 -0
- package/dist/types/variable-option.d.ts.map +1 -0
- package/dist/types/variable-option.js +0 -0
- package/package.json +99 -0
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import { isTiptapButtonActive, isTiptapButtonName, runTiptapButton } from "./button-registry.js";
|
|
2
|
+
//#region src/toolbar/toolbar-schema.ts
|
|
3
|
+
var DEFAULT_HEADING_LEVELS = [
|
|
4
|
+
1,
|
|
5
|
+
2,
|
|
6
|
+
3,
|
|
7
|
+
4
|
|
8
|
+
];
|
|
9
|
+
var PRESET_DEFAULT_ICONS = {
|
|
10
|
+
formatting: "paragraph",
|
|
11
|
+
headings: "heading",
|
|
12
|
+
lists: "unordered-list",
|
|
13
|
+
align: "align-left"
|
|
14
|
+
};
|
|
15
|
+
var VALID_PRESETS = new Set([
|
|
16
|
+
"formatting",
|
|
17
|
+
"headings",
|
|
18
|
+
"lists",
|
|
19
|
+
"align"
|
|
20
|
+
]);
|
|
21
|
+
function isFormattingToolbarPreset(preset) {
|
|
22
|
+
return preset === "formatting";
|
|
23
|
+
}
|
|
24
|
+
function isHeadingsOnlyToolbarPreset(preset) {
|
|
25
|
+
return preset === "headings";
|
|
26
|
+
}
|
|
27
|
+
function getToolbarGroupDefaultIcon(group) {
|
|
28
|
+
if (group.preset) return PRESET_DEFAULT_ICONS[group.preset];
|
|
29
|
+
return getToolbarGroupItems(group)[0] ?? "bold";
|
|
30
|
+
}
|
|
31
|
+
var SEPARATOR_TOKENS = new Set(["|", "separator"]);
|
|
32
|
+
function isToolbarSeparatorToken(value) {
|
|
33
|
+
return SEPARATOR_TOKENS.has(value);
|
|
34
|
+
}
|
|
35
|
+
function expandPresetItems(group) {
|
|
36
|
+
if (group.items?.length) return group.items.filter((item) => typeof item === "string" && isTiptapButtonName(item));
|
|
37
|
+
switch (group.preset) {
|
|
38
|
+
case "formatting": return [
|
|
39
|
+
...(group.headingLevels ?? DEFAULT_HEADING_LEVELS).map((level) => `h${level}`),
|
|
40
|
+
"blockquote",
|
|
41
|
+
"code-block"
|
|
42
|
+
];
|
|
43
|
+
case "headings": return (group.headingLevels ?? DEFAULT_HEADING_LEVELS).map((level) => `h${level}`);
|
|
44
|
+
case "lists": return ["unordered-list", "ordered-list"];
|
|
45
|
+
case "align": return [
|
|
46
|
+
"align-left",
|
|
47
|
+
"align-center",
|
|
48
|
+
"align-right",
|
|
49
|
+
"align-justify"
|
|
50
|
+
];
|
|
51
|
+
default: return [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function getToolbarGroupItems(group) {
|
|
55
|
+
return expandPresetItems(group);
|
|
56
|
+
}
|
|
57
|
+
function flattenToolbarButtonNames(nodes) {
|
|
58
|
+
const names = [];
|
|
59
|
+
nodes.forEach((node) => {
|
|
60
|
+
if (node.type === "button") {
|
|
61
|
+
names.push(node.name);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (node.type === "group") names.push(...getToolbarGroupItems(node.group));
|
|
65
|
+
});
|
|
66
|
+
return names;
|
|
67
|
+
}
|
|
68
|
+
function toolbarIncludesButton(nodes, buttonName) {
|
|
69
|
+
return flattenToolbarButtonNames(nodes).includes(buttonName);
|
|
70
|
+
}
|
|
71
|
+
function normalizeGroupItemDefinition(raw) {
|
|
72
|
+
if (typeof raw === "string") {
|
|
73
|
+
const token = raw.trim();
|
|
74
|
+
if (!token) return null;
|
|
75
|
+
if (isToolbarSeparatorToken(token)) return token;
|
|
76
|
+
if (token === "paragraph") return "paragraph";
|
|
77
|
+
return normalizeButtonName(token);
|
|
78
|
+
}
|
|
79
|
+
if (!raw || typeof raw !== "object") return null;
|
|
80
|
+
const record = raw;
|
|
81
|
+
if (record.type === "separator") return { type: "separator" };
|
|
82
|
+
if (record.type === "item" && typeof record.name === "string") {
|
|
83
|
+
if (record.name === "paragraph") return "paragraph";
|
|
84
|
+
return normalizeButtonName(record.name);
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
function normalizeGroupItemDefinitions(raw) {
|
|
89
|
+
return raw.map((item) => normalizeGroupItemDefinition(item)).filter((item) => item !== null);
|
|
90
|
+
}
|
|
91
|
+
function isGroupItemSeparator(item) {
|
|
92
|
+
return item === "|" || item === "separator" || typeof item === "object" && item.type === "separator";
|
|
93
|
+
}
|
|
94
|
+
function isToolbarGroupMenuButton(item) {
|
|
95
|
+
return !isGroupItemSeparator(item);
|
|
96
|
+
}
|
|
97
|
+
function groupItemDefinitionsToMenuEntries(items) {
|
|
98
|
+
return items.flatMap((item) => {
|
|
99
|
+
if (isGroupItemSeparator(item)) return [{ type: "separator" }];
|
|
100
|
+
if (!isToolbarGroupMenuButton(item)) return [];
|
|
101
|
+
return [{
|
|
102
|
+
type: "item",
|
|
103
|
+
name: item
|
|
104
|
+
}];
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function getToolbarGroupMenuButtons(group) {
|
|
108
|
+
return getToolbarGroupMenuItems(group).filter((entry) => entry.type === "item").map((entry) => entry.name);
|
|
109
|
+
}
|
|
110
|
+
function normalizeButtonName(value) {
|
|
111
|
+
return isTiptapButtonName(value) ? value : null;
|
|
112
|
+
}
|
|
113
|
+
function normalizeHeadingLevels(value) {
|
|
114
|
+
if (!Array.isArray(value)) return;
|
|
115
|
+
const levels = value.map((level) => Number(level)).filter((level) => [
|
|
116
|
+
1,
|
|
117
|
+
2,
|
|
118
|
+
3,
|
|
119
|
+
4,
|
|
120
|
+
5,
|
|
121
|
+
6
|
|
122
|
+
].includes(level));
|
|
123
|
+
return levels.length > 0 ? levels : void 0;
|
|
124
|
+
}
|
|
125
|
+
function normalizeToolbarGroup(raw) {
|
|
126
|
+
const source = typeof raw.group === "object" && raw.group !== null ? raw.group : raw;
|
|
127
|
+
const preset = typeof source.preset === "string" ? source.preset : void 0;
|
|
128
|
+
const label = typeof source.label === "string" ? source.label : void 0;
|
|
129
|
+
const iconRaw = typeof source.icon === "string" ? source.icon : void 0;
|
|
130
|
+
const icon = iconRaw ? normalizeButtonName(iconRaw) ?? void 0 : void 0;
|
|
131
|
+
const headingLevels = normalizeHeadingLevels(source.headingLevels);
|
|
132
|
+
const items = Array.isArray(source.items) ? normalizeGroupItemDefinitions(source.items) : void 0;
|
|
133
|
+
if (!preset && !items?.length) return null;
|
|
134
|
+
if (preset && !VALID_PRESETS.has(preset)) return null;
|
|
135
|
+
return {
|
|
136
|
+
type: "group",
|
|
137
|
+
group: {
|
|
138
|
+
...label ? { label } : {},
|
|
139
|
+
...icon ? { icon } : {},
|
|
140
|
+
...preset ? { preset } : {},
|
|
141
|
+
...items?.length ? { items } : {},
|
|
142
|
+
...headingLevels ? { headingLevels } : {}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function normalizeToolbarNode(raw) {
|
|
147
|
+
if (typeof raw === "string") {
|
|
148
|
+
const token = raw.trim();
|
|
149
|
+
if (!token) return null;
|
|
150
|
+
if (isToolbarSeparatorToken(token)) return { type: "separator" };
|
|
151
|
+
const buttonName = normalizeButtonName(token);
|
|
152
|
+
return buttonName ? {
|
|
153
|
+
type: "button",
|
|
154
|
+
name: buttonName
|
|
155
|
+
} : null;
|
|
156
|
+
}
|
|
157
|
+
if (!raw || typeof raw !== "object") return null;
|
|
158
|
+
const record = raw;
|
|
159
|
+
if (record.type === "separator") return { type: "separator" };
|
|
160
|
+
if (record.type === "button" && typeof record.name === "string") {
|
|
161
|
+
const buttonName = normalizeButtonName(record.name);
|
|
162
|
+
return buttonName ? {
|
|
163
|
+
type: "button",
|
|
164
|
+
name: buttonName
|
|
165
|
+
} : null;
|
|
166
|
+
}
|
|
167
|
+
if (record.type === "group" || record.preset || record.items || record.group) return normalizeToolbarGroup(record);
|
|
168
|
+
if (typeof record.button === "string") {
|
|
169
|
+
const buttonName = normalizeButtonName(record.button);
|
|
170
|
+
return buttonName ? {
|
|
171
|
+
type: "button",
|
|
172
|
+
name: buttonName
|
|
173
|
+
} : null;
|
|
174
|
+
}
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
function normalizeToolbarNodes(raw) {
|
|
178
|
+
return raw.map((item) => normalizeToolbarNode(item)).filter((item) => item !== null);
|
|
179
|
+
}
|
|
180
|
+
function parseToolbarConfig(input) {
|
|
181
|
+
if (input === null || input === void 0 || input === "") return [{
|
|
182
|
+
type: "button",
|
|
183
|
+
name: "bold"
|
|
184
|
+
}, {
|
|
185
|
+
type: "button",
|
|
186
|
+
name: "italic"
|
|
187
|
+
}];
|
|
188
|
+
if (Array.isArray(input)) {
|
|
189
|
+
const normalized = normalizeToolbarNodes(input);
|
|
190
|
+
return normalized.length > 0 ? normalized : [{
|
|
191
|
+
type: "button",
|
|
192
|
+
name: "bold"
|
|
193
|
+
}, {
|
|
194
|
+
type: "button",
|
|
195
|
+
name: "italic"
|
|
196
|
+
}];
|
|
197
|
+
}
|
|
198
|
+
if (typeof input === "string") {
|
|
199
|
+
const trimmed = input.trim();
|
|
200
|
+
if (!trimmed) return [{
|
|
201
|
+
type: "button",
|
|
202
|
+
name: "bold"
|
|
203
|
+
}, {
|
|
204
|
+
type: "button",
|
|
205
|
+
name: "italic"
|
|
206
|
+
}];
|
|
207
|
+
if (trimmed.startsWith("[")) try {
|
|
208
|
+
const parsed = JSON.parse(trimmed);
|
|
209
|
+
return Array.isArray(parsed) ? parseToolbarConfig(parsed) : parseToolbarConfig(null);
|
|
210
|
+
} catch {
|
|
211
|
+
return parseToolbarConfig(null);
|
|
212
|
+
}
|
|
213
|
+
return parseToolbarConfig(trimmed.split(",").map((token) => token.trim()).filter(Boolean));
|
|
214
|
+
}
|
|
215
|
+
return parseToolbarConfig(null);
|
|
216
|
+
}
|
|
217
|
+
function runToolbarButton(editor, buttonName, options = {}) {
|
|
218
|
+
if (buttonName === "paragraph") return editor.chain().focus().setParagraph().run();
|
|
219
|
+
return runTiptapButton(editor, buttonName, options);
|
|
220
|
+
}
|
|
221
|
+
function isToolbarButtonActive(editor, buttonName) {
|
|
222
|
+
if (buttonName === "paragraph") return editor.isActive("paragraph") && !editor.isActive("heading");
|
|
223
|
+
return isTiptapButtonActive(editor, buttonName);
|
|
224
|
+
}
|
|
225
|
+
function getActiveHeadingLevel(editor) {
|
|
226
|
+
for (const level of [
|
|
227
|
+
1,
|
|
228
|
+
2,
|
|
229
|
+
3,
|
|
230
|
+
4,
|
|
231
|
+
5,
|
|
232
|
+
6
|
|
233
|
+
]) if (editor.isActive("heading", { level })) return level;
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
function getToolbarGroupTriggerState(editor, group) {
|
|
237
|
+
const fallbackIcon = group.icon ?? getToolbarGroupDefaultIcon(group);
|
|
238
|
+
const menuButtons = getToolbarGroupMenuButtons(group);
|
|
239
|
+
if (isHeadingsOnlyToolbarPreset(group.preset)) {
|
|
240
|
+
const activeLevel = getActiveHeadingLevel(editor);
|
|
241
|
+
if (activeLevel) {
|
|
242
|
+
const name = `h${activeLevel}`;
|
|
243
|
+
return {
|
|
244
|
+
activeName: name,
|
|
245
|
+
label: `H${activeLevel}`,
|
|
246
|
+
isActive: true,
|
|
247
|
+
icon: name
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
activeName: null,
|
|
252
|
+
label: "",
|
|
253
|
+
isActive: false,
|
|
254
|
+
icon: "heading"
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
if (isFormattingToolbarPreset(group.preset)) {
|
|
258
|
+
const activeLevel = getActiveHeadingLevel(editor);
|
|
259
|
+
if (activeLevel) {
|
|
260
|
+
const name = `h${activeLevel}`;
|
|
261
|
+
return {
|
|
262
|
+
activeName: name,
|
|
263
|
+
label: `H${activeLevel}`,
|
|
264
|
+
isActive: true,
|
|
265
|
+
icon: name
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
if (isToolbarButtonActive(editor, "blockquote")) return {
|
|
269
|
+
activeName: "blockquote",
|
|
270
|
+
label: "",
|
|
271
|
+
isActive: true,
|
|
272
|
+
icon: "blockquote"
|
|
273
|
+
};
|
|
274
|
+
if (isToolbarButtonActive(editor, "code-block")) return {
|
|
275
|
+
activeName: "code-block",
|
|
276
|
+
label: "",
|
|
277
|
+
isActive: true,
|
|
278
|
+
icon: "code-block"
|
|
279
|
+
};
|
|
280
|
+
return {
|
|
281
|
+
activeName: "paragraph",
|
|
282
|
+
label: "Text",
|
|
283
|
+
isActive: isToolbarButtonActive(editor, "paragraph"),
|
|
284
|
+
icon: "paragraph"
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
const activeName = menuButtons.find((name) => isToolbarButtonActive(editor, name)) ?? null;
|
|
288
|
+
if (activeName) {
|
|
289
|
+
const icon = activeName === "paragraph" ? "paragraph" : isTiptapButtonName(activeName) ? activeName : fallbackIcon;
|
|
290
|
+
return {
|
|
291
|
+
activeName: activeName === "paragraph" ? "paragraph" : activeName,
|
|
292
|
+
label: activeName === "paragraph" ? "Text" : group.label ?? activeName,
|
|
293
|
+
isActive: true,
|
|
294
|
+
icon
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
activeName: null,
|
|
299
|
+
label: group.label ?? "",
|
|
300
|
+
isActive: false,
|
|
301
|
+
icon: fallbackIcon
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
function getFormattingHeadingLevels(group) {
|
|
305
|
+
return group.headingLevels ?? DEFAULT_HEADING_LEVELS;
|
|
306
|
+
}
|
|
307
|
+
function getFormattingMenuEntries(group) {
|
|
308
|
+
return [
|
|
309
|
+
{
|
|
310
|
+
type: "item",
|
|
311
|
+
name: "paragraph"
|
|
312
|
+
},
|
|
313
|
+
{ type: "separator" },
|
|
314
|
+
...getFormattingHeadingLevels(group).map((level) => ({
|
|
315
|
+
type: "item",
|
|
316
|
+
name: `h${level}`
|
|
317
|
+
})),
|
|
318
|
+
{ type: "separator" },
|
|
319
|
+
{
|
|
320
|
+
type: "item",
|
|
321
|
+
name: "blockquote"
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
type: "item",
|
|
325
|
+
name: "code-block"
|
|
326
|
+
}
|
|
327
|
+
];
|
|
328
|
+
}
|
|
329
|
+
function getToolbarGroupMenuItems(group) {
|
|
330
|
+
if (group.items?.length) return groupItemDefinitionsToMenuEntries(group.items);
|
|
331
|
+
if (isFormattingToolbarPreset(group.preset)) return getFormattingMenuEntries(group);
|
|
332
|
+
return getToolbarGroupItems(group).map((name) => ({
|
|
333
|
+
type: "item",
|
|
334
|
+
name
|
|
335
|
+
}));
|
|
336
|
+
}
|
|
337
|
+
//#endregion
|
|
338
|
+
export { expandPresetItems, flattenToolbarButtonNames, getToolbarGroupDefaultIcon, getToolbarGroupItems, getToolbarGroupMenuItems, getToolbarGroupTriggerState, isFormattingToolbarPreset, isHeadingsOnlyToolbarPreset, isToolbarButtonActive, isToolbarSeparatorToken, normalizeToolbarNodes, parseToolbarConfig, runToolbarButton, toolbarIncludesButton };
|
|
339
|
+
|
|
340
|
+
//# sourceMappingURL=toolbar-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbar-schema.js","names":[],"sources":["../../src/toolbar/toolbar-schema.ts"],"sourcesContent":["import type { Editor } from '@tiptap/core';\n\nimport {\n isTiptapButtonActive,\n isTiptapButtonName,\n runTiptapButton,\n type RunTiptapButtonOptions,\n type TiptapButtonName,\n} from './button-registry.js';\n\n/** Toolbar chrome icons that are not editor commands. */\nexport type ToolbarIconName = TiptapButtonName | 'paragraph' | 'heading';\n\nexport type ToolbarSeparatorToken = '|' | 'separator';\n\n/** Paragraph, headings, blockquote, and code block. */\nexport type ToolbarFormattingPreset = 'formatting';\n\n/** Heading levels only — TipTap-style trigger with icon menu items. */\nexport type ToolbarHeadingsPreset = 'headings';\n\nexport type ToolbarGroupPreset = ToolbarFormattingPreset | ToolbarHeadingsPreset | 'lists' | 'align';\n\nexport type ToolbarHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport type ToolbarGroupMenuButton = TiptapButtonName | 'paragraph';\n\nexport type ToolbarGroupMenuEntry =\n | { type: 'item'; name: ToolbarGroupMenuButton }\n | { type: 'separator' };\n\n/** Custom dropdown item — buttons, paragraph, or separators. */\nexport type ToolbarGroupItemDefinition =\n | ToolbarGroupMenuButton\n | ToolbarSeparatorToken\n | { type: 'separator' };\n\nexport type ToolbarGroup = {\n label?: string;\n icon?: TiptapButtonName;\n preset?: ToolbarGroupPreset;\n items?: ToolbarGroupItemDefinition[];\n headingLevels?: ToolbarHeadingLevel[];\n};\n\nexport type ToolbarButtonNode = {\n type: 'button';\n name: TiptapButtonName;\n};\n\nexport type ToolbarSeparatorNode = {\n type: 'separator';\n};\n\nexport type ToolbarGroupNode = {\n type: 'group';\n group: ToolbarGroup;\n};\n\nexport type ToolbarNode = ToolbarButtonNode | ToolbarSeparatorNode | ToolbarGroupNode;\n\nexport type ToolbarGroupTriggerState = {\n /** Active item inside the group, or `paragraph` for formatting presets when in body text. */\n activeName: TiptapButtonName | 'paragraph' | null;\n /** Short label for the trigger (e.g. `H2`, `Text`). */\n label: string;\n /** Whether any item in the group is currently active. */\n isActive: boolean;\n /** Icon to render on the trigger when no text label is preferred. */\n icon: ToolbarIconName;\n};\n\nconst DEFAULT_HEADING_LEVELS: ToolbarHeadingLevel[] = [1, 2, 3, 4];\n\nconst PRESET_DEFAULT_ICONS: Record<ToolbarGroupPreset, ToolbarIconName> = {\n formatting: 'paragraph',\n headings: 'heading',\n lists: 'unordered-list',\n align: 'align-left',\n};\n\nconst VALID_PRESETS = new Set<string>(['formatting', 'headings', 'lists', 'align']);\n\nexport function isFormattingToolbarPreset(preset?: ToolbarGroupPreset): preset is ToolbarFormattingPreset {\n return preset === 'formatting';\n}\n\nexport function isHeadingsOnlyToolbarPreset(preset?: ToolbarGroupPreset): preset is ToolbarHeadingsPreset {\n return preset === 'headings';\n}\n\nexport function getToolbarGroupDefaultIcon(group: ToolbarGroup): ToolbarIconName {\n if (group.preset) {\n return PRESET_DEFAULT_ICONS[group.preset];\n }\n\n const items = getToolbarGroupItems(group);\n\n return items[0] ?? 'bold';\n}\n\nconst SEPARATOR_TOKENS = new Set<string>(['|', 'separator']);\n\nexport function isToolbarSeparatorToken(value: string): value is ToolbarSeparatorToken {\n return SEPARATOR_TOKENS.has(value);\n}\n\nexport function expandPresetItems(group: ToolbarGroup): TiptapButtonName[] {\n if (group.items?.length) {\n return group.items\n .filter((item): item is TiptapButtonName => typeof item === 'string' && isTiptapButtonName(item));\n }\n\n switch (group.preset) {\n case 'formatting': {\n const levels = group.headingLevels ?? DEFAULT_HEADING_LEVELS;\n return [\n ...levels.map((level) => `h${level}` as TiptapButtonName),\n 'blockquote',\n 'code-block',\n ];\n }\n case 'headings': {\n const levels = group.headingLevels ?? DEFAULT_HEADING_LEVELS;\n return levels.map((level) => `h${level}` as TiptapButtonName);\n }\n case 'lists':\n return ['unordered-list', 'ordered-list'];\n case 'align':\n return ['align-left', 'align-center', 'align-right', 'align-justify'];\n default:\n return [];\n }\n}\n\nexport function getToolbarGroupItems(group: ToolbarGroup): TiptapButtonName[] {\n return expandPresetItems(group);\n}\n\nexport function flattenToolbarButtonNames(nodes: ToolbarNode[]): TiptapButtonName[] {\n const names: TiptapButtonName[] = [];\n\n nodes.forEach((node) => {\n if (node.type === 'button') {\n names.push(node.name);\n return;\n }\n\n if (node.type === 'group') {\n names.push(...getToolbarGroupItems(node.group));\n }\n });\n\n return names;\n}\n\nexport function toolbarIncludesButton(nodes: ToolbarNode[], buttonName: string): boolean {\n return flattenToolbarButtonNames(nodes).includes(buttonName as TiptapButtonName);\n}\n\nfunction normalizeGroupItemDefinition(raw: unknown): ToolbarGroupItemDefinition | null {\n if (typeof raw === 'string') {\n const token = raw.trim();\n\n if (!token) {\n return null;\n }\n\n if (isToolbarSeparatorToken(token)) {\n return token;\n }\n\n if (token === 'paragraph') {\n return 'paragraph';\n }\n\n return normalizeButtonName(token);\n }\n\n if (!raw || typeof raw !== 'object') {\n return null;\n }\n\n const record = raw as Record<string, unknown>;\n\n if (record.type === 'separator') {\n return { type: 'separator' };\n }\n\n if (record.type === 'item' && typeof record.name === 'string') {\n if (record.name === 'paragraph') {\n return 'paragraph';\n }\n\n return normalizeButtonName(record.name);\n }\n\n return null;\n}\n\nfunction normalizeGroupItemDefinitions(raw: unknown[]): ToolbarGroupItemDefinition[] {\n return raw\n .map((item) => normalizeGroupItemDefinition(item))\n .filter((item): item is ToolbarGroupItemDefinition => item !== null);\n}\n\nfunction isGroupItemSeparator(item: ToolbarGroupItemDefinition): boolean {\n return item === '|' || item === 'separator' || (typeof item === 'object' && item.type === 'separator');\n}\n\nfunction isToolbarGroupMenuButton(item: ToolbarGroupItemDefinition): item is ToolbarGroupMenuButton {\n return !isGroupItemSeparator(item);\n}\n\nfunction groupItemDefinitionsToMenuEntries(items: ToolbarGroupItemDefinition[]): ToolbarGroupMenuEntry[] {\n return items.flatMap((item) => {\n if (isGroupItemSeparator(item)) {\n return [{ type: 'separator' as const }];\n }\n\n if (!isToolbarGroupMenuButton(item)) {\n return [];\n }\n\n return [{ type: 'item' as const, name: item }];\n });\n}\n\nfunction getToolbarGroupMenuButtons(group: ToolbarGroup): ToolbarGroupMenuButton[] {\n return getToolbarGroupMenuItems(group)\n .filter((entry): entry is { type: 'item'; name: ToolbarGroupMenuButton } => entry.type === 'item')\n .map((entry) => entry.name);\n}\n\nfunction normalizeButtonName(value: string): TiptapButtonName | null {\n return isTiptapButtonName(value) ? value : null;\n}\n\nfunction normalizeHeadingLevels(value: unknown): ToolbarHeadingLevel[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n\n const levels = value\n .map((level) => Number(level))\n .filter((level): level is ToolbarHeadingLevel => [1, 2, 3, 4, 5, 6].includes(level));\n\n return levels.length > 0 ? levels : undefined;\n}\n\nfunction normalizeToolbarGroup(raw: Record<string, unknown>): ToolbarGroupNode | null {\n const source = typeof raw.group === 'object' && raw.group !== null\n ? raw.group as Record<string, unknown>\n : raw;\n\n const preset = typeof source.preset === 'string' ? source.preset : undefined;\n const label = typeof source.label === 'string' ? source.label : undefined;\n const iconRaw = typeof source.icon === 'string' ? source.icon : undefined;\n const icon = iconRaw ? normalizeButtonName(iconRaw) ?? undefined : undefined;\n const headingLevels = normalizeHeadingLevels(source.headingLevels);\n\n const items = Array.isArray(source.items)\n ? normalizeGroupItemDefinitions(source.items)\n : undefined;\n\n if (!preset && !items?.length) {\n return null;\n }\n\n if (preset && !VALID_PRESETS.has(preset)) {\n return null;\n }\n\n return {\n type: 'group',\n group: {\n ...(label ? { label } : {}),\n ...(icon ? { icon } : {}),\n ...(preset ? { preset: preset as ToolbarGroupPreset } : {}),\n ...(items?.length ? { items } : {}),\n ...(headingLevels ? { headingLevels } : {}),\n },\n };\n}\n\nfunction normalizeToolbarNode(raw: unknown): ToolbarNode | null {\n if (typeof raw === 'string') {\n const token = raw.trim();\n\n if (!token) {\n return null;\n }\n\n if (isToolbarSeparatorToken(token)) {\n return { type: 'separator' };\n }\n\n const buttonName = normalizeButtonName(token);\n\n return buttonName ? { type: 'button', name: buttonName } : null;\n }\n\n if (!raw || typeof raw !== 'object') {\n return null;\n }\n\n const record = raw as Record<string, unknown>;\n\n if (record.type === 'separator') {\n return { type: 'separator' };\n }\n\n if (record.type === 'button' && typeof record.name === 'string') {\n const buttonName = normalizeButtonName(record.name);\n return buttonName ? { type: 'button', name: buttonName } : null;\n }\n\n if (record.type === 'group' || record.preset || record.items || record.group) {\n return normalizeToolbarGroup(record);\n }\n\n if (typeof record.button === 'string') {\n const buttonName = normalizeButtonName(record.button);\n return buttonName ? { type: 'button', name: buttonName } : null;\n }\n\n return null;\n}\n\nexport function normalizeToolbarNodes(raw: unknown[]): ToolbarNode[] {\n return raw\n .map((item) => normalizeToolbarNode(item))\n .filter((item): item is ToolbarNode => item !== null);\n}\n\nexport function parseToolbarConfig(input: unknown): ToolbarNode[] {\n if (input === null || input === undefined || input === '') {\n return [\n { type: 'button', name: 'bold' },\n { type: 'button', name: 'italic' },\n ];\n }\n\n if (Array.isArray(input)) {\n const normalized = normalizeToolbarNodes(input);\n return normalized.length > 0 ? normalized : [\n { type: 'button', name: 'bold' },\n { type: 'button', name: 'italic' },\n ];\n }\n\n if (typeof input === 'string') {\n const trimmed = input.trim();\n\n if (!trimmed) {\n return [\n { type: 'button', name: 'bold' },\n { type: 'button', name: 'italic' },\n ];\n }\n\n if (trimmed.startsWith('[')) {\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return Array.isArray(parsed) ? parseToolbarConfig(parsed) : parseToolbarConfig(null);\n } catch {\n return parseToolbarConfig(null);\n }\n }\n\n return parseToolbarConfig(\n trimmed\n .split(',')\n .map((token) => token.trim())\n .filter(Boolean),\n );\n }\n\n return parseToolbarConfig(null);\n}\n\nexport function runToolbarButton(\n editor: Editor,\n buttonName: string,\n options: RunTiptapButtonOptions = {},\n): boolean {\n if (buttonName === 'paragraph') {\n return editor.chain().focus().setParagraph().run();\n }\n\n return runTiptapButton(editor, buttonName, options);\n}\n\nexport function isToolbarButtonActive(editor: Editor, buttonName: string): boolean {\n if (buttonName === 'paragraph') {\n return editor.isActive('paragraph') && !editor.isActive('heading');\n }\n\n return isTiptapButtonActive(editor, buttonName);\n}\n\nfunction getActiveHeadingLevel(editor: Editor): ToolbarHeadingLevel | null {\n for (const level of [1, 2, 3, 4, 5, 6] as const) {\n if (editor.isActive('heading', { level })) {\n return level;\n }\n }\n\n return null;\n}\n\nexport function getToolbarGroupTriggerState(\n editor: Editor,\n group: ToolbarGroup,\n): ToolbarGroupTriggerState {\n const fallbackIcon = group.icon ?? getToolbarGroupDefaultIcon(group);\n const menuButtons = getToolbarGroupMenuButtons(group);\n\n if (isHeadingsOnlyToolbarPreset(group.preset)) {\n const activeLevel = getActiveHeadingLevel(editor);\n\n if (activeLevel) {\n const name = `h${activeLevel}` as TiptapButtonName;\n return {\n activeName: name,\n label: `H${activeLevel}`,\n isActive: true,\n icon: name,\n };\n }\n\n return {\n activeName: null,\n label: '',\n isActive: false,\n icon: 'heading',\n };\n }\n\n if (isFormattingToolbarPreset(group.preset)) {\n const activeLevel = getActiveHeadingLevel(editor);\n\n if (activeLevel) {\n const name = `h${activeLevel}` as TiptapButtonName;\n return {\n activeName: name,\n label: `H${activeLevel}`,\n isActive: true,\n icon: name,\n };\n }\n\n if (isToolbarButtonActive(editor, 'blockquote')) {\n return {\n activeName: 'blockquote',\n label: '',\n isActive: true,\n icon: 'blockquote',\n };\n }\n\n if (isToolbarButtonActive(editor, 'code-block')) {\n return {\n activeName: 'code-block',\n label: '',\n isActive: true,\n icon: 'code-block',\n };\n }\n\n return {\n activeName: 'paragraph',\n label: 'Text',\n isActive: isToolbarButtonActive(editor, 'paragraph'),\n icon: 'paragraph',\n };\n }\n\n const activeName = menuButtons.find((name) => isToolbarButtonActive(editor, name)) ?? null;\n\n if (activeName) {\n const icon = activeName === 'paragraph'\n ? 'paragraph'\n : (isTiptapButtonName(activeName) ? activeName : fallbackIcon);\n\n return {\n activeName: activeName === 'paragraph' ? 'paragraph' : activeName,\n label: activeName === 'paragraph' ? 'Text' : (group.label ?? activeName),\n isActive: true,\n icon,\n };\n }\n\n return {\n activeName: null,\n label: group.label ?? '',\n isActive: false,\n icon: fallbackIcon,\n };\n}\n\nfunction getFormattingHeadingLevels(group: ToolbarGroup): ToolbarHeadingLevel[] {\n return group.headingLevels ?? DEFAULT_HEADING_LEVELS;\n}\n\nfunction getFormattingMenuEntries(group: ToolbarGroup): ToolbarGroupMenuEntry[] {\n const headings = getFormattingHeadingLevels(group).map((level) => ({\n type: 'item' as const,\n name: `h${level}` as TiptapButtonName,\n }));\n\n return [\n { type: 'item', name: 'paragraph' },\n { type: 'separator' },\n ...headings,\n { type: 'separator' },\n { type: 'item', name: 'blockquote' },\n { type: 'item', name: 'code-block' },\n ];\n}\n\nexport function getToolbarGroupMenuItems(group: ToolbarGroup): ToolbarGroupMenuEntry[] {\n if (group.items?.length) {\n return groupItemDefinitionsToMenuEntries(group.items);\n }\n\n if (isFormattingToolbarPreset(group.preset)) {\n return getFormattingMenuEntries(group);\n }\n\n return getToolbarGroupItems(group).map((name) => ({ type: 'item', name }));\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type VariableOption = {
|
|
2
|
+
label: string;
|
|
3
|
+
value: string;
|
|
4
|
+
children?: VariableOption[];
|
|
5
|
+
/** For child items: selector | format | value. */
|
|
6
|
+
type?: string;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
};
|
|
9
|
+
export type VariableCategories = Record<string, VariableOption[]>;
|
|
10
|
+
//# sourceMappingURL=variable-option.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variable-option.d.ts","sourceRoot":"","sources":["../../src/types/variable-option.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC"}
|
|
File without changes
|
package/package.json
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@verbb/plugin-kit-tiptap-core",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"CHANGELOG.md",
|
|
11
|
+
"LICENSE.md"
|
|
12
|
+
],
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://github.com/verbb/plugin-kit.git",
|
|
16
|
+
"directory": "plugin-kit-tiptap-core"
|
|
17
|
+
},
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/verbb/plugin-kit/issues"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://docs.verbb.io/plugin-kit",
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=20.0.0"
|
|
24
|
+
},
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"import": "./dist/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./serialization/editor": {
|
|
34
|
+
"types": "./dist/serialization/editor.d.ts",
|
|
35
|
+
"import": "./dist/serialization/editor.js"
|
|
36
|
+
},
|
|
37
|
+
"./serialization/input": {
|
|
38
|
+
"types": "./dist/serialization/input.d.ts",
|
|
39
|
+
"import": "./dist/serialization/input.js"
|
|
40
|
+
},
|
|
41
|
+
"./links": {
|
|
42
|
+
"types": "./dist/links/index.d.ts",
|
|
43
|
+
"import": "./dist/links/index.js"
|
|
44
|
+
},
|
|
45
|
+
"./extensions": {
|
|
46
|
+
"types": "./dist/extensions/index.d.ts",
|
|
47
|
+
"import": "./dist/extensions/index.js"
|
|
48
|
+
},
|
|
49
|
+
"./toolbar": {
|
|
50
|
+
"types": "./dist/toolbar/index.d.ts",
|
|
51
|
+
"import": "./dist/toolbar/index.js"
|
|
52
|
+
},
|
|
53
|
+
"./package.json": "./package.json"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "vite build",
|
|
57
|
+
"dev": "vite build --watch",
|
|
58
|
+
"test": "vitest run"
|
|
59
|
+
},
|
|
60
|
+
"license": "MIT",
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"@tiptap/core": "^3.22.4",
|
|
63
|
+
"@tiptap/extension-blockquote": "^3.22.4",
|
|
64
|
+
"@tiptap/extension-bold": "^3.22.4",
|
|
65
|
+
"@tiptap/extension-bullet-list": "^3.22.4",
|
|
66
|
+
"@tiptap/extension-code": "^3.22.4",
|
|
67
|
+
"@tiptap/extension-code-block": "^3.22.4",
|
|
68
|
+
"@tiptap/extension-document": "^3.22.4",
|
|
69
|
+
"@tiptap/extension-dropcursor": "^3.22.4",
|
|
70
|
+
"@tiptap/extension-gapcursor": "^3.22.4",
|
|
71
|
+
"@tiptap/extension-hard-break": "^3.22.4",
|
|
72
|
+
"@tiptap/extension-heading": "^3.22.4",
|
|
73
|
+
"@tiptap/extension-highlight": "^3.22.4",
|
|
74
|
+
"@tiptap/extension-history": "^3.22.4",
|
|
75
|
+
"@tiptap/extension-horizontal-rule": "^3.22.4",
|
|
76
|
+
"@tiptap/extension-italic": "^3.22.4",
|
|
77
|
+
"@tiptap/extension-link": "^3.22.4",
|
|
78
|
+
"@tiptap/extension-list-item": "^3.22.4",
|
|
79
|
+
"@tiptap/extension-ordered-list": "^3.22.4",
|
|
80
|
+
"@tiptap/extension-paragraph": "^3.22.4",
|
|
81
|
+
"@tiptap/extension-strike": "^3.22.4",
|
|
82
|
+
"@tiptap/extension-subscript": "^3.22.4",
|
|
83
|
+
"@tiptap/extension-superscript": "^3.22.4",
|
|
84
|
+
"@tiptap/extension-table": "^3.22.4",
|
|
85
|
+
"@tiptap/extension-table-cell": "^3.22.4",
|
|
86
|
+
"@tiptap/extension-table-header": "^3.22.4",
|
|
87
|
+
"@tiptap/extension-table-row": "^3.22.4",
|
|
88
|
+
"@tiptap/extension-text": "^3.22.4",
|
|
89
|
+
"@tiptap/extension-text-align": "^3.22.4",
|
|
90
|
+
"@tiptap/extension-underline": "^3.22.4",
|
|
91
|
+
"@tiptap/pm": "^3.22.4"
|
|
92
|
+
},
|
|
93
|
+
"devDependencies": {
|
|
94
|
+
"typescript": "^6.0.3",
|
|
95
|
+
"vite": "^8.0.10",
|
|
96
|
+
"vite-plugin-dts": "^4.5.4",
|
|
97
|
+
"vitest": "^4.1.5"
|
|
98
|
+
}
|
|
99
|
+
}
|