ritext 1.0.19 → 1.0.25

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 (133) hide show
  1. package/LICENSE +57 -0
  2. package/README.md +15 -41
  3. package/dist/chunk-EN4BPI7N.mjs +1213 -0
  4. package/dist/chunk-FJQ4FZRS.mjs +98 -0
  5. package/dist/chunk-M4ORWR74.mjs +31 -0
  6. package/dist/chunk-SJFT7WNM.mjs +38 -0
  7. package/dist/chunk-W367UGID.mjs +55 -0
  8. package/dist/{chunk-FWCSY2DS.mjs → chunk-WNQUEZJF.mjs} +22 -1
  9. package/dist/{chunk-D47XME55.mjs → chunk-WXCHG3NQ.mjs} +8 -2
  10. package/dist/chunk-WZKGD3DD.mjs +231 -0
  11. package/dist/extension/backgroundcolor.d.mts +16 -0
  12. package/dist/extension/backgroundcolor.d.ts +16 -0
  13. package/dist/extension/backgroundcolor.js +668 -0
  14. package/dist/extension/backgroundcolor.mjs +107 -0
  15. package/dist/extension/base.d.mts +6 -0
  16. package/dist/extension/base.d.ts +6 -0
  17. package/dist/extension/base.js +65 -0
  18. package/dist/extension/base.mjs +22 -0
  19. package/dist/extension/blockquote.d.mts +10 -0
  20. package/dist/extension/blockquote.d.ts +10 -0
  21. package/dist/extension/blockquote.js +239 -0
  22. package/dist/extension/blockquote.mjs +46 -0
  23. package/dist/extension/bold.d.mts +7 -2
  24. package/dist/extension/bold.d.ts +7 -2
  25. package/dist/extension/bold.js +22 -45
  26. package/dist/extension/bold.mjs +13 -35
  27. package/dist/extension/bulletlist.d.mts +10 -0
  28. package/dist/extension/bulletlist.d.ts +10 -0
  29. package/dist/extension/bulletlist.js +241 -0
  30. package/dist/extension/bulletlist.mjs +46 -0
  31. package/dist/extension/clearformat.d.mts +1 -1
  32. package/dist/extension/clearformat.d.ts +1 -1
  33. package/dist/extension/clearformat.js +11 -6
  34. package/dist/extension/clearformat.mjs +8 -35
  35. package/dist/extension/color.d.mts +17 -0
  36. package/dist/extension/color.d.ts +17 -0
  37. package/dist/extension/color.js +580 -0
  38. package/dist/extension/color.mjs +12 -0
  39. package/dist/extension/emoji.d.mts +15 -0
  40. package/dist/extension/emoji.d.ts +15 -0
  41. package/dist/extension/emoji.js +421 -0
  42. package/dist/extension/emoji.mjs +158 -0
  43. package/dist/extension/font-family.d.mts +8 -11
  44. package/dist/extension/font-family.d.ts +8 -11
  45. package/dist/extension/font-family.js +11 -12
  46. package/dist/extension/font-family.mjs +10 -11
  47. package/dist/extension/font-size.d.mts +8 -11
  48. package/dist/extension/font-size.d.ts +8 -11
  49. package/dist/extension/font-size.js +10 -12
  50. package/dist/extension/font-size.mjs +9 -11
  51. package/dist/extension/heading.d.mts +10 -10
  52. package/dist/extension/heading.d.ts +10 -10
  53. package/dist/extension/heading.js +68 -80
  54. package/dist/extension/heading.mjs +40 -206
  55. package/dist/extension/history.d.mts +4 -2
  56. package/dist/extension/history.d.ts +4 -2
  57. package/dist/extension/history.js +16 -9
  58. package/dist/extension/history.mjs +16 -64
  59. package/dist/extension/horizontalrule.d.mts +10 -0
  60. package/dist/extension/horizontalrule.d.ts +10 -0
  61. package/dist/extension/horizontalrule.js +242 -0
  62. package/dist/extension/horizontalrule.mjs +42 -0
  63. package/dist/extension/image.d.mts +26 -0
  64. package/dist/extension/image.d.ts +26 -0
  65. package/dist/extension/image.js +1611 -0
  66. package/dist/extension/image.mjs +1153 -0
  67. package/dist/extension/indentoutdent.d.mts +21 -0
  68. package/dist/extension/indentoutdent.d.ts +21 -0
  69. package/dist/extension/indentoutdent.js +380 -0
  70. package/dist/extension/indentoutdent.mjs +164 -0
  71. package/dist/extension/italic.d.mts +7 -2
  72. package/dist/extension/italic.d.ts +7 -2
  73. package/dist/extension/italic.js +22 -45
  74. package/dist/extension/italic.mjs +14 -40
  75. package/dist/extension/lineheight.d.mts +15 -0
  76. package/dist/extension/lineheight.d.ts +15 -0
  77. package/dist/extension/lineheight.js +342 -0
  78. package/dist/extension/lineheight.mjs +87 -0
  79. package/dist/extension/link.d.mts +15 -0
  80. package/dist/extension/link.d.ts +15 -0
  81. package/dist/extension/link.js +588 -0
  82. package/dist/extension/link.mjs +278 -0
  83. package/dist/extension/orderedlist.d.mts +10 -0
  84. package/dist/extension/orderedlist.d.ts +10 -0
  85. package/dist/extension/orderedlist.js +241 -0
  86. package/dist/extension/orderedlist.mjs +46 -0
  87. package/dist/extension/strike.d.mts +8 -3
  88. package/dist/extension/strike.d.ts +8 -3
  89. package/dist/extension/strike.js +22 -45
  90. package/dist/extension/strike.mjs +14 -40
  91. package/dist/extension/subandsuperscript.d.mts +7 -10
  92. package/dist/extension/subandsuperscript.d.ts +7 -10
  93. package/dist/extension/subandsuperscript.js +66 -77
  94. package/dist/extension/subandsuperscript.mjs +18 -48
  95. package/dist/extension/subscript.d.mts +4 -2
  96. package/dist/extension/subscript.d.ts +4 -2
  97. package/dist/extension/subscript.js +20 -45
  98. package/dist/extension/subscript.mjs +10 -10
  99. package/dist/extension/superscript.d.mts +4 -2
  100. package/dist/extension/superscript.d.ts +4 -2
  101. package/dist/extension/superscript.js +20 -45
  102. package/dist/extension/superscript.mjs +10 -10
  103. package/dist/extension/table.d.mts +12 -0
  104. package/dist/extension/table.d.ts +12 -0
  105. package/dist/extension/table.js +585 -0
  106. package/dist/extension/table.mjs +324 -0
  107. package/dist/extension/tasklist.d.mts +10 -0
  108. package/dist/extension/tasklist.d.ts +10 -0
  109. package/dist/extension/tasklist.js +246 -0
  110. package/dist/extension/tasklist.mjs +52 -0
  111. package/dist/extension/textalign.d.mts +15 -0
  112. package/dist/extension/textalign.d.ts +15 -0
  113. package/dist/extension/textalign.js +404 -0
  114. package/dist/extension/textalign.mjs +79 -0
  115. package/dist/extension/underline.d.mts +7 -2
  116. package/dist/extension/underline.d.ts +7 -2
  117. package/dist/extension/underline.js +22 -45
  118. package/dist/extension/underline.mjs +14 -39
  119. package/dist/index.css +683 -31
  120. package/dist/index.d.mts +3 -1
  121. package/dist/index.d.ts +3 -1
  122. package/dist/index.js +306 -24
  123. package/dist/index.mjs +141 -13
  124. package/dist/tiptap-ext.type-B3TtT7-J.d.mts +43 -0
  125. package/dist/tiptap-ext.type-B3TtT7-J.d.ts +43 -0
  126. package/package.json +41 -28
  127. package/dist/chunk-2YUUKIIT.mjs +0 -149
  128. package/dist/chunk-7QOFJIQ3.mjs +0 -90
  129. package/dist/chunk-GSHINFPO.mjs +0 -53
  130. package/dist/chunk-LMOTHRGQ.mjs +0 -37
  131. package/dist/chunk-MBF77NHS.mjs +0 -37
  132. package/dist/tiptap-ext.type-DrneAC5G.d.mts +0 -39
  133. package/dist/tiptap-ext.type-DrneAC5G.d.ts +0 -39
