@coze-editor/react-components 0.1.0-alpha.dac011 → 0.1.0-alpha.e5f73a
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 +146 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +19 -4
- package/dist/index.d.ts +19 -4
- package/dist/index.js +148 -1
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
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
|
-
|
|
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
|