quoin-editor 0.4.2 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/CHANGELOG.md +251 -0
  2. package/MIGRATION.md +233 -0
  3. package/README.md +78 -716
  4. package/dist/ai.cjs +1148 -0
  5. package/dist/ai.cjs.map +1 -0
  6. package/dist/ai.d.cts +68 -0
  7. package/dist/ai.d.ts +68 -0
  8. package/dist/ai.js +1148 -0
  9. package/dist/ai.js.map +1 -0
  10. package/dist/catalogue.cjs +59 -0
  11. package/dist/catalogue.cjs.map +1 -0
  12. package/dist/catalogue.d.cts +39 -0
  13. package/dist/catalogue.d.ts +39 -0
  14. package/dist/catalogue.js +59 -0
  15. package/dist/catalogue.js.map +1 -0
  16. package/dist/chunk-26Q4LSIU.js +100 -0
  17. package/dist/chunk-26Q4LSIU.js.map +1 -0
  18. package/dist/chunk-56C7GCKO.cjs +1385 -0
  19. package/dist/chunk-56C7GCKO.cjs.map +1 -0
  20. package/dist/chunk-5M4QG3ZC.cjs +3303 -0
  21. package/dist/chunk-5M4QG3ZC.cjs.map +1 -0
  22. package/dist/chunk-5R3ISX4A.cjs +6643 -0
  23. package/dist/chunk-5R3ISX4A.cjs.map +1 -0
  24. package/dist/chunk-62WKUAQY.js +3335 -0
  25. package/dist/chunk-62WKUAQY.js.map +1 -0
  26. package/dist/chunk-6LMS5J3Y.js +320 -0
  27. package/dist/chunk-6LMS5J3Y.js.map +1 -0
  28. package/dist/chunk-6PKVJZQV.cjs +100 -0
  29. package/dist/chunk-6PKVJZQV.cjs.map +1 -0
  30. package/dist/chunk-6YSGUAVW.js +376 -0
  31. package/dist/chunk-6YSGUAVW.js.map +1 -0
  32. package/dist/chunk-75C6PX2L.cjs +239 -0
  33. package/dist/chunk-75C6PX2L.cjs.map +1 -0
  34. package/dist/chunk-A4IJSJKL.js +598 -0
  35. package/dist/chunk-A4IJSJKL.js.map +1 -0
  36. package/dist/chunk-BTBHHBVR.cjs +3335 -0
  37. package/dist/chunk-BTBHHBVR.cjs.map +1 -0
  38. package/dist/chunk-CLTHD5GO.cjs +34 -0
  39. package/dist/chunk-CLTHD5GO.cjs.map +1 -0
  40. package/dist/chunk-EH5KXQXY.cjs +62 -0
  41. package/dist/chunk-EH5KXQXY.cjs.map +1 -0
  42. package/dist/chunk-ESMAW4NK.cjs +184 -0
  43. package/dist/chunk-ESMAW4NK.cjs.map +1 -0
  44. package/dist/chunk-EYFCOV3T.cjs +30 -0
  45. package/dist/chunk-EYFCOV3T.cjs.map +1 -0
  46. package/dist/chunk-F5V3IEEE.cjs +326 -0
  47. package/dist/chunk-F5V3IEEE.cjs.map +1 -0
  48. package/dist/chunk-GPIDU3GN.js +239 -0
  49. package/dist/chunk-GPIDU3GN.js.map +1 -0
  50. package/dist/chunk-HOIDJEVI.cjs +4063 -0
  51. package/dist/chunk-HOIDJEVI.cjs.map +1 -0
  52. package/dist/chunk-JJ3RASQS.cjs +706 -0
  53. package/dist/chunk-JJ3RASQS.cjs.map +1 -0
  54. package/dist/chunk-LE3F7WIP.js +6643 -0
  55. package/dist/chunk-LE3F7WIP.js.map +1 -0
  56. package/dist/chunk-LE5XMIFJ.cjs +14 -0
  57. package/dist/chunk-LE5XMIFJ.cjs.map +1 -0
  58. package/dist/chunk-LMAEPFTX.js +30 -0
  59. package/dist/chunk-LMAEPFTX.js.map +1 -0
  60. package/dist/chunk-LV6EYPJO.js +34 -0
  61. package/dist/chunk-LV6EYPJO.js.map +1 -0
  62. package/dist/chunk-MLRAVUFG.cjs +376 -0
  63. package/dist/chunk-MLRAVUFG.cjs.map +1 -0
  64. package/dist/chunk-MQUCCSWG.js +14 -0
  65. package/dist/chunk-MQUCCSWG.js.map +1 -0
  66. package/dist/chunk-O4Z2WMFF.js +62 -0
  67. package/dist/chunk-O4Z2WMFF.js.map +1 -0
  68. package/dist/chunk-OCCKQHCY.js +25 -0
  69. package/dist/chunk-OCCKQHCY.js.map +1 -0
  70. package/dist/chunk-PGSS4IOS.js +706 -0
  71. package/dist/chunk-PGSS4IOS.js.map +1 -0
  72. package/dist/chunk-PIWRSX7U.js +562 -0
  73. package/dist/chunk-PIWRSX7U.js.map +1 -0
  74. package/dist/chunk-PX6LZMH4.cjs +598 -0
  75. package/dist/chunk-PX6LZMH4.cjs.map +1 -0
  76. package/dist/chunk-QXG3HWDS.js +184 -0
  77. package/dist/chunk-QXG3HWDS.js.map +1 -0
  78. package/dist/chunk-RQW3P3GH.js +504 -0
  79. package/dist/chunk-RQW3P3GH.js.map +1 -0
  80. package/dist/chunk-SSIRYUCK.js +3303 -0
  81. package/dist/chunk-SSIRYUCK.js.map +1 -0
  82. package/dist/chunk-UBNG5YCG.js +326 -0
  83. package/dist/chunk-UBNG5YCG.js.map +1 -0
  84. package/dist/chunk-UCXLRRWY.js +1385 -0
  85. package/dist/chunk-UCXLRRWY.js.map +1 -0
  86. package/dist/chunk-UDAVVEFC.cjs +562 -0
  87. package/dist/chunk-UDAVVEFC.cjs.map +1 -0
  88. package/dist/chunk-UPSLDTLT.js +4063 -0
  89. package/dist/chunk-UPSLDTLT.js.map +1 -0
  90. package/dist/chunk-UWNZG2SD.cjs +25 -0
  91. package/dist/chunk-UWNZG2SD.cjs.map +1 -0
  92. package/dist/chunk-V3KLMSRO.cjs +504 -0
  93. package/dist/chunk-V3KLMSRO.cjs.map +1 -0
  94. package/dist/chunk-VACTAZWS.cjs +249 -0
  95. package/dist/chunk-VACTAZWS.cjs.map +1 -0
  96. package/dist/chunk-WMN6566P.js +249 -0
  97. package/dist/chunk-WMN6566P.js.map +1 -0
  98. package/dist/chunk-XX5FTPJR.cjs +320 -0
  99. package/dist/chunk-XX5FTPJR.cjs.map +1 -0
  100. package/dist/comments.cjs +1008 -0
  101. package/dist/comments.cjs.map +1 -0
  102. package/dist/comments.d.cts +93 -0
  103. package/dist/comments.d.ts +93 -0
  104. package/dist/comments.js +1008 -0
  105. package/dist/comments.js.map +1 -0
  106. package/dist/diff.cjs +346 -0
  107. package/dist/diff.cjs.map +1 -0
  108. package/dist/diff.d.cts +67 -0
  109. package/dist/diff.d.ts +67 -0
  110. package/dist/diff.js +346 -0
  111. package/dist/diff.js.map +1 -0
  112. package/dist/docx.cjs +874 -0
  113. package/dist/docx.cjs.map +1 -0
  114. package/dist/docx.d.cts +33 -0
  115. package/dist/docx.d.ts +33 -0
  116. package/dist/docx.js +874 -0
  117. package/dist/docx.js.map +1 -0
  118. package/dist/embed-provider-jXwlRmnp.d.cts +19 -0
  119. package/dist/embed-provider-jXwlRmnp.d.ts +19 -0
  120. package/dist/embed.cjs +17 -0
  121. package/dist/embed.cjs.map +1 -0
  122. package/dist/embed.d.cts +56 -0
  123. package/dist/embed.d.ts +56 -0
  124. package/dist/embed.js +17 -0
  125. package/dist/embed.js.map +1 -0
  126. package/dist/emoji-data.cjs +1968 -0
  127. package/dist/emoji-data.cjs.map +1 -0
  128. package/dist/emoji-data.js +1968 -0
  129. package/dist/emoji-data.js.map +1 -0
  130. package/dist/emoji-extension-CmPlRssm.d.ts +46 -0
  131. package/dist/emoji-extension-zJ6F7hW8.d.cts +46 -0
  132. package/dist/emoji.cjs +18 -0
  133. package/dist/emoji.cjs.map +1 -0
  134. package/dist/emoji.d.cts +31 -0
  135. package/dist/emoji.d.ts +31 -0
  136. package/dist/emoji.js +18 -0
  137. package/dist/emoji.js.map +1 -0
  138. package/dist/engine.cjs +119 -0
  139. package/dist/engine.cjs.map +1 -0
  140. package/dist/engine.d.cts +144 -0
  141. package/dist/engine.d.ts +144 -0
  142. package/dist/engine.js +119 -0
  143. package/dist/engine.js.map +1 -0
  144. package/dist/find-extension-BcRyE9K4.d.cts +41 -0
  145. package/dist/find-extension-CmFehyul.d.ts +41 -0
  146. package/dist/find.cjs +20 -0
  147. package/dist/find.cjs.map +1 -0
  148. package/dist/find.d.cts +44 -0
  149. package/dist/find.d.ts +44 -0
  150. package/dist/find.js +20 -0
  151. package/dist/find.js.map +1 -0
  152. package/dist/headless.cjs +151 -518
  153. package/dist/headless.cjs.map +1 -1
  154. package/dist/headless.d.cts +102 -69
  155. package/dist/headless.d.ts +102 -69
  156. package/dist/headless.js +149 -467
  157. package/dist/headless.js.map +1 -1
  158. package/dist/index-CFPmCee4.d.cts +68 -0
  159. package/dist/index-DiCGV60d.d.ts +68 -0
  160. package/dist/index.cjs +183 -2753
  161. package/dist/index.cjs.map +1 -1
  162. package/dist/index.d.cts +345 -253
  163. package/dist/index.d.ts +345 -253
  164. package/dist/index.js +168 -2696
  165. package/dist/index.js.map +1 -1
  166. package/dist/math.cjs +18 -0
  167. package/dist/math.cjs.map +1 -0
  168. package/dist/math.d.cts +49 -0
  169. package/dist/math.d.ts +49 -0
  170. package/dist/math.js +18 -0
  171. package/dist/math.js.map +1 -0
  172. package/dist/mention.cjs +18 -0
  173. package/dist/mention.cjs.map +1 -0
  174. package/dist/mention.d.cts +50 -0
  175. package/dist/mention.d.ts +50 -0
  176. package/dist/mention.js +18 -0
  177. package/dist/mention.js.map +1 -0
  178. package/dist/presence.cjs +562 -0
  179. package/dist/presence.cjs.map +1 -0
  180. package/dist/presence.d.cts +30 -0
  181. package/dist/presence.d.ts +30 -0
  182. package/dist/presence.js +562 -0
  183. package/dist/presence.js.map +1 -0
  184. package/dist/registry-CWBOSAHm.d.cts +121 -0
  185. package/dist/registry-CWBOSAHm.d.ts +121 -0
  186. package/dist/stats-extension-DisOEbbI.d.ts +40 -0
  187. package/dist/stats-extension-Dt1lgP3m.d.cts +40 -0
  188. package/dist/stats.cjs +19 -0
  189. package/dist/stats.cjs.map +1 -0
  190. package/dist/stats.d.cts +19 -0
  191. package/dist/stats.d.ts +19 -0
  192. package/dist/stats.js +19 -0
  193. package/dist/stats.js.map +1 -0
  194. package/dist/styles.css +1 -1
  195. package/dist/table-extension-BTMJnT7J.d.ts +57 -0
  196. package/dist/table-extension-DxZz3jqp.d.cts +57 -0
  197. package/dist/table.cjs +50 -0
  198. package/dist/table.cjs.map +1 -0
  199. package/dist/table.d.cts +57 -0
  200. package/dist/table.d.ts +57 -0
  201. package/dist/table.js +50 -0
  202. package/dist/table.js.map +1 -0
  203. package/dist/to-html-C5t7xyaM.d.ts +21 -0
  204. package/dist/to-html-CNCITCln.d.cts +21 -0
  205. package/dist/toc-extension-CR9U-l6j.d.ts +25 -0
  206. package/dist/toc-extension-DGHywOBv.d.cts +25 -0
  207. package/dist/toc.cjs +18 -0
  208. package/dist/toc.cjs.map +1 -0
  209. package/dist/toc.d.cts +24 -0
  210. package/dist/toc.d.ts +24 -0
  211. package/dist/toc.js +18 -0
  212. package/dist/toc.js.map +1 -0
  213. package/dist/types-C6_QkXzy.d.ts +358 -0
  214. package/dist/types-CJ7Gq3GX.d.cts +358 -0
  215. package/dist/types-DULc8wwg.d.cts +120 -0
  216. package/dist/types-DULc8wwg.d.ts +120 -0
  217. package/dist/view-controller-BD1KwYfE.d.cts +105 -0
  218. package/dist/view-controller-y4cb60ue.d.ts +105 -0
  219. package/dist/view.cjs +23 -0
  220. package/dist/view.cjs.map +1 -0
  221. package/dist/view.d.cts +40 -0
  222. package/dist/view.d.ts +40 -0
  223. package/dist/view.js +23 -0
  224. package/dist/view.js.map +1 -0
  225. package/dist/yjs.cjs +864 -0
  226. package/dist/yjs.cjs.map +1 -0
  227. package/dist/yjs.d.cts +22 -0
  228. package/dist/yjs.d.ts +22 -0
  229. package/dist/yjs.js +864 -0
  230. package/dist/yjs.js.map +1 -0
  231. package/package.json +217 -18
