quoin-editor 2.0.5 → 2.1.0

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 (215) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/MIGRATION.md +1 -1
  3. package/README.md +4 -3
  4. package/dist/ai.cjs +124 -94
  5. package/dist/ai.d.cts +7 -0
  6. package/dist/ai.d.ts +7 -0
  7. package/dist/ai.js +50 -20
  8. package/dist/ai.js.map +1 -1
  9. package/dist/catalogue.cjs +28 -26
  10. package/dist/catalogue.js +19 -17
  11. package/dist/catalogue.js.map +1 -1
  12. package/dist/{chunk-JGEDJYIV.cjs → chunk-2FUWXPPC.cjs} +92 -98
  13. package/dist/{chunk-NHNW5DK3.js → chunk-3F76QQ65.js} +6 -6
  14. package/dist/{chunk-NHNW5DK3.js.map → chunk-3F76QQ65.js.map} +1 -1
  15. package/dist/{chunk-DBOZFNWU.js → chunk-3QYFAAQR.js} +3 -3
  16. package/dist/{chunk-DBOZFNWU.js.map → chunk-3QYFAAQR.js.map} +1 -1
  17. package/dist/{chunk-I7X7B3WD.cjs → chunk-4JDRDPLC.cjs} +17 -8
  18. package/dist/{chunk-EBSDPHPS.cjs → chunk-4UFWFV43.cjs} +1060 -719
  19. package/dist/{chunk-LM3DHROX.cjs → chunk-5AUIA4B3.cjs} +2 -2
  20. package/dist/{chunk-3INFNIGN.cjs → chunk-5H3BB5VJ.cjs} +131 -78
  21. package/dist/{chunk-DJU25PFC.cjs → chunk-5L2NSIHZ.cjs} +11 -11
  22. package/dist/{chunk-W376L2GM.js → chunk-6Y7JAWYY.js} +8 -8
  23. package/dist/chunk-6Y7JAWYY.js.map +1 -0
  24. package/dist/{chunk-UDBLZILE.js → chunk-ATKDXQEY.js} +12 -7
  25. package/dist/{chunk-UDBLZILE.js.map → chunk-ATKDXQEY.js.map} +1 -1
  26. package/dist/{chunk-A2IQHMIH.js → chunk-BE2SYPK5.js} +49 -54
  27. package/dist/chunk-BE2SYPK5.js.map +1 -0
  28. package/dist/{chunk-PURYVDC3.cjs → chunk-CFICD2JP.cjs} +21 -16
  29. package/dist/{chunk-3HW3WRYC.cjs → chunk-CSIUXYRU.cjs} +2 -2
  30. package/dist/{chunk-N7BSFDDM.cjs → chunk-DBKL524I.cjs} +23 -23
  31. package/dist/{chunk-XE3IYW5B.js → chunk-DEFYFIWW.js} +90 -37
  32. package/dist/chunk-DEFYFIWW.js.map +1 -0
  33. package/dist/{chunk-7E43TURF.cjs → chunk-ECI3PSMS.cjs} +7 -7
  34. package/dist/{chunk-4G645EYO.js → chunk-F73QEF7E.js} +5 -5
  35. package/dist/{chunk-4G645EYO.js.map → chunk-F73QEF7E.js.map} +1 -1
  36. package/dist/{chunk-KHRVCTQQ.cjs → chunk-FUT7XLMP.cjs} +61 -74
  37. package/dist/{chunk-7J63427U.cjs → chunk-GQSBOBOM.cjs} +375 -320
  38. package/dist/{chunk-LU3T3JB4.js → chunk-HPNSQWRD.js} +15 -28
  39. package/dist/chunk-HPNSQWRD.js.map +1 -0
  40. package/dist/{chunk-7Y4B7NHO.js → chunk-I34BFOLL.js} +18 -11
  41. package/dist/chunk-I34BFOLL.js.map +1 -0
  42. package/dist/{chunk-AJT54OMZ.js → chunk-IFRXEFQH.js} +9 -15
  43. package/dist/chunk-IFRXEFQH.js.map +1 -0
  44. package/dist/{chunk-YYW33WUL.cjs → chunk-K3XWVRL4.cjs} +8 -8
  45. package/dist/{chunk-LSI4RMTY.js → chunk-L5L6YNLT.js} +3 -3
  46. package/dist/{chunk-LSI4RMTY.js.map → chunk-L5L6YNLT.js.map} +1 -1
  47. package/dist/{chunk-2BPXVQBP.js → chunk-MO4UMXMT.js} +238 -86
  48. package/dist/chunk-MO4UMXMT.js.map +1 -0
  49. package/dist/{chunk-2QKFRKOP.cjs → chunk-N25EH2GZ.cjs} +351 -205
  50. package/dist/{chunk-CSPCDVCT.js → chunk-NCV2ML25.js} +3 -3
  51. package/dist/{chunk-CSPCDVCT.js.map → chunk-NCV2ML25.js.map} +1 -1
  52. package/dist/{chunk-NUQ64S5B.cjs → chunk-OJSKSQTL.cjs} +26 -26
  53. package/dist/chunk-PIWMU4BV.js +9 -0
  54. package/dist/chunk-PIWMU4BV.js.map +1 -0
  55. package/dist/chunk-QFGWSFOI.cjs +10 -0
  56. package/dist/{chunk-GPTJYWGS.js → chunk-RNBLVGWY.js} +3 -3
  57. package/dist/{chunk-GPTJYWGS.js.map → chunk-RNBLVGWY.js.map} +1 -1
  58. package/dist/{chunk-5RBMZGKV.js → chunk-TL2MJOWM.js} +325 -57
  59. package/dist/chunk-TL2MJOWM.js.map +1 -0
  60. package/dist/{chunk-YEDPBYO5.cjs → chunk-UDQ52EEC.cjs} +4 -4
  61. package/dist/{chunk-EIWPJWY3.js → chunk-UE2NQPNG.js} +5 -5
  62. package/dist/{chunk-EIWPJWY3.js.map → chunk-UE2NQPNG.js.map} +1 -1
  63. package/dist/{chunk-BE2YHZXA.cjs → chunk-ULV3SCYP.cjs} +26 -15
  64. package/dist/{chunk-WDBFGX3U.cjs → chunk-VTTMJGWP.cjs} +72 -77
  65. package/dist/{chunk-556PFYES.js → chunk-WK4UGDZN.js} +290 -235
  66. package/dist/chunk-WK4UGDZN.js.map +1 -0
  67. package/dist/{chunk-JZF6UQH5.cjs → chunk-WMKA37NJ.cjs} +12 -12
  68. package/dist/{chunk-F2ZK6Z52.js → chunk-Y26F2X4E.js} +3 -3
  69. package/dist/{chunk-F2ZK6Z52.js.map → chunk-Y26F2X4E.js.map} +1 -1
  70. package/dist/{chunk-FK7EBZPX.cjs → chunk-Z5EEDCRI.cjs} +549 -276
  71. package/dist/{chunk-G6NBQYMM.js → chunk-ZGFZRVQA.js} +817 -478
  72. package/dist/chunk-ZGFZRVQA.js.map +1 -0
  73. package/dist/{chunk-QLVX7MPS.js → chunk-ZQF45LA4.js} +19 -8
  74. package/dist/chunk-ZQF45LA4.js.map +1 -0
  75. package/dist/comments.cjs +127 -65
  76. package/dist/comments.d.cts +35 -2
  77. package/dist/comments.d.ts +35 -2
  78. package/dist/comments.js +73 -12
  79. package/dist/comments.js.map +1 -1
  80. package/dist/{diagram-extension-22x_njXB.d.ts → diagram-extension-BMlh8GCw.d.ts} +1 -1
  81. package/dist/{diagram-extension-C_FSkoj9.d.cts → diagram-extension-gmndUpti.d.cts} +1 -1
  82. package/dist/diagram.cjs +10 -9
  83. package/dist/diagram.d.cts +2 -2
  84. package/dist/diagram.d.ts +2 -2
  85. package/dist/diagram.js +7 -6
  86. package/dist/diff.cjs +25 -25
  87. package/dist/diff.js +3 -3
  88. package/dist/docx.cjs +31 -30
  89. package/dist/docx.js +5 -4
  90. package/dist/docx.js.map +1 -1
  91. package/dist/embed.cjs +10 -9
  92. package/dist/embed.js +8 -7
  93. package/dist/{emoji-extension-Dk5IQLZf.d.cts → emoji-extension-DD9CQTQj.d.cts} +1 -1
  94. package/dist/{emoji-extension-C832oGeT.d.ts → emoji-extension-U_PWZ2fX.d.ts} +1 -1
  95. package/dist/emoji.cjs +10 -9
  96. package/dist/emoji.d.cts +2 -2
  97. package/dist/emoji.d.ts +2 -2
  98. package/dist/emoji.js +7 -6
  99. package/dist/engine.cjs +58 -58
  100. package/dist/engine.d.cts +3 -3
  101. package/dist/engine.d.ts +3 -3
  102. package/dist/engine.js +3 -3
  103. package/dist/{find-extension-DmK9_N81.d.ts → find-extension-BGlqooZi.d.ts} +1 -1
  104. package/dist/{find-extension-BfruAPLi.d.cts → find-extension-BPnAJ8bY.d.cts} +1 -1
  105. package/dist/find.cjs +11 -10
  106. package/dist/find.d.cts +1 -1
  107. package/dist/find.d.ts +1 -1
  108. package/dist/find.js +7 -6
  109. package/dist/headless.cjs +70 -69
  110. package/dist/headless.d.cts +33 -10
  111. package/dist/headless.d.ts +33 -10
  112. package/dist/headless.js +5 -4
  113. package/dist/highlight.cjs +7 -6
  114. package/dist/highlight.js +6 -5
  115. package/dist/highlight.js.map +1 -1
  116. package/dist/{index-3fYvwqUZ.d.cts → index-DN7vRKFw.d.cts} +1 -1
  117. package/dist/{index-CgxnzCO5.d.ts → index-DyIYI3PM.d.ts} +1 -1
  118. package/dist/index.cjs +82 -81
  119. package/dist/index.d.cts +19 -12
  120. package/dist/index.d.ts +19 -12
  121. package/dist/index.js +6 -5
  122. package/dist/{labels-CiCxj2jP.d.cts → labels-BJORhN93.d.ts} +10 -5
  123. package/dist/{labels-BhRJYo46.d.ts → labels-CVYJ2-1X.d.cts} +10 -5
  124. package/dist/locale-ar.cjs +10 -0
  125. package/dist/locale-ar.d.cts +1 -1
  126. package/dist/locale-ar.d.ts +1 -1
  127. package/dist/locale-ar.js +10 -0
  128. package/dist/locale-ar.js.map +1 -1
  129. package/dist/locale-de.cjs +4 -0
  130. package/dist/locale-de.d.cts +1 -1
  131. package/dist/locale-de.d.ts +1 -1
  132. package/dist/locale-de.js +4 -0
  133. package/dist/locale-de.js.map +1 -1
  134. package/dist/locale-es.cjs +4 -0
  135. package/dist/locale-es.d.cts +1 -1
  136. package/dist/locale-es.d.ts +1 -1
  137. package/dist/locale-es.js +4 -0
  138. package/dist/locale-es.js.map +1 -1
  139. package/dist/locale-fr.cjs +4 -0
  140. package/dist/locale-fr.d.cts +1 -1
  141. package/dist/locale-fr.d.ts +1 -1
  142. package/dist/locale-fr.js +4 -0
  143. package/dist/locale-fr.js.map +1 -1
  144. package/dist/locale-ja.cjs +4 -0
  145. package/dist/locale-ja.d.cts +1 -1
  146. package/dist/locale-ja.d.ts +1 -1
  147. package/dist/locale-ja.js +4 -0
  148. package/dist/locale-ja.js.map +1 -1
  149. package/dist/locale-pt.cjs +4 -0
  150. package/dist/locale-pt.d.cts +1 -1
  151. package/dist/locale-pt.d.ts +1 -1
  152. package/dist/locale-pt.js +4 -0
  153. package/dist/locale-pt.js.map +1 -1
  154. package/dist/locale-zh.cjs +4 -0
  155. package/dist/locale-zh.d.cts +1 -1
  156. package/dist/locale-zh.d.ts +1 -1
  157. package/dist/locale-zh.js +4 -0
  158. package/dist/locale-zh.js.map +1 -1
  159. package/dist/math.cjs +11 -10
  160. package/dist/math.js +9 -8
  161. package/dist/mention.cjs +11 -10
  162. package/dist/mention.js +9 -8
  163. package/dist/{node-reveal-DY6bimv3.d.cts → node-reveal-Be7Xa0BL.d.cts} +1 -1
  164. package/dist/{node-reveal-BnFcnHhz.d.ts → node-reveal-CftIEqF_.d.ts} +1 -1
  165. package/dist/palette-DuIFHYHc.d.cts +10 -0
  166. package/dist/palette-DuIFHYHc.d.ts +10 -0
  167. package/dist/presence.cjs +39 -38
  168. package/dist/presence.js +8 -7
  169. package/dist/presence.js.map +1 -1
  170. package/dist/source.cjs +10 -9
  171. package/dist/source.d.cts +1 -1
  172. package/dist/source.d.ts +1 -1
  173. package/dist/source.js +6 -5
  174. package/dist/source.js.map +1 -1
  175. package/dist/{stats-extension-Dmw0Ujxe.d.ts → stats-extension-Bbpr593p.d.ts} +1 -1
  176. package/dist/{stats-extension-D5HySF0a.d.cts → stats-extension-D7FaeydW.d.cts} +1 -1
  177. package/dist/stats.cjs +12 -10
  178. package/dist/stats.d.cts +2 -2
  179. package/dist/stats.d.ts +2 -2
  180. package/dist/stats.js +9 -7
  181. package/dist/styles.css +1 -1
  182. package/dist/{table-extension-7LkLNK6Q.d.cts → table-extension-DNijjmxV.d.cts} +1 -1
  183. package/dist/{table-extension-DEpV0DnP.d.ts → table-extension-Dp6FYGPh.d.ts} +1 -1
  184. package/dist/table.cjs +26 -25
  185. package/dist/table.d.cts +4 -3
  186. package/dist/table.d.ts +4 -3
  187. package/dist/table.js +7 -6
  188. package/dist/{toc-extension-Dvh37bWQ.d.cts → toc-extension-BGEVAmSY.d.cts} +1 -1
  189. package/dist/{toc-extension-SVckrFmb.d.ts → toc-extension-DZIe40eV.d.ts} +1 -1
  190. package/dist/toc.cjs +10 -9
  191. package/dist/toc.d.cts +2 -2
  192. package/dist/toc.d.ts +2 -2
  193. package/dist/toc.js +7 -6
  194. package/dist/{types-DMuuDBVh.d.ts → types-Byu2a9qk.d.ts} +6 -1
  195. package/dist/{types-Bzhq5AXj.d.cts → types-DdDlCyyZ.d.cts} +6 -1
  196. package/dist/view.cjs +4 -4
  197. package/dist/view.js +2 -2
  198. package/dist/yjs.cjs +121 -121
  199. package/dist/yjs.d.cts +2 -2
  200. package/dist/yjs.d.ts +2 -2
  201. package/dist/yjs.js +5 -5
  202. package/package.json +4 -3
  203. package/dist/chunk-2BPXVQBP.js.map +0 -1
  204. package/dist/chunk-556PFYES.js.map +0 -1
  205. package/dist/chunk-5RBMZGKV.js.map +0 -1
  206. package/dist/chunk-7Y4B7NHO.js.map +0 -1
  207. package/dist/chunk-A2IQHMIH.js.map +0 -1
  208. package/dist/chunk-AJT54OMZ.js.map +0 -1
  209. package/dist/chunk-G6NBQYMM.js.map +0 -1
  210. package/dist/chunk-LU3T3JB4.js.map +0 -1
  211. package/dist/chunk-QLVX7MPS.js.map +0 -1
  212. package/dist/chunk-W376L2GM.js.map +0 -1
  213. package/dist/chunk-XE3IYW5B.js.map +0 -1
  214. package/dist/palette-BrX-hEd-.d.cts +0 -4
  215. package/dist/palette-BrX-hEd-.d.ts +0 -4
