ritext 1.0.23 → 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 (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 +306 -24
  122. package/dist/index.mjs +141 -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 +41 -28
  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
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
+ var __spreadValues = (a, b) => {
12
+ for (var prop in b || (b = {}))
13
+ if (__hasOwnProp.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ if (__getOwnPropSymbols)
16
+ for (var prop of __getOwnPropSymbols(b)) {
17
+ if (__propIsEnum.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ }
20
+ return a;
21
+ };
22
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
23
+ var __objRest = (source, exclude) => {
24
+ var target = {};
25
+ for (var prop in source)
26
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
27
+ target[prop] = source[prop];
28
+ if (source != null && __getOwnPropSymbols)
29
+ for (var prop of __getOwnPropSymbols(source)) {
30
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
31
+ target[prop] = source[prop];
32
+ }
33
+ return target;
34
+ };
35
+ var __export = (target, all) => {
36
+ for (var name in all)
37
+ __defProp(target, name, { get: all[name], enumerable: true });
38
+ };
39
+ var __copyProps = (to, from, except, desc) => {
40
+ if (from && typeof from === "object" || typeof from === "function") {
41
+ for (let key of __getOwnPropNames(from))
42
+ if (!__hasOwnProp.call(to, key) && key !== except)
43
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
44
+ }
45
+ return to;
46
+ };
47
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
48
+
49
+ // src/extension/Emoji.tsx
50
+ var Emoji_exports = {};
51
+ __export(Emoji_exports, {
52
+ Emoji: () => Emoji
53
+ });
54
+ module.exports = __toCommonJS(Emoji_exports);
55
+ var import_react8 = require("react");
56
+ var import_extension_emoji2 = require("@tiptap/extension-emoji");
57
+
58
+ // src/lib/icons/index.tsx
59
+ var import_jsx_runtime = require("react/jsx-runtime");
60
+ var ArrowIcon = (_a) => {
61
+ var _b = _a, { size = 17, className } = _b, props = __objRest(_b, ["size", "className"]);
62
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
63
+ "svg",
64
+ __spreadProps(__spreadValues({
65
+ xmlns: "http://www.w3.org/2000/svg",
66
+ viewBox: "0 0 48 48",
67
+ fill: "none",
68
+ stroke: "currentColor",
69
+ strokeWidth: 2,
70
+ strokeLinecap: "round",
71
+ strokeLinejoin: "round",
72
+ width: size,
73
+ height: size,
74
+ className
75
+ }, props), {
76
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: "currentColor", stroke: "currentColor", strokeLinejoin: "round", strokeWidth: "4", d: "M36 19L24 31L12 19z" })
77
+ })
78
+ );
79
+ };
80
+ var EmojiIcon = (_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)("path", { d: "M22 11v1a10 10 0 1 1-9-10" }),
98
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M8 14s1.5 2 4 2 4-2 4-2" }),
99
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "9", x2: "9.01", y1: "9", y2: "9" }),
100
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "15", x2: "15.01", y1: "9", y2: "9" }),
101
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M16 5h6" }),
102
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M19 2v6" })
103
+ ]
104
+ })
105
+ );
106
+ };
107
+
108
+ // src/lib/components/DropdownComponent.tsx
109
+ var import_react4 = require("react");
110
+ var import_tailwind_merge2 = require("tailwind-merge");
111
+
112
+ // src/lib/components/_com/Tooltip.tsx
113
+ var import_react = require("react");
114
+ var import_react2 = require("@floating-ui/react");
115
+ var import_react3 = require("motion/react");
116
+ var import_tailwind_merge = require("tailwind-merge");
117
+ var import_jsx_runtime2 = require("react/jsx-runtime");
118
+ var Tooltip = ({ placement = "top", children, content, className }) => {
119
+ const [open, setOpen] = (0, import_react.useState)(false);
120
+ const { x, y, refs, strategy, context, placement: resolvedPlacement } = (0, import_react2.useFloating)({
121
+ open,
122
+ onOpenChange: setOpen,
123
+ placement,
124
+ middleware: [(0, import_react2.offset)(8), (0, import_react2.flip)(), (0, import_react2.shift)({ padding: 8 })],
125
+ whileElementsMounted: import_react2.autoUpdate
126
+ });
127
+ const hover = (0, import_react2.useHover)(context);
128
+ const dismiss = (0, import_react2.useDismiss)(context);
129
+ const { getReferenceProps, getFloatingProps } = (0, import_react2.useInteractions)([hover, dismiss]);
130
+ const id = (0, import_react.useId)();
131
+ function mergeRefs(...refsToMerge) {
132
+ return (node) => {
133
+ for (const r of refsToMerge) {
134
+ if (!r) continue;
135
+ if (typeof r === "function") r(node);
136
+ else r.current = node;
137
+ }
138
+ };
139
+ }
140
+ const side = resolvedPlacement.split("-")[0];
141
+ const enterOffset = 6;
142
+ const getInitial = () => {
143
+ switch (side) {
144
+ case "top":
145
+ return { opacity: 0, y: enterOffset };
146
+ case "bottom":
147
+ return { opacity: 0, y: -enterOffset };
148
+ case "left":
149
+ return { opacity: 0, x: enterOffset };
150
+ case "right":
151
+ return { opacity: 0, x: -enterOffset };
152
+ default:
153
+ return { opacity: 0 };
154
+ }
155
+ };
156
+ const getExit = () => __spreadProps(__spreadValues({}, getInitial()), { opacity: 0 });
157
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react.Fragment, { children: [
158
+ (0, import_react.isValidElement)(children) ? (0, import_react.cloneElement)(children, __spreadProps(__spreadValues({}, getReferenceProps({
159
+ onFocus: () => setOpen(true),
160
+ onBlur: () => setOpen(false),
161
+ "aria-describedby": open ? id : void 0
162
+ /* eslint-disable @typescript-eslint/no-explicit-any */
163
+ })), {
164
+ /* eslint-disable @typescript-eslint/no-explicit-any */
165
+ ref: mergeRefs(children.props.ref, refs.setReference)
166
+ })) : children,
167
+ /* @__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)(
168
+ import_react3.motion.div,
169
+ __spreadProps(__spreadValues({
170
+ ref: refs.setFloating
171
+ }, getFloatingProps({
172
+ role: "tooltip",
173
+ id,
174
+ style: {
175
+ position: strategy,
176
+ top: y != null ? y : 0,
177
+ left: x != null ? x : 0,
178
+ pointerEvents: "none"
179
+ }
180
+ })), {
181
+ initial: getInitial(),
182
+ animate: { opacity: 1, x: 0, y: 0, scale: 1 },
183
+ exit: getExit(),
184
+ transition: { type: "spring", stiffness: 420, damping: 30, mass: 0.6 },
185
+ 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),
186
+ children: content
187
+ }),
188
+ "tooltip"
189
+ ) }) })
190
+ ] });
191
+ };
192
+ var Tooltip_default = Tooltip;
193
+
194
+ // src/lib/components/DropdownComponent.tsx
195
+ var import_react5 = require("@floating-ui/react");
196
+ var import_react6 = require("motion/react");
197
+ var import_jsx_runtime3 = require("react/jsx-runtime");
198
+ var DropdownComponent = ({ children, className, showArrow = true, content, dropdownClassName, style, tooltip, tooltipClassName, tooltipPlacement, _tooltipContent, _internalContent, _dropdownClassName }) => {
199
+ const [open, setOpen] = (0, import_react4.useState)(false);
200
+ const { x, y, refs, strategy, context } = (0, import_react5.useFloating)({
201
+ open,
202
+ onOpenChange: setOpen,
203
+ placement: "bottom",
204
+ middleware: [(0, import_react5.offset)(4), (0, import_react5.flip)(), (0, import_react5.shift)({ padding: 8 })],
205
+ whileElementsMounted: import_react5.autoUpdate
206
+ });
207
+ const click = (0, import_react5.useClick)(context);
208
+ const dismiss = (0, import_react5.useDismiss)(context);
209
+ const { getReferenceProps, getFloatingProps } = (0, import_react5.useInteractions)([click, dismiss]);
210
+ const listId = (0, import_react4.useId)();
211
+ const tooltipContent = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { children: typeof tooltip === "string" ? tooltip : _tooltipContent });
212
+ const initialMotion = { opacity: 0, scale: 0.95 };
213
+ const animateMotion = { opacity: 1, scale: 1 };
214
+ const enhancedChildren = import_react4.Children.map(children, (child) => {
215
+ if (!(0, import_react4.isValidElement)(child)) return child;
216
+ const prevOnSelect = child.props.onSelect;
217
+ const combinedOnSelect = () => {
218
+ prevOnSelect == null ? void 0 : prevOnSelect();
219
+ setOpen(false);
220
+ };
221
+ return (0, import_react4.cloneElement)(child, {
222
+ onSelect: prevOnSelect ? combinedOnSelect : void 0,
223
+ open,
224
+ onClose: () => setOpen(false)
225
+ });
226
+ });
227
+ const btn = /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
228
+ "button",
229
+ __spreadProps(__spreadValues({}, getReferenceProps({
230
+ ref: refs.setReference,
231
+ type: "button",
232
+ "aria-controls": open ? listId : void 0
233
+ })), {
234
+ className: (0, import_tailwind_merge2.twMerge)(
235
+ "p-1.5 rounded-md hover:bg-gray-100 items-center flex gap-x-0.5",
236
+ className
237
+ ),
238
+ style,
239
+ children: [
240
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: content != null ? content : _internalContent }),
241
+ showArrow && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ArrowIcon, { size: 14, className: "text-gray-500 block" })
242
+ ]
243
+ })
244
+ );
245
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react4.Fragment, { children: [
246
+ tooltip === false ? btn : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
247
+ Tooltip_default,
248
+ {
249
+ content: tooltipContent,
250
+ className: tooltipClassName,
251
+ placement: tooltipPlacement,
252
+ children: btn
253
+ }
254
+ ),
255
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react5.FloatingPortal, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react6.AnimatePresence, { children: open && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
256
+ import_react6.motion.div,
257
+ __spreadProps(__spreadValues({}, getFloatingProps({
258
+ ref: refs.setFloating,
259
+ style: {
260
+ position: strategy,
261
+ top: y != null ? y : 0,
262
+ left: x != null ? x : 0
263
+ },
264
+ role: "listbox",
265
+ id: listId
266
+ })), {
267
+ initial: initialMotion,
268
+ animate: animateMotion,
269
+ exit: initialMotion,
270
+ className: (0, import_tailwind_merge2.twMerge)("bg-white border border-solid border-gray-200 p-2 space-y-1 rounded-lg shadow-sm shadow-gray-200/40 z-99999999 max-h-125 overflow-auto", _dropdownClassName, dropdownClassName),
271
+ children: enhancedChildren
272
+ })
273
+ ) }) })
274
+ ] });
275
+ };
276
+ var DropdownComponent_default = DropdownComponent;
277
+
278
+ // src/lib/components/EmojiComponent.tsx
279
+ var import_react7 = require("react");
280
+ var import_extension_emoji = require("@tiptap/extension-emoji");
281
+ var import_jsx_runtime4 = require("react/jsx-runtime");
282
+ var EmojiComponent = ({ editor, onClose }) => {
283
+ const listRef = (0, import_react7.useRef)(null);
284
+ const [query, setQuery] = (0, import_react7.useState)("");
285
+ const [selectedIndex, setSelectedIndex] = (0, import_react7.useState)(0);
286
+ const [hoverName, setHoverName] = (0, import_react7.useState)("");
287
+ const [hoverEmoji, setHoverEmoji] = (0, import_react7.useState)("");
288
+ const items = (0, import_react7.useMemo)(() => {
289
+ const q = query.trim().toLowerCase();
290
+ if (!q) return import_extension_emoji.emojis;
291
+ return import_extension_emoji.emojis.filter((e) => e.name.toLowerCase().includes(q));
292
+ }, [query]);
293
+ const selected = items[selectedIndex];
294
+ const pick = (name) => {
295
+ editor.chain().focus().setEmoji(name).run();
296
+ onClose == null ? void 0 : onClose();
297
+ };
298
+ (0, import_react7.useEffect)(() => {
299
+ setSelectedIndex(0);
300
+ }, [query]);
301
+ (0, import_react7.useEffect)(() => {
302
+ const onKeyDown = (e) => {
303
+ if (e.key === "Escape") {
304
+ e.preventDefault();
305
+ onClose == null ? void 0 : onClose();
306
+ return;
307
+ }
308
+ if (!items.length) return;
309
+ if (e.key === "ArrowUp") {
310
+ e.preventDefault();
311
+ setSelectedIndex((v) => (v + items.length - 1) % items.length);
312
+ return;
313
+ }
314
+ if (e.key === "ArrowDown") {
315
+ e.preventDefault();
316
+ setSelectedIndex((v) => (v + 1) % items.length);
317
+ return;
318
+ }
319
+ if (e.key === "Enter") {
320
+ e.preventDefault();
321
+ const item = items[selectedIndex];
322
+ if (item) pick(item.name);
323
+ return;
324
+ }
325
+ };
326
+ window.addEventListener("keydown", onKeyDown);
327
+ return () => window.removeEventListener("keydown", onKeyDown);
328
+ }, [items, selectedIndex, onClose, editor]);
329
+ (0, import_react7.useEffect)(() => {
330
+ const root = listRef.current;
331
+ if (!root) return;
332
+ const el = root.querySelector(`[data-idx="${selectedIndex}"]`);
333
+ el == null ? void 0 : el.scrollIntoView({ block: "nearest" });
334
+ }, [selectedIndex]);
335
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
336
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
337
+ "input",
338
+ {
339
+ autoFocus: true,
340
+ value: query,
341
+ onChange: (e) => setQuery(e.target.value),
342
+ placeholder: "Search emoji\u2026",
343
+ className: "w-full rounded-lg border border-gray-200 px-3 py-2 text-sm focus:outline-none"
344
+ }
345
+ ),
346
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("hr", { className: "my-3 border-gray-200" }),
347
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
348
+ "div",
349
+ {
350
+ ref: listRef,
351
+ className: "overflow-auto max-h-62.5",
352
+ children: !items.length ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "py-8 text-center text-sm text-gray-500", children: "No results" }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "grid grid-cols-7 gap-1", children: items.map((item, idx) => {
353
+ const isSelected = idx === selectedIndex;
354
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
355
+ "div",
356
+ {
357
+ "data-idx": idx,
358
+ onClick: () => pick(item.name),
359
+ onMouseEnter: () => {
360
+ setSelectedIndex(idx);
361
+ setHoverName(item.name);
362
+ setHoverEmoji(item.emoji || "");
363
+ },
364
+ className: `h-8 w-8 cursor-pointer rounded-lg flex items-center justify-center text-base hover:bg-gray-100 ${isSelected ? "bg-gray-100 ring-2 ring-gray-200" : ""}`,
365
+ title: `:${item.name}:`,
366
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: item.emoji })
367
+ },
368
+ `${item.name}-${idx}`
369
+ );
370
+ }) })
371
+ }
372
+ ),
373
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "border-t border-gray-200 text-xs text-gray-600 flex items-center gap-2 pt-2.5", children: [
374
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-sm", children: hoverEmoji || selected.emoji || "\u{1F642}" }),
375
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "truncate capitalize", children: (hoverName || selected.name || "").replaceAll("_", " ") })
376
+ ] })
377
+ ] });
378
+ };
379
+ var EmojiComponent_default = EmojiComponent;
380
+
381
+ // src/extension/Emoji.tsx
382
+ var import_jsx_runtime5 = require("react/jsx-runtime");
383
+ var Emoji = import_extension_emoji2.Emoji.extend({
384
+ addOptions() {
385
+ var _a;
386
+ const parent = (_a = this.parent) == null ? void 0 : _a.call(this);
387
+ return __spreadProps(__spreadValues({}, parent != null ? parent : {}), {
388
+ openOnClick: false,
389
+ showInBubbleMenu: false,
390
+ bubbleMenuPosition: 10,
391
+ component: ({ options, editor, dropdownContainerClassName }) => {
392
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react8.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
393
+ DropdownComponent_default,
394
+ {
395
+ className: options.className,
396
+ showArrow: options.showArrow || false,
397
+ content: options.content,
398
+ dropdownClassName: options.dropdownClassName,
399
+ style: options.style,
400
+ tooltip: options.tooltip,
401
+ tooltipClassName: options.tooltipClassName,
402
+ tooltipPlacement: options.tooltipPlacement,
403
+ _tooltipContent: "Emoji",
404
+ _internalContent: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EmojiIcon, {}),
405
+ _dropdownClassName: "w-75 " + dropdownContainerClassName,
406
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
407
+ EmojiComponent_default,
408
+ {
409
+ editor
410
+ }
411
+ )
412
+ }
413
+ ) });
414
+ }
415
+ });
416
+ }
417
+ });
418
+ // Annotate the CommonJS export names for ESM import in node:
419
+ 0 && (module.exports = {
420
+ Emoji
421
+ });
@@ -0,0 +1,158 @@
1
+ import {
2
+ DropdownComponent_default
3
+ } from "../chunk-FJQ4FZRS.mjs";
4
+ import {
5
+ EmojiIcon
6
+ } from "../chunk-EN4BPI7N.mjs";
7
+ import {
8
+ __spreadProps,
9
+ __spreadValues
10
+ } from "../chunk-WNQUEZJF.mjs";
11
+
12
+ // src/extension/Emoji.tsx
13
+ import { Fragment } from "react";
14
+ import { Emoji as TiptapEmoji } from "@tiptap/extension-emoji";
15
+
16
+ // src/lib/components/EmojiComponent.tsx
17
+ import { useEffect, useMemo, useRef, useState } from "react";
18
+ import { emojis } from "@tiptap/extension-emoji";
19
+ import { jsx, jsxs } from "react/jsx-runtime";
20
+ var EmojiComponent = ({ editor, onClose }) => {
21
+ const listRef = useRef(null);
22
+ const [query, setQuery] = useState("");
23
+ const [selectedIndex, setSelectedIndex] = useState(0);
24
+ const [hoverName, setHoverName] = useState("");
25
+ const [hoverEmoji, setHoverEmoji] = useState("");
26
+ const items = useMemo(() => {
27
+ const q = query.trim().toLowerCase();
28
+ if (!q) return emojis;
29
+ return emojis.filter((e) => e.name.toLowerCase().includes(q));
30
+ }, [query]);
31
+ const selected = items[selectedIndex];
32
+ const pick = (name) => {
33
+ editor.chain().focus().setEmoji(name).run();
34
+ onClose == null ? void 0 : onClose();
35
+ };
36
+ useEffect(() => {
37
+ setSelectedIndex(0);
38
+ }, [query]);
39
+ useEffect(() => {
40
+ const onKeyDown = (e) => {
41
+ if (e.key === "Escape") {
42
+ e.preventDefault();
43
+ onClose == null ? void 0 : onClose();
44
+ return;
45
+ }
46
+ if (!items.length) return;
47
+ if (e.key === "ArrowUp") {
48
+ e.preventDefault();
49
+ setSelectedIndex((v) => (v + items.length - 1) % items.length);
50
+ return;
51
+ }
52
+ if (e.key === "ArrowDown") {
53
+ e.preventDefault();
54
+ setSelectedIndex((v) => (v + 1) % items.length);
55
+ return;
56
+ }
57
+ if (e.key === "Enter") {
58
+ e.preventDefault();
59
+ const item = items[selectedIndex];
60
+ if (item) pick(item.name);
61
+ return;
62
+ }
63
+ };
64
+ window.addEventListener("keydown", onKeyDown);
65
+ return () => window.removeEventListener("keydown", onKeyDown);
66
+ }, [items, selectedIndex, onClose, editor]);
67
+ useEffect(() => {
68
+ const root = listRef.current;
69
+ if (!root) return;
70
+ const el = root.querySelector(`[data-idx="${selectedIndex}"]`);
71
+ el == null ? void 0 : el.scrollIntoView({ block: "nearest" });
72
+ }, [selectedIndex]);
73
+ return /* @__PURE__ */ jsxs("div", { children: [
74
+ /* @__PURE__ */ jsx(
75
+ "input",
76
+ {
77
+ autoFocus: true,
78
+ value: query,
79
+ onChange: (e) => setQuery(e.target.value),
80
+ placeholder: "Search emoji\u2026",
81
+ className: "w-full rounded-lg border border-gray-200 px-3 py-2 text-sm focus:outline-none"
82
+ }
83
+ ),
84
+ /* @__PURE__ */ jsx("hr", { className: "my-3 border-gray-200" }),
85
+ /* @__PURE__ */ jsx(
86
+ "div",
87
+ {
88
+ ref: listRef,
89
+ className: "overflow-auto max-h-62.5",
90
+ children: !items.length ? /* @__PURE__ */ jsx("div", { className: "py-8 text-center text-sm text-gray-500", children: "No results" }) : /* @__PURE__ */ jsx("div", { className: "grid grid-cols-7 gap-1", children: items.map((item, idx) => {
91
+ const isSelected = idx === selectedIndex;
92
+ return /* @__PURE__ */ jsx(
93
+ "div",
94
+ {
95
+ "data-idx": idx,
96
+ onClick: () => pick(item.name),
97
+ onMouseEnter: () => {
98
+ setSelectedIndex(idx);
99
+ setHoverName(item.name);
100
+ setHoverEmoji(item.emoji || "");
101
+ },
102
+ className: `h-8 w-8 cursor-pointer rounded-lg flex items-center justify-center text-base hover:bg-gray-100 ${isSelected ? "bg-gray-100 ring-2 ring-gray-200" : ""}`,
103
+ title: `:${item.name}:`,
104
+ children: /* @__PURE__ */ jsx("span", { children: item.emoji })
105
+ },
106
+ `${item.name}-${idx}`
107
+ );
108
+ }) })
109
+ }
110
+ ),
111
+ /* @__PURE__ */ jsxs("div", { className: "border-t border-gray-200 text-xs text-gray-600 flex items-center gap-2 pt-2.5", children: [
112
+ /* @__PURE__ */ jsx("span", { className: "text-sm", children: hoverEmoji || selected.emoji || "\u{1F642}" }),
113
+ /* @__PURE__ */ jsx("span", { className: "truncate capitalize", children: (hoverName || selected.name || "").replaceAll("_", " ") })
114
+ ] })
115
+ ] });
116
+ };
117
+ var EmojiComponent_default = EmojiComponent;
118
+
119
+ // src/extension/Emoji.tsx
120
+ import { jsx as jsx2 } from "react/jsx-runtime";
121
+ var Emoji = TiptapEmoji.extend({
122
+ addOptions() {
123
+ var _a;
124
+ const parent = (_a = this.parent) == null ? void 0 : _a.call(this);
125
+ return __spreadProps(__spreadValues({}, parent != null ? parent : {}), {
126
+ openOnClick: false,
127
+ showInBubbleMenu: false,
128
+ bubbleMenuPosition: 10,
129
+ component: ({ options, editor, dropdownContainerClassName }) => {
130
+ return /* @__PURE__ */ jsx2(Fragment, { children: /* @__PURE__ */ jsx2(
131
+ DropdownComponent_default,
132
+ {
133
+ className: options.className,
134
+ showArrow: options.showArrow || false,
135
+ content: options.content,
136
+ dropdownClassName: options.dropdownClassName,
137
+ style: options.style,
138
+ tooltip: options.tooltip,
139
+ tooltipClassName: options.tooltipClassName,
140
+ tooltipPlacement: options.tooltipPlacement,
141
+ _tooltipContent: "Emoji",
142
+ _internalContent: /* @__PURE__ */ jsx2(EmojiIcon, {}),
143
+ _dropdownClassName: "w-75 " + dropdownContainerClassName,
144
+ children: /* @__PURE__ */ jsx2(
145
+ EmojiComponent_default,
146
+ {
147
+ editor
148
+ }
149
+ )
150
+ }
151
+ ) });
152
+ }
153
+ });
154
+ }
155
+ });
156
+ export {
157
+ Emoji
158
+ };
@@ -1,22 +1,19 @@
1
- import { ReactNode } from 'react';
2
- import { Extension, Editor } from '@tiptap/react';
1
+ import { Extension } from '@tiptap/react';
3
2
  import { FontFamilyOptions } from '@tiptap/extension-text-style';
4
- import { a as ExtDropdownOptions } from '../tiptap-ext.type-DrneAC5G.mjs';
3
+ import { a as ExtDropdownOptions } from '../tiptap-ext.type-B3TtT7-J.mjs';
4
+ import 'react';
5
5
  import '@floating-ui/react';
6
6
 
7
7
  type FontFamilyListItem = string | {
8
8
  label: string;
9
9
  value?: string | null;
10
10
  };
11
- interface ExtFontFamilyOptions extends ExtDropdownOptions, FontFamilyOptions {
11
+ type ExtFontFamilyOptions = ExtDropdownOptions<FontFamilyOptions & {
12
12
  fontFamilyList?: FontFamilyListItem[];
13
- component: (args: {
14
- options: ExtFontFamilyOptions;
15
- editor: Editor;
16
- dropdownContainerClassName: string;
17
- dropdownItemClassName: string;
18
- }) => ReactNode;
19
- }
13
+ }, {
14
+ dropdownContainerClassName: string;
15
+ dropdownItemClassName: string;
16
+ }>;
20
17
  declare const FontFamily: Extension<ExtFontFamilyOptions>;
21
18
  declare const DEFAULT_FONT_FAMILY_LIST: FontFamilyListItem[];
22
19
 
@@ -1,22 +1,19 @@
1
- import { ReactNode } from 'react';
2
- import { Extension, Editor } from '@tiptap/react';
1
+ import { Extension } from '@tiptap/react';
3
2
  import { FontFamilyOptions } from '@tiptap/extension-text-style';
4
- import { a as ExtDropdownOptions } from '../tiptap-ext.type-DrneAC5G.js';
3
+ import { a as ExtDropdownOptions } from '../tiptap-ext.type-B3TtT7-J.js';
4
+ import 'react';
5
5
  import '@floating-ui/react';
6
6
 
7
7
  type FontFamilyListItem = string | {
8
8
  label: string;
9
9
  value?: string | null;
10
10
  };
11
- interface ExtFontFamilyOptions extends ExtDropdownOptions, FontFamilyOptions {
11
+ type ExtFontFamilyOptions = ExtDropdownOptions<FontFamilyOptions & {
12
12
  fontFamilyList?: FontFamilyListItem[];
13
- component: (args: {
14
- options: ExtFontFamilyOptions;
15
- editor: Editor;
16
- dropdownContainerClassName: string;
17
- dropdownItemClassName: string;
18
- }) => ReactNode;
19
- }
13
+ }, {
14
+ dropdownContainerClassName: string;
15
+ dropdownItemClassName: string;
16
+ }>;
20
17
  declare const FontFamily: Extension<ExtFontFamilyOptions>;
21
18
  declare const DEFAULT_FONT_FAMILY_LIST: FontFamilyListItem[];
22
19