package/dist/index.d.mts CHANGED
@@ -6,8 +6,10 @@ interface Props$2 {
6
6
  children?: ReactNode;
7
7
  extensions?: Extensions;
8
8
  className?: string;
9
+ dragHandler?: boolean;
10
+ showBubbleMenu?: boolean;
9
11
  }
10
- declare const Editor: ({ children, extensions, className }: Props$2) => react_jsx_runtime.JSX.Element;
12
+ declare const Editor: ({ children, extensions, className, dragHandler, showBubbleMenu }: Props$2) => react_jsx_runtime.JSX.Element;
11
13
 
12
14
  interface Props$1 {
13
15
  className?: string;
package/dist/index.d.ts CHANGED
@@ -6,8 +6,10 @@ interface Props$2 {
6
6
  children?: ReactNode;
7
7
  extensions?: Extensions;
8
8
  className?: string;
9
+ dragHandler?: boolean;
10
+ showBubbleMenu?: boolean;
9
11
  }
10
- declare const Editor: ({ children, extensions, className }: Props$2) => react_jsx_runtime.JSX.Element;
12
+ declare const Editor: ({ children, extensions, className, dragHandler, showBubbleMenu }: Props$2) => react_jsx_runtime.JSX.Element;
11
13
 
12
14
  interface Props$1 {
13
15
  className?: string;
package/dist/index.js CHANGED
@@ -1,10 +1,39 @@
1
1
  "use strict";
2
2
  var __create = Object.create;
3
3
  var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
4
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
7
  var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
9
  var __getProtoOf = Object.getPrototypeOf;
7
10
  var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __objRest = (source, exclude) => {
26
+ var target = {};
27
+ for (var prop in source)
28
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
29
+ target[prop] = source[prop];
30
+ if (source != null && __getOwnPropSymbols)
31
+ for (var prop of __getOwnPropSymbols(source)) {
32
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
33
+ target[prop] = source[prop];
34
+ }
35
+ return target;
36
+ };
8
37
  var __export = (target, all) => {
9
38
  for (var name in all)
10
39
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -35,43 +64,287 @@ __export(src_exports, {
35
64
  Toolbar: () => Toolbar_default
36
65
  });
37
66
  module.exports = __toCommonJS(src_exports);
67
+ var import_dist = require("@siamf/react-color-pick/dist/index.css");
38
68
 
39
69
  // src/lib/Editor.tsx
40
- var import_react2 = require("react");
41
- var import_react3 = require("@tiptap/react");
42
- var import_extension_document = __toESM(require("@tiptap/extension-document"));
43
- var import_extension_paragraph = __toESM(require("@tiptap/extension-paragraph"));
44
- var import_extension_text = __toESM(require("@tiptap/extension-text"));
70
+ var import_react7 = require("react");
71
+ var import_react8 = require("@tiptap/react");
45
72
 
46
- // src/lib/context/editor.context.tsx
47
- var import_react = require("react");
73
+ // src/lib/internal_com/RiDragHandler.tsx
74
+ var import_extension_drag_handle_react = __toESM(require("@tiptap/extension-drag-handle-react"));
75
+ var import_react4 = require("@tiptap/react");
76
+ var import_state = require("@tiptap/pm/state");
77
+
78
+ // src/lib/icons/index.tsx
48
79
  var import_jsx_runtime = require("react/jsx-runtime");
49
- var EditorContext = (0, import_react.createContext)({ editor: null });
80
+ var DragVerticalIcon = (_a) => {
81
+ var _b = _a, { size = 17, className } = _b, props = __objRest(_b, ["size", "className"]);
82
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
83
+ "svg",
84
+ __spreadProps(__spreadValues({
85
+ xmlns: "http://www.w3.org/2000/svg",
86
+ viewBox: "0 0 24 24",
87
+ fill: "none",
88
+ stroke: "currentColor",
89
+ strokeWidth: 2,
90
+ strokeLinecap: "round",
91
+ strokeLinejoin: "round",
92
+ width: size,
93
+ height: size,
94
+ className
95
+ }, props), {
96
+ children: [
97
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "9", cy: "12", r: "1" }),
98
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "9", cy: "5", r: "1" }),
99
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "9", cy: "19", r: "1" }),
100
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "15", cy: "12", r: "1" }),
101
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "15", cy: "5", r: "1" }),
102
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "15", cy: "19", r: "1" })
103
+ ]
104
+ })
105
+ );
106
+ };
107
+ var PlusIcon = (_a) => {
108
+ var _b = _a, { size = 17, className } = _b, props = __objRest(_b, ["size", "className"]);
109
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
110
+ "svg",
111
+ __spreadProps(__spreadValues({
112
+ xmlns: "http://www.w3.org/2000/svg",
113
+ viewBox: "0 0 24 24",
114
+ fill: "none",
115
+ stroke: "currentColor",
116
+ strokeWidth: 2,
117
+ strokeLinecap: "round",
118
+ strokeLinejoin: "round",
119
+ width: size,
120
+ height: size,
121
+ className
122
+ }, props), {
123
+ children: [
124
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M5 12h14" }),
125
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 5v14" })
126
+ ]
127
+ })
128
+ );
129
+ };
130
+
131
+ // src/lib/components/_com/Tooltip.tsx
132
+ var import_react = require("react");
133
+ var import_react2 = require("@floating-ui/react");
134
+ var import_react3 = require("motion/react");
135
+ var import_tailwind_merge = require("tailwind-merge");
136
+ var import_jsx_runtime2 = require("react/jsx-runtime");
137
+ var Tooltip = ({ placement = "top", children, content, className }) => {
138
+ const [open, setOpen] = (0, import_react.useState)(false);
139
+ const { x, y, refs, strategy, context, placement: resolvedPlacement } = (0, import_react2.useFloating)({
140
+ open,
141
+ onOpenChange: setOpen,
142
+ placement,
143
+ middleware: [(0, import_react2.offset)(8), (0, import_react2.flip)(), (0, import_react2.shift)({ padding: 8 })],
144
+ whileElementsMounted: import_react2.autoUpdate
145
+ });
146
+ const hover = (0, import_react2.useHover)(context);
147
+ const dismiss = (0, import_react2.useDismiss)(context);
148
+ const { getReferenceProps, getFloatingProps } = (0, import_react2.useInteractions)([hover, dismiss]);
149
+ const id = (0, import_react.useId)();
150
+ function mergeRefs(...refsToMerge) {
151
+ return (node) => {
152
+ for (const r of refsToMerge) {
153
+ if (!r) continue;
154
+ if (typeof r === "function") r(node);
155
+ else r.current = node;
156
+ }
157
+ };
158
+ }
159
+ const side = resolvedPlacement.split("-")[0];
160
+ const enterOffset = 6;
161
+ const getInitial = () => {
162
+ switch (side) {
163
+ case "top":
164
+ return { opacity: 0, y: enterOffset };
165
+ case "bottom":
166
+ return { opacity: 0, y: -enterOffset };
167
+ case "left":
168
+ return { opacity: 0, x: enterOffset };
169
+ case "right":
170
+ return { opacity: 0, x: -enterOffset };
171
+ default:
172
+ return { opacity: 0 };
173
+ }
174
+ };
175
+ const getExit = () => __spreadProps(__spreadValues({}, getInitial()), { opacity: 0 });
176
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react.Fragment, { children: [
177
+ (0, import_react.isValidElement)(children) ? (0, import_react.cloneElement)(children, __spreadProps(__spreadValues({}, getReferenceProps({
178
+ onFocus: () => setOpen(true),
179
+ onBlur: () => setOpen(false),
180
+ "aria-describedby": open ? id : void 0
181
+ /* eslint-disable @typescript-eslint/no-explicit-any */
182
+ })), {
183
+ /* eslint-disable @typescript-eslint/no-explicit-any */
184
+ ref: mergeRefs(children.props.ref, refs.setReference)
185
+ })) : children,
186
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react2.FloatingPortal, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react3.AnimatePresence, { children: open && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
187
+ import_react3.motion.div,
188
+ __spreadProps(__spreadValues({
189
+ ref: refs.setFloating
190
+ }, getFloatingProps({
191
+ role: "tooltip",
192
+ id,
193
+ style: {
194
+ position: strategy,
195
+ top: y != null ? y : 0,
196
+ left: x != null ? x : 0,
197
+ pointerEvents: "none"
198
+ }
199
+ })), {
200
+ initial: getInitial(),
201
+ animate: { opacity: 1, x: 0, y: 0, scale: 1 },
202
+ exit: getExit(),
203
+ transition: { type: "spring", stiffness: 420, damping: 30, mass: 0.6 },
204
+ className: (0, import_tailwind_merge.twMerge)("bg-white border border-solid border-gray-200/50 py-1 px-3 rounded-lg text-sm shadow-lg shadow-gray-50 text-center", className),
205
+ children: content
206
+ }),
207
+ "tooltip"
208
+ ) }) })
209
+ ] });
210
+ };
211
+ var Tooltip_default = Tooltip;
212
+
213
+ // src/lib/internal_com/RiDragHandler.tsx
214
+ var import_jsx_runtime3 = require("react/jsx-runtime");
215
+ var isDocEmpty = (editor) => {
216
+ var _a;
217
+ const doc = editor.state.doc;
218
+ return doc.childCount === 1 && ((_a = doc.firstChild) == null ? void 0 : _a.isTextblock) === true && doc.firstChild.content.size === 0;
219
+ };
220
+ var RiDragHandler = ({ editor }) => {
221
+ const empty = (0, import_react4.useEditorState)({
222
+ editor,
223
+ selector: ({ editor: editor2 }) => isDocEmpty(editor2)
224
+ });
225
+ const insertSlash = () => {
226
+ editor.chain().focus().command(({ tr, state }) => {
227
+ const { $from } = state.selection;
228
+ let blockDepth = $from.depth;
229
+ while (blockDepth > 0 && !$from.node(blockDepth).isBlock) blockDepth--;
230
+ const blockNode = $from.node(blockDepth);
231
+ const isEmptyBlock = blockNode.isTextblock && blockNode.content.size === 0;
232
+ if (isEmptyBlock) {
233
+ tr.insertText("/", state.selection.from, state.selection.to);
234
+ tr.setSelection(import_state.TextSelection.create(tr.doc, state.selection.from + 1));
235
+ return true;
236
+ }
237
+ const insertPos = $from.after(blockDepth);
238
+ const paragraph = state.schema.nodes.paragraph;
239
+ const text = state.schema.text("/");
240
+ if (!paragraph) return false;
241
+ tr.insert(insertPos, paragraph.create(null, text));
242
+ tr.setSelection(import_state.TextSelection.create(tr.doc, insertPos + 2));
243
+ return true;
244
+ }).run();
245
+ };
246
+ if (empty) return null;
247
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_extension_drag_handle_react.default, { editor, nested: empty, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex gap-x-1.5 mt-1.5 -translate-x-1.5", children: [
248
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Tooltip_default, { content: "Insert Content", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
249
+ "button",
250
+ {
251
+ type: "button",
252
+ draggable: false,
253
+ onDragStart: (e) => e.preventDefault(),
254
+ onMouseDown: (e) => {
255
+ e.preventDefault();
256
+ e.stopPropagation();
257
+ },
258
+ onClick: (e) => {
259
+ e.preventDefault();
260
+ e.stopPropagation();
261
+ insertSlash();
262
+ },
263
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(PlusIcon, { size: 16 })
264
+ }
265
+ ) }),
266
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Tooltip_default, { content: "Drag for move", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "button", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(DragVerticalIcon, { size: 16 }) }) })
267
+ ] }) });
268
+ };
269
+ var RiDragHandler_default = RiDragHandler;
270
+
271
+ // src/lib/internal_com/BubbleMenu.tsx
272
+ var import_react5 = require("react");
273
+ var import_menus = require("@tiptap/react/menus");
274
+ var import_jsx_runtime4 = require("react/jsx-runtime");
275
+ var BubbleMenu = ({ editor }) => {
276
+ const entries = editor.extensionManager.extensions.map((ext) => {
277
+ var _a, _b, _c;
278
+ const anyExt = ext;
279
+ const renderButton = (_a = anyExt.options) == null ? void 0 : _a.component;
280
+ if (!renderButton || !((_b = anyExt.options) == null ? void 0 : _b.showInBubbleMenu)) return null;
281
+ return {
282
+ name: anyExt.name,
283
+ renderButton,
284
+ options: anyExt.options,
285
+ buttonClassName: anyExt.buttonClassName,
286
+ dropdownContainerClassName: anyExt.dropdownContainerClassName,
287
+ dropdownItemClassName: anyExt.dropdownItemClassName,
288
+ bubbleMenuPosition: (_c = anyExt.options) == null ? void 0 : _c.bubbleMenuPosition
289
+ };
290
+ }).filter(Boolean);
291
+ const desiredOrder = new Map(
292
+ editor.options.extensions.map((ext, i) => [ext.name, i])
293
+ );
294
+ entries.sort((a, b) => {
295
+ var _a, _b;
296
+ const ap = typeof a.bubbleMenuPosition === "number" ? a.bubbleMenuPosition : Number.POSITIVE_INFINITY;
297
+ const bp = typeof b.bubbleMenuPosition === "number" ? b.bubbleMenuPosition : Number.POSITIVE_INFINITY;
298
+ if (ap !== bp) return ap - bp;
299
+ const ai = (_a = desiredOrder.get(a.name)) != null ? _a : Number.MAX_SAFE_INTEGER;
300
+ const bi = (_b = desiredOrder.get(b.name)) != null ? _b : Number.MAX_SAFE_INTEGER;
301
+ if (ai !== bi) return ai - bi;
302
+ return a.name.localeCompare(b.name);
303
+ });
304
+ if (!entries.length) return null;
305
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_menus.BubbleMenu, { editor, options: { placement: "top", offset: 10, flip: true }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "bg-white flex gap-x-1 py-2 px-2 rounded-md border border-gray-200", children: entries.map(({ name, renderButton, options }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react5.Fragment, { children: renderButton({
306
+ editor,
307
+ options,
308
+ buttonClassName: "",
309
+ dropdownContainerClassName: "",
310
+ dropdownItemClassName: ""
311
+ }) }, name)) }) });
312
+ };
313
+ var BubbleMenu_default = BubbleMenu;
314
+
315
+ // src/lib/context/editor.context.tsx
316
+ var import_react6 = require("react");
317
+ var import_jsx_runtime5 = require("react/jsx-runtime");
318
+ var EditorContext = (0, import_react6.createContext)({ editor: null });
50
319
  var useEditor = () => {
51
- const ctx = (0, import_react.useContext)(EditorContext);
320
+ const ctx = (0, import_react6.useContext)(EditorContext);
52
321
  if (!ctx) throw new Error("<Toolbar/> & <Content/> component must be used inside <Editor>...</Editor/>");
53
322
  return ctx;
54
323
  };