@@ -1,20 +1,23 @@
1
1
  'use strict';
2
2
 
3
3
  var chunk2SWLD6R5_cjs = require('./chunk-2SWLD6R5.cjs');
4
- var chunkEBSDPHPS_cjs = require('./chunk-EBSDPHPS.cjs');
5
- var chunk2QKFRKOP_cjs = require('./chunk-2QKFRKOP.cjs');
4
+ var chunk4UFWFV43_cjs = require('./chunk-4UFWFV43.cjs');
5
+ var chunkN25EH2GZ_cjs = require('./chunk-N25EH2GZ.cjs');
6
6
  var chunkZWTIRGY5_cjs = require('./chunk-ZWTIRGY5.cjs');
7
- var chunkFK7EBZPX_cjs = require('./chunk-FK7EBZPX.cjs');
8
- var chunkI7X7B3WD_cjs = require('./chunk-I7X7B3WD.cjs');
7
+ var chunkZ5EEDCRI_cjs = require('./chunk-Z5EEDCRI.cjs');
8
+ var chunk4JDRDPLC_cjs = require('./chunk-4JDRDPLC.cjs');
9
9
  var react = require('react');
10
10
  var jsxRuntime = require('react/jsx-runtime');
11
11
 
12
12
  // src/extensions/emoji/all-callouts.ts
