@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.
- package/LICENSE.md +21 -0
- package/README.md +1 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/components/MentionList.d.ts +12 -0
- package/dist/contexts.d.ts +30 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1400 -0
- package/dist/index.js.map +1 -0
- package/dist/registerBold.d.ts +9 -0
- package/dist/registerCode.d.ts +9 -0
- package/dist/registerItalic.d.ts +9 -0
- package/dist/registerLink.d.ts +9 -0
- package/dist/registerMention.d.ts +28 -0
- package/dist/registerStrike.d.ts +9 -0
- package/dist/registerTiptap.d.ts +18 -0
- package/dist/registerUnderline.d.ts +9 -0
- package/dist/tiptap.esm.js +1382 -0
- package/dist/tiptap.esm.js.map +1 -0
- package/dist/toolbar/registerToolbarBold.d.ts +13 -0
- package/dist/toolbar/registerToolbarCode.d.ts +13 -0
- package/dist/toolbar/registerToolbarItalic.d.ts +13 -0
- package/dist/toolbar/registerToolbarLink.d.ts +13 -0
- package/dist/toolbar/registerToolbarMention.d.ts +13 -0
- package/dist/toolbar/registerToolbarStrike.d.ts +13 -0
- package/dist/toolbar/registerToolbarUnderline.d.ts +13 -0
- package/dist/useIsClient.d.ts +3 -0
- package/dist/utils.d.ts +24 -0
- package/package.json +103 -0
- package/skinny/contexts.d.ts +30 -0
- package/skinny/registerBold.cjs.js +48 -0
- package/skinny/registerBold.cjs.js.map +1 -0
- package/skinny/registerBold.d.ts +9 -0
- package/skinny/registerBold.esm.js +41 -0
- package/skinny/registerBold.esm.js.map +1 -0
- package/skinny/registerCode.cjs.js +48 -0
- package/skinny/registerCode.cjs.js.map +1 -0
- package/skinny/registerCode.d.ts +9 -0
- package/skinny/registerCode.esm.js +41 -0
- package/skinny/registerCode.esm.js.map +1 -0
- package/skinny/registerItalic.cjs.js +48 -0
- package/skinny/registerItalic.cjs.js.map +1 -0
- package/skinny/registerItalic.d.ts +9 -0
- package/skinny/registerItalic.esm.js +41 -0
- package/skinny/registerItalic.esm.js.map +1 -0
- package/skinny/registerLink.cjs.js +48 -0
- package/skinny/registerLink.cjs.js.map +1 -0
- package/skinny/registerLink.d.ts +9 -0
- package/skinny/registerLink.esm.js +41 -0
- package/skinny/registerLink.esm.js.map +1 -0
- package/skinny/registerMention.cjs.js +420 -0
- package/skinny/registerMention.cjs.js.map +1 -0
- package/skinny/registerMention.d.ts +28 -0
- package/skinny/registerMention.esm.js +411 -0
- package/skinny/registerMention.esm.js.map +1 -0
- package/skinny/registerStrike.cjs.js +48 -0
- package/skinny/registerStrike.cjs.js.map +1 -0
- package/skinny/registerStrike.d.ts +9 -0
- package/skinny/registerStrike.esm.js +41 -0
- package/skinny/registerStrike.esm.js.map +1 -0
- package/skinny/registerTiptap-6a2d0bb4.esm.js +375 -0
- package/skinny/registerTiptap-6a2d0bb4.esm.js.map +1 -0
- package/skinny/registerTiptap-fd9bf882.cjs.js +391 -0
- package/skinny/registerTiptap-fd9bf882.cjs.js.map +1 -0
- package/skinny/registerTiptap.cjs.js +20 -0
- package/skinny/registerTiptap.cjs.js.map +1 -0
- package/skinny/registerTiptap.d.ts +18 -0
- package/skinny/registerTiptap.esm.js +10 -0
- package/skinny/registerTiptap.esm.js.map +1 -0
- package/skinny/registerToolbarBold.cjs.js +78 -0
- package/skinny/registerToolbarBold.cjs.js.map +1 -0
- package/skinny/registerToolbarBold.esm.js +71 -0
- package/skinny/registerToolbarBold.esm.js.map +1 -0
- package/skinny/registerToolbarCode.cjs.js +78 -0
- package/skinny/registerToolbarCode.cjs.js.map +1 -0
- package/skinny/registerToolbarCode.esm.js +71 -0
- package/skinny/registerToolbarCode.esm.js.map +1 -0
- package/skinny/registerToolbarItalic.cjs.js +81 -0
- package/skinny/registerToolbarItalic.cjs.js.map +1 -0
- package/skinny/registerToolbarItalic.esm.js +74 -0
- package/skinny/registerToolbarItalic.esm.js.map +1 -0
- package/skinny/registerToolbarLink.cjs.js +78 -0
- package/skinny/registerToolbarLink.cjs.js.map +1 -0
- package/skinny/registerToolbarLink.esm.js +71 -0
- package/skinny/registerToolbarLink.esm.js.map +1 -0
- package/skinny/registerToolbarMention.cjs.js +78 -0
- package/skinny/registerToolbarMention.cjs.js.map +1 -0
- package/skinny/registerToolbarMention.esm.js +71 -0
- package/skinny/registerToolbarMention.esm.js.map +1 -0
- package/skinny/registerToolbarStrike.cjs.js +78 -0
- package/skinny/registerToolbarStrike.cjs.js.map +1 -0
- package/skinny/registerToolbarStrike.esm.js +71 -0
- package/skinny/registerToolbarStrike.esm.js.map +1 -0
- package/skinny/registerToolbarUnderline.cjs.js +78 -0
- package/skinny/registerToolbarUnderline.cjs.js.map +1 -0
- package/skinny/registerToolbarUnderline.esm.js +71 -0
- package/skinny/registerToolbarUnderline.esm.js.map +1 -0
- package/skinny/registerUnderline.cjs.js +48 -0
- package/skinny/registerUnderline.cjs.js.map +1 -0
- package/skinny/registerUnderline.d.ts +9 -0
- package/skinny/registerUnderline.esm.js +41 -0
- package/skinny/registerUnderline.esm.js.map +1 -0
- package/skinny/useIsClient.d.ts +3 -0
- package/skinny/utils.d.ts +24 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import Document from '@tiptap/extension-document';
|
|
2
|
+
import Paragraph from '@tiptap/extension-paragraph';
|
|
3
|
+
import Text from '@tiptap/extension-text';
|
|
4
|
+
import { EditorProvider } from '@tiptap/react';
|
|
5
|
+
import { Switch } from 'antd';
|
|
6
|
+
import React, { useState, useRef, useEffect, useMemo } from 'react';
|
|
7
|
+
import registerComponent from '@plasmicapp/host/registerComponent';
|
|
8
|
+
import '@plasmicapp/host/registerGlobalContext';
|
|
9
|
+
|
|
10
|
+
const RESET_TIMEOUT_MS = 500;
|
|
11
|
+
const allExtensions = [
|
|
12
|
+
"bold",
|
|
13
|
+
"italic",
|
|
14
|
+
"underline",
|
|
15
|
+
"strike",
|
|
16
|
+
"code",
|
|
17
|
+
"link",
|
|
18
|
+
"mention"
|
|
19
|
+
];
|
|
20
|
+
const TiptapContext = React.createContext(void 0);
|
|
21
|
+
const useTiptapContext = () => {
|
|
22
|
+
const context = React.useContext(TiptapContext);
|
|
23
|
+
if (!context) {
|
|
24
|
+
throw new Error(
|
|
25
|
+
"useTiptapContext must be used within a TiptapContextProvider"
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
return context;
|
|
29
|
+
};
|
|
30
|
+
const TiptapContextProvider = ({ children }) => {
|
|
31
|
+
const [bold, setBold] = useState(void 0);
|
|
32
|
+
const [code, setCode] = useState(void 0);
|
|
33
|
+
const [italic, setItalic] = useState(
|
|
34
|
+
void 0
|
|
35
|
+
);
|
|
36
|
+
const [link, setLink] = useState(void 0);
|
|
37
|
+
const [mention, setMention] = useState(
|
|
38
|
+
void 0
|
|
39
|
+
);
|
|
40
|
+
const [strike, setStrike] = useState(
|
|
41
|
+
void 0
|
|
42
|
+
);
|
|
43
|
+
const [underline, setUnderline] = useState(void 0);
|
|
44
|
+
return /* @__PURE__ */ React.createElement(
|
|
45
|
+
TiptapContext.Provider,
|
|
46
|
+
{
|
|
47
|
+
value: {
|
|
48
|
+
bold,
|
|
49
|
+
setBold,
|
|
50
|
+
code,
|
|
51
|
+
setCode,
|
|
52
|
+
italic,
|
|
53
|
+
setItalic,
|
|
54
|
+
link,
|
|
55
|
+
setLink,
|
|
56
|
+
mention,
|
|
57
|
+
/**
|
|
58
|
+
* In situations where I want to remove an extension and add it again with new options (e.g. within a useEffect - see registerMention)
|
|
59
|
+
* the options are not updated.
|
|
60
|
+
* So after removing the extension, I want to wait a few seconds before I add it again,
|
|
61
|
+
* so the Tiptap editor acknowledges the removal before it adds the extension back with new updated options.
|
|
62
|
+
* @param mentionOptions
|
|
63
|
+
* @returns
|
|
64
|
+
*/
|
|
65
|
+
setMention: (mentionOptions) => {
|
|
66
|
+
if (!mentionOptions) {
|
|
67
|
+
setMention(mentionOptions);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
setTimeout(() => {
|
|
71
|
+
setMention(mentionOptions);
|
|
72
|
+
}, RESET_TIMEOUT_MS);
|
|
73
|
+
},
|
|
74
|
+
strike,
|
|
75
|
+
setStrike,
|
|
76
|
+
underline,
|
|
77
|
+
setUnderline
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
children
|
|
81
|
+
);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
function useIsClient() {
|
|
85
|
+
const [loaded, setLoaded] = React.useState(false);
|
|
86
|
+
useIsomorphicLayoutEffect(() => {
|
|
87
|
+
setLoaded(true);
|
|
88
|
+
});
|
|
89
|
+
return loaded;
|
|
90
|
+
}
|
|
91
|
+
const isBrowser = typeof window !== "undefined";
|
|
92
|
+
const useIsomorphicLayoutEffect = isBrowser ? React.useLayoutEffect : React.useEffect;
|
|
93
|
+
|
|
94
|
+
function registerComponentHelper(loader, component, meta) {
|
|
95
|
+
if (loader) {
|
|
96
|
+
loader.registerComponent(component, meta);
|
|
97
|
+
} else {
|
|
98
|
+
registerComponent(component, meta);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function traverseReactEltTree(children, callback) {
|
|
102
|
+
const rec = (elts) => {
|
|
103
|
+
(Array.isArray(elts) ? elts : [elts]).forEach((elt) => {
|
|
104
|
+
var _a;
|
|
105
|
+
if (elt) {
|
|
106
|
+
callback(elt);
|
|
107
|
+
if (elt.children) {
|
|
108
|
+
rec(elt.children);
|
|
109
|
+
}
|
|
110
|
+
if (((_a = elt.props) == null ? void 0 : _a.children) && elt.props.children !== elt.children) {
|
|
111
|
+
rec(elt.props.children);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
rec(children);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
var __defProp = Object.defineProperty;
|
|
120
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
121
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
122
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
123
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
124
|
+
var __spreadValues = (a, b) => {
|
|
125
|
+
for (var prop in b || (b = {}))
|
|
126
|
+
if (__hasOwnProp.call(b, prop))
|
|
127
|
+
__defNormalProp(a, prop, b[prop]);
|
|
128
|
+
if (__getOwnPropSymbols)
|
|
129
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
130
|
+
if (__propIsEnum.call(b, prop))
|
|
131
|
+
__defNormalProp(a, prop, b[prop]);
|
|
132
|
+
}
|
|
133
|
+
return a;
|
|
134
|
+
};
|
|
135
|
+
var __objRest = (source, exclude) => {
|
|
136
|
+
var target = {};
|
|
137
|
+
for (var prop in source)
|
|
138
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
139
|
+
target[prop] = source[prop];
|
|
140
|
+
if (source != null && __getOwnPropSymbols)
|
|
141
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
142
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
143
|
+
target[prop] = source[prop];
|
|
144
|
+
}
|
|
145
|
+
return target;
|
|
146
|
+
};
|
|
147
|
+
const TIPTAP_COMPONENT_NAME = "hostless-tiptap";
|
|
148
|
+
function Tiptap(props) {
|
|
149
|
+
const isClient = useIsClient();
|
|
150
|
+
const [active, setActive] = useState(false);
|
|
151
|
+
const [refreshKey, setRefreshKey] = useState(0);
|
|
152
|
+
const activeRef = useRef();
|
|
153
|
+
activeRef.current = active;
|
|
154
|
+
const {
|
|
155
|
+
extensions,
|
|
156
|
+
contentHtml,
|
|
157
|
+
defaultContentHtml,
|
|
158
|
+
className,
|
|
159
|
+
onChange,
|
|
160
|
+
toolbar
|
|
161
|
+
} = props;
|
|
162
|
+
const tiptapContext = __objRest(useTiptapContext(), []);
|
|
163
|
+
const usedExtensions = allExtensions.reduce(
|
|
164
|
+
(acc, ext) => {
|
|
165
|
+
if (tiptapContext[ext] !== void 0) {
|
|
166
|
+
acc[ext] = tiptapContext[ext];
|
|
167
|
+
}
|
|
168
|
+
return acc;
|
|
169
|
+
},
|
|
170
|
+
{}
|
|
171
|
+
);
|
|
172
|
+
const extensionsProp = [
|
|
173
|
+
Document,
|
|
174
|
+
Paragraph,
|
|
175
|
+
Text,
|
|
176
|
+
...Object.values(usedExtensions)
|
|
177
|
+
];
|
|
178
|
+
useEffect(() => {
|
|
179
|
+
if (activeRef.current)
|
|
180
|
+
return;
|
|
181
|
+
setRefreshKey(Math.random() * 1e6);
|
|
182
|
+
}, [contentHtml]);
|
|
183
|
+
if (!isClient) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const css = `
|
|
187
|
+
.tiptap {
|
|
188
|
+
padding: 0;
|
|
189
|
+
outline: none;
|
|
190
|
+
}
|
|
191
|
+
`;
|
|
192
|
+
const toolbarProp = toolbar ? /* @__PURE__ */ React.createElement("div", { style: { display: "flex", alignItems: "center" } }, toolbar) : null;
|
|
193
|
+
return /* @__PURE__ */ React.createElement("div", { className, style: { position: "relative" } }, /* @__PURE__ */ React.createElement(
|
|
194
|
+
EditorProvider,
|
|
195
|
+
{
|
|
196
|
+
key: `${extensionsProp.length}${refreshKey}`,
|
|
197
|
+
extensions: extensionsProp,
|
|
198
|
+
content: contentHtml || defaultContentHtml,
|
|
199
|
+
onCreate: ({ editor }) => {
|
|
200
|
+
onChange(editor.getJSON());
|
|
201
|
+
},
|
|
202
|
+
onUpdate: ({ editor }) => {
|
|
203
|
+
onChange(editor.getJSON());
|
|
204
|
+
},
|
|
205
|
+
onFocus: () => setActive(true),
|
|
206
|
+
onBlur: () => setActive(false),
|
|
207
|
+
slotBefore: toolbarProp,
|
|
208
|
+
children: void 0,
|
|
209
|
+
editorProps: {
|
|
210
|
+
attributes: {
|
|
211
|
+
className
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
), extensions, /* @__PURE__ */ React.createElement("style", { dangerouslySetInnerHTML: { __html: css } }));
|
|
216
|
+
}
|
|
217
|
+
function TiptapWrapper(props) {
|
|
218
|
+
return /* @__PURE__ */ React.createElement(TiptapContextProvider, null, /* @__PURE__ */ React.createElement(Tiptap, __spreadValues({}, props)));
|
|
219
|
+
}
|
|
220
|
+
function AddExtension({
|
|
221
|
+
studioOps,
|
|
222
|
+
componentProps
|
|
223
|
+
}) {
|
|
224
|
+
const usedExtensions = useMemo(() => {
|
|
225
|
+
const list = [];
|
|
226
|
+
traverseReactEltTree(componentProps == null ? void 0 : componentProps.extensions, (elt) => {
|
|
227
|
+
var _a, _b, _c;
|
|
228
|
+
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);
|
|
229
|
+
if (ext) {
|
|
230
|
+
list.push(ext);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
return list;
|
|
234
|
+
}, [componentProps == null ? void 0 : componentProps.extensions]);
|
|
235
|
+
const usedExtensionTools = useMemo(() => {
|
|
236
|
+
const list = [];
|
|
237
|
+
traverseReactEltTree(componentProps == null ? void 0 : componentProps.toolbar, (elt) => {
|
|
238
|
+
var _a, _b, _c;
|
|
239
|
+
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);
|
|
240
|
+
if (ext && ext.includes("toolbar")) {
|
|
241
|
+
list.push(ext.replace("toolbar", ""));
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
return list;
|
|
245
|
+
}, [componentProps == null ? void 0 : componentProps.toolbar]);
|
|
246
|
+
const handleChange = (extName, add) => {
|
|
247
|
+
if (add) {
|
|
248
|
+
studioOps.appendToSlot(
|
|
249
|
+
{
|
|
250
|
+
type: "component",
|
|
251
|
+
name: `${TIPTAP_COMPONENT_NAME}-extension-${extName}`,
|
|
252
|
+
props: {}
|
|
253
|
+
},
|
|
254
|
+
"extensions"
|
|
255
|
+
);
|
|
256
|
+
studioOps.appendToSlot(
|
|
257
|
+
{
|
|
258
|
+
type: "component",
|
|
259
|
+
name: `${TIPTAP_COMPONENT_NAME}-toolbar-${extName}`,
|
|
260
|
+
props: {}
|
|
261
|
+
},
|
|
262
|
+
"toolbar"
|
|
263
|
+
);
|
|
264
|
+
} else {
|
|
265
|
+
const extIndices = usedExtensions.flatMap(
|
|
266
|
+
(ext, i) => ext === extName ? i : []
|
|
267
|
+
);
|
|
268
|
+
extIndices.reverse().forEach(
|
|
269
|
+
(i) => i !== -1 && studioOps.removeFromSlotAt(i, "extensions")
|
|
270
|
+
);
|
|
271
|
+
const toolIndices = usedExtensionTools.flatMap(
|
|
272
|
+
(ext, i) => ext === extName ? i : []
|
|
273
|
+
);
|
|
274
|
+
toolIndices.reverse().forEach((i) => i !== -1 && studioOps.removeFromSlotAt(i, "toolbar"));
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
return /* @__PURE__ */ React.createElement(
|
|
278
|
+
"div",
|
|
279
|
+
{
|
|
280
|
+
style: {
|
|
281
|
+
marginBottom: 10,
|
|
282
|
+
paddingBottom: 10,
|
|
283
|
+
borderBottom: "1px dashed #ccc"
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
/* @__PURE__ */ React.createElement("p", null, "You can add capabilities to Tiptap Rich Text Editor using the tools below."),
|
|
287
|
+
/* @__PURE__ */ React.createElement("p", null, `To further customize the extensions, find them under the Editor's "extensions" and "toolbar" slots`),
|
|
288
|
+
allExtensions.map((ext) => /* @__PURE__ */ React.createElement(
|
|
289
|
+
"label",
|
|
290
|
+
{
|
|
291
|
+
"data-test-id": `custom-action-${ext}`,
|
|
292
|
+
style: {
|
|
293
|
+
display: "flex",
|
|
294
|
+
justifyContent: "space-between",
|
|
295
|
+
marginBottom: 5,
|
|
296
|
+
color: "#1b1b18"
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
/* @__PURE__ */ React.createElement("span", null, ext),
|
|
300
|
+
/* @__PURE__ */ React.createElement(
|
|
301
|
+
Switch,
|
|
302
|
+
{
|
|
303
|
+
size: "small",
|
|
304
|
+
checked: usedExtensions.includes(ext) || usedExtensionTools.includes(ext),
|
|
305
|
+
onChange: (checked) => handleChange(ext, checked)
|
|
306
|
+
}
|
|
307
|
+
)
|
|
308
|
+
))
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
function registerTiptap(loader) {
|
|
312
|
+
registerComponentHelper(loader, TiptapWrapper, {
|
|
313
|
+
name: TIPTAP_COMPONENT_NAME,
|
|
314
|
+
displayName: "Tiptap Rich Text Editor",
|
|
315
|
+
defaultStyles: {
|
|
316
|
+
borderWidth: "1px",
|
|
317
|
+
borderStyle: "solid",
|
|
318
|
+
borderColor: "rgb(204,204,204)",
|
|
319
|
+
borderRadius: "4px",
|
|
320
|
+
padding: "10px",
|
|
321
|
+
width: "300px"
|
|
322
|
+
},
|
|
323
|
+
actions: [
|
|
324
|
+
{
|
|
325
|
+
type: "custom-action",
|
|
326
|
+
control: AddExtension
|
|
327
|
+
}
|
|
328
|
+
],
|
|
329
|
+
props: {
|
|
330
|
+
contentHtml: {
|
|
331
|
+
type: "string",
|
|
332
|
+
displayName: "HTML Content",
|
|
333
|
+
editOnly: true,
|
|
334
|
+
uncontrolledProp: "defaultContentHtml",
|
|
335
|
+
description: "Contents of the editor"
|
|
336
|
+
},
|
|
337
|
+
contentJson: {
|
|
338
|
+
type: "object",
|
|
339
|
+
displayName: "JSON Content",
|
|
340
|
+
hidden: () => true
|
|
341
|
+
},
|
|
342
|
+
extensions: {
|
|
343
|
+
type: "slot",
|
|
344
|
+
hidePlaceholder: true,
|
|
345
|
+
allowedComponents: allExtensions.map(
|
|
346
|
+
(ext) => `${TIPTAP_COMPONENT_NAME}-extension-${ext}`
|
|
347
|
+
)
|
|
348
|
+
},
|
|
349
|
+
toolbar: {
|
|
350
|
+
type: "slot",
|
|
351
|
+
hidePlaceholder: true,
|
|
352
|
+
allowedComponents: allExtensions.map(
|
|
353
|
+
(ext) => `${TIPTAP_COMPONENT_NAME}-toolbar-${ext}`
|
|
354
|
+
)
|
|
355
|
+
},
|
|
356
|
+
onChange: {
|
|
357
|
+
type: "eventHandler",
|
|
358
|
+
argTypes: [{ name: "content", type: "object" }]
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
states: {
|
|
362
|
+
content: {
|
|
363
|
+
type: "writable",
|
|
364
|
+
variableType: "object",
|
|
365
|
+
valueProp: "contentJson",
|
|
366
|
+
onChangeProp: "onChange"
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
importName: "TiptapWrapper",
|
|
370
|
+
importPath: "@plasmicpkgs/tiptap/skinny/registerTiptap"
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
export { AddExtension as A, TIPTAP_COMPONENT_NAME as T, Tiptap as a, TiptapWrapper as b, registerTiptap as c, registerComponentHelper as r, useTiptapContext as u };
|
|
375
|
+
//# sourceMappingURL=registerTiptap-6a2d0bb4.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registerTiptap-6a2d0bb4.esm.js","sources":["../src/contexts.tsx","../src/useIsClient.ts","../src/utils.ts","../src/registerTiptap.tsx"],"sourcesContent":["import { Mark, Node } from \"@tiptap/core\";\nimport type { BoldOptions } from \"@tiptap/extension-bold\";\nimport type { CodeOptions } from \"@tiptap/extension-code\";\nimport type { ItalicOptions } from \"@tiptap/extension-italic\";\nimport type { LinkOptions } from \"@tiptap/extension-link\";\nimport type { MentionOptions } from \"@tiptap/extension-mention\";\nimport type { StrikeOptions } from \"@tiptap/extension-strike\";\nimport type { UnderlineOptions } from \"@tiptap/extension-underline\";\nimport React, { useState } from \"react\";\n\nexport const RESET_TIMEOUT_MS = 500;\nexport interface TiptapContextProps {\n bold?: Mark<BoldOptions>;\n setBold: (boldOptions?: Mark<BoldOptions>) => void;\n code?: Mark<CodeOptions>;\n setCode: (codeOptions?: Mark<CodeOptions>) => void;\n italic?: Mark<ItalicOptions>;\n setItalic: (italicOptions?: Mark<ItalicOptions>) => void;\n link?: Mark<LinkOptions>;\n setLink: (linkOptions?: Mark<LinkOptions>) => void;\n mention?: Node<MentionOptions>;\n setMention: (mentionOptions?: Node<MentionOptions>) => void;\n strike?: Mark<StrikeOptions>;\n setStrike: (strikeOptions?: Mark<StrikeOptions>) => void;\n underline?: Mark<UnderlineOptions>;\n setUnderline: (underlineOptions?: Mark<UnderlineOptions>) => void;\n}\n\nexport const allExtensions: Extract<keyof TiptapContextProps, string>[] = [\n \"bold\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"code\",\n \"link\",\n \"mention\",\n];\n\nexport const TiptapContext = React.createContext<\n TiptapContextProps | undefined\n>(undefined);\n\nexport const useTiptapContext = () => {\n const context = React.useContext(TiptapContext);\n if (!context) {\n throw new Error(\n \"useTiptapContext must be used within a TiptapContextProvider\"\n );\n }\n return context;\n};\n\nexport const TiptapContextProvider = ({ children }: any) => {\n const [bold, setBold] = useState<Mark<BoldOptions> | undefined>(undefined);\n const [code, setCode] = useState<Mark<CodeOptions> | undefined>(undefined);\n const [italic, setItalic] = useState<Mark<ItalicOptions> | undefined>(\n undefined\n );\n const [link, setLink] = useState<Mark<LinkOptions> | undefined>(undefined);\n const [mention, setMention] = useState<Node<MentionOptions> | undefined>(\n undefined\n );\n const [strike, setStrike] = useState<Mark<StrikeOptions> | undefined>(\n undefined\n );\n const [underline, setUnderline] = useState<\n Mark<UnderlineOptions> | undefined\n >(undefined);\n\n return (\n <TiptapContext.Provider\n value={{\n bold,\n setBold,\n code,\n setCode,\n italic,\n setItalic,\n link,\n setLink,\n mention,\n /**\n * In situations where I want to remove an extension and add it again with new options (e.g. within a useEffect - see registerMention)\n * the options are not updated.\n * So after removing the extension, I want to wait a few seconds before I add it again,\n * so the Tiptap editor acknowledges the removal before it adds the extension back with new updated options.\n * @param mentionOptions\n * @returns\n */\n setMention: (mentionOptions?: Node<MentionOptions>) => {\n if (!mentionOptions) {\n setMention(mentionOptions);\n return;\n }\n setTimeout(() => {\n setMention(mentionOptions);\n }, RESET_TIMEOUT_MS);\n },\n strike,\n setStrike,\n underline,\n setUnderline,\n }}\n >\n {children}\n </TiptapContext.Provider>\n );\n};\n","import React from \"react\";\n\nexport function useIsClient() {\n const [loaded, setLoaded] = React.useState(false);\n useIsomorphicLayoutEffect(() => {\n setLoaded(true);\n });\n return loaded;\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst isBrowser = typeof window !== \"undefined\";\nexport const useIsomorphicLayoutEffect = isBrowser\n ? React.useLayoutEffect\n : React.useEffect;\n","import {\n ComponentMeta,\n default as registerComponent,\n} from \"@plasmicapp/host/registerComponent\";\nimport {\n default as registerGlobalContext,\n GlobalContextMeta,\n} from \"@plasmicapp/host/registerGlobalContext\";\nimport { default as registerToken } from \"@plasmicapp/host/registerToken\";\nimport React from \"react\";\n\nexport type Registerable = {\n registerComponent: typeof registerComponent;\n registerGlobalContext: typeof registerGlobalContext;\n registerToken: typeof registerToken;\n};\n\nexport function makeRegisterComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n registerComponentHelper(loader, component, meta);\n };\n}\n\nexport function makeRegisterGlobalContext<T extends React.ComponentType<any>>(\n component: T,\n meta: GlobalContextMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n if (loader) {\n loader.registerGlobalContext(component, meta);\n } else {\n registerGlobalContext(component, meta);\n }\n };\n}\n\nexport function registerComponentHelper<T extends React.ComponentType<any>>(\n loader: Registerable | undefined,\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n if (loader) {\n loader.registerComponent(component, meta);\n } else {\n registerComponent(component, meta);\n }\n}\n\ntype ReactElt = {\n children: ReactElt | ReactElt[];\n props: {\n children: ReactElt | ReactElt[];\n [prop: string]: any;\n } | null;\n type: React.ComponentType<any> | null;\n key: string | null;\n} | null;\n\nexport function traverseReactEltTree(\n children: React.ReactNode,\n callback: (elt: ReactElt) => void\n) {\n const rec = (elts: ReactElt | ReactElt[] | null) => {\n (Array.isArray(elts) ? elts : [elts]).forEach((elt) => {\n if (elt) {\n callback(elt);\n if (elt.children) {\n rec(elt.children);\n }\n if (elt.props?.children && elt.props.children !== elt.children) {\n rec(elt.props.children);\n }\n }\n });\n };\n rec(children as any);\n}\n\nexport function asArray<T>(x: T[] | T | undefined | null) {\n if (Array.isArray(x)) {\n return x;\n } else if (x == null) {\n return [];\n } else {\n return [x];\n }\n}\n","import { ActionProps } from \"@plasmicapp/host/registerComponent\";\nimport Document from \"@tiptap/extension-document\";\nimport Paragraph from \"@tiptap/extension-paragraph\";\nimport Text from \"@tiptap/extension-text\";\nimport type { Extensions, JSONContent } from \"@tiptap/react\";\nimport { EditorProvider } from \"@tiptap/react\";\nimport { Switch } from \"antd\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n allExtensions,\n TiptapContextProvider,\n useTiptapContext,\n} from \"./contexts\";\nimport { useIsClient } from \"./useIsClient\";\nimport {\n Registerable,\n registerComponentHelper,\n traverseReactEltTree,\n} from \"./utils\";\n\nexport const TIPTAP_COMPONENT_NAME = \"hostless-tiptap\";\n\nexport type TiptapProps = {\n contentHtml?: string;\n defaultContentHtml?: string;\n contentJson?: JSONContent;\n extensions?: React.ReactElement;\n toolbar?: React.ReactElement;\n className: string;\n onChange: (content: JSONContent) => void;\n};\n\nexport function Tiptap(props: TiptapProps) {\n const isClient = useIsClient();\n const [active, setActive] = useState<boolean>(false);\n const [refreshKey, setRefreshKey] = useState(0);\n const activeRef = useRef<boolean>();\n activeRef.current = active;\n\n const {\n extensions,\n contentHtml,\n defaultContentHtml,\n className,\n onChange,\n toolbar,\n } = props;\n const { ...tiptapContext } = useTiptapContext();\n const usedExtensions: Record<string, any> = allExtensions.reduce(\n (acc: any, ext) => {\n if (tiptapContext[ext] !== undefined) {\n acc[ext] = tiptapContext[ext];\n }\n return acc;\n },\n {}\n );\n\n const extensionsProp: Extensions = [\n Document,\n Paragraph,\n Text,\n ...Object.values(usedExtensions),\n ];\n\n // If you try to update the content via the content prop (as opposed to directly typing into the tiptap editor), the new content won't show. So we got to refresh the editor to make the default content appear.\n useEffect(() => {\n if (activeRef.current) return;\n setRefreshKey(Math.random() * 1000000);\n }, [contentHtml]);\n\n if (!isClient) {\n return null;\n }\n\n const css = `\n .tiptap {\n padding: 0;\n outline: none;\n }\n `;\n\n const toolbarProp = toolbar ? (\n <div style={{ display: \"flex\", alignItems: \"center\" }}>{toolbar}</div>\n ) : null;\n\n return (\n <div className={className} style={{ position: \"relative\" }}>\n <EditorProvider\n key={`${extensionsProp.length}${refreshKey}`}\n // extensions={extensionsProp}\n extensions={extensionsProp}\n content={contentHtml || defaultContentHtml}\n onCreate={({ editor }) => {\n onChange(editor.getJSON());\n }}\n onUpdate={({ editor }) => {\n onChange(editor.getJSON());\n }}\n onFocus={() => setActive(true)}\n onBlur={() => setActive(false)}\n slotBefore={toolbarProp}\n // slotAfter={<MyEditorFooter />}\n\n // TODO: HIDE children prop\n children={undefined}\n editorProps={{\n attributes: {\n className,\n },\n }}\n />\n {extensions}\n <style dangerouslySetInnerHTML={{ __html: css }} />\n </div>\n );\n}\n\nexport function TiptapWrapper(props: TiptapProps) {\n return (\n <TiptapContextProvider>\n <Tiptap {...props} />\n </TiptapContextProvider>\n );\n}\n\nexport function AddExtension({\n studioOps,\n componentProps,\n}: ActionProps<TiptapProps>) {\n const usedExtensions: string[] = useMemo(() => {\n const list: string[] = [];\n traverseReactEltTree(componentProps?.extensions, (elt) => {\n const ext = elt?.type?.displayName?.toLowerCase?.();\n if (ext) {\n list.push(ext);\n }\n });\n return list;\n }, [componentProps?.extensions]);\n\n const usedExtensionTools: string[] = useMemo(() => {\n const list: string[] = [];\n traverseReactEltTree(componentProps?.toolbar, (elt) => {\n const ext = elt?.type?.displayName?.toLowerCase?.();\n if (ext && ext.includes(\"toolbar\")) {\n list.push(ext.replace(\"toolbar\", \"\"));\n }\n });\n return list;\n }, [componentProps?.toolbar]);\n\n const handleChange = (extName: string, add: boolean) => {\n if (add) {\n studioOps.appendToSlot(\n {\n type: \"component\",\n name: `${TIPTAP_COMPONENT_NAME}-extension-${extName}`,\n props: {},\n },\n \"extensions\"\n );\n studioOps.appendToSlot(\n {\n type: \"component\",\n name: `${TIPTAP_COMPONENT_NAME}-toolbar-${extName}`,\n props: {},\n },\n \"toolbar\"\n );\n } else {\n const extIndices = usedExtensions.flatMap((ext, i) =>\n ext === extName ? i : []\n );\n extIndices\n .reverse()\n .forEach(\n (i) => i !== -1 && studioOps.removeFromSlotAt(i, \"extensions\")\n );\n\n const toolIndices = usedExtensionTools.flatMap((ext, i) =>\n ext === extName ? i : []\n );\n toolIndices\n .reverse()\n .forEach((i) => i !== -1 && studioOps.removeFromSlotAt(i, \"toolbar\"));\n }\n };\n\n return (\n <div\n style={{\n marginBottom: 10,\n paddingBottom: 10,\n borderBottom: \"1px dashed #ccc\",\n }}\n >\n <p>\n You can add capabilities to Tiptap Rich Text Editor using the tools\n below.\n </p>\n <p>\n To further customize the extensions, find them under the Editor's\n \"extensions\" and \"toolbar\" slots\n </p>\n {allExtensions.map((ext) => (\n <label\n data-test-id={`custom-action-${ext}`}\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n marginBottom: 5,\n color: \"#1b1b18\",\n }}\n >\n <span>{ext}</span>\n <Switch\n size=\"small\"\n checked={\n usedExtensions.includes(ext) || usedExtensionTools.includes(ext)\n }\n onChange={(checked) => handleChange(ext, checked)}\n />\n </label>\n ))}\n </div>\n );\n}\n\nexport function registerTiptap(loader?: Registerable) {\n registerComponentHelper(loader, TiptapWrapper, {\n name: TIPTAP_COMPONENT_NAME,\n displayName: \"Tiptap Rich Text Editor\",\n defaultStyles: {\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderColor: \"rgb(204,204,204)\",\n borderRadius: \"4px\",\n padding: \"10px\",\n width: \"300px\",\n },\n actions: [\n {\n type: \"custom-action\",\n control: AddExtension,\n },\n ],\n props: {\n contentHtml: {\n type: \"string\",\n displayName: \"HTML Content\",\n editOnly: true,\n uncontrolledProp: \"defaultContentHtml\",\n description: \"Contents of the editor\",\n },\n contentJson: {\n type: \"object\",\n displayName: \"JSON Content\",\n hidden: () => true,\n },\n extensions: {\n type: \"slot\",\n hidePlaceholder: true,\n allowedComponents: allExtensions.map(\n (ext) => `${TIPTAP_COMPONENT_NAME}-extension-${ext}`\n ),\n },\n toolbar: {\n type: \"slot\",\n hidePlaceholder: true,\n allowedComponents: allExtensions.map(\n (ext) => `${TIPTAP_COMPONENT_NAME}-toolbar-${ext}`\n ),\n },\n onChange: {\n type: \"eventHandler\",\n argTypes: [{ name: \"content\", type: \"object\" }],\n },\n },\n states: {\n content: {\n type: \"writable\",\n variableType: \"object\",\n valueProp: \"contentJson\",\n onChangeProp: \"onChange\",\n },\n },\n importName: \"TiptapWrapper\",\n importPath: \"@plasmicpkgs/tiptap/skinny/registerTiptap\",\n });\n}\n"],"names":[],"mappings":";;;;;;;;;AAUO,MAAM,gBAAmB,GAAA,GAAA,CAAA;AAkBzB,MAAM,aAA6D,GAAA;AAAA,EACxE,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AACF,CAAA,CAAA;AAEa,MAAA,aAAA,GAAgB,KAAM,CAAA,aAAA,CAEjC,KAAS,CAAA,CAAA,CAAA;AAEJ,MAAM,mBAAmB,MAAM;AACpC,EAAM,MAAA,OAAA,GAAU,KAAM,CAAA,UAAA,CAAW,aAAa,CAAA,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,8DAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAO,OAAA,OAAA,CAAA;AACT,EAAA;AAEO,MAAM,qBAAwB,GAAA,CAAC,EAAE,QAAA,EAAoB,KAAA;AAC1D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAwC,KAAS,CAAA,CAAA,CAAA;AACzE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAwC,KAAS,CAAA,CAAA,CAAA;AACzE,EAAM,MAAA,CAAC,MAAQ,EAAA,SAAS,CAAI,GAAA,QAAA;AAAA,IAC1B,KAAA,CAAA;AAAA,GACF,CAAA;AACA,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAwC,KAAS,CAAA,CAAA,CAAA;AACzE,EAAM,MAAA,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,QAAA;AAAA,IAC5B,KAAA,CAAA;AAAA,GACF,CAAA;AACA,EAAM,MAAA,CAAC,MAAQ,EAAA,SAAS,CAAI,GAAA,QAAA;AAAA,IAC1B,KAAA,CAAA;AAAA,GACF,CAAA;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAEhC,KAAS,CAAA,CAAA,CAAA;AAEX,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,aAAc,CAAA,QAAA;AAAA,IAAd;AAAA,MACC,KAAO,EAAA;AAAA,QACL,IAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,UAAA,EAAY,CAAC,cAA0C,KAAA;AACrD,UAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,YAAA,UAAA,CAAW,cAAc,CAAA,CAAA;AACzB,YAAA,OAAA;AAAA,WACF;AACA,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,UAAA,CAAW,cAAc,CAAA,CAAA;AAAA,aACxB,gBAAgB,CAAA,CAAA;AAAA,SACrB;AAAA,QACA,MAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA;AAAA,OACF;AAAA,KAAA;AAAA,IAEC,QAAA;AAAA,GACH,CAAA;AAEJ,CAAA;;ACzGO,SAAS,WAAc,GAAA;AAC5B,EAAA,MAAM,CAAC,MAAQ,EAAA,SAAS,CAAI,GAAA,KAAA,CAAM,SAAS,KAAK,CAAA,CAAA;AAChD,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,SAAA,CAAU,IAAI,CAAA,CAAA;AAAA,GACf,CAAA,CAAA;AACD,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAIA,MAAM,SAAA,GAAY,OAAO,MAAW,KAAA,WAAA,CAAA;AAC7B,MAAM,yBAA4B,GAAA,SAAA,GACrC,KAAM,CAAA,eAAA,GACN,KAAM,CAAA,SAAA;;ACwBM,SAAA,uBAAA,CACd,MACA,EAAA,SAAA,EACA,IACA,EAAA;AACA,EAAA,IAAI,MAAQ,EAAA;AACV,IAAO,MAAA,CAAA,iBAAA,CAAkB,WAAW,IAAI,CAAA,CAAA;AAAA,GACnC,MAAA;AACL,IAAA,iBAAA,CAAkB,WAAW,IAAI,CAAA,CAAA;AAAA,GACnC;AACF,CAAA;AAYgB,SAAA,oBAAA,CACd,UACA,QACA,EAAA;AACA,EAAM,MAAA,GAAA,GAAM,CAAC,IAAuC,KAAA;AAClD,IAAC,CAAA,KAAA,CAAM,OAAQ,CAAA,IAAI,CAAI,GAAA,IAAA,GAAO,CAAC,IAAI,CAAA,EAAG,OAAQ,CAAA,CAAC,GAAQ,KAAA;AAlE3D,MAAA,IAAA,EAAA,CAAA;AAmEM,MAAA,IAAI,GAAK,EAAA;AACP,QAAA,QAAA,CAAS,GAAG,CAAA,CAAA;AACZ,QAAA,IAAI,IAAI,QAAU,EAAA;AAChB,UAAA,GAAA,CAAI,IAAI,QAAQ,CAAA,CAAA;AAAA,SAClB;AACA,QAAI,IAAA,CAAA,CAAA,EAAA,GAAA,GAAA,CAAI,UAAJ,IAAW,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,KAAY,IAAI,KAAM,CAAA,QAAA,KAAa,IAAI,QAAU,EAAA;AAC9D,UAAI,GAAA,CAAA,GAAA,CAAI,MAAM,QAAQ,CAAA,CAAA;AAAA,SACxB;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAAA,GACH,CAAA;AACA,EAAA,GAAA,CAAI,QAAe,CAAA,CAAA;AACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3DO,MAAM,qBAAwB,GAAA,kBAAA;AAY9B,SAAS,OAAO,KAAoB,EAAA;AACzC,EAAA,MAAM,WAAW,WAAY,EAAA,CAAA;AAC7B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAkB,KAAK,CAAA,CAAA;AACnD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,CAAC,CAAA,CAAA;AAC9C,EAAA,MAAM,YAAY,MAAgB,EAAA,CAAA;AAClC,EAAA,SAAA,CAAU,OAAU,GAAA,MAAA,CAAA;AAEpB,EAAM,MAAA;AAAA,IACJ,UAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,GACE,GAAA,KAAA,CAAA;AACJ,EAAW,MAAA,aAAA,GAAA,SAAA,CAAkB,kBAAlB,EAAA,EAAA,CAAA,CAAA;AACX,EAAA,MAAM,iBAAsC,aAAc,CAAA,MAAA;AAAA,IACxD,CAAC,KAAU,GAAQ,KAAA;AACjB,MAAI,IAAA,aAAA,CAAc,GAAG,CAAA,KAAM,KAAW,CAAA,EAAA;AACpC,QAAI,GAAA,CAAA,GAAG,CAAI,GAAA,aAAA,CAAc,GAAG,CAAA,CAAA;AAAA,OAC9B;AACA,MAAO,OAAA,GAAA,CAAA;AAAA,KACT;AAAA,IACA,EAAC;AAAA,GACH,CAAA;AAEA,EAAA,MAAM,cAA6B,GAAA;AAAA,IACjC,QAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA;AAAA,IACA,GAAG,MAAO,CAAA,MAAA,CAAO,cAAc,CAAA;AAAA,GACjC,CAAA;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAU,CAAA,OAAA;AAAS,MAAA,OAAA;AACvB,IAAc,aAAA,CAAA,IAAA,CAAK,MAAO,EAAA,GAAI,GAAO,CAAA,CAAA;AAAA,GACvC,EAAG,CAAC,WAAW,CAAC,CAAA,CAAA;AAEhB,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,GAAM,GAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAAA;AAOZ,EAAA,MAAM,WAAc,GAAA,OAAA,mBACjB,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,KAAO,EAAA,EAAE,OAAS,EAAA,MAAA,EAAQ,UAAY,EAAA,QAAA,EAAa,EAAA,EAAA,OAAQ,CAC9D,GAAA,IAAA,CAAA;AAEJ,EAAA,2CACG,KAAI,EAAA,EAAA,SAAA,EAAsB,OAAO,EAAE,QAAA,EAAU,YAC5C,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,CAAG,EAAA,cAAA,CAAe,MAAS,CAAA,EAAA,UAAA,CAAA,CAAA;AAAA,MAEhC,UAAY,EAAA,cAAA;AAAA,MACZ,SAAS,WAAe,IAAA,kBAAA;AAAA,MACxB,QAAU,EAAA,CAAC,EAAE,MAAA,EAAa,KAAA;AACxB,QAAS,QAAA,CAAA,MAAA,CAAO,SAAS,CAAA,CAAA;AAAA,OAC3B;AAAA,MACA,QAAU,EAAA,CAAC,EAAE,MAAA,EAAa,KAAA;AACxB,QAAS,QAAA,CAAA,MAAA,CAAO,SAAS,CAAA,CAAA;AAAA,OAC3B;AAAA,MACA,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,MAC7B,MAAA,EAAQ,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,MAC7B,UAAY,EAAA,WAAA;AAAA,MAIZ,QAAU,EAAA,KAAA,CAAA;AAAA,MACV,WAAa,EAAA;AAAA,QACX,UAAY,EAAA;AAAA,UACV,SAAA;AAAA,SACF;AAAA,OACF;AAAA,KAAA;AAAA,GACF,EACC,4BACA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAM,yBAAyB,EAAE,MAAA,EAAQ,GAAI,EAAA,EAAG,CACnD,CAAA,CAAA;AAEJ,CAAA;AAEO,SAAS,cAAc,KAAoB,EAAA;AAChD,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,qBAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,cAAA,CAAA,EAAA,EAAW,MAAO,CACrB,CAAA,CAAA;AAEJ,CAAA;AAEO,SAAS,YAAa,CAAA;AAAA,EAC3B,SAAA;AAAA,EACA,cAAA;AACF,CAA6B,EAAA;AAC3B,EAAM,MAAA,cAAA,GAA2B,QAAQ,MAAM;AAC7C,IAAA,MAAM,OAAiB,EAAC,CAAA;AACxB,IAAqB,oBAAA,CAAA,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAgB,UAAY,EAAA,CAAC,GAAQ,KAAA;AApI9D,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAqIM,MAAA,MAAM,OAAM,EAAK,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,KAAL,IAAW,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,KAAX,mBAAwB,WAAxB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,CAAA,CAAA;AACZ,MAAA,IAAI,GAAK,EAAA;AACP,QAAA,IAAA,CAAK,KAAK,GAAG,CAAA,CAAA;AAAA,OACf;AAAA,KACD,CAAA,CAAA;AACD,IAAO,OAAA,IAAA,CAAA;AAAA,GACN,EAAA,CAAC,cAAgB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAA,UAAU,CAAC,CAAA,CAAA;AAE/B,EAAM,MAAA,kBAAA,GAA+B,QAAQ,MAAM;AACjD,IAAA,MAAM,OAAiB,EAAC,CAAA;AACxB,IAAqB,oBAAA,CAAA,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAgB,OAAS,EAAA,CAAC,GAAQ,KAAA;AA/I3D,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAgJM,MAAA,MAAM,OAAM,EAAK,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,KAAL,IAAW,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,KAAX,mBAAwB,WAAxB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,CAAA,CAAA;AACZ,MAAA,IAAI,GAAO,IAAA,GAAA,CAAI,QAAS,CAAA,SAAS,CAAG,EAAA;AAClC,QAAA,IAAA,CAAK,IAAK,CAAA,GAAA,CAAI,OAAQ,CAAA,SAAA,EAAW,EAAE,CAAC,CAAA,CAAA;AAAA,OACtC;AAAA,KACD,CAAA,CAAA;AACD,IAAO,OAAA,IAAA,CAAA;AAAA,GACN,EAAA,CAAC,cAAgB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAA,OAAO,CAAC,CAAA,CAAA;AAE5B,EAAM,MAAA,YAAA,GAAe,CAAC,OAAA,EAAiB,GAAiB,KAAA;AACtD,IAAA,IAAI,GAAK,EAAA;AACP,MAAU,SAAA,CAAA,YAAA;AAAA,QACR;AAAA,UACE,IAAM,EAAA,WAAA;AAAA,UACN,IAAA,EAAM,GAAG,qBAAmC,CAAA,WAAA,EAAA,OAAA,CAAA,CAAA;AAAA,UAC5C,OAAO,EAAC;AAAA,SACV;AAAA,QACA,YAAA;AAAA,OACF,CAAA;AACA,MAAU,SAAA,CAAA,YAAA;AAAA,QACR;AAAA,UACE,IAAM,EAAA,WAAA;AAAA,UACN,IAAA,EAAM,GAAG,qBAAiC,CAAA,SAAA,EAAA,OAAA,CAAA,CAAA;AAAA,UAC1C,OAAO,EAAC;AAAA,SACV;AAAA,QACA,SAAA;AAAA,OACF,CAAA;AAAA,KACK,MAAA;AACL,MAAA,MAAM,aAAa,cAAe,CAAA,OAAA;AAAA,QAAQ,CAAC,GAAK,EAAA,CAAA,KAC9C,GAAQ,KAAA,OAAA,GAAU,IAAI,EAAC;AAAA,OACzB,CAAA;AACA,MAAA,UAAA,CACG,SACA,CAAA,OAAA;AAAA,QACC,CAAC,CAAM,KAAA,CAAA,KAAM,MAAM,SAAU,CAAA,gBAAA,CAAiB,GAAG,YAAY,CAAA;AAAA,OAC/D,CAAA;AAEF,MAAA,MAAM,cAAc,kBAAmB,CAAA,OAAA;AAAA,QAAQ,CAAC,GAAK,EAAA,CAAA,KACnD,GAAQ,KAAA,OAAA,GAAU,IAAI,EAAC;AAAA,OACzB,CAAA;AACA,MACG,WAAA,CAAA,OAAA,EACA,CAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAM,KAAA,CAAA,CAAA,IAAM,SAAU,CAAA,gBAAA,CAAiB,CAAG,EAAA,SAAS,CAAC,CAAA,CAAA;AAAA,KACxE;AAAA,GACF,CAAA;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA;AAAA,QACL,YAAc,EAAA,EAAA;AAAA,QACd,aAAe,EAAA,EAAA;AAAA,QACf,YAAc,EAAA,iBAAA;AAAA,OAChB;AAAA,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA,CAAC,WAAE,4EAGH,CAAA;AAAA,oBACA,KAAA,CAAA,aAAA,CAAC,WAAE,CAGH,kGAAA,CAAA,CAAA;AAAA,IACC,aAAA,CAAc,GAAI,CAAA,CAAC,GAClB,qBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,gBAAc,CAAiB,cAAA,EAAA,GAAA,CAAA,CAAA;AAAA,QAC/B,KAAO,EAAA;AAAA,UACL,OAAS,EAAA,MAAA;AAAA,UACT,cAAgB,EAAA,eAAA;AAAA,UAChB,YAAc,EAAA,CAAA;AAAA,UACd,KAAO,EAAA,SAAA;AAAA,SACT;AAAA,OAAA;AAAA,sBAEA,KAAA,CAAA,aAAA,CAAC,cAAM,GAAI,CAAA;AAAA,sBACX,KAAA,CAAA,aAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,IAAK,EAAA,OAAA;AAAA,UACL,SACE,cAAe,CAAA,QAAA,CAAS,GAAG,CAAK,IAAA,kBAAA,CAAmB,SAAS,GAAG,CAAA;AAAA,UAEjE,QAAU,EAAA,CAAC,OAAY,KAAA,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,SAAA;AAAA,OAClD;AAAA,KAEH,CAAA;AAAA,GACH,CAAA;AAEJ,CAAA;AAEO,SAAS,eAAe,MAAuB,EAAA;AACpD,EAAA,uBAAA,CAAwB,QAAQ,aAAe,EAAA;AAAA,IAC7C,IAAM,EAAA,qBAAA;AAAA,IACN,WAAa,EAAA,yBAAA;AAAA,IACb,aAAe,EAAA;AAAA,MACb,WAAa,EAAA,KAAA;AAAA,MACb,WAAa,EAAA,OAAA;AAAA,MACb,WAAa,EAAA,kBAAA;AAAA,MACb,YAAc,EAAA,KAAA;AAAA,MACd,OAAS,EAAA,MAAA;AAAA,MACT,KAAO,EAAA,OAAA;AAAA,KACT;AAAA,IACA,OAAS,EAAA;AAAA,MACP;AAAA,QACE,IAAM,EAAA,eAAA;AAAA,QACN,OAAS,EAAA,YAAA;AAAA,OACX;AAAA,KACF;AAAA,IACA,KAAO,EAAA;AAAA,MACL,WAAa,EAAA;AAAA,QACX,IAAM,EAAA,QAAA;AAAA,QACN,WAAa,EAAA,cAAA;AAAA,QACb,QAAU,EAAA,IAAA;AAAA,QACV,gBAAkB,EAAA,oBAAA;AAAA,QAClB,WAAa,EAAA,wBAAA;AAAA,OACf;AAAA,MACA,WAAa,EAAA;AAAA,QACX,IAAM,EAAA,QAAA;AAAA,QACN,WAAa,EAAA,cAAA;AAAA,QACb,QAAQ,MAAM,IAAA;AAAA,OAChB;AAAA,MACA,UAAY,EAAA;AAAA,QACV,IAAM,EAAA,MAAA;AAAA,QACN,eAAiB,EAAA,IAAA;AAAA,QACjB,mBAAmB,aAAc,CAAA,GAAA;AAAA,UAC/B,CAAC,GAAQ,KAAA,CAAA,EAAG,qBAAmC,CAAA,WAAA,EAAA,GAAA,CAAA,CAAA;AAAA,SACjD;AAAA,OACF;AAAA,MACA,OAAS,EAAA;AAAA,QACP,IAAM,EAAA,MAAA;AAAA,QACN,eAAiB,EAAA,IAAA;AAAA,QACjB,mBAAmB,aAAc,CAAA,GAAA;AAAA,UAC/B,CAAC,GAAQ,KAAA,CAAA,EAAG,qBAAiC,CAAA,SAAA,EAAA,GAAA,CAAA,CAAA;AAAA,SAC/C;AAAA,OACF;AAAA,MACA,QAAU,EAAA;AAAA,QACR,IAAM,EAAA,cAAA;AAAA,QACN,UAAU,CAAC,EAAE,MAAM,SAAW,EAAA,IAAA,EAAM,UAAU,CAAA;AAAA,OAChD;AAAA,KACF;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,OAAS,EAAA;AAAA,QACP,IAAM,EAAA,UAAA;AAAA,QACN,YAAc,EAAA,QAAA;AAAA,QACd,SAAW,EAAA,aAAA;AAAA,QACX,YAAc,EAAA,UAAA;AAAA,OAChB;AAAA,KACF;AAAA,IACA,UAAY,EAAA,eAAA;AAAA,IACZ,UAAY,EAAA,2CAAA;AAAA,GACb,CAAA,CAAA;AACH;;;;"}
|