55
324
  var EditorProvider = ({ children, value }) => {
56
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EditorContext.Provider, { value, children });
325
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EditorContext.Provider, { value, children });
57
326
  };
58
327
 
59
328
  // src/lib/Editor.tsx
60
- var import_jsx_runtime2 = require("react/jsx-runtime");
61
- var Editor = ({ children, extensions = [], className }) => {
62
- const editor = (0, import_react3.useEditor)({
63
- extensions: [import_extension_document.default, import_extension_paragraph.default, import_extension_text.default, ...extensions],
329
+ var import_jsx_runtime6 = require("react/jsx-runtime");
330
+ var Editor = ({ children, extensions = [], className, dragHandler = true, showBubbleMenu = true }) => {
331
+ const editor = (0, import_react8.useEditor)({
332
+ extensions: [...extensions],
64
333
  immediatelyRender: false
65
334
  });
66
- const value = (0, import_react2.useMemo)(() => ({ editor }), [editor]);
67
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(EditorProvider, { value, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className, children }) });
335
+ const value = (0, import_react7.useMemo)(() => ({ editor }), [editor]);
336
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(EditorProvider, { value: __spreadProps(__spreadValues({}, value), { dragHandler }), children: [
337
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className, children }),
338
+ value.editor && dragHandler && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(RiDragHandler_default, { editor: value.editor }),
339
+ value.editor && showBubbleMenu && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(BubbleMenu_default, { editor: value.editor })
340
+ ] });
68
341
  };
