@meowdown/react 0.49.0 → 0.51.0
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 +16 -45
- package/package.json +5 -4
package/dist/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { clsx } from "clsx/lite";
|
|
2
2
|
import { Fragment, cloneElement, createElement, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
3
|
-
import { buildFileMarkdown, codeBlockLanguages, defaultResolveImageUrl, defineBulletAfterHeading, defineCodeBlockPreviewPlugin, defineEditorExtension, defineEmbedPaste, defineExitBoundaryHandler, defineFileClickHandler, defineFilePaste, defineFileView, defineFollowLinkHandler, defineImage, defineImageClickHandler, defineLinkClickHandler, defineLinkEditKeymap, defineLinkHoverHandler, defineLinkPaste, definePendingReplacementHandler, definePlaceholder, defineReadonly, defineSpellCheckPlugin, defineSubstitution, defineTagClickHandler, defineWikilinkClickHandler, defineWikilinkHoverHandler, defineWikilinkTrigger, docToMarkdown, formatFileSize, getCodeTokens, getFileKind, getMarkBuilders, getPendingReplacement, getSelectedText, getTableColumnAlign, getVirtualElementFromRange, inlineTextToMarkChunks, isCodeBlockPreviewHiddenDecoration, isSelectionInTableCell, listenForTweetHeight, loadKaTeX, markdownToDoc, matchEmbed, renderMathInto } from "@meowdown/core";
|
|
3
|
+
import { buildFileMarkdown, codeBlockLanguages, defaultResolveImageUrl, defineBulletAfterHeading, defineCodeBlockPreviewPlugin, defineEditorExtension, defineEmbedPaste, defineExitBoundaryHandler, defineFileClickHandler, defineFilePaste, defineFileView, defineFollowLinkHandler, defineImage, defineImageClickHandler, defineLinkClickHandler, defineLinkEditKeymap, defineLinkHoverHandler, defineLinkPaste, definePendingReplacementHandler, definePlaceholder, defineReadonly, defineSpellCheckPlugin, defineSubstitution, defineTagClickHandler, defineWikilinkClickHandler, defineWikilinkHoverHandler, defineWikilinkTrigger, docToMarkdown, formatFileSize, getCodeTokens, getFileKind, getMarkBuilders, getPendingReplacement, getSelectedText, getTableColumnAlign, getTextblockDisplayText, getVirtualElementFromRange, inlineTextToMarkChunks, isCodeBlockPreviewHiddenDecoration, isSelectionInTableCell, listenForTweetHeight, loadKaTeX, markdownToDoc, matchEmbed, renderMathInto } from "@meowdown/core";
|
|
4
4
|
import { clamp } from "@ocavue/utils";
|
|
5
5
|
import { canUseRegexLookbehind, createEditor, defineDocChangeHandler, defineUpdateHandler, isTextSelection, union } from "@prosekit/core";
|
|
6
6
|
import { Selection, TextSelection } from "@prosekit/pm/state";
|
|
7
7
|
import { ProseKit, defineReactNodeView, useEditor, useEditor as useEditor$1, useEditorDerivedValue, useExtension, useExtension as useExtension$1, useKeymap } from "@prosekit/react";
|
|
8
|
+
import GithubSlugger from "github-slugger";
|
|
8
9
|
import { Combobox } from "@base-ui/react/combobox";
|
|
9
10
|
import { CheckIcon, ChevronsUpDownIcon, CopyIcon, GripHorizontalIcon, GripVerticalIcon, PencilIcon, SparklesIcon, UnlinkIcon } from "lucide-react";
|
|
10
11
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -1090,6 +1091,11 @@ function SlashMenu({ timeFormat = "12", onSlashMenuSearch, onFilePaste, onFileSa
|
|
|
1090
1091
|
"data-testid": "slash-menu",
|
|
1091
1092
|
children: [
|
|
1092
1093
|
!inTableCell && /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
1094
|
+
/* @__PURE__ */ jsx(SlashMenuItem, {
|
|
1095
|
+
label: "Text",
|
|
1096
|
+
keywords: ["paragraph", "plain"],
|
|
1097
|
+
onSelect: () => editor.commands.turnIntoText()
|
|
1098
|
+
}),
|
|
1093
1099
|
/* @__PURE__ */ jsx(SlashMenuItem, {
|
|
1094
1100
|
label: "Heading 1",
|
|
1095
1101
|
kbd: "#",
|
|
@@ -1556,54 +1562,19 @@ function decodeHeadingFragment(fragment) {
|
|
|
1556
1562
|
function headingLookupKey(value) {
|
|
1557
1563
|
return value.normalize("NFKC").trim().replaceAll(/\s+/g, " ").toLowerCase();
|
|
1558
1564
|
}
|
|
1559
|
-
const HEADING_HIDDEN_MARKS = /* @__PURE__ */ new Set([
|
|
1560
|
-
"mdMark",
|
|
1561
|
-
"mdLinkUri",
|
|
1562
|
-
"mdLinkTitle"
|
|
1563
|
-
]);
|
|
1564
|
-
const HEADING_ATOM_MARKS = /* @__PURE__ */ new Set([
|
|
1565
|
-
"mdWikilink",
|
|
1566
|
-
"mdImage",
|
|
1567
|
-
"mdFile",
|
|
1568
|
-
"mdMath"
|
|
1569
|
-
]);
|
|
1570
|
-
function headingAtomText(mark) {
|
|
1571
|
-
const attrs = mark.attrs;
|
|
1572
|
-
const stringAttr = (name) => {
|
|
1573
|
-
const value = attrs[name];
|
|
1574
|
-
return typeof value === "string" ? value : "";
|
|
1575
|
-
};
|
|
1576
|
-
if (mark.type.name === "mdWikilink") return stringAttr("display") || stringAttr("target");
|
|
1577
|
-
if (mark.type.name === "mdImage") return stringAttr("alt");
|
|
1578
|
-
if (mark.type.name === "mdFile") return stringAttr("name");
|
|
1579
|
-
if (mark.type.name === "mdMath") return stringAttr("formula");
|
|
1580
|
-
return "";
|
|
1581
|
-
}
|
|
1582
|
-
/** The heading as its live-preview marks display it, with syntax runs omitted. */
|
|
1583
|
-
function headingDisplayText(heading) {
|
|
1584
|
-
let output = "";
|
|
1585
|
-
let previousAtom;
|
|
1586
|
-
heading.forEach((child) => {
|
|
1587
|
-
if (!child.isText || !child.text) return;
|
|
1588
|
-
const atom = child.marks.find((mark) => HEADING_ATOM_MARKS.has(mark.type.name));
|
|
1589
|
-
if (atom) {
|
|
1590
|
-
if (!previousAtom?.eq(atom)) output += headingAtomText(atom);
|
|
1591
|
-
previousAtom = atom;
|
|
1592
|
-
return;
|
|
1593
|
-
}
|
|
1594
|
-
previousAtom = void 0;
|
|
1595
|
-
if (child.marks.some((mark) => HEADING_HIDDEN_MARKS.has(mark.type.name))) return;
|
|
1596
|
-
output += child.text;
|
|
1597
|
-
});
|
|
1598
|
-
return output;
|
|
1599
|
-
}
|
|
1600
1565
|
function findHeadingPosition(doc, fragment) {
|
|
1601
|
-
const
|
|
1566
|
+
const decodedTarget = decodeHeadingFragment(fragment);
|
|
1567
|
+
const target = headingLookupKey(decodedTarget);
|
|
1602
1568
|
if (!target) return;
|
|
1569
|
+
const slugTarget = decodedTarget.normalize("NFKC").toLowerCase();
|
|
1570
|
+
const slugger = new GithubSlugger();
|
|
1603
1571
|
let match;
|
|
1604
1572
|
doc.descendants((node, pos) => {
|
|
1605
1573
|
if (match != null) return false;
|
|
1606
|
-
if (node.type.name
|
|
1574
|
+
if (node.type.name !== "heading") return true;
|
|
1575
|
+
const displayText = getTextblockDisplayText(node);
|
|
1576
|
+
const slug = slugger.slug(displayText);
|
|
1577
|
+
if (headingLookupKey(node.textContent) === target || headingLookupKey(displayText) === target || slug === slugTarget) {
|
|
1607
1578
|
match = pos + 1;
|
|
1608
1579
|
return false;
|
|
1609
1580
|
}
|
|
@@ -1971,7 +1942,7 @@ function attributesToProps(attributes = {}, nodeName) {
|
|
|
1971
1942
|
let propName = getPropName(attributeNameLowerCased);
|
|
1972
1943
|
if (propName) {
|
|
1973
1944
|
const propertyInfo = getPropertyInfo(propName);
|
|
1974
|
-
if (UNCONTROLLED_COMPONENT_ATTRIBUTES.includes(propName) && UNCONTROLLED_COMPONENT_NAMES.includes(nodeName)
|
|
1945
|
+
if (!isInputValueOnly && UNCONTROLLED_COMPONENT_ATTRIBUTES.includes(propName) && UNCONTROLLED_COMPONENT_NAMES.includes(nodeName)) propName = getPropName("default" + attributeNameLowerCased);
|
|
1975
1946
|
props[propName] = attributeValue;
|
|
1976
1947
|
switch (propertyInfo?.type) {
|
|
1977
1948
|
case BOOLEAN:
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meowdown/react",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.51.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -24,9 +24,10 @@
|
|
|
24
24
|
"@prosekit/pm": "^0.1.19-beta.3",
|
|
25
25
|
"@prosekit/react": "^0.8.0-beta.21",
|
|
26
26
|
"clsx": "^2.1.1",
|
|
27
|
+
"github-slugger": "^2.0.0",
|
|
27
28
|
"lucide-react": "^1.24.0",
|
|
28
29
|
"react-property": "^2.0.2",
|
|
29
|
-
"@meowdown/core": "0.
|
|
30
|
+
"@meowdown/core": "0.51.0"
|
|
30
31
|
},
|
|
31
32
|
"peerDependencies": {
|
|
32
33
|
"react": "^19.0.0",
|
|
@@ -43,14 +44,14 @@
|
|
|
43
44
|
"devDependencies": {
|
|
44
45
|
"@css-modules-kit/codegen": "^1.4.0",
|
|
45
46
|
"@ocavue/tsconfig": "^0.7.1",
|
|
46
|
-
"@tsdown/css": "^0.22.
|
|
47
|
+
"@tsdown/css": "^0.22.8",
|
|
47
48
|
"@types/react": "^19.2.17",
|
|
48
49
|
"@types/react-dom": "^19.2.3",
|
|
49
50
|
"@vitest/browser-playwright": "^4.1.10",
|
|
50
51
|
"dedent": "^1.7.2",
|
|
51
52
|
"react": "^19.2.7",
|
|
52
53
|
"react-dom": "^19.2.7",
|
|
53
|
-
"tsdown": "^0.22.
|
|
54
|
+
"tsdown": "^0.22.8",
|
|
54
55
|
"vitest": "^4.1.10",
|
|
55
56
|
"vitest-browser-commands": "^0.2.1",
|
|
56
57
|
"vitest-browser-react": "^2.2.0",
|