@@ -0,0 +1,706 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+
4
+ var _chunkUWNZG2SDcjs = require('./chunk-UWNZG2SD.cjs');
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+ var _chunk5R3ISX4Acjs = require('./chunk-5R3ISX4A.cjs');
30
+
31
+
32
+
33
+
34
+
35
+ var _chunk5M4QG3ZCcjs = require('./chunk-5M4QG3ZC.cjs');
36
+
37
+
38
+ var _chunkEH5KXQXYcjs = require('./chunk-EH5KXQXY.cjs');
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+ var _chunkHOIDJEVIcjs = require('./chunk-HOIDJEVI.cjs');
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+ var _chunkBTBHHBVRcjs = require('./chunk-BTBHHBVR.cjs');
66
+
67
+ // src/extensions/embed/LinkCard.tsx
68
+ var _react = require('react');
69
+ var _jsxruntime = require('react/jsx-runtime');
70
+ function LinkCard({ controller, blockId, url, title, description, image, readOnly, linkRef }) {
71
+ const card = _react.useRef.call(void 0, null);
72
+ const [failed, setFailed] = _react.useState.call(void 0, null);
73
+ const href = _chunkBTBHHBVRcjs.sanitizeHref.call(void 0, url);
74
+ const domain = _chunkUWNZG2SDcjs.domainOf.call(void 0, url);
75
+ const picture = _chunkUWNZG2SDcjs.webAddress.call(void 0, image);
76
+ const name = title || url;
77
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { ref: card, className: "quoin-link-card", ...readOnly ? void 0 : _chunk5R3ISX4Acjs.selectHandlers.call(void 0, controller, blockId, card), children: [
78
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "quoin-link-card-text", children: [
79
+ href === null ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "quoin-link-card-title", children: name }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
80
+ "a",
81
+ {
82
+ ref: linkRef,
83
+ href,
84
+ target: "_blank",
85
+ rel: "noopener noreferrer",
86
+ className: "quoin-link-card-title",
87
+ tabIndex: readOnly ? void 0 : -1,
88
+ children: name
89
+ }
90
+ ),
91
+ description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "quoin-link-card-description", children: description }),
92
+ domain !== null && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "quoin-link-card-domain", children: domain })
93
+ ] }),
94
+ picture !== null && picture !== failed && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
95
+ "img",
96
+ {
97
+ src: picture,
98
+ alt: "",
99
+ loading: "lazy",
100
+ referrerPolicy: "no-referrer",
101
+ draggable: false,
102
+ className: "quoin-link-card-image",
103
+ onError: () => setFailed(picture)
104
+ }
105
+ )
106
+ ] });
107
+ }
108
+
109
+ // src/extensions/embed/use-link-card-keys.ts
110
+
111
+ function useLinkCardKeys(controller, blockId, url, editable) {
112
+ const root = _react.useRef.call(void 0, null);
113
+ const link = _react.useRef.call(void 0, null);
114
+ const keys = _react.useMemo.call(void 0, () => ({ enter: () => _optionalChain([link, 'access', _ => _.current, 'optionalAccess', _2 => _2.focus, 'call', _3 => _3()]) }), []);
115
+ _chunk5R3ISX4Acjs.useNodeKeys.call(void 0, controller, blockId, editable, _chunkBTBHHBVRcjs.sanitizeHref.call(void 0, url) !== null, root, keys);
116
+ return { root, link };
117
+ }
118
+
119
+ // src/extensions/embed/use-unfurl.ts
120
+
121
+
122
+ // src/extensions/embed/unfurled-patch.ts
123
+ var filled = (value) => typeof value === "string" && value.trim() !== "" ? value : void 0;
124
+ function unfurledPatch(found) {
125
+ if (typeof found !== "object" || found === null) return null;
126
+ const { title, description, image } = found;
127
+ const patch = { title: filled(title), description: filled(description), image: _nullishCoalesce(_chunkUWNZG2SDcjs.webAddress.call(void 0, image), () => ( void 0)) };
128
+ if (patch.title === void 0) return null;
129
+ return Object.fromEntries(Object.entries(patch).filter(([, value]) => value !== void 0));
130
+ }
131
+
132
+ // src/extensions/embed/use-unfurl.ts
133
+ var canvases = /* @__PURE__ */ new WeakMap();
134
+ function asksOf(controller) {
135
+ let asks = canvases.get(controller);
136
+ if (asks === void 0) {
137
+ asks = { asked: /* @__PURE__ */ new Set(), drawn: /* @__PURE__ */ new Map() };
138
+ canvases.set(controller, asks);
139
+ }
140
+ return asks;
141
+ }
142
+ var keyOf = (blockId, url) => JSON.stringify([blockId, url]);
143
+ function askFirstTime(controller, blockId, url) {
144
+ const { asked } = asksOf(controller);
145
+ const key = keyOf(blockId, url);
146
+ if (asked.has(key)) return false;
147
+ asked.add(key);
148
+ return true;
149
+ }
150
+ function bookmarkAt(controller, blockId, url) {
151
+ const block = _chunkBTBHHBVRcjs.blockById.call(void 0, controller.editor.state.doc, blockId);
152
+ return _optionalChain([block, 'optionalAccess', _4 => _4.type]) === "BOOKMARK" && _chunkBTBHHBVRcjs.str.call(void 0, block.attrs.url) === url ? block : void 0;
153
+ }
154
+ async function unfurlInto(controller, blockId, url, unfurl, onError) {
155
+ const { asked, drawn } = asksOf(controller);
156
+ let found;
157
+ try {
158
+ found = await unfurl(url);
159
+ } catch (cause) {
160
+ if (bookmarkAt(controller, blockId, url) && drawn.get(blockId)) onError(_chunk5R3ISX4Acjs.toError.call(void 0, cause));
161
+ return;
162
+ }
163
+ const patch = unfurledPatch(found);
164
+ if (patch === null) return;
165
+ const block = bookmarkAt(controller, blockId, url);
166
+ if (block === void 0 || !drawn.get(blockId) || controller.readOnly) {
167
+ asked.delete(keyOf(blockId, url));
168
+ return;
169
+ }
170
+ if (_chunkBTBHHBVRcjs.str.call(void 0, block.attrs.title) !== "") return;
171
+ const { editor } = controller;
172
+ editor.dispatch(editor.createTransaction().step(_chunkHOIDJEVIcjs.setAttrsStep.call(void 0, blockId, patch)).setMeta("addToHistory", false));
173
+ }
174
+ function useUnfurl(controller, blockId, url, unfurl) {
175
+ const { onError } = _chunk5R3ISX4Acjs.useQuoin.call(void 0, );
176
+ _react.useEffect.call(void 0, () => {
177
+ const { drawn } = asksOf(controller);
178
+ drawn.set(blockId, (_nullishCoalesce(drawn.get(blockId), () => ( 0))) + 1);
179
+ return () => {
180
+ const left = (_nullishCoalesce(drawn.get(blockId), () => ( 1))) - 1;
181
+ if (left > 0) drawn.set(blockId, left);
182
+ else drawn.delete(blockId);
183
+ };
184
+ }, [controller, blockId]);
185
+ _react.useEffect.call(void 0, () => {
186
+ if (unfurl === void 0 || url === "" || !askFirstTime(controller, blockId, url)) return;
187
+ void unfurlInto(controller, blockId, url, unfurl, onError);
188
+ }, [controller, blockId, url, unfurl, onError]);
189
+ }
190
+
191
+ // src/extensions/embed/BookmarkBlock.tsx
192
+
193
+ function BookmarkBlock({ block, controller, feature }) {
194
+ const readOnly = _chunk5M4QG3ZCcjs.useReadOnly.call(void 0, controller);
195
+ const { attrs } = block;
196
+ const url = _chunkBTBHHBVRcjs.str.call(void 0, attrs.url);
197
+ const title = _chunkBTBHHBVRcjs.str.call(void 0, attrs.title);
198
+ const { root, link } = useLinkCardKeys(controller, block.id, url, !readOnly);
199
+ useUnfurl(controller, block.id, url, title === "" && !readOnly ? feature.unfurl : void 0);
200
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
201
+ "div",
202
+ {
203
+ ref: root,
204
+ role: "group",
205
+ "aria-label": feature.labels.bookmark,
206
+ contentEditable: false,
207
+ className: "quoin-bookmark",
208
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
209
+ LinkCard,
210
+ {
211
+ controller,
212
+ blockId: block.id,
213
+ url,
214
+ title,
215
+ description: _chunkBTBHHBVRcjs.str.call(void 0, attrs.description),
216
+ image: _chunkBTBHHBVRcjs.str.call(void 0, attrs.image),
217
+ readOnly,
218
+ linkRef: link
219
+ }
220
+ )
221
+ }
222
+ );
223
+ }
224
+
225
+ // src/extensions/embed/EmbedBlock.tsx
226
+
227
+
228
+ // src/extensions/embed/EmbedFrame.tsx
229
+
230
+
231
+ // src/extensions/embed/embed-player.ts
232
+ var PLAYER_HEIGHTS = { spotify: 352, soundcloud: 166 };
233
+ var playerHeight = (provider) => Object.hasOwn(PLAYER_HEIGHTS, provider) ? PLAYER_HEIGHTS[provider] : void 0;
234
+
235
+ // src/extensions/embed/use-cover-press.ts
236
+
237
+ function useCoverPress(controller) {
238
+ const [pressing, setPressing] = _react.useState.call(void 0, false);
239
+ _chunk5M4QG3ZCcjs.useIsomorphicLayoutEffect.call(void 0, () => {
240
+ const doc = _optionalChain([controller, 'access', _5 => _5.root, 'optionalAccess', _6 => _6.ownerDocument]);
241
+ if (!pressing || doc === void 0) return;
242
+ const release = () => setPressing(false);
243
+ doc.addEventListener("click", release);
244
+ doc.addEventListener("pointercancel", release);
245
+ doc.addEventListener("dragend", release);
246
+ return () => {
247
+ doc.removeEventListener("click", release);
248
+ doc.removeEventListener("pointercancel", release);
249
+ doc.removeEventListener("dragend", release);
250
+ };
251
+ }, [controller, pressing]);
252
+ const onPress = (event) => {
253
+ if (event.button === 0) setPressing(true);
254
+ };
255
+ return { pressing, onPress };
256
+ }
257
+
258
+ // src/extensions/embed/EmbedFrame.tsx
259
+
260
+ function EmbedFrame({ blockId, controller, match, labels, readOnly }) {
261
+ const root = _react.useRef.call(void 0, null);
262
+ const frame = _react.useRef.call(void 0, null);
263
+ const selected = _chunk5M4QG3ZCcjs.useEditorState.call(void 0,
264
+ controller,
265
+ _react.useCallback.call(void 0, ({ selection }) => _optionalChain([selection, 'optionalAccess', _7 => _7.kind]) === "node" && selection.block === blockId, [blockId])
266
+ );
267
+ const cover = useCoverPress(controller);
268
+ const keys = _react.useMemo.call(void 0, () => ({ enter: () => void setTimeout(() => _optionalChain([frame, 'access', _8 => _8.current, 'optionalAccess', _9 => _9.focus, 'call', _10 => _10()])) }), []);
269
+ _chunk5R3ISX4Acjs.useNodeKeys.call(void 0, controller, blockId, !readOnly, true, root, keys);
270
+ const height = playerHeight(match.provider);
271
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
272
+ "div",
273
+ {
274
+ ref: root,
275
+ className: "quoin-embed-frame",
276
+ ...height === void 0 ? void 0 : { "data-player": "", style: { height } },
277
+ children: [
278
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
279
+ "iframe",
280
+ {
281
+ ref: frame,
282
+ src: match.src,
283
+ title: labels.frameTitle(match.provider),
284
+ sandbox: _chunkBTBHHBVRcjs.EMBED_FRAME.sandbox,
285
+ loading: _chunkBTBHHBVRcjs.EMBED_FRAME.loading,
286
+ referrerPolicy: _chunkBTBHHBVRcjs.EMBED_FRAME.referrerpolicy,
287
+ tabIndex: readOnly ? void 0 : -1
288
+ }
289
+ ),
290
+ !readOnly && (!selected || cover.pressing) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
291
+ "div",
292
+ {
293
+ "aria-hidden": "true",
294
+ className: "quoin-embed-cover",
295
+ onPointerDownCapture: cover.onPress,
296
+ onMouseDown: (event) => event.preventDefault(),
297
+ onClick: () => _chunk5R3ISX4Acjs.focusNode.call(void 0, controller, blockId)
298
+ }
299
+ )
300
+ ]
301
+ }
302
+ );
303
+ }
304
+
305
+ // src/extensions/embed/providers.ts
306
+ function frameOf(url, provider) {
307
+ try {
308
+ return _nullishCoalesce(_optionalChain([_chunkBTBHHBVRcjs.embedFrame.call(void 0, url, [provider]), 'optionalAccess', _11 => _11.src]), () => ( null));
309
+ } catch (e) {
310
+ _chunkEH5KXQXYcjs.devWarn.call(void 0, `the embed provider "${provider.name}" threw, so it frames nothing.`);
311
+ return null;
312
+ }
313
+ }
314
+ function matchEmbed(url, hostProviders = []) {
315
+ for (const provider of [...hostProviders, ..._chunkBTBHHBVRcjs.coreEmbedProviders]) {
316
+ const src = frameOf(url, provider);
317
+ if (src !== null) return { provider: provider.name, src };
318
+ }
319
+ return null;
320
+ }
321
+
322
+ // src/extensions/embed/EmbedBlock.tsx
323
+
324
+ function EmbedBlock({ block, controller, feature }) {
325
+ const { labels, providers } = feature;
326
+ const readOnly = _chunk5M4QG3ZCcjs.useReadOnly.call(void 0, controller);
327
+ const url = _chunkBTBHHBVRcjs.str.call(void 0, block.attrs.url);
328
+ const match = _react.useMemo.call(void 0, () => matchEmbed(url, providers), [url, providers]);
329
+ const { root, link } = useLinkCardKeys(controller, block.id, url, !readOnly && match === null);
330
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { ref: root, role: "group", "aria-label": labels.embed, contentEditable: false, className: "quoin-embed", children: match === null ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, LinkCard, { controller, blockId: block.id, url, readOnly, linkRef: link }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, EmbedFrame, { blockId: block.id, controller, match, labels, readOnly }) });
331
+ }
332
+
333
+ // src/extensions/embed/embed-labels.ts
334
+ var PROVIDER_FRAMES = {
335
+ youtube: "YouTube video",
336
+ vimeo: "Vimeo video",
337
+ loom: "Loom video",
338
+ figma: "Figma design",
339
+ codepen: "CodePen pen",
340
+ spotify: "Spotify player",
341
+ soundcloud: "SoundCloud player"
342
+ };
343
+ var englishEmbedLabels = {
344
+ embed: "Embed",
345
+ embedDescription: "A video, design or player from a link",
346
+ bookmark: "Bookmark",
347
+ bookmarkDescription: "A card that links to a page",
348
+ frameTitle: (provider) => Object.hasOwn(PROVIDER_FRAMES, provider) ? PROVIDER_FRAMES[provider] : `${provider} embed`,
349
+ linkOptions: "Link options",
350
+ keepAsLink: "Keep as link",
351
+ embedLink: "Link to embed",
352
+ bookmarkLink: "Link to bookmark",
353
+ notALink: "Enter a web address, such as https://example.com",
354
+ cannotEmbed: "This link cannot be embedded.",
355
+ bookmarkInstead: "Bookmark instead"
356
+ };
357
+ function resolveEmbedLabels(overrides) {
358
+ const given = Object.entries(_nullishCoalesce(overrides, () => ( {}))).filter(([, value]) => value !== void 0);
359
+ return given.length === 0 ? englishEmbedLabels : { ...englishEmbedLabels, ...Object.fromEntries(given) };
360
+ }
361
+
362
+ // src/extensions/embed/embed-slash-items.ts
363
+ var _lucidereact = require('lucide-react');
364
+
365
+ // src/extensions/embed/link-request.ts
366
+
367
+ var stores = /* @__PURE__ */ new WeakMap();
368
+ function storeOf(controller) {
369
+ let store = stores.get(controller);
370
+ if (store === void 0) {
371
+ store = { request: null, listeners: /* @__PURE__ */ new Set() };
372
+ stores.set(controller, store);
373
+ }
374
+ return store;
375
+ }
376
+ function requestLink(controller, request) {
377
+ const store = storeOf(controller);
378
+ if (store.request === request) return;
379
+ store.request = request;
380
+ for (const listener of [...store.listeners]) listener();
381
+ }
382
+ function useLinkRequest(controller) {
383
+ const subscribe = _react.useCallback.call(void 0,
384
+ (notify) => {
385
+ const { listeners } = storeOf(controller);
386
+ listeners.add(notify);
387
+ return () => void listeners.delete(notify);
388
+ },
389
+ [controller]
390
+ );
391
+ const read = _react.useCallback.call(void 0, () => storeOf(controller).request, [controller]);
392
+ return _react.useSyncExternalStore.call(void 0, subscribe, read, read);
393
+ }
394
+
395
+ // src/extensions/embed/embed-slash-items.ts
396
+ var embedSlashItems = (labels) => [
397
+ {
398
+ id: "embed",
399
+ title: labels.embed,
400
+ description: labels.embedDescription,
401
+ group: "embeds",
402
+ icon: _lucidereact.AppWindow,
403
+ keywords: ["iframe", "video", "youtube", "vimeo", "loom", "figma", "codepen", "spotify", "soundcloud"],
404
+ run: ({ controller, range }) => requestLink(controller, { kind: "embed", at: range })
405
+ },
406
+ {
407
+ id: "bookmark",
408
+ title: labels.bookmark,
409
+ description: labels.bookmarkDescription,
410
+ group: "embeds",
411
+ icon: _lucidereact.Bookmark,
412
+ keywords: ["link", "url", "card", "preview", "web"],
413
+ run: ({ controller, range }) => requestLink(controller, { kind: "bookmark", at: range })
414
+ }
415
+ ];
416
+
417
+ // src/extensions/embed/link-choice.ts
418
+ var linkChoiceKey = _chunkHOIDJEVIcjs.createPluginKey.call(void 0, "linkChoice");
419
+ var linkChoicePlugin = {
420
+ key: linkChoiceKey,
421
+ init: () => null,
422
+ apply(tr, value, before, after) {
423
+ const pasted = tr.getMeta(linkChoiceKey.name);
424
+ if (pasted !== void 0) return pasted;
425
+ if (value === null) return null;
426
+ const moved = tr.selectionSet && !_chunkHOIDJEVIcjs.sameSelection.call(void 0, tr.before.selection, tr.selection);
427
+ const lineChanged = _chunkBTBHHBVRcjs.blockById.call(void 0, before.doc, value.block) !== _chunkBTBHHBVRcjs.blockById.call(void 0, after.doc, value.block);
428
+ return moved || lineChanged ? null : value;
429
+ }
430
+ };
431
+ var linkChoice = (state) => _nullishCoalesce(state.pluginState.get(linkChoiceKey.name), () => ( null));
432
+ function onEmptyLine({ doc, schema, selection }) {
433
+ if (doc.blocks.length === 0) return true;
434
+ if (_optionalChain([selection, 'optionalAccess', _12 => _12.kind]) !== "text" || !_chunkHOIDJEVIcjs.isCollapsed.call(void 0, selection)) return false;
435
+ const block = _chunkBTBHHBVRcjs.blockById.call(void 0, doc, selection.head.block);
436
+ return block !== void 0 && _chunkHOIDJEVIcjs.isParagraph.call(void 0, block) && _chunkHOIDJEVIcjs.regionLength.call(void 0, block, _nullishCoalesce(_chunkHOIDJEVIcjs.primaryRegion.call(void 0, schema, block), () => ( ""))) === 0;
437
+ }
438
+ var pasteLinkChoice = {
439
+ name: "link-choice",
440
+ match(text, state) {
441
+ const link = _chunkHOIDJEVIcjs.pastedLink.call(void 0, text);
442
+ const slice = link === null || link.rest !== "" || !onEmptyLine(state) ? null : _chunkHOIDJEVIcjs.sliceFromClipboard.call(void 0, { text });
443
+ if (link === null || slice === null) return null;
444
+ const paste = _chunkHOIDJEVIcjs.insertSlice.call(void 0, slice);
445
+ return (before, dispatch) => paste(before, dispatch && ((tr) => dispatch(tr.setMeta(linkChoiceKey.name, choiceAfter(tr, link.href)))));
446
+ }
447
+ };
448
+ function choiceAfter(tr, href) {
449
+ const { selection } = tr;
450
+ return _optionalChain([selection, 'optionalAccess', _13 => _13.kind]) === "text" ? { block: selection.head.block, href } : null;
451
+ }
452
+ function emptyParagraph(blockId) {
453
+ return (state, dispatch) => {
454
+ const line = _chunkBTBHHBVRcjs.blockById.call(void 0, state.doc, blockId);
455
+ if (line === void 0 || !_chunkHOIDJEVIcjs.isParagraph.call(void 0, line)) return false;
456
+ const tr = new (0, _chunkHOIDJEVIcjs.Transaction)(state).step(_chunkHOIDJEVIcjs.replaceBlockStep.call(void 0, _chunkHOIDJEVIcjs.withContent.call(void 0, state.schema, line, [])));
457
+ _optionalChain([dispatch, 'optionalCall', _14 => _14(tr.setSelection(_chunkHOIDJEVIcjs.startOf.call(void 0, tr.doc, state.schema, blockId)))]);
458
+ return true;
459
+ };
460
+ }
461
+ function replaceLink(blockId, block) {
462
+ return (state, dispatch) => {
463
+ const { ok, tr } = _chunkHOIDJEVIcjs.runCommands.call(void 0, state, [emptyParagraph(blockId), _chunk5R3ISX4Acjs.insertBlocks.call(void 0, [block], "line", blockId)]);
464
+ if (!ok || tr === null) return false;
465
+ _optionalChain([dispatch, 'optionalCall', _15 => _15(tr)]);
466
+ return true;
467
+ };
468
+ }
469
+
470
+ // src/extensions/embed/LinkChoicePopover.tsx
471
+
472
+
473
+ // src/extensions/embed/link-blocks.ts
474
+ function embedOf(href, providers) {
475
+ const match = matchEmbed(href, providers);
476
+ return match === null ? null : { type: "EMBED", attrs: { url: href, provider: match.provider } };
477
+ }
478
+ var bookmarkOf = (href) => ({ type: "BOOKMARK", attrs: { url: href } });
479
+ function typedLink(kind, typed, providers) {
480
+ const href = _chunkUWNZG2SDcjs.webAddress.call(void 0, _chunk5R3ISX4Acjs.linkAddress.call(void 0, typed));
481
+ if (href === null) return { href, block: null, problem: "notALink" };
482
+ const block = kind === "embed" ? embedOf(href, providers) : bookmarkOf(href);
483
+ return { href, block, problem: block === null ? "cannotEmbed" : null };
484
+ }
485
+
486
+ // src/extensions/embed/LinkChoicePopover.tsx
487
+
488
+ var plainKey = (event) => !event.altKey && !event.ctrlKey && !event.metaKey;
489
+ function linkEnd({ doc, schema }, blockId) {
490
+ const block = _chunkBTBHHBVRcjs.blockById.call(void 0, doc, blockId);
491
+ const region = block && _chunkHOIDJEVIcjs.primaryRegion.call(void 0, schema, block);
492
+ const end = block && region ? _chunkHOIDJEVIcjs.regionLength.call(void 0, block, region) : 0;
493
+ return block && region ? { block: blockId, region, from: end, to: end } : null;
494
+ }
495
+ function LinkChoicePopover({ controller, feature }) {
496
+ const readOnly = _chunk5M4QG3ZCcjs.useReadOnly.call(void 0, controller);
497
+ const choice = _chunk5M4QG3ZCcjs.useEditorState.call(void 0, controller, linkChoice);
498
+ const [dismissed, setDismissed] = _react.useState.call(void 0, null);
499
+ const dismiss = _react.useCallback.call(void 0, () => setDismissed(choice), [choice]);
500
+ if (readOnly || choice === null || choice === dismissed) return null;
501
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, LinkChoiceToolbar, { controller, feature, choice, onDismiss: dismiss });
502
+ }
503
+ function useEscapeInText(controller, onEscape) {
504
+ _react.useEffect.call(void 0, () => {
505
+ const intercept = (event) => {
506
+ if (event.key !== "Escape" || !plainKey(event) || event.shiftKey) return false;
507
+ event.preventDefault();
508
+ onEscape();
509
+ return true;
510
+ };
511
+ return _chunk5R3ISX4Acjs.interceptKeys.call(void 0, controller, intercept);
512
+ }, [controller, onEscape]);
513
+ }
514
+ function LinkChoiceToolbar({ controller, feature: { labels, providers }, choice, onDismiss }) {
515
+ const embed = _react.useMemo.call(void 0, () => embedOf(choice.href, providers), [choice.href, providers]);
516
+ const range = _react.useMemo.call(void 0, () => linkEnd(controller.editor.state, choice.block), [controller, choice.block]);
517
+ const { anchor } = _chunk5R3ISX4Acjs.useRangeAnchor.call(void 0, controller, range);
518
+ const after = _react.useMemo.call(void 0, () => {
519
+ const host = range && controller.registry.get(range.block, range.region);
520
+ return host && _chunk5R3ISX4Acjs.inlineDirection.call(void 0, host) === "rtl" ? "left" : "right";
521
+ }, [controller, range]);
522
+ const roving = _chunk5R3ISX4Acjs.useRovingFocus.call(void 0, );
523
+ const rovingRef = roving.ref;
524
+ const content = _react.useRef.call(void 0, null);
525
+ const ref = _react.useCallback.call(void 0,
526
+ (element) => {
527
+ content.current = element;
528
+ rovingRef(element);
529
+ },
530
+ [rovingRef]
531
+ );
532
+ const ownerDocument = _react.useCallback.call(void 0, () => _nullishCoalesce(_optionalChain([controller, 'access', _16 => _16.root, 'optionalAccess', _17 => _17.ownerDocument]), () => ( document)), [controller]);
533
+ _chunk5R3ISX4Acjs.useFocusKey.call(void 0, controller, roving.focusCurrent);
534
+ useEscapeInText(controller, onDismiss);
535
+ _chunk5R3ISX4Acjs.useOutsidePress.call(void 0, content, ownerDocument, onDismiss);
536
+ const choose = (block) => {
537
+ if (block === null) onDismiss();
538
+ else controller.run(replaceLink(choice.block, block));
539
+ controller.focus();
540
+ };
541
+ const onKeyDown = (event) => {
542
+ if (!roving.owns(event.target) || _chunk5M4QG3ZCcjs.isComposingKey.call(void 0, controller, event.nativeEvent)) return;
543
+ if (event.key === "Escape") onDismiss();
544
+ if (event.key === "Escape" || event.key === "Tab" && plainKey(event)) {
545
+ event.preventDefault();
546
+ controller.focus();
547
+ } else roving.onKeyDown(event);
548
+ };
549
+ const button = (label, block) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5R3ISX4Acjs.Button, { type: "button", variant: "ghost", size: "sm", onClick: () => choose(block), children: label });
550
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk5R3ISX4Acjs.Popover, { open: true, modal: false, children: [
551
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5R3ISX4Acjs.PopoverAnchor, { virtualRef: anchor }),
552
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
553
+ _chunk5R3ISX4Acjs.PopoverContent,
554
+ {
555
+ ref,
556
+ role: "toolbar",
557
+ "aria-label": labels.linkOptions,
558
+ side: after,
559
+ align: "end",
560
+ sideOffset: 8,
561
+ className: _chunk5R3ISX4Acjs.FLOATING_TOOLBAR,
562
+ onOpenAutoFocus: _chunk5R3ISX4Acjs.preventDefault,
563
+ onCloseAutoFocus: _chunk5R3ISX4Acjs.preventDefault,
564
+ onPointerDown: _chunk5R3ISX4Acjs.keepFocus,
565
+ onMouseDown: _chunk5R3ISX4Acjs.keepFocus,
566
+ onFocus: roving.onFocus,
567
+ onKeyDown,
568
+ ..._chunk5R3ISX4Acjs.bubblePart.call(void 0, controller),
569
+ children: [
570
+ embed !== null && button(labels.embed, embed),
571
+ button(labels.bookmark, bookmarkOf(choice.href)),
572
+ button(labels.keepAsLink, null)
573
+ ]
574
+ }
575
+ )
576
+ ] });
577
+ }
578
+
579
+ // src/extensions/embed/LinkInputOverlay.tsx
580
+
581
+
582
+ // src/extensions/embed/store-after-press.ts
583
+ function storeAfterPress(controller, request, block) {
584
+ const { editor } = controller;
585
+ if (controller.readOnly || controller.root === null) return;
586
+ controller.readSelectionFromDom();
587
+ const line = request.at.block;
588
+ const onLine = _chunkHOIDJEVIcjs.headBlockId.call(void 0, editor.state.selection) === line;
589
+ const place = onLine ? _chunk5R3ISX4Acjs.insertBlockToWrite.call(void 0, block, false, line) : _chunk5R3ISX4Acjs.insertBlocks.call(void 0, [block], "stay", line);
590
+ place(editor.state, (tr) => editor.dispatch(tr));
591
+ }
592
+
593
+ // src/extensions/embed/LinkInputOverlay.tsx
594
+
595
+ function LinkInputOverlay({ controller, feature }) {
596
+ const readOnly = _chunk5M4QG3ZCcjs.useReadOnly.call(void 0, controller);
597
+ const request = useLinkRequest(controller);
598
+ const close = _react.useCallback.call(void 0, () => requestLink(controller, null), [controller]);
599
+ _react.useEffect.call(void 0, () => {
600
+ if (readOnly) close();
601
+ }, [readOnly, close]);
602
+ if (readOnly || request === null) return null;
603
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, LinkInputPopover, { controller, feature, request, onClose: close });
604
+ }
605
+ function LinkInputPopover({ controller, feature: { labels, providers }, request, onClose }) {
606
+ const [address, setAddress] = _react.useState.call(void 0, "");
607
+ const [problem, setProblem] = _react.useState.call(void 0, null);
608
+ const messageId = _react.useId.call(void 0, );
609
+ const content = _react.useRef.call(void 0, null);
610
+ const { anchor, side } = _chunk5R3ISX4Acjs.useRangeAnchor.call(void 0, controller, request.at);
611
+ const name = request.kind === "embed" ? labels.embedLink : labels.bookmarkLink;
612
+ const typed = () => typedLink(request.kind, address, providers);
613
+ const finish = (block) => {
614
+ onClose();
615
+ if (block !== null && !controller.readOnly) controller.run(_chunk5R3ISX4Acjs.insertBlockToWrite.call(void 0, block, false, request.at.block));
616
+ controller.focus();
617
+ };
618
+ const submit = (event) => {
619
+ event.preventDefault();
620
+ const { block, problem: refused } = typed();
621
+ if (block === null) setProblem(refused);
622
+ else finish(block);
623
+ };
624
+ const bookmarkInstead = () => finish(typedLink("bookmark", address, providers).block);
625
+ const ownerDocument = _react.useCallback.call(void 0, () => _nullishCoalesce(_optionalChain([controller, 'access', _18 => _18.root, 'optionalAccess', _19 => _19.ownerDocument]), () => ( document)), [controller]);
626
+ _chunk5R3ISX4Acjs.useOutsidePress.call(void 0, content, ownerDocument, () => {
627
+ onClose();
628
+ const { block } = typed();
629
+ if (block !== null) setTimeout(() => storeAfterPress(controller, request, block));
630
+ });
631
+ const onKeyDown = (event) => {
632
+ if (event.key !== "Tab" || event.altKey || event.ctrlKey || event.metaKey) return;
633
+ if (_chunk5M4QG3ZCcjs.isComposingKey.call(void 0, controller, event.nativeEvent)) return;
634
+ const controls = [...event.currentTarget.querySelectorAll("input, button")];
635
+ const next = controls.indexOf(event.target) + (event.shiftKey ? -1 : 1);
636
+ event.preventDefault();
637
+ if (next >= 0 && next < controls.length) controls[next].focus();
638
+ else finish(typed().block);
639
+ };
640
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk5R3ISX4Acjs.Popover, { open: true, modal: false, children: [
641
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5R3ISX4Acjs.PopoverAnchor, { virtualRef: anchor }),
642
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
643
+ _chunk5R3ISX4Acjs.PopoverContent,
644
+ {
645
+ ref: content,
646
+ "aria-label": name,
647
+ side,
648
+ align: "start",
649
+ className: "w-80 p-2 shadow-md",
650
+ onCloseAutoFocus: _chunk5R3ISX4Acjs.preventDefault,
651
+ onEscapeKeyDown: (event) => {
652
+ event.preventDefault();
653
+ if (!_chunk5M4QG3ZCcjs.isComposingKey.call(void 0, controller, event)) finish(null);
654
+ },
655
+ ..._chunk5R3ISX4Acjs.bubblePart.call(void 0, controller),
656
+ children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "form", { noValidate: true, className: "quoin-embed-ask", onSubmit: submit, onKeyDown, children: [
657
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
658
+ _chunk5R3ISX4Acjs.Input,
659
+ {
660
+ type: "url",
661
+ className: "h-8",
662
+ "aria-label": name,
663
+ "aria-invalid": problem !== null || void 0,
664
+ "aria-describedby": problem === null ? void 0 : messageId,
665
+ value: address,
666
+ onChange: (event) => {
667
+ setAddress(event.target.value);
668
+ setProblem(null);
669
+ }
670
+ }
671
+ ),
672
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5R3ISX4Acjs.Button, { type: "submit", size: "sm", children: request.kind === "embed" ? labels.embed : labels.bookmark }),
673
+ problem !== null && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { id: messageId, role: "alert", className: "quoin-embed-ask-message", children: labels[problem] }),
674
+ problem === "cannotEmbed" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5R3ISX4Acjs.Button, { type: "button", variant: "outline", size: "sm", onClick: bookmarkInstead, children: labels.bookmarkInstead })
675
+ ] })
676
+ }
677
+ )
678
+ ] });
679
+ }
680
+
681
+ // src/extensions/embed/embed-extension.tsx
682
+
683
+ function embedExtension(options = {}) {
684
+ const feature = {
685
+ labels: resolveEmbedLabels(options.labels),
686
+ providers: _nullishCoalesce(options.providers, () => ( [])),
687
+ unfurl: options.unfurl
688
+ };
689
+ const EmbedRenderer = (props) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, EmbedBlock, { ...props, feature });
690
+ const BookmarkRenderer = (props) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, BookmarkBlock, { ...props, feature });
691
+ const ChoiceOverlay = ({ controller }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, LinkChoicePopover, { controller, feature });
692
+ const InputOverlay = ({ controller }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, LinkInputOverlay, { controller, feature });
693
+ const ui = {
694
+ slashItems: embedSlashItems(feature.labels),
695
+ renderers: { EMBED: EmbedRenderer, BOOKMARK: BookmarkRenderer },
696
+ blockNames: { EMBED: feature.labels.embed, BOOKMARK: feature.labels.bookmark },
697
+ overlays: [ChoiceOverlay, InputOverlay]
698
+ };
699
+ return _chunkHOIDJEVIcjs.defineExtension.call(void 0, { name: "embed", plugins: [linkChoicePlugin], pasteRules: [pasteLinkChoice], ui });
700
+ }
701
+
702
+
703
+
704
+
705
+ exports.englishEmbedLabels = englishEmbedLabels; exports.embedExtension = embedExtension;
706
+ //# sourceMappingURL=chunk-JJ3RASQS.cjs.map