@coze-editor/react-hooks 0.1.0-alpha.09ffeb

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 coze-dev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,567 @@
1
+ // src/hooks/use-state-field.ts
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { useEditor } from "@coze-editor/react";
4
+ import {
5
+ StateEffect,
6
+ StateField
7
+ } from "@codemirror/state";
8
+ function useStateField(create, update) {
9
+ const editor = useEditor();
10
+ const [effect] = useState(() => StateEffect.define());
11
+ const updateRef = useRef();
12
+ updateRef.current = update;
13
+ const [field3] = useState(
14
+ () => StateField.define({
15
+ create(state) {
16
+ return create(state);
17
+ },
18
+ update(value, tr) {
19
+ if (typeof updateRef.current === "function") {
20
+ value = updateRef.current(value, tr);
21
+ }
22
+ for (const trEffect of tr.effects) {
23
+ if (trEffect.is(effect)) {
24
+ return trEffect.value;
25
+ }
26
+ }
27
+ return value;
28
+ }
29
+ })
30
+ );
31
+ useEffect(() => {
32
+ if (!editor) {
33
+ return;
34
+ }
35
+ editor.$view.dispatch({
36
+ effects: effect.of(create(editor.$view.state))
37
+ });
38
+ }, [editor, effect, create]);
39
+ return field3;
40
+ }
41
+
42
+ // src/hooks/use-ranges-manager.ts
43
+ import { useEffect as useEffect2, useRef as useRef2 } from "react";
44
+ import {
45
+ useEditor as useEditor2,
46
+ useInjector
47
+ } from "@coze-editor/react";
48
+ import { Decoration } from "@codemirror/view";
49
+ import {
50
+ Facet,
51
+ RangeSet,
52
+ RangeSetBuilder,
53
+ StateEffect as StateEffect2,
54
+ StateField as StateField2
55
+ } from "@codemirror/state";
56
+ import { invertedEffects } from "@codemirror/commands";
57
+ var IDValue = class extends Decoration {
58
+ id;
59
+ constructor(spec) {
60
+ const { start, end } = getInclusive(spec);
61
+ super(
62
+ start ? -1 /* InlineIncStart */ : 5e8 /* NonIncStart */,
63
+ end ? 1 /* InlineIncEnd */ : -6e8 /* NonIncEnd */,
64
+ null,
65
+ spec
66
+ );
67
+ this.id = spec.id ?? "";
68
+ }
69
+ eq(other) {
70
+ return this.id === other.id;
71
+ }
72
+ };
73
+ function getInclusive(spec, block = false) {
74
+ let { inclusiveStart: start, inclusiveEnd: end } = spec;
75
+ if (start == null) {
76
+ start = spec.inclusive;
77
+ }
78
+ if (end == null) {
79
+ end = spec.inclusive;
80
+ }
81
+ return { start: start ?? block, end: end ?? block };
82
+ }
83
+ var addEffect = StateEffect2.define({
84
+ map: (specs, change) => specs.map(({ from, to, ...rest }) => ({
85
+ from: change.mapPos(from),
86
+ to: change.mapPos(to),
87
+ ...rest
88
+ }))
89
+ });
90
+ var removeEffect = StateEffect2.define();
91
+ var recoverEffect = StateEffect2.define();
92
+ var facet = Facet.define();
93
+ function toRangeSet(specs) {
94
+ specs.sort((a, b) => a.from - b.from);
95
+ const builder = new RangeSetBuilder();
96
+ for (const spec of specs) {
97
+ builder.add(
98
+ spec.from,
99
+ spec.to,
100
+ new IDValue({
101
+ id: spec.id
102
+ })
103
+ );
104
+ }
105
+ return builder.finish();
106
+ }
107
+ function toSpecs(ranges) {
108
+ const specs = [];
109
+ const cursor = ranges.iter();
110
+ while (cursor.value) {
111
+ specs.push({
112
+ from: cursor.from,
113
+ to: cursor.to,
114
+ id: cursor.value.id
115
+ });
116
+ cursor.next();
117
+ }
118
+ return specs;
119
+ }
120
+ function useRangesManager() {
121
+ const injector = useInjector();
122
+ const editor = useEditor2();
123
+ const watchersRef = useRef2([]);
124
+ const viewRef = useRef2(null);
125
+ viewRef.current = editor == null ? void 0 : editor.$view;
126
+ const rangesStashRef = useRef2([]);
127
+ useEffect2(() => {
128
+ if (!editor) {
129
+ return;
130
+ }
131
+ const field3 = StateField2.define({
132
+ create() {
133
+ if (rangesStashRef.current) {
134
+ return toRangeSet(rangesStashRef.current);
135
+ }
136
+ return RangeSet.empty;
137
+ },
138
+ update(set, tr) {
139
+ set = set.map(tr.changes);
140
+ for (const effect of tr.effects) {
141
+ if (effect.is(addEffect)) {
142
+ const specs = effect.value ?? [];
143
+ set = set.update({
144
+ add: specs.map(
145
+ (spec) => new IDValue({ id: spec.id }).range(spec.from, spec.to)
146
+ )
147
+ });
148
+ }
149
+ if (effect.is(removeEffect)) {
150
+ const ids = effect.value;
151
+ set = set.update({
152
+ filter(from, to, value) {
153
+ return !ids.includes(value.id);
154
+ }
155
+ });
156
+ }
157
+ if (effect.is(recoverEffect)) {
158
+ const specs = effect.value ?? [];
159
+ const ids = specs.map((spec) => spec.id);
160
+ set = set.update({
161
+ filter(from, to, value) {
162
+ return !ids.includes(value.id);
163
+ }
164
+ });
165
+ set = set.update({
166
+ add: specs.map(
167
+ (spec) => new IDValue({ id: spec.id }).range(spec.from, spec.to)
168
+ )
169
+ });
170
+ }
171
+ }
172
+ return set;
173
+ }
174
+ });
175
+ const invertable = invertedEffects.of((tr) => {
176
+ const effects = [];
177
+ const ranges = tr.startState.field(field3);
178
+ tr.changes.iterChangedRanges((from, to) => {
179
+ ranges.between(from, to, (rangeFrom, rangeTo, value) => {
180
+ const f = Math.max(from, rangeFrom);
181
+ const t = Math.min(to, rangeTo);
182
+ if (f < t) {
183
+ effects.push(
184
+ recoverEffect.of([
185
+ { from: rangeFrom, to: rangeTo, id: value.id }
186
+ ])
187
+ );
188
+ }
189
+ });
190
+ });
191
+ return effects;
192
+ });
193
+ let isFirstTime = true;
194
+ return injector.inject([
195
+ field3,
196
+ invertable,
197
+ facet.compute([field3], (state) => {
198
+ if (isFirstTime) {
199
+ isFirstTime = false;
200
+ return;
201
+ }
202
+ const set = state.field(field3);
203
+ if (Array.isArray(watchersRef.current) && watchersRef.current.length > 0) {
204
+ const specs = toSpecs(set);
205
+ for (const watcher of watchersRef.current) {
206
+ watcher(specs);
207
+ }
208
+ }
209
+ })
210
+ ]);
211
+ }, [editor]);
212
+ return {
213
+ add(specs) {
214
+ if (!viewRef.current) {
215
+ rangesStashRef.current.push(...specs);
216
+ return;
217
+ }
218
+ viewRef.current.dispatch({
219
+ effects: addEffect.of(specs)
220
+ });
221
+ },
222
+ remove(ids) {
223
+ if (!viewRef.current) {
224
+ rangesStashRef.current = rangesStashRef.current.filter(
225
+ (item) => !ids.includes(item.id)
226
+ );
227
+ return;
228
+ }
229
+ viewRef.current.dispatch({
230
+ effects: removeEffect.of(ids)
231
+ });
232
+ },
233
+ watch(watcher) {
234
+ watchersRef.current.push(watcher);
235
+ return () => {
236
+ watchersRef.current = watchersRef.current.filter((w) => w !== watcher);
237
+ };
238
+ }
239
+ };
240
+ }
241
+
242
+ // src/hooks/use-focused.ts
243
+ import { useLayoutEffect, useRef as useRef3, useState as useState2 } from "react";
244
+ import { useInjector as useInjector2, InjectPosition } from "@coze-editor/react";
245
+ import { EditorView } from "@codemirror/view";
246
+ function useFocused() {
247
+ const injector = useInjector2();
248
+ const [focused, setFocused] = useState2(false);
249
+ const focusedRef = useRef3(focused);
250
+ useLayoutEffect(
251
+ () => injector.inject(
252
+ [
253
+ EditorView.updateListener.of((update) => {
254
+ if (focusedRef.current !== update.view.hasFocus) {
255
+ setFocused(update.view.hasFocus);
256
+ focusedRef.current = update.view.hasFocus;
257
+ }
258
+ })
259
+ ],
260
+ InjectPosition.Tail
261
+ ),
262
+ [injector, setFocused]
263
+ );
264
+ return focused;
265
+ }
266
+
267
+ // src/hooks/use-injector-effect.ts
268
+ import { useLayoutEffect as useLayoutEffect2 } from "react";
269
+ import { useInjector as useInjector3 } from "@coze-editor/react";
270
+ function useInjectorEffect(handler, deps = []) {
271
+ const injector = useInjector3();
272
+ useLayoutEffect2(() => handler(injector), [injector, ...deps]);
273
+ }
274
+
275
+ // src/hooks/use-html-element.ts
276
+ import { useState as useState3 } from "react";
277
+ function useHTMLElement(defaultTagName = "div") {
278
+ const [element] = useState3(() => document.createElement(defaultTagName));
279
+ return element;
280
+ }
281
+
282
+ // src/hooks/use-compartment.ts
283
+ import { useState as useState4 } from "react";
284
+ import { Compartment } from "@codemirror/state";
285
+ function useCompartment() {
286
+ const [compartment] = useState4(() => new Compartment());
287
+ return compartment;
288
+ }
289
+
290
+ // src/hooks/use-latest.ts
291
+ import { useRef as useRef4 } from "react";
292
+ function useLatest(value) {
293
+ const ref = useRef4(value);
294
+ ref.current = value;
295
+ return ref;
296
+ }
297
+
298
+ // src/hooks/use-change-listener.tsx
299
+ import { EditorView as EditorView2 } from "@codemirror/view";
300
+ function useChangeListener(listener) {
301
+ const listenerRef = useLatest(listener);
302
+ useInjectorEffect(
303
+ (injector) => injector.inject([
304
+ EditorView2.updateListener.of((update) => {
305
+ if (update.docChanged && typeof listenerRef.current === "function") {
306
+ update.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {
307
+ listenerRef.current({
308
+ change: [fromA, toA, fromB, toB, inserted],
309
+ view: update.view
310
+ });
311
+ });
312
+ }
313
+ })
314
+ ]),
315
+ []
316
+ );
317
+ }
318
+
319
+ // src/hooks/use-document-selector.ts
320
+ import { useState as useState5 } from "react";
321
+ import { Facet as Facet2, StateField as StateField3 } from "@codemirror/state";
322
+ var field = StateField3.define({
323
+ create(state) {
324
+ return state.doc;
325
+ },
326
+ update(value, tr) {
327
+ if (tr.docChanged) {
328
+ value = tr.state.doc;
329
+ }
330
+ return value;
331
+ }
332
+ });
333
+ var facet2 = Facet2.define();
334
+ function useDocumentSelector(selector, defaultValue) {
335
+ const [state, setState] = useState5(defaultValue);
336
+ const stateRef = useLatest(state);
337
+ const setStateRef = useLatest(setState);
338
+ const selectorRef = useLatest(selector);
339
+ useInjectorEffect(
340
+ (injector) => injector.inject([
341
+ field,
342
+ facet2.compute([field], (state2) => {
343
+ const derived = selectorRef.current(state2.field(field));
344
+ if (stateRef.current !== derived) {
345
+ setStateRef.current(derived);
346
+ }
347
+ })
348
+ ]),
349
+ []
350
+ );
351
+ return state;
352
+ }
353
+
354
+ // src/hooks/use-document-listener.ts
355
+ import { Facet as Facet3, StateField as StateField4 } from "@codemirror/state";
356
+ var field2 = StateField4.define({
357
+ create(state) {
358
+ return state.doc;
359
+ },
360
+ update(value, tr) {
361
+ if (tr.docChanged) {
362
+ value = tr.state.doc;
363
+ }
364
+ return value;
365
+ }
366
+ });
367
+ var facet3 = Facet3.define();
368
+ function useDocumentListener(listener) {
369
+ const listenerRef = useLatest(listener);
370
+ useInjectorEffect(
371
+ (injector) => injector.inject([
372
+ field2,
373
+ facet3.compute([field2], (state) => {
374
+ listenerRef.current(state.field(field2));
375
+ })
376
+ ]),
377
+ []
378
+ );
379
+ }
380
+
381
+ // src/hooks/use-portal-connector.tsx
382
+ import { flushSync } from "react-dom";
383
+ import React, { useState as useState6, useCallback } from "react";
384
+ function flush(fn, options) {
385
+ if (options.sync) {
386
+ queueMicrotask(() => {
387
+ flushSync(fn);
388
+ });
389
+ } else {
390
+ fn();
391
+ }
392
+ }
393
+ function createPortalConnector(options) {
394
+ let add = (id, portal) => {
395
+ };
396
+ let remove = (id) => {
397
+ };
398
+ function connect(id, portal) {
399
+ add(id, portal);
400
+ }
401
+ function disconnect(id) {
402
+ remove(id);
403
+ }
404
+ function Portal() {
405
+ const [items, setItems] = useState6([]);
406
+ const addItem = useCallback((id, portal) => {
407
+ flush(
408
+ () => {
409
+ setItems((prevItems) => {
410
+ const nextItems = [...prevItems];
411
+ const index = nextItems.findIndex((item) => item.id === id);
412
+ if (index > -1) {
413
+ nextItems[index] = { id, portal };
414
+ } else {
415
+ nextItems.push({ id, portal });
416
+ }
417
+ return nextItems;
418
+ });
419
+ },
420
+ { sync: (options == null ? void 0 : options.sync) ?? false }
421
+ );
422
+ }, []);
423
+ const removeItem = useCallback((id) => {
424
+ flush(
425
+ () => {
426
+ setItems((oldItems) => oldItems.filter((item) => item.id !== id));
427
+ },
428
+ { sync: (options == null ? void 0 : options.sync) ?? false }
429
+ );
430
+ }, []);
431
+ add = addItem;
432
+ remove = removeItem;
433
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, items.map((item) => item.portal));
434
+ }
435
+ return {
436
+ connect,
437
+ disconnect,
438
+ Portal
439
+ };
440
+ }
441
+ function usePortalConnector(options) {
442
+ const [connector] = useState6(() => createPortalConnector(options));
443
+ return connector;
444
+ }
445
+
446
+ // src/hooks/use-editor-event.ts
447
+ import { useEffect as useEffect3 } from "react";
448
+ function useEditorEvent(editor, eventName, handler) {
449
+ useEffect3(() => {
450
+ if (!editor) {
451
+ return;
452
+ }
453
+ editor.$on(eventName, handler);
454
+ return () => {
455
+ editor.$off(eventName, handler);
456
+ };
457
+ }, [editor, eventName, handler]);
458
+ }
459
+
460
+ // src/hooks/use-history-state.ts
461
+ import { useState as useState7 } from "react";
462
+ import { Facet as Facet4 } from "@codemirror/state";
463
+ import { historyField, redoDepth, undoDepth } from "@codemirror/commands";
464
+ var facet4 = Facet4.define();
465
+ function useHistoryState() {
466
+ const [canUndo, setCanUndo] = useState7(false);
467
+ const [canRedo, setCanRedo] = useState7(false);
468
+ const setCanUndoRef = useLatest(setCanUndo);
469
+ const setCanRedoRef = useLatest(setCanRedo);
470
+ useInjectorEffect(
471
+ (injector) => injector.inject([
472
+ facet4.compute([historyField], (state) => {
473
+ setCanUndoRef.current(() => undoDepth(state) > 0);
474
+ setCanRedoRef.current(() => redoDepth(state) > 0);
475
+ })
476
+ ])
477
+ );
478
+ return {
479
+ canUndo,
480
+ canRedo
481
+ };
482
+ }
483
+
484
+ // src/hooks/use-mouse-selection-popup.ts
485
+ import { useEffect as useEffect4, useState as useState8 } from "react";
486
+ import { useEditor as useEditor3 } from "@coze-editor/react";
487
+ function useMouseSelectionPopup() {
488
+ const editor = useEditor3();
489
+ const [visible, setVisible] = useState8(false);
490
+ const [selection, setSelection] = useState8(null);
491
+ useEffect4(() => {
492
+ if (!editor) {
493
+ return;
494
+ }
495
+ function handleMousedown() {
496
+ setVisible(false);
497
+ }
498
+ function handleMouseup() {
499
+ setTimeout(() => {
500
+ const cmSelection = editor.$view.state.selection.main;
501
+ if (!cmSelection) {
502
+ setVisible(false);
503
+ return;
504
+ }
505
+ const isRange = cmSelection.from !== cmSelection.to;
506
+ if (!isRange) {
507
+ setVisible(false);
508
+ return;
509
+ }
510
+ setSelection({
511
+ from: cmSelection.from,
512
+ to: cmSelection.to,
513
+ anchor: cmSelection.anchor,
514
+ head: cmSelection.head
515
+ });
516
+ setTimeout(() => {
517
+ setVisible(true);
518
+ }, 50);
519
+ }, 50);
520
+ }
521
+ function handleSelectionChange() {
522
+ setVisible(false);
523
+ }
524
+ function handleBlur() {
525
+ setVisible(false);
526
+ }
527
+ editor.$on("mousedown", handleMousedown);
528
+ editor.$on("mouseup", handleMouseup);
529
+ editor.$on("selectionChange", handleSelectionChange);
530
+ editor.$on("blur", handleBlur);
531
+ return () => {
532
+ editor.$off("mousedown", handleMousedown);
533
+ editor.$off("mouseup", handleMouseup);
534
+ editor.$off("selectionChange", handleSelectionChange);
535
+ editor.$off("blur", handleBlur);
536
+ };
537
+ }, [editor]);
538
+ const anchor = (selection == null ? void 0 : selection.anchor) ?? -1;
539
+ const head = (selection == null ? void 0 : selection.head) ?? -1;
540
+ const from = (selection == null ? void 0 : selection.from) ?? -1;
541
+ const to = (selection == null ? void 0 : selection.to) ?? -1;
542
+ return {
543
+ anchor,
544
+ head,
545
+ from,
546
+ to,
547
+ visible
548
+ };
549
+ }
550
+ export {
551
+ createPortalConnector,
552
+ useChangeListener,
553
+ useCompartment,
554
+ useDocumentListener,
555
+ useDocumentSelector,
556
+ useEditorEvent,
557
+ useFocused,
558
+ useHTMLElement,
559
+ useHistoryState,
560
+ useInjectorEffect,
561
+ useLatest,
562
+ useMouseSelectionPopup,
563
+ usePortalConnector,
564
+ useRangesManager,
565
+ useStateField
566
+ };
567
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/use-state-field.ts","../../src/hooks/use-ranges-manager.ts","../../src/hooks/use-focused.ts","../../src/hooks/use-injector-effect.ts","../../src/hooks/use-html-element.ts","../../src/hooks/use-compartment.ts","../../src/hooks/use-latest.ts","../../src/hooks/use-change-listener.tsx","../../src/hooks/use-document-selector.ts","../../src/hooks/use-document-listener.ts","../../src/hooks/use-portal-connector.tsx","../../src/hooks/use-editor-event.ts","../../src/hooks/use-history-state.ts","../../src/hooks/use-mouse-selection-popup.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { useEffect, useRef, useState } from 'react';\n\nimport { type BuiltinEditorAPI, useEditor } from '@coze-editor/react';\nimport {\n type EditorState,\n StateEffect,\n StateField,\n type Transaction,\n} from '@codemirror/state';\n\nfunction useStateField<T = unknown>(\n create: (state: EditorState) => T,\n update?: (value: T, tr: Transaction) => T,\n) {\n const editor = useEditor<BuiltinEditorAPI>();\n\n const [effect] = useState(() => StateEffect.define<T>());\n\n const updateRef = useRef<((value: T, tr: Transaction) => T) | undefined>();\n updateRef.current = update;\n\n const [field] = useState<StateField<T>>(() =>\n StateField.define({\n create(state) {\n return create(state);\n },\n update(value, tr) {\n if (typeof updateRef.current === 'function') {\n value = updateRef.current(value, tr);\n }\n\n for (const trEffect of tr.effects) {\n if (trEffect.is(effect)) {\n return trEffect.value;\n }\n }\n\n return value;\n },\n }),\n );\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n editor.$view.dispatch({\n effects: effect.of(create(editor.$view.state)),\n });\n }, [editor, effect, create]);\n\n return field;\n}\n\nexport { useStateField };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { useEffect, useRef } from 'react';\n\nimport {\n type BuiltinEditorAPI,\n useEditor,\n useInjector,\n} from '@coze-editor/react';\nimport { Decoration, type EditorView } from '@codemirror/view';\nimport {\n Facet,\n RangeSet,\n RangeSetBuilder,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport { invertedEffects } from '@codemirror/commands';\n\ninterface IDValueSpec {\n /// Whether the mark covers its start and end position or not. This\n /// influences whether content inserted at those positions becomes\n /// part of the mark. Defaults to false.\n inclusive?: boolean;\n /// Specify whether the start position of the marked range should be\n /// inclusive. Overrides `inclusive`, when both are present.\n inclusiveStart?: boolean;\n /// Whether the end should be inclusive.\n inclusiveEnd?: boolean;\n id?: string;\n [other: string]: any;\n}\n\nconst enum Side {\n NonIncEnd = -6e8, // (end of non-inclusive range)\n GapStart = -5e8,\n BlockBefore = -4e8, // + widget side option (block widget before)\n BlockIncStart = -3e8, // (start of inclusive block range)\n Line = -2e8, // (line widget)\n InlineBefore = -1e8, // + widget side (inline widget before)\n InlineIncStart = -1, // (start of inclusive inline range)\n InlineIncEnd = 1, // (end of inclusive inline range)\n InlineAfter = 1e8, // + widget side (inline widget after)\n BlockIncEnd = 2e8, // (end of inclusive block range)\n BlockAfter = 3e8, // + widget side (block widget after)\n GapEnd = 4e8,\n NonIncStart = 5e8, // (start of non-inclusive range)\n}\n\nclass IDValue extends Decoration {\n public id: string;\n\n constructor(spec: IDValueSpec) {\n const { start, end } = getInclusive(spec);\n\n super(\n start ? Side.InlineIncStart : Side.NonIncStart,\n end ? Side.InlineIncEnd : Side.NonIncEnd,\n null,\n spec,\n );\n\n this.id = spec.id ?? '';\n }\n\n eq(other: Decoration): boolean {\n return this.id === (other as IDValue).id;\n }\n}\n\nfunction getInclusive(\n spec: {\n inclusive?: boolean;\n inclusiveStart?: boolean;\n inclusiveEnd?: boolean;\n },\n block = false,\n): { start: boolean; end: boolean } {\n let { inclusiveStart: start, inclusiveEnd: end } = spec;\n if (start == null) {\n start = spec.inclusive;\n }\n if (end == null) {\n end = spec.inclusive;\n }\n return { start: start ?? block, end: end ?? block };\n}\n\nconst addEffect = StateEffect.define<IDRangeSpec[]>({\n map: (specs, change) =>\n specs.map(({ from, to, ...rest }) => ({\n from: change.mapPos(from),\n to: change.mapPos(to),\n ...rest,\n })),\n});\nconst removeEffect = StateEffect.define<string[]>();\nconst recoverEffect = StateEffect.define<IDRangeSpec[]>();\n\nconst facet = Facet.define();\n\ninterface IDRangeSpec {\n from: number;\n to: number;\n id: string;\n}\n\nfunction toRangeSet(specs: IDRangeSpec[]) {\n specs.sort((a, b) => a.from - b.from);\n\n const builder = new RangeSetBuilder<Decoration>();\n for (const spec of specs) {\n builder.add(\n spec.from,\n spec.to,\n new IDValue({\n id: spec.id,\n }),\n );\n }\n return builder.finish();\n}\n\nfunction toSpecs(ranges: RangeSet<IDValue>): IDRangeSpec[] {\n const specs: IDRangeSpec[] = [];\n const cursor = ranges.iter();\n\n while (cursor.value) {\n specs.push({\n from: cursor.from,\n to: cursor.to,\n id: cursor.value.id,\n });\n cursor.next();\n }\n\n return specs;\n}\n\ntype Watcher = (specs: IDRangeSpec[]) => void;\n\nfunction useRangesManager() {\n const injector = useInjector();\n const editor = useEditor<BuiltinEditorAPI>();\n\n const watchersRef = useRef<Watcher[]>([]);\n\n const viewRef = useRef<EditorView | null>(null);\n viewRef.current = editor?.$view;\n const rangesStashRef = useRef<IDRangeSpec[]>([]);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const field = StateField.define<RangeSet<IDValue>>({\n create() {\n if (rangesStashRef.current) {\n return toRangeSet(rangesStashRef.current);\n }\n return RangeSet.empty;\n },\n update(set, tr) {\n set = set.map(tr.changes);\n\n for (const effect of tr.effects) {\n if (effect.is(addEffect)) {\n const specs = effect.value ?? [];\n set = set.update({\n add: specs.map(spec =>\n new IDValue({ id: spec.id }).range(spec.from, spec.to),\n ),\n });\n }\n\n if (effect.is(removeEffect)) {\n const ids = effect.value;\n set = set.update({\n filter(from, to, value) {\n return !ids.includes(value.id);\n },\n });\n }\n\n if (effect.is(recoverEffect)) {\n const specs = effect.value ?? [];\n const ids = specs.map(spec => spec.id);\n set = set.update({\n filter(from, to, value) {\n return !ids.includes(value.id);\n },\n });\n set = set.update({\n add: specs.map(spec =>\n new IDValue({ id: spec.id }).range(spec.from, spec.to),\n ),\n });\n }\n }\n\n return set;\n },\n });\n\n const invertable = invertedEffects.of(tr => {\n const effects: StateEffect<unknown>[] = [];\n\n const ranges = tr.startState.field(field);\n // const length = tr.startState.doc.length\n\n // make effect undoable(save effects of this tr in undo/redo stack)\n // for (const effect of tr.effects) {\n // if (effect.is(addEffect)) {\n // const specs = effect.value ?? []\n // effects.push(\n // removeEffect.of(\n // specs.map(spec => spec.id)\n // )\n // )\n // }\n\n // if (effect.is(removeEffect)) {\n // const ids = effect.value\n // const specs = []\n // ranges.between(0, length, (from, to, value) => {\n // if (ids.includes(value.id)) {\n // specs.push({\n // from,\n // to,\n // id: value.id\n // })\n // }\n // })\n\n // effects.push(\n // addEffect.of(\n // specs\n // )\n // )\n // }\n // }\n\n tr.changes.iterChangedRanges((from, to) => {\n ranges.between(from, to, (rangeFrom, rangeTo, value) => {\n const f = Math.max(from, rangeFrom);\n const t = Math.min(to, rangeTo);\n\n // has overlapped parts\n if (f < t) {\n effects.push(\n recoverEffect.of([\n { from: rangeFrom, to: rangeTo, id: value.id },\n ]),\n );\n }\n });\n });\n\n return effects;\n });\n\n let isFirstTime = true;\n\n return injector.inject([\n field,\n invertable,\n facet.compute([field], state => {\n if (isFirstTime) {\n isFirstTime = false;\n return;\n }\n\n const set = state.field(field);\n if (\n Array.isArray(watchersRef.current) &&\n watchersRef.current.length > 0\n ) {\n const specs = toSpecs(set);\n for (const watcher of watchersRef.current) {\n watcher(specs);\n }\n }\n }),\n ]);\n }, [editor]);\n\n return {\n add(specs: IDRangeSpec[]) {\n if (!viewRef.current) {\n rangesStashRef.current.push(...specs);\n return;\n }\n\n viewRef.current.dispatch({\n effects: addEffect.of(specs),\n });\n },\n remove(ids: string[]) {\n if (!viewRef.current) {\n rangesStashRef.current = rangesStashRef.current.filter(\n item => !ids.includes(item.id),\n );\n return;\n }\n\n viewRef.current.dispatch({\n effects: removeEffect.of(ids),\n });\n },\n watch(watcher: Watcher) {\n watchersRef.current.push(watcher);\n return () => {\n watchersRef.current = watchersRef.current.filter(w => w !== watcher);\n };\n },\n };\n}\n\nexport { useRangesManager };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { useLayoutEffect, useRef, useState } from 'react';\n\nimport { useInjector, InjectPosition } from '@coze-editor/react';\nimport { EditorView } from '@codemirror/view';\n\nfunction useFocused() {\n const injector = useInjector();\n const [focused, setFocused] = useState(false);\n\n const focusedRef = useRef(focused);\n\n useLayoutEffect(\n () =>\n injector.inject(\n [\n EditorView.updateListener.of(update => {\n if (focusedRef.current !== update.view.hasFocus) {\n setFocused(update.view.hasFocus);\n focusedRef.current = update.view.hasFocus;\n }\n }),\n ],\n InjectPosition.Tail,\n ),\n [injector, setFocused],\n );\n\n return focused;\n}\n\nexport { useFocused };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { useLayoutEffect } from 'react';\n\nimport { type Injector, useInjector } from '@coze-editor/react';\n\ntype InjectorHandler = (\n injector: Injector,\n) => ReturnType<typeof injector.inject> | undefined;\n\nfunction useInjectorEffect(handler: InjectorHandler, deps: any[] = []) {\n const injector = useInjector();\n\n useLayoutEffect(() => handler(injector), [injector, ...deps]);\n}\n\nexport { useInjectorEffect };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { useState } from 'react';\n\nfunction useHTMLElement(defaultTagName = 'div') {\n const [element] = useState(() => document.createElement(defaultTagName));\n\n return element;\n}\n\nexport { useHTMLElement };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { useState } from 'react';\n\nimport { Compartment } from '@codemirror/state';\n\nfunction useCompartment() {\n const [compartment] = useState(() => new Compartment());\n return compartment;\n}\n\nexport { useCompartment };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { useRef } from 'react';\n\nfunction useLatest<T>(value: T) {\n const ref = useRef<T>(value);\n ref.current = value;\n return ref;\n}\n\nexport { useLatest };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView } from '@codemirror/view';\nimport { type Text } from '@codemirror/state';\n\nimport { useInjectorEffect, useLatest } from '../hooks';\n\ntype ChangeListener = (event: {\n change: [number, number, number, number, Text];\n view: EditorView;\n}) => void;\n\nfunction useChangeListener(listener: ChangeListener) {\n const listenerRef = useLatest(listener);\n\n useInjectorEffect(\n injector =>\n injector.inject([\n EditorView.updateListener.of(update => {\n if (update.docChanged && typeof listenerRef.current === 'function') {\n update.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {\n listenerRef.current({\n change: [fromA, toA, fromB, toB, inserted],\n view: update.view,\n });\n });\n }\n }),\n ]),\n [],\n );\n}\n\nexport { useChangeListener };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { useState } from 'react';\n\nimport { Facet, StateField, type Text } from '@codemirror/state';\n\nimport { useLatest } from './use-latest';\nimport { useInjectorEffect } from './use-injector-effect';\n\nconst field = StateField.define({\n create(state) {\n return state.doc;\n },\n update(value, tr) {\n if (tr.docChanged) {\n value = tr.state.doc;\n }\n\n return value;\n },\n});\n\nconst facet = Facet.define();\n\ntype DocumentSelector<T> = (doc: Text) => T;\n\nfunction useDocumentSelector<T>(\n selector: DocumentSelector<T>,\n defaultValue: T,\n): T {\n const [state, setState] = useState<T>(defaultValue);\n const stateRef = useLatest(state);\n const setStateRef = useLatest(setState);\n const selectorRef = useLatest(selector);\n\n useInjectorEffect(\n injector =>\n injector.inject([\n field,\n facet.compute([field], state => {\n const derived = selectorRef.current(state.field(field));\n if (stateRef.current !== derived) {\n setStateRef.current(derived);\n }\n }),\n ]),\n [],\n );\n\n return state;\n}\n\nexport { useDocumentSelector };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Facet, StateField, type Text } from '@codemirror/state';\n\nimport { useLatest } from './use-latest';\nimport { useInjectorEffect } from './use-injector-effect';\n\nconst field = StateField.define({\n create(state) {\n return state.doc;\n },\n update(value, tr) {\n if (tr.docChanged) {\n value = tr.state.doc;\n }\n\n return value;\n },\n});\n\nconst facet = Facet.define();\n\ntype DocumentListener = (doc: Text) => void;\n\nfunction useDocumentListener(listener: DocumentListener): void {\n const listenerRef = useLatest(listener);\n\n useInjectorEffect(\n injector =>\n injector.inject([\n field,\n facet.compute([field], state => {\n listenerRef.current(state.field(field));\n }),\n ]),\n [],\n );\n}\n\nexport { useDocumentListener };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { flushSync } from 'react-dom';\nimport React, { useState, useCallback } from 'react';\nimport type { ReactPortal } from 'react';\n\ninterface PortalItem {\n id: string;\n portal: ReactPortal;\n}\n\nfunction flush(fn: () => void, options: { sync: boolean }) {\n if (options.sync) {\n queueMicrotask(() => {\n flushSync(fn);\n });\n } else {\n fn();\n }\n}\n\nfunction createPortalConnector(options?: { sync?: boolean }) {\n let add = (id: string, portal: ReactPortal) => {};\n\n let remove = (id: string) => {};\n\n function connect(id: string, portal: ReactPortal) {\n add(id, portal);\n }\n\n function disconnect(id: string) {\n remove(id);\n }\n\n function Portal() {\n const [items, setItems] = useState<PortalItem[]>([]);\n\n const addItem = useCallback((id: string, portal: ReactPortal) => {\n flush(\n () => {\n setItems(prevItems => {\n const nextItems = [...prevItems];\n const index = nextItems.findIndex(item => item.id === id);\n if (index > -1) {\n nextItems[index] = { id, portal };\n } else {\n nextItems.push({ id, portal });\n }\n return nextItems;\n });\n },\n { sync: options?.sync ?? false },\n );\n }, []);\n\n const removeItem = useCallback((id: string) => {\n flush(\n () => {\n setItems(oldItems => oldItems.filter(item => item.id !== id));\n },\n { sync: options?.sync ?? false },\n );\n }, []);\n\n add = addItem;\n remove = removeItem;\n\n return <>{items.map(item => item.portal)}</>;\n }\n\n return {\n connect,\n disconnect,\n Portal,\n };\n}\n\nfunction usePortalConnector(options?: { sync?: boolean }) {\n const [connector] = useState(() => createPortalConnector(options));\n return connector;\n}\n\nexport { createPortalConnector, usePortalConnector };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n// WHY use-editor-event: avoid conflicts with React hook: useEvent\n\nimport { useEffect } from 'react';\n\ninterface EditorAPILike {\n __private_eventmap: Record<string, any>;\n}\n\nfunction useEditorEvent<\n T extends EditorAPILike,\n K extends keyof T['__private_eventmap'],\n>(editor: T, eventName: K, handler: T['__private_eventmap'][K]): void {\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n (editor as any).$on(eventName, handler);\n\n return () => {\n (editor as any).$off(eventName, handler);\n };\n }, [editor, eventName, handler]);\n}\n\nexport { useEditorEvent };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { useState } from 'react';\n\nimport { Facet } from '@codemirror/state';\nimport { historyField, redoDepth, undoDepth } from '@codemirror/commands';\n\nimport { useLatest } from './use-latest';\nimport { useInjectorEffect } from './use-injector-effect';\n\nconst facet = Facet.define();\n\nfunction useHistoryState() {\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n\n const setCanUndoRef = useLatest(setCanUndo);\n const setCanRedoRef = useLatest(setCanRedo);\n\n useInjectorEffect(injector =>\n injector.inject([\n facet.compute([historyField], state => {\n setCanUndoRef.current(() => undoDepth(state) > 0);\n\n setCanRedoRef.current(() => redoDepth(state) > 0);\n }),\n ]),\n );\n\n return {\n canUndo,\n canRedo,\n };\n}\n\nexport { useHistoryState };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { useEffect, useState } from 'react';\n\nimport { type BuiltinEditorAPI, useEditor } from '@coze-editor/react';\n\nfunction useMouseSelectionPopup() {\n const editor = useEditor<BuiltinEditorAPI>();\n const [visible, setVisible] = useState(false);\n const [selection, setSelection] = useState<{\n from: number;\n to: number;\n anchor: number;\n head: number;\n } | null>(null);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n function handleMousedown() {\n setVisible(false);\n }\n\n function handleMouseup() {\n // mouseup 触发时机过早,此时 getSelection 获取到的信息还是上一次的 selection\n setTimeout(() => {\n const cmSelection = editor.$view.state.selection.main;\n\n if (!cmSelection) {\n setVisible(false);\n return;\n }\n\n const isRange = cmSelection.from !== cmSelection.to;\n\n if (!isRange) {\n setVisible(false);\n return;\n }\n\n setSelection({\n from: cmSelection.from,\n to: cmSelection.to,\n anchor: cmSelection.anchor,\n head: cmSelection.head,\n });\n\n // make showing up smooth\n setTimeout(() => {\n setVisible(true);\n }, 50);\n }, 50);\n }\n\n // 发生内容变更时,隐藏 popover\n function handleSelectionChange() {\n setVisible(false);\n }\n\n // 失焦时,隐藏 popover\n function handleBlur() {\n setVisible(false);\n }\n\n editor.$on('mousedown', handleMousedown);\n editor.$on('mouseup', handleMouseup);\n editor.$on('selectionChange', handleSelectionChange);\n editor.$on('blur', handleBlur);\n\n return () => {\n editor.$off('mousedown', handleMousedown);\n editor.$off('mouseup', handleMouseup);\n editor.$off('selectionChange', handleSelectionChange);\n editor.$off('blur', handleBlur);\n };\n }, [editor]);\n\n const anchor = selection?.anchor ?? -1;\n const head = selection?.head ?? -1;\n const from = selection?.from ?? -1;\n const to = selection?.to ?? -1;\n\n return {\n anchor,\n head,\n from,\n to,\n visible,\n };\n}\n\nexport { useMouseSelectionPopup };\n"],"mappings":"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","names":["field","useEffect","useRef","useEditor","StateEffect","StateField","StateEffect","useEditor","useRef","useEffect","field","StateField","useRef","useState","useInjector","useLayoutEffect","useInjector","useState","useState","useRef","EditorView","EditorView","useState","Facet","StateField","StateField","facet","Facet","useState","state","Facet","StateField","field","StateField","facet","Facet","useState","useEffect","useState","Facet","facet","Facet","useState","useEffect","useState","useEditor"]}