@coze-editor/react-components 0.1.0-alpha.7cf9d0 → 0.1.0-alpha.7f007e

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/index.js CHANGED
@@ -45,8 +45,10 @@ __export(index_exports, {
45
45
  Mention: () => Mention,
46
46
  Placeholder: () => Placeholder,
47
47
  PositionMirror: () => PositionMirror,
48
+ PrefixElement: () => PrefixElement,
48
49
  RefElement: () => RefElement,
49
50
  SelectionSide: () => import_extensions.SelectionSide,
51
+ ValueSync: () => ValueSync,
50
52
  getCurrentMentionReplaceRange: () => getCurrentMentionReplaceRange
51
53
  });
52
54
  module.exports = __toCommonJS(index_exports);
@@ -1174,7 +1176,10 @@ function mention(options) {
1174
1176
  },
1175
1177
  update(value, tr) {
1176
1178
  const options2 = tr.startState.facet(mentionConfig);
1177
- const { search = true, onOpenChange, onSearch } = options2;
1179
+ if (!options2) {
1180
+ return value;
1181
+ }
1182
+ const { search = true, onOpenChange, onSearch, onTrigger } = options2;
1178
1183
  let { show } = value;
1179
1184
  let triggerContext = void 0;
1180
1185
  if (tr.docChanged) {
@@ -1193,6 +1198,15 @@ function mention(options) {
1193
1198
  } else if (hasTrigger(options2)) {
1194
1199
  triggerContext = options2.trigger(tr);
1195
1200
  }
1201
+ if (triggerContext && typeof onTrigger === "function") {
1202
+ onTrigger({
1203
+ triggerContext: {
1204
+ from: triggerContext.from,
1205
+ to: triggerContext.to,
1206
+ triggerCharacter: triggerContext.triggerCharacter
1207
+ }
1208
+ });
1209
+ }
1196
1210
  }
1197
1211
  const isSelectUserEvent = tr.isUserEvent("select");
1198
1212
  const newValue = {
@@ -1300,6 +1314,11 @@ function Mention(props) {
1300
1314
  if (typeof propsRef.current.onSearch === "function") {
1301
1315
  return propsRef.current.onSearch(...args);
1302
1316
  }
1317
+ },
1318
+ onTrigger(...args) {
1319
+ if (typeof propsRef.current.onTrigger === "function") {
1320
+ return propsRef.current.onTrigger(...args);
1321
+ }
1303
1322
  }
1304
1323
  };
1305
1324
  return injector.inject([
@@ -1449,6 +1468,132 @@ var EmbededLineView = (0, import_react21.forwardRef)(function EmbededLineView2({
1449
1468
  }, []);
1450
1469
  return (0, import_react_dom6.createPortal)(children, dom);
1451
1470
  });
1471
+
1472
+ // src/prefix-element/react.tsx
1473
+ var import_react_dom7 = require("react-dom");
1474
+ var import_react23 = require("react");
1475
+ var import_react_hooks10 = require("@coze-editor/react-hooks");
1476
+ var import_react24 = require("@coze-editor/react");
1477
+ var import_view10 = require("@codemirror/view");
1478
+
1479
+ // src/prefix-element/dom.ts
1480
+ var scratchRange;
1481
+ function textRange(node, from, to = from) {
1482
+ const range = scratchRange || (scratchRange = document.createRange());
1483
+ range.setEnd(node, to);
1484
+ range.setStart(node, from);
1485
+ return range;
1486
+ }
1487
+ function flattenRect(rect, left) {
1488
+ const x = left ? rect.left : rect.right;
1489
+ return { left: x, right: x, top: rect.top, bottom: rect.bottom };
1490
+ }
1491
+ function clientRectsFor(dom) {
1492
+ if (dom.nodeType == 3) {
1493
+ return textRange(dom, 0, dom.nodeValue.length).getClientRects();
1494
+ } else if (dom.nodeType == 1) {
1495
+ return dom.getClientRects();
1496
+ } else {
1497
+ return [];
1498
+ }
1499
+ }
1500
+
1501
+ // src/prefix-element/react.tsx
1502
+ var PrefixElementWidget = class extends import_view10.WidgetType {
1503
+ constructor(content) {
1504
+ super();
1505
+ this.content = content;
1506
+ }
1507
+ toDOM(view) {
1508
+ const wrap = document.createElement("span");
1509
+ wrap.className = "cm-prefix-element";
1510
+ wrap.style.cssText = "height: 0;";
1511
+ wrap.appendChild(
1512
+ typeof this.content === "string" ? document.createTextNode(this.content) : typeof this.content === "function" ? this.content(view) : this.content
1513
+ );
1514
+ if (typeof this.content === "string") {
1515
+ wrap.setAttribute("aria-label", `prefix ${this.content}`);
1516
+ } else {
1517
+ wrap.setAttribute("aria-hidden", "true");
1518
+ }
1519
+ return wrap;
1520
+ }
1521
+ coordsAt(dom) {
1522
+ const rects = dom.firstChild ? clientRectsFor(dom.firstChild) : [];
1523
+ if (!rects.length) {
1524
+ return null;
1525
+ }
1526
+ const style = window.getComputedStyle(dom.parentNode);
1527
+ const rect = flattenRect(rects[0], style.direction != "rtl");
1528
+ const lineHeight = parseInt(style.lineHeight);
1529
+ if (rect.bottom - rect.top > lineHeight * 1.5) {
1530
+ return {
1531
+ left: rect.left,
1532
+ right: rect.right,
1533
+ top: rect.top,
1534
+ bottom: rect.top + lineHeight
1535
+ };
1536
+ }
1537
+ return rect;
1538
+ }
1539
+ ignoreEvent() {
1540
+ return false;
1541
+ }
1542
+ };
1543
+ function PrefixElement({ deletable, onDelete, children }) {
1544
+ const element = (0, import_react_hooks10.useHTMLElement)("span");
1545
+ const latestElement = (0, import_react_hooks10.useLatest)(element);
1546
+ const latestDeletable = (0, import_react_hooks10.useLatest)(deletable);
1547
+ const latestOnDelete = (0, import_react_hooks10.useLatest)(onDelete);
1548
+ const injector = (0, import_react24.useInjector)();
1549
+ (0, import_react23.useLayoutEffect)(() => {
1550
+ function run(view) {
1551
+ if (view.state.selection.main.empty && view.state.selection.main.head === 0 && latestDeletable.current === true && typeof latestOnDelete.current === "function") {
1552
+ latestOnDelete.current();
1553
+ }
1554
+ return false;
1555
+ }
1556
+ return injector.inject([
1557
+ import_view10.EditorView.decorations.of(
1558
+ import_view10.Decoration.set([
1559
+ import_view10.Decoration.widget({
1560
+ side: -100,
1561
+ block: false,
1562
+ widget: new PrefixElementWidget(() => latestElement.current)
1563
+ }).range(0)
1564
+ ])
1565
+ ),
1566
+ import_view10.keymap.of([
1567
+ { key: "Backspace", shift: run, run },
1568
+ { key: "Meta-Backspace", shift: run, run }
1569
+ ])
1570
+ ]);
1571
+ }, []);
1572
+ return (0, import_react_dom7.createPortal)(children, element);
1573
+ }
1574
+
1575
+ // src/value-sync.tsx
1576
+ var import_react26 = require("react");
1577
+ var import_react27 = require("@coze-editor/react");
1578
+ function ValueSync({ value }) {
1579
+ const editor = (0, import_react27.useEditor)();
1580
+ (0, import_react26.useEffect)(() => {
1581
+ if (!editor) {
1582
+ return;
1583
+ }
1584
+ const { doc } = editor.$view.state;
1585
+ if (typeof value === "string" && value !== doc.toString()) {
1586
+ editor.$view.dispatch({
1587
+ changes: {
1588
+ from: 0,
1589
+ to: doc.length,
1590
+ insert: value
1591
+ }
1592
+ });
1593
+ }
1594
+ }, [editor, value]);
1595
+ return null;
1596
+ }
1452
1597
  // Annotate the CommonJS export names for ESM import in node:
1453
1598
  0 && (module.exports = {
1454
1599
  ActiveLinePlaceholder,
@@ -1467,8 +1612,10 @@ var EmbededLineView = (0, import_react21.forwardRef)(function EmbededLineView2({
1467
1612
  Mention,
1468
1613
  Placeholder,
1469
1614
  PositionMirror,
1615
+ PrefixElement,
1470
1616
  RefElement,
1471
1617
  SelectionSide,
1618
+ ValueSync,
1472
1619
  getCurrentMentionReplaceRange
1473
1620
  });
1474
1621
  //# sourceMappingURL=index.js.map