13
- var allCallouts = (state, blockIds) => blockIds.length > 0 && blockIds.every((id) => chunkI7X7B3WD_cjs.blockById(state.doc, id)?.type === "CALLOUT");
13
+ var allCallouts = (state, blockIds) => blockIds.length > 0 && blockIds.every((id) => chunk4JDRDPLC_cjs.blockById(state.doc, id)?.type === "CALLOUT");
14
14
 
15
15
  // src/extensions/emoji/composing-key.ts
16
16
  var isComposing = (event) => event.isComposing || event.keyCode === 229;
17
17
 
18
+ // src/extensions/emoji/emoji-at.ts
19
+ var emojiAt = (target) => target instanceof Element ? target.closest("[data-emoji]")?.getAttribute("data-emoji") ?? null : null;
20
+
18
21
  // src/extensions/emoji/emoji-name.ts
19
22
  var emojiName = ({ shortcodes, tags }) => shortcodes[0] ?? tags[0] ?? "";
20
23
 
@@ -40,14 +43,13 @@ var MOVES = {
40
43
  function gridMove(rows, cell, key, ctrl = false) {
41
44
  return Object.hasOwn(MOVES, key) ? MOVES[key](rows, cell, ctrl) : null;
42
45
  }
43
- var CELL = chunkEBSDPHPS_cjs.cn(
46
+ var CELL = chunk4UFWFV43_cjs.cn(
44
47
  "flex size-8 shrink-0 cursor-default items-center justify-center rounded-sm text-xl hover:bg-accent",
45
- chunkEBSDPHPS_cjs.FOCUS_RING
48
+ chunk4UFWFV43_cjs.FOCUS_RING
46
49
  );
47
50
  var HEADING = "px-1 pt-2 pb-1 text-xs font-medium text-muted-foreground";
48
51
  var FIRST = { row: 0, col: 0 };
49
52
  var cellId = (baseId, row, col) => `${baseId}-cell-${row}-${col}`;
50
- var emojiAt = (target) => target instanceof Element ? target.closest("[data-emoji]")?.getAttribute("data-emoji") ?? null : null;
51
53
  var EmojiRow = react.memo(function EmojiRow2({ baseId, row, emoji, activeCol }) {
52
54
  return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "row", className: "flex", children: emoji.map((cell, col) => /* @__PURE__ */ jsxRuntime.jsx(
53
55
  "div",
@@ -63,10 +65,10 @@ var EmojiRow = react.memo(function EmojiRow2({ baseId, row, emoji, activeCol })
63
65
  cell.emoji
64
66
  )) });
65
67
  });
66
- var EmojiGrids = react.forwardRef(function EmojiGrids2({ layout, onPick }, ref) {
68
+ function EmojiGrid({ section: section2, onPick }) {
67
69
  const baseId = react.useId();
68
70
  const [active, setActive] = react.useState(null);
69
- const current = (active === null ? void 0 : layout.places.get(active)) ?? FIRST;
71
+ const current = (active === null ? void 0 : section2.places.get(active)) ?? FIRST;
70
72
  const onKeyDown = (event) => {
71
73
  if (isComposing(event.nativeEvent) || event.altKey || event.shiftKey || event.metaKey) return;
72
74
  if (event.key === "Enter") {
@@ -76,45 +78,47 @@ var EmojiGrids = react.forwardRef(function EmojiGrids2({ layout, onPick }, ref)
76
78
  onPick(emoji);
77
79
  return;
78
80
  }
79
- const key = chunk2QKFRKOP_cjs.arrowAsWritten(event.key, chunk2QKFRKOP_cjs.inlineDirection(event.currentTarget));
80
- const next = gridMove(layout.rowLengths, current, key, event.ctrlKey);
81
+ const key = chunkN25EH2GZ_cjs.arrowAsWritten(event.key, chunkN25EH2GZ_cjs.inlineDirection(event.currentTarget));
82
+ const next = gridMove(section2.rowLengths, current, key, event.ctrlKey);
81
83
  if (next === null) return;
82
84
  event.preventDefault();
83
- setActive(layout.rows[next.row][next.col].emoji);
85
+ setActive(section2.rows[next.row][next.col].emoji);
84
86
  event.currentTarget.ownerDocument.getElementById(cellId(baseId, next.row, next.col))?.focus();
85
87
  };
86
- const onClick = (event) => {
87
- const emoji = emojiAt(event.target);
88
- if (emoji !== null) onPick(emoji);
89
- };
90
88
  const onFocus = (event) => {
91
89
  const emoji = emojiAt(event.target);
92
90
  if (emoji !== null) setActive(emoji);
93
91
  };
94
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: "max-h-72 overflow-y-auto", onKeyDown, onClick, onFocus, children: layout.sections.map((section) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
95
- /* @__PURE__ */ jsxRuntime.jsx("div", { id: `${baseId}-${section.key}`, className: HEADING, children: section.label }),
96
- /* @__PURE__ */ jsxRuntime.jsx("div", { role: "grid", "aria-labelledby": `${baseId}-${section.key}`, children: section.rows.map((emoji, index) => {
97
- const row = section.firstRow + index;
98
- return /* @__PURE__ */ jsxRuntime.jsx(
99
- EmojiRow,
100
- {
101
- baseId,
102
- row,
103
- emoji,
104
- activeCol: row === current.row ? current.col : null
105
- },
106
- row
107
- );
108
- }) })
109
- ] }, section.key)) });
92
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
93
+ /* @__PURE__ */ jsxRuntime.jsx("div", { id: `${baseId}-label`, className: HEADING, children: section2.label }),
94
+ /* @__PURE__ */ jsxRuntime.jsx("div", { role: "grid", "aria-labelledby": `${baseId}-label`, onKeyDown, onFocus, children: section2.rows.map((emoji, row) => /* @__PURE__ */ jsxRuntime.jsx(
95
+ EmojiRow,
96
+ {
97
+ baseId,
98
+ row,
99
+ emoji,
100
+ activeCol: row === current.row ? current.col : null
101
+ },
102
+ row
103
+ )) })
104
+ ] });
105
+ }
106
+ var EmojiGrids = react.forwardRef(function EmojiGrids2({ layout, onPick }, ref) {
107
+ const onClick = (event) => {
108
+ const emoji = emojiAt(event.target);
109
+ if (emoji !== null) onPick(emoji);
110
+ };
111
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: "max-h-72 overflow-y-auto", onClick, children: layout.map((section2) => /* @__PURE__ */ jsxRuntime.jsx(EmojiGrid, { section: section2, onPick }, section2.key)) });
110
112
  });
