ritext 1.0.23 → 1.0.27

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