@plasmicpkgs/tiptap 0.0.1

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.
Files changed (103) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +1 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/components/MentionList.d.ts +12 -0
  5. package/dist/contexts.d.ts +30 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +1400 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/registerBold.d.ts +9 -0
  10. package/dist/registerCode.d.ts +9 -0
  11. package/dist/registerItalic.d.ts +9 -0
  12. package/dist/registerLink.d.ts +9 -0
  13. package/dist/registerMention.d.ts +28 -0
  14. package/dist/registerStrike.d.ts +9 -0
  15. package/dist/registerTiptap.d.ts +18 -0
  16. package/dist/registerUnderline.d.ts +9 -0
  17. package/dist/tiptap.esm.js +1382 -0
  18. package/dist/tiptap.esm.js.map +1 -0
  19. package/dist/toolbar/registerToolbarBold.d.ts +13 -0
  20. package/dist/toolbar/registerToolbarCode.d.ts +13 -0
  21. package/dist/toolbar/registerToolbarItalic.d.ts +13 -0
  22. package/dist/toolbar/registerToolbarLink.d.ts +13 -0
  23. package/dist/toolbar/registerToolbarMention.d.ts +13 -0
  24. package/dist/toolbar/registerToolbarStrike.d.ts +13 -0
  25. package/dist/toolbar/registerToolbarUnderline.d.ts +13 -0
  26. package/dist/useIsClient.d.ts +3 -0
  27. package/dist/utils.d.ts +24 -0
  28. package/package.json +103 -0
  29. package/skinny/contexts.d.ts +30 -0
  30. package/skinny/registerBold.cjs.js +48 -0
  31. package/skinny/registerBold.cjs.js.map +1 -0
  32. package/skinny/registerBold.d.ts +9 -0
  33. package/skinny/registerBold.esm.js +41 -0
  34. package/skinny/registerBold.esm.js.map +1 -0
  35. package/skinny/registerCode.cjs.js +48 -0
  36. package/skinny/registerCode.cjs.js.map +1 -0
  37. package/skinny/registerCode.d.ts +9 -0
  38. package/skinny/registerCode.esm.js +41 -0
  39. package/skinny/registerCode.esm.js.map +1 -0
  40. package/skinny/registerItalic.cjs.js +48 -0
  41. package/skinny/registerItalic.cjs.js.map +1 -0
  42. package/skinny/registerItalic.d.ts +9 -0
  43. package/skinny/registerItalic.esm.js +41 -0
  44. package/skinny/registerItalic.esm.js.map +1 -0
  45. package/skinny/registerLink.cjs.js +48 -0
  46. package/skinny/registerLink.cjs.js.map +1 -0
  47. package/skinny/registerLink.d.ts +9 -0
  48. package/skinny/registerLink.esm.js +41 -0
  49. package/skinny/registerLink.esm.js.map +1 -0
  50. package/skinny/registerMention.cjs.js +420 -0
  51. package/skinny/registerMention.cjs.js.map +1 -0
  52. package/skinny/registerMention.d.ts +28 -0
  53. package/skinny/registerMention.esm.js +411 -0
  54. package/skinny/registerMention.esm.js.map +1 -0
  55. package/skinny/registerStrike.cjs.js +48 -0
  56. package/skinny/registerStrike.cjs.js.map +1 -0
  57. package/skinny/registerStrike.d.ts +9 -0
  58. package/skinny/registerStrike.esm.js +41 -0
  59. package/skinny/registerStrike.esm.js.map +1 -0
  60. package/skinny/registerTiptap-6a2d0bb4.esm.js +375 -0
  61. package/skinny/registerTiptap-6a2d0bb4.esm.js.map +1 -0
  62. package/skinny/registerTiptap-fd9bf882.cjs.js +391 -0
  63. package/skinny/registerTiptap-fd9bf882.cjs.js.map +1 -0
  64. package/skinny/registerTiptap.cjs.js +20 -0
  65. package/skinny/registerTiptap.cjs.js.map +1 -0
  66. package/skinny/registerTiptap.d.ts +18 -0
  67. package/skinny/registerTiptap.esm.js +10 -0
  68. package/skinny/registerTiptap.esm.js.map +1 -0
  69. package/skinny/registerToolbarBold.cjs.js +78 -0
  70. package/skinny/registerToolbarBold.cjs.js.map +1 -0
  71. package/skinny/registerToolbarBold.esm.js +71 -0
  72. package/skinny/registerToolbarBold.esm.js.map +1 -0
  73. package/skinny/registerToolbarCode.cjs.js +78 -0
  74. package/skinny/registerToolbarCode.cjs.js.map +1 -0
  75. package/skinny/registerToolbarCode.esm.js +71 -0
  76. package/skinny/registerToolbarCode.esm.js.map +1 -0
  77. package/skinny/registerToolbarItalic.cjs.js +81 -0
  78. package/skinny/registerToolbarItalic.cjs.js.map +1 -0
  79. package/skinny/registerToolbarItalic.esm.js +74 -0
  80. package/skinny/registerToolbarItalic.esm.js.map +1 -0
  81. package/skinny/registerToolbarLink.cjs.js +78 -0
  82. package/skinny/registerToolbarLink.cjs.js.map +1 -0
  83. package/skinny/registerToolbarLink.esm.js +71 -0
  84. package/skinny/registerToolbarLink.esm.js.map +1 -0
  85. package/skinny/registerToolbarMention.cjs.js +78 -0
  86. package/skinny/registerToolbarMention.cjs.js.map +1 -0
  87. package/skinny/registerToolbarMention.esm.js +71 -0
  88. package/skinny/registerToolbarMention.esm.js.map +1 -0
  89. package/skinny/registerToolbarStrike.cjs.js +78 -0
  90. package/skinny/registerToolbarStrike.cjs.js.map +1 -0
  91. package/skinny/registerToolbarStrike.esm.js +71 -0
  92. package/skinny/registerToolbarStrike.esm.js.map +1 -0
  93. package/skinny/registerToolbarUnderline.cjs.js +78 -0
  94. package/skinny/registerToolbarUnderline.cjs.js.map +1 -0
  95. package/skinny/registerToolbarUnderline.esm.js +71 -0
  96. package/skinny/registerToolbarUnderline.esm.js.map +1 -0
  97. package/skinny/registerUnderline.cjs.js +48 -0
  98. package/skinny/registerUnderline.cjs.js.map +1 -0
  99. package/skinny/registerUnderline.d.ts +9 -0
  100. package/skinny/registerUnderline.esm.js +41 -0
  101. package/skinny/registerUnderline.esm.js.map +1 -0
  102. package/skinny/useIsClient.d.ts +3 -0
  103. package/skinny/utils.d.ts +24 -0
