@coze-editor/core-plugins 0.1.0-alpha.1e5e87 → 0.1.0-alpha.241d91

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/dist/esm/index.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  } from "@codemirror/state";
10
10
  import { undo as cmUndo, redo as cmRedo } from "@codemirror/commands";
11
11
  var getValue = ({ view }) => () => view.state.sliceDoc();
12
- var setValue = ({ view }) => (value) => {
12
+ var setValue = ({ view }) => (value2) => {
13
13
  const { state } = view;
14
14
  if (state.readOnly) {
15
15
  return;
@@ -19,7 +19,7 @@ var setValue = ({ view }) => (value) => {
19
19
  changes: {
20
20
  from: 0,
21
21
  to: state.doc.length,
22
- insert: value ?? ""
22
+ insert: value2 ?? ""
23
23
  }
24
24
  })
25
25
  );
@@ -143,7 +143,7 @@ var getMainSelectionRects = ({ view }) => () => {
143
143
  (marker) => pick(marker, ["top", "left", "width", "height"])
144
144
  );
145
145
  };
146
- var isNumber = (value) => typeof value === "number";
146
+ var isNumber = (value2) => typeof value2 === "number";
147
147
  var insertText = ({
148
148
  view,
149
149
  text = "",
@@ -220,65 +220,93 @@ var transformTextInSelection = ({ view }) => (transformer) => {
220
220
  };
221
221
 
222
222
  // src/option.ts
223
+ import { FacetCombineStrategy } from "@coze-editor/utils";
223
224
  import { placeholder as cmPlaceholder } from "@coze-editor/extension-placeholder";
224
- import { EditorView, lineNumbers as cmLineNumbers } from "@codemirror/view";
225
- import { EditorState, Prec as Prec2 } from "@codemirror/state";
226
- var fontSize = (value) => {
227
- if (typeof value === "undefined") {
225
+ import {
226
+ EditorView,
227
+ ViewPlugin,
228
+ lineNumbers as cmLineNumbers
229
+ } from "@codemirror/view";
230
+ import { EditorState, Facet, Prec as Prec2 } from "@codemirror/state";
231
+ var fontSize = (value2) => {
232
+ if (typeof value2 === "undefined") {
228
233
  return [];
229
234
  }
230
235
  return EditorView.theme({
231
236
  "&": {
232
- fontSize: typeof value === "number" ? `${value}px` : "inherit"
237
+ fontSize: typeof value2 === "number" ? `${value2}px` : "inherit"
233
238
  }
234
239
  });
235
240
  };
236
- var placeholder = (value) => cmPlaceholder(value ?? "");
237
- var readOnly = (value) => EditorState.readOnly.of(value ?? false);
238
- var editable = (value) => EditorView.editable.of(value ?? true);
239
- var minHeight = (value) => {
240
- if (typeof value === "undefined") {
241
+ var placeholder = (value2) => cmPlaceholder(value2 ?? "");
242
+ var readOnly = (value2) => EditorState.readOnly.of(value2 ?? false);
243
+ var editable = (value2) => EditorView.editable.of(value2 ?? true);
244
+ var minHeight = (value2) => {
245
+ if (typeof value2 === "undefined") {
241
246
  return [];
242
247
  }
243
248
  return EditorView.theme({
244
249
  ".cm-content, .cm-gutter, .cm-right-gutter": {
245
- minHeight: typeof value === "number" ? `${value}px` : typeof value === "string" ? value : "unset"
250
+ minHeight: typeof value2 === "number" ? `${value2}px` : typeof value2 === "string" ? value2 : "unset"
246
251
  }
247
252
  });
248
253
  };
249
- var maxHeight = (value) => {
250
- if (typeof value === "undefined") {
254
+ var maxHeight = (value2) => {
255
+ if (typeof value2 === "undefined") {
251
256
  return [];
252
257
  }
253
258
  return EditorView.theme({
254
259
  ".cm-scroller": {
255
- maxHeight: typeof value === "number" ? `${value}px` : typeof value === "string" ? value : "unset"
260
+ maxHeight: typeof value2 === "number" ? `${value2}px` : typeof value2 === "string" ? value2 : "unset"
256
261
  }
257
262
  });
258
263
  };
259
- var height = (value) => typeof value === "string" || typeof value === "number" ? [
264
+ var height = (value2) => typeof value2 === "string" || typeof value2 === "number" ? [
260
265
  // give it higher prec to override styles from minHeight option
261
266
  Prec2.high(
262
267
  EditorView.theme({
263
268
  ".cm-content, .cm-gutter, .cm-right-gutter": {
264
- minHeight: typeof value === "number" ? `${value}px` : value
269
+ minHeight: typeof value2 === "number" ? `${value2}px` : value2
265
270
  }
266
271
  })
267
272
  ),
268
273
  EditorView.theme({
269
274
  ".cm-scroller": {
270
- height: typeof value === "number" ? `${value}px` : value
275
+ height: typeof value2 === "number" ? `${value2}px` : value2
271
276
  }
272
277
  })
273
278
  ] : [];
274
- var tabSize = (value) => EditorState.tabSize.of(value ?? 2);
279
+ var tabSize = (value2) => EditorState.tabSize.of(value2 ?? 2);
275
280
  var contentAttributes = (attributes) => EditorView.contentAttributes.of(attributes ?? {});
276
281
  var lineNumbers = (enable) => enable === true ? cmLineNumbers() : [];
277
282
  var lineWrapping = (enable) => enable ? EditorView.lineWrapping : [];
283
+ var valueFacet = Facet.define({
284
+ combine: FacetCombineStrategy.Last
285
+ });
286
+ var valueExtension = ViewPlugin.fromClass(
287
+ class {
288
+ update(update) {
289
+ const currentValue = update.state.doc.toString();
290
+ const newValue = update.state.facet(valueFacet);
291
+ if (typeof newValue === "string" && newValue && newValue !== currentValue) {
292
+ queueMicrotask(() => {
293
+ update.view.dispatch({
294
+ changes: {
295
+ from: 0,
296
+ to: currentValue.length,
297
+ insert: newValue
298
+ }
299
+ });
300
+ });
301
+ }
302
+ }
303
+ }
304
+ );
305
+ var value = (v) => valueFacet.of(v);
278
306
 
279
307
  // src/event.ts
280
308
  import { EVENT_SILENT } from "@coze-editor/core";
281
- import { ViewPlugin } from "@codemirror/view";
309
+ import { ViewPlugin as ViewPlugin2 } from "@codemirror/view";
282
310
  import { StateEffect as StateEffect2 } from "@codemirror/state";
283
311
  var eventChange = (update) => {
284
312
  if (update.docChanged) {
@@ -289,7 +317,7 @@ var eventChange = (update) => {
289
317
  return EVENT_SILENT;
290
318
  };
291
319
  var focusStateEffect = StateEffect2.define();
292
- var focusChangeNotifier = ViewPlugin.fromClass(
320
+ var focusChangeNotifier = ViewPlugin2.fromClass(
293
321
  class {
294
322
  hasFocus;
295
323
  constructor(view) {
@@ -392,6 +420,8 @@ export {
392
420
  setValue,
393
421
  tabSize,
394
422
  transformTextInSelection,
395
- undo
423
+ undo,
424
+ value,
425
+ valueExtension
396
426
  };
397
427
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api.ts","../../src/option.ts","../../src/event.ts","../../src/extension.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { pick } from 'es-toolkit';\nimport { RectangleMarker, keymap, type EditorView } from '@codemirror/view';\nimport {\n EditorSelection,\n type Line,\n Prec,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport { undo as cmUndo, redo as cmRedo } from '@codemirror/commands';\n\ninterface Context {\n view: EditorView;\n}\n\nexport const getValue =\n ({ view }: Context) =>\n () =>\n view.state.sliceDoc();\n\nexport const setValue =\n ({ view }: Context) =>\n (value: string) => {\n const { state } = view;\n if (state.readOnly) {\n return;\n }\n view.dispatch(\n state.update({\n changes: {\n from: 0,\n to: state.doc.length,\n insert: value ?? '',\n },\n }),\n );\n };\n\nexport const focus =\n ({ view }: Context) =>\n () => {\n view.focus();\n };\n\nexport const blur =\n ({ view }: Context) =>\n () => {\n view.contentDOM.blur();\n };\n\nexport const setCursorPosition =\n ({ view }: Context) =>\n (pos: number): void => {\n view.dispatch({\n selection: {\n head: pos,\n anchor: pos,\n },\n });\n };\n\nexport const getCursorPosition =\n ({ view }: Context) =>\n (): number =>\n view.state.selection.main.head;\n\n// Make sure the given regexp has a $ at its end and, if `start` is\n// true, a ^ at its start.\nfunction ensureAnchor(expr: RegExp, start: boolean) {\n const { source } = expr;\n const addStart = start && source[0] !== '^',\n addEnd = source[source.length - 1] !== '$';\n if (!addStart && !addEnd) {\n return expr;\n }\n return new RegExp(\n `${addStart ? '^' : ''}(?:${source})${addEnd ? '$' : ''}`,\n expr.flags ?? (expr.ignoreCase ? 'i' : ''),\n );\n}\n\nexport const matchBefore =\n ({ view }: Context) =>\n (match: RegExp): { from: number; to: number; text: string } | null => {\n const pos = view.state.selection.main.head;\n const line = view.state.doc.lineAt(pos);\n const start = Math.max(line.from, pos - 250);\n const str = line.text.slice(start - line.from, pos - line.from);\n\n if (match instanceof RegExp) {\n const found = str.search(ensureAnchor(match, false));\n return found < 0\n ? null\n : { from: start + found, to: pos, text: str.slice(found) };\n }\n\n return null;\n };\n\nexport const getView =\n ({ view }: Context) =>\n () =>\n view;\n\nexport interface ReplaceTextByRangeOptions {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n userEvent?: string;\n}\n\nexport const replaceTextByRange =\n ({ view }: Context) =>\n ({\n from,\n to,\n text,\n cursorOffset = 0,\n userEvent,\n }: ReplaceTextByRangeOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const { main } = state.selection;\n const fromOff = from - main.from;\n const toOff = to - main.from;\n\n view.dispatch({\n ...view.state.changeByRange(range => {\n if (\n range !== main &&\n from !== to &&\n state.sliceDoc(range.from + fromOff, range.from + toOff) !==\n state.sliceDoc(from, to)\n ) {\n return { range };\n }\n return {\n changes: {\n from: range.from + fromOff,\n to: to === main.from ? range.to : range.from + toOff,\n insert: text,\n },\n range: EditorSelection.cursor(\n range.from + fromOff + text.length + cursorOffset,\n ),\n };\n }),\n scrollIntoView: true,\n userEvent,\n });\n };\n\nconst updateDisabledKeybindings = StateEffect.define<string[]>();\n\nconst stub = () => true;\n\nexport const disableKeybindingsField = StateField.define<string[]>({\n create() {\n return [];\n },\n update(keys, tr) {\n for (const effect of tr.effects) {\n if (effect.is(updateDisabledKeybindings)) {\n return effect.value;\n }\n }\n return keys;\n },\n provide(f) {\n return Prec.highest(\n keymap.compute([f], state => {\n const keys = state.field(f);\n return keys.map(key => ({\n key,\n run: stub,\n }));\n }),\n );\n },\n});\n\nexport const disableKeybindings =\n ({ view }: Context) =>\n (keys: string[]) => {\n view.dispatch({\n effects: updateDisabledKeybindings.of(keys),\n });\n };\n\nexport const getSelection =\n ({ view }: Context) =>\n () => {\n const { from, to, anchor, head } = view.state.selection.main;\n return { from, to, anchor, head };\n };\n\nexport const getLineInfoAtPosition =\n ({ view }: Context) =>\n (pos: number): Line =>\n view.state.doc.lineAt(pos);\n\nexport const isFocused =\n ({ view }: Context) =>\n () =>\n view.hasFocus;\n\nexport const getMainSelectionRects =\n ({ view }: Context) =>\n () => {\n const markers = RectangleMarker.forRange(\n view,\n '',\n view.state.selection.main,\n );\n return markers.map(marker =>\n pick(marker, ['top', 'left', 'width', 'height']),\n );\n };\n\n// export const getInterpolationText = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const isInInterpolation = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const getInterpolationRange = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\ninterface InsertTextContext extends Context {\n text?: string;\n range?: {\n from: number;\n to?: number;\n };\n scrollIntoView?: boolean;\n}\n\nconst isNumber = (value: unknown): value is number => typeof value === 'number';\n\nexport const insertText = ({\n view,\n text = '',\n range = { from: 0 },\n scrollIntoView = true,\n}: InsertTextContext) => {\n try {\n view.dispatch({\n changes: {\n from: range.from,\n insert: text,\n ...(isNumber(range.to)\n ? {\n to: range.to,\n }\n : {}),\n },\n selection: { anchor: range.from, head: range.from + text.length },\n scrollIntoView,\n });\n } catch (e) {\n console.error('insertText failed', e);\n }\n};\n\ntype ReplaceTextOptions = {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n scrollIntoView?: boolean;\n userEvent?: string;\n};\nexport const replaceText =\n ({ view }: Context) =>\n (options: ReplaceTextOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const {\n from,\n to,\n text,\n cursorOffset = 0,\n scrollIntoView = true,\n userEvent,\n } = options;\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: text,\n },\n selection: EditorSelection.cursor(from + text.length + cursorOffset),\n scrollIntoView,\n userEvent,\n });\n };\n\nexport const undo =\n ({ view }: Context) =>\n () => {\n cmUndo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\nexport const redo =\n ({ view }: Context) =>\n () => {\n cmRedo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\ntype TextTransformer = (text: string) => string | undefined;\nexport const transformTextInSelection =\n ({ view }: Context) =>\n (transformer: TextTransformer) => {\n const { from, to } = view.state.selection.main;\n const text = view.state.sliceDoc(from, to);\n\n const newText = transformer(text);\n\n if (typeof newText !== 'string') {\n return;\n }\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: newText,\n },\n selection: EditorSelection.cursor(from + newText.length),\n });\n };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { placeholder as cmPlaceholder } from '@coze-editor/extension-placeholder';\nimport { EditorView, lineNumbers as cmLineNumbers } from '@codemirror/view';\nimport { EditorState, Prec } from '@codemirror/state';\n\nexport const fontSize = (value?: number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '&': {\n fontSize: typeof value === 'number' ? `${value}px` : 'inherit',\n },\n });\n};\n\nexport const placeholder = (value?: HTMLElement | string) =>\n cmPlaceholder(value ?? '');\n\nexport const readOnly = (value?: boolean) =>\n EditorState.readOnly.of(value ?? false);\n\nexport const editable = (value?: boolean) =>\n EditorView.editable.of(value ?? true);\n\nexport const minHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const maxHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-scroller': {\n maxHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const height = (value?: string | number) =>\n typeof value === 'string' || typeof value === 'number'\n ? [\n // give it higher prec to override styles from minHeight option\n Prec.high(\n EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ),\n EditorView.theme({\n '.cm-scroller': {\n height: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ]\n : [];\n\nexport const tabSize = (value?: number) => EditorState.tabSize.of(value ?? 2);\n\nexport interface Attrs {\n [name: string]: string;\n}\ntype AttrSource = Attrs | ((view: EditorView) => Attrs | null);\n\nexport const contentAttributes = (attributes: AttrSource) =>\n EditorView.contentAttributes.of(attributes ?? {});\n\n// type CursorColorParams = string | ((state: EditorState) => string);\n// const cursorColorFacet = Facet.define<CursorColorParams | undefined, CursorColorParams | undefined>({\n// combine(values) {\n// return values[values.length - 1];\n// },\n// });\n\n// export const cursorColor = (color?: CursorColorParams) => {\n// return [\n// cursorColorFacet.of(color),\n// ];\n// };\n\n// export const cursorColorExtension = () => {\n// const compartment = new Compartment()\n// return [\n// drawSelection(),\n// compartment.of([]),\n// EditorState.transactionExtender.of(tr => {\n// const color = tr.state.facet(cursorColorFacet);\n\n// let finalColor: string | null = null\n\n// if (typeof color === 'string') {\n// finalColor = color\n// } else if (typeof color === 'function') {\n// finalColor = color(tr.state)\n// }\n\n// if (typeof finalColor === 'string') {\n// return {\n// effects: compartment.reconfigure([\n// EditorView.theme({\n// '& .cm-cursor, & .cm-dropCursor': {\n// borderLeft: `1.2px solid ${finalColor}`,\n// },\n// })\n// ])\n// }\n// }\n\n// return null\n// })\n// ]\n// }\n\nexport const lineNumbers = (enable?: boolean) =>\n enable === true ? cmLineNumbers() : [];\n\nexport const lineWrapping = (enable: boolean) =>\n enable ? EditorView.lineWrapping : [];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EVENT_SILENT } from '@coze-editor/core';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { StateEffect } from '@codemirror/state';\n\nexport const eventChange = (update: ViewUpdate) => {\n if (update.docChanged) {\n return {\n value: update.state.sliceDoc(),\n };\n }\n\n return EVENT_SILENT;\n};\n\nconst focusStateEffect = StateEffect.define<boolean>();\nexport const focusChangeNotifier = ViewPlugin.fromClass(\n class {\n public hasFocus: boolean;\n\n constructor(view: EditorView) {\n this.hasFocus = view.hasFocus;\n }\n update(update: ViewUpdate) {\n if (update.view.hasFocus !== this.hasFocus) {\n this.hasFocus = update.view.hasFocus;\n\n queueMicrotask(() => {\n update.view.dispatch({\n effects: focusStateEffect.of(this.hasFocus),\n });\n });\n }\n }\n },\n);\n\nexport const eventFocus = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === true) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventBlur = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === false) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventSelectionChange = (update: ViewUpdate) => {\n if (!update.startState.selection.eq(update.state.selection)) {\n const { from, to, anchor, head } = update.state.selection.main;\n return {\n selection: { from, to, head, anchor },\n update,\n };\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventViewUpdate = (update: ViewUpdate) => update;\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView } from '@codemirror/view';\nimport { Prec } from '@codemirror/state';\n\nexport const basic = () => [\n Prec.low(\n EditorView.theme({\n '&.cm-focused': { outline: 'none' },\n '& .cm-content': { cursor: 'text' },\n '& .cm-placeholder': {\n // position: 'absolute',\n wordBreak: 'break-all',\n },\n }),\n ),\n];\n"],"mappings":"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","names":["Prec","StateEffect","EditorView","Prec"]}
1
+ {"version":3,"sources":["../../src/api.ts","../../src/option.ts","../../src/event.ts","../../src/extension.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { pick } from 'es-toolkit';\nimport { RectangleMarker, keymap, type EditorView } from '@codemirror/view';\nimport {\n EditorSelection,\n type Line,\n Prec,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport { undo as cmUndo, redo as cmRedo } from '@codemirror/commands';\n\ninterface Context {\n view: EditorView;\n}\n\nexport const getValue =\n ({ view }: Context) =>\n () =>\n view.state.sliceDoc();\n\nexport const setValue =\n ({ view }: Context) =>\n (value: string) => {\n const { state } = view;\n if (state.readOnly) {\n return;\n }\n view.dispatch(\n state.update({\n changes: {\n from: 0,\n to: state.doc.length,\n insert: value ?? '',\n },\n }),\n );\n };\n\nexport const focus =\n ({ view }: Context) =>\n () => {\n view.focus();\n };\n\nexport const blur =\n ({ view }: Context) =>\n () => {\n view.contentDOM.blur();\n };\n\nexport const setCursorPosition =\n ({ view }: Context) =>\n (pos: number): void => {\n view.dispatch({\n selection: {\n head: pos,\n anchor: pos,\n },\n });\n };\n\nexport const getCursorPosition =\n ({ view }: Context) =>\n (): number =>\n view.state.selection.main.head;\n\n// Make sure the given regexp has a $ at its end and, if `start` is\n// true, a ^ at its start.\nfunction ensureAnchor(expr: RegExp, start: boolean) {\n const { source } = expr;\n const addStart = start && source[0] !== '^',\n addEnd = source[source.length - 1] !== '$';\n if (!addStart && !addEnd) {\n return expr;\n }\n return new RegExp(\n `${addStart ? '^' : ''}(?:${source})${addEnd ? '$' : ''}`,\n expr.flags ?? (expr.ignoreCase ? 'i' : ''),\n );\n}\n\nexport const matchBefore =\n ({ view }: Context) =>\n (match: RegExp): { from: number; to: number; text: string } | null => {\n const pos = view.state.selection.main.head;\n const line = view.state.doc.lineAt(pos);\n const start = Math.max(line.from, pos - 250);\n const str = line.text.slice(start - line.from, pos - line.from);\n\n if (match instanceof RegExp) {\n const found = str.search(ensureAnchor(match, false));\n return found < 0\n ? null\n : { from: start + found, to: pos, text: str.slice(found) };\n }\n\n return null;\n };\n\nexport const getView =\n ({ view }: Context) =>\n () =>\n view;\n\nexport interface ReplaceTextByRangeOptions {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n userEvent?: string;\n}\n\nexport const replaceTextByRange =\n ({ view }: Context) =>\n ({\n from,\n to,\n text,\n cursorOffset = 0,\n userEvent,\n }: ReplaceTextByRangeOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const { main } = state.selection;\n const fromOff = from - main.from;\n const toOff = to - main.from;\n\n view.dispatch({\n ...view.state.changeByRange(range => {\n if (\n range !== main &&\n from !== to &&\n state.sliceDoc(range.from + fromOff, range.from + toOff) !==\n state.sliceDoc(from, to)\n ) {\n return { range };\n }\n return {\n changes: {\n from: range.from + fromOff,\n to: to === main.from ? range.to : range.from + toOff,\n insert: text,\n },\n range: EditorSelection.cursor(\n range.from + fromOff + text.length + cursorOffset,\n ),\n };\n }),\n scrollIntoView: true,\n userEvent,\n });\n };\n\nconst updateDisabledKeybindings = StateEffect.define<string[]>();\n\nconst stub = () => true;\n\nexport const disableKeybindingsField = StateField.define<string[]>({\n create() {\n return [];\n },\n update(keys, tr) {\n for (const effect of tr.effects) {\n if (effect.is(updateDisabledKeybindings)) {\n return effect.value;\n }\n }\n return keys;\n },\n provide(f) {\n return Prec.highest(\n keymap.compute([f], state => {\n const keys = state.field(f);\n return keys.map(key => ({\n key,\n run: stub,\n }));\n }),\n );\n },\n});\n\nexport const disableKeybindings =\n ({ view }: Context) =>\n (keys: string[]) => {\n view.dispatch({\n effects: updateDisabledKeybindings.of(keys),\n });\n };\n\nexport const getSelection =\n ({ view }: Context) =>\n () => {\n const { from, to, anchor, head } = view.state.selection.main;\n return { from, to, anchor, head };\n };\n\nexport const getLineInfoAtPosition =\n ({ view }: Context) =>\n (pos: number): Line =>\n view.state.doc.lineAt(pos);\n\nexport const isFocused =\n ({ view }: Context) =>\n () =>\n view.hasFocus;\n\nexport const getMainSelectionRects =\n ({ view }: Context) =>\n () => {\n const markers = RectangleMarker.forRange(\n view,\n '',\n view.state.selection.main,\n );\n return markers.map(marker =>\n pick(marker, ['top', 'left', 'width', 'height']),\n );\n };\n\n// export const getInterpolationText = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const isInInterpolation = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const getInterpolationRange = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\ninterface InsertTextContext extends Context {\n text?: string;\n range?: {\n from: number;\n to?: number;\n };\n scrollIntoView?: boolean;\n}\n\nconst isNumber = (value: unknown): value is number => typeof value === 'number';\n\nexport const insertText = ({\n view,\n text = '',\n range = { from: 0 },\n scrollIntoView = true,\n}: InsertTextContext) => {\n try {\n view.dispatch({\n changes: {\n from: range.from,\n insert: text,\n ...(isNumber(range.to)\n ? {\n to: range.to,\n }\n : {}),\n },\n selection: { anchor: range.from, head: range.from + text.length },\n scrollIntoView,\n });\n } catch (e) {\n console.error('insertText failed', e);\n }\n};\n\ntype ReplaceTextOptions = {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n scrollIntoView?: boolean;\n userEvent?: string;\n};\nexport const replaceText =\n ({ view }: Context) =>\n (options: ReplaceTextOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const {\n from,\n to,\n text,\n cursorOffset = 0,\n scrollIntoView = true,\n userEvent,\n } = options;\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: text,\n },\n selection: EditorSelection.cursor(from + text.length + cursorOffset),\n scrollIntoView,\n userEvent,\n });\n };\n\nexport const undo =\n ({ view }: Context) =>\n () => {\n cmUndo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\nexport const redo =\n ({ view }: Context) =>\n () => {\n cmRedo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\ntype TextTransformer = (text: string) => string | undefined;\nexport const transformTextInSelection =\n ({ view }: Context) =>\n (transformer: TextTransformer) => {\n const { from, to } = view.state.selection.main;\n const text = view.state.sliceDoc(from, to);\n\n const newText = transformer(text);\n\n if (typeof newText !== 'string') {\n return;\n }\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: newText,\n },\n selection: EditorSelection.cursor(from + newText.length),\n });\n };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { FacetCombineStrategy } from '@coze-editor/utils';\nimport { placeholder as cmPlaceholder } from '@coze-editor/extension-placeholder';\nimport {\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n lineNumbers as cmLineNumbers,\n} from '@codemirror/view';\nimport { EditorState, Facet, Prec } from '@codemirror/state';\n\nexport const fontSize = (value?: number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '&': {\n fontSize: typeof value === 'number' ? `${value}px` : 'inherit',\n },\n });\n};\n\nexport const placeholder = (value?: HTMLElement | string) =>\n cmPlaceholder(value ?? '');\n\nexport const readOnly = (value?: boolean) =>\n EditorState.readOnly.of(value ?? false);\n\nexport const editable = (value?: boolean) =>\n EditorView.editable.of(value ?? true);\n\nexport const minHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const maxHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-scroller': {\n maxHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const height = (value?: string | number) =>\n typeof value === 'string' || typeof value === 'number'\n ? [\n // give it higher prec to override styles from minHeight option\n Prec.high(\n EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ),\n EditorView.theme({\n '.cm-scroller': {\n height: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ]\n : [];\n\nexport const tabSize = (value?: number) => EditorState.tabSize.of(value ?? 2);\n\nexport interface Attrs {\n [name: string]: string;\n}\ntype AttrSource = Attrs | ((view: EditorView) => Attrs | null);\n\nexport const contentAttributes = (attributes: AttrSource) =>\n EditorView.contentAttributes.of(attributes ?? {});\n\n// type CursorColorParams = string | ((state: EditorState) => string);\n// const cursorColorFacet = Facet.define<CursorColorParams | undefined, CursorColorParams | undefined>({\n// combine(values) {\n// return values[values.length - 1];\n// },\n// });\n\n// export const cursorColor = (color?: CursorColorParams) => {\n// return [\n// cursorColorFacet.of(color),\n// ];\n// };\n\n// export const cursorColorExtension = () => {\n// const compartment = new Compartment()\n// return [\n// drawSelection(),\n// compartment.of([]),\n// EditorState.transactionExtender.of(tr => {\n// const color = tr.state.facet(cursorColorFacet);\n\n// let finalColor: string | null = null\n\n// if (typeof color === 'string') {\n// finalColor = color\n// } else if (typeof color === 'function') {\n// finalColor = color(tr.state)\n// }\n\n// if (typeof finalColor === 'string') {\n// return {\n// effects: compartment.reconfigure([\n// EditorView.theme({\n// '& .cm-cursor, & .cm-dropCursor': {\n// borderLeft: `1.2px solid ${finalColor}`,\n// },\n// })\n// ])\n// }\n// }\n\n// return null\n// })\n// ]\n// }\n\nexport const lineNumbers = (enable?: boolean) =>\n enable === true ? cmLineNumbers() : [];\n\nexport const lineWrapping = (enable: boolean) =>\n enable ? EditorView.lineWrapping : [];\n\nconst valueFacet = Facet.define<string, string>({\n combine: FacetCombineStrategy.Last,\n});\nexport const valueExtension = ViewPlugin.fromClass(\n class {\n update(update: ViewUpdate) {\n const currentValue = update.state.doc.toString();\n const newValue = update.state.facet(valueFacet);\n\n if (\n typeof newValue === 'string' &&\n newValue &&\n newValue !== currentValue\n ) {\n queueMicrotask(() => {\n update.view.dispatch({\n changes: {\n from: 0,\n to: currentValue.length,\n insert: newValue,\n },\n });\n });\n }\n }\n },\n);\nexport const value = (v: string) => valueFacet.of(v);\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EVENT_SILENT } from '@coze-editor/core';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { StateEffect } from '@codemirror/state';\n\nexport const eventChange = (update: ViewUpdate) => {\n if (update.docChanged) {\n return {\n value: update.state.sliceDoc(),\n };\n }\n\n return EVENT_SILENT;\n};\n\nconst focusStateEffect = StateEffect.define<boolean>();\nexport const focusChangeNotifier = ViewPlugin.fromClass(\n class {\n public hasFocus: boolean;\n\n constructor(view: EditorView) {\n this.hasFocus = view.hasFocus;\n }\n update(update: ViewUpdate) {\n if (update.view.hasFocus !== this.hasFocus) {\n this.hasFocus = update.view.hasFocus;\n\n queueMicrotask(() => {\n update.view.dispatch({\n effects: focusStateEffect.of(this.hasFocus),\n });\n });\n }\n }\n },\n);\n\nexport const eventFocus = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === true) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventBlur = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === false) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventSelectionChange = (update: ViewUpdate) => {\n if (!update.startState.selection.eq(update.state.selection)) {\n const { from, to, anchor, head } = update.state.selection.main;\n return {\n selection: { from, to, head, anchor },\n update,\n };\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventViewUpdate = (update: ViewUpdate) => update;\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView } from '@codemirror/view';\nimport { Prec } from '@codemirror/state';\n\nexport const basic = () => [\n Prec.low(\n EditorView.theme({\n '&.cm-focused': { outline: 'none' },\n '& .cm-content': { cursor: 'text' },\n '& .cm-placeholder': {\n // position: 'absolute',\n wordBreak: 'break-all',\n },\n }),\n ),\n];\n"],"mappings":"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","names":["value","Prec","value","ViewPlugin","StateEffect","EditorView","Prec"]}
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { EditorView, RectangleMarker, ViewUpdate, ViewPlugin } from '@codemirror/view';
1
+ import { EditorView, RectangleMarker, ViewPlugin, ViewUpdate } from '@codemirror/view';
2
2
  import * as _codemirror_state from '@codemirror/state';
3
3
  import { StateField, Line } from '@codemirror/state';
4
4
  import { EVENT_SILENT } from '@coze-editor/core';
@@ -75,6 +75,10 @@ type AttrSource = Attrs | ((view: EditorView) => Attrs | null);
75
75
  declare const contentAttributes: (attributes: AttrSource) => _codemirror_state.Extension;
76
76
  declare const lineNumbers: (enable?: boolean) => _codemirror_state.Extension;
77
77
  declare const lineWrapping: (enable: boolean) => _codemirror_state.Extension;
78
+ declare const valueExtension: ViewPlugin<{
79
+ update(update: ViewUpdate): void;
80
+ }, undefined>;
81
+ declare const value: (v: string) => _codemirror_state.Extension;
78
82
 
79
83
  declare const eventChange: (update: ViewUpdate) => typeof EVENT_SILENT | {
80
84
  value: string;
@@ -98,4 +102,4 @@ declare const eventViewUpdate: (update: ViewUpdate) => ViewUpdate;
98
102
 
99
103
  declare const basic: () => _codemirror_state.Extension[];
100
104
 
101
- export { type Attrs, type ReplaceTextByRangeOptions, basic, blur, contentAttributes, disableKeybindings, disableKeybindingsField, editable, eventBlur, eventChange, eventFocus, eventSelectionChange, eventViewUpdate, focus, focusChangeNotifier, fontSize, getCursorPosition, getLineInfoAtPosition, getMainSelectionRects, getSelection, getValue, getView, height, insertText, isFocused, lineNumbers, lineWrapping, matchBefore, maxHeight, minHeight, placeholder, readOnly, redo, replaceText, replaceTextByRange, setCursorPosition, setValue, tabSize, transformTextInSelection, undo };
105
+ export { type Attrs, type ReplaceTextByRangeOptions, basic, blur, contentAttributes, disableKeybindings, disableKeybindingsField, editable, eventBlur, eventChange, eventFocus, eventSelectionChange, eventViewUpdate, focus, focusChangeNotifier, fontSize, getCursorPosition, getLineInfoAtPosition, getMainSelectionRects, getSelection, getValue, getView, height, insertText, isFocused, lineNumbers, lineWrapping, matchBefore, maxHeight, minHeight, placeholder, readOnly, redo, replaceText, replaceTextByRange, setCursorPosition, setValue, tabSize, transformTextInSelection, undo, value, valueExtension };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { EditorView, RectangleMarker, ViewUpdate, ViewPlugin } from '@codemirror/view';
1
+ import { EditorView, RectangleMarker, ViewPlugin, ViewUpdate } from '@codemirror/view';
2
2
  import * as _codemirror_state from '@codemirror/state';
3
3
  import { StateField, Line } from '@codemirror/state';
4
4
  import { EVENT_SILENT } from '@coze-editor/core';
@@ -75,6 +75,10 @@ type AttrSource = Attrs | ((view: EditorView) => Attrs | null);
75
75
  declare const contentAttributes: (attributes: AttrSource) => _codemirror_state.Extension;
76
76
  declare const lineNumbers: (enable?: boolean) => _codemirror_state.Extension;
77
77
  declare const lineWrapping: (enable: boolean) => _codemirror_state.Extension;
78
+ declare const valueExtension: ViewPlugin<{
79
+ update(update: ViewUpdate): void;
80
+ }, undefined>;
81
+ declare const value: (v: string) => _codemirror_state.Extension;
78
82
 
79
83
  declare const eventChange: (update: ViewUpdate) => typeof EVENT_SILENT | {
80
84
  value: string;
@@ -98,4 +102,4 @@ declare const eventViewUpdate: (update: ViewUpdate) => ViewUpdate;
98
102
 
99
103
  declare const basic: () => _codemirror_state.Extension[];
100
104
 
101
- export { type Attrs, type ReplaceTextByRangeOptions, basic, blur, contentAttributes, disableKeybindings, disableKeybindingsField, editable, eventBlur, eventChange, eventFocus, eventSelectionChange, eventViewUpdate, focus, focusChangeNotifier, fontSize, getCursorPosition, getLineInfoAtPosition, getMainSelectionRects, getSelection, getValue, getView, height, insertText, isFocused, lineNumbers, lineWrapping, matchBefore, maxHeight, minHeight, placeholder, readOnly, redo, replaceText, replaceTextByRange, setCursorPosition, setValue, tabSize, transformTextInSelection, undo };
105
+ export { type Attrs, type ReplaceTextByRangeOptions, basic, blur, contentAttributes, disableKeybindings, disableKeybindingsField, editable, eventBlur, eventChange, eventFocus, eventSelectionChange, eventViewUpdate, focus, focusChangeNotifier, fontSize, getCursorPosition, getLineInfoAtPosition, getMainSelectionRects, getSelection, getValue, getView, height, insertText, isFocused, lineNumbers, lineWrapping, matchBefore, maxHeight, minHeight, placeholder, readOnly, redo, replaceText, replaceTextByRange, setCursorPosition, setValue, tabSize, transformTextInSelection, undo, value, valueExtension };
package/dist/index.js CHANGED
@@ -56,7 +56,9 @@ __export(index_exports, {
56
56
  setValue: () => setValue,
57
57
  tabSize: () => tabSize,
58
58
  transformTextInSelection: () => transformTextInSelection,
59
- undo: () => undo
59
+ undo: () => undo,
60
+ value: () => value,
61
+ valueExtension: () => valueExtension
60
62
  });
61
63
  module.exports = __toCommonJS(index_exports);
62
64
 
@@ -66,7 +68,7 @@ var import_view = require("@codemirror/view");
66
68
  var import_state = require("@codemirror/state");
67
69
  var import_commands = require("@codemirror/commands");
68
70
  var getValue = ({ view }) => () => view.state.sliceDoc();
69
- var setValue = ({ view }) => (value) => {
71
+ var setValue = ({ view }) => (value2) => {
70
72
  const { state } = view;
71
73
  if (state.readOnly) {
72
74
  return;
@@ -76,7 +78,7 @@ var setValue = ({ view }) => (value) => {
76
78
  changes: {
77
79
  from: 0,
78
80
  to: state.doc.length,
79
- insert: value ?? ""
81
+ insert: value2 ?? ""
80
82
  }
81
83
  })
82
84
  );
@@ -200,7 +202,7 @@ var getMainSelectionRects = ({ view }) => () => {
200
202
  (marker) => (0, import_es_toolkit.pick)(marker, ["top", "left", "width", "height"])
201
203
  );
202
204
  };
203
- var isNumber = (value) => typeof value === "number";
205
+ var isNumber = (value2) => typeof value2 === "number";
204
206
  var insertText = ({
205
207
  view,
206
208
  text = "",
@@ -277,61 +279,85 @@ var transformTextInSelection = ({ view }) => (transformer) => {
277
279
  };
278
280
 
279
281
  // src/option.ts
282
+ var import_utils = require("@coze-editor/utils");
280
283
  var import_extension_placeholder = require("@coze-editor/extension-placeholder");
281
284
  var import_view2 = require("@codemirror/view");
282
285
  var import_state2 = require("@codemirror/state");
283
- var fontSize = (value) => {
284
- if (typeof value === "undefined") {
286
+ var fontSize = (value2) => {
287
+ if (typeof value2 === "undefined") {
285
288
  return [];
286
289
  }
287
290
  return import_view2.EditorView.theme({
288
291
  "&": {
289
- fontSize: typeof value === "number" ? `${value}px` : "inherit"
292
+ fontSize: typeof value2 === "number" ? `${value2}px` : "inherit"
290
293
  }
291
294
  });
292
295
  };
293
- var placeholder = (value) => (0, import_extension_placeholder.placeholder)(value ?? "");
294
- var readOnly = (value) => import_state2.EditorState.readOnly.of(value ?? false);
295
- var editable = (value) => import_view2.EditorView.editable.of(value ?? true);
296
- var minHeight = (value) => {
297
- if (typeof value === "undefined") {
296
+ var placeholder = (value2) => (0, import_extension_placeholder.placeholder)(value2 ?? "");
297
+ var readOnly = (value2) => import_state2.EditorState.readOnly.of(value2 ?? false);
298
+ var editable = (value2) => import_view2.EditorView.editable.of(value2 ?? true);
299
+ var minHeight = (value2) => {
300
+ if (typeof value2 === "undefined") {
298
301
  return [];
299
302
  }
300
303
  return import_view2.EditorView.theme({
301
304
  ".cm-content, .cm-gutter, .cm-right-gutter": {
302
- minHeight: typeof value === "number" ? `${value}px` : typeof value === "string" ? value : "unset"
305
+ minHeight: typeof value2 === "number" ? `${value2}px` : typeof value2 === "string" ? value2 : "unset"
303
306
  }
304
307
  });
305
308
  };
306
- var maxHeight = (value) => {
307
- if (typeof value === "undefined") {
309
+ var maxHeight = (value2) => {
310
+ if (typeof value2 === "undefined") {
308
311
  return [];
309
312
  }
310
313
  return import_view2.EditorView.theme({
311
314
  ".cm-scroller": {
312
- maxHeight: typeof value === "number" ? `${value}px` : typeof value === "string" ? value : "unset"
315
+ maxHeight: typeof value2 === "number" ? `${value2}px` : typeof value2 === "string" ? value2 : "unset"
313
316
  }
314
317
  });
315
318
  };
316
- var height = (value) => typeof value === "string" || typeof value === "number" ? [
319
+ var height = (value2) => typeof value2 === "string" || typeof value2 === "number" ? [
317
320
  // give it higher prec to override styles from minHeight option
318
321
  import_state2.Prec.high(
319
322
  import_view2.EditorView.theme({
320
323
  ".cm-content, .cm-gutter, .cm-right-gutter": {
321
- minHeight: typeof value === "number" ? `${value}px` : value
324
+ minHeight: typeof value2 === "number" ? `${value2}px` : value2
322
325
  }
323
326
  })
324
327
  ),
325
328
  import_view2.EditorView.theme({
326
329
  ".cm-scroller": {
327
- height: typeof value === "number" ? `${value}px` : value
330
+ height: typeof value2 === "number" ? `${value2}px` : value2
328
331
  }
329
332
  })
330
333
  ] : [];
331
- var tabSize = (value) => import_state2.EditorState.tabSize.of(value ?? 2);
334
+ var tabSize = (value2) => import_state2.EditorState.tabSize.of(value2 ?? 2);
332
335
  var contentAttributes = (attributes) => import_view2.EditorView.contentAttributes.of(attributes ?? {});
333
336
  var lineNumbers = (enable) => enable === true ? (0, import_view2.lineNumbers)() : [];
334
337
  var lineWrapping = (enable) => enable ? import_view2.EditorView.lineWrapping : [];
338
+ var valueFacet = import_state2.Facet.define({
339
+ combine: import_utils.FacetCombineStrategy.Last
340
+ });
341
+ var valueExtension = import_view2.ViewPlugin.fromClass(
342
+ class {
343
+ update(update) {
344
+ const currentValue = update.state.doc.toString();
345
+ const newValue = update.state.facet(valueFacet);
346
+ if (typeof newValue === "string" && newValue && newValue !== currentValue) {
347
+ queueMicrotask(() => {
348
+ update.view.dispatch({
349
+ changes: {
350
+ from: 0,
351
+ to: currentValue.length,
352
+ insert: newValue
353
+ }
354
+ });
355
+ });
356
+ }
357
+ }
358
+ }
359
+ );
360
+ var value = (v) => valueFacet.of(v);
335
361
 
336
362
  // src/event.ts
337
363
  var import_core = require("@coze-editor/core");
@@ -450,6 +476,8 @@ var basic = () => [
450
476
  setValue,
451
477
  tabSize,
452
478
  transformTextInSelection,
453
- undo
479
+ undo,
480
+ value,
481
+ valueExtension
454
482
  });
455
483
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/api.ts","../src/option.ts","../src/event.ts","../src/extension.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nexport * from './api';\nexport * from './option';\nexport * from './event';\nexport * from './extension';\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { pick } from 'es-toolkit';\nimport { RectangleMarker, keymap, type EditorView } from '@codemirror/view';\nimport {\n EditorSelection,\n type Line,\n Prec,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport { undo as cmUndo, redo as cmRedo } from '@codemirror/commands';\n\ninterface Context {\n view: EditorView;\n}\n\nexport const getValue =\n ({ view }: Context) =>\n () =>\n view.state.sliceDoc();\n\nexport const setValue =\n ({ view }: Context) =>\n (value: string) => {\n const { state } = view;\n if (state.readOnly) {\n return;\n }\n view.dispatch(\n state.update({\n changes: {\n from: 0,\n to: state.doc.length,\n insert: value ?? '',\n },\n }),\n );\n };\n\nexport const focus =\n ({ view }: Context) =>\n () => {\n view.focus();\n };\n\nexport const blur =\n ({ view }: Context) =>\n () => {\n view.contentDOM.blur();\n };\n\nexport const setCursorPosition =\n ({ view }: Context) =>\n (pos: number): void => {\n view.dispatch({\n selection: {\n head: pos,\n anchor: pos,\n },\n });\n };\n\nexport const getCursorPosition =\n ({ view }: Context) =>\n (): number =>\n view.state.selection.main.head;\n\n// Make sure the given regexp has a $ at its end and, if `start` is\n// true, a ^ at its start.\nfunction ensureAnchor(expr: RegExp, start: boolean) {\n const { source } = expr;\n const addStart = start && source[0] !== '^',\n addEnd = source[source.length - 1] !== '$';\n if (!addStart && !addEnd) {\n return expr;\n }\n return new RegExp(\n `${addStart ? '^' : ''}(?:${source})${addEnd ? '$' : ''}`,\n expr.flags ?? (expr.ignoreCase ? 'i' : ''),\n );\n}\n\nexport const matchBefore =\n ({ view }: Context) =>\n (match: RegExp): { from: number; to: number; text: string } | null => {\n const pos = view.state.selection.main.head;\n const line = view.state.doc.lineAt(pos);\n const start = Math.max(line.from, pos - 250);\n const str = line.text.slice(start - line.from, pos - line.from);\n\n if (match instanceof RegExp) {\n const found = str.search(ensureAnchor(match, false));\n return found < 0\n ? null\n : { from: start + found, to: pos, text: str.slice(found) };\n }\n\n return null;\n };\n\nexport const getView =\n ({ view }: Context) =>\n () =>\n view;\n\nexport interface ReplaceTextByRangeOptions {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n userEvent?: string;\n}\n\nexport const replaceTextByRange =\n ({ view }: Context) =>\n ({\n from,\n to,\n text,\n cursorOffset = 0,\n userEvent,\n }: ReplaceTextByRangeOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const { main } = state.selection;\n const fromOff = from - main.from;\n const toOff = to - main.from;\n\n view.dispatch({\n ...view.state.changeByRange(range => {\n if (\n range !== main &&\n from !== to &&\n state.sliceDoc(range.from + fromOff, range.from + toOff) !==\n state.sliceDoc(from, to)\n ) {\n return { range };\n }\n return {\n changes: {\n from: range.from + fromOff,\n to: to === main.from ? range.to : range.from + toOff,\n insert: text,\n },\n range: EditorSelection.cursor(\n range.from + fromOff + text.length + cursorOffset,\n ),\n };\n }),\n scrollIntoView: true,\n userEvent,\n });\n };\n\nconst updateDisabledKeybindings = StateEffect.define<string[]>();\n\nconst stub = () => true;\n\nexport const disableKeybindingsField = StateField.define<string[]>({\n create() {\n return [];\n },\n update(keys, tr) {\n for (const effect of tr.effects) {\n if (effect.is(updateDisabledKeybindings)) {\n return effect.value;\n }\n }\n return keys;\n },\n provide(f) {\n return Prec.highest(\n keymap.compute([f], state => {\n const keys = state.field(f);\n return keys.map(key => ({\n key,\n run: stub,\n }));\n }),\n );\n },\n});\n\nexport const disableKeybindings =\n ({ view }: Context) =>\n (keys: string[]) => {\n view.dispatch({\n effects: updateDisabledKeybindings.of(keys),\n });\n };\n\nexport const getSelection =\n ({ view }: Context) =>\n () => {\n const { from, to, anchor, head } = view.state.selection.main;\n return { from, to, anchor, head };\n };\n\nexport const getLineInfoAtPosition =\n ({ view }: Context) =>\n (pos: number): Line =>\n view.state.doc.lineAt(pos);\n\nexport const isFocused =\n ({ view }: Context) =>\n () =>\n view.hasFocus;\n\nexport const getMainSelectionRects =\n ({ view }: Context) =>\n () => {\n const markers = RectangleMarker.forRange(\n view,\n '',\n view.state.selection.main,\n );\n return markers.map(marker =>\n pick(marker, ['top', 'left', 'width', 'height']),\n );\n };\n\n// export const getInterpolationText = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const isInInterpolation = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const getInterpolationRange = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\ninterface InsertTextContext extends Context {\n text?: string;\n range?: {\n from: number;\n to?: number;\n };\n scrollIntoView?: boolean;\n}\n\nconst isNumber = (value: unknown): value is number => typeof value === 'number';\n\nexport const insertText = ({\n view,\n text = '',\n range = { from: 0 },\n scrollIntoView = true,\n}: InsertTextContext) => {\n try {\n view.dispatch({\n changes: {\n from: range.from,\n insert: text,\n ...(isNumber(range.to)\n ? {\n to: range.to,\n }\n : {}),\n },\n selection: { anchor: range.from, head: range.from + text.length },\n scrollIntoView,\n });\n } catch (e) {\n console.error('insertText failed', e);\n }\n};\n\ntype ReplaceTextOptions = {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n scrollIntoView?: boolean;\n userEvent?: string;\n};\nexport const replaceText =\n ({ view }: Context) =>\n (options: ReplaceTextOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const {\n from,\n to,\n text,\n cursorOffset = 0,\n scrollIntoView = true,\n userEvent,\n } = options;\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: text,\n },\n selection: EditorSelection.cursor(from + text.length + cursorOffset),\n scrollIntoView,\n userEvent,\n });\n };\n\nexport const undo =\n ({ view }: Context) =>\n () => {\n cmUndo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\nexport const redo =\n ({ view }: Context) =>\n () => {\n cmRedo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\ntype TextTransformer = (text: string) => string | undefined;\nexport const transformTextInSelection =\n ({ view }: Context) =>\n (transformer: TextTransformer) => {\n const { from, to } = view.state.selection.main;\n const text = view.state.sliceDoc(from, to);\n\n const newText = transformer(text);\n\n if (typeof newText !== 'string') {\n return;\n }\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: newText,\n },\n selection: EditorSelection.cursor(from + newText.length),\n });\n };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { placeholder as cmPlaceholder } from '@coze-editor/extension-placeholder';\nimport { EditorView, lineNumbers as cmLineNumbers } from '@codemirror/view';\nimport { EditorState, Prec } from '@codemirror/state';\n\nexport const fontSize = (value?: number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '&': {\n fontSize: typeof value === 'number' ? `${value}px` : 'inherit',\n },\n });\n};\n\nexport const placeholder = (value?: HTMLElement | string) =>\n cmPlaceholder(value ?? '');\n\nexport const readOnly = (value?: boolean) =>\n EditorState.readOnly.of(value ?? false);\n\nexport const editable = (value?: boolean) =>\n EditorView.editable.of(value ?? true);\n\nexport const minHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const maxHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-scroller': {\n maxHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const height = (value?: string | number) =>\n typeof value === 'string' || typeof value === 'number'\n ? [\n // give it higher prec to override styles from minHeight option\n Prec.high(\n EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ),\n EditorView.theme({\n '.cm-scroller': {\n height: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ]\n : [];\n\nexport const tabSize = (value?: number) => EditorState.tabSize.of(value ?? 2);\n\nexport interface Attrs {\n [name: string]: string;\n}\ntype AttrSource = Attrs | ((view: EditorView) => Attrs | null);\n\nexport const contentAttributes = (attributes: AttrSource) =>\n EditorView.contentAttributes.of(attributes ?? {});\n\n// type CursorColorParams = string | ((state: EditorState) => string);\n// const cursorColorFacet = Facet.define<CursorColorParams | undefined, CursorColorParams | undefined>({\n// combine(values) {\n// return values[values.length - 1];\n// },\n// });\n\n// export const cursorColor = (color?: CursorColorParams) => {\n// return [\n// cursorColorFacet.of(color),\n// ];\n// };\n\n// export const cursorColorExtension = () => {\n// const compartment = new Compartment()\n// return [\n// drawSelection(),\n// compartment.of([]),\n// EditorState.transactionExtender.of(tr => {\n// const color = tr.state.facet(cursorColorFacet);\n\n// let finalColor: string | null = null\n\n// if (typeof color === 'string') {\n// finalColor = color\n// } else if (typeof color === 'function') {\n// finalColor = color(tr.state)\n// }\n\n// if (typeof finalColor === 'string') {\n// return {\n// effects: compartment.reconfigure([\n// EditorView.theme({\n// '& .cm-cursor, & .cm-dropCursor': {\n// borderLeft: `1.2px solid ${finalColor}`,\n// },\n// })\n// ])\n// }\n// }\n\n// return null\n// })\n// ]\n// }\n\nexport const lineNumbers = (enable?: boolean) =>\n enable === true ? cmLineNumbers() : [];\n\nexport const lineWrapping = (enable: boolean) =>\n enable ? EditorView.lineWrapping : [];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EVENT_SILENT } from '@coze-editor/core';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { StateEffect } from '@codemirror/state';\n\nexport const eventChange = (update: ViewUpdate) => {\n if (update.docChanged) {\n return {\n value: update.state.sliceDoc(),\n };\n }\n\n return EVENT_SILENT;\n};\n\nconst focusStateEffect = StateEffect.define<boolean>();\nexport const focusChangeNotifier = ViewPlugin.fromClass(\n class {\n public hasFocus: boolean;\n\n constructor(view: EditorView) {\n this.hasFocus = view.hasFocus;\n }\n update(update: ViewUpdate) {\n if (update.view.hasFocus !== this.hasFocus) {\n this.hasFocus = update.view.hasFocus;\n\n queueMicrotask(() => {\n update.view.dispatch({\n effects: focusStateEffect.of(this.hasFocus),\n });\n });\n }\n }\n },\n);\n\nexport const eventFocus = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === true) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventBlur = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === false) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventSelectionChange = (update: ViewUpdate) => {\n if (!update.startState.selection.eq(update.state.selection)) {\n const { from, to, anchor, head } = update.state.selection.main;\n return {\n selection: { from, to, head, anchor },\n update,\n };\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventViewUpdate = (update: ViewUpdate) => update;\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView } from '@codemirror/view';\nimport { Prec } from '@codemirror/state';\n\nexport const basic = () => [\n Prec.low(\n EditorView.theme({\n '&.cm-focused': { outline: 'none' },\n '& .cm-content': { cursor: 'text' },\n '& .cm-placeholder': {\n // position: 'absolute',\n wordBreak: 'break-all',\n },\n }),\n ),\n];\n"],"mappings":"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","names":["cmUndo","cmRedo","import_view","import_state","cmPlaceholder","cmLineNumbers","import_view","import_state","import_view","import_state"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/api.ts","../src/option.ts","../src/event.ts","../src/extension.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nexport * from './api';\nexport * from './option';\nexport * from './event';\nexport * from './extension';\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { pick } from 'es-toolkit';\nimport { RectangleMarker, keymap, type EditorView } from '@codemirror/view';\nimport {\n EditorSelection,\n type Line,\n Prec,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport { undo as cmUndo, redo as cmRedo } from '@codemirror/commands';\n\ninterface Context {\n view: EditorView;\n}\n\nexport const getValue =\n ({ view }: Context) =>\n () =>\n view.state.sliceDoc();\n\nexport const setValue =\n ({ view }: Context) =>\n (value: string) => {\n const { state } = view;\n if (state.readOnly) {\n return;\n }\n view.dispatch(\n state.update({\n changes: {\n from: 0,\n to: state.doc.length,\n insert: value ?? '',\n },\n }),\n );\n };\n\nexport const focus =\n ({ view }: Context) =>\n () => {\n view.focus();\n };\n\nexport const blur =\n ({ view }: Context) =>\n () => {\n view.contentDOM.blur();\n };\n\nexport const setCursorPosition =\n ({ view }: Context) =>\n (pos: number): void => {\n view.dispatch({\n selection: {\n head: pos,\n anchor: pos,\n },\n });\n };\n\nexport const getCursorPosition =\n ({ view }: Context) =>\n (): number =>\n view.state.selection.main.head;\n\n// Make sure the given regexp has a $ at its end and, if `start` is\n// true, a ^ at its start.\nfunction ensureAnchor(expr: RegExp, start: boolean) {\n const { source } = expr;\n const addStart = start && source[0] !== '^',\n addEnd = source[source.length - 1] !== '$';\n if (!addStart && !addEnd) {\n return expr;\n }\n return new RegExp(\n `${addStart ? '^' : ''}(?:${source})${addEnd ? '$' : ''}`,\n expr.flags ?? (expr.ignoreCase ? 'i' : ''),\n );\n}\n\nexport const matchBefore =\n ({ view }: Context) =>\n (match: RegExp): { from: number; to: number; text: string } | null => {\n const pos = view.state.selection.main.head;\n const line = view.state.doc.lineAt(pos);\n const start = Math.max(line.from, pos - 250);\n const str = line.text.slice(start - line.from, pos - line.from);\n\n if (match instanceof RegExp) {\n const found = str.search(ensureAnchor(match, false));\n return found < 0\n ? null\n : { from: start + found, to: pos, text: str.slice(found) };\n }\n\n return null;\n };\n\nexport const getView =\n ({ view }: Context) =>\n () =>\n view;\n\nexport interface ReplaceTextByRangeOptions {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n userEvent?: string;\n}\n\nexport const replaceTextByRange =\n ({ view }: Context) =>\n ({\n from,\n to,\n text,\n cursorOffset = 0,\n userEvent,\n }: ReplaceTextByRangeOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const { main } = state.selection;\n const fromOff = from - main.from;\n const toOff = to - main.from;\n\n view.dispatch({\n ...view.state.changeByRange(range => {\n if (\n range !== main &&\n from !== to &&\n state.sliceDoc(range.from + fromOff, range.from + toOff) !==\n state.sliceDoc(from, to)\n ) {\n return { range };\n }\n return {\n changes: {\n from: range.from + fromOff,\n to: to === main.from ? range.to : range.from + toOff,\n insert: text,\n },\n range: EditorSelection.cursor(\n range.from + fromOff + text.length + cursorOffset,\n ),\n };\n }),\n scrollIntoView: true,\n userEvent,\n });\n };\n\nconst updateDisabledKeybindings = StateEffect.define<string[]>();\n\nconst stub = () => true;\n\nexport const disableKeybindingsField = StateField.define<string[]>({\n create() {\n return [];\n },\n update(keys, tr) {\n for (const effect of tr.effects) {\n if (effect.is(updateDisabledKeybindings)) {\n return effect.value;\n }\n }\n return keys;\n },\n provide(f) {\n return Prec.highest(\n keymap.compute([f], state => {\n const keys = state.field(f);\n return keys.map(key => ({\n key,\n run: stub,\n }));\n }),\n );\n },\n});\n\nexport const disableKeybindings =\n ({ view }: Context) =>\n (keys: string[]) => {\n view.dispatch({\n effects: updateDisabledKeybindings.of(keys),\n });\n };\n\nexport const getSelection =\n ({ view }: Context) =>\n () => {\n const { from, to, anchor, head } = view.state.selection.main;\n return { from, to, anchor, head };\n };\n\nexport const getLineInfoAtPosition =\n ({ view }: Context) =>\n (pos: number): Line =>\n view.state.doc.lineAt(pos);\n\nexport const isFocused =\n ({ view }: Context) =>\n () =>\n view.hasFocus;\n\nexport const getMainSelectionRects =\n ({ view }: Context) =>\n () => {\n const markers = RectangleMarker.forRange(\n view,\n '',\n view.state.selection.main,\n );\n return markers.map(marker =>\n pick(marker, ['top', 'left', 'width', 'height']),\n );\n };\n\n// export const getInterpolationText = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const isInInterpolation = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const getInterpolationRange = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\ninterface InsertTextContext extends Context {\n text?: string;\n range?: {\n from: number;\n to?: number;\n };\n scrollIntoView?: boolean;\n}\n\nconst isNumber = (value: unknown): value is number => typeof value === 'number';\n\nexport const insertText = ({\n view,\n text = '',\n range = { from: 0 },\n scrollIntoView = true,\n}: InsertTextContext) => {\n try {\n view.dispatch({\n changes: {\n from: range.from,\n insert: text,\n ...(isNumber(range.to)\n ? {\n to: range.to,\n }\n : {}),\n },\n selection: { anchor: range.from, head: range.from + text.length },\n scrollIntoView,\n });\n } catch (e) {\n console.error('insertText failed', e);\n }\n};\n\ntype ReplaceTextOptions = {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n scrollIntoView?: boolean;\n userEvent?: string;\n};\nexport const replaceText =\n ({ view }: Context) =>\n (options: ReplaceTextOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const {\n from,\n to,\n text,\n cursorOffset = 0,\n scrollIntoView = true,\n userEvent,\n } = options;\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: text,\n },\n selection: EditorSelection.cursor(from + text.length + cursorOffset),\n scrollIntoView,\n userEvent,\n });\n };\n\nexport const undo =\n ({ view }: Context) =>\n () => {\n cmUndo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\nexport const redo =\n ({ view }: Context) =>\n () => {\n cmRedo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\ntype TextTransformer = (text: string) => string | undefined;\nexport const transformTextInSelection =\n ({ view }: Context) =>\n (transformer: TextTransformer) => {\n const { from, to } = view.state.selection.main;\n const text = view.state.sliceDoc(from, to);\n\n const newText = transformer(text);\n\n if (typeof newText !== 'string') {\n return;\n }\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: newText,\n },\n selection: EditorSelection.cursor(from + newText.length),\n });\n };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { FacetCombineStrategy } from '@coze-editor/utils';\nimport { placeholder as cmPlaceholder } from '@coze-editor/extension-placeholder';\nimport {\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n lineNumbers as cmLineNumbers,\n} from '@codemirror/view';\nimport { EditorState, Facet, Prec } from '@codemirror/state';\n\nexport const fontSize = (value?: number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '&': {\n fontSize: typeof value === 'number' ? `${value}px` : 'inherit',\n },\n });\n};\n\nexport const placeholder = (value?: HTMLElement | string) =>\n cmPlaceholder(value ?? '');\n\nexport const readOnly = (value?: boolean) =>\n EditorState.readOnly.of(value ?? false);\n\nexport const editable = (value?: boolean) =>\n EditorView.editable.of(value ?? true);\n\nexport const minHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const maxHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-scroller': {\n maxHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const height = (value?: string | number) =>\n typeof value === 'string' || typeof value === 'number'\n ? [\n // give it higher prec to override styles from minHeight option\n Prec.high(\n EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ),\n EditorView.theme({\n '.cm-scroller': {\n height: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ]\n : [];\n\nexport const tabSize = (value?: number) => EditorState.tabSize.of(value ?? 2);\n\nexport interface Attrs {\n [name: string]: string;\n}\ntype AttrSource = Attrs | ((view: EditorView) => Attrs | null);\n\nexport const contentAttributes = (attributes: AttrSource) =>\n EditorView.contentAttributes.of(attributes ?? {});\n\n// type CursorColorParams = string | ((state: EditorState) => string);\n// const cursorColorFacet = Facet.define<CursorColorParams | undefined, CursorColorParams | undefined>({\n// combine(values) {\n// return values[values.length - 1];\n// },\n// });\n\n// export const cursorColor = (color?: CursorColorParams) => {\n// return [\n// cursorColorFacet.of(color),\n// ];\n// };\n\n// export const cursorColorExtension = () => {\n// const compartment = new Compartment()\n// return [\n// drawSelection(),\n// compartment.of([]),\n// EditorState.transactionExtender.of(tr => {\n// const color = tr.state.facet(cursorColorFacet);\n\n// let finalColor: string | null = null\n\n// if (typeof color === 'string') {\n// finalColor = color\n// } else if (typeof color === 'function') {\n// finalColor = color(tr.state)\n// }\n\n// if (typeof finalColor === 'string') {\n// return {\n// effects: compartment.reconfigure([\n// EditorView.theme({\n// '& .cm-cursor, & .cm-dropCursor': {\n// borderLeft: `1.2px solid ${finalColor}`,\n// },\n// })\n// ])\n// }\n// }\n\n// return null\n// })\n// ]\n// }\n\nexport const lineNumbers = (enable?: boolean) =>\n enable === true ? cmLineNumbers() : [];\n\nexport const lineWrapping = (enable: boolean) =>\n enable ? EditorView.lineWrapping : [];\n\nconst valueFacet = Facet.define<string, string>({\n combine: FacetCombineStrategy.Last,\n});\nexport const valueExtension = ViewPlugin.fromClass(\n class {\n update(update: ViewUpdate) {\n const currentValue = update.state.doc.toString();\n const newValue = update.state.facet(valueFacet);\n\n if (\n typeof newValue === 'string' &&\n newValue &&\n newValue !== currentValue\n ) {\n queueMicrotask(() => {\n update.view.dispatch({\n changes: {\n from: 0,\n to: currentValue.length,\n insert: newValue,\n },\n });\n });\n }\n }\n },\n);\nexport const value = (v: string) => valueFacet.of(v);\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EVENT_SILENT } from '@coze-editor/core';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { StateEffect } from '@codemirror/state';\n\nexport const eventChange = (update: ViewUpdate) => {\n if (update.docChanged) {\n return {\n value: update.state.sliceDoc(),\n };\n }\n\n return EVENT_SILENT;\n};\n\nconst focusStateEffect = StateEffect.define<boolean>();\nexport const focusChangeNotifier = ViewPlugin.fromClass(\n class {\n public hasFocus: boolean;\n\n constructor(view: EditorView) {\n this.hasFocus = view.hasFocus;\n }\n update(update: ViewUpdate) {\n if (update.view.hasFocus !== this.hasFocus) {\n this.hasFocus = update.view.hasFocus;\n\n queueMicrotask(() => {\n update.view.dispatch({\n effects: focusStateEffect.of(this.hasFocus),\n });\n });\n }\n }\n },\n);\n\nexport const eventFocus = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === true) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventBlur = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === false) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventSelectionChange = (update: ViewUpdate) => {\n if (!update.startState.selection.eq(update.state.selection)) {\n const { from, to, anchor, head } = update.state.selection.main;\n return {\n selection: { from, to, head, anchor },\n update,\n };\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventViewUpdate = (update: ViewUpdate) => update;\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView } from '@codemirror/view';\nimport { Prec } from '@codemirror/state';\n\nexport const basic = () => [\n Prec.low(\n EditorView.theme({\n '&.cm-focused': { outline: 'none' },\n '& .cm-content': { cursor: 'text' },\n '& .cm-placeholder': {\n // position: 'absolute',\n wordBreak: 'break-all',\n },\n }),\n ),\n];\n"],"mappings":"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","names":["value","cmUndo","cmRedo","import_view","import_state","value","cmPlaceholder","cmLineNumbers","import_view","import_state","import_view","import_state"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coze-editor/core-plugins",
3
- "version": "0.1.0-alpha.1e5e87",
3
+ "version": "0.1.0-alpha.241d91",
4
4
  "description": "core-plugins",
5
5
  "license": "MIT",
6
6
  "author": "fengzilong",
@@ -22,8 +22,9 @@
22
22
  "lint": "eslint && tsc --noEmit"
23
23
  },
24
24
  "dependencies": {
25
- "@coze-editor/core": "0.1.0-alpha.1e5e87",
26
- "@coze-editor/extension-placeholder": "0.1.0-alpha.1e5e87",
25
+ "@coze-editor/core": "0.1.0-alpha.241d91",
26
+ "@coze-editor/extension-placeholder": "0.1.0-alpha.241d91",
27
+ "@coze-editor/utils": "0.1.0-alpha.241d91",
27
28
  "es-toolkit": "^1.25.2"
28
29
  },
29
30
  "devDependencies": {