69
342
  var Editor_default = Editor;
70
343
 
71
344
  // src/lib/Toolbar.tsx
72
345
  var React = __toESM(require("react"));
73
- var import_tailwind_merge = require("tailwind-merge");
74
- var import_jsx_runtime3 = require("react/jsx-runtime");
346
+ var import_tailwind_merge2 = require("tailwind-merge");
347
+ var import_jsx_runtime7 = require("react/jsx-runtime");
75
348
  var Toolbar = ({ className, buttonClassName, dropdownContainerClassName, dropdownItemClassName }) => {
76
349
  const { editor } = useEditor();
77
350
  if (!editor) return null;
@@ -91,7 +364,16 @@ var Toolbar = ({ className, buttonClassName, dropdownContainerClassName, dropdow
91
364
  dropdownItemClassName: anyExt.dropdownItemClassName
92
365
  } : null;
93
366
  }).filter(Boolean);
94
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: (0, import_tailwind_merge.twMerge)("flex gap-x-1", className), children: entries.map(({ name, renderButton, options }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(React.Fragment, { children: renderButton({
367
+ const desiredOrder = new Map(
368
+ editor.options.extensions.map((ext, i) => [ext.name, i])
369
+ );
370
+ entries.sort((a, b) => {
371
+ var _a, _b;
372
+ const ai = (_a = desiredOrder.get(a.name)) != null ? _a : Number.MAX_SAFE_INTEGER;
373
+ const bi = (_b = desiredOrder.get(b.name)) != null ? _b : Number.MAX_SAFE_INTEGER;
374
+ return ai - bi;
375
+ });
376
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: (0, import_tailwind_merge2.twMerge)("flex gap-x-1 flex-wrap", className), children: entries.map(({ name, renderButton, options }) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(React.Fragment, { children: renderButton({
95
377
  editor,
96
378
  options,
97
379
  buttonClassName: buttonClassName || "",
@@ -102,12 +384,12 @@ var Toolbar = ({ className, buttonClassName, dropdownContainerClassName, dropdow
102
384
  var Toolbar_default = Toolbar;
103
385
 
104
386
  // src/lib/Content.tsx
105
- var import_react4 = require("@tiptap/react");
106
- var import_tailwind_merge2 = require("tailwind-merge");
107
- var import_jsx_runtime4 = require("react/jsx-runtime");
387
+ var import_react9 = require("@tiptap/react");
388
+ var import_tailwind_merge3 = require("tailwind-merge");
389
+ var import_jsx_runtime8 = require("react/jsx-runtime");
108
390
  var Content = ({ className }) => {
109
- const { editor } = useEditor();
110
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react4.EditorContent, { editor, className: (0, import_tailwind_merge2.twMerge)("focus:outline-none [&_.tiptap]:focus:outline-none [&_.tiptap]:min-h-[200px] [&_.tiptap]:p-[10px_20px]", className) });
391
+ const { editor, dragHandler } = useEditor();
392
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react9.EditorContent, { editor, className: (0, import_tailwind_merge3.twMerge)(`focus:outline-none [&_.tiptap]:focus:outline-none [&_.tiptap]:min-h-50 ${dragHandler ? "[&_.tiptap]:p-[10px_20px_10px_50px]" : "[&_.tiptap]:p-[10px_20px]"}`, className) });
111
393
  };
112
394
  var Content_default = Content;
113
395
  // Annotate the CommonJS export names for ESM import in node:
package/dist/index.mjs CHANGED
@@ -2,29 +2,148 @@ import {
2
2
  EditorProvider,
3
3
  useEditor
4
4
  } from "./chunk-VYDH6BZE.mjs";
5
- import "./chunk-FWCSY2DS.mjs";
5
+ import {
6
+ DragVerticalIcon,
7
+ PlusIcon,
8
+ Tooltip_default
9
+ } from "./chunk-EN4BPI7N.mjs";
10
+ import {
11
+ __spreadProps,
12
+ __spreadValues
13
+ } from "./chunk-WNQUEZJF.mjs";
14
+
15
+ // src/index.ts
16
+ import "@siamf/react-color-pick/dist/index.css";
6
17
 
7
18
  // src/lib/Editor.tsx
8
19
  import { useMemo } from "react";
9
20
  import { useEditor as useEditor2 } from "@tiptap/react";
10
- import Document from "@tiptap/extension-document";
11
- import Paragraph from "@tiptap/extension-paragraph";
12
- import Text from "@tiptap/extension-text";
13
- import { jsx } from "react/jsx-runtime";
14
- var Editor = ({ children, extensions = [], className }) => {
21
+
22
+ // src/lib/internal_com/RiDragHandler.tsx
23
+ import DragHandle from "@tiptap/extension-drag-handle-react";
24
+ import { useEditorState } from "@tiptap/react";
25
+ import { TextSelection } from "@tiptap/pm/state";
26
+ import { jsx, jsxs } from "react/jsx-runtime";
27
+ var isDocEmpty = (editor) => {
28
+ var _a;
29
+ const doc = editor.state.doc;
30
+ return doc.childCount === 1 && ((_a = doc.firstChild) == null ? void 0 : _a.isTextblock) === true && doc.firstChild.content.size === 0;
31
+ };
32
+ var RiDragHandler = ({ editor }) => {
33
+ const empty = useEditorState({
34
+ editor,
35
+ selector: ({ editor: editor2 }) => isDocEmpty(editor2)
36
+ });
37
+ const insertSlash = () => {
38
+ editor.chain().focus().command(({ tr, state }) => {
39
+ const { $from } = state.selection;
40
+ let blockDepth = $from.depth;
41
+ while (blockDepth > 0 && !$from.node(blockDepth).isBlock) blockDepth--;
42
+ const blockNode = $from.node(blockDepth);
43
+ const isEmptyBlock = blockNode.isTextblock && blockNode.content.size === 0;
44
+ if (isEmptyBlock) {
45
+ tr.insertText("/", state.selection.from, state.selection.to);
46
+ tr.setSelection(TextSelection.create(tr.doc, state.selection.from + 1));
47
+ return true;
48
+ }
49
+ const insertPos = $from.after(blockDepth);
50
+ const paragraph = state.schema.nodes.paragraph;
51
+ const text = state.schema.text("/");
52
+ if (!paragraph) return false;
53
+ tr.insert(insertPos, paragraph.create(null, text));
54
+ tr.setSelection(TextSelection.create(tr.doc, insertPos + 2));
55
+ return true;
56
+ }).run();
57
+ };
58
+ if (empty) return null;
59
+ return /* @__PURE__ */ jsx(DragHandle, { editor, nested: empty, children: /* @__PURE__ */ jsxs("div", { className: "flex gap-x-1.5 mt-1.5 -translate-x-1.5", children: [
60
+ /* @__PURE__ */ jsx(Tooltip_default, { content: "Insert Content", children: /* @__PURE__ */ jsx(
61
+ "button",
62
+ {
63
+ type: "button",
64
+ draggable: false,
65
+ onDragStart: (e) => e.preventDefault(),
66
+ onMouseDown: (e) => {
67
+ e.preventDefault();
68
+ e.stopPropagation();
69
+ },
70
+ onClick: (e) => {
71
+ e.preventDefault();
72
+ e.stopPropagation();
73
+ insertSlash();
74
+ },
75
+ children: /* @__PURE__ */ jsx(PlusIcon, { size: 16 })
76
+ }
77
+ ) }),
78
+ /* @__PURE__ */ jsx(Tooltip_default, { content: "Drag for move", children: /* @__PURE__ */ jsx("button", { type: "button", children: /* @__PURE__ */ jsx(DragVerticalIcon, { size: 16 }) }) })
79
+ ] }) });
80
+ };
81
+ var RiDragHandler_default = RiDragHandler;
82
+
83
+ // src/lib/internal_com/BubbleMenu.tsx
84
+ import { Fragment } from "react";
85
+ import { BubbleMenu as TiptapBubbleMenu } from "@tiptap/react/menus";
86
+ import { jsx as jsx2 } from "react/jsx-runtime";
87
+ var BubbleMenu = ({ editor }) => {
88
+ const entries = editor.extensionManager.extensions.map((ext) => {
89
+ var _a, _b, _c;
90
+ const anyExt = ext;
91
+ const renderButton = (_a = anyExt.options) == null ? void 0 : _a.component;
92
+ if (!renderButton || !((_b = anyExt.options) == null ? void 0 : _b.showInBubbleMenu)) return null;
93
+ return {
94
+ name: anyExt.name,
95
+ renderButton,
96
+ options: anyExt.options,
97
+ buttonClassName: anyExt.buttonClassName,
98
+ dropdownContainerClassName: anyExt.dropdownContainerClassName,
99
+ dropdownItemClassName: anyExt.dropdownItemClassName,
100
+ bubbleMenuPosition: (_c = anyExt.options) == null ? void 0 : _c.bubbleMenuPosition
101
+ };
102
+ }).filter(Boolean);
103
+ const desiredOrder = new Map(
104
+ editor.options.extensions.map((ext, i) => [ext.name, i])
105
+ );
106
+ entries.sort((a, b) => {
107
+ var _a, _b;
108
+ const ap = typeof a.bubbleMenuPosition === "number" ? a.bubbleMenuPosition : Number.POSITIVE_INFINITY;
109
+ const bp = typeof b.bubbleMenuPosition === "number" ? b.bubbleMenuPosition : Number.POSITIVE_INFINITY;
110
+ if (ap !== bp) return ap - bp;
111
+ const ai = (_a = desiredOrder.get(a.name)) != null ? _a : Number.MAX_SAFE_INTEGER;
112
+ const bi = (_b = desiredOrder.get(b.name)) != null ? _b : Number.MAX_SAFE_INTEGER;
113
+ if (ai !== bi) return ai - bi;
114
+ return a.name.localeCompare(b.name);
115
+ });
116
+ if (!entries.length) return null;
117
+ return /* @__PURE__ */ jsx2(TiptapBubbleMenu, { editor, options: { placement: "top", offset: 10, flip: true }, children: /* @__PURE__ */ jsx2("div", { className: "bg-white flex gap-x-1 py-2 px-2 rounded-md border border-gray-200", children: entries.map(({ name, renderButton, options }) => /* @__PURE__ */ jsx2(Fragment, { children: renderButton({
118
+ editor,
119
+ options,
120
+ buttonClassName: "",
121
+ dropdownContainerClassName: "",
122
+ dropdownItemClassName: ""
123
+ }) }, name)) }) });
124
+ };
125
+ var BubbleMenu_default = BubbleMenu;
126
+
127
+ // src/lib/Editor.tsx
128
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
129
+ var Editor = ({ children, extensions = [], className, dragHandler = true, showBubbleMenu = true }) => {
15
130
  const editor = useEditor2({
16
- extensions: [Document, Paragraph, Text, ...extensions],
131
+ extensions: [...extensions],
17
132
  immediatelyRender: false
18
133
  });
19
134
  const value = useMemo(() => ({ editor }), [editor]);
20
- return /* @__PURE__ */ jsx(EditorProvider, { value, children: /* @__PURE__ */ jsx("div", { className, children }) });
135
+ return /* @__PURE__ */ jsxs2(EditorProvider, { value: __spreadProps(__spreadValues({}, value), { dragHandler }), children: [
136
+ /* @__PURE__ */ jsx3("div", { className, children }),
137
+ value.editor && dragHandler && /* @__PURE__ */ jsx3(RiDragHandler_default, { editor: value.editor }),
138
+ value.editor && showBubbleMenu && /* @__PURE__ */ jsx3(BubbleMenu_default, { editor: value.editor })
139
+ ] });
21
140
  };
22
141
  var Editor_default = Editor;
23
142
 
24
143
  // src/lib/Toolbar.tsx
25
144
  import * as React from "react";
26
145
  import { twMerge } from "tailwind-merge";
27
- import { jsx as jsx2 } from "react/jsx-runtime";
146
+ import { jsx as jsx4 } from "react/jsx-runtime";
28
147
  var Toolbar = ({ className, buttonClassName, dropdownContainerClassName, dropdownItemClassName }) => {
29
148
  const { editor } = useEditor();
30
149
  if (!editor) return null;
@@ -44,7 +163,16 @@ var Toolbar = ({ className, buttonClassName, dropdownContainerClassName, dropdow
44
163
  dropdownItemClassName: anyExt.dropdownItemClassName
45
164
  } : null;
46
165
  }).filter(Boolean);
47
- return /* @__PURE__ */ jsx2("div", { className: twMerge("flex gap-x-1", className), children: entries.map(({ name, renderButton, options }) => /* @__PURE__ */ jsx2(React.Fragment, { children: renderButton({
166
+ const desiredOrder = new Map(
167
+ editor.options.extensions.map((ext, i) => [ext.name, i])
168
+ );
169
+ entries.sort((a, b) => {
170
+ var _a, _b;
171
+ const ai = (_a = desiredOrder.get(a.name)) != null ? _a : Number.MAX_SAFE_INTEGER;
172
+ const bi = (_b = desiredOrder.get(b.name)) != null ? _b : Number.MAX_SAFE_INTEGER;
173
+ return ai - bi;
174
+ });
175
+ return /* @__PURE__ */ jsx4("div", { className: twMerge("flex gap-x-1 flex-wrap", className), children: entries.map(({ name, renderButton, options }) => /* @__PURE__ */ jsx4(React.Fragment, { children: renderButton({
48
176
  editor,
49
177
  options,
50
178
  buttonClassName: buttonClassName || "",
@@ -57,10 +185,10 @@ var Toolbar_default = Toolbar;
57
185
  // src/lib/Content.tsx
58
186
  import { EditorContent } from "@tiptap/react";
59
187
  import { twMerge as twMerge2 } from "tailwind-merge";
60
- import { jsx as jsx3 } from "react/jsx-runtime";
188
+ import { jsx as jsx5 } from "react/jsx-runtime";
61
189
  var Content = ({ className }) => {
62
- const { editor } = useEditor();
63
- return /* @__PURE__ */ jsx3(EditorContent, { editor, className: twMerge2("focus:outline-none [&_.tiptap]:focus:outline-none [&_.tiptap]:min-h-[200px] [&_.tiptap]:p-[10px_20px]", className) });
190
+ const { editor, dragHandler } = useEditor();
191
+ return /* @__PURE__ */ jsx5(EditorContent, { editor, className: twMerge2(`focus:outline-none [&_.tiptap]:focus:outline-none [&_.tiptap]:min-h-50 ${dragHandler ? "[&_.tiptap]:p-[10px_20px_10px_50px]" : "[&_.tiptap]:p-[10px_20px]"}`, className) });
64
192
  };
65
193
  var Content_default = Content;
66
194
  export {
@@ -0,0 +1,43 @@
1
+ import { ReactNode, CSSProperties } from 'react';
2
+ import { Placement } from '@floating-ui/react';
3
+ import { Editor } from '@tiptap/react';
4
+
5
+ type ExtButtonBaseOptions = {
6
+ className?: string;
7
+ activeClassName?: string;
8
+ icon?: ReactNode;
9
+ style?: CSSProperties;
10
+ tooltip?: boolean | string;
11
+ tooltipClassName?: string;
12
+ tooltipPlacement?: Placement;
13
+ };
14
+ type ExtDropdownBaseOptions = {
15
+ className?: string;
16
+ showArrow?: boolean;
17
+ content?: ReactNode;
18
+ dropdownClassName?: string;
19
+ itemClassName?: string;
20
+ activeClassName?: string;
21
+ style?: CSSProperties;
22
+ tooltip?: boolean | string;
23
+ tooltipClassName?: string;
24
+ tooltipPlacement?: Placement;
25
+ };
26
+ type ExtButtonComponentArgs<O, Extra extends object = {}> = {
27
+ options: O;
28
+ editor: Editor;
29
+ buttonClassName: string;
30
+ } & Extra;
31
+ type ExtDropdownComponentArgs<O, Extra extends object = {}> = {
32
+ options: O;
33
+ editor: Editor;
34
+ } & Extra;
35
+ type ExtButtonOptions<RootExtra extends object = {}, ComponentExtra extends object = {}, Base extends object = ExtButtonBaseOptions> = Base & RootExtra & {
36
+ component: (args: ExtButtonComponentArgs<Base & RootExtra, ComponentExtra>) => ReactNode;
37
+ };
38
+ type ExtDropdownOptions<RootExtra extends object = {}, ComponentExtra extends object = {}, Base extends object = ExtDropdownBaseOptions> = Base & RootExtra & {
39
+ component: (args: ExtDropdownComponentArgs<Base & RootExtra, ComponentExtra>) => ReactNode;
40
+ };
41
+ type ExtWithoutActiveOptions<RootExtra extends object = {}, ComponentExtra extends object = {}> = ExtButtonOptions<RootExtra, ComponentExtra, Omit<ExtButtonBaseOptions, "activeClassName">>;
42
+
43
+ export type { ExtButtonOptions as E, ExtDropdownOptions as a, ExtWithoutActiveOptions as b };