111
113
 
112
114
  // src/extensions/emoji/picker-layout.ts
113
115
  var COLUMNS = 8;
114
- function inRows(emoji) {
116
+ function section(key, label, emoji) {
115
117
  const rows = [];
116
118
  for (let start = 0; start < emoji.length; start += COLUMNS) rows.push(emoji.slice(start, start + COLUMNS));
117
- return rows;
119
+ const places = /* @__PURE__ */ new Map();
120
+ rows.forEach((cells, row) => cells.forEach((cell, col) => places.set(cell.emoji, { row, col })));
121
+ return { key, label, rows, rowLengths: rows.map((cells) => cells.length), places };
118
122
  }
119
123
  function grouped(found, labels) {
120
124
  const byGroup = /* @__PURE__ */ new Map();
@@ -123,20 +127,11 @@ function grouped(found, labels) {
123
127
  if (group === void 0) byGroup.set(emoji.group, [emoji]);
124
128
  else group.push(emoji);
125
129
  }
126
- return [...byGroup].map(([group, emoji]) => ({ key: group, label: labels.groups[group], rows: inRows(emoji) }));
130
+ return [...byGroup].map(([group, emoji]) => section(group, labels.groups[group], emoji));
127
131
  }
128
132
  function pickerLayout(found, searching, labels) {
129
- const unplaced = found.length === 0 ? [] : searching ? [{ key: "results", label: labels.searchResults, rows: inRows(found) }] : grouped(found, labels);
130
- let firstRow = 0;
131
- const sections = unplaced.map((section) => {
132
- const placed = { ...section, firstRow };
133
- firstRow += section.rows.length;
134
- return placed;
135
- });
136
- const rows = sections.flatMap((section) => section.rows);
137
- const places = /* @__PURE__ */ new Map();
138
- rows.forEach((cells, row) => cells.forEach(({ emoji }, col) => places.set(emoji, { row, col })));
139
- return { sections, rows, rowLengths: rows.map((cells) => cells.length), places };
133
+ if (found.length === 0) return [];
134
+ return searching ? [section("results", labels.searchResults, found)] : grouped(found, labels);
140
135
  }
141
136
 
142
137
  // src/extensions/emoji/emoji-data.ts
@@ -150,9 +145,9 @@ var loadEmojiData = () => emojiData.load();
150
145
 
151
146
  // src/extensions/emoji/use-emoji-data.ts
152
147
  function useEmojiData() {
153
- const { onError } = chunkEBSDPHPS_cjs.useQuoin();
148
+ const { onError } = chunk4UFWFV43_cjs.useQuoin();
154
149
  const report = react.useRef(onError);
155
- chunk2QKFRKOP_cjs.useIsomorphicLayoutEffect(() => {
150
+ chunkN25EH2GZ_cjs.useIsomorphicLayoutEffect(() => {
156
151
  report.current = onError;
157
152
  });
158
153
  const [state, setState] = react.useState(() => emojiData.loaded() ?? "loading");
@@ -165,7 +160,7 @@ function useEmojiData() {
165
160
  (reason) => {
166
161
  if (!current) return;
167
162
  setState("failed");
168
- report.current(chunkEBSDPHPS_cjs.toError(reason));
163
+ report.current(chunk4UFWFV43_cjs.toError(reason));
169
164
  }
170
165
  );
171
166
  return () => {
@@ -185,15 +180,16 @@ function EmojiPicker({ labels, onPick }) {
185
180
  () => typeof data === "string" ? null : pickerLayout(data.searchEmoji(query), searching, labels),
186
181
  [data, query, searching, labels]
187
182
  );
188
- const shown = layout !== null && layout.sections.length > 0;
183
+ const shown = layout !== null && layout.length > 0;
189
184
  const status = data === "loading" ? labels.loading : data === "failed" ? labels.loadFailed : shown ? "" : labels.noMatches;
190
185
  const focusGrids = () => grids.current?.querySelector(ACTIVE_CELL)?.focus();
191
186
  const onKeyDown = (event) => {
192
187
  if (event.key !== "Tab" || isComposing(event.nativeEvent) || event.altKey || event.ctrlKey || event.metaKey) return;
193
188
  event.preventDefault();
194
189
  event.stopPropagation();
195
- if (event.target === field.current) focusGrids();
196
- else field.current?.focus();
190
+ const stops = [field.current, ...grids.current?.querySelectorAll(ACTIVE_CELL) ?? []];
191
+ const at = stops.indexOf(event.target);
192
+ stops[(at + (event.shiftKey ? -1 : 1) + stops.length) % stops.length]?.focus();
197
193
  };
198
194
  const onFieldKeyDown = (event) => {
199
195
  if (isComposing(event.nativeEvent)) return;
@@ -202,12 +198,12 @@ function EmojiPicker({ labels, onPick }) {
202
198
  focusGrids();
203
199
  } else if (event.key === "Enter" && searching && shown) {
204
200
  event.preventDefault();
205
- onPick(layout.rows[0][0].emoji);
201
+ onPick(layout[0].rows[0][0].emoji);
206
202
  }
207
203
  };
208
204
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", onKeyDown, children: [
209
205
  /* @__PURE__ */ jsxRuntime.jsx(
210
- chunkEBSDPHPS_cjs.Input,
206
+ chunk4UFWFV43_cjs.Input,
211
207
  {
212
208
  ref: field,
213
209
  className: "h-8",
@@ -251,11 +247,11 @@ function useIconRequest(controller) {
251
247
  const read = react.useCallback(() => storeOf(controller).request, [controller]);
252
248
  return react.useSyncExternalStore(subscribe, read, read);
253
249
  }
254
- var CALLOUT_ICON = ".quoin-callout > :first-child";
250
+ var CALLOUT_ICON_BUTTON = ".quoin-callout > :first-child";
255
251
  function CalloutIconPicker({ controller, labels }) {
256
- const readOnly = chunk2QKFRKOP_cjs.useReadOnly(controller);
252
+ const readOnly = chunkN25EH2GZ_cjs.useReadOnly(controller);
257
253
  const request = useIconRequest(controller);
258
- const there = chunk2QKFRKOP_cjs.useEditorState(
254
+ const there = chunkN25EH2GZ_cjs.useEditorState(
259
255
  controller,
260
256
  react.useCallback((state) => request !== null && allCallouts(state, request.blocks), [request])
261
257
  );
@@ -267,18 +263,18 @@ function CalloutIconPicker({ controller, labels }) {
267
263
  return /* @__PURE__ */ jsxRuntime.jsx(IconPopover, { controller, labels, request }, request.blocks.join(" "));
268
264
  }
269
265
  function IconPopover({ controller, labels, request: { blocks } }) {
270
- const anchor = chunkEBSDPHPS_cjs.usePartAnchor(controller, blocks[0], CALLOUT_ICON);
266
+ const anchor = chunk4UFWFV43_cjs.usePartAnchor(controller, blocks[0], CALLOUT_ICON_BUTTON);
271
267
  const content = react.useRef(null);
272
268
  const close = () => requestIcon(controller, null);
273
269
  const finish = (icon) => {
274
270
  close();
275
- chunkEBSDPHPS_cjs.runOnBlocks(controller, blocks, icon === null ? chunkEBSDPHPS_cjs.noChange : chunkFK7EBZPX_cjs.setAttrs({ icon }));
271
+ chunk4UFWFV43_cjs.runOnBlocks(controller, blocks, icon === null ? chunk4UFWFV43_cjs.noChange : chunkZ5EEDCRI_cjs.setAttrs({ icon }));
276
272
  controller.focus();
277
273
  };
278
274
  const ownerDocument = react.useCallback(() => controller.root?.ownerDocument ?? document, [controller]);
279
- chunkEBSDPHPS_cjs.useOutsidePress(content, ownerDocument, close);
275
+ chunk4UFWFV43_cjs.useOutsidePress(content, ownerDocument, close);
280
276
  return /* @__PURE__ */ jsxRuntime.jsxs(
281
- chunkEBSDPHPS_cjs.Popover,
277
+ chunk4UFWFV43_cjs.Popover,
282
278
  {
283
279
  open: true,
284
280
  modal: false,
@@ -286,21 +282,21 @@ function IconPopover({ controller, labels, request: { blocks } }) {
286
282
  if (!open) close();
287
283
  },
288
284
  children: [
289
- /* @__PURE__ */ jsxRuntime.jsx(chunkEBSDPHPS_cjs.PopoverAnchor, { virtualRef: anchor }),
285
+ /* @__PURE__ */ jsxRuntime.jsx(chunk4UFWFV43_cjs.PopoverAnchor, { virtualRef: anchor }),
290
286
  /* @__PURE__ */ jsxRuntime.jsx(
291
- chunkEBSDPHPS_cjs.PopoverContent,
287
+ chunk4UFWFV43_cjs.PopoverContent,
292
288
  {
293
289
  ref: content,
294
290
  "aria-label": labels.chooseIcon,
295
291
  side: "bottom",
296
292
  align: "start",
297
293
  className: "w-80 p-2",
298
- onCloseAutoFocus: chunkEBSDPHPS_cjs.preventDefault,
294
+ onCloseAutoFocus: chunk4UFWFV43_cjs.preventDefault,
299
295
  onEscapeKeyDown: (event) => {
300
296
  event.preventDefault();
301
297
  if (!isComposing(event)) finish(null);
302
298
  },
303
- ...chunkEBSDPHPS_cjs.bubblePart(controller),
299
+ ...chunk4UFWFV43_cjs.bubblePart(controller),
304
300
  children: /* @__PURE__ */ jsxRuntime.jsx(EmojiPicker, { labels, onPick: finish })
305
301
  }
306
302
  )
@@ -312,13 +308,13 @@ function IconPopover({ controller, labels, request: { blocks } }) {
312
308
  // src/extensions/emoji/choose-icon-action.ts
313
309
  function calloutsFor(state, blockIds) {
314
310
  if (blockIds.length === 0 || !state.doc.index.has(blockIds[0])) return null;
315
- const targets = chunkEBSDPHPS_cjs.styleTargets(state, blockIds[0]);
311
+ const targets = chunk4UFWFV43_cjs.styleTargets(state, blockIds[0]);
316
312
  return allCallouts(state, targets) ? targets : null;
317
313
  }
318
314
  var chooseIconAction = (labels) => ({
319
315
  id: "choose-icon",
320
316
  label: labels.chooseIcon,
321
- icon: chunkEBSDPHPS_cjs.SmilePlus,
317
+ icon: chunk4UFWFV43_cjs.SmilePlus,
322
318
  available: (state, blockIds) => calloutsFor(state, blockIds) !== null,
323
319
  run: (controller, blockIds) => {
324
320
  const blocks = calloutsFor(controller.editor.state, blockIds);
@@ -327,7 +323,7 @@ var chooseIconAction = (labels) => ({
327
323
  });
328
324
 
329
325
  // src/extensions/emoji/emoji-key.ts
330
- var emojiKey = chunkFK7EBZPX_cjs.createPluginKey("emoji");
326
+ var emojiKey = chunkZ5EEDCRI_cjs.createPluginKey("emoji");
331
327
 
332
328
  // src/extensions/emoji/emoji-labels.ts
333
329
  var englishEmojiLabels = {
@@ -370,28 +366,27 @@ function emojiSource(limit, onFailure) {
370
366
  };
371
367
  }
372
368
  var SHOWN = 8;
373
- var SHORTEST_QUERY = 2;
374
- var queryAt = (state) => chunkFK7EBZPX_cjs.getPluginState(state, emojiKey).active?.query ?? null;
369
+ var queryAt = (state) => chunkZ5EEDCRI_cjs.getPluginState(state, emojiKey).active?.query ?? null;
375
370
  var emojiOf = ({ emoji }) => emoji;
376
371
  var renderEmoji = (emoji) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
377
372
  /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-base", children: emoji.emoji }),
378
373
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: emojiName(emoji) })
379
374
  ] });
380
375
  function EmojiMenu({ controller, labels }) {
381
- const readOnly = chunk2QKFRKOP_cjs.useReadOnly(controller);
382
- const query = chunk2QKFRKOP_cjs.useEditorState(controller, queryAt);
383
- if (readOnly || query === null || query.length < SHORTEST_QUERY) return null;
376
+ const readOnly = chunkN25EH2GZ_cjs.useReadOnly(controller);
377
+ const query = chunkN25EH2GZ_cjs.useEditorState(controller, queryAt);
378
+ if (readOnly || query === null) return null;
384
379
  return /* @__PURE__ */ jsxRuntime.jsx(EmojiMatches, { controller, labels });
385
380
  }
386
381
  function EmojiMatches({ controller, labels }) {
387
382
  const [failed, setFailed] = react.useState(false);
388
383
  const source = react.useMemo(() => emojiSource(SHOWN, () => setFailed(true)), []);
389
384
  const choose = react.useCallback(
390
- (emoji, range) => void chunkEBSDPHPS_cjs.replaceTrigger(controller, range, chunkFK7EBZPX_cjs.insertText(emoji.emoji)),
385
+ (emoji, range) => void chunk4UFWFV43_cjs.replaceTrigger(controller, range, chunkZ5EEDCRI_cjs.insertText(emoji.emoji)),
391
386
  [controller]
392
387
  );
393
388
  return /* @__PURE__ */ jsxRuntime.jsx(
394
- chunkEBSDPHPS_cjs.SuggestionMenu,
389
+ chunk4UFWFV43_cjs.SuggestionMenu,
395
390
  {
396
391
  controller,
397
392
  pluginKey: emojiKey,
@@ -410,7 +405,7 @@ function emojiExtension(options = {}) {
410
405
  const Menu = ({ controller }) => /* @__PURE__ */ jsxRuntime.jsx(EmojiMenu, { controller, labels });
411
406
  const Picker = ({ controller }) => /* @__PURE__ */ jsxRuntime.jsx(CalloutIconPicker, { controller, labels });
412
407
  const ui = { blockMenuItems: [chooseIconAction(labels)], overlays: [Menu, Picker] };
413
- return chunkFK7EBZPX_cjs.defineExtension({ name: "emoji", plugins: [chunkEBSDPHPS_cjs.suggestionPlugin(emojiKey, { char: ":" })], ui });
408
+ return chunkZ5EEDCRI_cjs.defineExtension({ name: "emoji", plugins: [chunk4UFWFV43_cjs.suggestionPlugin(emojiKey, { char: ":", minLength: 2 })], ui });
414
409
  }
415
410
 
416
411
  exports.emojiExtension = emojiExtension;