@meowdown/react 0.50.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.
Files changed (2) hide show
  1. package/dist/index.js +11 -45
  2. 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";
@@ -1561,54 +1562,19 @@ function decodeHeadingFragment(fragment) {
1561
1562
  function headingLookupKey(value) {
1562
1563
  return value.normalize("NFKC").trim().replaceAll(/\s+/g, " ").toLowerCase();
1563
1564
  }
1564
- const HEADING_HIDDEN_MARKS = /* @__PURE__ */ new Set([
1565
- "mdMark",
1566
- "mdLinkUri",
1567
- "mdLinkTitle"
1568
- ]);
1569
- const HEADING_ATOM_MARKS = /* @__PURE__ */ new Set([
1570
- "mdWikilink",
1571
- "mdImage",
1572
- "mdFile",
1573
- "mdMath"
1574
- ]);
1575
- function headingAtomText(mark) {
1576
- const attrs = mark.attrs;
1577
- const stringAttr = (name) => {
1578
- const value = attrs[name];
1579
- return typeof value === "string" ? value : "";
1580
- };
1581
- if (mark.type.name === "mdWikilink") return stringAttr("display") || stringAttr("target");
1582
- if (mark.type.name === "mdImage") return stringAttr("alt");
1583
- if (mark.type.name === "mdFile") return stringAttr("name");
1584
- if (mark.type.name === "mdMath") return stringAttr("formula");
1585
- return "";
1586
- }
1587
- /** The heading as its live-preview marks display it, with syntax runs omitted. */
1588
- function headingDisplayText(heading) {
1589
- let output = "";
1590
- let previousAtom;
1591
- heading.forEach((child) => {
1592
- if (!child.isText || !child.text) return;
1593
- const atom = child.marks.find((mark) => HEADING_ATOM_MARKS.has(mark.type.name));
1594
- if (atom) {
1595
- if (!previousAtom?.eq(atom)) output += headingAtomText(atom);
1596
- previousAtom = atom;
1597
- return;
1598
- }
1599
- previousAtom = void 0;
1600
- if (child.marks.some((mark) => HEADING_HIDDEN_MARKS.has(mark.type.name))) return;
1601
- output += child.text;
1602
- });
1603
- return output;
1604
- }
1605
1565
  function findHeadingPosition(doc, fragment) {
1606
- const target = headingLookupKey(decodeHeadingFragment(fragment));
1566
+ const decodedTarget = decodeHeadingFragment(fragment);
1567
+ const target = headingLookupKey(decodedTarget);
1607
1568
  if (!target) return;
1569
+ const slugTarget = decodedTarget.normalize("NFKC").toLowerCase();
1570
+ const slugger = new GithubSlugger();
1608
1571
  let match;
1609
1572
  doc.descendants((node, pos) => {
1610
1573
  if (match != null) return false;
1611
- if (node.type.name === "heading" && (headingLookupKey(node.textContent) === target || headingLookupKey(headingDisplayText(node)) === target)) {
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) {
1612
1578
  match = pos + 1;
1613
1579
  return false;
1614
1580
  }
@@ -1976,7 +1942,7 @@ function attributesToProps(attributes = {}, nodeName) {
1976
1942
  let propName = getPropName(attributeNameLowerCased);
1977
1943
  if (propName) {
1978
1944
  const propertyInfo = getPropertyInfo(propName);
1979
- if (UNCONTROLLED_COMPONENT_ATTRIBUTES.includes(propName) && UNCONTROLLED_COMPONENT_NAMES.includes(nodeName) && !isInputValueOnly) propName = getPropName("default" + attributeNameLowerCased);
1945
+ if (!isInputValueOnly && UNCONTROLLED_COMPONENT_ATTRIBUTES.includes(propName) && UNCONTROLLED_COMPONENT_NAMES.includes(nodeName)) propName = getPropName("default" + attributeNameLowerCased);
1980
1946
  props[propName] = attributeValue;
1981
1947
  switch (propertyInfo?.type) {
1982
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.50.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.50.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.7",
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.7",
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",