package/dist/index.js ADDED
@@ -0,0 +1,1400 @@
1
+ 'use strict';
2
+
3
+ var TiptapBold = require('@tiptap/extension-bold');
4
+ var React = require('react');
5
+ var Document = require('@tiptap/extension-document');
6
+ var Paragraph = require('@tiptap/extension-paragraph');
7
+ var Text = require('@tiptap/extension-text');
8
+ var react = require('@tiptap/react');
9
+ var antd = require('antd');
10
+ var registerComponent = require('@plasmicapp/host/registerComponent');
11
+ require('@plasmicapp/host/registerGlobalContext');
12
+ var TiptapCode = require('@tiptap/extension-code');
13
+ var TiptapItalic = require('@tiptap/extension-italic');
14
+ var TiptapLink = require('@tiptap/extension-link');
15
+ var host = require('@plasmicapp/host');
16
+ var TiptapMention = require('@tiptap/extension-mention');
17
+ var tippy = require('tippy.js');
18
+ var TiptapStrike = require('@tiptap/extension-strike');
19
+ var TiptapUnderline = require('@tiptap/extension-underline');
20
+
21
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
22
+
23
+ var TiptapBold__default = /*#__PURE__*/_interopDefault(TiptapBold);
24
+ var React__default = /*#__PURE__*/_interopDefault(React);
25
+ var Document__default = /*#__PURE__*/_interopDefault(Document);
26
+ var Paragraph__default = /*#__PURE__*/_interopDefault(Paragraph);
27
+ var Text__default = /*#__PURE__*/_interopDefault(Text);
28
+ var registerComponent__default = /*#__PURE__*/_interopDefault(registerComponent);
29
+ var TiptapCode__default = /*#__PURE__*/_interopDefault(TiptapCode);
30
+ var TiptapItalic__default = /*#__PURE__*/_interopDefault(TiptapItalic);
31
+ var TiptapLink__default = /*#__PURE__*/_interopDefault(TiptapLink);
32
+ var TiptapMention__default = /*#__PURE__*/_interopDefault(TiptapMention);
33
+ var tippy__default = /*#__PURE__*/_interopDefault(tippy);
34
+ var TiptapStrike__default = /*#__PURE__*/_interopDefault(TiptapStrike);
35
+ var TiptapUnderline__default = /*#__PURE__*/_interopDefault(TiptapUnderline);
36
+
37
+ const RESET_TIMEOUT_MS = 500;
38
+ const allExtensions = [
39
+ "bold",
40
+ "italic",
41
+ "underline",
42
+ "strike",
43
+ "code",
44
+ "link",
45
+ "mention"
46
+ ];
47
+ const TiptapContext = React__default.default.createContext(void 0);
48
+ const useTiptapContext = () => {
49
+ const context = React__default.default.useContext(TiptapContext);
50
+ if (!context) {
51
+ throw new Error(
52
+ "useTiptapContext must be used within a TiptapContextProvider"
53
+ );
54
+ }
55
+ return context;
56
+ };
57
+ const TiptapContextProvider = ({ children }) => {
58
+ const [bold, setBold] = React.useState(void 0);
59
+ const [code, setCode] = React.useState(void 0);
60
+ const [italic, setItalic] = React.useState(
61
+ void 0
62
+ );
63
+ const [link, setLink] = React.useState(void 0);
64
+ const [mention, setMention] = React.useState(
65
+ void 0
66
+ );
67
+ const [strike, setStrike] = React.useState(
68
+ void 0
69
+ );
70
+ const [underline, setUnderline] = React.useState(void 0);
71
+ return /* @__PURE__ */ React__default.default.createElement(
72
+ TiptapContext.Provider,
73
+ {
74
+ value: {
75
+ bold,
76
+ setBold,
77
+ code,
78
+ setCode,
79
+ italic,
80
+ setItalic,
81
+ link,
82
+ setLink,
83
+ mention,
84
+ /**
85
+ * In situations where I want to remove an extension and add it again with new options (e.g. within a useEffect - see registerMention)
86
+ * the options are not updated.
87
+ * So after removing the extension, I want to wait a few seconds before I add it again,
88
+ * so the Tiptap editor acknowledges the removal before it adds the extension back with new updated options.
89
+ * @param mentionOptions
90
+ * @returns
91
+ */
92
+ setMention: (mentionOptions) => {
93
+ if (!mentionOptions) {
94
+ setMention(mentionOptions);
95
+ return;
96
+ }
97
+ setTimeout(() => {
98
+ setMention(mentionOptions);
99
+ }, RESET_TIMEOUT_MS);
100
+ },
101
+ strike,
102
+ setStrike,
103
+ underline,
104
+ setUnderline
105
+ }
106
+ },
107
+ children
108
+ );
109
+ };
110
+
111
+ function useIsClient() {
112
+ const [loaded, setLoaded] = React__default.default.useState(false);
113
+ useIsomorphicLayoutEffect(() => {
114
+ setLoaded(true);
115
+ });
116
+ return loaded;
117
+ }
118
+ const isBrowser = typeof window !== "undefined";
119
+ const useIsomorphicLayoutEffect = isBrowser ? React__default.default.useLayoutEffect : React__default.default.useEffect;
120
+
121
+ function registerComponentHelper(loader, component, meta) {
122
+ if (loader) {
123
+ loader.registerComponent(component, meta);
124
+ } else {
125
+ registerComponent__default.default(component, meta);
126
+ }
127
+ }
128
+ function traverseReactEltTree(children, callback) {
129
+ const rec = (elts) => {
130
+ (Array.isArray(elts) ? elts : [elts]).forEach((elt) => {
131
+ var _a;
132
+ if (elt) {
133
+ callback(elt);
134
+ if (elt.children) {
135
+ rec(elt.children);
136
+ }
137
+ if (((_a = elt.props) == null ? void 0 : _a.children) && elt.props.children !== elt.children) {
138
+ rec(elt.props.children);
139
+ }
140
+ }
141
+ });
142
+ };
143
+ rec(children);
144
+ }
145
+
146
+ var __defProp$1 = Object.defineProperty;
147
+ var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
148
+ var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
149
+ var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
150
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
151
+ var __spreadValues$1 = (a, b) => {
152
+ for (var prop in b || (b = {}))
153
+ if (__hasOwnProp$1.call(b, prop))
154
+ __defNormalProp$1(a, prop, b[prop]);
155
+ if (__getOwnPropSymbols$1)
156
+ for (var prop of __getOwnPropSymbols$1(b)) {
157
+ if (__propIsEnum$1.call(b, prop))
158
+ __defNormalProp$1(a, prop, b[prop]);
159
+ }
160
+ return a;
161
+ };
162
+ var __objRest = (source, exclude) => {
163
+ var target = {};
164
+ for (var prop in source)
165
+ if (__hasOwnProp$1.call(source, prop) && exclude.indexOf(prop) < 0)
166
+ target[prop] = source[prop];
167
+ if (source != null && __getOwnPropSymbols$1)
168
+ for (var prop of __getOwnPropSymbols$1(source)) {
169
+ if (exclude.indexOf(prop) < 0 && __propIsEnum$1.call(source, prop))
170
+ target[prop] = source[prop];
171
+ }
172
+ return target;
173
+ };
174
+ const TIPTAP_COMPONENT_NAME = "hostless-tiptap";
175
+ function Tiptap(props) {
176
+ const isClient = useIsClient();
177
+ const [active, setActive] = React.useState(false);
178
+ const [refreshKey, setRefreshKey] = React.useState(0);
179
+ const activeRef = React.useRef();
180
+ activeRef.current = active;
181
+ const {
182
+ extensions,
183
+ contentHtml,
184
+ defaultContentHtml,
185
+ className,
186
+ onChange,
187
+ toolbar
188
+ } = props;
189
+ const tiptapContext = __objRest(useTiptapContext(), []);
190
+ const usedExtensions = allExtensions.reduce(
191
+ (acc, ext) => {
192
+ if (tiptapContext[ext] !== void 0) {
193
+ acc[ext] = tiptapContext[ext];
194
+ }
195
+ return acc;
196
+ },
197
+ {}
198
+ );
199
+ const extensionsProp = [
200
+ Document__default.default,
201
+ Paragraph__default.default,
202
+ Text__default.default,
203
+ ...Object.values(usedExtensions)
204
+ ];
205
+ React.useEffect(() => {
206
+ if (activeRef.current)
207
+ return;
208
+ setRefreshKey(Math.random() * 1e6);
209
+ }, [contentHtml]);
210
+ if (!isClient) {
211
+ return null;
212
+ }
213
+ const css = `
214
+ .tiptap {
215
+ padding: 0;
216
+ outline: none;
217
+ }
218
+ `;
219
+ const toolbarProp = toolbar ? /* @__PURE__ */ React__default.default.createElement("div", { style: { display: "flex", alignItems: "center" } }, toolbar) : null;
220
+ return /* @__PURE__ */ React__default.default.createElement("div", { className, style: { position: "relative" } }, /* @__PURE__ */ React__default.default.createElement(
221
+ react.EditorProvider,
222
+ {
223
+ key: `${extensionsProp.length}${refreshKey}`,
224
+ extensions: extensionsProp,
225
+ content: contentHtml || defaultContentHtml,
226
+ onCreate: ({ editor }) => {
227
+ onChange(editor.getJSON());
228
+ },
229
+ onUpdate: ({ editor }) => {
230
+ onChange(editor.getJSON());
231
+ },
232
+ onFocus: () => setActive(true),
233
+ onBlur: () => setActive(false),
234
+ slotBefore: toolbarProp,
235
+ children: void 0,
236
+ editorProps: {
237
+ attributes: {
238
+ className
239
+ }
240
+ }
241
+ }
242
+ ), extensions, /* @__PURE__ */ React__default.default.createElement("style", { dangerouslySetInnerHTML: { __html: css } }));
243
+ }
244
+ function TiptapWrapper(props) {
245
+ return /* @__PURE__ */ React__default.default.createElement(TiptapContextProvider, null, /* @__PURE__ */ React__default.default.createElement(Tiptap, __spreadValues$1({}, props)));
246
+ }
247
+ function AddExtension({
248
+ studioOps,
249
+ componentProps
250
+ }) {
251
+ const usedExtensions = React.useMemo(() => {
252
+ const list = [];
253
+ traverseReactEltTree(componentProps == null ? void 0 : componentProps.extensions, (elt) => {
254
+ var _a, _b, _c;
255
+ const ext = (_c = (_b = (_a = elt == null ? void 0 : elt.type) == null ? void 0 : _a.displayName) == null ? void 0 : _b.toLowerCase) == null ? void 0 : _c.call(_b);
256
+ if (ext) {
257
+ list.push(ext);
258
+ }
259
+ });
260
+ return list;
261
+ }, [componentProps == null ? void 0 : componentProps.extensions]);
262
+ const usedExtensionTools = React.useMemo(() => {
263
+ const list = [];
264
+ traverseReactEltTree(componentProps == null ? void 0 : componentProps.toolbar, (elt) => {
265
+ var _a, _b, _c;
266
+ const ext = (_c = (_b = (_a = elt == null ? void 0 : elt.type) == null ? void 0 : _a.displayName) == null ? void 0 : _b.toLowerCase) == null ? void 0 : _c.call(_b);
267
+ if (ext && ext.includes("toolbar")) {
268
+ list.push(ext.replace("toolbar", ""));
269
+ }
270
+ });
271
+ return list;
272
+ }, [componentProps == null ? void 0 : componentProps.toolbar]);
273
+ const handleChange = (extName, add) => {
274
+ if (add) {
275
+ studioOps.appendToSlot(
276
+ {
277
+ type: "component",
278
+ name: `${TIPTAP_COMPONENT_NAME}-extension-${extName}`,
279
+ props: {}
280
+ },
281
+ "extensions"
282
+ );
283
+ studioOps.appendToSlot(
284
+ {
285
+ type: "component",
286
+ name: `${TIPTAP_COMPONENT_NAME}-toolbar-${extName}`,
287
+ props: {}
288
+ },
289
+ "toolbar"
290
+ );
291
+ } else {
292
+ const extIndices = usedExtensions.flatMap(
293
+ (ext, i) => ext === extName ? i : []
294
+ );
295
+ extIndices.reverse().forEach(
296
+ (i) => i !== -1 && studioOps.removeFromSlotAt(i, "extensions")
297
+ );
298
+ const toolIndices = usedExtensionTools.flatMap(
299
+ (ext, i) => ext === extName ? i : []
300
+ );
301
+ toolIndices.reverse().forEach((i) => i !== -1 && studioOps.removeFromSlotAt(i, "toolbar"));
302
+ }
303
+ };
304
+ return /* @__PURE__ */ React__default.default.createElement(
305
+ "div",
306
+ {
307
+ style: {
308
+ marginBottom: 10,
309
+ paddingBottom: 10,
310
+ borderBottom: "1px dashed #ccc"
311
+ }
312
+ },
313
+ /* @__PURE__ */ React__default.default.createElement("p", null, "You can add capabilities to Tiptap Rich Text Editor using the tools below."),
314
+ /* @__PURE__ */ React__default.default.createElement("p", null, `To further customize the extensions, find them under the Editor's "extensions" and "toolbar" slots`),
315
+ allExtensions.map((ext) => /* @__PURE__ */ React__default.default.createElement(
316
+ "label",
317
+ {
318
+ "data-test-id": `custom-action-${ext}`,
319
+ style: {
320
+ display: "flex",
321
+ justifyContent: "space-between",
322
+ marginBottom: 5,
323
+ color: "#1b1b18"
324
+ }
325
+ },
326
+ /* @__PURE__ */ React__default.default.createElement("span", null, ext),
327
+ /* @__PURE__ */ React__default.default.createElement(
328
+ antd.Switch,
329
+ {
330
+ size: "small",
331
+ checked: usedExtensions.includes(ext) || usedExtensionTools.includes(ext),
332
+ onChange: (checked) => handleChange(ext, checked)
333
+ }
334
+ )
335
+ ))
336
+ );
337
+ }
338
+ function registerTiptap(loader) {
339
+ registerComponentHelper(loader, TiptapWrapper, {
340
+ name: TIPTAP_COMPONENT_NAME,
341
+ displayName: "Tiptap Rich Text Editor",
342
+ defaultStyles: {
343
+ borderWidth: "1px",
344
+ borderStyle: "solid",
345
+ borderColor: "rgb(204,204,204)",
346
+ borderRadius: "4px",
347
+ padding: "10px",
348
+ width: "300px"
349
+ },
350
+ actions: [
351
+ {
352
+ type: "custom-action",
353
+ control: AddExtension
354
+ }
355
+ ],
356
+ props: {
357
+ contentHtml: {
358
+ type: "string",
359
+ displayName: "HTML Content",
360
+ editOnly: true,
361
+ uncontrolledProp: "defaultContentHtml",
362
+ description: "Contents of the editor"
363
+ },
364
+ contentJson: {
365
+ type: "object",
366
+ displayName: "JSON Content",
367
+ hidden: () => true
368
+ },
369
+ extensions: {
370
+ type: "slot",
371
+ hidePlaceholder: true,
372
+ allowedComponents: allExtensions.map(
373
+ (ext) => `${TIPTAP_COMPONENT_NAME}-extension-${ext}`
374
+ )
375
+ },
376
+ toolbar: {
377
+ type: "slot",
378
+ hidePlaceholder: true,
379
+ allowedComponents: allExtensions.map(
380
+ (ext) => `${TIPTAP_COMPONENT_NAME}-toolbar-${ext}`
381
+ )
382
+ },
383
+ onChange: {
384
+ type: "eventHandler",
385
+ argTypes: [{ name: "content", type: "object" }]
386
+ }
387
+ },
388
+ states: {
389
+ content: {
390
+ type: "writable",
391
+ variableType: "object",
392
+ valueProp: "contentJson",
393
+ onChangeProp: "onChange"
394
+ }
395
+ },
396
+ importName: "TiptapWrapper",
397
+ importPath: "@plasmicpkgs/tiptap/skinny/registerTiptap"
398
+ });
399
+ }
400
+
401
+ function Bold(props) {
402
+ const { setBold } = useTiptapContext();
403
+ React.useEffect(() => {
404
+ setBold(
405
+ TiptapBold__default.default.configure({
406
+ HTMLAttributes: {
407
+ class: props.className
408
+ }
409
+ })
410
+ );
411
+ return () => {
412
+ setBold(void 0);
413
+ };
414
+ }, []);
415
+ return null;
416
+ }
417
+ Bold.displayName = "Bold";
418
+ function registerBold(loader) {
419
+ registerComponentHelper(loader, Bold, {
420
+ name: `${TIPTAP_COMPONENT_NAME}-extension-bold`,
421
+ displayName: "Tiptap Bold",
422
+ props: {},
423
+ importName: "Bold",
424
+ importPath: "@plasmicpkgs/tiptap/skinny/registerBold",
425
+ parentComponentName: TIPTAP_COMPONENT_NAME
426
+ });
427
+ }
428
+
429
+ function Code(props) {
430
+ const { setCode } = useTiptapContext();
431
+ React.useEffect(() => {
432
+ setCode(
433
+ TiptapCode__default.default.configure({
434
+ HTMLAttributes: {
435
+ class: props.className
436
+ }
437
+ })
438
+ );
439
+ return () => {
440
+ setCode(void 0);
441
+ };
442
+ }, []);
443
+ return null;
444
+ }
445
+ Code.displayName = "Code";
446
+ function registerCode(loader) {
447
+ registerComponentHelper(loader, Code, {
448
+ name: `${TIPTAP_COMPONENT_NAME}-extension-code`,
449
+ displayName: "Tiptap Code",
450
+ props: {},
451
+ importName: "Code",
452
+ importPath: "@plasmicpkgs/tiptap/skinny/registerCode",
453
+ parentComponentName: TIPTAP_COMPONENT_NAME
454
+ });
455
+ }
456
+
457
+ function Italic(props) {
458
+ const { setItalic } = useTiptapContext();
459
+ React.useEffect(() => {
460
+ setItalic(
461
+ TiptapItalic__default.default.configure({
462
+ HTMLAttributes: {
463
+ class: props.className
464
+ }
465
+ })
466
+ );
467
+ return () => {
468
+ setItalic(void 0);
469
+ };
470
+ }, []);
471
+ return null;
472
+ }
473
+ Italic.displayName = "Italic";
474
+ function registerItalic(loader) {
475
+ registerComponentHelper(loader, Italic, {
476
+ name: `${TIPTAP_COMPONENT_NAME}-extension-italic`,
477
+ displayName: "Tiptap Italic",
478
+ props: {},
479
+ importName: "Italic",
480
+ importPath: "@plasmicpkgs/tiptap/skinny/registerItalic",
481
+ parentComponentName: TIPTAP_COMPONENT_NAME
482
+ });
483
+ }
484
+
485
+ function Link(props) {
486
+ const { setLink } = useTiptapContext();
487
+ React.useEffect(() => {
488
+ setLink(
489
+ TiptapLink__default.default.configure({
490
+ HTMLAttributes: {
491
+ class: props.className
492
+ }
493
+ })
494
+ );
495
+ return () => {
496
+ setLink(void 0);
497
+ };
498
+ }, []);
499
+ return null;
500
+ }
501
+ Link.displayName = "Link";
502
+ function registerLink(loader) {
503
+ registerComponentHelper(loader, Link, {
504
+ name: `${TIPTAP_COMPONENT_NAME}-extension-link`,
505
+ displayName: "Tiptap Link",
506
+ props: {},
507
+ importName: "Link",
508
+ importPath: "@plasmicpkgs/tiptap/skinny/registerLink",
509
+ parentComponentName: TIPTAP_COMPONENT_NAME
510
+ });
511
+ }
512
+
513
+ var MentionList = React.forwardRef(
514
+ (props, ref) => {
515
+ const [selectedIndex, setSelectedIndex] = React.useState(0);
516
+ const {
517
+ items = [],
518
+ suggestionItem,
519
+ searchField,
520
+ popupClassName,
521
+ itemClassName,
522
+ selectedItemClassName
523
+ } = props;
524
+ const selectItem = (index) => {
525
+ var _a;
526
+ const item = items[index];
527
+ if (item) {
528
+ (_a = props.command) == null ? void 0 : _a.call(props, { id: item[searchField] });
529
+ }
530
+ };
531
+ const upHandler = () => {
532
+ setSelectedIndex((selectedIndex + (items == null ? void 0 : items.length) - 1) % items.length);
533
+ };
534
+ const downHandler = () => {
535
+ setSelectedIndex((selectedIndex + 1) % items.length);
536
+ };
537
+ const enterHandler = () => {
538
+ selectItem(selectedIndex);
539
+ };
540
+ React.useEffect(() => setSelectedIndex(0), [items]);
541
+ React.useImperativeHandle(ref, () => ({
542
+ onKeyDown: (event) => {
543
+ if (event.key === "ArrowUp") {
544
+ upHandler();
545
+ return true;
546
+ }
547
+ if (event.key === "ArrowDown") {
548
+ downHandler();
549
+ return true;
550
+ }
551
+ if (event.key === "Enter") {
552
+ enterHandler();
553
+ return true;
554
+ }
555
+ return false;
556
+ }
557
+ }));
558
+ const css = `
559
+ .SuggestionsList {
560
+ background: #eee;
561
+ position: relative;
562
+ border-radius: 0.5rem;
563
+
564
+ & .item {
565
+ display: block;
566
+ width: 100%;
567
+
568
+ & .is-selected {
569
+ color: purple;
570
+ }
571
+ }
572
+ }
573
+
574
+ `;
575
+ const hasSuggestionItemSlot = suggestionItem == null ? void 0 : suggestionItem.props.children;
576
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: `SuggestionsList` }, /* @__PURE__ */ React__default.default.createElement("div", { className: popupClassName }, props.items.length ? props.items.map((item, index) => /* @__PURE__ */ React__default.default.createElement(
577
+ "div",
578
+ {
579
+ role: "button",
580
+ className: `item`,
581
+ key: index,
582
+ onClick: () => selectItem(index)
583
+ },
584
+ /* @__PURE__ */ React__default.default.createElement(
585
+ host.DataProvider,
586
+ {
587
+ key: item[searchField],
588
+ name: "suggestionItem",
589
+ data: item
590
+ },
591
+ /* @__PURE__ */ React__default.default.createElement(
592
+ "div",
593
+ {
594
+ className: `${itemClassName} ${index === selectedIndex ? "is-selected" : ""}`
595
+ },
596
+ /* @__PURE__ */ React__default.default.createElement(
597
+ "div",
598
+ {
599
+ className: index === selectedIndex ? selectedItemClassName : ""
600
+ },
601
+ hasSuggestionItemSlot ? host.repeatedElement(index === 0, suggestionItem) : item[searchField]
602
+ )
603
+ )
604
+ )
605
+ )) : /* @__PURE__ */ React__default.default.createElement("div", { className: "item" }, "No result")), /* @__PURE__ */ React__default.default.createElement("style", { dangerouslySetInnerHTML: { __html: css } }));
606
+ }
607
+ );
608
+
609
+ var __defProp = Object.defineProperty;
610
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
611
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
612
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
613
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
614
+ var __spreadValues = (a, b) => {
615
+ for (var prop in b || (b = {}))
616
+ if (__hasOwnProp.call(b, prop))
617
+ __defNormalProp(a, prop, b[prop]);
618
+ if (__getOwnPropSymbols)
619
+ for (var prop of __getOwnPropSymbols(b)) {
620
+ if (__propIsEnum.call(b, prop))
621
+ __defNormalProp(a, prop, b[prop]);
622
+ }
623
+ return a;
624
+ };
625
+ function Mention(props) {
626
+ const {
627
+ dataStatic = [],
628
+ dataDynamic,
629
+ hasDataDynamic,
630
+ suggestionItem,
631
+ searchField = "id",
632
+ popupClassName,
633
+ itemClassName,
634
+ selectedItemClassName,
635
+ mentionClassName,
636
+ maxSuggestionCount = 5
637
+ } = props;
638
+ const dataDynamicRef = React.useRef(dataDynamic);
639
+ const hasDataDynamicRef = React.useRef(hasDataDynamic);
640
+ const maxSuggestionCountRef = React.useRef(maxSuggestionCount);
641
+ dataDynamicRef.current = dataDynamic;
642
+ hasDataDynamicRef.current = hasDataDynamic;
643
+ maxSuggestionCountRef.current = maxSuggestionCount;
644
+ const { setMention } = useTiptapContext();
645
+ React.useEffect(() => {
646
+ setMention(
647
+ TiptapMention__default.default.configure({
648
+ HTMLAttributes: {
649
+ class: mentionClassName
650
+ },
651
+ renderLabel: ({ options, node }) => {
652
+ return `${options.suggestion.char}${node.attrs.id}`;
653
+ },
654
+ suggestion: {
655
+ /**
656
+ * This function below only does static filtering. It can't give query parameters to the Plasmic query for filtering at the server side to avoid some complexities.
657
+ *
658
+ * Before we move on to the issues, lets first explain how it could have supported server-side filtering via query params:
659
+ * - The user creates a plasmic query to fetch the suggestions. These suggestions are filtered by some query parameter. The value of the query parameter is bound to the currentMention state.
660
+ *
661
+ * - When the user types `@abc` for example, the following async function `items` is triggered. It knows the query and returns the new set of suggestions. The returned array is rendered in the suggestions popup
662
+ *
663
+ * Issues:
664
+ * 1. Stale Query issue:
665
+ * The same async function is responsible for setting the currentMention state, and also return the new suggestion results. We can't await the Plasmic query after it is triggered by the currentMention state change. So query results it has are stale.
666
+ *
667
+ * Solution: We poll the Plasmic query's isLoading field (indefinitely)
668
+ *
669
+ * For simplicity, therefore, we are just supporting static filtering for now, and may consider the approach highlighted above for filtering via query params.
670
+ *
671
+ * 2. The async function is provided at the time of extension initialization. That async function only knows the state/props in its render cycle, so these props are outdated at the time the async function is triggered.
672
+ *
673
+ * We can't put all of them in the useEffect dependencies array, because change in any of them will cause the Mention extension to be removed/re-added, resulting in a flicker on every keystroke + lost input focus (which causes the suggestion popup to never show)
674
+ *
675
+ * Solution: Use refs
676
+ *
677
+ * @param param0
678
+ * @returns
679
+ */
680
+ items: ({ query }) => {
681
+ var _a, _b;
682
+ if (!query)
683
+ return [];
684
+ if (!hasDataDynamicRef.current) {
685
+ const res = (dataStatic == null ? void 0 : dataStatic.filter(
686
+ (item) => {
687
+ var _a2, _b2, _c;
688
+ return (_c = (_b2 = (_a2 = item[searchField]).toLowerCase) == null ? void 0 : _b2.call(_a2)) == null ? void 0 : _c.includes(query.toLowerCase());
689
+ }
690
+ ).slice(0, maxSuggestionCountRef.current)) || [];
691
+ return res;
692
+ }
693
+ if (!dataDynamicRef.current)
694
+ return [];
695
+ if (((_a = dataDynamicRef.current) == null ? void 0 : _a.isLoading) === false) {
696
+ const data = (_b = dataDynamicRef.current.data) == null ? void 0 : _b.response;
697
+ if (!Array.isArray(data))
698
+ return [];
699
+ return (data == null ? void 0 : data.filter(
700
+ (item) => {
701
+ var _a2, _b2, _c;
702
+ return (_c = (_b2 = (_a2 = item[searchField]).toLowerCase) == null ? void 0 : _b2.call(_a2)) == null ? void 0 : _c.includes(query.toLowerCase());
703
+ }
704
+ ).slice(0, maxSuggestionCountRef.current)) || [];
705
+ }
706
+ return [];
707
+ },
708
+ render: () => {
709
+ let component;
710
+ let popup;
711
+ const otherProps = {
712
+ suggestionItem,
713
+ searchField,
714
+ popupClassName,
715
+ itemClassName,
716
+ selectedItemClassName
717
+ };
718
+ return {
719
+ // eslint-disable-next-line no-shadow
720
+ onStart: (props2) => {
721
+ component = new react.ReactRenderer(MentionList, {
722
+ props: __spreadValues(__spreadValues({}, props2), otherProps),
723
+ editor: props2.editor
724
+ });
725
+ if (!props2.clientRect) {
726
+ return;
727
+ }
728
+ popup = tippy__default.default("body", {
729
+ getReferenceClientRect: props2.clientRect,
730
+ appendTo: () => document.body,
731
+ content: component.element,
732
+ showOnCreate: true,
733
+ interactive: true,
734
+ trigger: "manual",
735
+ placement: "bottom-start"
736
+ });
737
+ },
738
+ // eslint-disable-next-line no-shadow
739
+ onUpdate(props2) {
740
+ var _a;
741
+ component.updateProps(__spreadValues(__spreadValues({}, props2), otherProps));
742
+ if (!props2.clientRect) {
743
+ return;
744
+ }
745
+ (_a = popup == null ? void 0 : popup[0]) == null ? void 0 : _a.setProps({
746
+ getReferenceClientRect: props2.clientRect
747
+ });
748
+ },
749
+ // eslint-disable-next-line no-shadow
750
+ onKeyDown(props2) {
751
+ var _a, _b;
752
+ if (props2.event.key === "Escape") {
753
+ (_a = popup == null ? void 0 : popup[0]) == null ? void 0 : _a.hide();
754
+ return true;
755
+ }
756
+ return ((_b = component.ref) == null ? void 0 : _b.onKeyDown(props2.event)) || false;
757
+ },
758
+ onExit() {
759
+ var _a;
760
+ (_a = popup == null ? void 0 : popup[0]) == null ? void 0 : _a.destroy();
761
+ component.destroy();
762
+ }
763
+ };
764
+ }
765
+ }
766
+ })
767
+ );
768
+ return () => {
769
+ setMention(void 0);
770
+ };
771
+ }, [
772
+ searchField,
773
+ mentionClassName,
774
+ popupClassName,
775
+ itemClassName,
776
+ selectedItemClassName
777
+ ]);
778
+ const inCanvas = !!host.usePlasmicCanvasContext();
779
+ const providerData = React.useMemo(() => {
780
+ var _a, _b;
781
+ const noData = [{ [searchField]: "No data" }];
782
+ let data = inCanvas ? noData : [];
783
+ if (!hasDataDynamic) {
784
+ if ((dataStatic == null ? void 0 : dataStatic.length) && Array.isArray(dataStatic)) {
785
+ data = [...dataStatic];
786
+ }
787
+ return data;
788
+ }
789
+ if (!dataDynamic || dataDynamic.isLoading)
790
+ return noData;
791
+ data = (_b = (_a = dataDynamic.data) == null ? void 0 : _a.response) != null ? _b : noData;
792
+ if (!Array.isArray(data))
793
+ return noData;
794
+ return data.slice(0, maxSuggestionCount);
795
+ }, [
796
+ dataDynamic,
797
+ searchField,
798
+ hasDataDynamic,
799
+ maxSuggestionCount,
800
+ dataStatic
801
+ ]);
802
+ return /* @__PURE__ */ React__default.default.createElement(
803
+ "div",
804
+ {
805
+ style: __spreadValues({}, {
806
+ // bare minimum styles (that need not be overridden)
807
+ // We just want to make the dataProvider data available to the MentionList component (<DataProvider> is needed to be returned from the returned JSX). It should not be shown in the UI, hence the display: none
808
+ display: "none",
809
+ position: "absolute",
810
+ top: 0,
811
+ background: "white"
812
+ })
813
+ },
814
+ providerData == null ? void 0 : providerData.slice(0, maxSuggestionCount).map((item, index) => {
815
+ var _a;
816
+ return (
817
+ // Data provider needs to be in the returned JSX (the actual use of the "suggestionItem" data is in the MentionList component.)
818
+ /* @__PURE__ */ React__default.default.createElement(host.DataProvider, { key: item.id, name: "suggestionItem", data: item }, (_a = host.repeatedElement(index === 0, suggestionItem)) != null ? _a : item[searchField])
819
+ );
820
+ })
821
+ );
822
+ }
823
+ Mention.displayName = "Mention";
824
+ function registerMention(loader) {
825
+ registerComponentHelper(loader, Mention, {
826
+ name: `${TIPTAP_COMPONENT_NAME}-extension-mention`,
827
+ displayName: "Tiptap Mention",
828
+ providesData: true,
829
+ props: {
830
+ dataDynamic: {
831
+ type: "dataSourceOpData",
832
+ description: "Filtered suggestions",
833
+ disableDynamicValue: true,
834
+ // we don't want the users to temper with the Plasmic's default query type.
835
+ hidden: (ps) => !ps.hasDataDynamic
836
+ },
837
+ searchField: {
838
+ type: "string",
839
+ defaultValueHint: "id"
840
+ },
841
+ maxSuggestionCount: {
842
+ type: "number",
843
+ defaultValueHint: 5,
844
+ description: "Limits the number of suggestions that appear in the suggestions popup"
845
+ },
846
+ dataStatic: {
847
+ type: "array",
848
+ hidden: (ps) => Boolean(ps.hasDataDynamic),
849
+ itemType: {
850
+ type: "object",
851
+ nameFunc: (item) => item.label,
852
+ fields: {
853
+ id: "string",
854
+ label: "string"
855
+ }
856
+ },
857
+ defaultValue: [
858
+ {
859
+ id: "thomasEd1",
860
+ label: "Thomas Edison"
861
+ },
862
+ {
863
+ id: "sherlock221b",
864
+ label: "Sherlock Holmes"
865
+ },
866
+ {
867
+ id: "eliot_thomas",
868
+ label: "T.S Eliot"
869
+ },
870
+ {
871
+ id: "shakespeare74",
872
+ label: "William Shakespeare"
873
+ }
874
+ ]
875
+ },
876
+ hasDataDynamic: {
877
+ type: "boolean"
878
+ },
879
+ mentionClassName: {
880
+ type: "class",
881
+ displayName: "Mention label"
882
+ },
883
+ popupClassName: {
884
+ type: "class",
885
+ displayName: "Suggestion Popup"
886
+ },
887
+ itemClassName: {
888
+ type: "class",
889
+ displayName: "Suggestion Item"
890
+ },
891
+ selectedItemClassName: {
892
+ type: "class",
893
+ displayName: "Selected Item"
894
+ },
895
+ suggestionItem: {
896
+ type: "slot"
897
+ },
898
+ currentMention: {
899
+ type: "string",
900
+ hidden: () => true
901
+ }
902
+ },
903
+ importName: "Mention",
904
+ importPath: "@plasmicpkgs/tiptap/skinny/registerMention",
905
+ parentComponentName: TIPTAP_COMPONENT_NAME
906
+ });
907
+ }
908
+
909
+ function Strike(props) {
910
+ const { setStrike } = useTiptapContext();
911
+ React.useEffect(() => {
912
+ setStrike(
913
+ TiptapStrike__default.default.configure({
914
+ HTMLAttributes: {
915
+ class: props.className
916
+ }
917
+ })
918
+ );
919
+ return () => {
920
+ setStrike(void 0);
921
+ };
922
+ }, []);
923
+ return null;
924
+ }
925
+ Strike.displayName = "Strike";
926
+ function registerStrike(loader) {
927
+ registerComponentHelper(loader, Strike, {
928
+ name: `${TIPTAP_COMPONENT_NAME}-extension-strike`,
929
+ displayName: "Tiptap Strike",
930
+ props: {},
931
+ importName: "Strike",
932
+ importPath: "@plasmicpkgs/tiptap/skinny/registerStrike",
933
+ parentComponentName: TIPTAP_COMPONENT_NAME
934
+ });
935
+ }
936
+
937
+ function Underline(props) {
938
+ const { setUnderline } = useTiptapContext();
939
+ React.useEffect(() => {
940
+ setUnderline(
941
+ TiptapUnderline__default.default.configure({
942
+ HTMLAttributes: {
943
+ class: props.className
944
+ }
945
+ })
946
+ );
947
+ return () => {
948
+ setUnderline(void 0);
949
+ };
950
+ }, []);
951
+ return null;
952
+ }
953
+ Underline.displayName = "Underline";
954
+ function registerUnderline(loader) {
955
+ registerComponentHelper(loader, Underline, {
956
+ name: `${TIPTAP_COMPONENT_NAME}-extension-underline`,
957
+ displayName: "Tiptap Underline",
958
+ props: {},
959
+ importName: "Underline",
960
+ importPath: "@plasmicpkgs/tiptap/skinny/registerUnderline",
961
+ parentComponentName: TIPTAP_COMPONENT_NAME
962
+ });
963
+ }
964
+
965
+ function ToolbarBold(props) {
966
+ const { editor } = react.useCurrentEditor();
967
+ const { bold } = useTiptapContext();
968
+ const { className, children, toolbarBoldScopeClassName } = props;
969
+ if (!editor || !bold)
970
+ return null;
971
+ return /* @__PURE__ */ React__default.default.createElement(
972
+ "div",
973
+ {
974
+ "data-active": editor.isActive("bold") ? true : false,
975
+ className: `${className} ${toolbarBoldScopeClassName}`,
976
+ style: { cursor: "pointer" },
977
+ role: "button",
978
+ onClick: () => editor.chain().focus().toggleMark("bold").run()
979
+ },
980
+ children
981
+ );
982
+ }
983
+ ToolbarBold.displayName = "ToolbarBold";
984
+ function registerToolbarBold(loader) {
985
+ registerComponentHelper(loader, ToolbarBold, {
986
+ name: `${TIPTAP_COMPONENT_NAME}-toolbar-bold`,
987
+ displayName: "Tiptap Bold Toolbar Option",
988
+ defaultStyles: {
989
+ width: "hug",
990
+ padding: "5px"
991
+ },
992
+ props: {
993
+ children: {
994
+ type: "slot",
995
+ hidePlaceholder: true,
996
+ defaultValue: [
997
+ {
998
+ type: "img",
999
+ src: "https://static1.plasmic.app/bold.svg"
1000
+ }
1001
+ ]
1002
+ },
1003
+ toolbarBoldScopeClassName: {
1004
+ type: "styleScopeClass",
1005
+ scopeName: "toolbarBold"
1006
+ },
1007
+ selectedClassName: {
1008
+ type: "class",
1009
+ displayName: "Tool Selected",
1010
+ selectors: [
1011
+ {
1012
+ selector: ":toolbarBold[data-active=true]",
1013
+ label: "Base"
1014
+ }
1015
+ ]
1016
+ }
1017
+ },
1018
+ importName: "ToolbarBold",
1019
+ importPath: "@plasmicpkgs/tiptap/skinny/registerToolbarBold",
1020
+ parentComponentName: TIPTAP_COMPONENT_NAME
1021
+ });
1022
+ }
1023
+
1024
+ function ToolbarCode(props) {
1025
+ const { editor } = react.useCurrentEditor();
1026
+ const { code } = useTiptapContext();
1027
+ const { className, children, toolbarCodeScopeClassName } = props;
1028
+ if (!editor || !code)
1029
+ return null;
1030
+ return /* @__PURE__ */ React__default.default.createElement(
1031
+ "div",
1032
+ {
1033
+ "data-active": editor.isActive("code") ? true : false,
1034
+ className: `${className} ${toolbarCodeScopeClassName}`,
1035
+ style: { cursor: "pointer" },
1036
+ role: "button",
1037
+ onClick: () => editor.chain().focus().toggleMark("code").run()
1038
+ },
1039
+ children
1040
+ );
1041
+ }
1042
+ ToolbarCode.displayName = "ToolbarCode";
1043
+ function registerToolbarCode(loader) {
1044
+ registerComponentHelper(loader, ToolbarCode, {
1045
+ name: `${TIPTAP_COMPONENT_NAME}-toolbar-code`,
1046
+ displayName: "Tiptap Code Toolbar Option",
1047
+ defaultStyles: {
1048
+ width: "hug",
1049
+ padding: "5px"
1050
+ },
1051
+ props: {
1052
+ children: {
1053
+ type: "slot",
1054
+ hidePlaceholder: true,
1055
+ defaultValue: [
1056
+ {
1057
+ type: "img",
1058
+ src: "https://static1.plasmic.app/code.svg"
1059
+ }
1060
+ ]
1061
+ },
1062
+ toolbarCodeScopeClassName: {
1063
+ type: "styleScopeClass",
1064
+ scopeName: "toolbarCode"
1065
+ },
1066
+ selectedClassName: {
1067
+ type: "class",
1068
+ displayName: "Tool Selected",
1069
+ selectors: [
1070
+ {
1071
+ selector: ":toolbarCode[data-active=true]",
1072
+ label: "Base"
1073
+ }
1074
+ ]
1075
+ }
1076
+ },
1077
+ importName: "ToolbarCode",
1078
+ importPath: "@plasmicpkgs/tiptap/skinny/registerToolbarCode",
1079
+ parentComponentName: TIPTAP_COMPONENT_NAME
1080
+ });
1081
+ }
1082
+
1083
+ function ToolbarItalic(props) {
1084
+ const { editor } = react.useCurrentEditor();
1085
+ const { italic } = useTiptapContext();
1086
+ const { className, children, toolbarItalicScopeClassName } = props;
1087
+ if (!editor || !italic)
1088
+ return null;
1089
+ return /* @__PURE__ */ React__default.default.createElement(
1090
+ "div",
1091
+ {
1092
+ "data-active": editor.isActive("italic") ? true : false,
1093
+ className: `${className} ${toolbarItalicScopeClassName}`,
1094
+ style: { cursor: "pointer" },
1095
+ role: "button",
1096
+ onClick: () => editor.chain().focus().toggleMark("italic").run()
1097
+ },
1098
+ children
1099
+ );
1100
+ }
1101
+ ToolbarItalic.displayName = "ToolbarItalic";
1102
+ function registerToolbarItalic(loader) {
1103
+ registerComponentHelper(loader, ToolbarItalic, {
1104
+ name: `${TIPTAP_COMPONENT_NAME}-toolbar-italic`,
1105
+ displayName: "Tiptap Italic Toolbar Option",
1106
+ defaultStyles: {
1107
+ width: "hug",
1108
+ padding: "5px"
1109
+ },
1110
+ props: {
1111
+ children: {
1112
+ type: "slot",
1113
+ hidePlaceholder: true,
1114
+ defaultValue: [
1115
+ {
1116
+ type: "img",
1117
+ src: "https://static1.plasmic.app/italic.svg",
1118
+ styles: {
1119
+ width: "hug"
1120
+ }
1121
+ }
1122
+ ]
1123
+ },
1124
+ toolbarItalicScopeClassName: {
1125
+ type: "styleScopeClass",
1126
+ scopeName: "toolbarItalic"
1127
+ },
1128
+ selectedClassName: {
1129
+ type: "class",
1130
+ displayName: "Tool Selected",
1131
+ selectors: [
1132
+ {
1133
+ selector: ":toolbarItalic[data-active=true]",
1134
+ label: "Base"
1135
+ }
1136
+ ]
1137
+ }
1138
+ },
1139
+ importName: "ToolbarItalic",
1140
+ importPath: "@plasmicpkgs/tiptap/skinny/registerToolbarItalic",
1141
+ parentComponentName: TIPTAP_COMPONENT_NAME
1142
+ });
1143
+ }
1144
+
1145
+ function ToolbarLink(props) {
1146
+ const { editor } = react.useCurrentEditor();
1147
+ const { link } = useTiptapContext();
1148
+ const { className, children, toolbarLinkScopeClassName } = props;
1149
+ if (!editor || !link)
1150
+ return null;
1151
+ return /* @__PURE__ */ React__default.default.createElement(
1152
+ "div",
1153
+ {
1154
+ "data-active": editor.isActive("link") ? true : false,
1155
+ className: `${className} ${toolbarLinkScopeClassName}`,
1156
+ style: { cursor: "pointer" },
1157
+ role: "button",
1158
+ onClick: () => editor.chain().focus().toggleMark("link").run()
1159
+ },
1160
+ children
1161
+ );
1162
+ }
1163
+ ToolbarLink.displayName = "ToolbarLink";
1164
+ function registerToolbarLink(loader) {
1165
+ registerComponentHelper(loader, ToolbarLink, {
1166
+ name: `${TIPTAP_COMPONENT_NAME}-toolbar-link`,
1167
+ displayName: "Tiptap Link Toolbar Option",
1168
+ defaultStyles: {
1169
+ width: "hug",
1170
+ padding: "5px"
1171
+ },
1172
+ props: {
1173
+ children: {
1174
+ type: "slot",
1175
+ hidePlaceholder: true,
1176
+ defaultValue: [
1177
+ {
1178
+ type: "img",
1179
+ src: "https://static1.plasmic.app/link.svg"
1180
+ }
1181
+ ]
1182
+ },
1183
+ toolbarLinkScopeClassName: {
1184
+ type: "styleScopeClass",
1185
+ scopeName: "toolbarLink"
1186
+ },
1187
+ selectedClassName: {
1188
+ type: "class",
1189
+ displayName: "Tool Selected",
1190
+ selectors: [
1191
+ {
1192
+ selector: ":toolbarLink[data-active=true]",
1193
+ label: "Base"
1194
+ }
1195
+ ]
1196
+ }
1197
+ },
1198
+ importName: "ToolbarLink",
1199
+ importPath: "@plasmicpkgs/tiptap/skinny/registerToolbarLink",
1200
+ parentComponentName: TIPTAP_COMPONENT_NAME
1201
+ });
1202
+ }
1203
+
1204
+ function ToolbarMention(props) {
1205
+ const { editor } = react.useCurrentEditor();
1206
+ const { mention } = useTiptapContext();
1207
+ const { className, children, toolbarMentionScopeClassName } = props;
1208
+ if (!editor || !mention)
1209
+ return null;
1210
+ return /* @__PURE__ */ React__default.default.createElement(
1211
+ "div",
1212
+ {
1213
+ "data-active": editor.isActive("mention") ? true : false,
1214
+ className: `${className} ${toolbarMentionScopeClassName}`,
1215
+ style: { cursor: "pointer" },
1216
+ role: "button",
1217
+ onClick: () => editor.chain().focus().insertContent(" @").run()
1218
+ },
1219
+ children
1220
+ );
1221
+ }
1222
+ ToolbarMention.displayName = "ToolbarMention";
1223
+ function registerToolbarMention(loader) {
1224
+ registerComponentHelper(loader, ToolbarMention, {
1225
+ name: `${TIPTAP_COMPONENT_NAME}-toolbar-mention`,
1226
+ displayName: "Tiptap Mention Toolbar Option",
1227
+ defaultStyles: {
1228
+ width: "hug",
1229
+ padding: "5px"
1230
+ },
1231
+ props: {
1232
+ children: {
1233
+ type: "slot",
1234
+ hidePlaceholder: true,
1235
+ defaultValue: [
1236
+ {
1237
+ type: "img",
1238
+ src: "https://static1.plasmic.app/mention.svg"
1239
+ }
1240
+ ]
1241
+ },
1242
+ toolbarMentionScopeClassName: {
1243
+ type: "styleScopeClass",
1244
+ scopeName: "toolbarMention"
1245
+ },
1246
+ selectedClassName: {
1247
+ type: "class",
1248
+ displayName: "Tool Selected",
1249
+ selectors: [
1250
+ {
1251
+ selector: ":toolbarMention[data-active=true]",
1252
+ label: "Base"
1253
+ }
1254
+ ]
1255
+ }
1256
+ },
1257
+ importName: "ToolbarMention",
1258
+ importPath: "@plasmicpkgs/tiptap/skinny/registerToolbarMention",
1259
+ parentComponentName: TIPTAP_COMPONENT_NAME
1260
+ });
1261
+ }
1262
+
1263
+ function ToolbarStrike(props) {
1264
+ const { editor } = react.useCurrentEditor();
1265
+ const { strike } = useTiptapContext();
1266
+ const { className, children, toolbarStrikeScopeClassName } = props;
1267
+ if (!editor || !strike)
1268
+ return null;
1269
+ return /* @__PURE__ */ React__default.default.createElement(
1270
+ "div",
1271
+ {
1272
+ "data-active": editor.isActive("strike") ? true : false,
1273
+ className: `${className} ${toolbarStrikeScopeClassName}`,
1274
+ style: { cursor: "pointer" },
1275
+ role: "button",
1276
+ onClick: () => editor.chain().focus().toggleMark("strike").run()
1277
+ },
1278
+ children
1279
+ );
1280
+ }
1281
+ ToolbarStrike.displayName = "ToolbarStrike";
1282
+ function registerToolbarStrike(loader) {
1283
+ registerComponentHelper(loader, ToolbarStrike, {
1284
+ name: `${TIPTAP_COMPONENT_NAME}-toolbar-strike`,
1285
+ displayName: "Tiptap Strike Toolbar Option",
1286
+ defaultStyles: {
1287
+ width: "hug",
1288
+ padding: "5px"
1289
+ },
1290
+ props: {
1291
+ children: {
1292
+ type: "slot",
1293
+ hidePlaceholder: true,
1294
+ defaultValue: [
1295
+ {
1296
+ type: "img",
1297
+ src: "https://static1.plasmic.app/strikethrough.svg"
1298
+ }
1299
+ ]
1300
+ },
1301
+ toolbarStrikeScopeClassName: {
1302
+ type: "styleScopeClass",
1303
+ scopeName: "toolbarStrike"
1304
+ },
1305
+ selectedClassName: {
1306
+ type: "class",
1307
+ displayName: "Tool Selected",
1308
+ selectors: [
1309
+ {
1310
+ selector: ":toolbarStrike[data-active=true]",
1311
+ label: "Base"
1312
+ }
1313
+ ]
1314
+ }
1315
+ },
1316
+ importName: "ToolbarStrike",
1317
+ importPath: "@plasmicpkgs/tiptap/skinny/registerToolbarStrike",
1318
+ parentComponentName: TIPTAP_COMPONENT_NAME
1319
+ });
1320
+ }
1321
+
1322
+ function ToolbarUnderline(props) {
1323
+ const { editor } = react.useCurrentEditor();
1324
+ const { underline } = useTiptapContext();
1325
+ const { className, children, toolbarUnderlineScopeClassName } = props;
1326
+ if (!editor || !underline)
1327
+ return null;
1328
+ return /* @__PURE__ */ React__default.default.createElement(
1329
+ "div",
1330
+ {
1331
+ "data-active": editor.isActive("underline") ? true : false,
1332
+ className: `${className} ${toolbarUnderlineScopeClassName}`,
1333
+ style: { cursor: "pointer" },
1334
+ role: "button",
1335
+ onClick: () => editor.chain().focus().toggleMark("underline").run()
1336
+ },
1337
+ children
1338
+ );
1339
+ }
1340
+ ToolbarUnderline.displayName = "ToolbarUnderline";
1341
+ function registerToolbarUnderline(loader) {
1342
+ registerComponentHelper(loader, ToolbarUnderline, {
1343
+ name: `${TIPTAP_COMPONENT_NAME}-toolbar-underline`,
1344
+ displayName: "Tiptap Underline Toolbar Option",
1345
+ defaultStyles: {
1346
+ width: "hug",
1347
+ padding: "5px"
1348
+ },
1349
+ props: {
1350
+ children: {
1351
+ type: "slot",
1352
+ hidePlaceholder: true,
1353
+ defaultValue: [
1354
+ {
1355
+ type: "img",
1356
+ src: "https://static1.plasmic.app/underline.svg"
1357
+ }
1358
+ ]
1359
+ },
1360
+ toolbarUnderlineScopeClassName: {
1361
+ type: "styleScopeClass",
1362
+ scopeName: "toolbarUnderline"
1363
+ },
1364
+ selectedClassName: {
1365
+ type: "class",
1366
+ displayName: "Tool Selected",
1367
+ selectors: [
1368
+ {
1369
+ selector: ":toolbarUnderline[data-active=true]",
1370
+ label: "Base"
1371
+ }
1372
+ ]
1373
+ }
1374
+ },
1375
+ importName: "ToolbarUnderline",
1376
+ importPath: "@plasmicpkgs/tiptap/skinny/registerToolbarUnderline",
1377
+ parentComponentName: TIPTAP_COMPONENT_NAME
1378
+ });
1379
+ }
1380
+
1381
+ function registerAll(loader) {
1382
+ registerBold(loader);
1383
+ registerCode(loader);
1384
+ registerItalic(loader);
1385
+ registerLink(loader);
1386
+ registerMention(loader);
1387
+ registerStrike(loader);
1388
+ registerTiptap(loader);
1389
+ registerUnderline(loader);
1390
+ registerToolbarBold(loader);
1391
+ registerToolbarCode(loader);
1392
+ registerToolbarItalic(loader);
1393
+ registerToolbarLink(loader);
1394
+ registerToolbarMention(loader);
1395
+ registerToolbarStrike(loader);
1396
+ registerToolbarUnderline(loader);
1397
+ }
1398
+
1399
+ exports.registerAll = registerAll;
1400
+ //# sourceMappingURL=index.js.map